@testmuai/kane-cli 0.3.5 → 0.3.7

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 (55) hide show
  1. package/dist/{ChromeProfilePicker-PWCOETN2.js → ChromeProfilePicker-CBF6SP67.js} +1 -1
  2. package/dist/{CliFeedbackPrompt-2JOU3UTZ.js → CliFeedbackPrompt-P2FJBV3S.js} +1 -1
  3. package/dist/{CliUploadProgress-EWQKUP74.js → CliUploadProgress-B4CVWX62.js} +1 -1
  4. package/dist/{ConfigView-FFJW43N4.js → ConfigView-PCX3TZNC.js} +1 -1
  5. package/dist/FolderPicker-UTY6XQHP.js +2 -0
  6. package/dist/{HelpView-MXW6PGOP.js → HelpView-CDK7II5Q.js} +1 -1
  7. package/dist/{InfoBox-ZZ2TGFEJ.js → InfoBox-SYT7CVM4.js} +1 -1
  8. package/dist/{LinksBox-PGDOE3OB.js → LinksBox-R3VLKMYS.js} +1 -1
  9. package/dist/{ProfilesView-ZVDOESOW.js → ProfilesView-XKUXSFMQ.js} +1 -1
  10. package/dist/{ProjectPicker-2LMGEOK6.js → ProjectPicker-TWTR6SWR.js} +1 -1
  11. package/dist/{SaveSessionPrompt-UK7FCGBC.js → SaveSessionPrompt-WAVXAYCK.js} +1 -1
  12. package/dist/SingleShotApp-JH6A65TZ.js +2 -0
  13. package/dist/{SummaryBox-5Y5FYFC7.js → SummaryBox-FDNFQYSC.js} +1 -1
  14. package/dist/{TestMdRunView-YKEM6CUM.js → TestMdRunView-E4UDWIGT.js} +1 -1
  15. package/dist/{WhoamiView-CAX7W64M.js → WhoamiView-YG6SSQTV.js} +1 -1
  16. package/dist/{changelog-FSOH4L6K.js → changelog-M5VP33UN.js} +1 -1
  17. package/dist/{chunk-6NM5ZRG6.js → chunk-2SXNPFGD.js} +1 -1
  18. package/dist/{chunk-XR7EOTSN.js → chunk-5XTLIGWL.js} +1 -1
  19. package/dist/{chunk-YZBUZYJK.js → chunk-74MJWDIW.js} +1 -1
  20. package/dist/{chunk-NQHLMFWC.js → chunk-BDC7IOXP.js} +1 -1
  21. package/dist/{chunk-GLXO4WSE.js → chunk-EIZXV3UH.js} +1 -1
  22. package/dist/{chunk-5T6JVIN2.js → chunk-HROFBRMS.js} +1 -1
  23. package/dist/{chunk-RSRXL3HE.js → chunk-JHNEE2MB.js} +1 -1
  24. package/dist/{chunk-4MW543EE.js → chunk-KMTNMUVS.js} +1 -1
  25. package/dist/{chunk-OEYN4LRD.js → chunk-KX7K3Y7R.js} +1 -1
  26. package/dist/{chunk-YCJ6JUDU.js → chunk-L256AYYL.js} +1 -1
  27. package/dist/{chunk-JSOBQIZW.js → chunk-LYSEA5FB.js} +1 -1
  28. package/dist/{chunk-NNJVV4QO.js → chunk-MJQ2EHSC.js} +1 -1
  29. package/dist/{chunk-ATB32X4H.js → chunk-PJMTAAZ7.js} +1 -1
  30. package/dist/{chunk-HGIGF7SF.js → chunk-PQGNWC33.js} +1 -1
  31. package/dist/{chunk-FHZXMPSR.js → chunk-PYU2JPAY.js} +1 -1
  32. package/dist/{chunk-XOSYGSRB.js → chunk-QCNKJUPT.js} +1 -1
  33. package/dist/{chunk-NMCYRB5A.js → chunk-QKM3RHSQ.js} +1 -1
  34. package/dist/{chunk-4ITKSPTN.js → chunk-R7JZMKC7.js} +2 -2
  35. package/dist/{chunk-OWTKDTKK.js → chunk-TP6KYKPD.js} +1 -1
  36. package/dist/{chunk-2BJVZ75R.js → chunk-U4XV5KUD.js} +1 -1
  37. package/dist/{chunk-OP5NDZ64.js → chunk-VS5FTXRZ.js} +1 -1
  38. package/dist/{chunk-MBZOXXA4.js → chunk-VUIXILBR.js} +11 -11
  39. package/dist/{chunk-KLRD7F46.js → chunk-WZCGEQ6M.js} +1 -1
  40. package/dist/{chunk-LJCHLJEV.js → chunk-X5CCG35O.js} +1 -1
  41. package/dist/{chunk-OLHVJQTO.js → chunk-YX3YFXT5.js} +1 -1
  42. package/dist/{chunk-VYHMUBWM.js → chunk-ZAUHYR76.js} +1 -1
  43. package/dist/{chunk-WKKV77JW.js → chunk-ZY4BZQHD.js} +1 -1
  44. package/dist/index.js +7 -7
  45. package/dist/{login-flow-C22P3I5G.js → login-flow-3YFO62HA.js} +1 -1
  46. package/dist/{persist-recorded-session-6X37MMUB.js → persist-recorded-session-LVQLORT4.js} +1 -1
  47. package/dist/{pipeline-A6ZHMRPH.js → pipeline-L3VM7QEX.js} +1 -1
  48. package/dist/{recording-banner-ZQW7RTTP.js → recording-banner-Q66Y2UIC.js} +1 -1
  49. package/dist/{run-test-md-3WLYVWFB.js → run-test-md-5TNUTTEA.js} +5 -5
  50. package/dist/{testmd-actions-5JCGAZLL.js → testmd-actions-O4NTH2OR.js} +2 -2
  51. package/dist/{validate-basic-Q5IZSBIG.js → validate-basic-JJOEAFLT.js} +1 -1
  52. package/dist/{version-check-VVNXNEGO.js → version-check-WWOS4OEZ.js} +1 -1
  53. package/package.json +5 -5
  54. package/dist/FolderPicker-BE3KYGZX.js +0 -2
  55. package/dist/SingleShotApp-QA4SYSCP.js +0 -2
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as qt}from"./chunk-JSOBQIZW.js";import{a as Nt}from"./chunk-OQZG3V6B.js";import{a as de,b as zt}from"./chunk-C5UNZ6ZY.js";import{A as Bt,a as ft,b as mt,f as bt,g as Me,h as $e,i as yt,j as St,k as vt,m as Re,n as It,o as kt,p as _t,q as Ct,r as At,s as Et,t as Ke,u as Tt,v as jt,w as Dt,x as Lt,y as Ut,z as $t}from"./chunk-OP5NDZ64.js";import{b as Ge,c as Mt,d as Vt}from"./chunk-6NM5ZRG6.js";import{c as wt}from"./chunk-S3DAAAE5.js";import{a as Ft,b as Be,c as qe,d as ze,e as He}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 pt}from"./chunk-NQHLMFWC.js";import"./chunk-L5LI2JF4.js";import{a as ht}from"./chunk-4MW543EE.js";import{b as Ne}from"./chunk-YZBUZYJK.js";import{a as gt,c as Ue,d as Q,e as J}from"./chunk-G7VF5SDK.js";import"./chunk-VE3SUJMA.js";import{a as ut}from"./chunk-OEYN4LRD.js";import{a as ne}from"./chunk-RSRXL3HE.js";import"./chunk-BPF7TDRU.js";import{a as Rt}from"./chunk-MBZOXXA4.js";import"./chunk-MDBXYXSC.js";import"./chunk-WAOCHXJ5.js";import"./chunk-E47GFYXA.js";import{c as Le,h as re}from"./chunk-XR7EOTSN.js";import"./chunk-7CLUJYMW.js";import"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-UR6MHSHU.js";import{resolve as Ar,join as ke,basename as Er}from"path";import{existsSync as Xe,readFileSync as xr}from"fs";import{existsSync as Ye}from"fs";import{join as we,basename as Ht}from"path";function Kt(e,t){if(!t||!Ye(t))return e.steps.map(()=>({kind:"author",reason:"no-result-md"}));let r=qe(t),o=[],s=new Set,d=new Map;function i(a){let S=ze(a),_=we(S,"Result.md");if(d.has(_))return d.get(_);let I=Ye(_)?qe(_):null;return d.set(_,I),I}function R(a){for(let S=1;S<a.trace.length;S++){let I=a.trace[S-1].file===e.rootPath?r:i(a.trace.slice(0,S));if(!I)return{kind:"author",reason:"no-result-md"};let F=a.trace[S-1].stepIndex,f=I.steps[F-1];if(!f)return{kind:"author",reason:"no-result-md"};if(f.kind!=="import")return{kind:"author",reason:"structure-mismatch"};let C=Ht(f.importPath),w=Ht(a.trace[S].file);if(C!==w)return{kind:"author",reason:"structure-mismatch"};if(f.status!=="passed")return{kind:"author",reason:"recorded-failed"}}return null}for(let a of e.steps){let S=a.trace[a.trace.length-1].file,_=a.trace[a.trace.length-1].stepIndex,I=s.has(S);for(let w=0;w<a.trace.length-1&&!I;w++)s.has(a.trace[w].file)&&(I=!0);if(I){o.push({kind:"author",reason:"downstream-of-divergence"});continue}let F=R(a);if(F){o.push(F);for(let w=0;w<a.trace.length;w++)s.add(a.trace[w].file);continue}let f=S===e.rootPath?r:i(a.trace),C=wr(a,f,_);if(o.push(C),C.kind==="author"){s.add(S);for(let w=0;w<a.trace.length-1;w++)s.add(a.trace[w].file)}}return o}function wr(e,t,r){if(!t)return{kind:"author",reason:"no-result-md"};let o=t.steps[r-1];if(!o)return{kind:"author",reason:"no-result-md"};if(o.kind!=="objective")return{kind:"author",reason:"structure-mismatch"};if(o.status!=="passed")return{kind:"author",reason:"recorded-failed"};let s=Ft(e);if(s!==o.md5)return{kind:"author",reason:"md5-mismatch"};let d=e.trace.length===1?Ot(e.trace[0].file,r,s.slice(0,8)):we(ze(e.trace),".internal","steps",`${r}-${s.slice(0,8)}`),i=we(d,"flows","0","actions.ndjson");return Ye(i)?{kind:"replay",recordingDir:d}:{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 o=e.steps[r],s=t[r],d=" ".repeat(o.trace.length-1),i=`step ${o.flatIndex}`;s.kind==="replay"?process.stderr.write(`[replay-trace] ${d}${i}: REPLAY (would skip; v1 always authors)
2
+ import{a as qt}from"./chunk-LYSEA5FB.js";import{a as Nt}from"./chunk-OQZG3V6B.js";import{a as de,b as zt}from"./chunk-C5UNZ6ZY.js";import{A as Bt,a as ft,b as mt,f as bt,g as Me,h as $e,i as yt,j as St,k as vt,m as Re,n as It,o as kt,p as _t,q as Ct,r as At,s as Et,t as Ke,u as Tt,v as jt,w as Dt,x as Lt,y as Ut,z as $t}from"./chunk-VS5FTXRZ.js";import{b as Ge,c as Mt,d as Vt}from"./chunk-2SXNPFGD.js";import{c as wt}from"./chunk-S3DAAAE5.js";import{a as Ft,b as Be,c as qe,d as ze,e as He}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 pt}from"./chunk-BDC7IOXP.js";import"./chunk-L5LI2JF4.js";import{a as ht}from"./chunk-KMTNMUVS.js";import{b as Ne}from"./chunk-74MJWDIW.js";import{a as gt,c as Ue,d as Q,e as J}from"./chunk-G7VF5SDK.js";import"./chunk-VE3SUJMA.js";import{a as ut}from"./chunk-KX7K3Y7R.js";import{a as ne}from"./chunk-JHNEE2MB.js";import"./chunk-BPF7TDRU.js";import{a as Rt}from"./chunk-VUIXILBR.js";import"./chunk-MDBXYXSC.js";import"./chunk-WAOCHXJ5.js";import"./chunk-E47GFYXA.js";import{c as Le,h as re}from"./chunk-5XTLIGWL.js";import"./chunk-7CLUJYMW.js";import"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-UR6MHSHU.js";import{resolve as Ar,join as ke,basename as Er}from"path";import{existsSync as Xe,readFileSync as xr}from"fs";import{existsSync as Ye}from"fs";import{join as we,basename as Ht}from"path";function Kt(e,t){if(!t||!Ye(t))return e.steps.map(()=>({kind:"author",reason:"no-result-md"}));let r=qe(t),o=[],s=new Set,d=new Map;function i(a){let S=ze(a),_=we(S,"Result.md");if(d.has(_))return d.get(_);let I=Ye(_)?qe(_):null;return d.set(_,I),I}function R(a){for(let S=1;S<a.trace.length;S++){let I=a.trace[S-1].file===e.rootPath?r:i(a.trace.slice(0,S));if(!I)return{kind:"author",reason:"no-result-md"};let F=a.trace[S-1].stepIndex,f=I.steps[F-1];if(!f)return{kind:"author",reason:"no-result-md"};if(f.kind!=="import")return{kind:"author",reason:"structure-mismatch"};let C=Ht(f.importPath),w=Ht(a.trace[S].file);if(C!==w)return{kind:"author",reason:"structure-mismatch"};if(f.status!=="passed")return{kind:"author",reason:"recorded-failed"}}return null}for(let a of e.steps){let S=a.trace[a.trace.length-1].file,_=a.trace[a.trace.length-1].stepIndex,I=s.has(S);for(let w=0;w<a.trace.length-1&&!I;w++)s.has(a.trace[w].file)&&(I=!0);if(I){o.push({kind:"author",reason:"downstream-of-divergence"});continue}let F=R(a);if(F){o.push(F);for(let w=0;w<a.trace.length;w++)s.add(a.trace[w].file);continue}let f=S===e.rootPath?r:i(a.trace),C=wr(a,f,_);if(o.push(C),C.kind==="author"){s.add(S);for(let w=0;w<a.trace.length-1;w++)s.add(a.trace[w].file)}}return o}function wr(e,t,r){if(!t)return{kind:"author",reason:"no-result-md"};let o=t.steps[r-1];if(!o)return{kind:"author",reason:"no-result-md"};if(o.kind!=="objective")return{kind:"author",reason:"structure-mismatch"};if(o.status!=="passed")return{kind:"author",reason:"recorded-failed"};let s=Ft(e);if(s!==o.md5)return{kind:"author",reason:"md5-mismatch"};let d=e.trace.length===1?Ot(e.trace[0].file,r,s.slice(0,8)):we(ze(e.trace),".internal","steps",`${r}-${s.slice(0,8)}`),i=we(d,"flows","0","actions.ndjson");return Ye(i)?{kind:"replay",recordingDir:d}:{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 o=e.steps[r],s=t[r],d=" ".repeat(o.trace.length-1),i=`step ${o.flatIndex}`;s.kind==="replay"?process.stderr.write(`[replay-trace] ${d}${i}: REPLAY (would skip; v1 always authors)
3
3
  `):process.stderr.write(`[replay-trace] ${d}${i}: AUTHOR (${s.reason})
4
4
  `)}}function se(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function Zt(e,t){let r=e===0?"(none)":`0..${e-1}`,o=e>=t?"(none)":`${e}..${t-1}`;se(`[replay-trace] phase: replay ${r}, author ${o}
5
5
  `)}function Qt(e,t){se(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
@@ -30,7 +30,7 @@ import{a as qt}from"./chunk-JSOBQIZW.js";import{a as Nt}from"./chunk-OQZG3V6B.js
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 U=String(p.resolvedCreds?.org_id??"");if(!U)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-5JCGAZLL.js"),u=c(n(r),U);if(u!==null)return u}let l=new pt,g=await jr(r,i,t,{resolvedAuth:p,tmsBaseUrl:C.tmsBaseUrl},l.sessionId);if(g.abort)return g.abort.exitCode;let x=g.lockAcquired,B=!1,P=!1,ue=!1;x&&d({type:"test_md_lock_state",phase:"acquired",scope:"preemptive"}),l.start({model:w,environment:f,profile:I}),l.setRecordingEnabled(!1);let pe=0,et=p.basicAuth?{username:p.basicAuth.username,accessKey:p.basicAuth.access_key}:p.token??null,fe=null;if(et!==null){let n=await vt({env:f,tmsCreds:p.resolvedCreds??null,resolver:p.resolver,auth:et,getToken:async()=>p.token??null,session:l,log:(c,u,m,h)=>l.log(c,u,m,h),skipScreenshotQueue:!!t.local||!p.basicAuth});fe=n.screenshotQueue,n.remoteLogger&&(Q("remote-logger",()=>n.remoteLogger.shutdownSync()),gt(n.remoteLogger))}if(t.name){try{wt(t.name)}catch(n){return process.stderr.write(`error: ${n.message}
33
+ `),2}let U=String(p.resolvedCreds?.org_id??"");if(!U)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-O4NTH2OR.js"),u=c(n(r),U);if(u!==null)return u}let l=new pt,g=await jr(r,i,t,{resolvedAuth:p,tmsBaseUrl:C.tmsBaseUrl},l.sessionId);if(g.abort)return g.abort.exitCode;let x=g.lockAcquired,B=!1,P=!1,ue=!1;x&&d({type:"test_md_lock_state",phase:"acquired",scope:"preemptive"}),l.start({model:w,environment:f,profile:I}),l.setRecordingEnabled(!1);let pe=0,et=p.basicAuth?{username:p.basicAuth.username,accessKey:p.basicAuth.access_key}:p.token??null,fe=null;if(et!==null){let n=await vt({env:f,tmsCreds:p.resolvedCreds??null,resolver:p.resolver,auth:et,getToken:async()=>p.token??null,session:l,log:(c,u,m,h)=>l.log(c,u,m,h),skipScreenshotQueue:!!t.local||!p.basicAuth});fe=n.screenshotQueue,n.remoteLogger&&(Q("remote-logger",()=>n.remoteLogger.shutdownSync()),gt(n.remoteLogger))}if(t.name){try{wt(t.name)}catch(n){return process.stderr.write(`error: ${n.message}
34
34
  `),2}l.setSessionName(t.name)}let Ee={};for(let[n,c]of Object.entries(i.rootGlobal))_e.includes(n)||(Ee[n]=c);for(let[n,c]of Object.entries(R))_e.includes(n)||c!==void 0&&(Ee[n]=c);let q={...i.chrome};for(let n of _e){let c=R[n];c!==void 0&&(q[n]=c)}let lr={...Ee,...q};l.setResolvedGlobal(lr);let K;try{K=await $t({config:{chrome_profile_path:q.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:re,headless:q.headless??!1,wsEndpoint:q.ws_endpoint,cdpEndpoint:q.cdp_endpoint})}catch(n){return process.stderr.write(`error: Chrome launch failed: ${n.message}
35
35
  `),await l.finish("complete"),2}let me=K.instance;me&&Q("chrome",()=>{try{me.kill()}catch{}});let D=null,tt=K.cdpEndpoint??q.cdp_endpoint;if(tt&&!q.ws_endpoint&&!q.headless)try{D=bt({headless:q.headless??!1,cdpEndpoint:tt,chromePid:me?.process.pid}),D&&Q("marker-overlay",()=>D.kill())}catch(n){l.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(n)})}p.resolvedCreds?.org_id!==void 0&&l.setOrgId(String(p.resolvedCreds.org_id));let X=Ct({objective:"",globalDir:ke(Le,"variables"),localDir:ke(process.cwd(),".testmuai","variables"),file:t.variablesFile,inline:t.variables}),cr=i.rootGlobal.variables??{},M=Or(X.raw,cr);l.setAuteurVariables(M.auteur);let rt=Me(ke(Le,"global-memory.md"))??void 0,nt=Me(ke(process.cwd(),".testmuai","context.md"))??void 0,st=a.getActiveProfile()??"default",ot=a.getDefaultEnv(),{rehydrateIfStale:dr}=await import("./profile-sync-DTTRRIVP.js");dr(a,S,st,ot);let $=S.load(),V=$.project_id??null,he=$.folder_id??null;if(!t.local&&!V&&p.basicAuth)try{let n=await Bt({creds:a,config:S,profile:st,env:ot,tmsCreds:p.basicAuth,log:(c,u,m,h)=>l.log(c,u,m,h)});V=n.projectId,he=n.folderId,$=S.load(),process.stderr.write(`info: using project '${n.projectName}' / folder '${n.folderName}' (auto-configured)
36
36
  `)}catch(n){process.stderr.write(`warn: could not auto-configure project/folder: ${n.message}
@@ -46,9 +46,9 @@ import{a as qt}from"./chunk-JSOBQIZW.js";import{a as Nt}from"./chunk-OQZG3V6B.js
46
46
  `),y.type==="step_event"&&y.event==="reasoning"?D?.setStepText(y.detail):y.type==="step_end"&&(y.status==="passed"&&D?.setStepComplete(),le&&le(y.index,0,y.child_id)),y.type==="run_end"){j=y;break}if(y.type==="error"){L=y.message??"runner error";break}}try{k.cancel()}catch{}if(!j&&!L){let{code:y}=await k.exited;y!==0&&(L=`runner exited with code ${y}`)}}finally{D?.setRunActive(!1),J("runner","Replay step complete")}}catch(k){L=k.message}if(s)return{failedAt:c,cancelled:!0};let H=Math.round((Date.now()-O)/1e3),z=Te(c,h,j,null,L,H);l.recordStepRun({testmdStepIndex:i.steps[c].flatIndex,runIndex:h,totalRunDirs:1});let G=!!L||j?.status==="failed";if(Qt(c,G?"failed":"ok"),G||!z)return{failedAt:c,cancelled:!1}}return{failedAt:null,cancelled:!1}}let ct=async()=>{if(x)return!0;let n=p.basicAuth;if(!n){let h=await p.resolver.resolve(!0);h?.username&&h?.access_key&&(n={username:h.username,access_key:h.access_key},p.basicAuth=n)}if(!g.testId||!g.fromCommitId||!n)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
47
47
  `),!1;let c=l.sessionId,u=t.onLockConflict??i.rootGlobal.on_lock_conflict??"readonly",m=await ar({tmsBaseUrl:C.tmsBaseUrl,testId:g.testId,fromCommitId:g.fromCommitId,newCommitId:c,basicAuth:n,onLockConflict:u});return m==="ok"?(x=!0,g.newCommitId=c,l.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:g.testId}),o&&d({type:"test_md_lock_state",phase:"acquired",scope:"mid_run"}),Ze({baseUrl:Ce(C.tmsBaseUrl),testId:g.testId,auth:Ae(n)}),!0):(l.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:m}),o&&d({type:"test_md_lock_state",phase:"conflict",scope:"mid_run",reason:m}),process.stderr.write(`error: mid-run lock acquisition failed (${m})
48
48
  `),!1)};if(o){let{authorBoundary:n,cancelledInPhase:c,shrinkCount:u}=await rr({decisions:g.decisions,hasRetry:t.retry===!0||t.retryCount!==void 0,maxShrinks:t.retryCount!==void 0?parseInt(t.retryCount,10):de.maxShrinks,runReplayPhase:mr,session:l,accumulator:W,acquireLockIfNeeded:ct});if(ue=u>0,u>0&&(l.log("info","RETRY_TRIGGERED","Retry loop triggered",{shrink_count:u,final_author_boundary:n}),d({type:"test_md_retry_attempt",shrink_count:u,final_author_boundary:n,complete_reauthor:n===0})),n===0&&u>0&&l.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:u}),!c&&n>=0)for(let m=n;m<i.steps.length;m++){let h=i.steps[m];if(!W.shouldRunFlatStep(h))continue;lt(m),B=!0;let b=l.nextRunIndex();pe=b,await Oe(ie(X.raw,h.config.variables,h.objective).raw);let A=at(m,b),v=Date.now(),T=null,O=null,j=null,L=!1,H=0;try{let k=Ne(A,{environment:f});Q("runner",()=>{Ue()&&(s=!0);try{k.cancel()}catch{}}),D?.setRunActive(!0);try{for await(let y of k.events){if(process.stdout.write(JSON.stringify(y)+`
49
- `),y.type==="bifurcation"){let ce=y.count??y.flows?.length??0;(y.is_single_flow??ce<=1)||(j=y.flows??null,L=!0,H=0)}else if(y.type==="run_start"&&L)H++;else if(y.type==="step_event"&&y.event==="reasoning")D?.setStepText(y.detail);else if(y.type==="step_end"&&(y.status==="passed"&&D?.setStepComplete(),le)){let ce=L?Math.max(0,H-1):0;le(y.index,ce,y.child_id)}if(y.type==="run_end"){T=y;break}if(y.type==="error"){O=y.message??"runner error";break}}try{k.cancel()}catch{}}finally{D?.setRunActive(!1),J("runner","Step complete")}}catch(k){O=k.message}let z=Math.round((Date.now()-v)/1e3),G=Te(m,b,T,j,O,z);if(l.recordStepRun({testmdStepIndex:i.steps[m].flatIndex,runIndex:b,totalRunDirs:T?.total_runs??1}),!G||s)break}}else{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{TestMdRunView:u}=await import("./TestMdRunView-YKEM6CUM.js"),{effectiveDecisions:m}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:h}=await import("./replay-policy-6USQBT3E.js"),b=t.retry===!0||t.retryCount!==void 0,A=t.retryCount!==void 0?parseInt(t.retryCount,10):de.maxShrinks,v=t.author===!0;v&&(er(),l.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let T=v?0:ve(g.decisions),O=0,j=null,L=g.decisions.filter(k=>k.kind==="replay").length,H=g.decisions.length-L,z=[];t.push&&z.push("--push"),b&&z.push("--retry"),t.retryCount!==void 0&&z.push(`--retry-count=${t.retryCount}`),v&&z.push("--author");let G={source:r,steps:{total:g.decisions.length,replay:L,author:H},model:w,viewport:{width:$.window_size.width,height:$.window_size.height},chrome:K.cdpEndpoint??K.wsEndpoint??"managed",session:l.sessionName??"ephemeral",variables:{count:Object.keys(M.raw).length,secrets:Object.values(M.raw).filter(k=>k.secret).length,names:Object.keys(M.raw)},flags:z,mode:R.mode??"testing"};for(;;){let k=l.snapshot(),y=W.snapshot(),ce=m(g.decisions,T,v);if(O>=1){let E=T===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${O}/${A})`:`\u21BB Retry ${O}/${A} \u2014 replay 0..${T-1}, author ${T}..${g.decisions.length-1}
49
+ `),y.type==="bifurcation"){let ce=y.count??y.flows?.length??0;(y.is_single_flow??ce<=1)||(j=y.flows??null,L=!0,H=0)}else if(y.type==="run_start"&&L)H++;else if(y.type==="step_event"&&y.event==="reasoning")D?.setStepText(y.detail);else if(y.type==="step_end"&&(y.status==="passed"&&D?.setStepComplete(),le)){let ce=L?Math.max(0,H-1):0;le(y.index,ce,y.child_id)}if(y.type==="run_end"){T=y;break}if(y.type==="error"){O=y.message??"runner error";break}}try{k.cancel()}catch{}}finally{D?.setRunActive(!1),J("runner","Step complete")}}catch(k){O=k.message}let z=Math.round((Date.now()-v)/1e3),G=Te(m,b,T,j,O,z);if(l.recordStepRun({testmdStepIndex:i.steps[m].flatIndex,runIndex:b,totalRunDirs:T?.total_runs??1}),!G||s)break}}else{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{TestMdRunView:u}=await import("./TestMdRunView-E4UDWIGT.js"),{effectiveDecisions:m}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:h}=await import("./replay-policy-6USQBT3E.js"),b=t.retry===!0||t.retryCount!==void 0,A=t.retryCount!==void 0?parseInt(t.retryCount,10):de.maxShrinks,v=t.author===!0;v&&(er(),l.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let T=v?0:ve(g.decisions),O=0,j=null,L=g.decisions.filter(k=>k.kind==="replay").length,H=g.decisions.length-L,z=[];t.push&&z.push("--push"),b&&z.push("--retry"),t.retryCount!==void 0&&z.push(`--retry-count=${t.retryCount}`),v&&z.push("--author");let G={source:r,steps:{total:g.decisions.length,replay:L,author:H},model:w,viewport:{width:$.window_size.width,height:$.window_size.height},chrome:K.cdpEndpoint??K.wsEndpoint??"managed",session:l.sessionName??"ephemeral",variables:{count:Object.keys(M.raw).length,secrets:Object.values(M.raw).filter(k=>k.secret).length,names:Object.keys(M.raw)},flags:z,mode:R.mode??"testing"};for(;;){let k=l.snapshot(),y=W.snapshot(),ce=m(g.decisions,T,v);if(O>=1){let E=T===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${O}/${A})`:`\u21BB Retry ${O}/${A} \u2014 replay 0..${T-1}, author ${T}..${g.decisions.length-1}
50
50
  reason: replay miss at step ${(j??0)+1}`;process.stderr.write(E+`
51
- `)}let br=O>=1&&T>0&&j!==null?{startIdx:0,endIdx:j,count:j}:void 0;D?.setRunActive(!0);let be=await Ur({decisions:ce,resolved:i,session:l,accumulator:W,tuiConfig:$,globalConfig:G,buildStepConfigAt:at,buildReplayConfig:E=>{let Y=g.decisions[E];if(Y.kind!=="replay")throw new Error("expected replay decision at index "+E);let Z=i.steps[E];return We({step:Z,decision:Y,chrome:K,auth:p,sessionId:l.sessionId,runIndex:l.nextRunIndex(),sessionDir:l.sessionDir,windowSize:{width:$.window_size.width,height:$.window_size.height},forceNavigateUrl:E===0?re:void 0,sessionContext:l.getContext(),variables:Fr(X.raw,Z.config.variables,Z.objective)})},onAnyAuthorStep:()=>{B=!0},onCancel:()=>{P=!0},topBannerModel:w,topBannerAuth:`${a.getActiveProfile()??"no profile"}/${f}`,spawnOpts:{environment:f,mode:R.mode??"testing",log:(E,Y,Z,De)=>l.log(E,Y,Z,De)},priorAttemptRollup:br,pushStepLevelDelta:(E,Y)=>Oe(ie(X.raw,E,Y).raw),onSequencerStepEnd:(E,Y,Z,De)=>{let Rr=Math.round((Date.now()-De)/1e3),yr=E.hadError?E.reason??"runner error":null,Sr=Te(Y,Z,E.runEnd,E.bifurcationFlows??null,yr,Rr);return l.recordStepRun({testmdStepIndex:i.steps[Y].flatIndex,runIndex:Z,totalRunDirs:E.runEnd?.total_runs??E.bifurcationFlows?.length??1}),Sr},screenshotDispatcher:le,onReasoning:E=>D?.setStepText(E),onStepComplete:()=>D?.setStepComplete(),onSpawnStart:E=>{pe=E}});if(D?.setRunActive(!1),be.cancelled){J("marker-overlay","user cancelled run"),J("chrome","user cancelled run");break}if(be.failedAt===null)break;let je=h({failedAt:be.failedAt,shrinkCount:O,hasRetry:b,maxShrinks:A});if(je.kind==="fail"||!x&&!await ct())break;l.rollback(k),W.rollback(y),je.kind==="complete-reauthor"?T=0:T=je.newAuthorBoundary,O++,ue=!0,l.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:O,failed_at:j}),T===0&&l.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:O}),j=be.failedAt}}let N=W.finalize(),ee=Math.round((Date.now()-pr)/1e3),hr={session:l,resolvedAuth:p,chromeResult:K,chromeInstance:me??null,testId:l.testId??null,preparedVariables:M,variableIds:ge,globalContext:rt,localContext:nt,tuiConfig:$,env:f,localMode:!!t.local},te=await or(hr,{performUpload:async()=>{if(!p.basicAuth)return null;let n=ne(f),c=(B||t.push===!0)&&!P,u=(x||g.isFirstRun)&&!P&&N.overallStatus==="passed",m=ae&&(x||g.isFirstRun);l.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:ae,shouldUploadPipeline:m,shouldReplaceLocalOutput:c,shouldCommit:u,lockHeld:x,anyAuthorStepRan:B,cancelled:P,overallStatus:N.overallStatus});let h=Dt({session:l,env:f,auth:p,variables:M,variableIds:ge,projectId:V,folderId:he,totalSteps:N.outcomes.length,totalDuration:ee,screenshotExtMap:fe?.getExtMap(),codeExport:Lt({codeExport:t.codeExport,codeLanguage:t.codeLanguage,skipCodeValidation:t.skipCodeValidation},$.code_export),onProgress:()=>{},log:(v,T,O,j)=>l.log(v,T,O,j),shouldUploadArtifacts:m,shouldReplaceLocalOutput:c,shouldCommit:u,isFirstRun:g.isFirstRun,resolvedTest:i,sourcePath:r,stepRunRecords:l.getStepRunRecords(),outcomes:N.outcomes,overallStatus:N.overallStatus,fromCommitId:g.fromCommitId,startedISO:Fe,durationS:ee,tmsIds:{testId:g.testId??l.testId??void 0,testcaseId:g.testcaseId??l.testcaseId??void 0,projectId:V??void 0,folderId:he??void 0,orgId:l.orgId??void 0,sessionName:l.sessionName??ye(r)},tmsBaseUrl:C.tmsBaseUrl,testId:g.testId??void 0,newCommitId:g.newCommitId??void 0,basicAuth:p.basicAuth??void 0,decisions:g.decisions,wantsPush:t.push===!0,retryTriggered:ue,forceAuthor:t.author===!0});g.newCommitId!=null&&(h.skipTmsFinalize=!0);let b=new Rt(h);if(o)return await b.execute();let{renderUploadProgress:A}=await import("./CliUploadProgress-EWQKUP74.js");return await A(b,v=>{if(v.testcaseId&&v.shareId&&V)return $e(n.testManagerUiUrl,V,v.testcaseId,v.shareId)})},runCleanup:()=>{J("chrome","test.md run complete")},log:(n,c,u,m)=>l.log(n,c,u,m)},{overallStatus:N.overallStatus,outcomes:N.outcomes,sourcePath:r,title:i.rootTitle,rootSteps:i.rootSteps,startedISO:Fe,durationS:ee,localMode:!!t.local,skipLocalWrites:!0});await Dr(r,g,l,N.outcomes,N.overallStatus,Fe,ee,te.uploadResult,$,t,{resolvedAuth:p,tmsBaseUrl:C.tmsBaseUrl},x);let dt={overallStatus:N.overallStatus,durationS:ee,decisions:g.decisions,outcomes:N.outcomes,cancelled:P,retryTriggered:ue,lockHeld:x,anyAuthorStepRan:B,isFirstRun:g.isFirstRun,wantsPush:t.push===!0,uploadResult:te.uploadResult,shouldUploadArtifacts:ae,shouldReplaceLocalOutput:B&&!P,shouldCommit:(x||g.isFirstRun)&&!P&&N.overallStatus==="passed"},{buildSummaryEvent:gr}=await import("./SummaryBox-5Y5FYFC7.js");if(o)d(gr(dt));else try{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{AutoExitSummaryBox:u}=await import("./SummaryBox-5Y5FYFC7.js"),{waitUntilExit:m}=c(n.createElement(u,{data:dt}),{stdout:process.stderr});await m()}catch(n){l.log("warn","TEST_MD_SUMMARY_RENDER_FAILED","Summary box render failed",{error:String(n)})}if(!o)try{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{LinksBox:u}=await import("./LinksBox-PGDOE3OB.js"),m=ne(f),h=te.uploadResult?.testcaseId,b=h&&te.uploadResult?.shareId&&V?$e(m.testManagerUiUrl,V,h,te.uploadResult.shareId):void 0,A=h&&V?yt(m.testManagerUiUrl,V,h):void 0,{waitUntilExit:v}=c(n.createElement(u,{recordedTestPath:r,outputDir:xt(r),shareableLink:b,testCaseLink:A,codeExportDir:te.uploadResult?.codeExportDir}),{stdout:process.stderr});await v()}catch(n){l.log("warn","TEST_MD_LINKS_RENDER_FAILED","LinksBox render failed",{error:String(n)})}return d({type:"test_md_done",overall_status:N.overallStatus,duration_s:ee,session_id:l.sessionId}),N.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"]),o={};for(let[s,d]of Object.entries(t)){let i=e[s];if(i===void 0||i==="")continue;let R=i;if(r.has(d)&&(R=Number(i),Number.isNaN(R))){let a="--"+s.replace(/[A-Z]/g,S=>"-"+S.toLowerCase());process.stderr.write(`error: ${a} must be a number
51
+ `)}let br=O>=1&&T>0&&j!==null?{startIdx:0,endIdx:j,count:j}:void 0;D?.setRunActive(!0);let be=await Ur({decisions:ce,resolved:i,session:l,accumulator:W,tuiConfig:$,globalConfig:G,buildStepConfigAt:at,buildReplayConfig:E=>{let Y=g.decisions[E];if(Y.kind!=="replay")throw new Error("expected replay decision at index "+E);let Z=i.steps[E];return We({step:Z,decision:Y,chrome:K,auth:p,sessionId:l.sessionId,runIndex:l.nextRunIndex(),sessionDir:l.sessionDir,windowSize:{width:$.window_size.width,height:$.window_size.height},forceNavigateUrl:E===0?re:void 0,sessionContext:l.getContext(),variables:Fr(X.raw,Z.config.variables,Z.objective)})},onAnyAuthorStep:()=>{B=!0},onCancel:()=>{P=!0},topBannerModel:w,topBannerAuth:`${a.getActiveProfile()??"no profile"}/${f}`,spawnOpts:{environment:f,mode:R.mode??"testing",log:(E,Y,Z,De)=>l.log(E,Y,Z,De)},priorAttemptRollup:br,pushStepLevelDelta:(E,Y)=>Oe(ie(X.raw,E,Y).raw),onSequencerStepEnd:(E,Y,Z,De)=>{let Rr=Math.round((Date.now()-De)/1e3),yr=E.hadError?E.reason??"runner error":null,Sr=Te(Y,Z,E.runEnd,E.bifurcationFlows??null,yr,Rr);return l.recordStepRun({testmdStepIndex:i.steps[Y].flatIndex,runIndex:Z,totalRunDirs:E.runEnd?.total_runs??E.bifurcationFlows?.length??1}),Sr},screenshotDispatcher:le,onReasoning:E=>D?.setStepText(E),onStepComplete:()=>D?.setStepComplete(),onSpawnStart:E=>{pe=E}});if(D?.setRunActive(!1),be.cancelled){J("marker-overlay","user cancelled run"),J("chrome","user cancelled run");break}if(be.failedAt===null)break;let je=h({failedAt:be.failedAt,shrinkCount:O,hasRetry:b,maxShrinks:A});if(je.kind==="fail"||!x&&!await ct())break;l.rollback(k),W.rollback(y),je.kind==="complete-reauthor"?T=0:T=je.newAuthorBoundary,O++,ue=!0,l.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:O,failed_at:j}),T===0&&l.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:O}),j=be.failedAt}}let N=W.finalize(),ee=Math.round((Date.now()-pr)/1e3),hr={session:l,resolvedAuth:p,chromeResult:K,chromeInstance:me??null,testId:l.testId??null,preparedVariables:M,variableIds:ge,globalContext:rt,localContext:nt,tuiConfig:$,env:f,localMode:!!t.local},te=await or(hr,{performUpload:async()=>{if(!p.basicAuth)return null;let n=ne(f),c=(B||t.push===!0)&&!P,u=(x||g.isFirstRun)&&!P&&N.overallStatus==="passed",m=ae&&(x||g.isFirstRun);l.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:ae,shouldUploadPipeline:m,shouldReplaceLocalOutput:c,shouldCommit:u,lockHeld:x,anyAuthorStepRan:B,cancelled:P,overallStatus:N.overallStatus});let h=Dt({session:l,env:f,auth:p,variables:M,variableIds:ge,projectId:V,folderId:he,totalSteps:N.outcomes.length,totalDuration:ee,screenshotExtMap:fe?.getExtMap(),codeExport:Lt({codeExport:t.codeExport,codeLanguage:t.codeLanguage,skipCodeValidation:t.skipCodeValidation},$.code_export),onProgress:()=>{},log:(v,T,O,j)=>l.log(v,T,O,j),shouldUploadArtifacts:m,shouldReplaceLocalOutput:c,shouldCommit:u,isFirstRun:g.isFirstRun,resolvedTest:i,sourcePath:r,stepRunRecords:l.getStepRunRecords(),outcomes:N.outcomes,overallStatus:N.overallStatus,fromCommitId:g.fromCommitId,startedISO:Fe,durationS:ee,tmsIds:{testId:g.testId??l.testId??void 0,testcaseId:g.testcaseId??l.testcaseId??void 0,projectId:V??void 0,folderId:he??void 0,orgId:l.orgId??void 0,sessionName:l.sessionName??ye(r)},tmsBaseUrl:C.tmsBaseUrl,testId:g.testId??void 0,newCommitId:g.newCommitId??void 0,basicAuth:p.basicAuth??void 0,decisions:g.decisions,wantsPush:t.push===!0,retryTriggered:ue,forceAuthor:t.author===!0});g.newCommitId!=null&&(h.skipTmsFinalize=!0);let b=new Rt(h);if(o)return await b.execute();let{renderUploadProgress:A}=await import("./CliUploadProgress-B4CVWX62.js");return await A(b,v=>{if(v.testcaseId&&v.shareId&&V)return $e(n.testManagerUiUrl,V,v.testcaseId,v.shareId)})},runCleanup:()=>{J("chrome","test.md run complete")},log:(n,c,u,m)=>l.log(n,c,u,m)},{overallStatus:N.overallStatus,outcomes:N.outcomes,sourcePath:r,title:i.rootTitle,rootSteps:i.rootSteps,startedISO:Fe,durationS:ee,localMode:!!t.local,skipLocalWrites:!0});await Dr(r,g,l,N.outcomes,N.overallStatus,Fe,ee,te.uploadResult,$,t,{resolvedAuth:p,tmsBaseUrl:C.tmsBaseUrl},x);let dt={overallStatus:N.overallStatus,durationS:ee,decisions:g.decisions,outcomes:N.outcomes,cancelled:P,retryTriggered:ue,lockHeld:x,anyAuthorStepRan:B,isFirstRun:g.isFirstRun,wantsPush:t.push===!0,uploadResult:te.uploadResult,shouldUploadArtifacts:ae,shouldReplaceLocalOutput:B&&!P,shouldCommit:(x||g.isFirstRun)&&!P&&N.overallStatus==="passed"},{buildSummaryEvent:gr}=await import("./SummaryBox-FDNFQYSC.js");if(o)d(gr(dt));else try{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{AutoExitSummaryBox:u}=await import("./SummaryBox-FDNFQYSC.js"),{waitUntilExit:m}=c(n.createElement(u,{data:dt}),{stdout:process.stderr});await m()}catch(n){l.log("warn","TEST_MD_SUMMARY_RENDER_FAILED","Summary box render failed",{error:String(n)})}if(!o)try{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{LinksBox:u}=await import("./LinksBox-R3VLKMYS.js"),m=ne(f),h=te.uploadResult?.testcaseId,b=h&&te.uploadResult?.shareId&&V?$e(m.testManagerUiUrl,V,h,te.uploadResult.shareId):void 0,A=h&&V?yt(m.testManagerUiUrl,V,h):void 0,{waitUntilExit:v}=c(n.createElement(u,{recordedTestPath:r,outputDir:xt(r),shareableLink:b,testCaseLink:A,codeExportDir:te.uploadResult?.codeExportDir}),{stdout:process.stderr});await v()}catch(n){l.log("warn","TEST_MD_LINKS_RENDER_FAILED","LinksBox render failed",{error:String(n)})}return d({type:"test_md_done",overall_status:N.overallStatus,duration_s:ee,session_id:l.sessionId}),N.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"]),o={};for(let[s,d]of Object.entries(t)){let i=e[s];if(i===void 0||i==="")continue;let R=i;if(r.has(d)&&(R=Number(i),Number.isNaN(R))){let a="--"+s.replace(/[A-Z]/g,S=>"-"+S.toLowerCase());process.stderr.write(`error: ${a} must be a number
52
52
  `),process.exit(2)}o[d]=R}return o}function Or(e,t){let r={...e,...t},o=Object.keys(r).length>0?Re(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:o.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,s])=>s.secret),nonSecretEntries:Object.entries(r).filter(([,s])=>!s.secret)}}function ie(e,t,r){let o={...e,...t??{}};if(Object.keys(o).length===0)return{raw:o,variables:{},objective:r};let s=Re(o,r);return{raw:o,variables:_t(s.variables,s.objective),objective:s.objective}}function Fr(e,t,r){let o=ie(e,t,r).variables;return Object.keys(o).length>0?o:void 0}function ir(e,t){let r=new Set(_e),o={...e};for(let[s,d]of Object.entries(t))r.has(s)||s!=="variables"&&d!==void 0&&e[s]===void 0&&(o[s]=d);return o}function Tr(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function jr(e,t,r,o,s){let d=Pt(e),i=Kt(t,Xe(d)?d:null);Wt(t,i);let R=Se(e),a=Xe(R)?JSON.parse(xr(R,"utf8")):null,S=a?.testcase_id,_=a?.test_id,I=a?.commit_id,F=r.push===!0,f=r.retry===!0||r.retryCount!==void 0,C=r.author===!0;F&&!S&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
53
53
  `),C&&(S=void 0,_=void 0,I=void 0);let w=o.resolvedAuth.basicAuth;if(!w){let P=await o.resolvedAuth.resolver.resolve(!0);P?.username&&P?.access_key&&(w={username:P.username,access_key:P.access_key},o.resolvedAuth.basicAuth=w)}let p=!!w,U=!r.local&&p&&_!=null&&I!=null&&S!=null,l=U&&(Gt(i)||F);if(F&&!U)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
54
54
  `),{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:null,isFirstRun:!1,hasAuth:p,canLock:U,lockAcquired:!1,abort:{exitCode:2}};if(f&&!U)return process.stderr.write(`error: --retry requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
@@ -61,4 +61,4 @@ import{a as qt}from"./chunk-JSOBQIZW.js";import{a as Nt}from"./chunk-OQZG3V6B.js
61
61
  `),"abort"}}return process.stderr.write(`[lock] ${i} \u2014 running in readonly mode (no commit)
62
62
  `),"readonly"}async function Dr(e,t,r,o,s,d,i,R,a,S,_,I){let{decisions:F,testId:f,testcaseId:C,fromCommitId:w,newCommitId:p}=t;if(!(s==="passed")&&I&&f&&w&&p){process.stderr.write(`[lock] run failed (${s}); discarding new commit
63
63
  `),await Lr(_,f,w,p),Qe();return}Qe()}async function Lr(e,t,r,o){let s=e.resolvedAuth.basicAuth;if(!s){let i=await e.resolvedAuth.resolver.resolve(!0);i?.username&&i?.access_key&&(s={username:i.username,access_key:i.access_key},e.resolvedAuth.basicAuth=s)}if(!s)return;let d=await jt({baseUrl:Ce(e.tmsBaseUrl),testId:t,body:{commitId:o,fromCommitId:r},auth:Ae(s)});d.ok||process.stderr.write(`warn: discardLock failed: ${d.reason} (HTTP ${d.httpStatus}): ${d.message}
64
- `)}async function Ur(e){let{default:t}=await import("./react-QWOAB3TB.js"),{render:r}=await import("./build-JIKYOZUH.js"),{TestMdRunView:o}=await import("./TestMdRunView-YKEM6CUM.js"),s=null,d=!1,i=0,R=-1,a=-1,S=0,_=async F=>{if(F&&F.status==="failed")return i>0&&e.decisions[i-1].kind==="replay"&&(s=i-1),null;for(;i<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[i]);)i++;if(i>=e.decisions.length)return null;let f=e.decisions[i],C=e.resolved.steps[i],w=i;i++;let p=e.session.nextRunIndex();R=w,a=p,S=Date.now(),e.onSpawnStart?.(p),f.kind==="author"&&e.onAnyAuthorStep(),await e.pushStepLevelDelta(C.config.variables,C.objective);let U=f.kind==="replay"?e.buildReplayConfig(w):e.buildStepConfigAt(w,p),l=f.kind==="replay"?"md5-match":f.reason,g=C.config??{},x={};for(let[B,P]of Object.entries(g))P!=null&&B!=="variables"&&(x[B]=P);return{config:U,banner:{stepLabel:`Step ${w+1}/${e.decisions.length}`,objective:Tr(C.objective,100)},mode:f.kind,modeReason:l,perStepOverrides:Object.keys(x).length>0?x:void 0}},{waitUntilExit:I}=r(t.createElement(o,{topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:_,onStepEnd:F=>(F.status==="failed"&&R>=0&&e.decisions[R]?.kind==="replay"&&(s=R),e.onSequencerStepEnd(F,R,a,S)),onAllComplete:()=>{},onCancel:()=>{d=!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:s,cancelled:d}}export{ir as applyCliStepConfig,ie as buildStepRunVariables,Or as buildTestLevelVariables,Fr as replayVariablesForStep,ns as runTestMdFile};
64
+ `)}async function Ur(e){let{default:t}=await import("./react-QWOAB3TB.js"),{render:r}=await import("./build-JIKYOZUH.js"),{TestMdRunView:o}=await import("./TestMdRunView-E4UDWIGT.js"),s=null,d=!1,i=0,R=-1,a=-1,S=0,_=async F=>{if(F&&F.status==="failed")return i>0&&e.decisions[i-1].kind==="replay"&&(s=i-1),null;for(;i<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[i]);)i++;if(i>=e.decisions.length)return null;let f=e.decisions[i],C=e.resolved.steps[i],w=i;i++;let p=e.session.nextRunIndex();R=w,a=p,S=Date.now(),e.onSpawnStart?.(p),f.kind==="author"&&e.onAnyAuthorStep(),await e.pushStepLevelDelta(C.config.variables,C.objective);let U=f.kind==="replay"?e.buildReplayConfig(w):e.buildStepConfigAt(w,p),l=f.kind==="replay"?"md5-match":f.reason,g=C.config??{},x={};for(let[B,P]of Object.entries(g))P!=null&&B!=="variables"&&(x[B]=P);return{config:U,banner:{stepLabel:`Step ${w+1}/${e.decisions.length}`,objective:Tr(C.objective,100)},mode:f.kind,modeReason:l,perStepOverrides:Object.keys(x).length>0?x:void 0}},{waitUntilExit:I}=r(t.createElement(o,{topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:_,onStepEnd:F=>(F.status==="failed"&&R>=0&&e.decisions[R]?.kind==="replay"&&(s=R),e.onSequencerStepEnd(F,R,a,S)),onAllComplete:()=>{},onCancel:()=>{d=!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:s,cancelled:d}}export{ir as applyCliStepConfig,ie as buildStepRunVariables,Or as buildTestLevelVariables,Fr as replayVariablesForStep,ns as runTestMdFile};
@@ -1,10 +1,10 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as $}from"./chunk-JSOBQIZW.js";import{b as J,c as U,d as tt}from"./chunk-6NM5ZRG6.js";import{a as C,b as W,e as S,f as Z}from"./chunk-AH4AXJML.js";import{a as N}from"./chunk-4MW543EE.js";import"./chunk-G7VF5SDK.js";import{a as z}from"./chunk-KLRD7F46.js";import{a as B}from"./chunk-OEYN4LRD.js";import{a as G}from"./chunk-RSRXL3HE.js";import"./chunk-BPF7TDRU.js";import{a as K,b as Q}from"./chunk-MDBXYXSC.js";import"./chunk-WAOCHXJ5.js";import"./chunk-HGIGF7SF.js";import{a as F}from"./chunk-HCBYKLMW.js";import{t as _}from"./chunk-XR7EOTSN.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-NLCCBXXV.js";import{a as O}from"./chunk-RZ4F3BHX.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-LYSEA5FB.js";import{b as J,c as U,d as tt}from"./chunk-2SXNPFGD.js";import{a as C,b as W,e as S,f as Z}from"./chunk-AH4AXJML.js";import{a as N}from"./chunk-KMTNMUVS.js";import"./chunk-G7VF5SDK.js";import{a as z}from"./chunk-WZCGEQ6M.js";import{a as B}from"./chunk-KX7K3Y7R.js";import{a as G}from"./chunk-JHNEE2MB.js";import"./chunk-BPF7TDRU.js";import{a as K,b as Q}from"./chunk-MDBXYXSC.js";import"./chunk-WAOCHXJ5.js";import"./chunk-PQGNWC33.js";import{a as F}from"./chunk-HCBYKLMW.js";import{t as _}from"./chunk-5XTLIGWL.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-NLCCBXXV.js";import{a as O}from"./chunk-RZ4F3BHX.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-3WLYVWFB.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-5TNUTTEA.js"),c=await o(x.path,{});return x.action=null,x.path=null,c}if(e===ft&&x.path){let o=await Jt(x.path,{},t);return x.action=null,x.path=null,o}if(e===mt&&x.path){let o=await Wt(x.path,!0,t);return x.action=null,x.path=null,o}return e}async function Me(t,r){let i=Y(t);if(!v(i))return process.stderr.write(`error: file not found: ${i}
8
8
  `),2;let n=L(i),e=q(n,r);if(e!==null)return e;let o={path:i,name:C(i),has_meta:n!==null};return n&&(n.commit_id&&(o.commit_id=n.commit_id),n.test_id&&(o.test_id=n.test_id),n.testcase_id&&(o.testcase_id=n.testcase_id),n.project_id&&(o.project_id=n.project_id),n.folder_id&&(o.folder_id=n.folder_id),n.org_id&&(o.org_id=n.org_id),n.session_name&&(o.session_name=n.session_name)),process.stdout.write(JSON.stringify(o)+`
9
9
  `),0}async function Wt(t,r,i){let n=Y(t);if(!v(n))return process.stderr.write(`error: file not found: ${n}
10
10
  `),2;let e=L(n),o=q(e,i);if(o!==null)return o;if(!r)return process.stderr.write(`error: refusing to delete without --yes.
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as t}from"./chunk-RSRXL3HE.js";import"./chunk-XR7EOTSN.js";import"./chunk-UR6MHSHU.js";async function a(n,e,o){let{TmsClient:r}=await import("./tms-client-R5ZIAOBH.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-JHNEE2MB.js";import"./chunk-5XTLIGWL.js";import"./chunk-UR6MHSHU.js";async function a(n,e,o){let{TmsClient:r}=await import("./tms-client-R5ZIAOBH.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-LJCHLJEV.js";import"./chunk-XR7EOTSN.js";import"./chunk-RZ4F3BHX.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-X5CCG35O.js";import"./chunk-5XTLIGWL.js";import"./chunk-RZ4F3BHX.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.5",
3
+ "version": "0.3.7",
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.5",
27
- "@testmuai/kane-cli-darwin-x64": "0.3.5",
28
- "@testmuai/kane-cli-linux-x64": "0.3.5",
29
- "@testmuai/kane-cli-win-x64": "0.3.5"
26
+ "@testmuai/kane-cli-darwin-arm64": "0.3.7",
27
+ "@testmuai/kane-cli-darwin-x64": "0.3.7",
28
+ "@testmuai/kane-cli-linux-x64": "0.3.7",
29
+ "@testmuai/kane-cli-win-x64": "0.3.7"
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-OLHVJQTO.js";import"./chunk-YCCUBQY4.js";import"./chunk-KLRD7F46.js";import"./chunk-RSRXL3HE.js";import"./chunk-HGIGF7SF.js";import"./chunk-HCBYKLMW.js";import"./chunk-XR7EOTSN.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-7CLUJYMW.js";import"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-UR6MHSHU.js";export{b as FolderPicker,a as formatFolderLine};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{f as a}from"./chunk-4ITKSPTN.js";import"./chunk-NQHLMFWC.js";import"./chunk-L5LI2JF4.js";import"./chunk-4MW543EE.js";import"./chunk-G7VF5SDK.js";import"./chunk-YCJ6JUDU.js";import"./chunk-OLHVJQTO.js";import"./chunk-YCCUBQY4.js";import"./chunk-KLRD7F46.js";import"./chunk-VE3SUJMA.js";import"./chunk-OEYN4LRD.js";import"./chunk-RSRXL3HE.js";import"./chunk-BPF7TDRU.js";import"./chunk-WAOCHXJ5.js";import"./chunk-HGIGF7SF.js";import"./chunk-HCBYKLMW.js";import"./chunk-XR7EOTSN.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-7CLUJYMW.js";import"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-UR6MHSHU.js";export{a as SingleShotApp};