@testmuai/kane-cli 0.3.7 → 0.4.0

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 (94) hide show
  1. package/dist/{ChromeProfilePicker-CBF6SP67.js → ChromeProfilePicker-27QCT4NT.js} +1 -1
  2. package/dist/{CliFeedbackPrompt-P2FJBV3S.js → CliFeedbackPrompt-LMXDRY5F.js} +1 -1
  3. package/dist/{CliUploadProgress-B4CVWX62.js → CliUploadProgress-QP5SPC7G.js} +1 -1
  4. package/dist/ConfigView-RQM2JY4K.js +2 -0
  5. package/dist/FolderPicker-YN2YQJXI.js +2 -0
  6. package/dist/HelpView-2IYG5AC3.js +2 -0
  7. package/dist/{InfoBox-SYT7CVM4.js → InfoBox-JELKGWY5.js} +1 -1
  8. package/dist/{LinksBox-R3VLKMYS.js → LinksBox-NUSUOUIW.js} +1 -1
  9. package/dist/{ProfilesView-XKUXSFMQ.js → ProfilesView-RXYI2IS3.js} +1 -1
  10. package/dist/{ProjectPicker-TWTR6SWR.js → ProjectPicker-RUR7HH2P.js} +1 -1
  11. package/dist/{SaveSessionPrompt-WAVXAYCK.js → SaveSessionPrompt-GUBVAQ3O.js} +1 -1
  12. package/dist/SingleShotApp-3XDTU2BU.js +2 -0
  13. package/dist/SummaryBox-5Y2YYOUM.js +2 -0
  14. package/dist/TestMdRunView-PPZPUVVZ.js +2 -0
  15. package/dist/{WhoamiView-YG6SSQTV.js → WhoamiView-IJZUFJ7B.js} +1 -1
  16. package/dist/{changelog-M5VP33UN.js → changelog-N4SSER5V.js} +1 -1
  17. package/dist/chunk-3C7ATCDM.js +2 -0
  18. package/dist/chunk-3Z4EHIOW.js +2 -0
  19. package/dist/chunk-5TOE4RHH.js +2 -0
  20. package/dist/chunk-6IQWD272.js +2 -0
  21. package/dist/{chunk-VUIXILBR.js → chunk-6NEJEMA6.js} +8 -8
  22. package/dist/{chunk-KX7K3Y7R.js → chunk-7G7ZLAJH.js} +1 -1
  23. package/dist/{chunk-X5CCG35O.js → chunk-7RPMUEEN.js} +1 -1
  24. package/dist/{chunk-PQGNWC33.js → chunk-AT2Y5UNP.js} +1 -1
  25. package/dist/chunk-BKXTOQWL.js +5 -0
  26. package/dist/chunk-CGAX3AXA.js +2 -0
  27. package/dist/chunk-CKY3UXTY.js +2 -0
  28. package/dist/chunk-DTFPHZE7.js +62 -0
  29. package/dist/chunk-H4XV224I.js +6 -0
  30. package/dist/chunk-H6OVTXJQ.js +2 -0
  31. package/dist/chunk-HN7DVSVI.js +11 -0
  32. package/dist/chunk-HYVAYSRZ.js +2 -0
  33. package/dist/chunk-IH45REQA.js +2 -0
  34. package/dist/chunk-J37YPPCD.js +2 -0
  35. package/dist/chunk-JCR3T34A.js +20 -0
  36. package/dist/chunk-JLOY7SNA.js +14 -0
  37. package/dist/chunk-L3RTVAPG.js +6 -0
  38. package/dist/chunk-LMV2F35W.js +2 -0
  39. package/dist/chunk-LRF6UP42.js +10 -0
  40. package/dist/chunk-M5RHRHFC.js +9 -0
  41. package/dist/{chunk-QKM3RHSQ.js → chunk-O2UU4TS5.js} +1 -1
  42. package/dist/chunk-PKQJHIKJ.js +2 -0
  43. package/dist/{chunk-74MJWDIW.js → chunk-PN7LNQ7G.js} +1 -1
  44. package/dist/{chunk-L256AYYL.js → chunk-PWHFNSDC.js} +1 -1
  45. package/dist/{chunk-BDC7IOXP.js → chunk-SJ7VGRQU.js} +11 -11
  46. package/dist/chunk-TAEW7PXN.js +2 -0
  47. package/dist/chunk-UJZCMEEH.js +8 -0
  48. package/dist/chunk-UVBDUDSL.js +2 -0
  49. package/dist/chunk-VS2BXLH4.js +2 -0
  50. package/dist/chunk-VTDVK3DK.js +2 -0
  51. package/dist/chunk-XQXSPUIX.js +2 -0
  52. package/dist/generate-headless-7UYAPXE5.js +18 -0
  53. package/dist/index.js +34 -38
  54. package/dist/{login-flow-3YFO62HA.js → login-flow-LK7GAUCZ.js} +1 -1
  55. package/dist/persist-recorded-session-VEFILVPX.js +3 -0
  56. package/dist/{pipeline-L3VM7QEX.js → pipeline-3GVPCDRE.js} +1 -1
  57. package/dist/{recording-banner-Q66Y2UIC.js → recording-banner-WS4Y7LVH.js} +1 -1
  58. package/dist/run-test-md-SXZUOYSG.js +14 -0
  59. package/dist/tcg-generate-CEBFKKJE.js +2 -0
  60. package/dist/testmd-actions-IZPOBSTC.js +2 -0
  61. package/dist/{validate-basic-JJOEAFLT.js → validate-basic-Y73NBDAD.js} +1 -1
  62. package/dist/{version-check-WWOS4OEZ.js → version-check-LNKXGYZE.js} +1 -1
  63. package/package.json +5 -5
  64. package/dist/ConfigView-PCX3TZNC.js +0 -2
  65. package/dist/FolderPicker-UTY6XQHP.js +0 -2
  66. package/dist/HelpView-CDK7II5Q.js +0 -2
  67. package/dist/SingleShotApp-JH6A65TZ.js +0 -2
  68. package/dist/SummaryBox-FDNFQYSC.js +0 -2
  69. package/dist/TestMdRunView-E4UDWIGT.js +0 -2
  70. package/dist/chunk-2SXNPFGD.js +0 -2
  71. package/dist/chunk-5XTLIGWL.js +0 -2
  72. package/dist/chunk-EIZXV3UH.js +0 -2
  73. package/dist/chunk-G7VF5SDK.js +0 -10
  74. package/dist/chunk-HROFBRMS.js +0 -5
  75. package/dist/chunk-JHNEE2MB.js +0 -2
  76. package/dist/chunk-KMTNMUVS.js +0 -8
  77. package/dist/chunk-LYSEA5FB.js +0 -6
  78. package/dist/chunk-MJQ2EHSC.js +0 -2
  79. package/dist/chunk-OQZG3V6B.js +0 -2
  80. package/dist/chunk-PJMTAAZ7.js +0 -2
  81. package/dist/chunk-PYU2JPAY.js +0 -2
  82. package/dist/chunk-QCNKJUPT.js +0 -2
  83. package/dist/chunk-R7JZMKC7.js +0 -9
  84. package/dist/chunk-TP6KYKPD.js +0 -2
  85. package/dist/chunk-U4XV5KUD.js +0 -2
  86. package/dist/chunk-VS5FTXRZ.js +0 -13
  87. package/dist/chunk-WZCGEQ6M.js +0 -2
  88. package/dist/chunk-X7VI7KK3.js +0 -11
  89. package/dist/chunk-YX3YFXT5.js +0 -2
  90. package/dist/chunk-ZAUHYR76.js +0 -2
  91. package/dist/chunk-ZY4BZQHD.js +0 -2
  92. package/dist/persist-recorded-session-LVQLORT4.js +0 -3
  93. package/dist/run-test-md-5TNUTTEA.js +0 -64
  94. package/dist/testmd-actions-O4NTH2OR.js +0 -20
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as P}from"./chunk-PQGNWC33.js";import{a as X}from"./chunk-HCBYKLMW.js";import{t as r}from"./chunk-5XTLIGWL.js";import{a,b as i,i as N}from"./chunk-C44QQJR4.js";import{a as G}from"./chunk-6YGTRKDT.js";import{e as D}from"./chunk-UR6MHSHU.js";var g=D(G(),1);var e=D(X(),1),f=5;function K(t,I){if(!I)return t;let c=I.toLowerCase();return t.filter(B=>B.label.toLowerCase().includes(c))}function J(t){let{title:I,items:c,loading:B=!1,loadingText:Y,error:y=null,itemNoun:T="items",onSelect:H,onCancel:R,defaultActiveId:L,onTab:w,extraHint:E}=t,[x,s]=(0,g.useState)(0),[S,u]=(0,g.useState)(0),[d,A]=(0,g.useState)(""),[p,h]=(0,g.useState)(null);(0,g.useEffect)(()=>{if(c.length===0)return;if(t.preserveSelectionById&&p!==null){let n=c.findIndex(o=>o.id===p);if(n>=0){u(Math.floor(n/f)),s(n%f);return}}let l=L?c.findIndex(n=>n.id===L):c.findIndex(n=>n.isActive);l>=0?(u(Math.floor(l/f)),s(l%f),t.preserveSelectionById&&h(c[l].id)):t.preserveSelectionById&&(u(0),s(0),h(c[0]?.id??null))},[c,L,t.preserveSelectionById,p]),(0,g.useEffect)(()=>{if(!t.onSearch)return;let l=setTimeout(()=>t.onSearch(d),t.searchDebounceMs??250);return()=>clearTimeout(l)},[d,t.onSearch,t.searchDebounceMs]);let m=t.onSearch?c:K(c,d),C=S*f,F=Math.min(C+f,m.length),M=Math.ceil(m.length/f),O=F-C,v=m.slice(C,F);return N((l,n)=>{if(y){n.escape&&R();return}if(n.escape){d?(A(""),s(0),u(0)):R();return}if(n.tab&&w){w();return}if(n.upArrow){if(x>0){let o=x-1;s(o),t.preserveSelectionById&&h(v[o]?.id??null)}else if(S>0){let o=S-1,b=f-1;u(o),s(b),t.preserveSelectionById&&h(m[o*f+b]?.id??null)}return}if(n.downArrow){if(x<O-1){let o=x+1;s(o),t.preserveSelectionById&&h(v[o]?.id??null)}else if(S<M-1){let o=S+1,b=0;u(o),s(b),t.preserveSelectionById&&h(m[o*f+b]?.id??null)}return}if(n.return&&v[x]){H(v[x]);return}if(n.backspace||n.delete){A(o=>o.slice(0,-1)),s(0),u(0);return}l&&!n.ctrl&&!n.meta&&(A(o=>o+l),s(0),u(0))},{isActive:!B}),B?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.primary,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:r.primary,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(i,{color:r.secondary,children:Y??`Loading ${T}\u2026`})})]}):y?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.statusFail,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:r.statusFail,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(i,{color:r.statusFail,children:y})}),(0,e.jsx)(P,{bindings:[]})]}):(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.primary,paddingX:2,paddingY:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(i,{color:r.primary,bold:!0,children:I}),(0,e.jsxs)(i,{color:r.dim,children:[" (",m.length,!t.onSearch&&d?`/${c.length}`:""," ",T,t.loadingMore?" \xB7 loading more":"",")"]})]}),(0,e.jsxs)(a,{marginTop:1,children:[(0,e.jsx)(i,{color:r.secondary,children:d?"filter: ":""}),d?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(i,{children:d}),(0,e.jsx)(i,{inverse:!0,children:" "})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)(i,{color:r.dim,children:["Search ",T,"\u2026"]}),(0,e.jsx)(i,{inverse:!0,children:" "})]})]}),(0,e.jsx)(a,{flexDirection:"column",marginTop:1,children:t.searching?(0,e.jsxs)(i,{color:r.secondary,children:["Searching ",T,"\u2026"]}):m.length===0?(0,e.jsxs)(i,{color:r.dim,children:["No ",T,' match "',d,'"']}):v.map((l,n)=>{let o=n===x,b=o?"\u276F ":" ",$=l.isActive?r.statusPass:o?r.primary:void 0;return(0,e.jsxs)(i,{color:$,children:[b,l.label,l.isActive?" \u25CF selected":""]},l.id)})}),!t.searching&&M>1&&(0,e.jsx)(a,{marginTop:1,children:(0,e.jsxs)(i,{color:r.dim,children:["Page ",S+1,"/",M]})}),t.footer&&(0,e.jsx)(a,{marginTop:1,flexDirection:"column",children:t.footer}),(0,e.jsx)(P,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"type",label:"to search"},{keys:"\u21B5",label:"select"},...w&&E?[{keys:"tab",label:E}]:[]],escBackLabel:d?"clear":"back to chat"})]})}export{J as a};
@@ -1,11 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{c as j,h as _}from"./chunk-AH4AXJML.js";import{a as x}from"./chunk-L5LI2JF4.js";import{mkdirSync as $,writeFileSync as ve}from"fs";import{join as S}from"path";import{createHash as W}from"crypto";function w(e){if(e==null)return null;if(Array.isArray(e))return e.map(w);if(typeof e=="object"){let t={};for(let n of Object.keys(e).sort()){let r=e[n];r!==void 0&&(t[n]=w(r))}return t}return e}function Y(e){if(e.body.kind!=="objective")throw new Error("stepMd5: only objective steps have an md5; @import rows do not");let t={...e.config??{},optional:e.optional??!1},n=JSON.stringify(w(t));return W("md5").update(e.body.text).update(`
3
- `).update(n).digest("hex")}function R(e){return Y({index:e.trace[e.trace.length-1].stepIndex,heading:e.trace[e.trace.length-1].heading,body:{kind:"objective",text:e.objective},config:e.parsedConfig,headingLine:1,optional:e.optional})}import{writeFileSync as G,mkdirSync as J,readFileSync as q}from"fs";import{dirname as z,basename as O}from"path";function v(e){let t=e.outPath??j(e.sourcePath);J(z(t),{recursive:!0});let n=[];n.push("---"),n.push(`test: ../${O(e.sourcePath)}`),n.push(`status: ${e.overallStatus}`),n.push(`started: ${e.startedISO}`),n.push(`duration_s: ${e.durationS}`),n.push(`session_id: ${e.sessionId}`),n.push("---",""),n.push(`# ${e.title??O(e.sourcePath)} \u2014 Result`,"");for(let r=0;r<e.rootSteps.length;r++){let s=e.rootSteps[r],o=e.outcomes.find(i=>i.rootStepIndex===r+1);if(n.push(U(s,o)),s.body.kind==="objective"&&o?.stepMd5&&n.push(`md5: ${o.stepMd5}`),o?.status==="failed"&&o.reason&&n.push(`Reason: ${o.reason}`),o?.softFailures?.length)for(let i of o.softFailures){let d=i.reason?`: ${i.reason}`:"";n.push(`\u26A0 optional sub-step ${i.subStepIndex} failed${d}`)}s.body.kind==="objective"&&o?.status!=="skipped"&&n.push(s.body.text),n.push("")}return G(t,n.join(`
4
- `),"utf8"),t}function U(e,t){if(!t)return`## ${e.heading} (no outcome)`;let n=t.duration_s!=null?`${t.duration_s}s`:"\u2014";if(t.status==="skipped")return`## ${e.heading} \u23ED skipped`;let r=t.softFailed?" (optional)":"";if(t.refKind&&t.status==="passed"){let s=t.helperResultRelPath?` \u2192 ${t.helperResultRelPath}`:"";return`## ${e.heading} \u2713 passed (via @${t.refKind} ${t.refLabel} \u2014 ${t.inlinedCount} inlined steps, ${n}${s})`}if(t.refKind&&t.status==="failed"){let s=t.failedSubStepIndex&&t.failedSubStepIndex.length>0?` \u2014 at sub-step ${t.failedSubStepIndex.join(" \u2192 sub-step ")}`:"",o=t.helperResultRelPath?` \u2192 ${t.helperResultRelPath}`:"";return`## ${e.heading} \u2717 failed${r} (via @${t.refKind} ${t.refLabel}${s}, ${n}${o})`}return t.status==="passed"?`## ${e.heading} \u2713 passed (${n})`:`## ${e.heading} \u2717 failed${r} (${n})`}var V=/^##\s+(.+?)\s+(✓ passed|✗ failed(?:\s+\(optional\))?|⏭ skipped)(?:\s+\((.*)\))?\s*$/,Q=/via\s+@\w+\s+(\S+).*?(?:→\s+(\S+))?\s*$/,X=/^md5:\s+([a-f0-9]{32})\s*$/;function Pe(e){let n=q(e,"utf8").split(`
5
- `),r="passed";if(n[0]?.trim()==="---")for(let o=1;o<n.length&&n[o].trim()!=="---";o++){let i=/^status:\s+(passed|failed|interrupted)\s*$/.exec(n[o]);i&&(r=i[1])}let s=[];for(let o=0;o<n.length;o++){let i=V.exec(n[o]);if(!i)continue;let d=i[1],l=i[2],c=i[3]??"",p=l.startsWith("\u2713")?"passed":l.startsWith("\u23ED")?"skipped":"failed";if(/via\s+@/.test(c)){let g=Q.exec(c),a=g?.[1]??"",u=g?.[2]??null;s.push({kind:"import",heading:d,status:p,md5:null,importPath:a,helperResultRelPath:u})}else{let g=null;for(let a=o+1;a<n.length&&!/^##\s/.test(n[a]);a++){if(n[a].trim()==="")continue;let u=X.exec(n[a]);if(u){g=u[1];break}break}s.push({kind:"objective",heading:d,status:p,md5:g})}}return{overallStatus:r,steps:s}}import{copyFileSync as Z,existsSync as ee,mkdirSync as te,writeFileSync as se}from"fs";import{join as y}from"path";function D(e){for(let t=0;t<e.totalRunDirs;t++){let n=e.runIndex+t,r=y(e.sessionDir,"runs",String(n)),s=y(e.stagingStepDir,"flows",String(t));te(s,{recursive:!0});let o=[y(r,"run-test","actions.ndjson"),y(r,"actions.ndjson")],i=y(s,"actions.ndjson"),d=!1;for(let l of o)if(ee(l)){Z(l,i),d=!0;break}d||se(i,"")}}import{basename as ne,dirname as re,join as oe}from"path";function F(e){let t=ne(e);return t.endsWith("_test.md")?t.slice(0,-8):t.endsWith(".md")?t.slice(0,-3):t}function ie(e){if(e.length<2)throw new Error("helperOutputDirName requires trace length >= 2 (root + at least one helper)");let t=F(e[0].file),n=F(e[e.length-1].file),r=e.slice(0,-1).map(s=>String(s.stepIndex));return`helper-output-${n}-${t}-${r.join("-")}`}function b(e){if(e.length<2)throw new Error("helperOutputDirPath requires trace length >= 2");let t=e[e.length-1].file;return oe(re(t),ie(e))}import{existsSync as M,mkdirSync as ae,rmSync as le,cpSync as de}from"fs";function E(e,t){M(e)&&(M(t)&&le(t,{recursive:!0,force:!0}),ae(t,{recursive:!0}),de(e,t,{recursive:!0}))}import{readFileSync as Se}from"fs";import{join as ye,relative as be}from"path";var f=class extends Error{constructor(n,r,s){super(`[${r}${s!=null?`:${s}`:""}] ${n}`);this.file=r;this.line=s;this.name="TestMdParseError"}},pe=new Set(["username","access_key","oauth","profile","project_id","folder_id"]),L=new Set(["mode","max_steps","timeout","global_context","local_context","variables","session_context","code_export","code_language","target","chrome_profile","cdp_endpoint","ws_endpoint","headless","on_lock_conflict"]),k=new Set(["optional"]),ce=new Set(["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"]),ue=new Set(["mode","on_lock_conflict"]);function T(e,t){let n=t.split(`
6
- `),{global:r,bodyStartLine:s}=fe(e,n),{title:o,steps:i}=ge(e,n,s);return{path:e,title:o,global:r,steps:i}}function fe(e,t){if(t[0]?.trim()!=="---")return{global:{},bodyStartLine:0};let n=-1;for(let o=1;o<t.length;o++)if(t[o].trim()==="---"){n=o;break}if(n===-1)throw new f("frontmatter is missing closing '---'",e,1);let r=t.slice(1,n).join(`
7
- `),s;try{s=x(r)??{}}catch(o){throw new f(`invalid YAML in frontmatter: ${o.message}`,e,1)}if(C(e,s,"frontmatter",1),s.on_lock_conflict!==void 0){let o=s.on_lock_conflict;if(o!=="readonly"&&o!=="fail"&&o!=="wait")throw new f(`on_lock_conflict must be 'readonly' | 'fail' | 'wait', got: ${JSON.stringify(o)}`,e,1)}return B(e,s,1),{global:s,bodyStartLine:n+1}}function ge(e,t,n){let r,s=n;for(;s<t.length&&t[s].trim()==="";)s++;let o=s<t.length?/^#\s+(.+?)\s*$/.exec(t[s]):null;o&&(r=o[1],s++);let i=[];for(let l=s;l<t.length;l++)/^##\s/.test(t[l])&&i.push(l);let d=[];for(let l=0;l<i.length;l++){let c=i[l],p=i[l+1]??t.length,m=t[c].replace(/^##\s+/,"").trim(),g=t.slice(c+1,p),{config:a,body:u,optional:h}=me(e,c+1,g);d.push({index:l+1,heading:m,config:a,body:u,headingLine:c+1,optional:h})}return{title:r,steps:d}}function me(e,t,n){let r=0;for(;r<n.length&&n[r].trim()==="";)r++;let s,o=t;if(r<n.length&&/^```yaml\s*$/.test(n[r])){let a=r;o=t+a,r++;let u=-1;for(;r<n.length;){if(/^```\s*$/.test(n[r])){u=r;break}r++}if(u===-1)throw new f("step-config fenced ```yaml block is not closed",e,o);let h=n.slice(a+1,u).join(`
8
- `);try{s=x(h)??{}}catch(I){throw new f(`invalid YAML in step config: ${I.message}`,e,o)}r=u+1}let i=he(n.slice(r)),d=i.filter(a=>a.trim()!=="");if(d.length>0&&/^@session\s+/.test(d[0].trim()))throw new f("@session is no longer supported (iteration 3); use @import instead",e,t);let l=/^@import\s+(\S.*)$/,p=i.filter(a=>l.test(a.trim())).length>0;if(p&&d.length!==1)throw new f("step body must be exactly one of prose / @import",e,t);let m=!1,g;if(s){if(C(e,s,p?"step config (ref)":"step config (objective)",o),p||B(e,s,o),typeof s.optional=="boolean")m=s.optional;else if(s.optional!==void 0)throw new f(`step config 'optional' must be boolean: got ${typeof s.optional}`,e,o);let a={...s};delete a.optional,Object.keys(a).length>0&&(g=a)}return p?{body:{kind:"import_ref",path:l.exec(d[0].trim())[1].trim()},optional:m}:{body:{kind:"objective",text:i.join(`
9
- `).trim()},config:g,optional:m}}function he(e){let t=0,n=e.length;for(;t<n&&e[t].trim()==="";)t++;for(;n>t&&e[n-1].trim()==="";)n--;return e.slice(t,n)}function B(e,t,n){let r=t.variables;if(r==null)return;if(typeof r!="object"||Array.isArray(r))throw new f("variables must be an object map",e,n);let s={};for(let[o,i]of Object.entries(r))if(typeof i=="string")s[o]={value:i};else if(i&&typeof i=="object"&&!Array.isArray(i)&&typeof i.value=="string")s[o]=i;else throw new f(`variable '${o}' must be a string or { value: ... } object`,e,n);t.variables=s}function C(e,t,n,r){for(let s of Object.keys(t)){if(pe.has(s))throw new f(`auth/identity keys are CLI-only: ${s}`,e,r);if(n==="frontmatter"){if(k.has(s))throw new f(`step-only key in frontmatter: ${s}`,e,r);if(!L.has(s))throw new f(`unknown config key: ${s}`,e,r)}else if(n==="step config (objective)"){if(!L.has(s)&&!k.has(s))throw new f(`unknown config key: ${s}`,e,r);if(ce.has(s))throw new f(`chrome config is global-only: ${s}`,e,r);if(ue.has(s))throw new f(`'${s}' is run-level and cannot be set per-step`,e,r)}else if(!k.has(s))throw new f(`step config on @import may only contain 'optional': got ${s}`,e,r)}}function A(e){let t=Re(e.resolvedTest,e.runByStep),n=new Map;for(let r of t.values()){let s=n.get(r.helperFile);s||(s=T(r.helperFile,Se(r.helperFile,"utf8")),n.set(r.helperFile,s));let o=[],i=!1;for(let l of s.steps){let c=l.index,p=r.resolvedSteps.filter(a=>a.trace[r.helperDepth].stepIndex===c);if(p.length===0){o.push({rootStepIndex:c,status:"skipped"});continue}let m=p[0].trace[0].stepIndex,g=e.outcomes.find(a=>a.rootStepIndex===m);if(!g){o.push({rootStepIndex:c,status:"skipped"});continue}if(l.body.kind==="objective"){let a=p[0],u=K(a,g);u==="failed"&&(i=!0);let h={rootStepIndex:c,status:u};u==="passed"&&(h.stepMd5=R(a)),o.push(h)}else{let a=!1,u=!1;for(let N of p){let P=K(N,g);P!=="skipped"&&(u=!0),P==="failed"&&(a=!0)}let h=a?"failed":u?"passed":"skipped";h==="failed"&&(i=!0);let I=b(p[0].trace.slice(0,r.helperDepth+2)),H=be(r.finalDir,I);o.push({rootStepIndex:c,status:h,refKind:"import",refLabel:l.body.path,inlinedCount:p.length,helperResultRelPath:`${H}/Result.md`})}}let d=i?"failed":"passed";v({sourcePath:r.helperFile,title:s.title,rootSteps:s.steps,outcomes:o,overallStatus:d,startedISO:e.startedISO,durationS:0,sessionId:e.sessionId,outPath:ye(r.stagingDir,"Result.md")})}}function Re(e,t){let n=new Map;for(let r of e.steps)if(t.has(r.flatIndex))for(let s=1;s<r.trace.length;s++){let o=r.trace.slice(0,s+1),i=b(o),d=n.get(i);d||(d={stagingDir:`${i}.staging`,finalDir:i,helperFile:o[s].file,helperDepth:s,resolvedSteps:[]},n.set(i,d)),d.resolvedSteps.push(r)}return n}function K(e,t){if(t.status==="passed")return"passed";if(t.status==="skipped")return"skipped";let n=e.trace.slice(1).map(o=>o.stepIndex),r=t.failedSubStepIndex??[],s=Math.min(n.length,r.length);for(let o=0;o<s;o++)if(n[o]!==r[o])return n[o]<r[o]?"passed":"skipped";return n.length===r.length?"failed":n.length<r.length?"passed":"skipped"}function et(e){let t=_(e.resolvedTest.rootPath);$(S(t,".internal"),{recursive:!0});let n=new Map;for(let s of e.stepRunRecords)n.set(s.testmdStepIndex,s);for(let s of e.resolvedTest.steps){let o=n.get(s.flatIndex);if(!o)continue;let i=s.trace[s.trace.length-1].stepIndex,d=R(s),l=d.slice(0,8),c;if(s.trace.length===1)c=S(t,".internal","steps",`${i}-${l}`);else{let p=`${b(s.trace)}.staging`;$(S(p,".internal"),{recursive:!0}),c=S(p,".internal","steps",`${i}-${l}`)}if($(c,{recursive:!0}),D({sessionDir:e.sessionDir,runIndex:o.runIndex,totalRunDirs:o.totalRunDirs,stagingStepDir:c}),s.trace.length===1){let p=s.trace[0].stepIndex,m=e.outcomes.find(g=>g.rootStepIndex===p);m&&m.stepMd5==null&&(m.stepMd5=d)}}A({resolvedTest:e.resolvedTest,outcomes:e.outcomes,startedISO:e.startedISO,sessionId:e.sessionId,runByStep:n}),v({sourcePath:e.resolvedTest.rootPath,title:e.resolvedTest.rootTitle,rootSteps:e.resolvedTest.rootSteps,outcomes:e.outcomes,overallStatus:e.overallStatus,startedISO:e.startedISO,durationS:e.durationS,sessionId:e.sessionId,outPath:S(t,"Result.md")});let r={};if(e.commitId&&(r.commit_id=e.commitId),e.tmsIds.testId&&(r.test_id=e.tmsIds.testId),e.tmsIds.testcaseId&&(r.testcase_id=e.tmsIds.testcaseId),e.tmsIds.projectId&&(r.project_id=e.tmsIds.projectId),e.tmsIds.folderId&&(r.folder_id=e.tmsIds.folderId),e.tmsIds.orgId&&(r.org_id=e.tmsIds.orgId),e.tmsIds.sessionName&&(r.session_name=e.tmsIds.sessionName),ve(S(t,".internal","meta.json"),JSON.stringify(r,null,2)+`
10
- `,"utf8"),e.codeExportDir){let s=e.codeExportLanguage??"python",o=S(t,`playwright-${s}-code`);try{E(e.codeExportDir,o)}catch(i){process.stderr.write(`warn: codegen copy failed: ${i.message}
11
- `)}}}export{R as a,v as b,Pe as c,b as d,E as e,T as f,et as g};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as A}from"./chunk-YCCUBQY4.js";import{a as _}from"./chunk-WZCGEQ6M.js";import{a as B}from"./chunk-JHNEE2MB.js";import{a as R}from"./chunk-PQGNWC33.js";import{a as P}from"./chunk-HCBYKLMW.js";import{t as c}from"./chunk-5XTLIGWL.js";import{a as u,b as l}from"./chunk-C44QQJR4.js";import{a as J}from"./chunk-6YGTRKDT.js";import{a as k}from"./chunk-7CLUJYMW.js";import{e as L}from"./chunk-UR6MHSHU.js";var t=L(J(),1);var e=L(P(),1);function X(n,s,y,m){return{id:n,label:`${s} (${n}) \xB7 ${y} tests`,isActive:n===m}}function W({resolver:n,projectId:s,currentFolderId:y,env:m,onSelect:x,onCancel:w}){let[I,M]=(0,t.useState)([]),[$,d]=(0,t.useState)(!0),[O,g]=(0,t.useState)(!1),[U,N]=(0,t.useState)(null),[p,b]=(0,t.useState)("list"),[S,v]=(0,t.useState)(""),[E,f]=(0,t.useState)(null),h=(0,t.useRef)(!1);(0,t.useEffect)(()=>{if(!n){N("Login first to browse folders"),d(!1);return}let o=new AbortController;return d(!0),g(!0),(async()=>{try{let r=n.cached??await n.resolve();if(!r){N("Login first to browse folders"),d(!1),g(!1);return}let a=B(m),T=new k(a.tmsBaseUrl,r.username,r.access_key),F=(async function*(){if(o.signal.aborted)return;let i=await T.listFolders(s);yield{page:1,folders:i,totalLoaded:i.length,done:!0}})();for await(let i of F){if(d(!1),i.totalLoaded===0){h.current=!0,b("naming"),g(!1);return}M(i.folders.map(C=>X(C.id,C.name,C.test_cases_count,y))),i.done&&g(!1)}}catch(r){if(r?.name==="AbortError")return;N(r instanceof Error?r.message:String(r)),d(!1),g(!1)}})(),()=>o.abort()},[n,s,y,m]);let D=(0,t.useCallback)(o=>{let r=o.trim();if(!r){f("Name cannot be empty");return}if(!s){f("No project selected \u2014 pick a project first");return}f(null),b("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 T=B(m),i=await new k(T.tmsBaseUrl,a.username,a.access_key).createFolder(s,r);x(i.id,i.name)}catch(a){f(a instanceof Error?a.message:String(a)),b("naming")}})()},[n,s,m,x]),H=(0,t.useCallback)(()=>{v(""),f(null),h.current?w():b("list")},[w]);return p==="naming"||p==="creating"?(0,e.jsxs)(u,{flexDirection:"column",borderStyle:"round",borderColor:c.primary,paddingX:2,paddingY:1,children:[(0,e.jsx)(l,{color:c.primary,bold:!0,children:"Create new folder"}),h.current&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.dim,children:"No folders yet \u2014 let's create one."})}),(0,e.jsxs)(u,{marginTop:1,children:[(0,e.jsx)(l,{color:c.dim,children:"Name: "}),p==="naming"?(0,e.jsx)(A,{value:S,onChange:o=>{v(o),E&&f(null)},onSubmit:D,onCancel:H}):(0,e.jsx)(l,{children:S})]}),E&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.red,children:E})}),p==="creating"&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.dim,children:"Creating..."})}),p==="naming"&&(0,e.jsx)(R,{bindings:[{keys:"\u21B5",label:"create"}],escBackLabel:h.current?"cancel":"back"})]}):(0,e.jsx)(_,{title:"Folders",items:I,loading:$,loadingMore:O,preserveSelectionById:!0,error:U,itemNoun:"folders",onTab:()=>{h.current=!1,b("naming")},extraHint:"tab to create new",onSelect:o=>{let r=o.label.split(" (")[0];x(o.id,r)},onCancel:w})}export{X as a,W as b};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as x}from"./chunk-HCBYKLMW.js";import{t as m}from"./chunk-5XTLIGWL.js";import{a as u,b as a,j as g}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as f}from"./chunk-UR6MHSHU.js";var T=f(b(),1);function k(n,t){if(!t)return n;let l=n.trim()||t;return`\x1B]8;;${t}\x07${l}\x1B]8;;\x07`}var r=f(x(),1);function $({shareableLink:n,testCaseLink:t,codeExportDir:l,recordedTestPath:s,outputDir:o,autoExit:p=!0}){let{exit:c}=g();(0,T.useEffect)(()=>{if(!p)return;let i=setTimeout(()=>c(),100);return()=>clearTimeout(i)},[c,p]);let e=[];return s&&e.push({label:"Test",url:s,linkUrl:`file://${s}`}),o&&e.push({label:"Output",url:o,linkUrl:`file://${o}`}),n&&e.push({label:"ShareLink",url:n}),t&&e.push({label:"TestCase",url:t}),l&&!o&&e.push({label:"CodeExport",url:l,linkUrl:`file://${l}`}),e.length===0?(0,r.jsx)(r.Fragment,{}):(0,r.jsx)(u,{flexDirection:"column",marginTop:1,marginLeft:1,children:e.map(i=>(0,r.jsxs)(u,{flexDirection:"column",marginBottom:1,children:[(0,r.jsxs)(a,{color:m.primary,children:[i.label,":"]}),(0,r.jsx)(a,{color:m.dim,children:k(i.url,i.linkUrl??i.url)})]},i.label))})}export{$ as a};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as B}from"./chunk-S3DAAAE5.js";import{a as h}from"./chunk-MJQ2EHSC.js";import{a as w}from"./chunk-HCBYKLMW.js";import{t as s}from"./chunk-5XTLIGWL.js";import{a as x,b as t,c as g,i as P,j as S}from"./chunk-C44QQJR4.js";import{a as C}from"./chunk-6YGTRKDT.js";import{e as T}from"./chunk-UR6MHSHU.js";var o=T(C(),1);var e=T(w(),1);function D({defaultName:i,onSubmit:c}){let[d,p]=(0,o.useState)("confirm"),[m,a]=(0,o.useState)(""),[f,u]=(0,o.useState)(null),l=(0,o.useMemo)(()=>m.trim()||i,[m,i]);return P((n,r)=>{if(d==="confirm"){if(n==="y"||n==="Y"){a(i),p("name");return}if(n==="n"||n==="N"||r.escape||r.ctrl&&n==="c"){c(null);return}if(r.return){c(i);return}return}if(r.return){if(!B(l)){u(`name "${l}" is invalid; allowed: letters, digits, underscore, hyphen`);return}c(l);return}if(r.escape||r.ctrl&&n==="c"){c(null);return}if(r.backspace||r.delete){a(v=>v.slice(0,-1)),u(null);return}n&&!r.ctrl&&!r.meta&&(a(v=>v+n),u(null))}),d==="confirm"?(0,e.jsx)(h,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsx)(t,{color:s.cyan,children:i})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[(0,e.jsx)(t,{color:s.dimmed,children:"enter \u2014 save with this name"}),(0,e.jsx)(t,{color:s.dimmed,children:"Y \u2014 edit name"}),(0,e.jsx)(t,{color:s.dimmed,children:"N/esc \u2014 discard session"})]})}):(0,e.jsx)(h,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsxs)(x,{children:[(0,e.jsx)(t,{color:s.cyan,children:m}),(0,e.jsx)(t,{inverse:!0,children:" "})]})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[f&&(0,e.jsx)(t,{color:s.red,children:f}),(0,e.jsx)(t,{color:s.dimmed,children:"enter \u2014 save \xB7 esc \u2014 discard"})]})})}function V(){return new Date().toISOString().slice(0,19).replace(/:/g,"-")}async function Y(i){return new Promise(c=>{function d(){let{exit:a}=S(),[f,u]=(0,o.useState)(!1);return(0,o.useEffect)(()=>{if(f){let l=setTimeout(()=>a(),50);return()=>clearTimeout(l)}},[f,a]),(0,e.jsx)(D,{defaultName:i,onSubmit:l=>{c(l),u(!0)}})}let{waitUntilExit:p,unmount:m}=g((0,e.jsx)(d,{}),{stdout:process.stderr,exitOnCtrlC:!1});p().then(()=>{try{m()}catch{}})})}export{D as a,V as b,Y as c};
@@ -1,3 +0,0 @@
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-KMTNMUVS.js";import"./chunk-5XTLIGWL.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
- `)}return{recordedTestPath:o,outputDir:s}}export{y as persistRecordedSession};
@@ -1,64 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
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
- `):process.stderr.write(`[replay-trace] ${d}${i}: AUTHOR (${s.reason})
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
- `)}function Qt(e,t){se(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
6
- `)}function Jt(e,t,r){se(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
7
- `)}function Xt(e,t){se(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
8
- `)}function er(){se(`[replay-trace] force-author (--author) \u2014 walker bypassed
9
- `)}function tr(e){se(`[replay-trace] cancelled at step ${e}
10
- `)}import{join as vr}from"path";function We(e){let t={objective:e.step.objective,model:"v16-alpha",width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,stream:!0,mode:"replay",replay:{recording_path:Yt(e.decision),step_label:e.step.objective},screenshot_dir:vr(e.sessionDir,"runs",String(e.runIndex)),run_id:"run",test_id:"test"};return e.forceNavigateUrl&&(t.url=e.forceNavigateUrl),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.sessionContext&&(t.session_context=e.sessionContext),t}async function rr(e){let t=ve(e.decisions),r=0,o=!1;for(;;){let s=e.session.snapshot(),d=e.accumulator.snapshot(),i=await e.runReplayPhase(t);if(i.cancelled)return o=!0,tr(i.failedAt??0),{authorBoundary:t,cancelledInPhase:o,shrinkCount:r};if(i.failedAt===null)return{authorBoundary:t,cancelledInPhase:o,shrinkCount:r};let R=zt({failedAt:i.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(R.kind==="fail")return{authorBoundary:-1,cancelledInPhase:o,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:o,shrinkCount:r};if(e.session.rollback(s),e.accumulator.rollback(d),R.kind==="complete-reauthor")return Xt(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:o,shrinkCount:r};r++,Jt(r,de.maxShrinks,R.newAuthorBoundary),t=R.newAuthorBoundary}}var Ir=60*1e3,nr="lock-heartbeat",oe=null;function Ze(e){oe===null&&(oe=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),Q(nr,()=>{oe!==null&&(clearInterval(oe),oe=null)}))}function Qe(){oe!==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 o=t.trace[0].stepIndex,s=this.outcomes.find(a=>a.rootStepIndex===o),d=this.resolved.rootSteps.find(a=>a.index===o),i=d.body.kind!=="objective";return i&&(s.refKind="import",s.refLabel=d.body.path,s.inlinedCount=(s.inlinedCount??0)+1,s.duration_s=(s.duration_s??0)+r.duration_s),r.status==="passed"?(i?s.status!=="failed"&&(s.status="passed"):(s.status="passed",s.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(s.softFailures=s.softFailures??[],s.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(s.status="failed",s.duration_s=i?s.duration_s:r.duration_s,s.failedSubStepIndex=i?t.trace.slice(1).map(a=>a.stepIndex):void 0,s.reason=r.reason,this.skipRoot=o,d.optional??!1?(s.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(o=>o.status==="failed"&&!o.softFailed)?"failed":"passed",r=this.outcomes.reduce((o,s)=>o+(s.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};import{writeFileSync as kr,mkdirSync as _r}from"fs";import{dirname as sr}from"path";function Je(e){let t=Se(e.sourcePath);try{_r(sr(t),{recursive:!0})}catch(o){return process.stderr.write(`
12
- \u26A0 Failed to create output directory.
13
- ${o.message}
14
- Path: ${sr(t)}
15
-
16
- `),t}let r={commit_id:e.commitId};e.testId!==void 0&&(r.test_id=e.testId),e.testcaseId!==void 0&&(r.testcase_id=e.testcaseId),e.projectId!==void 0&&(r.project_id=e.projectId),e.folderId!==void 0&&(r.folder_id=e.folderId),e.orgId!==void 0&&(r.org_id=e.orgId),e.sessionName!==void 0&&(r.session_name=e.sessionName);try{kr(t,JSON.stringify(r,null,2)+`
17
- `,"utf8")}catch(o){process.stderr.write(`
18
- \u26A0 Failed to write meta.json.
19
- ${o.message}
20
- Path: ${t}
21
-
22
- `)}return t}var Cr=()=>{};async function or(e,t,r){let o=t.log??Cr,s=e.session.testId??null,d=null,i=null,R=null;if(!r.localMode&&t.performUpload)try{d=await t.performUpload(),d?.success&&(d.testId&&(s=d.testId),d.testcaseId&&e.session.setTestcaseId(d.testcaseId))}catch(a){o("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(a)})}if(t.renderFeedbackPrompt)try{i=await t.renderFeedbackPrompt(),i&&s&&t.submitFeedback&&t.submitFeedback(s,i).catch(a=>{o("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(a)})})}catch(a){o("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(a)})}if(e.session.flushRecorder(),r.skipLocalWrites)o("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(a){o("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(a)})}try{Je({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:s??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(a){o("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(a)})}if(d?.codeExportDir)try{let a=e.tuiConfig.code_export?.language??"python";He(d.codeExportDir,Ve(r.sourcePath,"playwright",a))}catch(a){o("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(a)})}}else if(e.session.recorder?.lastWrittenPath){let a=e.session.recorder.lastWrittenPath,S=e.session.getFlows(),_=S.map((f,C)=>({index:C+1,heading:`Step ${C+1}`,headingLine:0,body:{kind:"objective",text:f.objective}})),I=S.map((f,C)=>({rootStepIndex:C+1,status:f.status==="passed"?"passed":f.status==="failed"?"failed":"skipped",duration_s:f.duration,reason:f.reason})),F=I.some(f=>f.status==="failed")?"failed":"passed";try{R=Be({sourcePath:a,title:e.session.sessionName??"Session",rootSteps:_,outcomes:I,overallStatus:F,startedISO:e.session.startedAt,durationS:I.reduce((f,C)=>f+(C.duration_s??0),0),sessionId:e.session.sessionId})}catch(f){o("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(f)})}try{Je({sourcePath:a,commitId:e.session.sessionId,testId:s??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(f){o("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(f)})}if(d?.codeExportDir)try{let f=e.tuiConfig.code_export?.language??"python";He(d.codeExportDir,Ve(a,"playwright",f))}catch(f){o("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(f)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${a} (renamed: ${e.session.sessionName}_test.md already existed)
23
- `)}try{t.runCleanup?.()}catch(a){o("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(a)})}try{await e.session.finish("complete")}catch(a){o("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(a)})}return{uploadResult:d,feedbackChoice:i,resultMdPath:R}}var _e=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function ns(e,t){let r=Ar(e);if(!Xe(r))return process.stderr.write(`error: file not found: ${r}
24
- `),2;qt(r);let o=!process.stdin.isTTY||!!t.agent,s=!1,d=o?n=>process.stdout.write(JSON.stringify(n)+`
25
- `):n=>{},i;try{i=Nt(r)}catch(n){return process.stderr.write(`error: ${n.message}
26
- `),2}if(i.steps.length===0)return process.stderr.write(`info: no steps in ${r}; nothing to run.
27
- `),0;let R=Pr(t),a=new ut,S=new ht,_=!!(t.username&&t.accessKey);await Vt({isInteractive:!!process.stdin.isTTY&&!t.agent&&!_,creds:a,config:S});let I=a.getActiveProfile()??"default",f=t.env??void 0??a.getDefaultEnv()??"prod",C=ne(f),w="v16-alpha",p;try{p=await Mt({creds:a,env:f,usernameFlag:t.username,accessKeyFlag:t.accessKey,log:()=>{}})}catch(n){return n instanceof Ge&&n.code==="not_authenticated"?process.stderr.write(`error: Not authenticated. Choose one:
28
- \u2022 Pass credentials inline: --username <user> --access-key <key>
29
- \u2022 Run 'kane-cli login --oauth' (browser-based)
30
- \u2022 Run 'kane-cli login --username <user> --access-key <key>'
31
- `):n instanceof Ge&&n.code==="refresh_failed"?process.stderr.write(`error: Token refresh failed. Run 'kane-cli login' to re-authenticate.
32
- `):process.stderr.write(`error: auth resolution failed: ${n.message}
33
- `),2}let 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
- `),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
- `),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
- `)}catch(n){process.stderr.write(`warn: could not auto-configure project/folder: ${n.message}
37
- KaneAI upload will be skipped for this run.
38
- `)}t.local?process.stderr.write(`info: --local \u2014 KaneAI upload skipped
39
- `):p.basicAuth?V||process.stderr.write(`warn: KaneAI upload skipped \u2014 no project configured.
40
- `):process.stderr.write(`warn: KaneAI upload skipped \u2014 TMS credentials could not be resolved.
41
- Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
42
- `);let ae=!t.local&&!!p.basicAuth&&V!=null;if(l.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:ae,lockHeld:x,isFirstRun:g.isFirstRun,hasAuth:g.hasAuth}),ae&&g.testId==null){let n=ne(f);try{let c=await Ut({tmsBaseUrl:n.tmsBaseUrl,auth:p.basicAuth,objective:i.steps[0].objective,url:"",projectId:V,folderId:he??"",hasCustomProfile:!!q.chrome_profile,log:(u,m,h,b)=>l.log(u,m,h,b)});c&&l.setTestId(c)}catch(c){process.stderr.write(`warn: ATM test creation failed: ${c.message}
43
- `)}}else g.testId&&l.setTestId(g.testId);let ge={};if(p.basicAuth&&!t.local&&(M.secretEntries.length>0||M.nonSecretEntries.length>0))try{ge=await At({variables:M,auth:p.basicAuth,orgId:String(p.resolvedCreds?.org_id??""),env:f,localMode:!!t.local,log:(n,c,u,m)=>l.log(n,c,u,m)})}catch(n){process.stderr.write(`warn: variable/secret push failed: ${n.message}
44
- `)}let xe=new Map;for(let[n,c]of M.nonSecretEntries)xe.set(n,c.value);let Pe=new Map;for(let[n,c]of M.secretEntries)Pe.set(n,c.value);async function Oe(n){if(!p.basicAuth||t.local)return;let c=[],u=[];for(let[h,b]of Object.entries(n))if(b.secret){if(Pe.get(h)===b.value)continue;u.push([h,b])}else{if(xe.get(h)===b.value)continue;c.push([h,b])}if(c.length===0&&u.length===0)return;let m=ne(f);if(c.length>0){let h=new kt(m.tmsBaseUrl,p.basicAuth.username,p.basicAuth.access_key);for(let[b,A]of c)try{let v=await h.upsertVariable({name:b,value:A.value});ge[b]=v.id,xe.set(b,A.value),l.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:b})}catch(v){l.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:b,error:String(v)})}}if(u.length>0){let h=new It(m.secretsBaseUrl);for(let[b,A]of u)try{await h.pushSecret({secretKey:b,secretValue:A.value,username:p.basicAuth.username,accessKey:p.basicAuth.access_key,orgId:String(p.resolvedCreds?.org_id??"")}),Pe.set(b,A.value),l.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:b})}catch(v){l.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:b,error:String(v)})}}}let le=fe?(n,c,u)=>{if(!(x||g.isFirstRun))return;let m=pe+c;St(l.sessionDir,m,n,fe,(h,b,A,v)=>l.log(h,b,A,v),u)}:void 0,it=i.rootTitle??i.rootSteps[0]?.heading??Er(r),ur=Object.keys(M.raw).length>0?Re(M.raw,it).objective:it;l.setFirstRun(ur,re);let W=new Ie(i),Fe=new Date().toISOString(),pr=Date.now(),fr=typeof t.maxSteps=="string"&&t.maxSteps!==""?parseInt(t.maxSteps,10):void 0;function at(n,c){let u=i.steps[n],m=ir(u.config,R),h=ie(X.raw,m.variables,u.objective);return Et({objective:h.objective,url:n===0?re:void 0,model:w,chrome:K,auth:p,sessionId:l.sessionId,runIndex:c,windowSize:{width:1920,height:1080},maxSteps:m.max_steps??fr??30,headless:q.headless??!1,variables:Object.keys(h.variables).length>0?h.variables:void 0,globalContext:m.global_context??rt,localContext:m.local_context??nt,sessionContext:l.getContext()})}function lt(n){let u=i.steps[n].trace[0].stepIndex,m=i.rootSteps.find(b=>b.index===u);i.steps.slice(0,n).some(b=>b.trace[0].stepIndex===u)||d({type:"test_md_step_start",step_index:u,heading:m.heading,ref:m.body.kind==="import_ref"?{kind:"import",label:m.body.path}:null})}function Te(n,c,u,m,h,b){let A=i.steps[n],v=A.trace[0].stepIndex,T=!i.steps.slice(n+1).some(k=>k.trace[0].stepIndex===v),O=u?.status==="passed"?"passed":"failed",j=u?.reason??h??void 0,L=u?.duration??b,{continueOverall:H}=W.recordStep(A,{status:O,duration_s:L,reason:j}),z=ir(A.config,R),G=ie(X.raw,z.variables,A.objective).objective;if(u){let k=ft(u,c,m);l.addRunResult(mt(u,G,c,k),u.total_runs)}else l.addRunResult({index:c,objective:G,status:O,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(T||!H){let k=W.snapshotOutcomes().find(y=>y.rootStepIndex===v);d({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(s)return{failedAt:c,cancelled:!0};let u=i.steps[c],m=g.decisions[c];if(m.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${c}
45
- `),{failedAt:c,cancelled:!1};let h=l.nextRunIndex();pe=h;let b=c===0?re:void 0,A={width:$.window_size.width,height:$.window_size.height},v=ie(X.raw,u.config.variables,u.objective),T=We({step:u,decision:m,chrome:K,auth:p,sessionId:l.sessionId,runIndex:h,sessionDir:l.sessionDir,windowSize:A,forceNavigateUrl:b,sessionContext:l.getContext(),variables:Object.keys(v.variables).length>0?v.variables:void 0});await Oe(v.raw),lt(c);let O=Date.now(),j=null,L=null;try{let k=Ne(T,{environment:f});Q("runner",()=>{Ue()&&(s=!0);try{k.cancel()}catch{}}),D?.setRunActive(!0);try{for await(let y of k.events){if(o&&process.stdout.write(JSON.stringify(y)+`
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
- `),!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
- `),!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-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
- 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-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
- `),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
- `),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
- `),{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.
55
- `),{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:null,isFirstRun:!1,hasAuth:p,canLock:U,lockAcquired:!1,abort:{exitCode:2}};if(C&&!p)return process.stderr.write(`error: --author requires authenticated credentials for the TMS API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
56
- `),{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:null,isFirstRun:!1,hasAuth:p,canLock:U,lockAcquired:!1,abort:{exitCode:2}};let g=null,x=!1;if(l){g=s;let B=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",P=await ar({tmsBaseUrl:o.tmsBaseUrl,testId:_,fromCommitId:I,newCommitId:g,basicAuth:w,onLockConflict:B});if(P==="ok")x=!0,Ze({baseUrl:Ce(o.tmsBaseUrl),testId:_,auth:Ae(w)});else{if(P==="abort")return{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:null,isFirstRun:!1,hasAuth:p,canLock:U,lockAcquired:!1,abort:{exitCode:2}};g=null}}return{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:g,isFirstRun:S==null,hasAuth:p,canLock:U,lockAcquired:x}}function Ce(e){return`${e}/kane-cli/v1`}function Ae(e){return{username:e.username,accessKey:e.access_key}}async function ar(e){let t=Ce(e.tmsBaseUrl),r=Ae(e.basicAuth),o={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},s=await Ke(o);if(s.ok)return"ok";if(!(s.reason==="concurrent"||s.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${s.reason} (HTTP ${s.httpStatus}): ${s.message}
57
- `),"abort";let i=s.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${i}; aborting (--on-lock-conflict fail)
58
- `),"abort";if(e.onLockConflict==="wait"){if(s.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
59
- `),"abort";for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
60
- `),await new Promise(a=>setTimeout(a,3e4));let R=await Ke(o);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
61
- `),"abort"}}return process.stderr.write(`[lock] ${i} \u2014 running in readonly mode (no commit)
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
- `),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-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,20 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
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
- Switch profiles with \`kane-cli profiles switch\` to act on it.
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
- `),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
- `)}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-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
- `),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
- `),0}async function Wt(t,r,i){let n=Y(t);if(!v(n))return process.stderr.write(`error: file not found: ${n}
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.
11
- This will remove '${n}' and '${W(n)}/'.
12
- `),2;let c=W(n);if(v(c))try{lt(c,{recursive:!0,force:!0})}catch(a){return process.stderr.write(`error: failed to remove ${c}: ${a.message}
13
- `),2}try{jt(n)}catch(a){return process.stderr.write(`error: failed to remove ${n}: ${a.message}
14
- `),2}return process.stderr.write(`removed ${n} and ${c}/
15
- `),0}async function Jt(t,r,i){let n=Y(t);if(!v(n))return process.stderr.write(`error: file not found: ${n}
16
- `),2;let e=L(n),o=q(e,i);if(o!==null)return o;if(!e?.testcase_id)return process.stderr.write("error: this test has not been synced to TMS \u2014 run `kane-cli testmd run` first.\n"),2;let c=new N().load(),a=r.language??c.code_export?.language;if(!a)return process.stderr.write(`error: --language not provided and no default in tui-config.
17
- `),2;let l=r.output??Z(n,"playwright",a),s=v(l);if(s&&!r.force){let f=!1;try{let{readdirSync:b}=await import("fs");f=b(l).length>0}catch{}if(f)return process.stderr.write(`reusing existing export at ${l}
18
- `),0}s&&r.force&&lt(l,{recursive:!0,force:!0});let u=new B,w=u.getDefaultEnv()??"prod",h;try{h=await U({creds:u,env:w,log:()=>{}})}catch(f){if(f instanceof J)return process.stderr.write("error: not authenticated. Run `kane-cli login` first.\n"),2;throw f}if(!h.basicAuth)return process.stderr.write("error: TMS basic auth could not be resolved. Run `kane-cli login` again.\n"),2;try{let f=G(w);await st({tmsBaseUrl:f.tmsBaseUrl,testcaseId:e.testcase_id,auth:h.basicAuth,language:a,framework:"playwright",skipValidation:c.code_export?.skip_validation??!0,outDir:l,log:()=>{}})}catch(f){return process.stderr.write(`error: code export failed: ${f.message}
19
- `),2}return process.stderr.write(`exported to ${l}
20
- `),0}export{q as assertOrgMatchOrExit,ut as metaMatchesOrg,L as readMetaIfExists,Pe as resolveCurrentOrgId,Wt as runDeleteAction,Jt as runExportAction,ve as runListAction,Nt as runListTui,Me as runStatusAction};