@testmuai/kane-cli 0.3.3 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/{ChromeProfilePicker-J6QIIHIE.js → ChromeProfilePicker-DLK4RTFZ.js} +1 -1
  2. package/dist/{CliFeedbackPrompt-SEH4MXTF.js → CliFeedbackPrompt-HNB4SHPG.js} +1 -1
  3. package/dist/{CliUploadProgress-U6QLD76Y.js → CliUploadProgress-6KB7IKFV.js} +1 -1
  4. package/dist/{ConfigView-5ZCHVYM2.js → ConfigView-LMW2B764.js} +1 -1
  5. package/dist/FolderPicker-JBOPRMPT.js +2 -0
  6. package/dist/{HelpView-3ESCWBPB.js → HelpView-6HAZNUNN.js} +1 -1
  7. package/dist/{InfoBox-OVAOOQHC.js → InfoBox-6OL6MFL6.js} +1 -1
  8. package/dist/{LinksBox-P3VETMP6.js → LinksBox-Q6L6WY53.js} +1 -1
  9. package/dist/{ProfilesView-UBVNEYVE.js → ProfilesView-ERKUUJWU.js} +1 -1
  10. package/dist/ProjectPicker-Y4AXSEVW.js +2 -0
  11. package/dist/{SaveSessionPrompt-S5RCU5DX.js → SaveSessionPrompt-GKITQ3KR.js} +1 -1
  12. package/dist/SingleShotApp-MKACYNG2.js +2 -0
  13. package/dist/{SummaryBox-M4UFKKMD.js → SummaryBox-MB2JQIXZ.js} +1 -1
  14. package/dist/{TestMdRunView-PI433EGP.js → TestMdRunView-UMTYIRAE.js} +1 -1
  15. package/dist/{WhoamiView-VJBEYTCF.js → WhoamiView-UF5WWELM.js} +1 -1
  16. package/dist/{changelog-EFAQANXW.js → changelog-JFMKP277.js} +1 -1
  17. package/dist/{chunk-XM4H4TJD.js → chunk-535PXOLA.js} +1 -1
  18. package/dist/{chunk-N7YALZKA.js → chunk-6566EYUL.js} +2 -2
  19. package/dist/{chunk-WM6GZFTC.js → chunk-6JONCMIS.js} +1 -1
  20. package/dist/chunk-ANOIEEVS.js +13 -0
  21. package/dist/{chunk-NOQKUOEK.js → chunk-BNLJNHAZ.js} +1 -1
  22. package/dist/{chunk-L3MOXBKE.js → chunk-CB4WEGVB.js} +1 -1
  23. package/dist/{chunk-HNIH3GSQ.js → chunk-CBDUXGVQ.js} +1 -1
  24. package/dist/chunk-EJR3WRTW.js +2 -0
  25. package/dist/{chunk-G5HHHYH7.js → chunk-FOMM3MYV.js} +1 -1
  26. package/dist/{chunk-TL4SB7MQ.js → chunk-FOT6AMNP.js} +1 -1
  27. package/dist/{chunk-H33BV5YV.js → chunk-HZUU7USC.js} +1 -1
  28. package/dist/{chunk-IROWNPDG.js → chunk-KA23QNUA.js} +1 -1
  29. package/dist/chunk-LIJX5PIV.js +2 -0
  30. package/dist/{chunk-RURXFEOD.js → chunk-LJA5UGU6.js} +1 -1
  31. package/dist/{chunk-FAPS5ACQ.js → chunk-LT4VR7MQ.js} +2 -2
  32. package/dist/{chunk-TEH6AVF4.js → chunk-MIZDUPND.js} +1 -1
  33. package/dist/{chunk-U4QMSR5Z.js → chunk-ND5EFB3C.js} +1 -1
  34. package/dist/{chunk-RHXWME7G.js → chunk-OFX2RC33.js} +1 -1
  35. package/dist/{chunk-IXWVTWOR.js → chunk-PQLKQKQH.js} +1 -1
  36. package/dist/{chunk-D4P6GLSX.js → chunk-RHLK4XYO.js} +1 -1
  37. package/dist/{chunk-YF4OL463.js → chunk-T3JEMMTA.js} +1 -1
  38. package/dist/{chunk-YVLFHMUW.js → chunk-TI5CHPPN.js} +1 -1
  39. package/dist/{chunk-SR5UDUMJ.js → chunk-TXUKXLYR.js} +1 -1
  40. package/dist/{chunk-UFNKCPUB.js → chunk-V7M72PLH.js} +9 -9
  41. package/dist/{chunk-J3SCNSXX.js → chunk-VKPAHDXM.js} +1 -1
  42. package/dist/chunk-VZIBZDS2.js +2 -0
  43. package/dist/{chunk-PNQ5YMED.js → chunk-YEV3OBEO.js} +1 -1
  44. package/dist/{chunk-ZYVYAIBS.js → chunk-ZCHXYZGV.js} +1 -1
  45. package/dist/{chunk-FSIJOBVB.js → chunk-ZYJ4HQAI.js} +1 -1
  46. package/dist/index.js +15 -15
  47. package/dist/{logging-AIQHWRNQ.js → logging-M7EYIZTV.js} +1 -1
  48. package/dist/{login-flow-E6WMJ25A.js → login-flow-THKISL7X.js} +1 -1
  49. package/dist/{persist-recorded-session-V5DXMRKC.js → persist-recorded-session-CDT2I4SH.js} +1 -1
  50. package/dist/{pipeline-EUZIM2ZO.js → pipeline-IF775CGJ.js} +1 -1
  51. package/dist/{recording-banner-7ZKIORL5.js → recording-banner-YFDZ6CJ4.js} +1 -1
  52. package/dist/{run-test-md-BQS5SZ7E.js → run-test-md-6ELVP2MT.js} +19 -19
  53. package/dist/{testmd-actions-322GQYAH.js → testmd-actions-D3TJX2Q4.js} +2 -2
  54. package/dist/{tms-client-XOARLBEP.js → tms-client-T3EAD4Y7.js} +1 -1
  55. package/dist/{validate-basic-XKTSGLFO.js → validate-basic-LTATIAAW.js} +1 -1
  56. package/dist/{version-check-LUCKH72U.js → version-check-Q6M7YAML.js} +1 -1
  57. package/package.json +5 -5
  58. package/dist/FolderPicker-VYJDEDN7.js +0 -2
  59. package/dist/ProjectPicker-NJKUWRET.js +0 -2
  60. package/dist/SingleShotApp-WOJWOQSV.js +0 -2
  61. package/dist/chunk-4QLJMIBA.js +0 -13
  62. package/dist/chunk-53K3BK7I.js +0 -2
  63. package/dist/chunk-JPEICMHK.js +0 -2
  64. package/dist/chunk-YZTCCQHR.js +0 -2
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a,b}from"./chunk-H33BV5YV.js";import"./chunk-TL4SB7MQ.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";export{a as RemoteLogger,b as createRemoteLogger};
2
+ import{a,b}from"./chunk-HZUU7USC.js";import"./chunk-FOT6AMNP.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";export{a as RemoteLogger,b as createRemoteLogger};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a}from"./chunk-WM6GZFTC.js";import"./chunk-IXWVTWOR.js";import"./chunk-HNIH3GSQ.js";import"./chunk-TL4SB7MQ.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";export{a as LoginFlow};
2
+ import{a}from"./chunk-6JONCMIS.js";import"./chunk-PQLKQKQH.js";import"./chunk-CBDUXGVQ.js";import"./chunk-FOT6AMNP.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";export{a as LoginFlow};
@@ -1,3 +1,3 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as h}from"./chunk-OQZG3V6B.js";import{g as S}from"./chunk-X7VI7KK3.js";import{a as m,b as I,j as _}from"./chunk-AH4AXJML.js";import"./chunk-L5LI2JF4.js";import{a as f}from"./chunk-PNQ5YMED.js";import"./chunk-TL4SB7MQ.js";import"./chunk-UR6MHSHU.js";function y(e,d={}){e.flushRecorder();let o=e.recorder?.lastWrittenPath??null;if(!o)return e.log("info","PERSIST_SKIPPED","No recorded path \u2014 recorder.flush no-op",{reason:e.sessionName?"recorder_flush_failed":"no_session_name",session_name:e.sessionName}),null;let p;try{p=h(o)}catch(t){throw e.log("error","PERSIST_RESOLVE_FAILED","resolveTestMd threw",{error:t.message,recorded_path:o}),t}let i=e.getRunsAsStepRecords(),u=e.getFlows(),a=[],c=0;for(let t=0;t<i.length;t++){let r=i[t],l=u.slice(c,c+r.totalRunDirs);c+=r.totalRunDirs;let g=l.find(n=>n.status==="failed"||n.status==="error"),R=g?"failed":l.length===0?"skipped":"passed";a.push({rootStepIndex:t+1,status:R,duration_s:l.reduce((n,D)=>n+(D.duration??0),0),reason:g?.reason})}let P=a.some(t=>t.status==="failed")?"failed":"passed",E=new f().load().code_export?.language==="javascript"?"javascript":"python",s=I(o);e.log("info","PERSIST_START","Building staging dir",{recorded_path:o,output_dir:s,session_dir:e.sessionDir,step_count:i.length,flow_count:u.length});try{S({resolvedTest:p,sessionDir:e.sessionDir,stepRunRecords:i,outcomes:a,overallStatus:P,startedISO:e.startedAt,durationS:a.reduce((t,r)=>t+(r.duration_s??0),0),sessionId:e.sessionId,commitId:e.sessionId,tmsIds:{testId:e.testId??void 0,testcaseId:d.testcaseId,projectId:d.projectId,folderId:d.folderId,orgId:d.orgId??e.orgId??void 0,sessionName:e.sessionName??m(o)},codeExportDir:d.codeExportDir,codeExportLanguage:E}),e.log("info","PERSIST_STAGING_OK","Staging dir built",{output_dir:s}),_(s),e.log("info","PERSIST_OK","Persist complete",{output_dir:s})}catch(t){let r=t;e.log("error","PERSIST_FAILED","staging build / atomic replace failed",{error:r.message,stack:r.stack,output_dir:s}),process.stderr.write(`[persist] staging build / atomic replace failed: ${r.message}
2
+ import{a as h}from"./chunk-OQZG3V6B.js";import{g as S}from"./chunk-X7VI7KK3.js";import{a as m,b as I,j as _}from"./chunk-AH4AXJML.js";import"./chunk-L5LI2JF4.js";import{a as f}from"./chunk-YEV3OBEO.js";import"./chunk-FOT6AMNP.js";import"./chunk-UR6MHSHU.js";function y(e,d={}){e.flushRecorder();let o=e.recorder?.lastWrittenPath??null;if(!o)return e.log("info","PERSIST_SKIPPED","No recorded path \u2014 recorder.flush no-op",{reason:e.sessionName?"recorder_flush_failed":"no_session_name",session_name:e.sessionName}),null;let p;try{p=h(o)}catch(t){throw e.log("error","PERSIST_RESOLVE_FAILED","resolveTestMd threw",{error:t.message,recorded_path:o}),t}let i=e.getRunsAsStepRecords(),u=e.getFlows(),a=[],c=0;for(let t=0;t<i.length;t++){let r=i[t],l=u.slice(c,c+r.totalRunDirs);c+=r.totalRunDirs;let g=l.find(n=>n.status==="failed"||n.status==="error"),R=g?"failed":l.length===0?"skipped":"passed";a.push({rootStepIndex:t+1,status:R,duration_s:l.reduce((n,D)=>n+(D.duration??0),0),reason:g?.reason})}let P=a.some(t=>t.status==="failed")?"failed":"passed",E=new f().load().code_export?.language==="javascript"?"javascript":"python",s=I(o);e.log("info","PERSIST_START","Building staging dir",{recorded_path:o,output_dir:s,session_dir:e.sessionDir,step_count:i.length,flow_count:u.length});try{S({resolvedTest:p,sessionDir:e.sessionDir,stepRunRecords:i,outcomes:a,overallStatus:P,startedISO:e.startedAt,durationS:a.reduce((t,r)=>t+(r.duration_s??0),0),sessionId:e.sessionId,commitId:e.sessionId,tmsIds:{testId:e.testId??void 0,testcaseId:d.testcaseId,projectId:d.projectId,folderId:d.folderId,orgId:d.orgId??e.orgId??void 0,sessionName:e.sessionName??m(o)},codeExportDir:d.codeExportDir,codeExportLanguage:E}),e.log("info","PERSIST_STAGING_OK","Staging dir built",{output_dir:s}),_(s),e.log("info","PERSIST_OK","Persist complete",{output_dir:s})}catch(t){let r=t;e.log("error","PERSIST_FAILED","staging build / atomic replace failed",{error:r.message,stack:r.stack,output_dir:s}),process.stderr.write(`[persist] staging build / atomic replace failed: ${r.message}
3
3
  `)}return{recordedTestPath:o,outputDir:s}}export{y as persistRecordedSession};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a}from"./chunk-UFNKCPUB.js";import"./chunk-MDBXYXSC.js";import"./chunk-JI7KJKG4.js";import"./chunk-YZTCCQHR.js";import"./chunk-KKZRPFWO.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";export{a as UploadPipeline};
2
+ import{a}from"./chunk-V7M72PLH.js";import"./chunk-MDBXYXSC.js";import"./chunk-JI7KJKG4.js";import"./chunk-LIJX5PIV.js";import"./chunk-KKZRPFWO.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";export{a as UploadPipeline};
@@ -1,3 +1,3 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
2
  import{a as n}from"./chunk-3MSXQU2C.js";import"./chunk-UR6MHSHU.js";function p(t){let s=t.sessionName!==null,e={type:"recording_state",enabled:!0,session_id:t.sessionId,persist:s};return t.sessionName&&(e.session_name=t.sessionName),t.testPath&&(e.test_path=t.testPath),t.outputPath&&(e.output_path=t.outputPath),e}async function g(t){if(t.isAgent){process.stdout.write(JSON.stringify(p(t))+`
3
- `);return}let s=(await import("./react-QWOAB3TB.js")).default,{render:e,useApp:a}=await import("./build-JIKYOZUH.js"),{useEffect:o}=s,{InfoBox:r}=await import("./InfoBox-OVAOOQHC.js"),u=t.sessionName?[{label:"session",value:t.sessionName},{label:"test",value:n(t.testPath??"")},{label:"output",value:n(t.outputPath??"")}]:[{label:"session",value:"ephemeral"},{label:"note",value:"use /name <name> to persist this session"}];function l(){let{exit:i}=a();return o(()=>{let c=setTimeout(()=>i(),50);return()=>clearTimeout(c)},[i]),s.createElement(r,{title:"Recording",titleColor:"#ff9500",rows:u})}await e(s.createElement(l),{stdout:process.stderr}).waitUntilExit()}export{p as buildRecordingStateEvent,g as printRecordingBanner};
3
+ `);return}let s=(await import("./react-QWOAB3TB.js")).default,{render:e,useApp:a}=await import("./build-JIKYOZUH.js"),{useEffect:o}=s,{InfoBox:r}=await import("./InfoBox-6OL6MFL6.js"),u=t.sessionName?[{label:"session",value:t.sessionName},{label:"test",value:n(t.testPath??"")},{label:"output",value:n(t.outputPath??"")}]:[{label:"session",value:"ephemeral"},{label:"note",value:"use /name <name> to persist this session"}];function l(){let{exit:i}=a();return o(()=>{let c=setTimeout(()=>i(),50);return()=>clearTimeout(c)},[i]),s.createElement(r,{title:"Recording",titleColor:"#ff9500",rows:u})}await e(s.createElement(l),{stdout:process.stderr}).waitUntilExit()}export{p as buildRecordingStateEvent,g as printRecordingBanner};
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as de,b as Ht}from"./chunk-C5UNZ6ZY.js";import{a as qt}from"./chunk-D4P6GLSX.js";import{a as Nt}from"./chunk-OQZG3V6B.js";import{a as pt,b as ft,f as bt,g as Me,h as $e,i as yt,j as St,k as vt,l as be,m as It,n as kt,o as _t,p as Ct,q as Et,r as At,s as Ke,t as Tt,u as jt,v as Dt,w as Lt,x as Ut,y as $t,z as Bt}from"./chunk-4QLJMIBA.js";import{b as Ne}from"./chunk-L3MOXBKE.js";import{b as Ge,c as Mt,d as Vt}from"./chunk-G5HHHYH7.js";import{a as Rt}from"./chunk-UFNKCPUB.js";import"./chunk-MDBXYXSC.js";import{c as wt}from"./chunk-S3DAAAE5.js";import{a as Ft,b as Be,c as qe,d as He,e as ze}from"./chunk-X7VI7KK3.js";import{a as Re,b as xt,c as Pt,e as ye,f as Ve,i as Ot}from"./chunk-AH4AXJML.js";import{a as ut}from"./chunk-N7YALZKA.js";import{a as gt,c as Ue,d as Z,e as J}from"./chunk-G7VF5SDK.js";import"./chunk-L5LI2JF4.js";import{a as mt}from"./chunk-PNQ5YMED.js";import"./chunk-VE3SUJMA.js";import{a as dt}from"./chunk-IXWVTWOR.js";import{a as ee}from"./chunk-HNIH3GSQ.js";import"./chunk-GCAHPH2E.js";import{a as ht}from"./chunk-JI7KJKG4.js";import"./chunk-E47GFYXA.js";import{c as Le,h as ne}from"./chunk-TL4SB7MQ.js";import"./chunk-YZTCCQHR.js";import"./chunk-KKZRPFWO.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";import{resolve as Er,join as Ie,basename as Ar}from"path";import{existsSync as Xe,readFileSync as xr}from"fs";import{existsSync as Ye}from"fs";import{join as Se,basename as zt}from"path";function Kt(e,t){if(!t||!Ye(t))return e.steps.map(()=>({kind:"author",reason:"no-result-md"}));let r=qe(t),s=[],o=new Set,f=new Map;function i(l){let S=He(l),_=Se(S,"Result.md");if(f.has(_))return f.get(_);let I=Ye(_)?qe(_):null;return f.set(_,I),I}function R(l){for(let S=1;S<l.trace.length;S++){let I=l.trace[S-1].file===e.rootPath?r:i(l.trace.slice(0,S));if(!I)return{kind:"author",reason:"no-result-md"};let P=l.trace[S-1].stepIndex,p=I.steps[P-1];if(!p)return{kind:"author",reason:"no-result-md"};if(p.kind!=="import")return{kind:"author",reason:"structure-mismatch"};let C=zt(p.importPath),w=zt(l.trace[S].file);if(C!==w)return{kind:"author",reason:"structure-mismatch"};if(p.status!=="passed")return{kind:"author",reason:"recorded-failed"}}return null}for(let l of e.steps){let S=l.trace[l.trace.length-1].file,_=l.trace[l.trace.length-1].stepIndex,I=o.has(S);for(let w=0;w<l.trace.length-1&&!I;w++)o.has(l.trace[w].file)&&(I=!0);if(I){s.push({kind:"author",reason:"downstream-of-divergence"});continue}let P=R(l);if(P){s.push(P);for(let w=0;w<l.trace.length;w++)o.add(l.trace[w].file);continue}let p=S===e.rootPath?r:i(l.trace),C=wr(l,p,_);if(s.push(C),C.kind==="author"){o.add(S);for(let w=0;w<l.trace.length-1;w++)o.add(l.trace[w].file)}}return s}function wr(e,t,r){if(!t)return{kind:"author",reason:"no-result-md"};let s=t.steps[r-1];if(!s)return{kind:"author",reason:"no-result-md"};if(s.kind!=="objective")return{kind:"author",reason:"structure-mismatch"};if(s.status!=="passed")return{kind:"author",reason:"recorded-failed"};let o=Ft(e);if(o!==s.md5)return{kind:"author",reason:"md5-mismatch"};let f=e.trace.length===1?Ot(e.trace[0].file,r,o.slice(0,8)):Se(He(e.trace),".internal","steps",`${r}-${o.slice(0,8)}`),i=Se(f,"flows","0","actions.ndjson");return Ye(i)?{kind:"replay",recordingDir:f}:{kind:"author",reason:"missing-recording"}}function Gt(e){return e.some(t=>t.kind==="author")}function we(e){for(let t=0;t<e.length;t++)if(e[t].kind==="author")return t;return e.length}function Yt(e){return Se(e.recordingDir,"flows","0","actions.ndjson")}function Wt(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let s=e.steps[r],o=t[r],f=" ".repeat(s.trace.length-1),i=`step ${s.flatIndex}`;o.kind==="replay"?process.stderr.write(`[replay-trace] ${f}${i}: REPLAY (would skip; v1 always authors)
2
+ import{a as de,b as Ht}from"./chunk-C5UNZ6ZY.js";import{a as qt}from"./chunk-RHLK4XYO.js";import{a as Nt}from"./chunk-OQZG3V6B.js";import{a as pt,b as ft,f as bt,g as Me,h as $e,i as yt,j as St,k as vt,l as Re,m as It,n as kt,o as _t,p as Ct,q as Et,r as At,s as Ke,t as Tt,u as jt,v as Dt,w as Lt,x as Ut,y as $t,z as Bt}from"./chunk-ANOIEEVS.js";import{b as Ne}from"./chunk-CB4WEGVB.js";import{b as Ge,c as Mt,d as Vt}from"./chunk-FOMM3MYV.js";import{a as Rt}from"./chunk-V7M72PLH.js";import"./chunk-MDBXYXSC.js";import{c as wt}from"./chunk-S3DAAAE5.js";import{a as Ft,b as Be,c as qe,d as He,e as ze}from"./chunk-X7VI7KK3.js";import{a as ye,b as xt,c as Pt,e as Se,f as Ve,i as Ot}from"./chunk-AH4AXJML.js";import{a as ut}from"./chunk-6566EYUL.js";import{a as gt,c as Ue,d as Z,e as J}from"./chunk-G7VF5SDK.js";import"./chunk-L5LI2JF4.js";import{a as mt}from"./chunk-YEV3OBEO.js";import"./chunk-VE3SUJMA.js";import{a as dt}from"./chunk-PQLKQKQH.js";import{a as ee}from"./chunk-CBDUXGVQ.js";import"./chunk-GCAHPH2E.js";import{a as ht}from"./chunk-JI7KJKG4.js";import"./chunk-E47GFYXA.js";import{c as Le,h as ne}from"./chunk-FOT6AMNP.js";import"./chunk-LIJX5PIV.js";import"./chunk-KKZRPFWO.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";import{resolve as Er,join as ke,basename as Ar}from"path";import{existsSync as Xe,readFileSync as xr}from"fs";import{existsSync as Ye}from"fs";import{join as we,basename as zt}from"path";function Kt(e,t){if(!t||!Ye(t))return e.steps.map(()=>({kind:"author",reason:"no-result-md"}));let r=qe(t),s=[],o=new Set,f=new Map;function i(l){let S=He(l),_=we(S,"Result.md");if(f.has(_))return f.get(_);let I=Ye(_)?qe(_):null;return f.set(_,I),I}function R(l){for(let S=1;S<l.trace.length;S++){let I=l.trace[S-1].file===e.rootPath?r:i(l.trace.slice(0,S));if(!I)return{kind:"author",reason:"no-result-md"};let P=l.trace[S-1].stepIndex,p=I.steps[P-1];if(!p)return{kind:"author",reason:"no-result-md"};if(p.kind!=="import")return{kind:"author",reason:"structure-mismatch"};let C=zt(p.importPath),w=zt(l.trace[S].file);if(C!==w)return{kind:"author",reason:"structure-mismatch"};if(p.status!=="passed")return{kind:"author",reason:"recorded-failed"}}return null}for(let l of e.steps){let S=l.trace[l.trace.length-1].file,_=l.trace[l.trace.length-1].stepIndex,I=o.has(S);for(let w=0;w<l.trace.length-1&&!I;w++)o.has(l.trace[w].file)&&(I=!0);if(I){s.push({kind:"author",reason:"downstream-of-divergence"});continue}let P=R(l);if(P){s.push(P);for(let w=0;w<l.trace.length;w++)o.add(l.trace[w].file);continue}let p=S===e.rootPath?r:i(l.trace),C=wr(l,p,_);if(s.push(C),C.kind==="author"){o.add(S);for(let w=0;w<l.trace.length-1;w++)o.add(l.trace[w].file)}}return s}function wr(e,t,r){if(!t)return{kind:"author",reason:"no-result-md"};let s=t.steps[r-1];if(!s)return{kind:"author",reason:"no-result-md"};if(s.kind!=="objective")return{kind:"author",reason:"structure-mismatch"};if(s.status!=="passed")return{kind:"author",reason:"recorded-failed"};let o=Ft(e);if(o!==s.md5)return{kind:"author",reason:"md5-mismatch"};let f=e.trace.length===1?Ot(e.trace[0].file,r,o.slice(0,8)):we(He(e.trace),".internal","steps",`${r}-${o.slice(0,8)}`),i=we(f,"flows","0","actions.ndjson");return Ye(i)?{kind:"replay",recordingDir:f}:{kind:"author",reason:"missing-recording"}}function Gt(e){return e.some(t=>t.kind==="author")}function ve(e){for(let t=0;t<e.length;t++)if(e[t].kind==="author")return t;return e.length}function Yt(e){return we(e.recordingDir,"flows","0","actions.ndjson")}function Wt(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let s=e.steps[r],o=t[r],f=" ".repeat(s.trace.length-1),i=`step ${s.flatIndex}`;o.kind==="replay"?process.stderr.write(`[replay-trace] ${f}${i}: REPLAY (would skip; v1 always authors)
3
3
  `):process.stderr.write(`[replay-trace] ${f}${i}: AUTHOR (${o.reason})
4
4
  `)}}function oe(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function Zt(e,t){let r=e===0?"(none)":`0..${e-1}`,s=e>=t?"(none)":`${e}..${t-1}`;oe(`[replay-trace] phase: replay ${r}, author ${s}
5
5
  `)}function Jt(e,t){oe(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
@@ -7,8 +7,8 @@ import{a as de,b as Ht}from"./chunk-C5UNZ6ZY.js";import{a as qt}from"./chunk-D4P
7
7
  `)}function Xt(e,t){oe(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
8
8
  `)}function er(){oe(`[replay-trace] force-author (--author) \u2014 walker bypassed
9
9
  `)}function tr(e){oe(`[replay-trace] cancelled at step ${e}
10
- `)}import{join as vr}from"path";function We(e){let t={objective:e.step.objective,model:"v16-alpha",width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,stream:!0,mode:"replay",replay:{recording_path:Yt(e.decision),step_label:e.step.objective},screenshot_dir:vr(e.sessionDir,"runs",String(e.runIndex)),run_id:"run",test_id:"test"};return e.forceNavigateUrl&&(t.url=e.forceNavigateUrl),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.sessionContext&&(t.session_context=e.sessionContext),t}async function rr(e){let t=we(e.decisions),r=0,s=!1;for(;;){let o=e.session.snapshot(),f=e.accumulator.snapshot(),i=await e.runReplayPhase(t);if(i.cancelled)return s=!0,tr(i.failedAt??0),{authorBoundary:t,cancelledInPhase:s,shrinkCount:r};if(i.failedAt===null)return{authorBoundary:t,cancelledInPhase:s,shrinkCount:r};let R=Ht({failedAt:i.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(R.kind==="fail")return{authorBoundary:-1,cancelledInPhase:s,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:s,shrinkCount:r};if(e.session.rollback(o),e.accumulator.rollback(f),R.kind==="complete-reauthor")return Xt(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:s,shrinkCount:r};r++,Qt(r,de.maxShrinks,R.newAuthorBoundary),t=R.newAuthorBoundary}}var Ir=60*1e3,nr="lock-heartbeat",se=null;function Ze(e){se===null&&(se=setInterval(async()=>{let t=await Tt({baseUrl:e.baseUrl,testId:e.testId,auth:e.auth});if(!t.ok){let r=t.expired?"session expired":t.message;process.stderr.write(`[lock] heartbeat failed: ${r}; continuing run
11
- `)}},Ir),Z(nr,()=>{se!==null&&(clearInterval(se),se=null)}))}function Je(){se!==null&&J(nr,"stopped")}var ve=class{constructor(t){this.resolved=t;this.outcomes=t.rootSteps.map(r=>({rootStepIndex:r.index,status:"skipped"}))}outcomes;skipRoot=null;overallHalted=!1;shouldRunFlatStep(t){if(this.overallHalted)return!1;let r=t.trace[0].stepIndex;return!(this.skipRoot!==null&&r===this.skipRoot)}recordStep(t,r){let s=t.trace[0].stepIndex,o=this.outcomes.find(l=>l.rootStepIndex===s),f=this.resolved.rootSteps.find(l=>l.index===s),i=f.body.kind!=="objective";return i&&(o.refKind="import",o.refLabel=f.body.path,o.inlinedCount=(o.inlinedCount??0)+1,o.duration_s=(o.duration_s??0)+r.duration_s),r.status==="passed"?(i?o.status!=="failed"&&(o.status="passed"):(o.status="passed",o.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(o.softFailures=o.softFailures??[],o.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(o.status="failed",o.duration_s=i?o.duration_s:r.duration_s,o.failedSubStepIndex=i?t.trace.slice(1).map(l=>l.stepIndex):void 0,o.reason=r.reason,this.skipRoot=s,f.optional??!1?(o.softFailed=!0,{continueOverall:!0}):(this.overallHalted=!0,{continueOverall:!1}))}snapshotOutcomes(){return[...this.outcomes]}snapshot(){return{outcomes:this.outcomes.map(t=>({...t,softFailures:t.softFailures?[...t.softFailures]:void 0})),skipRoot:this.skipRoot,overallHalted:this.overallHalted}}rollback(t){this.outcomes=t.outcomes.map(r=>({...r,softFailures:r.softFailures?[...r.softFailures]:void 0})),this.skipRoot=t.skipRoot,this.overallHalted=t.overallHalted}finalize(){let t=this.outcomes.some(s=>s.status==="failed"&&!s.softFailed)?"failed":"passed",r=this.outcomes.reduce((s,o)=>s+(o.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};import{writeFileSync as kr,mkdirSync as _r}from"fs";import{dirname as or}from"path";function Qe(e){let t=ye(e.sourcePath);try{_r(or(t),{recursive:!0})}catch(s){return process.stderr.write(`
10
+ `)}import{join as vr}from"path";function We(e){let t={objective:e.step.objective,model:"v16-alpha",width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,stream:!0,mode:"replay",replay:{recording_path:Yt(e.decision),step_label:e.step.objective},screenshot_dir:vr(e.sessionDir,"runs",String(e.runIndex)),run_id:"run",test_id:"test"};return e.forceNavigateUrl&&(t.url=e.forceNavigateUrl),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.sessionContext&&(t.session_context=e.sessionContext),t}async function rr(e){let t=ve(e.decisions),r=0,s=!1;for(;;){let o=e.session.snapshot(),f=e.accumulator.snapshot(),i=await e.runReplayPhase(t);if(i.cancelled)return s=!0,tr(i.failedAt??0),{authorBoundary:t,cancelledInPhase:s,shrinkCount:r};if(i.failedAt===null)return{authorBoundary:t,cancelledInPhase:s,shrinkCount:r};let R=Ht({failedAt:i.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(R.kind==="fail")return{authorBoundary:-1,cancelledInPhase:s,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:s,shrinkCount:r};if(e.session.rollback(o),e.accumulator.rollback(f),R.kind==="complete-reauthor")return Xt(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:s,shrinkCount:r};r++,Qt(r,de.maxShrinks,R.newAuthorBoundary),t=R.newAuthorBoundary}}var Ir=60*1e3,nr="lock-heartbeat",se=null;function Ze(e){se===null&&(se=setInterval(async()=>{let t=await Tt({baseUrl:e.baseUrl,testId:e.testId,auth:e.auth});if(!t.ok){let r=t.expired?"session expired":t.message;process.stderr.write(`[lock] heartbeat failed: ${r}; continuing run
11
+ `)}},Ir),Z(nr,()=>{se!==null&&(clearInterval(se),se=null)}))}function Je(){se!==null&&J(nr,"stopped")}var Ie=class{constructor(t){this.resolved=t;this.outcomes=t.rootSteps.map(r=>({rootStepIndex:r.index,status:"skipped"}))}outcomes;skipRoot=null;overallHalted=!1;shouldRunFlatStep(t){if(this.overallHalted)return!1;let r=t.trace[0].stepIndex;return!(this.skipRoot!==null&&r===this.skipRoot)}recordStep(t,r){let s=t.trace[0].stepIndex,o=this.outcomes.find(l=>l.rootStepIndex===s),f=this.resolved.rootSteps.find(l=>l.index===s),i=f.body.kind!=="objective";return i&&(o.refKind="import",o.refLabel=f.body.path,o.inlinedCount=(o.inlinedCount??0)+1,o.duration_s=(o.duration_s??0)+r.duration_s),r.status==="passed"?(i?o.status!=="failed"&&(o.status="passed"):(o.status="passed",o.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(o.softFailures=o.softFailures??[],o.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(o.status="failed",o.duration_s=i?o.duration_s:r.duration_s,o.failedSubStepIndex=i?t.trace.slice(1).map(l=>l.stepIndex):void 0,o.reason=r.reason,this.skipRoot=s,f.optional??!1?(o.softFailed=!0,{continueOverall:!0}):(this.overallHalted=!0,{continueOverall:!1}))}snapshotOutcomes(){return[...this.outcomes]}snapshot(){return{outcomes:this.outcomes.map(t=>({...t,softFailures:t.softFailures?[...t.softFailures]:void 0})),skipRoot:this.skipRoot,overallHalted:this.overallHalted}}rollback(t){this.outcomes=t.outcomes.map(r=>({...r,softFailures:r.softFailures?[...r.softFailures]:void 0})),this.skipRoot=t.skipRoot,this.overallHalted=t.overallHalted}finalize(){let t=this.outcomes.some(s=>s.status==="failed"&&!s.softFailed)?"failed":"passed",r=this.outcomes.reduce((s,o)=>s+(o.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};import{writeFileSync as kr,mkdirSync as _r}from"fs";import{dirname as or}from"path";function Qe(e){let t=Se(e.sourcePath);try{_r(or(t),{recursive:!0})}catch(s){return process.stderr.write(`
12
12
  \u26A0 Failed to create output directory.
13
13
  ${s.message}
14
14
  Path: ${or(t)}
@@ -19,8 +19,8 @@ import{a as de,b as Ht}from"./chunk-C5UNZ6ZY.js";import{a as qt}from"./chunk-D4P
19
19
  ${s.message}
20
20
  Path: ${t}
21
21
 
22
- `)}return t}var Cr=()=>{};async function sr(e,t,r){let s=t.log??Cr,o=e.session.testId??null,f=null,i=null,R=null;if(!r.localMode&&t.performUpload)try{f=await t.performUpload(),f?.success&&(f.testId&&(o=f.testId),f.testcaseId&&e.session.setTestcaseId(f.testcaseId))}catch(l){s("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(l)})}if(t.renderFeedbackPrompt)try{i=await t.renderFeedbackPrompt(),i&&o&&t.submitFeedback&&t.submitFeedback(o,i).catch(l=>{s("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(l)})})}catch(l){s("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(l)})}if(e.session.flushRecorder(),r.skipLocalWrites)s("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{R=Be({sourcePath:r.sourcePath,title:r.title,rootSteps:r.rootSteps,outcomes:r.outcomes,overallStatus:r.overallStatus,startedISO:r.startedISO,durationS:r.durationS,sessionId:e.session.sessionId})}catch(l){s("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(l)})}try{Qe({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:o??void 0,testcaseId:e.session.testcaseId??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,orgId:e.session.orgId??void 0,sessionName:e.session.sessionName??Re(r.sourcePath)})}catch(l){s("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(l)})}if(f?.codeExportDir)try{let l=e.tuiConfig.code_export?.language??"python";ze(f.codeExportDir,Ve(r.sourcePath,"playwright",l))}catch(l){s("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(l)})}}else if(e.session.recorder?.lastWrittenPath){let l=e.session.recorder.lastWrittenPath,S=e.session.getFlows(),_=S.map((p,C)=>({index:C+1,heading:`Step ${C+1}`,headingLine:0,body:{kind:"objective",text:p.objective}})),I=S.map((p,C)=>({rootStepIndex:C+1,status:p.status==="passed"?"passed":p.status==="failed"?"failed":"skipped",duration_s:p.duration,reason:p.reason})),P=I.some(p=>p.status==="failed")?"failed":"passed";try{R=Be({sourcePath:l,title:e.session.sessionName??"Session",rootSteps:_,outcomes:I,overallStatus:P,startedISO:e.session.startedAt,durationS:I.reduce((p,C)=>p+(C.duration_s??0),0),sessionId:e.session.sessionId})}catch(p){s("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(p)})}try{Qe({sourcePath:l,commitId:e.session.sessionId,testId:o??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0})}catch(p){s("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(p)})}if(f?.codeExportDir)try{let p=e.tuiConfig.code_export?.language??"python";ze(f.codeExportDir,Ve(l,"playwright",p))}catch(p){s("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(p)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${l} (renamed: ${e.session.sessionName}_test.md already existed)
23
- `)}try{t.runCleanup?.()}catch(l){s("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(l)})}try{await e.session.finish("complete")}catch(l){s("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(l)})}return{uploadResult:f,feedbackChoice:i,resultMdPath:R}}var ke=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function oo(e,t){let r=Er(e);if(!Xe(r))return process.stderr.write(`error: file not found: ${r}
22
+ `)}return t}var Cr=()=>{};async function sr(e,t,r){let s=t.log??Cr,o=e.session.testId??null,f=null,i=null,R=null;if(!r.localMode&&t.performUpload)try{f=await t.performUpload(),f?.success&&(f.testId&&(o=f.testId),f.testcaseId&&e.session.setTestcaseId(f.testcaseId))}catch(l){s("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(l)})}if(t.renderFeedbackPrompt)try{i=await t.renderFeedbackPrompt(),i&&o&&t.submitFeedback&&t.submitFeedback(o,i).catch(l=>{s("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(l)})})}catch(l){s("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(l)})}if(e.session.flushRecorder(),r.skipLocalWrites)s("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{R=Be({sourcePath:r.sourcePath,title:r.title,rootSteps:r.rootSteps,outcomes:r.outcomes,overallStatus:r.overallStatus,startedISO:r.startedISO,durationS:r.durationS,sessionId:e.session.sessionId})}catch(l){s("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(l)})}try{Qe({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:o??void 0,testcaseId:e.session.testcaseId??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,orgId:e.session.orgId??void 0,sessionName:e.session.sessionName??ye(r.sourcePath)})}catch(l){s("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(l)})}if(f?.codeExportDir)try{let l=e.tuiConfig.code_export?.language??"python";ze(f.codeExportDir,Ve(r.sourcePath,"playwright",l))}catch(l){s("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(l)})}}else if(e.session.recorder?.lastWrittenPath){let l=e.session.recorder.lastWrittenPath,S=e.session.getFlows(),_=S.map((p,C)=>({index:C+1,heading:`Step ${C+1}`,headingLine:0,body:{kind:"objective",text:p.objective}})),I=S.map((p,C)=>({rootStepIndex:C+1,status:p.status==="passed"?"passed":p.status==="failed"?"failed":"skipped",duration_s:p.duration,reason:p.reason})),P=I.some(p=>p.status==="failed")?"failed":"passed";try{R=Be({sourcePath:l,title:e.session.sessionName??"Session",rootSteps:_,outcomes:I,overallStatus:P,startedISO:e.session.startedAt,durationS:I.reduce((p,C)=>p+(C.duration_s??0),0),sessionId:e.session.sessionId})}catch(p){s("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(p)})}try{Qe({sourcePath:l,commitId:e.session.sessionId,testId:o??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0})}catch(p){s("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(p)})}if(f?.codeExportDir)try{let p=e.tuiConfig.code_export?.language??"python";ze(f.codeExportDir,Ve(l,"playwright",p))}catch(p){s("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(p)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${l} (renamed: ${e.session.sessionName}_test.md already existed)
23
+ `)}try{t.runCleanup?.()}catch(l){s("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(l)})}try{await e.session.finish("complete")}catch(l){s("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(l)})}return{uploadResult:f,feedbackChoice:i,resultMdPath:R}}var _e=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function oo(e,t){let r=Er(e);if(!Xe(r))return process.stderr.write(`error: file not found: ${r}
24
24
  `),2;qt(r);let s=!process.stdin.isTTY||!!t.agent,o=!1,f=s?n=>process.stdout.write(JSON.stringify(n)+`
25
25
  `):n=>{},i;try{i=Nt(r)}catch(n){return process.stderr.write(`error: ${n.message}
26
26
  `),2}if(i.steps.length===0)return process.stderr.write(`info: no steps in ${r}; nothing to run.
@@ -30,10 +30,10 @@ import{a as de,b as Ht}from"./chunk-C5UNZ6ZY.js";import{a as qt}from"./chunk-D4P
30
30
  \u2022 Run 'kane-cli login --username <user> --access-key <key>'
31
31
  `):n instanceof Ge&&n.code==="refresh_failed"?process.stderr.write(`error: Token refresh failed. Run 'kane-cli login' to re-authenticate.
32
32
  `):process.stderr.write(`error: auth resolution failed: ${n.message}
33
- `),2}let Q=String(u.resolvedCreds?.org_id??"");if(!Q)return process.stderr.write("error: TMS did not return an org_id. Run `kane-cli login` again.\n"),2;{let{readMetaIfExists:n,assertOrgMatchOrExit:c}=await import("./testmd-actions-322GQYAH.js"),d=c(n(r),Q);if(d!==null)return d}let a=new ut,h=await jr(r,i,t,{resolvedAuth:u,tmsBaseUrl:C.tmsBaseUrl},a.sessionId);if(h.abort)return h.abort.exitCode;let O=h.lockAcquired,$=!1,B=!1,ue=!1;if(O&&f({type:"test_md_lock_state",phase:"acquired",scope:"preemptive"}),a.start({model:w,environment:p,profile:I}),a.setRecordingEnabled(!1),t.name){try{wt(t.name)}catch(n){return process.stderr.write(`error: ${n.message}
34
- `),2}a.setSessionName(t.name)}let Ee={};for(let[n,c]of Object.entries(i.rootGlobal))ke.includes(n)||(Ee[n]=c);for(let[n,c]of Object.entries(R))ke.includes(n)||c!==void 0&&(Ee[n]=c);let V={...i.chrome};for(let n of ke){let c=R[n];c!==void 0&&(V[n]=c)}let lr={...Ee,...V};a.setResolvedGlobal(lr);let z;try{z=await $t({config:{chrome_profile_path:V.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:ne,headless:V.headless??!1,wsEndpoint:V.ws_endpoint,cdpEndpoint:V.cdp_endpoint})}catch(n){return process.stderr.write(`error: Chrome launch failed: ${n.message}
35
- `),await a.finish("complete"),2}let pe=z.instance;pe&&Z("chrome",()=>{try{pe.kill()}catch{}});let j=null,et=z.cdpEndpoint??V.cdp_endpoint;if(et&&!V.ws_endpoint&&!V.headless)try{j=bt({headless:V.headless??!1,cdpEndpoint:et,chromePid:pe?.process.pid}),j&&Z("marker-overlay",()=>j.kill())}catch(n){a.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(n)})}if(u.resolvedCreds?.org_id!==void 0&&a.setOrgId(String(u.resolvedCreds.org_id)),u.resolvedCreds)try{let{createRemoteLogger:n}=await import("./logging-AIQHWRNQ.js"),{getMachineId:c}=await import("./machine-id-DZN4MYOO.js"),d=n({sessionId:a.sessionId,identity:{org_id:String(u.resolvedCreds.org_id??""),user_id:String(u.resolvedCreds.user_id??""),machine_id:c(),email:u.resolvedCreds.email??null,email_domain:u.resolvedCreds.email_domain??"unknown",user_type:u.resolvedCreds.user_type??"unknown",env:p},getToken:async()=>u.token});a.setRemoteLogger(d),d.start(),Z("remote-logger",()=>d.shutdownSync()),gt(d)}catch(n){process.stderr.write(`warn: remote logger init failed: ${n.message}
36
- `)}let X=Ct({objective:"",globalDir:Ie(Le,"variables"),localDir:Ie(process.cwd(),".testmuai","variables"),file:t.variablesFile,inline:t.variables}),cr=i.rootGlobal.variables??{},U=Or(X.raw,cr);a.setAuteurVariables(U.auteur);let tt=Me(Ie(Le,"global-memory.md"))??void 0,rt=Me(Ie(process.cwd(),".testmuai","context.md"))??void 0,nt=l.getActiveProfile()??"default",ot=l.getDefaultEnv(),{rehydrateIfStale:dr}=await import("./profile-sync-DTTRRIVP.js");dr(l,S,nt,ot);let N=S.load(),M=N.project_id??null,fe=N.folder_id??null;if(!t.local&&!M&&u.basicAuth)try{let n=await Bt({creds:l,config:S,profile:nt,env:ot,tmsCreds:u.basicAuth,log:(c,d,m,b)=>a.log(c,d,m,b)});M=n.projectId,fe=n.folderId,N=S.load(),process.stderr.write(`info: using project '${n.projectName}' / folder '${n.folderName}' (auto-configured)
33
+ `),2}let Q=String(u.resolvedCreds?.org_id??"");if(!Q)return process.stderr.write("error: TMS did not return an org_id. Run `kane-cli login` again.\n"),2;{let{readMetaIfExists:n,assertOrgMatchOrExit:c}=await import("./testmd-actions-D3TJX2Q4.js"),d=c(n(r),Q);if(d!==null)return d}let a=new ut,h=await jr(r,i,t,{resolvedAuth:u,tmsBaseUrl:C.tmsBaseUrl},a.sessionId);if(h.abort)return h.abort.exitCode;let O=h.lockAcquired,$=!1,B=!1,ue=!1;if(O&&f({type:"test_md_lock_state",phase:"acquired",scope:"preemptive"}),a.start({model:w,environment:p,profile:I}),a.setRecordingEnabled(!1),t.name){try{wt(t.name)}catch(n){return process.stderr.write(`error: ${n.message}
34
+ `),2}a.setSessionName(t.name)}let Ae={};for(let[n,c]of Object.entries(i.rootGlobal))_e.includes(n)||(Ae[n]=c);for(let[n,c]of Object.entries(R))_e.includes(n)||c!==void 0&&(Ae[n]=c);let V={...i.chrome};for(let n of _e){let c=R[n];c!==void 0&&(V[n]=c)}let lr={...Ae,...V};a.setResolvedGlobal(lr);let z;try{z=await $t({config:{chrome_profile_path:V.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:ne,headless:V.headless??!1,wsEndpoint:V.ws_endpoint,cdpEndpoint:V.cdp_endpoint})}catch(n){return process.stderr.write(`error: Chrome launch failed: ${n.message}
35
+ `),await a.finish("complete"),2}let pe=z.instance;pe&&Z("chrome",()=>{try{pe.kill()}catch{}});let j=null,et=z.cdpEndpoint??V.cdp_endpoint;if(et&&!V.ws_endpoint&&!V.headless)try{j=bt({headless:V.headless??!1,cdpEndpoint:et,chromePid:pe?.process.pid}),j&&Z("marker-overlay",()=>j.kill())}catch(n){a.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(n)})}if(u.resolvedCreds?.org_id!==void 0&&a.setOrgId(String(u.resolvedCreds.org_id)),u.resolvedCreds)try{let{createRemoteLogger:n}=await import("./logging-M7EYIZTV.js"),{getMachineId:c}=await import("./machine-id-DZN4MYOO.js"),d=n({sessionId:a.sessionId,identity:{org_id:String(u.resolvedCreds.org_id??""),user_id:String(u.resolvedCreds.user_id??""),machine_id:c(),email:u.resolvedCreds.email??null,email_domain:u.resolvedCreds.email_domain??"unknown",user_type:u.resolvedCreds.user_type??"unknown",env:p},getToken:async()=>u.token});a.setRemoteLogger(d),d.start(),Z("remote-logger",()=>d.shutdownSync()),gt(d)}catch(n){process.stderr.write(`warn: remote logger init failed: ${n.message}
36
+ `)}let X=Ct({objective:"",globalDir:ke(Le,"variables"),localDir:ke(process.cwd(),".testmuai","variables"),file:t.variablesFile,inline:t.variables}),cr=i.rootGlobal.variables??{},U=Or(X.raw,cr);a.setAuteurVariables(U.auteur);let tt=Me(ke(Le,"global-memory.md"))??void 0,rt=Me(ke(process.cwd(),".testmuai","context.md"))??void 0,nt=l.getActiveProfile()??"default",ot=l.getDefaultEnv(),{rehydrateIfStale:dr}=await import("./profile-sync-DTTRRIVP.js");dr(l,S,nt,ot);let N=S.load(),M=N.project_id??null,fe=N.folder_id??null;if(!t.local&&!M&&u.basicAuth)try{let n=await Bt({creds:l,config:S,profile:nt,env:ot,tmsCreds:u.basicAuth,log:(c,d,m,b)=>a.log(c,d,m,b)});M=n.projectId,fe=n.folderId,N=S.load(),process.stderr.write(`info: using project '${n.projectName}' / folder '${n.folderName}' (auto-configured)
37
37
  `)}catch(n){process.stderr.write(`warn: could not auto-configure project/folder: ${n.message}
38
38
  KaneAI upload will be skipped for this run.
39
39
  `)}t.local?process.stderr.write(`info: --local \u2014 KaneAI upload skipped
@@ -42,24 +42,24 @@ import{a as de,b as Ht}from"./chunk-C5UNZ6ZY.js";import{a as qt}from"./chunk-D4P
42
42
  Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
43
43
  `);let ae=!t.local&&!!u.basicAuth&&M!=null;if(a.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:ae,lockHeld:O,isFirstRun:h.isFirstRun,hasBasic:h.hasBasic}),ae&&h.testId==null){let n=ee(p);try{let c=await Ut({tmsBaseUrl:n.tmsBaseUrl,auth:u.basicAuth,objective:i.steps[0].objective,url:"",projectId:M,folderId:fe??"",hasCustomProfile:!!V.chrome_profile,log:(d,m,b,g)=>a.log(d,m,b,g)});c&&a.setTestId(c)}catch(c){process.stderr.write(`warn: ATM test creation failed: ${c.message}
44
44
  `)}}else h.testId&&a.setTestId(h.testId);let me={};if(u.basicAuth&&!t.local&&(U.secretEntries.length>0||U.nonSecretEntries.length>0))try{me=await Et({variables:U,auth:u.basicAuth,orgId:String(u.resolvedCreds?.org_id??""),env:p,localMode:!!t.local,log:(n,c,d,m)=>a.log(n,c,d,m)})}catch(n){process.stderr.write(`warn: variable/secret push failed: ${n.message}
45
- `)}let Ae=new Map;for(let[n,c]of U.nonSecretEntries)Ae.set(n,c.value);let xe=new Map;for(let[n,c]of U.secretEntries)xe.set(n,c.value);async function Pe(n){if(!u.basicAuth||t.local)return;let c=[],d=[];for(let[b,g]of Object.entries(n))if(g.secret){if(xe.get(b)===g.value)continue;d.push([b,g])}else{if(Ae.get(b)===g.value)continue;c.push([b,g])}if(c.length===0&&d.length===0)return;let m=ee(p);if(c.length>0){let b=new kt(m.tmsBaseUrl,u.basicAuth.username,u.basicAuth.access_key);for(let[g,E]of c)try{let v=await b.upsertVariable({name:g,value:E.value});me[g]=v.id,Ae.set(g,E.value),a.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:g})}catch(v){a.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:g,error:String(v)})}}if(d.length>0){let b=new It(m.secretsBaseUrl);for(let[g,E]of d)try{await b.pushSecret({secretKey:g,secretValue:E.value,username:u.basicAuth.username,accessKey:u.basicAuth.access_key,orgId:String(u.resolvedCreds?.org_id??"")}),xe.set(g,E.value),a.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:g})}catch(v){a.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:g,error:String(v)})}}}let Oe=null,he=0;if(u.basicAuth&&!t.local)try{let c=await new ht(ee(p).controllerBaseUrl,{username:u.basicAuth.username,accessKey:u.basicAuth.access_key}).getScreenshotSas();a.setScreenshotSas(c),Oe=new vt(c,3,(d,m,b,g)=>a.log(d,m,b,g)),a.log("info","SCREENSHOT_SAS_OK","Screenshot SAS token fetched",{base_url:c.base_url,container:c.container,expiry:c.expiry})}catch(n){a.log("warn","SCREENSHOT_SAS_FAIL","Screenshot SAS token fetch failed",{error:n instanceof Error?n.message:String(n)})}let le=Oe?(n,c,d)=>{if(!(O||h.isFirstRun))return;let m=he+c;St(a.sessionDir,m,n,Oe,(b,g,E,v)=>a.log(b,g,E,v),d)}:void 0,st=i.rootTitle??i.rootSteps[0]?.heading??Ar(r),ur=Object.keys(U.raw).length>0?be(U.raw,st).objective:st;a.setFirstRun(ur,ne);let Y=new ve(i),Fe=new Date().toISOString(),pr=Date.now(),fr=typeof t.maxSteps=="string"&&t.maxSteps!==""?parseInt(t.maxSteps,10):void 0;function it(n,c){let d=i.steps[n],m=ir(d.config,R),b=ie(X.raw,m.variables,d.objective);return At({objective:b.objective,url:n===0?ne:void 0,model:w,chrome:z,auth:u,sessionId:a.sessionId,runIndex:c,windowSize:{width:1920,height:1080},maxSteps:m.max_steps??fr??30,headless:V.headless??!1,variables:Object.keys(b.variables).length>0?b.variables:void 0,globalContext:m.global_context??tt,localContext:m.local_context??rt,sessionContext:a.getContext()})}function at(n){let d=i.steps[n].trace[0].stepIndex,m=i.rootSteps.find(g=>g.index===d);i.steps.slice(0,n).some(g=>g.trace[0].stepIndex===d)||f({type:"test_md_step_start",step_index:d,heading:m.heading,ref:m.body.kind==="import_ref"?{kind:"import",label:m.body.path}:null})}function Te(n,c,d,m,b,g){let E=i.steps[n],v=E.trace[0].stepIndex,F=!i.steps.slice(n+1).some(k=>k.trace[0].stepIndex===v),x=d?.status==="passed"?"passed":"failed",T=d?.reason??b??void 0,D=d?.duration??g,{continueOverall:H}=Y.recordStep(E,{status:x,duration_s:D,reason:T}),q=ir(E.config,R),K=ie(X.raw,q.variables,E.objective).objective;if(d){let k=pt(d,c,m);a.addRunResult(ft(d,K,c,k),d.total_runs)}else a.addRunResult({index:c,objective:K,status:x,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(F||!H){let k=Y.snapshotOutcomes().find(y=>y.rootStepIndex===v);f({type:"test_md_step_end",step_index:v,status:k.status,duration_s:k.duration_s??0,ref_kind:k.refKind??null,inlined_count:k.inlinedCount??null,failed_sub_step_index:k.failedSubStepIndex??null})}return H}async function mr(n){Zt(n,i.steps.length);for(let c=0;c<n;c++){if(o)return{failedAt:c,cancelled:!0};let d=i.steps[c],m=h.decisions[c];if(m.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${c}
46
- `),{failedAt:c,cancelled:!1};let b=a.nextRunIndex();he=b;let g=c===0?ne:void 0,E={width:N.window_size.width,height:N.window_size.height},v=ie(X.raw,d.config.variables,d.objective),F=We({step:d,decision:m,chrome:z,auth:u,sessionId:a.sessionId,runIndex:b,sessionDir:a.sessionDir,windowSize:E,forceNavigateUrl:g,sessionContext:a.getContext(),variables:Object.keys(v.variables).length>0?v.variables:void 0});await Pe(v.raw),at(c);let x=Date.now(),T=null,D=null;try{let k=Ne(F,{environment:p});Z("runner",()=>{Ue()&&(o=!0);try{k.cancel()}catch{}}),j?.setRunActive(!0);try{for await(let y of k.events){if(s&&process.stdout.write(JSON.stringify(y)+`
45
+ `)}let xe=new Map;for(let[n,c]of U.nonSecretEntries)xe.set(n,c.value);let Pe=new Map;for(let[n,c]of U.secretEntries)Pe.set(n,c.value);async function Oe(n){if(!u.basicAuth||t.local)return;let c=[],d=[];for(let[b,g]of Object.entries(n))if(g.secret){if(Pe.get(b)===g.value)continue;d.push([b,g])}else{if(xe.get(b)===g.value)continue;c.push([b,g])}if(c.length===0&&d.length===0)return;let m=ee(p);if(c.length>0){let b=new kt(m.tmsBaseUrl,u.basicAuth.username,u.basicAuth.access_key);for(let[g,E]of c)try{let v=await b.upsertVariable({name:g,value:E.value});me[g]=v.id,xe.set(g,E.value),a.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:g})}catch(v){a.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:g,error:String(v)})}}if(d.length>0){let b=new It(m.secretsBaseUrl);for(let[g,E]of d)try{await b.pushSecret({secretKey:g,secretValue:E.value,username:u.basicAuth.username,accessKey:u.basicAuth.access_key,orgId:String(u.resolvedCreds?.org_id??"")}),Pe.set(g,E.value),a.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:g})}catch(v){a.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:g,error:String(v)})}}}let he=null,ge=0;if(u.basicAuth&&!t.local)try{let c=await new ht(ee(p).controllerBaseUrl,{username:u.basicAuth.username,accessKey:u.basicAuth.access_key}).getScreenshotSas();a.setScreenshotSas(c),he=new vt(c,3,(d,m,b,g)=>a.log(d,m,b,g)),a.log("info","SCREENSHOT_SAS_OK","Screenshot SAS token fetched",{base_url:c.base_url,container:c.container,expiry:c.expiry})}catch(n){a.log("warn","SCREENSHOT_SAS_FAIL","Screenshot SAS token fetch failed",{error:n instanceof Error?n.message:String(n)})}let le=he?(n,c,d)=>{if(!(O||h.isFirstRun))return;let m=ge+c;St(a.sessionDir,m,n,he,(b,g,E,v)=>a.log(b,g,E,v),d)}:void 0,st=i.rootTitle??i.rootSteps[0]?.heading??Ar(r),ur=Object.keys(U.raw).length>0?Re(U.raw,st).objective:st;a.setFirstRun(ur,ne);let Y=new Ie(i),Fe=new Date().toISOString(),pr=Date.now(),fr=typeof t.maxSteps=="string"&&t.maxSteps!==""?parseInt(t.maxSteps,10):void 0;function it(n,c){let d=i.steps[n],m=ir(d.config,R),b=ie(X.raw,m.variables,d.objective);return At({objective:b.objective,url:n===0?ne:void 0,model:w,chrome:z,auth:u,sessionId:a.sessionId,runIndex:c,windowSize:{width:1920,height:1080},maxSteps:m.max_steps??fr??30,headless:V.headless??!1,variables:Object.keys(b.variables).length>0?b.variables:void 0,globalContext:m.global_context??tt,localContext:m.local_context??rt,sessionContext:a.getContext()})}function at(n){let d=i.steps[n].trace[0].stepIndex,m=i.rootSteps.find(g=>g.index===d);i.steps.slice(0,n).some(g=>g.trace[0].stepIndex===d)||f({type:"test_md_step_start",step_index:d,heading:m.heading,ref:m.body.kind==="import_ref"?{kind:"import",label:m.body.path}:null})}function Te(n,c,d,m,b,g){let E=i.steps[n],v=E.trace[0].stepIndex,F=!i.steps.slice(n+1).some(k=>k.trace[0].stepIndex===v),x=d?.status==="passed"?"passed":"failed",T=d?.reason??b??void 0,D=d?.duration??g,{continueOverall:H}=Y.recordStep(E,{status:x,duration_s:D,reason:T}),q=ir(E.config,R),K=ie(X.raw,q.variables,E.objective).objective;if(d){let k=pt(d,c,m);a.addRunResult(ft(d,K,c,k),d.total_runs)}else a.addRunResult({index:c,objective:K,status:x,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(F||!H){let k=Y.snapshotOutcomes().find(y=>y.rootStepIndex===v);f({type:"test_md_step_end",step_index:v,status:k.status,duration_s:k.duration_s??0,ref_kind:k.refKind??null,inlined_count:k.inlinedCount??null,failed_sub_step_index:k.failedSubStepIndex??null})}return H}async function mr(n){Zt(n,i.steps.length);for(let c=0;c<n;c++){if(o)return{failedAt:c,cancelled:!0};let d=i.steps[c],m=h.decisions[c];if(m.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${c}
46
+ `),{failedAt:c,cancelled:!1};let b=a.nextRunIndex();ge=b;let g=c===0?ne:void 0,E={width:N.window_size.width,height:N.window_size.height},v=ie(X.raw,d.config.variables,d.objective),F=We({step:d,decision:m,chrome:z,auth:u,sessionId:a.sessionId,runIndex:b,sessionDir:a.sessionDir,windowSize:E,forceNavigateUrl:g,sessionContext:a.getContext(),variables:Object.keys(v.variables).length>0?v.variables:void 0});await Oe(v.raw),at(c);let x=Date.now(),T=null,D=null;try{let k=Ne(F,{environment:p});Z("runner",()=>{Ue()&&(o=!0);try{k.cancel()}catch{}}),j?.setRunActive(!0);try{for await(let y of k.events){if(s&&process.stdout.write(JSON.stringify(y)+`
47
47
  `),y.type==="step_event"&&y.event==="reasoning"?j?.setStepText(y.detail):y.type==="step_end"&&(y.status==="passed"&&j?.setStepComplete(),le&&le(y.index,0,y.child_id)),y.type==="run_end"){T=y;break}if(y.type==="error"){D=y.message??"runner error";break}}try{k.cancel()}catch{}if(!T&&!D){let{code:y}=await k.exited;y!==0&&(D=`runner exited with code ${y}`)}}finally{j?.setRunActive(!1),J("runner","Replay step complete")}}catch(k){D=k.message}if(o)return{failedAt:c,cancelled:!0};let H=Math.round((Date.now()-x)/1e3),q=Te(c,b,T,null,D,H);a.recordStepRun({testmdStepIndex:i.steps[c].flatIndex,runIndex:b,totalRunDirs:1});let K=!!D||T?.status==="failed";if(Jt(c,K?"failed":"ok"),K||!q)return{failedAt:c,cancelled:!1}}return{failedAt:null,cancelled:!1}}let lt=async()=>{if(O)return!0;if(!h.testId||!h.fromCommitId||!u.basicAuth)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
48
- `),!1;let n=a.sessionId,c=t.onLockConflict??i.rootGlobal.on_lock_conflict??"readonly",d=await ar({tmsBaseUrl:C.tmsBaseUrl,testId:h.testId,fromCommitId:h.fromCommitId,newCommitId:n,basicAuth:u.basicAuth,onLockConflict:c});return d==="ok"?(O=!0,h.newCommitId=n,a.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:h.testId}),s&&f({type:"test_md_lock_state",phase:"acquired",scope:"mid_run"}),Ze({baseUrl:_e(C.tmsBaseUrl),testId:h.testId,auth:Ce(u.basicAuth)}),!0):(a.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:d}),s&&f({type:"test_md_lock_state",phase:"conflict",scope:"mid_run",reason:d}),process.stderr.write(`error: mid-run lock acquisition failed (${d})
49
- `),!1)};if(s){let{authorBoundary:n,cancelledInPhase:c,shrinkCount:d}=await rr({decisions:h.decisions,hasRetry:t.retry===!0||t.retryCount!==void 0,maxShrinks:t.retryCount!==void 0?parseInt(t.retryCount,10):de.maxShrinks,runReplayPhase:mr,session:a,accumulator:Y,acquireLockIfNeeded:lt});if(ue=d>0,d>0&&(a.log("info","RETRY_TRIGGERED","Retry loop triggered",{shrink_count:d,final_author_boundary:n}),f({type:"test_md_retry_attempt",shrink_count:d,final_author_boundary:n,complete_reauthor:n===0})),n===0&&d>0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:d}),!c&&n>=0)for(let m=n;m<i.steps.length;m++){let b=i.steps[m];if(!Y.shouldRunFlatStep(b))continue;at(m),$=!0;let g=a.nextRunIndex();he=g,await Pe(ie(X.raw,b.config.variables,b.objective).raw);let E=it(m,g),v=Date.now(),F=null,x=null,T=null,D=!1,H=0;try{let k=Ne(E,{environment:p});Z("runner",()=>{Ue()&&(o=!0);try{k.cancel()}catch{}}),j?.setRunActive(!0);try{for await(let y of k.events){if(process.stdout.write(JSON.stringify(y)+`
50
- `),y.type==="bifurcation"){let ce=y.count??y.flows?.length??0;(y.is_single_flow??ce<=1)||(T=y.flows??null,D=!0,H=0)}else if(y.type==="run_start"&&D)H++;else if(y.type==="step_event"&&y.event==="reasoning")j?.setStepText(y.detail);else if(y.type==="step_end"&&(y.status==="passed"&&j?.setStepComplete(),le)){let ce=D?Math.max(0,H-1):0;le(y.index,ce,y.child_id)}if(y.type==="run_end"){F=y;break}if(y.type==="error"){x=y.message??"runner error";break}}try{k.cancel()}catch{}}finally{j?.setRunActive(!1),J("runner","Step complete")}}catch(k){x=k.message}let q=Math.round((Date.now()-v)/1e3),K=Te(m,g,F,T,x,q);if(a.recordStepRun({testmdStepIndex:i.steps[m].flatIndex,runIndex:g,totalRunDirs:F?.total_runs??1}),!K||o)break}}else{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{TestMdRunView:d}=await import("./TestMdRunView-PI433EGP.js"),{effectiveDecisions:m}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:b}=await import("./replay-policy-6USQBT3E.js"),g=t.retry===!0||t.retryCount!==void 0,E=t.retryCount!==void 0?parseInt(t.retryCount,10):de.maxShrinks,v=t.author===!0;v&&(er(),a.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let F=v?0:we(h.decisions),x=0,T=null,D=h.decisions.filter(k=>k.kind==="replay").length,H=h.decisions.length-D,q=[];t.push&&q.push("--push"),g&&q.push("--retry"),t.retryCount!==void 0&&q.push(`--retry-count=${t.retryCount}`),v&&q.push("--author");let K={source:r,steps:{total:h.decisions.length,replay:D,author:H},model:w,viewport:{width:N.window_size.width,height:N.window_size.height},chrome:z.cdpEndpoint??z.wsEndpoint??"managed",session:a.sessionName??"ephemeral",variables:{count:Object.keys(U.raw).length,secrets:Object.values(U.raw).filter(k=>k.secret).length,names:Object.keys(U.raw)},flags:q,mode:R.mode??"testing"};for(;;){let k=a.snapshot(),y=Y.snapshot(),ce=m(h.decisions,F,v);if(x>=1){let A=F===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${x}/${E})`:`\u21BB Retry ${x}/${E} \u2014 replay 0..${F-1}, author ${F}..${h.decisions.length-1}
48
+ `),!1;let n=a.sessionId,c=t.onLockConflict??i.rootGlobal.on_lock_conflict??"readonly",d=await ar({tmsBaseUrl:C.tmsBaseUrl,testId:h.testId,fromCommitId:h.fromCommitId,newCommitId:n,basicAuth:u.basicAuth,onLockConflict:c});return d==="ok"?(O=!0,h.newCommitId=n,a.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:h.testId}),s&&f({type:"test_md_lock_state",phase:"acquired",scope:"mid_run"}),Ze({baseUrl:Ce(C.tmsBaseUrl),testId:h.testId,auth:Ee(u.basicAuth)}),!0):(a.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:d}),s&&f({type:"test_md_lock_state",phase:"conflict",scope:"mid_run",reason:d}),process.stderr.write(`error: mid-run lock acquisition failed (${d})
49
+ `),!1)};if(s){let{authorBoundary:n,cancelledInPhase:c,shrinkCount:d}=await rr({decisions:h.decisions,hasRetry:t.retry===!0||t.retryCount!==void 0,maxShrinks:t.retryCount!==void 0?parseInt(t.retryCount,10):de.maxShrinks,runReplayPhase:mr,session:a,accumulator:Y,acquireLockIfNeeded:lt});if(ue=d>0,d>0&&(a.log("info","RETRY_TRIGGERED","Retry loop triggered",{shrink_count:d,final_author_boundary:n}),f({type:"test_md_retry_attempt",shrink_count:d,final_author_boundary:n,complete_reauthor:n===0})),n===0&&d>0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:d}),!c&&n>=0)for(let m=n;m<i.steps.length;m++){let b=i.steps[m];if(!Y.shouldRunFlatStep(b))continue;at(m),$=!0;let g=a.nextRunIndex();ge=g,await Oe(ie(X.raw,b.config.variables,b.objective).raw);let E=it(m,g),v=Date.now(),F=null,x=null,T=null,D=!1,H=0;try{let k=Ne(E,{environment:p});Z("runner",()=>{Ue()&&(o=!0);try{k.cancel()}catch{}}),j?.setRunActive(!0);try{for await(let y of k.events){if(process.stdout.write(JSON.stringify(y)+`
50
+ `),y.type==="bifurcation"){let ce=y.count??y.flows?.length??0;(y.is_single_flow??ce<=1)||(T=y.flows??null,D=!0,H=0)}else if(y.type==="run_start"&&D)H++;else if(y.type==="step_event"&&y.event==="reasoning")j?.setStepText(y.detail);else if(y.type==="step_end"&&(y.status==="passed"&&j?.setStepComplete(),le)){let ce=D?Math.max(0,H-1):0;le(y.index,ce,y.child_id)}if(y.type==="run_end"){F=y;break}if(y.type==="error"){x=y.message??"runner error";break}}try{k.cancel()}catch{}}finally{j?.setRunActive(!1),J("runner","Step complete")}}catch(k){x=k.message}let q=Math.round((Date.now()-v)/1e3),K=Te(m,g,F,T,x,q);if(a.recordStepRun({testmdStepIndex:i.steps[m].flatIndex,runIndex:g,totalRunDirs:F?.total_runs??1}),!K||o)break}}else{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{TestMdRunView:d}=await import("./TestMdRunView-UMTYIRAE.js"),{effectiveDecisions:m}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:b}=await import("./replay-policy-6USQBT3E.js"),g=t.retry===!0||t.retryCount!==void 0,E=t.retryCount!==void 0?parseInt(t.retryCount,10):de.maxShrinks,v=t.author===!0;v&&(er(),a.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let F=v?0:ve(h.decisions),x=0,T=null,D=h.decisions.filter(k=>k.kind==="replay").length,H=h.decisions.length-D,q=[];t.push&&q.push("--push"),g&&q.push("--retry"),t.retryCount!==void 0&&q.push(`--retry-count=${t.retryCount}`),v&&q.push("--author");let K={source:r,steps:{total:h.decisions.length,replay:D,author:H},model:w,viewport:{width:N.window_size.width,height:N.window_size.height},chrome:z.cdpEndpoint??z.wsEndpoint??"managed",session:a.sessionName??"ephemeral",variables:{count:Object.keys(U.raw).length,secrets:Object.values(U.raw).filter(k=>k.secret).length,names:Object.keys(U.raw)},flags:q,mode:R.mode??"testing"};for(;;){let k=a.snapshot(),y=Y.snapshot(),ce=m(h.decisions,F,v);if(x>=1){let A=F===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${x}/${E})`:`\u21BB Retry ${x}/${E} \u2014 replay 0..${F-1}, author ${F}..${h.decisions.length-1}
51
51
  reason: replay miss at step ${(T??0)+1}`;process.stderr.write(A+`
52
- `)}let br=x>=1&&F>0&&T!==null?{startIdx:0,endIdx:T,count:T}:void 0;j?.setRunActive(!0);let ge=await Ur({decisions:ce,resolved:i,session:a,accumulator:Y,tuiConfig:N,globalConfig:K,buildStepConfigAt:it,buildReplayConfig:A=>{let G=h.decisions[A];if(G.kind!=="replay")throw new Error("expected replay decision at index "+A);let W=i.steps[A];return We({step:W,decision:G,chrome:z,auth:u,sessionId:a.sessionId,runIndex:a.nextRunIndex(),sessionDir:a.sessionDir,windowSize:{width:N.window_size.width,height:N.window_size.height},forceNavigateUrl:A===0?ne:void 0,sessionContext:a.getContext(),variables:Fr(X.raw,W.config.variables,W.objective)})},onAnyAuthorStep:()=>{$=!0},onCancel:()=>{B=!0},topBannerModel:w,topBannerAuth:`${l.getActiveProfile()??"no profile"}/${p}`,spawnOpts:{environment:p,mode:R.mode??"testing",log:(A,G,W,De)=>a.log(A,G,W,De)},priorAttemptRollup:br,pushStepLevelDelta:(A,G)=>Pe(ie(X.raw,A,G).raw),onSequencerStepEnd:(A,G,W,De)=>{let Rr=Math.round((Date.now()-De)/1e3),yr=A.hadError?A.reason??"runner error":null,Sr=Te(G,W,A.runEnd,A.bifurcationFlows??null,yr,Rr);return a.recordStepRun({testmdStepIndex:i.steps[G].flatIndex,runIndex:W,totalRunDirs:A.runEnd?.total_runs??A.bifurcationFlows?.length??1}),Sr},screenshotDispatcher:le,onReasoning:A=>j?.setStepText(A),onStepComplete:()=>j?.setStepComplete(),onSpawnStart:A=>{he=A}});if(j?.setRunActive(!1),ge.cancelled){J("marker-overlay","user cancelled run"),J("chrome","user cancelled run");break}if(ge.failedAt===null)break;let je=b({failedAt:ge.failedAt,shrinkCount:x,hasRetry:g,maxShrinks:E});if(je.kind==="fail"||!O&&!await lt())break;a.rollback(k),Y.rollback(y),je.kind==="complete-reauthor"?F=0:F=je.newAuthorBoundary,x++,ue=!0,a.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:x,failed_at:T}),F===0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:x}),T=ge.failedAt}}let L=Y.finalize(),te=Math.round((Date.now()-pr)/1e3),hr={session:a,resolvedAuth:u,chromeResult:z,chromeInstance:pe??null,testId:a.testId??null,preparedVariables:U,variableIds:me,globalContext:tt,localContext:rt,tuiConfig:N,env:p,localMode:!!t.local},re=await sr(hr,{performUpload:async()=>{if(!u.basicAuth)return null;let n=ee(p),c=($||t.push===!0)&&!B,d=(O||h.isFirstRun)&&!B&&L.overallStatus==="passed",m=ae&&(O||h.isFirstRun);a.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:ae,shouldUploadPipeline:m,shouldReplaceLocalOutput:c,shouldCommit:d,lockHeld:O,anyAuthorStepRan:$,cancelled:B,overallStatus:L.overallStatus});let b=Dt({session:a,env:p,auth:u,variables:U,variableIds:me,projectId:M,folderId:fe,totalSteps:L.outcomes.length,totalDuration:te,codeExport:Lt({codeExport:t.codeExport,codeLanguage:t.codeLanguage,skipCodeValidation:t.skipCodeValidation},N.code_export),onProgress:()=>{},log:(v,F,x,T)=>a.log(v,F,x,T),shouldUploadArtifacts:m,shouldReplaceLocalOutput:c,shouldCommit:d,isFirstRun:h.isFirstRun,resolvedTest:i,sourcePath:r,stepRunRecords:a.getStepRunRecords(),outcomes:L.outcomes,overallStatus:L.overallStatus,fromCommitId:h.fromCommitId,startedISO:Fe,durationS:te,tmsIds:{testId:h.testId??a.testId??void 0,testcaseId:h.testcaseId??a.testcaseId??void 0,projectId:M??void 0,folderId:fe??void 0,orgId:a.orgId??void 0,sessionName:a.sessionName??Re(r)},tmsBaseUrl:C.tmsBaseUrl,testId:h.testId??void 0,newCommitId:h.newCommitId??void 0,basicAuth:u.basicAuth??void 0,decisions:h.decisions,wantsPush:t.push===!0,retryTriggered:ue,forceAuthor:t.author===!0});h.newCommitId!=null&&(b.skipTmsFinalize=!0);let g=new Rt(b);if(s)return await g.execute();let{renderUploadProgress:E}=await import("./CliUploadProgress-U6QLD76Y.js");return await E(g,v=>{if(v.testcaseId&&v.shareId&&M)return $e(n.testManagerUiUrl,M,v.testcaseId,v.shareId)})},runCleanup:()=>{J("chrome","test.md run complete")},log:(n,c,d,m)=>a.log(n,c,d,m)},{overallStatus:L.overallStatus,outcomes:L.outcomes,sourcePath:r,title:i.rootTitle,rootSteps:i.rootSteps,startedISO:Fe,durationS:te,localMode:!!t.local,skipLocalWrites:!0});await Dr(r,h,a,L.outcomes,L.overallStatus,Fe,te,re.uploadResult,N,t,{resolvedAuth:u,tmsBaseUrl:C.tmsBaseUrl},O);let ct={overallStatus:L.overallStatus,durationS:te,decisions:h.decisions,outcomes:L.outcomes,cancelled:B,retryTriggered:ue,lockHeld:O,anyAuthorStepRan:$,isFirstRun:h.isFirstRun,wantsPush:t.push===!0,uploadResult:re.uploadResult,shouldUploadArtifacts:ae,shouldReplaceLocalOutput:$&&!B,shouldCommit:(O||h.isFirstRun)&&!B&&L.overallStatus==="passed"},{buildSummaryEvent:gr}=await import("./SummaryBox-M4UFKKMD.js");if(s)f(gr(ct));else try{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{AutoExitSummaryBox:d}=await import("./SummaryBox-M4UFKKMD.js"),{waitUntilExit:m}=c(n.createElement(d,{data:ct}),{stdout:process.stderr});await m()}catch(n){a.log("warn","TEST_MD_SUMMARY_RENDER_FAILED","Summary box render failed",{error:String(n)})}if(!s)try{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{LinksBox:d}=await import("./LinksBox-P3VETMP6.js"),m=ee(p),b=re.uploadResult?.testcaseId,g=b&&re.uploadResult?.shareId&&M?$e(m.testManagerUiUrl,M,b,re.uploadResult.shareId):void 0,E=b&&M?yt(m.testManagerUiUrl,M,b):void 0,{waitUntilExit:v}=c(n.createElement(d,{recordedTestPath:r,outputDir:xt(r),shareableLink:g,testCaseLink:E,codeExportDir:re.uploadResult?.codeExportDir}),{stdout:process.stderr});await v()}catch(n){a.log("warn","TEST_MD_LINKS_RENDER_FAILED","LinksBox render failed",{error:String(n)})}return f({type:"test_md_done",overall_status:L.overallStatus,duration_s:te,session_id:a.sessionId}),L.overallStatus==="passed"?0:1}function Pr(e){let t={mode:"mode",maxSteps:"max_steps",timeout:"timeout",globalContext:"global_context",localContext:"local_context",codeExport:"code_export",codeLanguage:"code_language",headless:"headless",cdpEndpoint:"cdp_endpoint",wsEndpoint:"ws_endpoint"},r=new Set(["max_steps","timeout"]),s={};for(let[o,f]of Object.entries(t)){let i=e[o];if(i===void 0||i==="")continue;let R=i;if(r.has(f)&&(R=Number(i),Number.isNaN(R))){let l="--"+o.replace(/[A-Z]/g,S=>"-"+S.toLowerCase());process.stderr.write(`error: ${l} must be a number
53
- `),process.exit(2)}s[f]=R}return s}function Or(e,t){let r={...e,...t},s=Object.keys(r).length>0?be(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:s.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,o])=>o.secret),nonSecretEntries:Object.entries(r).filter(([,o])=>!o.secret)}}function ie(e,t,r){let s={...e,...t??{}};if(Object.keys(s).length===0)return{raw:s,variables:{},objective:r};let o=be(s,r);return{raw:s,variables:_t(o.variables,o.objective),objective:o.objective}}function Fr(e,t,r){let s=ie(e,t,r).variables;return Object.keys(s).length>0?s:void 0}function ir(e,t){let r=new Set(ke),s={...e};for(let[o,f]of Object.entries(t))r.has(o)||o!=="variables"&&f!==void 0&&e[o]===void 0&&(s[o]=f);return s}function Tr(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function jr(e,t,r,s,o){let f=Pt(e),i=Kt(t,Xe(f)?f:null);Wt(t,i);let R=ye(e),l=Xe(R)?JSON.parse(xr(R,"utf8")):null,S=l?.testcase_id,_=l?.test_id,I=l?.commit_id,P=r.push===!0,p=r.retry===!0||r.retryCount!==void 0,C=r.author===!0;P&&!S&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
52
+ `)}let br=x>=1&&F>0&&T!==null?{startIdx:0,endIdx:T,count:T}:void 0;j?.setRunActive(!0);let be=await Ur({decisions:ce,resolved:i,session:a,accumulator:Y,tuiConfig:N,globalConfig:K,buildStepConfigAt:it,buildReplayConfig:A=>{let G=h.decisions[A];if(G.kind!=="replay")throw new Error("expected replay decision at index "+A);let W=i.steps[A];return We({step:W,decision:G,chrome:z,auth:u,sessionId:a.sessionId,runIndex:a.nextRunIndex(),sessionDir:a.sessionDir,windowSize:{width:N.window_size.width,height:N.window_size.height},forceNavigateUrl:A===0?ne:void 0,sessionContext:a.getContext(),variables:Fr(X.raw,W.config.variables,W.objective)})},onAnyAuthorStep:()=>{$=!0},onCancel:()=>{B=!0},topBannerModel:w,topBannerAuth:`${l.getActiveProfile()??"no profile"}/${p}`,spawnOpts:{environment:p,mode:R.mode??"testing",log:(A,G,W,De)=>a.log(A,G,W,De)},priorAttemptRollup:br,pushStepLevelDelta:(A,G)=>Oe(ie(X.raw,A,G).raw),onSequencerStepEnd:(A,G,W,De)=>{let Rr=Math.round((Date.now()-De)/1e3),yr=A.hadError?A.reason??"runner error":null,Sr=Te(G,W,A.runEnd,A.bifurcationFlows??null,yr,Rr);return a.recordStepRun({testmdStepIndex:i.steps[G].flatIndex,runIndex:W,totalRunDirs:A.runEnd?.total_runs??A.bifurcationFlows?.length??1}),Sr},screenshotDispatcher:le,onReasoning:A=>j?.setStepText(A),onStepComplete:()=>j?.setStepComplete(),onSpawnStart:A=>{ge=A}});if(j?.setRunActive(!1),be.cancelled){J("marker-overlay","user cancelled run"),J("chrome","user cancelled run");break}if(be.failedAt===null)break;let je=b({failedAt:be.failedAt,shrinkCount:x,hasRetry:g,maxShrinks:E});if(je.kind==="fail"||!O&&!await lt())break;a.rollback(k),Y.rollback(y),je.kind==="complete-reauthor"?F=0:F=je.newAuthorBoundary,x++,ue=!0,a.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:x,failed_at:T}),F===0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:x}),T=be.failedAt}}let L=Y.finalize(),te=Math.round((Date.now()-pr)/1e3),hr={session:a,resolvedAuth:u,chromeResult:z,chromeInstance:pe??null,testId:a.testId??null,preparedVariables:U,variableIds:me,globalContext:tt,localContext:rt,tuiConfig:N,env:p,localMode:!!t.local},re=await sr(hr,{performUpload:async()=>{if(!u.basicAuth)return null;let n=ee(p),c=($||t.push===!0)&&!B,d=(O||h.isFirstRun)&&!B&&L.overallStatus==="passed",m=ae&&(O||h.isFirstRun);a.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:ae,shouldUploadPipeline:m,shouldReplaceLocalOutput:c,shouldCommit:d,lockHeld:O,anyAuthorStepRan:$,cancelled:B,overallStatus:L.overallStatus});let b=Dt({session:a,env:p,auth:u,variables:U,variableIds:me,projectId:M,folderId:fe,totalSteps:L.outcomes.length,totalDuration:te,screenshotExtMap:he?.getExtMap(),codeExport:Lt({codeExport:t.codeExport,codeLanguage:t.codeLanguage,skipCodeValidation:t.skipCodeValidation},N.code_export),onProgress:()=>{},log:(v,F,x,T)=>a.log(v,F,x,T),shouldUploadArtifacts:m,shouldReplaceLocalOutput:c,shouldCommit:d,isFirstRun:h.isFirstRun,resolvedTest:i,sourcePath:r,stepRunRecords:a.getStepRunRecords(),outcomes:L.outcomes,overallStatus:L.overallStatus,fromCommitId:h.fromCommitId,startedISO:Fe,durationS:te,tmsIds:{testId:h.testId??a.testId??void 0,testcaseId:h.testcaseId??a.testcaseId??void 0,projectId:M??void 0,folderId:fe??void 0,orgId:a.orgId??void 0,sessionName:a.sessionName??ye(r)},tmsBaseUrl:C.tmsBaseUrl,testId:h.testId??void 0,newCommitId:h.newCommitId??void 0,basicAuth:u.basicAuth??void 0,decisions:h.decisions,wantsPush:t.push===!0,retryTriggered:ue,forceAuthor:t.author===!0});h.newCommitId!=null&&(b.skipTmsFinalize=!0);let g=new Rt(b);if(s)return await g.execute();let{renderUploadProgress:E}=await import("./CliUploadProgress-6KB7IKFV.js");return await E(g,v=>{if(v.testcaseId&&v.shareId&&M)return $e(n.testManagerUiUrl,M,v.testcaseId,v.shareId)})},runCleanup:()=>{J("chrome","test.md run complete")},log:(n,c,d,m)=>a.log(n,c,d,m)},{overallStatus:L.overallStatus,outcomes:L.outcomes,sourcePath:r,title:i.rootTitle,rootSteps:i.rootSteps,startedISO:Fe,durationS:te,localMode:!!t.local,skipLocalWrites:!0});await Dr(r,h,a,L.outcomes,L.overallStatus,Fe,te,re.uploadResult,N,t,{resolvedAuth:u,tmsBaseUrl:C.tmsBaseUrl},O);let ct={overallStatus:L.overallStatus,durationS:te,decisions:h.decisions,outcomes:L.outcomes,cancelled:B,retryTriggered:ue,lockHeld:O,anyAuthorStepRan:$,isFirstRun:h.isFirstRun,wantsPush:t.push===!0,uploadResult:re.uploadResult,shouldUploadArtifacts:ae,shouldReplaceLocalOutput:$&&!B,shouldCommit:(O||h.isFirstRun)&&!B&&L.overallStatus==="passed"},{buildSummaryEvent:gr}=await import("./SummaryBox-MB2JQIXZ.js");if(s)f(gr(ct));else try{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{AutoExitSummaryBox:d}=await import("./SummaryBox-MB2JQIXZ.js"),{waitUntilExit:m}=c(n.createElement(d,{data:ct}),{stdout:process.stderr});await m()}catch(n){a.log("warn","TEST_MD_SUMMARY_RENDER_FAILED","Summary box render failed",{error:String(n)})}if(!s)try{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{LinksBox:d}=await import("./LinksBox-Q6L6WY53.js"),m=ee(p),b=re.uploadResult?.testcaseId,g=b&&re.uploadResult?.shareId&&M?$e(m.testManagerUiUrl,M,b,re.uploadResult.shareId):void 0,E=b&&M?yt(m.testManagerUiUrl,M,b):void 0,{waitUntilExit:v}=c(n.createElement(d,{recordedTestPath:r,outputDir:xt(r),shareableLink:g,testCaseLink:E,codeExportDir:re.uploadResult?.codeExportDir}),{stdout:process.stderr});await v()}catch(n){a.log("warn","TEST_MD_LINKS_RENDER_FAILED","LinksBox render failed",{error:String(n)})}return f({type:"test_md_done",overall_status:L.overallStatus,duration_s:te,session_id:a.sessionId}),L.overallStatus==="passed"?0:1}function Pr(e){let t={mode:"mode",maxSteps:"max_steps",timeout:"timeout",globalContext:"global_context",localContext:"local_context",codeExport:"code_export",codeLanguage:"code_language",headless:"headless",cdpEndpoint:"cdp_endpoint",wsEndpoint:"ws_endpoint"},r=new Set(["max_steps","timeout"]),s={};for(let[o,f]of Object.entries(t)){let i=e[o];if(i===void 0||i==="")continue;let R=i;if(r.has(f)&&(R=Number(i),Number.isNaN(R))){let l="--"+o.replace(/[A-Z]/g,S=>"-"+S.toLowerCase());process.stderr.write(`error: ${l} must be a number
53
+ `),process.exit(2)}s[f]=R}return s}function Or(e,t){let r={...e,...t},s=Object.keys(r).length>0?Re(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:s.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,o])=>o.secret),nonSecretEntries:Object.entries(r).filter(([,o])=>!o.secret)}}function ie(e,t,r){let s={...e,...t??{}};if(Object.keys(s).length===0)return{raw:s,variables:{},objective:r};let o=Re(s,r);return{raw:s,variables:_t(o.variables,o.objective),objective:o.objective}}function Fr(e,t,r){let s=ie(e,t,r).variables;return Object.keys(s).length>0?s:void 0}function ir(e,t){let r=new Set(_e),s={...e};for(let[o,f]of Object.entries(t))r.has(o)||o!=="variables"&&f!==void 0&&e[o]===void 0&&(s[o]=f);return s}function Tr(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function jr(e,t,r,s,o){let f=Pt(e),i=Kt(t,Xe(f)?f:null);Wt(t,i);let R=Se(e),l=Xe(R)?JSON.parse(xr(R,"utf8")):null,S=l?.testcase_id,_=l?.test_id,I=l?.commit_id,P=r.push===!0,p=r.retry===!0||r.retryCount!==void 0,C=r.author===!0;P&&!S&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
54
54
  `),C&&(S=void 0,_=void 0,I=void 0);let w=!!s.resolvedAuth.basicAuth,u=!r.local&&w&&_!=null&&I!=null&&S!=null,Q=u&&(Gt(i)||P);if(P&&!u)return process.stderr.write(`error: --push requires basic auth credentials for the lock API. Run 'kane-cli config set-username/set-access-key' or pass --username/--access-key inline.
55
55
  `),{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:null,isFirstRun:!1,hasBasic:w,canLock:u,lockAcquired:!1,abort:{exitCode:2}};if(p&&!u)return process.stderr.write(`error: --retry requires basic auth credentials for the lock API. Run 'kane-cli config set-username/set-access-key' or pass --username/--access-key inline.
56
56
  `),{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:null,isFirstRun:!1,hasBasic:w,canLock:u,lockAcquired:!1,abort:{exitCode:2}};if(C&&!w)return process.stderr.write(`error: --author requires basic auth credentials for the TMS API. Run 'kane-cli config set-username/set-access-key' or pass --username/--access-key inline.
57
- `),{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:null,isFirstRun:!1,hasBasic:w,canLock:u,lockAcquired:!1,abort:{exitCode:2}};let a=null,h=!1;if(Q){a=o;let O=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",$=await ar({tmsBaseUrl:s.tmsBaseUrl,testId:_,fromCommitId:I,newCommitId:a,basicAuth:s.resolvedAuth.basicAuth,onLockConflict:O});if($==="ok")h=!0,Ze({baseUrl:_e(s.tmsBaseUrl),testId:_,auth:Ce(s.resolvedAuth.basicAuth)});else{if($==="abort")return{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:null,isFirstRun:!1,hasBasic:w,canLock:u,lockAcquired:!1,abort:{exitCode:2}};a=null}}return{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:a,isFirstRun:S==null,hasBasic:w,canLock:u,lockAcquired:h}}function _e(e){return`${e}/kane-cli/v1`}function Ce(e){return{username:e.username,accessKey:e.access_key}}async function ar(e){let t=_e(e.tmsBaseUrl),r=Ce(e.basicAuth),s={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},o=await Ke(s);if(o.ok)return"ok";if(!(o.reason==="concurrent"||o.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
57
+ `),{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:null,isFirstRun:!1,hasBasic:w,canLock:u,lockAcquired:!1,abort:{exitCode:2}};let a=null,h=!1;if(Q){a=o;let O=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",$=await ar({tmsBaseUrl:s.tmsBaseUrl,testId:_,fromCommitId:I,newCommitId:a,basicAuth:s.resolvedAuth.basicAuth,onLockConflict:O});if($==="ok")h=!0,Ze({baseUrl:Ce(s.tmsBaseUrl),testId:_,auth:Ee(s.resolvedAuth.basicAuth)});else{if($==="abort")return{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:null,isFirstRun:!1,hasBasic:w,canLock:u,lockAcquired:!1,abort:{exitCode:2}};a=null}}return{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:a,isFirstRun:S==null,hasBasic:w,canLock:u,lockAcquired:h}}function Ce(e){return`${e}/kane-cli/v1`}function Ee(e){return{username:e.username,accessKey:e.access_key}}async function ar(e){let t=Ce(e.tmsBaseUrl),r=Ee(e.basicAuth),s={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},o=await Ke(s);if(o.ok)return"ok";if(!(o.reason==="concurrent"||o.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
58
58
  `),"abort";let i=o.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${i}; aborting (--on-lock-conflict fail)
59
59
  `),"abort";if(e.onLockConflict==="wait"){if(o.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
60
60
  `),"abort";for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
61
61
  `),await new Promise(l=>setTimeout(l,3e4));let R=await Ke(s);if(R.ok)return"ok";if(R.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${R.reason} (HTTP ${R.httpStatus}): ${R.message}; aborting
62
62
  `),"abort"}}return process.stderr.write(`[lock] ${i} \u2014 running in readonly mode (no commit)
63
63
  `),"readonly"}async function Dr(e,t,r,s,o,f,i,R,l,S,_,I){let{decisions:P,testId:p,testcaseId:C,fromCommitId:w,newCommitId:u}=t;if(!(o==="passed")&&I&&p&&w&&u){process.stderr.write(`[lock] run failed (${o}); discarding new commit
64
- `),await Lr(_,p,w,u),Je();return}Je()}async function Lr(e,t,r,s){if(!e.resolvedAuth.basicAuth)return;let o=await jt({baseUrl:_e(e.tmsBaseUrl),testId:t,body:{commitId:s,fromCommitId:r},auth:Ce(e.resolvedAuth.basicAuth)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
65
- `)}async function Ur(e){let{default:t}=await import("./react-QWOAB3TB.js"),{render:r}=await import("./build-JIKYOZUH.js"),{TestMdRunView:s}=await import("./TestMdRunView-PI433EGP.js"),o=null,f=!1,i=0,R=-1,l=-1,S=0,_=async P=>{if(P&&P.status==="failed")return i>0&&e.decisions[i-1].kind==="replay"&&(o=i-1),null;for(;i<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[i]);)i++;if(i>=e.decisions.length)return null;let p=e.decisions[i],C=e.resolved.steps[i],w=i;i++;let u=e.session.nextRunIndex();R=w,l=u,S=Date.now(),e.onSpawnStart?.(u),p.kind==="author"&&e.onAnyAuthorStep(),await e.pushStepLevelDelta(C.config.variables,C.objective);let Q=p.kind==="replay"?e.buildReplayConfig(w):e.buildStepConfigAt(w,u),a=p.kind==="replay"?"md5-match":p.reason,h=C.config??{},O={};for(let[$,B]of Object.entries(h))B!=null&&$!=="variables"&&(O[$]=B);return{config:Q,banner:{stepLabel:`Step ${w+1}/${e.decisions.length}`,objective:Tr(C.objective,100)},mode:p.kind,modeReason:a,perStepOverrides:Object.keys(O).length>0?O:void 0}},{waitUntilExit:I}=r(t.createElement(s,{topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:_,onStepEnd:P=>(P.status==="failed"&&R>=0&&e.decisions[R]?.kind==="replay"&&(o=R),e.onSequencerStepEnd(P,R,l,S)),onAllComplete:()=>{},onCancel:()=>{f=!0,e.onCancel()},spawnOpts:e.spawnOpts,priorAttemptRollup:e.priorAttemptRollup,screenshotDispatcher:e.screenshotDispatcher,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete}),{stdout:process.stderr,exitOnCtrlC:!1});return await I(),{failedAt:o,cancelled:f}}export{ir as applyCliStepConfig,ie as buildStepRunVariables,Or as buildTestLevelVariables,Fr as replayVariablesForStep,oo as runTestMdFile};
64
+ `),await Lr(_,p,w,u),Je();return}Je()}async function Lr(e,t,r,s){if(!e.resolvedAuth.basicAuth)return;let o=await jt({baseUrl:Ce(e.tmsBaseUrl),testId:t,body:{commitId:s,fromCommitId:r},auth:Ee(e.resolvedAuth.basicAuth)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
65
+ `)}async function Ur(e){let{default:t}=await import("./react-QWOAB3TB.js"),{render:r}=await import("./build-JIKYOZUH.js"),{TestMdRunView:s}=await import("./TestMdRunView-UMTYIRAE.js"),o=null,f=!1,i=0,R=-1,l=-1,S=0,_=async P=>{if(P&&P.status==="failed")return i>0&&e.decisions[i-1].kind==="replay"&&(o=i-1),null;for(;i<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[i]);)i++;if(i>=e.decisions.length)return null;let p=e.decisions[i],C=e.resolved.steps[i],w=i;i++;let u=e.session.nextRunIndex();R=w,l=u,S=Date.now(),e.onSpawnStart?.(u),p.kind==="author"&&e.onAnyAuthorStep(),await e.pushStepLevelDelta(C.config.variables,C.objective);let Q=p.kind==="replay"?e.buildReplayConfig(w):e.buildStepConfigAt(w,u),a=p.kind==="replay"?"md5-match":p.reason,h=C.config??{},O={};for(let[$,B]of Object.entries(h))B!=null&&$!=="variables"&&(O[$]=B);return{config:Q,banner:{stepLabel:`Step ${w+1}/${e.decisions.length}`,objective:Tr(C.objective,100)},mode:p.kind,modeReason:a,perStepOverrides:Object.keys(O).length>0?O:void 0}},{waitUntilExit:I}=r(t.createElement(s,{topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:_,onStepEnd:P=>(P.status==="failed"&&R>=0&&e.decisions[R]?.kind==="replay"&&(o=R),e.onSequencerStepEnd(P,R,l,S)),onAllComplete:()=>{},onCancel:()=>{f=!0,e.onCancel()},spawnOpts:e.spawnOpts,priorAttemptRollup:e.priorAttemptRollup,screenshotDispatcher:e.screenshotDispatcher,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete}),{stdout:process.stderr,exitOnCtrlC:!1});return await I(),{failedAt:o,cancelled:f}}export{ir as applyCliStepConfig,ie as buildStepRunVariables,Or as buildTestLevelVariables,Fr as replayVariablesForStep,oo as runTestMdFile};
@@ -1,10 +1,10 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as $}from"./chunk-D4P6GLSX.js";import{b as J,c as U,d as tt}from"./chunk-G5HHHYH7.js";import{a as K,b as Q}from"./chunk-MDBXYXSC.js";import{a as C,b as W,e as S,f as Z}from"./chunk-AH4AXJML.js";import"./chunk-G7VF5SDK.js";import{a as N}from"./chunk-PNQ5YMED.js";import{a as z}from"./chunk-JPEICMHK.js";import{a as B}from"./chunk-IXWVTWOR.js";import{a as G}from"./chunk-HNIH3GSQ.js";import"./chunk-GCAHPH2E.js";import"./chunk-JI7KJKG4.js";import"./chunk-YVLFHMUW.js";import{a as F}from"./chunk-HCBYKLMW.js";import{t as _}from"./chunk-TL4SB7MQ.js";import{a as y,b as g,i as H}from"./chunk-C44QQJR4.js";import{a as A}from"./chunk-6YGTRKDT.js";import"./chunk-KKZRPFWO.js";import{a as O}from"./chunk-V7QXJKX7.js";import{e as T}from"./chunk-UR6MHSHU.js";var P=T(A(),1);import{existsSync as v,readFileSync as Lt,rmSync as lt,unlinkSync as jt}from"fs";import{resolve as Y}from"path";import{promises as et,realpathSync as gt}from"fs";import{homedir as pt}from"os";import{join as V,parse as ht,relative as rt,resolve as nt}from"path";var _t=new Set(["node_modules",".git","dist","build",".next",".venv","venv","target","__pycache__"]),R=class extends Error{constructor(i){super(`refusing to scan '${i}'. Run from your project root, or pass --root <dir>.`);this.cwd=i;this.name="HomeRefusedError"}};function ot(t){try{return gt(nt(t))}catch{return nt(t)}}function xt(t){let r=ot(t),i=ot(pt()),n=ht(r).root;if(process.platform==="win32"){let e=o=>o.toLowerCase();return e(r)===e(i)||e(r)===e(n)}return r===i||r===n}async function I(t){if(xt(t.root))throw new R(t.root);let r=t.maxEntries??5e4,i=t.maxResults??5e3,n=new Set(t.ignore??[]),e=[],o=0,c=0,a=!1,l,s=[t.root];for(;s.length>0&&!a;){let u=s.shift(),w;try{w=await et.readdir(u,{withFileTypes:!0})}catch{continue}c++;for(let h of w){if(o++,o>r){a=!0,l="max_entries";break}let f=h.name,b=V(u,f);if(h.isDirectory()){if(_t.has(f)||f.startsWith(".")||f.startsWith("output-")||n.has(f))continue;s.push(b)}else if(h.isFile()&&f.endsWith("_test.md")&&(e.push({path:b,relPath:rt(t.root,b),source:"cwd"}),e.length>=i)){a=!0,l="max_results";break}}t.onProgress?.(c,e.length)}if(!a){let u=V(t.root,".testmuai","tests");try{let w=await et.readdir(u,{withFileTypes:!0});c++;for(let h of w){if(!h.isFile()||!h.name.endsWith("_test.md"))continue;let f=V(u,h.name);if(e.push({path:f,relPath:rt(t.root,f),source:"tests-dir"}),e.length>=i){a=!0,l="max_results";break}}}catch{}}return{results:e,aborted:a,abortReason:l,dirsScanned:c}}import{mkdirSync as wt,writeFileSync as yt}from"fs";import{join as kt}from"path";function it(t,r){return`Basic ${Buffer.from(`${t}:${r}`).toString("base64")}`}async function bt(t){let r=K({tmsBaseUrl:t.tmsBaseUrl,testcaseId:t.testcaseId,codeExport:{enabled:!0,language:t.language,skipValidation:t.skipValidation}}),i=await O(r.url,{method:"POST",headers:{"content-type":"application/json",authorization:it(t.auth.username,t.auth.access_key)},body:JSON.stringify(r.body)});if(!i.ok)throw new Error(`code-export trigger failed: ${i.status} ${await i.text()}`);t.log("info","CODE_EXPORT_TRIGGERED","Code export triggered",{testcase_id:t.testcaseId})}async function Et(t){let r=Q({tmsBaseUrl:t.tmsBaseUrl,testcaseId:t.testcaseId}),i=t.pollIntervalMs??5e3,n=t.timeoutMs??3e5,e=Date.now()+n;for(;Date.now()<e;){let o=await O(r,{headers:{authorization:it(t.auth.username,t.auth.access_key),accept:"application/json"}});if(!o.ok){await new Promise(s=>setTimeout(s,i));continue}let a=(await o.json()).data?.find(s=>s.code_name==="kane-cli-trigger");if(!a){await new Promise(s=>setTimeout(s,i));continue}let l=(a.status??"").toLowerCase();if(l==="in progress"||l==="in_progress"||l==="pending"){await new Promise(s=>setTimeout(s,i));continue}if(!a.url||a.url.length===0)throw new Error(`code-export status=${a.status} but no files returned`);wt(t.outDir,{recursive:!0});for(let s of a.url){let u=kt(t.outDir,s.file_name),w=await O(s.file_url);if(!w.ok){t.log("warn","CODE_EXPORT_FILE_FAILED","Failed to download file",{file_name:s.file_name,status:w.status});continue}let h=await w.text();yt(u,h,"utf-8")}return t.log("info","CODE_EXPORT_DOWNLOADED","Code export saved",{out_dir:t.outDir,file_count:a.url.length}),t.outDir}throw new Error("code-export polling timed out")}async function st(t){return await bt(t),await Et(t)}var k=T(A(),1);import{existsSync as Tt,readFileSync as Rt}from"fs";var p=T(F(),1);function St(t){$(t);let r=S(t);if(!Tt(r))return null;try{return JSON.parse(Rt(r,"utf8"))}catch{return{}}}function Pt(t){return t===null?"never_run":t.testcase_id?"synced":"local_only"}function vt(t){return t==="synced"?"\u2601":t==="local_only"?"\u25A3":"\u25CB"}function Mt(t){return t==="tests-dir"?"\u2726":" "}function Ct(t,r){return r==="all"?!0:r==="synced"?t.status==="synced":r==="local"?t.status==="local_only":r==="never_run"?t.status==="never_run":r==="cli"?t.source==="tests-dir":r==="hand"?t.source==="cwd":!0}var X=["all","synced","local","never_run","cli","hand"];function Dt(t){let r=X.indexOf(t);return X[(r+1)%X.length]}function at({root:t,currentOrgId:r,onSelect:i,onCancel:n}){let[e,o]=(0,k.useState)([]),[c,a]=(0,k.useState)(null),[l,s]=(0,k.useState)(!0),[u,w]=(0,k.useState)("all");(0,k.useEffect)(()=>{(async()=>{try{let m=await I({root:t}),M=[];for(let E of m.results){let j=St(E.path);j?.org_id!==void 0&&j.org_id!==r||M.push({path:E.path,relPath:E.relPath,name:C(E.path),status:Pt(j),source:E.source})}o(M),s(!1)}catch(m){m instanceof R,a(m.message),s(!1)}})()},[t,r]);let h=(0,k.useMemo)(()=>e.filter(m=>Ct(m,u)).map(m=>({id:m.path,label:`${vt(m.status)} ${Mt(m.source)} ${m.relPath}`})),[e,u]),f=(0,k.useMemo)(()=>Ot(u,e),[u,e]);if(c)return(0,p.jsxs)(y,{flexDirection:"column",borderStyle:"round",borderColor:_.statusFail,paddingX:2,paddingY:1,children:[(0,p.jsx)(g,{color:_.statusFail,bold:!0,children:"testmd"}),(0,p.jsx)(y,{marginTop:1,children:(0,p.jsx)(g,{color:_.statusFail,children:c})})]});let b=u==="all"?"all":Ft(u);return(0,p.jsx)(z,{title:`testmd \xB7 filter: ${b}`,items:h,loading:l,itemNoun:"tests",onSelect:m=>{let M=e.find(E=>E.path===m.id);M&&i(M)},onCancel:n,onTab:()=>w(m=>Dt(m)),extraHint:"cycle filter",footer:f})}function Ft(t){return t==="synced"?"synced (\u2601)":t==="local"?"local (\u25A3)":t==="never_run"?"never run (\u25CB)":t==="cli"?"cli-generated (\u2726)":t==="hand"?"hand-written":"all"}function Ot(t,r){let i={synced:r.filter(e=>e.status==="synced").length,local:r.filter(e=>e.status==="local_only").length,never:r.filter(e=>e.status==="never_run").length,cli:r.filter(e=>e.source==="tests-dir").length,hand:r.filter(e=>e.source==="cwd").length},n=e=>e?_.primary:_.dim;return(0,p.jsxs)(y,{flexDirection:"column",children:[(0,p.jsx)(g,{color:_.dim,children:"legend:"}),(0,p.jsxs)(y,{children:[(0,p.jsx)(g,{color:n(t==="synced"),children:` \u2601 synced (${i.synced}) `}),(0,p.jsx)(g,{color:n(t==="local"),children:`\u25A3 local (${i.local}) `}),(0,p.jsx)(g,{color:n(t==="never_run"),children:`\u25CB never run (${i.never})`})]}),(0,p.jsxs)(y,{children:[(0,p.jsx)(g,{color:n(t==="cli"),children:` \u2726 cli-generated (${i.cli}) `}),(0,p.jsx)(g,{color:n(t==="hand"),children:` hand-written (${i.hand})`})]})]})}var D=T(A(),1);import{existsSync as $t,readFileSync as It}from"fs";var d=T(F(),1);function ct({path:t,relPath:r,onAction:i,onBack:n}){let[e,o]=(0,D.useState)(null),[c,a]=(0,D.useState)(!1);(0,D.useEffect)(()=>{let s=S(t);if($t(s))try{o(JSON.parse(It(s,"utf8")))}catch{o(null)}},[t]),H((s,u)=>{if(u.escape){if(c){a(!1);return}n();return}if(c){s==="y"||s==="Y"?(a(!1),i("delete")):(s==="n"||s==="N")&&a(!1);return}s==="r"&&i("run"),s==="e"&&e?.testcase_id&&i("export"),s==="d"&&a(!0)});let l=({k:s,v:u})=>u?(0,d.jsxs)(g,{children:[(0,d.jsx)(g,{color:_.dim,children:s.padEnd(14)}),u]}):null;return(0,d.jsxs)(y,{flexDirection:"column",borderStyle:"round",borderColor:_.primary,paddingX:2,paddingY:1,children:[(0,d.jsx)(g,{color:_.primary,bold:!0,children:r}),(0,d.jsx)(y,{marginTop:1,flexDirection:"column",children:e?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(l,{k:"test_id",v:e.test_id}),(0,d.jsx)(l,{k:"testcase_id",v:e.testcase_id}),(0,d.jsx)(l,{k:"project_id",v:e.project_id}),(0,d.jsx)(l,{k:"folder_id",v:e.folder_id}),(0,d.jsx)(l,{k:"org_id",v:e.org_id}),(0,d.jsx)(l,{k:"session_name",v:e.session_name}),(0,d.jsx)(l,{k:"commit_id",v:e.commit_id})]}):(0,d.jsx)(g,{color:_.dim,children:"(never run \u2014 no meta.json)"})}),c?(0,d.jsx)(y,{marginTop:1,children:(0,d.jsxs)(g,{color:_.statusFail,bold:!0,children:["Delete ",r," and its output dir? [y/n]"]})}):(0,d.jsx)(y,{marginTop:1,children:(0,d.jsxs)(g,{color:_.dim,children:["[r] run [e] export",e?.testcase_id?"":" (need testcase_id)"," [d] delete [Esc] back"]})})]})}function L(t){$(t);let r=S(t);if(!v(r))return null;try{return JSON.parse(Lt(r,"utf8"))}catch{return null}}function ut(t,r){return!t||t.org_id===void 0?!0:t.org_id===r}function q(t,r){return ut(t,r)?null:(process.stderr.write(`error: this test belongs to org ${t.org_id}; you are logged in as org ${r}.
2
+ import{a as $}from"./chunk-RHLK4XYO.js";import{b as J,c as U,d as tt}from"./chunk-FOMM3MYV.js";import{a as K,b as Q}from"./chunk-MDBXYXSC.js";import{a as C,b as W,e as S,f as Z}from"./chunk-AH4AXJML.js";import"./chunk-G7VF5SDK.js";import{a as N}from"./chunk-YEV3OBEO.js";import{a as z}from"./chunk-EJR3WRTW.js";import{a as B}from"./chunk-PQLKQKQH.js";import{a as G}from"./chunk-CBDUXGVQ.js";import"./chunk-GCAHPH2E.js";import"./chunk-JI7KJKG4.js";import"./chunk-TI5CHPPN.js";import{a as F}from"./chunk-HCBYKLMW.js";import{t as _}from"./chunk-FOT6AMNP.js";import{a as y,b as g,i as H}from"./chunk-C44QQJR4.js";import{a as A}from"./chunk-6YGTRKDT.js";import"./chunk-KKZRPFWO.js";import{a as O}from"./chunk-V7QXJKX7.js";import{e as T}from"./chunk-UR6MHSHU.js";var P=T(A(),1);import{existsSync as v,readFileSync as Lt,rmSync as lt,unlinkSync as jt}from"fs";import{resolve as Y}from"path";import{promises as et,realpathSync as gt}from"fs";import{homedir as pt}from"os";import{join as V,parse as ht,relative as rt,resolve as nt}from"path";var _t=new Set(["node_modules",".git","dist","build",".next",".venv","venv","target","__pycache__"]),R=class extends Error{constructor(i){super(`refusing to scan '${i}'. Run from your project root, or pass --root <dir>.`);this.cwd=i;this.name="HomeRefusedError"}};function ot(t){try{return gt(nt(t))}catch{return nt(t)}}function xt(t){let r=ot(t),i=ot(pt()),n=ht(r).root;if(process.platform==="win32"){let e=o=>o.toLowerCase();return e(r)===e(i)||e(r)===e(n)}return r===i||r===n}async function I(t){if(xt(t.root))throw new R(t.root);let r=t.maxEntries??5e4,i=t.maxResults??5e3,n=new Set(t.ignore??[]),e=[],o=0,c=0,a=!1,l,s=[t.root];for(;s.length>0&&!a;){let u=s.shift(),w;try{w=await et.readdir(u,{withFileTypes:!0})}catch{continue}c++;for(let h of w){if(o++,o>r){a=!0,l="max_entries";break}let f=h.name,b=V(u,f);if(h.isDirectory()){if(_t.has(f)||f.startsWith(".")||f.startsWith("output-")||n.has(f))continue;s.push(b)}else if(h.isFile()&&f.endsWith("_test.md")&&(e.push({path:b,relPath:rt(t.root,b),source:"cwd"}),e.length>=i)){a=!0,l="max_results";break}}t.onProgress?.(c,e.length)}if(!a){let u=V(t.root,".testmuai","tests");try{let w=await et.readdir(u,{withFileTypes:!0});c++;for(let h of w){if(!h.isFile()||!h.name.endsWith("_test.md"))continue;let f=V(u,h.name);if(e.push({path:f,relPath:rt(t.root,f),source:"tests-dir"}),e.length>=i){a=!0,l="max_results";break}}}catch{}}return{results:e,aborted:a,abortReason:l,dirsScanned:c}}import{mkdirSync as wt,writeFileSync as yt}from"fs";import{join as kt}from"path";function it(t,r){return`Basic ${Buffer.from(`${t}:${r}`).toString("base64")}`}async function bt(t){let r=K({tmsBaseUrl:t.tmsBaseUrl,testcaseId:t.testcaseId,codeExport:{enabled:!0,language:t.language,skipValidation:t.skipValidation}}),i=await O(r.url,{method:"POST",headers:{"content-type":"application/json",authorization:it(t.auth.username,t.auth.access_key)},body:JSON.stringify(r.body)});if(!i.ok)throw new Error(`code-export trigger failed: ${i.status} ${await i.text()}`);t.log("info","CODE_EXPORT_TRIGGERED","Code export triggered",{testcase_id:t.testcaseId})}async function Et(t){let r=Q({tmsBaseUrl:t.tmsBaseUrl,testcaseId:t.testcaseId}),i=t.pollIntervalMs??5e3,n=t.timeoutMs??3e5,e=Date.now()+n;for(;Date.now()<e;){let o=await O(r,{headers:{authorization:it(t.auth.username,t.auth.access_key),accept:"application/json"}});if(!o.ok){await new Promise(s=>setTimeout(s,i));continue}let a=(await o.json()).data?.find(s=>s.code_name==="kane-cli-trigger");if(!a){await new Promise(s=>setTimeout(s,i));continue}let l=(a.status??"").toLowerCase();if(l==="in progress"||l==="in_progress"||l==="pending"){await new Promise(s=>setTimeout(s,i));continue}if(!a.url||a.url.length===0)throw new Error(`code-export status=${a.status} but no files returned`);wt(t.outDir,{recursive:!0});for(let s of a.url){let u=kt(t.outDir,s.file_name),w=await O(s.file_url);if(!w.ok){t.log("warn","CODE_EXPORT_FILE_FAILED","Failed to download file",{file_name:s.file_name,status:w.status});continue}let h=await w.text();yt(u,h,"utf-8")}return t.log("info","CODE_EXPORT_DOWNLOADED","Code export saved",{out_dir:t.outDir,file_count:a.url.length}),t.outDir}throw new Error("code-export polling timed out")}async function st(t){return await bt(t),await Et(t)}var k=T(A(),1);import{existsSync as Tt,readFileSync as Rt}from"fs";var p=T(F(),1);function St(t){$(t);let r=S(t);if(!Tt(r))return null;try{return JSON.parse(Rt(r,"utf8"))}catch{return{}}}function Pt(t){return t===null?"never_run":t.testcase_id?"synced":"local_only"}function vt(t){return t==="synced"?"\u2601":t==="local_only"?"\u25A3":"\u25CB"}function Mt(t){return t==="tests-dir"?"\u2726":" "}function Ct(t,r){return r==="all"?!0:r==="synced"?t.status==="synced":r==="local"?t.status==="local_only":r==="never_run"?t.status==="never_run":r==="cli"?t.source==="tests-dir":r==="hand"?t.source==="cwd":!0}var X=["all","synced","local","never_run","cli","hand"];function Dt(t){let r=X.indexOf(t);return X[(r+1)%X.length]}function at({root:t,currentOrgId:r,onSelect:i,onCancel:n}){let[e,o]=(0,k.useState)([]),[c,a]=(0,k.useState)(null),[l,s]=(0,k.useState)(!0),[u,w]=(0,k.useState)("all");(0,k.useEffect)(()=>{(async()=>{try{let m=await I({root:t}),M=[];for(let E of m.results){let j=St(E.path);j?.org_id!==void 0&&j.org_id!==r||M.push({path:E.path,relPath:E.relPath,name:C(E.path),status:Pt(j),source:E.source})}o(M),s(!1)}catch(m){m instanceof R,a(m.message),s(!1)}})()},[t,r]);let h=(0,k.useMemo)(()=>e.filter(m=>Ct(m,u)).map(m=>({id:m.path,label:`${vt(m.status)} ${Mt(m.source)} ${m.relPath}`})),[e,u]),f=(0,k.useMemo)(()=>Ot(u,e),[u,e]);if(c)return(0,p.jsxs)(y,{flexDirection:"column",borderStyle:"round",borderColor:_.statusFail,paddingX:2,paddingY:1,children:[(0,p.jsx)(g,{color:_.statusFail,bold:!0,children:"testmd"}),(0,p.jsx)(y,{marginTop:1,children:(0,p.jsx)(g,{color:_.statusFail,children:c})})]});let b=u==="all"?"all":Ft(u);return(0,p.jsx)(z,{title:`testmd \xB7 filter: ${b}`,items:h,loading:l,itemNoun:"tests",onSelect:m=>{let M=e.find(E=>E.path===m.id);M&&i(M)},onCancel:n,onTab:()=>w(m=>Dt(m)),extraHint:"cycle filter",footer:f})}function Ft(t){return t==="synced"?"synced (\u2601)":t==="local"?"local (\u25A3)":t==="never_run"?"never run (\u25CB)":t==="cli"?"cli-generated (\u2726)":t==="hand"?"hand-written":"all"}function Ot(t,r){let i={synced:r.filter(e=>e.status==="synced").length,local:r.filter(e=>e.status==="local_only").length,never:r.filter(e=>e.status==="never_run").length,cli:r.filter(e=>e.source==="tests-dir").length,hand:r.filter(e=>e.source==="cwd").length},n=e=>e?_.primary:_.dim;return(0,p.jsxs)(y,{flexDirection:"column",children:[(0,p.jsx)(g,{color:_.dim,children:"legend:"}),(0,p.jsxs)(y,{children:[(0,p.jsx)(g,{color:n(t==="synced"),children:` \u2601 synced (${i.synced}) `}),(0,p.jsx)(g,{color:n(t==="local"),children:`\u25A3 local (${i.local}) `}),(0,p.jsx)(g,{color:n(t==="never_run"),children:`\u25CB never run (${i.never})`})]}),(0,p.jsxs)(y,{children:[(0,p.jsx)(g,{color:n(t==="cli"),children:` \u2726 cli-generated (${i.cli}) `}),(0,p.jsx)(g,{color:n(t==="hand"),children:` hand-written (${i.hand})`})]})]})}var D=T(A(),1);import{existsSync as $t,readFileSync as It}from"fs";var d=T(F(),1);function ct({path:t,relPath:r,onAction:i,onBack:n}){let[e,o]=(0,D.useState)(null),[c,a]=(0,D.useState)(!1);(0,D.useEffect)(()=>{let s=S(t);if($t(s))try{o(JSON.parse(It(s,"utf8")))}catch{o(null)}},[t]),H((s,u)=>{if(u.escape){if(c){a(!1);return}n();return}if(c){s==="y"||s==="Y"?(a(!1),i("delete")):(s==="n"||s==="N")&&a(!1);return}s==="r"&&i("run"),s==="e"&&e?.testcase_id&&i("export"),s==="d"&&a(!0)});let l=({k:s,v:u})=>u?(0,d.jsxs)(g,{children:[(0,d.jsx)(g,{color:_.dim,children:s.padEnd(14)}),u]}):null;return(0,d.jsxs)(y,{flexDirection:"column",borderStyle:"round",borderColor:_.primary,paddingX:2,paddingY:1,children:[(0,d.jsx)(g,{color:_.primary,bold:!0,children:r}),(0,d.jsx)(y,{marginTop:1,flexDirection:"column",children:e?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(l,{k:"test_id",v:e.test_id}),(0,d.jsx)(l,{k:"testcase_id",v:e.testcase_id}),(0,d.jsx)(l,{k:"project_id",v:e.project_id}),(0,d.jsx)(l,{k:"folder_id",v:e.folder_id}),(0,d.jsx)(l,{k:"org_id",v:e.org_id}),(0,d.jsx)(l,{k:"session_name",v:e.session_name}),(0,d.jsx)(l,{k:"commit_id",v:e.commit_id})]}):(0,d.jsx)(g,{color:_.dim,children:"(never run \u2014 no meta.json)"})}),c?(0,d.jsx)(y,{marginTop:1,children:(0,d.jsxs)(g,{color:_.statusFail,bold:!0,children:["Delete ",r," and its output dir? [y/n]"]})}):(0,d.jsx)(y,{marginTop:1,children:(0,d.jsxs)(g,{color:_.dim,children:["[r] run [e] export",e?.testcase_id?"":" (need testcase_id)"," [d] delete [Esc] back"]})})]})}function L(t){$(t);let r=S(t);if(!v(r))return null;try{return JSON.parse(Lt(r,"utf8"))}catch{return null}}function ut(t,r){return!t||t.org_id===void 0?!0:t.org_id===r}function q(t,r){return ut(t,r)?null:(process.stderr.write(`error: this test belongs to org ${t.org_id}; you are logged in as org ${r}.
3
3
  Switch profiles with \`kane-cli profiles switch\` to act on it.
4
4
  `),2)}async function Pe(t={}){let r=!!process.stdin.isTTY&&!t.json,i=new B,n=new N;await tt({isInteractive:r,creds:i,config:n});let e=i.getDefaultEnv()??"prod";try{let o=await U({creds:i,env:e,log:()=>{}});return o.resolvedCreds?.org_id===void 0?(process.stderr.write("error: TMS did not return an org_id. Run `kane-cli login` again.\n"),{ok:!1,code:2}):{ok:!0,orgId:String(o.resolvedCreds.org_id)}}catch(o){if(o instanceof J)return process.stderr.write("error: not authenticated. Run `kane-cli login` first.\n"),{ok:!1,code:2};throw o}}async function ve(t,r){if(process.stdin.isTTY&&!t.json)return await Nt(r,t.root);let i=t.root??process.cwd(),n;try{n=await I({root:i,ignore:t.ignore})}catch(e){if(e instanceof R)return process.stderr.write(`error: ${e.message}
5
5
  `),2;throw e}for(let e of n.results){let o=L(e.path);if(!ut(o,r))continue;let c={path:e.relPath.startsWith(".")?e.relPath:`./${e.relPath}`,name:C(e.path),has_meta:o!==null,source:e.source,synced:!!o?.testcase_id};o&&(o.test_id&&(c.test_id=o.test_id),o.testcase_id&&(c.testcase_id=o.testcase_id),o.org_id&&(c.org_id=o.org_id),o.project_id&&(c.project_id=o.project_id),o.folder_id&&(c.folder_id=o.folder_id)),process.stdout.write(JSON.stringify(c)+`
6
6
  `)}return n.aborted&&process.stderr.write(`warn: walk aborted (${n.abortReason}). Pass --root or --ignore to narrow.
7
- `),0}var dt=-1001,ft=-1002,mt=-1003,x={action:null,path:null};function At(t,r){return x.action=t,x.path=r,t==="run"?dt:t==="export"?ft:mt}function Bt({root:t,currentOrgId:r,onComplete:i}){let[n,e]=P.default.useState({kind:"list"});return P.default.useEffect(()=>{n.kind==="exiting"&&i(n.code)},[n,i]),n.kind==="list"?P.default.createElement(at,{root:t,currentOrgId:r,onSelect:o=>e({kind:"inspect",path:o.path,relPath:o.relPath}),onCancel:()=>e({kind:"exiting",code:0})}):n.kind==="inspect"?P.default.createElement(ct,{path:n.path,relPath:n.relPath,onAction:async o=>{e({kind:"exiting",code:At(o,n.path)})},onBack:()=>e({kind:"list"})}):null}async function Nt(t,r){let i=r??process.cwd(),{render:n}=await import("./build-JIKYOZUH.js"),e=await new Promise(o=>{let{unmount:c,waitUntilExit:a}=n(P.default.createElement(Bt,{root:i,currentOrgId:t,onComplete:l=>{c(),o(l)}}),{stdout:process.stderr,exitOnCtrlC:!0});a().then(()=>o(0)).catch(()=>o(0))});if(e===dt&&x.path){let{runTestMdFile:o}=await import("./run-test-md-BQS5SZ7E.js"),c=await o(x.path,{});return x.action=null,x.path=null,c}if(e===ft&&x.path){let o=await Jt(x.path,{},t);return x.action=null,x.path=null,o}if(e===mt&&x.path){let o=await Wt(x.path,!0,t);return x.action=null,x.path=null,o}return e}async function Me(t,r){let i=Y(t);if(!v(i))return process.stderr.write(`error: file not found: ${i}
7
+ `),0}var dt=-1001,ft=-1002,mt=-1003,x={action:null,path:null};function At(t,r){return x.action=t,x.path=r,t==="run"?dt:t==="export"?ft:mt}function Bt({root:t,currentOrgId:r,onComplete:i}){let[n,e]=P.default.useState({kind:"list"});return P.default.useEffect(()=>{n.kind==="exiting"&&i(n.code)},[n,i]),n.kind==="list"?P.default.createElement(at,{root:t,currentOrgId:r,onSelect:o=>e({kind:"inspect",path:o.path,relPath:o.relPath}),onCancel:()=>e({kind:"exiting",code:0})}):n.kind==="inspect"?P.default.createElement(ct,{path:n.path,relPath:n.relPath,onAction:async o=>{e({kind:"exiting",code:At(o,n.path)})},onBack:()=>e({kind:"list"})}):null}async function Nt(t,r){let i=r??process.cwd(),{render:n}=await import("./build-JIKYOZUH.js"),e=await new Promise(o=>{let{unmount:c,waitUntilExit:a}=n(P.default.createElement(Bt,{root:i,currentOrgId:t,onComplete:l=>{c(),o(l)}}),{stdout:process.stderr,exitOnCtrlC:!0});a().then(()=>o(0)).catch(()=>o(0))});if(e===dt&&x.path){let{runTestMdFile:o}=await import("./run-test-md-6ELVP2MT.js"),c=await o(x.path,{});return x.action=null,x.path=null,c}if(e===ft&&x.path){let o=await Jt(x.path,{},t);return x.action=null,x.path=null,o}if(e===mt&&x.path){let o=await Wt(x.path,!0,t);return x.action=null,x.path=null,o}return e}async function Me(t,r){let i=Y(t);if(!v(i))return process.stderr.write(`error: file not found: ${i}
8
8
  `),2;let n=L(i),e=q(n,r);if(e!==null)return e;let o={path:i,name:C(i),has_meta:n!==null};return n&&(n.commit_id&&(o.commit_id=n.commit_id),n.test_id&&(o.test_id=n.test_id),n.testcase_id&&(o.testcase_id=n.testcase_id),n.project_id&&(o.project_id=n.project_id),n.folder_id&&(o.folder_id=n.folder_id),n.org_id&&(o.org_id=n.org_id),n.session_name&&(o.session_name=n.session_name)),process.stdout.write(JSON.stringify(o)+`
9
9
  `),0}async function Wt(t,r,i){let n=Y(t);if(!v(n))return process.stderr.write(`error: file not found: ${n}
10
10
  `),2;let e=L(n),o=q(e,i);if(o!==null)return o;if(!r)return process.stderr.write(`error: refusing to delete without --yes.
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a}from"./chunk-YZTCCQHR.js";import"./chunk-KKZRPFWO.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";export{a as TmsClient};
2
+ import{a}from"./chunk-LIJX5PIV.js";import"./chunk-KKZRPFWO.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";export{a as TmsClient};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as t}from"./chunk-HNIH3GSQ.js";import"./chunk-TL4SB7MQ.js";import"./chunk-UR6MHSHU.js";async function a(n,e,o){let{TmsClient:r}=await import("./tms-client-XOARLBEP.js"),i=new r(t(n).tmsBaseUrl,e,o);for await(let m of i.listProjectsStream({perPage:1,maxPages:1}))return}export{a as validateBasicAuth};
2
+ import{a as t}from"./chunk-CBDUXGVQ.js";import"./chunk-FOT6AMNP.js";import"./chunk-UR6MHSHU.js";async function a(n,e,o){let{TmsClient:r}=await import("./tms-client-T3EAD4Y7.js"),i=new r(t(n).tmsBaseUrl,e,o);for await(let m of i.listProjectsStream({perPage:1,maxPages:1}))return}export{a as validateBasicAuth};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a,b,c,d}from"./chunk-FSIJOBVB.js";import"./chunk-TL4SB7MQ.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";export{d as checkForUpdate,b as compareVersions,c as getSeverity,a as getUpdateCommand};
2
+ import{a,b,c,d}from"./chunk-ZYJ4HQAI.js";import"./chunk-FOT6AMNP.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";export{d as checkForUpdate,b as compareVersions,c as getSeverity,a as getUpdateCommand};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testmuai/kane-cli",
3
- "version": "0.3.3",
3
+ "version": "0.3.4",
4
4
  "description": "KaneAI Terminal UI — browser automation testing agent",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -23,10 +23,10 @@
23
23
  "sharp": "^0.34.5"
24
24
  },
25
25
  "optionalDependencies": {
26
- "@testmuai/kane-cli-darwin-arm64": "0.3.3",
27
- "@testmuai/kane-cli-darwin-x64": "0.3.3",
28
- "@testmuai/kane-cli-linux-x64": "0.3.3",
29
- "@testmuai/kane-cli-win-x64": "0.3.3"
26
+ "@testmuai/kane-cli-darwin-arm64": "0.3.4",
27
+ "@testmuai/kane-cli-darwin-x64": "0.3.4",
28
+ "@testmuai/kane-cli-linux-x64": "0.3.4",
29
+ "@testmuai/kane-cli-win-x64": "0.3.4"
30
30
  },
31
31
  "publishConfig": {
32
32
  "registry": "https://registry.npmjs.org",
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a,b}from"./chunk-YF4OL463.js";import"./chunk-YCCUBQY4.js";import"./chunk-JPEICMHK.js";import"./chunk-HNIH3GSQ.js";import"./chunk-YVLFHMUW.js";import"./chunk-HCBYKLMW.js";import"./chunk-TL4SB7MQ.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-YZTCCQHR.js";import"./chunk-KKZRPFWO.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";export{b as FolderPicker,a as formatFolderLine};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a,b}from"./chunk-53K3BK7I.js";import"./chunk-YCCUBQY4.js";import"./chunk-JPEICMHK.js";import"./chunk-HNIH3GSQ.js";import"./chunk-YVLFHMUW.js";import"./chunk-HCBYKLMW.js";import"./chunk-TL4SB7MQ.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-YZTCCQHR.js";import"./chunk-KKZRPFWO.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";export{b as ProjectPicker,a as formatProjectLine};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{f as a}from"./chunk-FAPS5ACQ.js";import"./chunk-N7YALZKA.js";import"./chunk-G7VF5SDK.js";import"./chunk-L5LI2JF4.js";import"./chunk-PNQ5YMED.js";import"./chunk-53K3BK7I.js";import"./chunk-YF4OL463.js";import"./chunk-YCCUBQY4.js";import"./chunk-JPEICMHK.js";import"./chunk-VE3SUJMA.js";import"./chunk-IXWVTWOR.js";import"./chunk-HNIH3GSQ.js";import"./chunk-GCAHPH2E.js";import"./chunk-JI7KJKG4.js";import"./chunk-YVLFHMUW.js";import"./chunk-HCBYKLMW.js";import"./chunk-TL4SB7MQ.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-YZTCCQHR.js";import"./chunk-KKZRPFWO.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";export{a as SingleShotApp};
@@ -1,13 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as z}from"./chunk-L3MOXBKE.js";import{d as X,g as Y}from"./chunk-X7VI7KK3.js";import{b as Q,e as V,j as F}from"./chunk-AH4AXJML.js";import{b as J,d as W}from"./chunk-G7VF5SDK.js";import{b as $}from"./chunk-VE3SUJMA.js";import{a as E}from"./chunk-HNIH3GSQ.js";import{a as q}from"./chunk-E47GFYXA.js";import{i as N,j as U}from"./chunk-TL4SB7MQ.js";import{a as P}from"./chunk-YZTCCQHR.js";import{a as A,b as G}from"./chunk-KKZRPFWO.js";import{a as g}from"./chunk-V7QXJKX7.js";import{dirname as Ee,join as Re}from"path";function ot(e,r,t){let s=e.total_runs??1,o=e.run_dir,i,n;if(s>1&&o){let a=Ee(o);i=Array.from({length:s},(c,l)=>Re(a,String(r+l))),t&&t.length===s&&(n=t)}return{allRunDirs:i,flowObjectives:n}}function nt(e,r,t,s){return{index:t,objective:r,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}}import{spawn as Ie}from"child_process";async function Z(e,r,t=100){let s=`${e.replace(/\/+$/,"")}/json/version`,o=await g(s);if(!o.ok)throw new Error(`CDP /json/version returned ${o.status}`);let i=await o.json();if(!i.webSocketDebuggerUrl)throw new Error("CDP /json/version missing webSocketDebuggerUrl");let n=new q(i.webSocketDebuggerUrl);await new Promise((C,u)=>{n.once("open",C),n.once("error",u)});let a=1,c=new Map;n.on("message",C=>{let u;try{u=JSON.parse(C.toString())}catch{return}if(u.id==null)return;let y=c.get(u.id);y&&(c.delete(u.id),u.error?y.reject(new Error(u.error.message)):y.resolve(u.result))});function l(C,u){let y=a++;return new Promise((Ce,Se)=>{c.set(y,{resolve:ve=>Ce(ve),reject:Se});let M={id:y,method:C};u&&(M.params=u),n.send(JSON.stringify(M))})}let d=(await l("Target.getTargets")).targetInfos.find(C=>C.type==="page");if(!d)throw n.close(),new Error("CDP: no page target found");let S=(await l("Browser.getWindowForTarget",{targetId:d.targetId})).windowId,b="",h=!1,_=null,R=!1;n.on("close",()=>{R=!0}),n.on("error",()=>{R=!0});async function B(){if(!h){if(R){h=!0;return}try{let u=(await l("Browser.getWindowBounds",{windowId:S})).bounds,y=`${u.left}:${u.top}:${u.width}:${u.height}`;y!==b&&(b=y,r({left:u.left,top:u.top,width:u.width,height:u.height}))}catch{}h||(_=setTimeout(B,t))}}return B(),{stop(){if(!h){h=!0,_&&clearTimeout(_);try{n.close()}catch{}}}}}var ke=new Set(["1","true","yes"]);function ft(e){if(e?.headless)return null;let r=process.env.KANE_CLI_DISABLE_MARKER;if(r!=null&&ke.has(r.toLowerCase()))return null;let t=z();if(!t)return null;let s=[...t.args,"overlay"];e?.text&&s.push(e.text);let o;try{o=Ie(t.cmd,s,{cwd:t.cwd,stdio:["pipe","ignore","ignore"],detached:!1,windowsHide:!0})}catch{return null}function i(c){if(!(!o.stdin||o.stdin.destroyed))try{o.stdin.write(JSON.stringify(c)+`
3
- `)}catch{}}e?.chromePid&&e.chromePid>0&&i({type:"chrome_pid",pid:e.chromePid});let n=null;e?.cdpEndpoint&&Z(e.cdpEndpoint,c=>i({type:"bounds",...c})).then(c=>{n=c.stop}).catch(()=>{});let a=!1;return{setRunActive(c){a||i({type:"run_active",active:c})},setStepText(c){if(a)return;let l=c.trim();l&&i({type:"step_text",text:l})},setStepComplete(){a||i({type:"step_complete"})},kill(){if(!a){a=!0,n?.();try{o.stdin?.end()}catch{}try{o.kill("SIGTERM")}catch{}}}}}import{readFileSync as xe,existsSync as Ae}from"fs";function ht(e){if(!Ae(e))return null;try{return xe(e,"utf-8").trim()||null}catch{return null}}function ee(e,r,t){return`${e}/projects/${r}/test-cases/${t}`}function yt(e,r,t,s){return`${ee(e,r,t)}/dashboard/share/${s}?type=summary&agentView=true&fqdn=summary-page`}function wt(e,r,t){return`${ee(e,r,t)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{readFileSync as te,readdirSync as re,existsSync as v}from"fs";import{join as w}from"path";function vt(e,r,t,s,o,i){try{let n=w(e,"runs",String(r),"run-test");if(!v(n)){o("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:t,reason:"runsDir_not_found",path:n});return}let a=n;if(i){let h=w(n,`child-${i}`);if(!v(h)){o("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:t,child_id:i,reason:"child_dir_not_found",path:h});return}let _=re(h).filter(R=>v(w(h,R,"screenshots")));if(_.length===0){o("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:t,child_id:i,reason:"no_child_screenshots_dir"});return}a=w(h,_[0])}else if(!v(w(n,"screenshots"))){let h=re(n).filter(_=>v(w(n,_,"screenshots")));if(h.length===0){o("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:t,reason:"no_screenshots_dir"});return}a=w(n,h[0])}let c=w(a,"screenshots",`step_${String(t).padStart(3,"0")}.png`);if(!v(c)){o("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:t,child_id:i,reason:"screenshot_not_found",path:c});return}let l=w(n,"actions.ndjson");if(!v(l)){o("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:t,reason:"ndjson_not_found"});return}let f=te(l,"utf-8").trim().split(`
4
- `),d=f[f.length-1];if(!d){o("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:t,reason:"ndjson_empty"});return}let S=JSON.parse(d).action_id;if(!S){o("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:t,reason:"no_action_id"});return}let b=te(c);s.enqueue(S,b),o("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:t,child_id:i,action_id:S,size:b.length})}catch(n){o("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{step_index:t,error:n instanceof Error?n.message:String(n)})}}import Pe from"sharp";var se=class{maxWorkers;maxRetries=2;queue=[];activeCount=0;drainResolvers=[];sas;log;constructor(r,t=3,s){this.sas=r,this.maxWorkers=t,this.log=s}updateSas(r){this.sas=r}enqueue(r,t){this.queue.push({operationId:r,buffer:t}),this.pump()}async drain(r=3e4){if(!(this.queue.length===0&&this.activeCount===0))return new Promise(t=>{this.drainResolvers.push(t),setTimeout(()=>{t()},r)})}pump(){for(;this.activeCount<this.maxWorkers&&this.queue.length>0;){let r=this.queue.shift();this.activeCount++,this.processJob(r).finally(()=>{if(this.activeCount--,this.pump(),this.queue.length===0&&this.activeCount===0){for(let t of this.drainResolvers)t();this.drainResolvers=[]}})}}async processJob(r){let t,s="image/webp";try{let a=await Pe(r.buffer).webp({quality:80}).toBuffer();t=new Uint8Array(a)}catch(a){t=new Uint8Array(r.buffer),s="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:r.operationId,error:a instanceof Error?a.message:String(a)})}let o=s==="image/webp"?"webp":"png",i=`test_screenshots/untagged_screenshot/${r.operationId}.${o}`,n=`${this.sas.base_url}/${this.sas.container}/${i}?${this.sas.sas_token}`;for(let a=0;a<=this.maxRetries;a++)try{let c=await g(n,{method:"PUT",headers:{"Content-Type":s,"x-ms-blob-type":"BlockBlob"},body:t});if(c.ok)return;if(a<this.maxRetries){await this.backoff(a);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed after retries",{operation_id:r.operationId,status:c.status,attempts:this.maxRetries+1})}catch{if(a<this.maxRetries){await this.backoff(a);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed (network error)",{operation_id:r.operationId,error:"network",attempts:this.maxRetries+1})}}backoff(r){let t=r===0?1e3:3e3;return new Promise(s=>setTimeout(s,t))}isNearExpiry(){if(!this.sas.expiry)return!1;let r=new Date(this.sas.expiry).getTime();return Date.now()>r-5*6e4}};function oe(e,r){let t={},s={},o=r;for(let[i,n]of Object.entries(e))if(n.secret){let a=`secrets.user.${i}`;t[a]={value:n.value,secret:!0,syntax:`{{secrets.user.${i}}}`,type:"secret"},s[i]=a,o=o.replaceAll(`{{${i}}}`,`{{secrets.user.${i}}}`)}else{let a=`global.${i}`;t[a]={value:n.value,secret:!1,syntax:`{{global.${i}}}`,type:"global"},s[i]=a,o=o.replaceAll(`{{${i}}}`,`{{global.${i}}}`)}return{variables:t,objective:o,keyMap:s}}var T=class{constructor(r){this.baseUrl=r}async pushSecret(r){let t=A(r.username,r.accessKey),s=await g(`${this.baseUrl}/logistics/v1.0/secrets/create`,{method:"PUT",headers:{Authorization:t,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({secretKey:r.secretKey,secretValue:r.secretValue,orgId:r.orgId,username:r.username,scope:"user",type:"user",accessKey:r.accessKey})});if(!s.ok)throw new Error(`Push secret failed: ${s.status} ${await s.text()}`)}static extractVariableKeys(r){let t=r.matchAll(/\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g),s=new Set;for(let o of t)s.add(o[1]);return[...s]}};var j=class extends G{constructor(r,t,s){super(r,{username:t,accessKey:s})}async upsertVariable(r){let t=r.environmentId??0,s=await g(`${this.baseUrl}/v1/variables`,{method:"POST",headers:this.headers(),body:JSON.stringify({name:r.name,value:String(r.value),type:"variable",value_type:"string",is_persist:r.isPersist??!1,environment_id:t})});if(s.ok)return{id:(await s.json()).id??0};if(s.status!==409&&s.status!==422)return{id:0};if(!(await g(`${this.baseUrl}/v1/variables/name/${encodeURIComponent(r.name)}`,{method:"PUT",headers:this.headers(),body:JSON.stringify({value:String(r.value),value_type:"string",type:"variable",environment_id:t})})).ok)return{id:0};let i=await g(`${this.baseUrl}/v1/variables/${encodeURIComponent(r.name)}?environment_id=${t}`,{method:"GET",headers:this.headers()});return i.ok?{id:(await i.json()).data?.id??0}:{id:0}}};import{readdirSync as Te,readFileSync as ie,existsSync as ae}from"fs";import{join as je}from"path";function ne(e,r){if(!ae(e))return{};let t={},s;try{s=Te(e).filter(o=>o.endsWith(".json")).sort()}catch{return{}}for(let o of s)try{let i=ie(je(e,o),"utf-8"),n=JSON.parse(i);if(n&&typeof n=="object"){for(let[a,c]of Object.entries(n))if(c&&typeof c=="object"&&"value"in c){let l=c;t[a]={value:l.value,secret:l.secret??!1,syntax:l.syntax??`{{${a}}}`}}}}catch{r?r("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:o}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${o}
5
- `)}return t}function ce(e){if(!ae(e))throw new Error(`Variables file not found: ${e}`);let r=ie(e,"utf-8"),t=JSON.parse(r),s={};if(t&&typeof t=="object"){for(let[o,i]of Object.entries(t))if(i&&typeof i=="object"&&"value"in i){let n=i;s[o]={value:n.value,secret:n.secret??!1,syntax:n.syntax??`{{${o}}}`}}}return s}function le(e){let r;try{r=JSON.parse(e)}catch{throw new Error("Invalid --variables JSON")}let t={};if(r&&typeof r=="object"){for(let[s,o]of Object.entries(r))if(o&&typeof o=="object"&&"value"in o){let i=o;t[s]={value:i.value,secret:i.secret??!1,syntax:i.syntax??`{{${s}}}`}}}return t}function de(e,r,t){let s=ne(e,t),o=ne(r,t);return{...s,...o}}function Bt(e,r){if(Object.keys(e).length===0)return{};let t={};for(let[s,o]of Object.entries(e)){let i=o.syntax??`{{${s}}}`;r.includes(i)&&(t[s]=o)}return t}function Mt(e){let r=de(e.globalDir,e.localDir,e.onLoadError),t=e.file?ce(e.file):{},s=e.inline?le(e.inline):{},o={...r,...t,...s},i=Object.keys(o).length>0,{variables:n,objective:a}=i?oe(o,e.objective):{variables:{},objective:e.objective},c=Object.entries(o).filter(([,f])=>f.secret),l=Object.entries(o).filter(([,f])=>!f.secret);return{raw:o,auteur:n,auteurObjective:a,secretEntries:c,nonSecretEntries:l}}async function qt(e){if(e.localMode)return{};let r=E(e.env);if(e.variables.secretEntries.length>0){let s=new T(r.secretsBaseUrl);for(let[o,i]of e.variables.secretEntries)s.pushSecret({secretKey:o,secretValue:i.value,username:e.auth.username,accessKey:e.auth.access_key,orgId:e.orgId}).then(()=>e.log("info","SECRET_PUSH_OK","Secret pushed",{key:o})).catch(n=>e.log("error","SECRET_PUSH_FAILED","Secret push failed",{key:o,error:String(n)}))}let t={};if(e.variables.nonSecretEntries.length>0){let s=new j(r.tmsBaseUrl,e.auth.username,e.auth.access_key);for(let[o,i]of e.variables.nonSecretEntries)try{let n=await s.upsertVariable({name:o,value:i.value});t[o]=n.id,e.log("info","VAR_PUSH_OK","Variable pushed",{name:o,id:n.id})}catch(n){e.log("error","VAR_PUSH_FAILED","Variable push failed",{name:o,error:String(n)})}}return t}function Jt(e){let r={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&&(r.url=e.url),e.chrome.wsEndpoint?r.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(r.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(r.username=e.auth.basicAuth.username,r.access_key=e.auth.basicAuth.access_key):e.auth.token&&(r.auth={type:"bearer",token:e.auth.token}),e.disableAskUser&&(r.disable_ask_user=!0),e.enableTaskSkills&&(r.enable_task_skills=!0),e.variables&&Object.keys(e.variables).length>0&&(r.variables=e.variables),e.globalContext&&(r.global_context=e.globalContext),e.localContext&&(r.local_context=e.localContext),e.sessionContext&&(r.session_context=e.sessionContext),r}var Oe=15e3,K=3,ue=[500,1e3];async function Xt(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 r=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground`,t=await O(r,{from_commit_id:e.fromCommitId,new_commit_id:e.newCommitId},e.auth);return t.ok?{ok:!0,sessionExpiresAt:m(t.body,"session_expires_at")??""}:{ok:!1,...De(t)}}function De(e){let r=m(e.body,"error")??m(e.body,"code")??"",t=m(e.body,"message")??m(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&&r==="PlaygroundBaseCommitMismatch"?s="base_mismatch":e.status===409?s="concurrent":e.status===422?s="disabled":e.status===400&&/no committed/i.test(t)?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:t}}async function Yt(e){let r=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,t=await O(r,void 0,e.auth);return t.ok?{ok:!0,sessionExpiresAt:m(t.body,"session_expires_at")??""}:{ok:!1,expired:t.status===404,httpStatus:t.status,message:m(t.body,"message")??m(t.body,"detail")??t.text??`HTTP ${t.status}`}}async function fe(e){let r=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,t={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&&(t.time_taken=e.body.timeTaken),e.body.objectives!==void 0&&(t.objectives=e.body.objectives);let s=await O(r,t,e.auth);return s.ok?{ok:!0,testId:m(s.body,"test_id")??e.testId,testcaseId:m(s.body,"testcase_id")??"",projectId:m(s.body,"project_id"),isTestCaseDeleted:typeof s.body?.is_test_case_deleted=="boolean"?s.body.is_test_case_deleted:void 0}:{ok:!1,...Le(s)}}function Le(e){let r=m(e.body,"error")??m(e.body,"code")??"",t=m(e.body,"message")??m(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&&r==="PlaygroundBaseCommitMismatch"?s="base_mismatch":e.status===409&&r==="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:t}}async function Zt(e){let r=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,t={discard:!0,commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:"(discarded)",total_steps:1},s=await O(r,t,e.auth);return s.ok?{ok:!0}:{ok:!1,reason:m(s.body,"error")??"other",httpStatus:s.status,message:m(s.body,"message")??m(s.body,"detail")??s.text??`HTTP ${s.status}`}}async function O(e,r,t){let s=null;for(let o=1;o<=K;o++){let i=new AbortController,n=setTimeout(()=>i.abort(),Oe);try{let a=await g(e,{method:"POST",headers:{Authorization:A(t.username,t.accessKey),"Content-Type":"application/json",Accept:"application/json"},...r!==void 0?{body:JSON.stringify(r)}:{},signal:i.signal});clearTimeout(n);let c=await a.text(),l=null;if(c)try{l=JSON.parse(c)}catch{}let f=a.status>=500||a.status===408||a.status===429;if(a.ok||!f)return{ok:a.ok,status:a.status,body:l,text:c};if(o<K){await me(ue[o-1]??1e3);continue}return{ok:!1,status:a.status,body:l,text:c}}catch(a){if(clearTimeout(n),s=a,o<K){await me(ue[o-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:s?.message??"exhausted retries"}}function me(e){return new Promise(r=>setTimeout(r,e))}function m(e,r){if(typeof e!="object"||e===null)return;let t=e[r];return typeof t=="string"?t:void 0}import{readFileSync as pe,writeFileSync as he,existsSync as be}from"fs";function ge(e,r,t){if(t.forceAuthor)return"re-recorded from scratch";if(t.retryTriggered)return"re-recorded after retry";if(r.length>0&&r.every(n=>n.kind==="author"&&n.reason==="no-result-md"))return"initial recording";if(r.length>0&&r.every(n=>n.kind==="replay"))return t.wantsPush?"re-recorded (no source changes)":"no changes";let s=[];for(let n=0;n<r.length;n++){let a=r[n];if(!a||a.kind!=="author"||a.reason==="downstream-of-divergence"||a.reason==="no-result-md")continue;let c=Ne(e,e.steps[n]);switch(a.reason){case"structure-mismatch":s.push(`added/removed: ${c}`);break;case"md5-mismatch":s.push(`modified: ${c}`);break;case"missing-recording":s.push(`re-recorded: ${c}`);break;case"recorded-failed":s.push(`re-authored after failure: ${c}`);break}}if(s.length===0)return"automated commit";let o=s.filter((n,a)=>a===0||s[a-1]!==n),i=o.slice(0,3).join("; ");return o.length>3?`${i}; +${o.length-3} more`:i}function Ne(e,r){if(!r)return"unknown step";let t=r.trace[0]?.stepIndex;if(t==null)return"unknown step";let o=e.rootSteps[t-1]?.heading?.trim()??"";return r.trace.length>1?o?`imported step in "${o}"`:`imported step ${t}`:o||`step ${t}`}function Ue(e){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{Y({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}),F(Q(e.sourcePath));let r=new Set;for(let t of e.resolvedTest.steps)if(t.trace.length>1){let s=X(t.trace);if(r.has(s))continue;r.add(s),be(`${s}.staging`)&&F(s)}}}function $e(e){if(!(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions))return async()=>{let r=ge(e.resolvedTest,e.decisions,{wantsPush:e.wantsPush??!1,retryTriggered:e.retryTriggered??!1,forceAuthor:e.forceAuthor??!1}),t=e.resolvedTest.steps.map(o=>o.objective).filter(o=>typeof o=="string"&&o.length>0).slice(0,50),s=await fe({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:e.testId,body:{commitId:e.newCommitId,fromCommitId:e.fromCommitId,commitMessage:r,totalSteps:e.resolvedTest.steps.length,timeTaken:Math.round(e.durationS??0),objectives:t},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(s.ok&&e.sourcePath){let o=V(e.sourcePath);try{let i=JSON.parse(pe(o,"utf8"));i.commit_id=e.newCommitId,he(o,JSON.stringify(i,null,2)+`
6
- `,"utf8")}catch(i){process.stderr.write(`warn: failed to update meta.json commit_id: ${i.message}
7
- `)}}return s}}function Ve(e){if(!(!e.isFirstRun||!e.sourcePath))return async r=>{if(!e.sourcePath)return;let t=V(e.sourcePath);try{let s=be(t)?JSON.parse(pe(t,"utf8")):{};e.session.sessionId&&(s.commit_id=e.session.sessionId),r&&(s.testcase_id=r),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),he(t,JSON.stringify(s,null,2)+`
8
- `,"utf8")}catch(s){process.stderr.write(`warn: failed to update meta.json after endTest: ${s.message}
9
- `)}}}function dr(e){let r=E(e.env),{session:t,auth:s}=e,o=s.basicAuth?{username:s.basicAuth.username,accessKey:s.basicAuth.access_key}:s.token,i=s.resolvedCreds?.username??s.basicAuth?.username??"",n=s.resolvedCreds?.access_key??s.basicAuth?.access_key??"",a=s.resolvedCreds?.org_id??0,c=s.resolvedCreds?.user_id??0,l=[];for(let b of Object.keys(t.auteurVariables))b.startsWith("secrets.user.")&&l.push({key_name:b.replace("secrets.user.",""),scope:"user"});let d=t.getContext().prior_runs.map(b=>b.status),p=t.auteurVariables,S=Object.keys(p).length>0;return{controllerBaseUrl:r.controllerBaseUrl,tmsBaseUrl:r.tmsBaseUrl,auth:o,authResolver:s.resolver,sessionId:t.sessionId,sessionDir:t.sessionDir,testId:t.testId,commitId:t.sessionId,projectId:e.projectId,folderId:e.folderId,firstObjective:t.firstObjective??"KaneAI Test",firstUrl:t.firstUrl??"",runDirs:t.getRunDirs(),runObjectives:t.getRunObjectives(),runMetadata:t.getRunMetadata(),startedAt:t.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:d,orgId:a,userId:c,tmsUsername:i,tmsAccessKey:n,screenshotBaseUrl:t.screenshotBaseUrl,shareApiBaseUrl:r.shareApiBaseUrl,variables:S?p:void 0,variableIds:e.variableIds,secrets:l,codeExport:e.codeExport,onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:Ue(e),onCommitLock:$e(e),onFinalizeSuccess:Ve(e)}}var ye=["python","javascript"];function Fe(e){if(e!==void 0){if(!ye.includes(e))throw new Error(`--code-language must be one of: ${ye.join(", ")} (got "${e}")`);return e}}function mr(e,r){let t=Fe(e.codeLanguage);return{enabled:e.codeExport??r.enabled,language:t??r.language,skipValidation:e.skipCodeValidation??r.skip_validation}}async function pr(e){try{let t=await new P(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:t}),t}catch(r){return e.log("error","ATM_CREATE_FAILED","Test creation failed",{error:r instanceof Error?r.message:String(r)}),null}}import{mkdtempSync as Xe,rmSync as Ye}from"fs";import{join as Ze}from"path";import{tmpdir as et}from"os";import{spawn as we,spawnSync as Ke}from"child_process";import{existsSync as H}from"fs";import{createConnection as He}from"net";import{homedir as I,platform as x}from"os";import{join as k}from"path";var Be=new Set(["1","true","yes"]),D=class extends Error{constructor(r){super(r),this.name="ChromeNotFoundError"}};function Rr(e){return e instanceof D?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var L={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",k(I(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",k(I(),"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",k(I(),"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",k(I(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",k(I(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe")]};function Me(){if(process.env.KANE_CLI_CHROME_PATH)return process.env.KANE_CLI_CHROME_PATH;let e=x(),r=L[e]??L.linux;for(let t of r)if(H(t))return t;return e==="win32"?"chrome.exe":"google-chrome"}function qe(){if(process.env.KANE_CLI_CHROME_PATH)return H(process.env.KANE_CLI_CHROME_PATH);let e=x();if((L[e]??L.linux).some(o=>H(o)))return!0;let t=e==="win32"?"chrome.exe":"google-chrome",s=e==="win32"?"where":"which";try{return Ke(s,[t],{stdio:"ignore"}).status===0}catch{return!1}}function Ge(){let e=x();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(`
10
- `):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(`
11
- `):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(`
12
- `):["Google Chrome is required.","Install from https://www.google.com/chrome/","(Note: no official Chrome builds for BSD or Alpine/musl Linux.)"].join(`
13
- `)}function Je(e){let r=x(),t=[`--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 r==="linux"&&(t.push("--no-sandbox"),t.push("--disable-dev-shm-usage"),t.push("--password-store=basic")),r==="darwin"&&t.push("--use-mock-keychain"),e.headless&&t.push("--headless=new"),t}function We(e){return new Promise(r=>{let t=He({port:e,host:"127.0.0.1"});t.setTimeout(1e3),t.on("connect",()=>{t.destroy(),r(!0)}),t.on("timeout",()=>{t.destroy(),r(!1)}),t.on("error",()=>{t.destroy(),r(!1)})})}async function ze(){for(let e=N;e<=U;e++)if(!await We(e))return e;throw new Error(`All CDP ports ${N}-${U} are in use. Close other Chrome instances.`)}async function Qe(e,r=15e3){let t=Date.now(),s=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-t<r;){try{if((await g(s)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(o=>setTimeout(o,200))}throw new Error(`Chrome CDP not ready after ${r}ms on port ${e}`)}async function _e(e){let r=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(r!=null&&Be.has(r.toLowerCase()))&&!qe())throw J()?.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 D(Ge());let s=x(),o=await ze(),i=Me(),n=Je({port:o,...e});e.startUrl&&n.push(e.startUrl);let a=we(i,n,{stdio:"ignore",detached:!0,windowsHide:!0});a.unref();let c=await new Promise((l,f)=>{a.on("error",d=>{f(new Error(`Failed to launch Chrome: ${d.message}. Is Chrome installed at ${i}?`))}),a.on("close",d=>{d!==null&&d!==0&&f(new Error(`Chrome exited during startup with code ${d}`))}),Qe(o).then(l,f)});return{process:a,port:o,cdpEndpoint:c,kill(){try{if(a.pid)if(s==="win32")we("taskkill",["/pid",String(a.pid),"/T","/F"],{stdio:"ignore"});else try{process.kill(-a.pid,"SIGKILL")}catch{a.kill("SIGKILL")}else a.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 o=await g(`${e.cdpEndpoint}/json/version`);if(!o.ok)throw new Error(`CDP endpoint not reachable: ${e.cdpEndpoint} (${o.status})`);return{cdpEndpoint:e.cdpEndpoint,instance:null,tempDir:null}}let r,t=null;if(e.config.chrome_profile_path)r=e.config.chrome_profile_path.replace("~",process.env.HOME??"~");else{t=Xe(Ze(et(),"kane-clean-")),r=t;let o=t;W("tempDir",()=>{try{Ye(o,{recursive:!0,force:!0})}catch{}})}let s=await _e({userDataDir:r,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:t}}var tt="KaneAI Generated",rt="Untitled";async function $r(e){let r=e.config.load(),t=new P(E(e.env).tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key),s=e.projectName??tt,o=e.folderName??rt,i=r.project_id??null,n=r.project_name??null;if(!i){let d=(await t.listProjects()).find(p=>p.name===s);if(d)i=d.project_id,n=d.name,e.log("info","ENSURE_PROJECT_FOUND","Found default project",{project_id:i,name:n});else{let p=await t.createProject(s);i=p.id,n=p.name,e.log("info","ENSURE_PROJECT_CREATED","Created default project",{project_id:i,name:n})}$(e.creds,e.config,e.profile,e.env,{projectId:i,projectName:n})}let a=r.folder_id??null,c=r.folder_name??null,l=!r.project_id;if(!a||l){let d=(await t.listFolders(i)).find(p=>p.name===o);if(d)a=d.id,c=d.name,e.log("info","ENSURE_FOLDER_FOUND","Found default folder",{folder_id:a,name:c});else{let p=await t.createFolder(i,o);a=p.id,c=p.name,e.log("info","ENSURE_FOLDER_CREATED","Created default folder",{folder_id:a,name:c})}$(e.creds,e.config,e.profile,e.env,{folderId:a,folderName:c})}return{projectId:i,projectName:n??s,folderId:a,folderName:c??o}}export{ot as a,nt as b,D as c,Rr as d,_e as e,ft as f,ht as g,yt as h,wt as i,vt as j,se as k,oe as l,T as m,j as n,Bt as o,Mt as p,qt as q,Jt as r,Xt as s,Yt as t,Zt as u,dr as v,mr as w,pr as x,Or as y,$r as z};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as I}from"./chunk-YCCUBQY4.js";import{a as A}from"./chunk-JPEICMHK.js";import{a as L}from"./chunk-HNIH3GSQ.js";import{a as R}from"./chunk-YVLFHMUW.js";import{a as v}from"./chunk-HCBYKLMW.js";import{t as s}from"./chunk-TL4SB7MQ.js";import{a as u,b as i}from"./chunk-C44QQJR4.js";import{a as J}from"./chunk-6YGTRKDT.js";import{a as T}from"./chunk-YZTCCQHR.js";import{e as N}from"./chunk-UR6MHSHU.js";var t=N(J(),1);var e=N(v(),1);function X(n,y,c){return{id:n,label:`${y} (${n})`,isActive:n===c}}function Z({resolver:n,currentProjectId:y,env:c,onSelect:x,onCancel:w}){let[F,M]=(0,t.useState)([]),[_,l]=(0,t.useState)(!0),[$,m]=(0,t.useState)(!1),[O,P]=(0,t.useState)(null),[g,d]=(0,t.useState)("list"),[S,k]=(0,t.useState)(""),[C,p]=(0,t.useState)(null),h=(0,t.useRef)(!1);(0,t.useEffect)(()=>{if(!n){P("Login first to browse projects"),l(!1);return}let o=new AbortController;return l(!0),m(!0),(async()=>{try{let r=n.cached??await n.resolve();if(!r){P("Login first to browse projects"),l(!1),m(!1);return}let a=L(c),E=new T(a.tmsBaseUrl,r.username,r.access_key),j=!0,b=0;for await(let f of E.listProjectsStream({signal:o.signal})){if(j&&(l(!1),j=!1),f.totalLoaded===0&&f.done&&b===0){h.current=!0,d("naming"),m(!1);return}f.projects.length>0&&(M(H=>[...H,...f.projects.map(B=>X(B.project_id,B.name,y))]),b+=f.projects.length),f.done&&m(!1)}j&&(l(!1),m(!1))}catch(r){if(r?.name==="AbortError")return;P(r instanceof Error?r.message:String(r)),l(!1),m(!1)}})(),()=>o.abort()},[n,y,c]);let U=(0,t.useCallback)(o=>{let r=o.trim();if(!r){p("Name cannot be empty");return}p(null),d("creating"),(async()=>{try{if(!n)throw new Error("Not authenticated");let a=n.cached??await n.resolve();if(!a)throw new Error("Not authenticated");let E=L(c),b=await new T(E.tmsBaseUrl,a.username,a.access_key).createProject(r);x(b.id,b.name)}catch(a){p(a instanceof Error?a.message:String(a)),d("naming")}})()},[n,c,x]),D=(0,t.useCallback)(()=>{k(""),p(null),h.current?w():d("list")},[w]);return g==="naming"||g==="creating"?(0,e.jsxs)(u,{flexDirection:"column",borderStyle:"round",borderColor:s.primary,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:s.primary,bold:!0,children:"Create new project"}),h.current&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(i,{color:s.dim,children:"No projects yet \u2014 let's create one."})}),(0,e.jsxs)(u,{marginTop:1,children:[(0,e.jsx)(i,{color:s.dim,children:"Name: "}),g==="naming"?(0,e.jsx)(I,{value:S,onChange:o=>{k(o),C&&p(null)},onSubmit:U,onCancel:D}):(0,e.jsx)(i,{children:S})]}),C&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(i,{color:s.red,children:C})}),g==="creating"&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(i,{color:s.dim,children:"Creating..."})}),g==="naming"&&(0,e.jsx)(R,{bindings:[{keys:"\u21B5",label:"create"}],escBackLabel:h.current?"cancel":"back"})]}):(0,e.jsx)(A,{title:"Projects",items:F,loading:_,loadingMore:$,preserveSelectionById:!0,error:O,itemNoun:"projects",onTab:()=>{h.current=!1,d("naming")},extraHint:"tab to create new",onSelect:o=>{let r=o.label.replace(` (${o.id})`,"");x(o.id,r)},onCancel:w})}export{X as a,Z as b};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as R}from"./chunk-YVLFHMUW.js";import{a as X}from"./chunk-HCBYKLMW.js";import{t as n}from"./chunk-TL4SB7MQ.js";import{a as c,b as r,i as N}from"./chunk-C44QQJR4.js";import{a as G}from"./chunk-6YGTRKDT.js";import{e as M}from"./chunk-UR6MHSHU.js";var b=M(G(),1);var e=M(X(),1),d=5;function K(i,I){if(!I)return i;let a=I.toLowerCase();return i.filter(v=>v.label.toLowerCase().includes(a))}function Q(i){let{title:I,items:a,loading:v=!1,loadingText:Y,error:h=null,itemNoun:B="items",onSelect:H,onCancel:D,defaultActiveId:y,onTab:L,extraHint:E}=i,[x,s]=(0,b.useState)(0),[p,f]=(0,b.useState)(0),[u,w]=(0,b.useState)(""),[A,S]=(0,b.useState)(null);(0,b.useEffect)(()=>{if(a.length===0)return;if(i.preserveSelectionById&&A!==null){let t=a.findIndex(o=>o.id===A);if(t>=0){f(Math.floor(t/d)),s(t%d);return}}let l=y?a.findIndex(t=>t.id===y):a.findIndex(t=>t.isActive);l>=0?(f(Math.floor(l/d)),s(l%d),i.preserveSelectionById&&S(a[l].id)):i.preserveSelectionById&&(f(0),s(0),S(a[0]?.id??null))},[a,y,i.preserveSelectionById,A]);let g=K(a,u),C=p*d,F=Math.min(C+d,g.length),P=Math.ceil(g.length/d),O=F-C,T=g.slice(C,F);return N((l,t)=>{if(h){t.escape&&D();return}if(t.escape){u?(w(""),s(0),f(0)):D();return}if(t.tab&&L){L();return}if(t.upArrow){if(x>0){let o=x-1;s(o),i.preserveSelectionById&&S(T[o]?.id??null)}else if(p>0){let o=p-1,m=d-1;f(o),s(m),i.preserveSelectionById&&S(g[o*d+m]?.id??null)}return}if(t.downArrow){if(x<O-1){let o=x+1;s(o),i.preserveSelectionById&&S(T[o]?.id??null)}else if(p<P-1){let o=p+1,m=0;f(o),s(m),i.preserveSelectionById&&S(g[o*d+m]?.id??null)}return}if(t.return&&T[x]){H(T[x]);return}if(t.backspace||t.delete){w(o=>o.slice(0,-1)),s(0),f(0);return}l&&!t.ctrl&&!t.meta&&(w(o=>o+l),s(0),f(0))},{isActive:!v}),v?(0,e.jsxs)(c,{flexDirection:"column",borderStyle:"round",borderColor:n.primary,paddingX:2,paddingY:1,children:[(0,e.jsx)(r,{color:n.primary,bold:!0,children:I}),(0,e.jsx)(c,{marginTop:1,children:(0,e.jsx)(r,{color:n.secondary,children:Y??`Loading ${B}\u2026`})})]}):h?(0,e.jsxs)(c,{flexDirection:"column",borderStyle:"round",borderColor:n.statusFail,paddingX:2,paddingY:1,children:[(0,e.jsx)(r,{color:n.statusFail,bold:!0,children:I}),(0,e.jsx)(c,{marginTop:1,children:(0,e.jsx)(r,{color:n.statusFail,children:h})}),(0,e.jsx)(R,{bindings:[]})]}):(0,e.jsxs)(c,{flexDirection:"column",borderStyle:"round",borderColor:n.primary,paddingX:2,paddingY:1,children:[(0,e.jsxs)(c,{children:[(0,e.jsx)(r,{color:n.primary,bold:!0,children:I}),(0,e.jsxs)(r,{color:n.dim,children:[" (",g.length,u?`/${a.length}`:""," ",B,i.loadingMore?" \xB7 loading more":"",")"]})]}),(0,e.jsxs)(c,{marginTop:1,children:[(0,e.jsx)(r,{color:n.secondary,children:u?"filter: ":""}),u?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(r,{children:u}),(0,e.jsx)(r,{inverse:!0,children:" "})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)(r,{color:n.dim,children:["Search ",B,"\u2026"]}),(0,e.jsx)(r,{inverse:!0,children:" "})]})]}),(0,e.jsx)(c,{flexDirection:"column",marginTop:1,children:g.length===0?(0,e.jsxs)(r,{color:n.dim,children:["No ",B,' match "',u,'"']}):T.map((l,t)=>{let o=t===x,m=o?"\u276F ":" ",$=l.isActive?n.statusPass:o?n.primary:void 0;return(0,e.jsxs)(r,{color:$,children:[m,l.label,l.isActive?" \u25CF selected":""]},l.id)})}),P>1&&(0,e.jsx)(c,{marginTop:1,children:(0,e.jsxs)(r,{color:n.dim,children:["Page ",p+1,"/",P]})}),i.footer&&(0,e.jsx)(c,{marginTop:1,flexDirection:"column",children:i.footer}),(0,e.jsx)(R,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"type",label:"to search"},{keys:"\u21B5",label:"select"},...L&&E?[{keys:"tab",label:E}]:[]],escBackLabel:u?"clear":"back to chat"})]})}export{Q as a};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as u}from"./chunk-KKZRPFWO.js";import{a as n}from"./chunk-V7QXJKX7.js";var h=class extends u{constructor(e,t,s){super(e,{username:t,accessKey:s})}async listProjects(e){let t=[],s=!1;for await(let r of this.listProjectsStream({log:e})){if(e&&!s&&r.projects.length>0){let o=r.projects[0];e("info","PROJECT_SAMPLE","Project list sample",{project_id:o.project_id,name:o.name}),s=!0}t.push(...r.projects)}return t}async*listProjectsStream(e){let t=e?.perPage??200,s=e?.maxPages??100,r=e?.signal,o=e?.log,i=0;for(let a=1;a<=s;a++){if(r?.aborted)return;let c=`${this.baseUrl}/v1/projects?page=${a}&per_page=${t}&sort=created_at`,m=AbortSignal.timeout(15e3),b=r?AbortSignal.any([r,m]):m,d;try{d=await n(c,{method:"GET",headers:this.headers(),signal:b})}catch(l){if(r?.aborted)return;if(a===1)throw l;o?.("warn","PROJECTS_STREAM_PARTIAL","stream stopped mid-page",{page:a,total_loaded:i,error:l instanceof Error?l.message:String(l)}),yield{page:a,projects:[],totalLoaded:i,done:!0};return}if(!d.ok){if(a===1)throw new Error(`listProjects ${d.status}: ${await d.text()}`);o?.("warn","PROJECTS_STREAM_PARTIAL","stream stopped on non-OK response",{page:a,status:d.status,total_loaded:i}),yield{page:a,projects:[],totalLoaded:i,done:!0};return}let g=(await d.json()).data??[];i+=g.length;let p=g.length<t;if(yield{page:a,projects:g,totalLoaded:i,done:p},p)return}o?.("warn","PROJECTS_STREAM_MAXPAGES","max pages reached",{max_pages:s,total_loaded:i}),yield{page:s,projects:[],totalLoaded:i,done:!0}}async getDefaultFolder(e){let t=await n(`${this.baseUrl}/v1/projects/${e}/folder/default`,{method:"GET",headers:this.headers()});if(!t.ok)throw new Error(`Get default folder failed: ${t.status} ${await t.text()}`);return(await t.json()).id}async listFolders(e){let t=await n(`${this.baseUrl}/v1/folder/entity/${e}`,{method:"GET",headers:this.headers()});if(!t.ok)throw new Error(`List folders failed: ${t.status} ${await t.text()}`);return(await t.json()).data??[]}async createProject(e){let t=await n(`${this.baseUrl}/v1/projects`,{method:"POST",headers:{...this.headers(),"Content-Type":"application/json"},body:JSON.stringify({name:e,description:"",tags:[],source:"KTM"})});if(!t.ok)throw new Error(`Create project failed: ${t.status} ${await t.text()}`);return{id:(await t.json()).id,name:e}}async createFolder(e,t){let s=await n(`${this.baseUrl}/v1/folder`,{method:"POST",headers:{...this.headers(),"Content-Type":"application/json"},body:JSON.stringify({folders:[{name:t,description:"",entity_id:e,entity_type:"project"}]})});if(!s.ok)throw new Error(`Create folder failed: ${s.status} ${await s.text()}`);return{id:(await s.json()).id,name:t}}async createAtmTest(e,t){let s=t?`Bearer ${t}`:this.authHeader,r=await n(`${this.baseUrl}/kane-cli/v1/test`,{method:"POST",headers:{Authorization:s,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(e)});if(!r.ok)throw new Error(`Create ATM test failed: ${r.status} ${await r.text()}`);let o=await r.json();if(!o.test_id)throw new Error("Create ATM test returned no test_id");return o.test_id}async endTest(e,t,s){let r=s?`Bearer ${s}`:this.authHeader,o=new URLSearchParams({commit_id:t.commit_id,time_taken:String(t.time_taken),steps_count:String(t.steps_count),commit_message:t.commit_message}),i={};t.objectives&&t.objectives.length>0&&(i.objectives=t.objectives);let a=await n(`${this.baseUrl}/kane-cli/v1/test/${e}?${o.toString()}`,{method:"DELETE",headers:{Authorization:r,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(i)});if(!a.ok)throw new Error(`End test failed: ${a.status} ${await a.text()}`);let c=await a.json();return{testcase_id:c.data?.testcase_id??"",test_id:c.data?.test_id??e,project_id:c.data?.project_id??""}}async submitFeedback(e,t){let s=t?`Bearer ${t}`:this.authHeader,r={instruction_id:e.instruction_id,test_id:e.test_id,feedback_type:e.feedback_type,mode:e.mode??"human"};e.details&&(r.details=e.details);let o=await n(`${this.baseUrl}/atm/v1/generative-feedback`,{method:"POST",headers:{Authorization:s,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(r)});if(!o.ok)throw new Error(`Submit feedback failed: ${o.status} ${await o.text()}`);return await o.json()}};export{h as a};