@testmuai/kane-cli 0.4.9 → 0.4.10

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 (75) hide show
  1. package/dist/{ChromeProfilePicker-BOTCHMXH.js → ChromeProfilePicker-EFEVOCWS.js} +1 -1
  2. package/dist/{CliFeedbackPrompt-BV4VVYOY.js → CliFeedbackPrompt-PPGJMKHQ.js} +1 -1
  3. package/dist/{CliUploadProgress-Y4H43W5T.js → CliUploadProgress-3GGOTLPQ.js} +1 -1
  4. package/dist/{ConfigView-JPBD47MS.js → ConfigView-Y7E4Q647.js} +1 -1
  5. package/dist/FolderPicker-LI5JKG2S.js +2 -0
  6. package/dist/{HelpView-ZZYE2TKZ.js → HelpView-KHQYGSD2.js} +1 -1
  7. package/dist/{InfoBox-3ZLQZGUE.js → InfoBox-BQ2QOIUP.js} +1 -1
  8. package/dist/{LinksBox-UYMOQGSW.js → LinksBox-DX6BJAX5.js} +1 -1
  9. package/dist/{ProfilesView-YUMYSOZ4.js → ProfilesView-X35WWM4L.js} +1 -1
  10. package/dist/{ProjectPicker-CJVGBY42.js → ProjectPicker-Y4A4UVHA.js} +1 -1
  11. package/dist/{SaveSessionPrompt-DFVUWTOK.js → SaveSessionPrompt-IS6HZSF4.js} +1 -1
  12. package/dist/SingleShotApp-RO25ZX2E.js +2 -0
  13. package/dist/{SummaryBox-3VIRYWQA.js → SummaryBox-47MHU37V.js} +1 -1
  14. package/dist/TestMdRunView-OXVWHOV3.js +2 -0
  15. package/dist/{WhoamiView-GMM4V7ZV.js → WhoamiView-KVIQCGRC.js} +1 -1
  16. package/dist/{changelog-FNJ4P2IF.js → changelog-S4ZLEQLC.js} +1 -1
  17. package/dist/{chunk-QMAHNXS6.js → chunk-53O3GMZR.js} +1 -1
  18. package/dist/{chunk-JHSSBES2.js → chunk-6ATKQYAL.js} +1 -1
  19. package/dist/{chunk-UVBE3JJV.js → chunk-7GOX44H7.js} +1 -1
  20. package/dist/{chunk-FTMJTGT4.js → chunk-AKLIPQVR.js} +1 -1
  21. package/dist/{chunk-QW5G7TX3.js → chunk-AT45XB6X.js} +2 -2
  22. package/dist/{chunk-7N5H4KTV.js → chunk-BQACGLXW.js} +1 -1
  23. package/dist/{chunk-MUZCEGJD.js → chunk-DMG5QABA.js} +1 -1
  24. package/dist/{chunk-IO3PBDKN.js → chunk-EQC7WE2O.js} +1 -1
  25. package/dist/{chunk-42WWGBRK.js → chunk-FKAXPYV7.js} +1 -1
  26. package/dist/{chunk-DKGNV3VP.js → chunk-G2GQ67DP.js} +1 -1
  27. package/dist/{chunk-6PBX7QI7.js → chunk-G3PWEKD7.js} +2 -2
  28. package/dist/{chunk-WKJY6TRR.js → chunk-GF44B552.js} +1 -1
  29. package/dist/{chunk-CLRWPXDJ.js → chunk-GSKA5DKJ.js} +1 -1
  30. package/dist/{chunk-JBOXYLDH.js → chunk-HPZREZKG.js} +1 -1
  31. package/dist/{chunk-VSJAOEBB.js → chunk-HUAOH2JK.js} +1 -1
  32. package/dist/{chunk-RJFHOZG6.js → chunk-IGZPQQFP.js} +1 -1
  33. package/dist/{chunk-YK63DTUC.js → chunk-IS62CNJW.js} +2 -2
  34. package/dist/{chunk-GBTPZGJB.js → chunk-IT66S24L.js} +1 -1
  35. package/dist/{chunk-FN6ZRV4C.js → chunk-JKLKZCJS.js} +1 -1
  36. package/dist/{chunk-7NTOV5DV.js → chunk-KJLOYIWT.js} +1 -1
  37. package/dist/{chunk-HPJP7NES.js → chunk-KKIFXAJY.js} +1 -1
  38. package/dist/chunk-LRKWPAGK.js +2 -0
  39. package/dist/{chunk-DXJ5FL25.js → chunk-NAAPNSZD.js} +1 -1
  40. package/dist/{chunk-AH36DUIX.js → chunk-NUGGT2XH.js} +1 -1
  41. package/dist/{chunk-WEPNJVBA.js → chunk-OHT5RY5E.js} +1 -1
  42. package/dist/{chunk-JQXARCVE.js → chunk-QC73LMAN.js} +1 -1
  43. package/dist/{chunk-UJDIXFEE.js → chunk-QSXYNJOW.js} +1 -1
  44. package/dist/{chunk-LZUTY7XS.js → chunk-RB2YKN77.js} +1 -1
  45. package/dist/{chunk-HYOST7EA.js → chunk-RQZCGHG7.js} +1 -1
  46. package/dist/{chunk-JO3QZB6D.js → chunk-SQOIKS77.js} +2 -2
  47. package/dist/{chunk-XA7UFTB7.js → chunk-UAYCLUUZ.js} +3 -3
  48. package/dist/{chunk-CY4HAOSP.js → chunk-UBN6J3ZA.js} +1 -1
  49. package/dist/{chunk-KLVCLGHX.js → chunk-VLWWDXBN.js} +1 -1
  50. package/dist/{chunk-SEU6OXMD.js → chunk-XCOU6AYD.js} +1 -1
  51. package/dist/{chunk-LJDFBQFR.js → chunk-XCYCX4TU.js} +1 -1
  52. package/dist/{chunk-2J3VB6DW.js → chunk-YAOWO2GE.js} +1 -1
  53. package/dist/{generate-headless-ZRRQT56R.js → generate-headless-ODYT3HT7.js} +2 -2
  54. package/dist/index.js +8 -8
  55. package/dist/{list-commands-M3JL6XBB.js → list-commands-PNYMVI6X.js} +1 -1
  56. package/dist/login-flow-FIYH6K4A.js +2 -0
  57. package/dist/{persist-recorded-session-3I4KMEXA.js → persist-recorded-session-OJPXI4HP.js} +1 -1
  58. package/dist/{recording-banner-P6EKDS2Y.js → recording-banner-3XTXU2VL.js} +1 -1
  59. package/dist/{require-project-folder-SEMMD3EG.js → require-project-folder-CFX6U6BZ.js} +1 -1
  60. package/dist/{run-test-md-PXG4RFDI.js → run-test-md-YWKVMQDJ.js} +3 -3
  61. package/dist/{skill-installer-SU52XOIT.js → skill-installer-GYYMVNE4.js} +1 -1
  62. package/dist/tcg-generate-KLY7QZY2.js +2 -0
  63. package/dist/testmd-actions-OUY5BOAV.js +2 -0
  64. package/dist/token-refresh-QCHKMPCM.js +2 -0
  65. package/dist/{validate-basic-EKSOPOMF.js → validate-basic-4YMRWYLS.js} +1 -1
  66. package/dist/{version-check-4K4JHG7B.js → version-check-GU2LS6NM.js} +1 -1
  67. package/package.json +6 -6
  68. package/dist/FolderPicker-M4RFRBYV.js +0 -2
  69. package/dist/SingleShotApp-IOEEYVGJ.js +0 -2
  70. package/dist/TestMdRunView-MRSDDMSF.js +0 -2
  71. package/dist/chunk-3UCNDPTN.js +0 -2
  72. package/dist/login-flow-DOAIDKIV.js +0 -2
  73. package/dist/tcg-generate-5T6S2E7L.js +0 -2
  74. package/dist/testmd-actions-N7VS4FS6.js +0 -2
  75. package/dist/token-refresh-LSHPT46T.js +0 -2
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as S}from"./chunk-JHSSBES2.js";import{x as o}from"./chunk-3UCNDPTN.js";import{a as R}from"./chunk-HCBYKLMW.js";import{a as x,b as c,j as y}from"./chunk-C44QQJR4.js";import{a as w}from"./chunk-6YGTRKDT.js";import{e as b}from"./chunk-UR6MHSHU.js";var T=b(w(),1);var i=b(R(),1);function L(e){let t=e.decisions.filter(l=>l.kind==="replay").length,r=e.decisions.filter(l=>l.kind==="author").length,d=e.outcomes.filter(l=>l.status==="passed").length,p=e.outcomes.filter(l=>l.status==="failed").length,f=e.outcomes.filter(l=>l.status==="skipped").length,a=o.green,n;e.cancelled||e.overallStatus==="interrupted"?(a=o.orange,n="CANCELLED"):e.overallStatus==="failed"?(a=o.red,n="FAILED"):n="PASSED";let s=`${n} \xB7 ${e.durationS}s \xB7 ${e.outcomes.length} steps (${d} passed, ${p} failed, ${f} skipped)`,k=`${t} replay \xB7 ${r} author`,C=e.retryTriggered,_="yes \u2014 run recovered after a replay miss",u,g=o.dim;if(e.cancelled)u="\u2013 not committed (cancellation)";else if(e.overallStatus==="failed")u="\u2013 not committed (run failed)",g=o.red;else if(!e.shouldCommit)e.isFirstRun?u="\u2013 not committed (first run skipped commit)":e.lockHeld?u="\u2013 not committed":u="\u2013 not committed (readonly fallback / no lock)";else{let l=e.uploadResult?.testcaseId;u=l?`\u2713 pushed (testcase=${l})`:"\u2713 pushed",g=o.green}let v=e.shouldReplaceLocalOutput?"output dir replaced":e.anyAuthorStepRan?"untouched (cancellation or no replace)":"untouched (replay-only)",m,h=o.dim;return e.shouldUploadArtifacts?e.uploadResult?.success?(m="\u2713 TMS",h=o.green):e.uploadResult?(m=`\u2717 failed${e.uploadResult.error?`: ${e.uploadResult.error}`:""}`,h=o.red):m="\u2013 not run":m="\u2013 skipped (--local or no auth)",{resultLine:{color:a,text:s},breakdown:k,showRetries:C,retriesText:_,commitText:u,commitColor:g,artifactsText:v,uploadText:m,uploadColor:h}}function O(e){let t=e.decisions.filter(s=>s.kind==="replay").length,r=e.decisions.filter(s=>s.kind==="author").length,d=e.outcomes.filter(s=>s.status==="passed").length,p=e.outcomes.filter(s=>s.status==="failed").length,f=e.outcomes.filter(s=>s.status==="skipped").length,a,n=!1;return e.cancelled?a="cancellation":e.overallStatus==="failed"?a="run_failed":e.shouldCommit&&e.uploadResult?.testcaseId?(a="ok",n=!0):!e.shouldCommit&&!e.lockHeld&&!e.isFirstRun?a="readonly_fallback":a="not_committed",{type:"test_md_summary",overall_status:e.overallStatus,duration_s:e.durationS,steps:{total:e.outcomes.length,passed:d,failed:p,skipped:f,replay_decisions:t,author_decisions:r},retries:{triggered:e.retryTriggered},commit:{committed:n,reason:a,...e.uploadResult?.testcaseId?{testcase_id:e.uploadResult.testcaseId}:{}},artifacts:{replaced:e.shouldReplaceLocalOutput},upload:{performed:e.shouldUploadArtifacts,...e.uploadResult?{succeeded:!!e.uploadResult.success}:{}},...e.shareUrl?{share_url:e.shareUrl}:{},cancelled:e.cancelled}}function A({data:e}){let t=L(e),r=[{label:"result",value:(0,i.jsx)(c,{color:t.resultLine.color,bold:!0,children:t.resultLine.text})},{label:"breakdown",value:(0,i.jsx)(c,{color:o.dim,children:t.breakdown})}];return t.showRetries&&r.push({label:"retries",value:(0,i.jsx)(c,{color:o.orange,children:t.retriesText})}),r.push({label:"commit",value:(0,i.jsx)(c,{color:t.commitColor,children:t.commitText})}),r.push({label:"artifacts",value:(0,i.jsx)(c,{color:o.dim,children:t.artifactsText})}),r.push({label:"upload",value:(0,i.jsx)(c,{color:t.uploadColor,children:t.uploadText})}),(0,i.jsx)(S,{title:"Run summary",titleColor:"#ff9500",rows:r})}function I({data:e}){let{exit:t}=y();return(0,T.useEffect)(()=>{let r=setTimeout(()=>t(),50);return()=>clearTimeout(r)},[t]),(0,i.jsx)(x,{flexDirection:"column",children:(0,i.jsx)(A,{data:e})})}export{L as a,O as b,A as c,I as d};
2
+ import{a as S}from"./chunk-6ATKQYAL.js";import{x as o}from"./chunk-LRKWPAGK.js";import{a as R}from"./chunk-HCBYKLMW.js";import{a as x,b as c,j as y}from"./chunk-C44QQJR4.js";import{a as w}from"./chunk-6YGTRKDT.js";import{e as b}from"./chunk-UR6MHSHU.js";var T=b(w(),1);var i=b(R(),1);function L(e){let t=e.decisions.filter(l=>l.kind==="replay").length,r=e.decisions.filter(l=>l.kind==="author").length,d=e.outcomes.filter(l=>l.status==="passed").length,p=e.outcomes.filter(l=>l.status==="failed").length,f=e.outcomes.filter(l=>l.status==="skipped").length,a=o.green,n;e.cancelled||e.overallStatus==="interrupted"?(a=o.orange,n="CANCELLED"):e.overallStatus==="failed"?(a=o.red,n="FAILED"):n="PASSED";let s=`${n} \xB7 ${e.durationS}s \xB7 ${e.outcomes.length} steps (${d} passed, ${p} failed, ${f} skipped)`,k=`${t} replay \xB7 ${r} author`,C=e.retryTriggered,_="yes \u2014 run recovered after a replay miss",u,g=o.dim;if(e.cancelled)u="\u2013 not committed (cancellation)";else if(e.overallStatus==="failed")u="\u2013 not committed (run failed)",g=o.red;else if(!e.shouldCommit)e.isFirstRun?u="\u2013 not committed (first run skipped commit)":e.lockHeld?u="\u2013 not committed":u="\u2013 not committed (readonly fallback / no lock)";else{let l=e.uploadResult?.testcaseId;u=l?`\u2713 pushed (testcase=${l})`:"\u2713 pushed",g=o.green}let v=e.shouldReplaceLocalOutput?"output dir replaced":e.anyAuthorStepRan?"untouched (cancellation or no replace)":"untouched (replay-only)",m,h=o.dim;return e.shouldUploadArtifacts?e.uploadResult?.success?(m="\u2713 TMS",h=o.green):e.uploadResult?(m=`\u2717 failed${e.uploadResult.error?`: ${e.uploadResult.error}`:""}`,h=o.red):m="\u2013 not run":m="\u2013 skipped (--local or no auth)",{resultLine:{color:a,text:s},breakdown:k,showRetries:C,retriesText:_,commitText:u,commitColor:g,artifactsText:v,uploadText:m,uploadColor:h}}function O(e){let t=e.decisions.filter(s=>s.kind==="replay").length,r=e.decisions.filter(s=>s.kind==="author").length,d=e.outcomes.filter(s=>s.status==="passed").length,p=e.outcomes.filter(s=>s.status==="failed").length,f=e.outcomes.filter(s=>s.status==="skipped").length,a,n=!1;return e.cancelled?a="cancellation":e.overallStatus==="failed"?a="run_failed":e.shouldCommit&&e.uploadResult?.testcaseId?(a="ok",n=!0):!e.shouldCommit&&!e.lockHeld&&!e.isFirstRun?a="readonly_fallback":a="not_committed",{type:"test_md_summary",overall_status:e.overallStatus,duration_s:e.durationS,steps:{total:e.outcomes.length,passed:d,failed:p,skipped:f,replay_decisions:t,author_decisions:r},retries:{triggered:e.retryTriggered},commit:{committed:n,reason:a,...e.uploadResult?.testcaseId?{testcase_id:e.uploadResult.testcaseId}:{}},artifacts:{replaced:e.shouldReplaceLocalOutput},upload:{performed:e.shouldUploadArtifacts,...e.uploadResult?{succeeded:!!e.uploadResult.success}:{}},...e.shareUrl?{share_url:e.shareUrl}:{},cancelled:e.cancelled}}function A({data:e}){let t=L(e),r=[{label:"result",value:(0,i.jsx)(c,{color:t.resultLine.color,bold:!0,children:t.resultLine.text})},{label:"breakdown",value:(0,i.jsx)(c,{color:o.dim,children:t.breakdown})}];return t.showRetries&&r.push({label:"retries",value:(0,i.jsx)(c,{color:o.orange,children:t.retriesText})}),r.push({label:"commit",value:(0,i.jsx)(c,{color:t.commitColor,children:t.commitText})}),r.push({label:"artifacts",value:(0,i.jsx)(c,{color:o.dim,children:t.artifactsText})}),r.push({label:"upload",value:(0,i.jsx)(c,{color:t.uploadColor,children:t.uploadText})}),(0,i.jsx)(S,{title:"Run summary",titleColor:"#ff9500",rows:r})}function I({data:e}){let{exit:t}=y();return(0,T.useEffect)(()=>{let r=setTimeout(()=>t(),50);return()=>clearTimeout(r)},[t]),(0,i.jsx)(x,{flexDirection:"column",children:(0,i.jsx)(A,{data:e})})}export{L as a,O as b,A as c,I as d};
@@ -1,2 +1,2 @@
1
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-2J3VB6DW.js";import{a as k}from"./chunk-LPUQ4HWQ.js";import{a as B}from"./chunk-HPJP7NES.js";import{a as R}from"./chunk-GBTPZGJB.js";import{x as c}from"./chunk-3UCNDPTN.js";import{a as P}from"./chunk-HCBYKLMW.js";import{a as u,b as l}from"./chunk-C44QQJR4.js";import{a as J}from"./chunk-6YGTRKDT.js";import{e as L}from"./chunk-UR6MHSHU.js";var t=L(J(),1);var e=L(P(),1);function X(n,i,y,m){return{id:n,label:`${i} (${n}) \xB7 ${y} tests`,isActive:n===m}}function W({resolver:n,projectId:i,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 s=await T.listFolders(i);yield{page:1,folders:s,totalLoaded:s.length,done:!0}})();for await(let s of F){if(d(!1),s.totalLoaded===0){h.current=!0,b("naming"),g(!1);return}M(s.folders.map(C=>X(C.id,C.name,C.test_cases_count,y))),s.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,i,y,m]);let D=(0,t.useCallback)(o=>{let r=o.trim();if(!r){f("Name cannot be empty");return}if(!i){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),s=await new k(T.tmsBaseUrl,a.username,a.access_key).createFolder(i,r);x(s.id,s.name)}catch(a){f(a instanceof Error?a.message:String(a)),b("naming")}})()},[n,i,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.orange,paddingX:2,paddingY:1,children:[(0,e.jsx)(l,{color:c.orange,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};
2
+ import{a as A}from"./chunk-YCCUBQY4.js";import{a as _}from"./chunk-YAOWO2GE.js";import{a as k}from"./chunk-LPUQ4HWQ.js";import{a as B}from"./chunk-KKIFXAJY.js";import{a as R}from"./chunk-IT66S24L.js";import{x as c}from"./chunk-LRKWPAGK.js";import{a as P}from"./chunk-HCBYKLMW.js";import{a as u,b as l}from"./chunk-C44QQJR4.js";import{a as J}from"./chunk-6YGTRKDT.js";import{e as L}from"./chunk-UR6MHSHU.js";var t=L(J(),1);var e=L(P(),1);function X(n,i,y,m){return{id:n,label:`${i} (${n}) \xB7 ${y} tests`,isActive:n===m}}function W({resolver:n,projectId:i,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 s=await T.listFolders(i);yield{page:1,folders:s,totalLoaded:s.length,done:!0}})();for await(let s of F){if(d(!1),s.totalLoaded===0){h.current=!0,b("naming"),g(!1);return}M(s.folders.map(C=>X(C.id,C.name,C.test_cases_count,y))),s.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,i,y,m]);let D=(0,t.useCallback)(o=>{let r=o.trim();if(!r){f("Name cannot be empty");return}if(!i){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),s=await new k(T.tmsBaseUrl,a.username,a.access_key).createFolder(i,r);x(s.id,s.name)}catch(a){f(a instanceof Error?a.message:String(a)),b("naming")}})()},[n,i,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.orange,paddingX:2,paddingY:1,children:[(0,e.jsx)(l,{color:c.orange,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,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as We}from"./chunk-7N5H4KTV.js";import{a as ue,b as Te}from"./chunk-MUZCEGJD.js";import{d as Ke,f as xe}from"./chunk-LOIRZFV3.js";import{a as Ue}from"./chunk-JHSSBES2.js";import{a as qe}from"./chunk-UJDIXFEE.js";import{b as Ge}from"./chunk-C6S4IEBC.js";import{x as l}from"./chunk-3UCNDPTN.js";import{a as D}from"./chunk-HCBYKLMW.js";import{a as u,b as s,i as Me,j as Ne,k as ye}from"./chunk-C44QQJR4.js";import{a as ce}from"./chunk-6YGTRKDT.js";import{e as k}from"./chunk-UR6MHSHU.js";var ee=k(ce(),1);var U=k(ce(),1);var A=k(ce(),1);function be(e,t){let r=null,a=(d,p)=>{for(let i=0;i<d.length;i++){let T=d[i],f=[...p,i];t(T)&&(r===null||f.length>r.length)&&(r=f),T.children&&T.children.length>0&&a(T.children,f)}};return a(e,[]),r}function Se(e,t,r){if(t.length===0)return[...e];let a=t[0],d=[...e],p=d[a];if(t.length===1)d[a]=r(p);else{let i=t.slice(1),T=Se(p.children??[],i,r);d[a]={...p,children:T}}return d}function _e(e){let t=e.indexOf(": ");return t>0&&t<15?e.slice(t+2):e}function Le(e){return e.map(t=>{let r=t.children?Le(t.children):t.children;return t.status==="running"?{...t,status:"stopped",phase:void 0,children:r}:r!==t.children?{...t,children:r}:t})}function He(e,t,r,a,d){let[p,i]=(0,A.useState)(!1),[T,f]=(0,A.useState)([]),[$,h]=(0,A.useState)(null),[M,N]=(0,A.useState)(null),[C,v]=(0,A.useState)(null),[I,E]=(0,A.useState)(null),[V,Q]=(0,A.useState)([]),[se,ie]=(0,A.useState)(null),[ne,ae]=(0,A.useState)(void 0),G=(0,A.useRef)(null),W=(0,A.useRef)(null),Y=(0,A.useRef)(0),me=(0,A.useRef)(!1),Re=(0,A.useCallback)(async(Z,b)=>{let y=G.current;if(y){try{await y.exited}catch{}G.current=null}f([]),h(null),N(null),v(null),E(null),Q([]),ie(null),ae(Z.max_steps),i(!0),W.current=null,Y.current=0;let x;try{x=We(Z,b)}catch(g){v(g instanceof Error?g.message:String(g)),i(!1);return}G.current=x,Ke("runner",()=>x.cancel()),(async()=>{me.current=!1;let g=!1;for await(let n of x.events){if(me.current)break;switch(n.type){case"run_start":if(n.child_id)break;if(W.current&&!W.current.isSingleFlow){let B=Y.current;Y.current++,f(O=>O.map((R,w)=>w===B?{...R,status:"running"}:R.status==="running"&&!R.children?.some(c=>c.status==="running")?{...R,status:R.children?.some(c=>c.status==="failed")?"failed":"passed"}:R))}break;case"bifurcation":{let B=n.flows??[],O=n.count??B.length,R={flows:B,isSingleFlow:n.is_single_flow??O<=1};E(R),W.current=R,Y.current=0,f(B.map((w,c)=>({index:c+1,objective:w??`Flow ${c+1}`,status:"pending"})));break}case"step_start":{t?.("STEP_START",`Step ${n.index} started`,{index:n.index,objective:n.objective,child_id:n.child_id});let B=n.index,O=n.objective??`Step ${B}`,R=n.child_id,w=W.current&&!W.current.isSingleFlow;if(R)f(c=>{let m=be(c,L=>L.branchChildId===R)??be(c,L=>L.status==="running");return m?Se(c,m,L=>{let F=(L.children??[]).map(H=>H.status==="running"&&H.childId===R?{...H,status:"stopped",phase:void 0}:H);return F.push({index:B,objective:O,status:"running",childId:R}),{...L,children:F}}):c});else if(w){let c=Math.max(0,Y.current-1);f(m=>{let L=[...m];if(c>=L.length)return m;let F={...L[c]},ge=[...F.children??[]].map(ve=>ve.status==="running"&&ve.childId===void 0?{...ve,status:"stopped",phase:void 0}:ve);return ge.push({index:B,objective:O,status:"running"}),F.children=ge,F.status="running",L[c]=F,L})}else f(c=>{let m=Le(c);return m.some(F=>F.index===B)?m.map(F=>F.index===B?{...F,status:"running",objective:O}:F):[...m,{index:B,objective:O,status:"running"}]});break}case"step_event":{t?.("STEP_EVENT",`Step ${n.index} ${n.event}`,{index:n.index,phase:n.event,action_type:n.action_type,detail:n.detail,child_id:n.child_id});let B=n.child_id,O=W.current&&!W.current.isSingleFlow;if(n.event==="cm_init"&&n.checkpoint_count!=null){Q(R=>[...R,n.checkpoint_count]);break}if(n.event==="replay_started"){ie({recordingLength:n.recording_length??0});break}if(n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&r?.(n.detail),B){let R=c=>{if(c.index!==n.index||c.childId!==B)return c;let m={phase:n.event};return n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(m.objective=n.detail),n.action_type&&(m.actionType=n.action_type),{...c,...m}},w=c=>c.map(m=>{let L=R(m);return L!==m?L:m.children&&m.children.length>0?{...m,children:w(m.children)}:m});f(c=>c.map(m=>m.children?{...m,children:w(m.children)}:m))}else if(O){let R=Math.max(0,Y.current-1);f(w=>{let c=[...w];if(R>=c.length)return w;let m={...c[R]},L=[...m.children??[]];if(!L.some(H=>H.index===n.index&&H.childId===void 0))L.push({index:n.index,objective:`Step ${n.index}`,status:"running",phase:n.event,actionType:n.action_type});else for(let H=0;H<L.length;H++){if(L[H].index!==n.index||L[H].childId!==void 0)continue;let ge={phase:n.event};n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(ge.objective=n.detail),n.action_type&&(ge.actionType=n.action_type),L[H]={...L[H],...ge}}return m.children=L,c[R]=m,c})}else f(R=>R.some(c=>c.index===n.index)?R.map(c=>{if(c.index!==n.index)return c;let m={phase:n.event};return n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(m.objective=n.detail),n.action_type&&(m.actionType=n.action_type),{...c,...m}}):[...Le(R),{index:n.index,objective:`Step ${n.index}`,status:"running",phase:n.event,actionType:n.action_type}]);break}case"step_end":{t?.("STEP_END",`Step ${n.index} ${n.status}`,{index:n.index,status:n.status,duration:n.duration,summary:n.summary,child_id:n.child_id}),a?.();let B=n.child_id,O=W.current&&!W.current.isSingleFlow;if(B){let R=c=>c.index===n.index&&c.childId===B?{...c,status:n.status,duration:n.duration,phase:void 0,objective:c.objective.startsWith("Step ")?_e(n.summary||c.objective):c.objective}:c,w=c=>c.map(m=>{let L=R(m);return L!==m?L:m.children&&m.children.length>0?{...m,children:w(m.children)}:m});f(c=>c.map(m=>m.children?{...m,children:w(m.children)}:m))}else if(O){let R=Math.max(0,Y.current-1);f(w=>{let c=[...w];if(R>=c.length)return w;let m={...c[R]},L=(m.children??[]).map(F=>F.index===n.index&&F.childId===void 0?{...F,status:n.status,duration:n.duration,phase:void 0,objective:F.objective.startsWith("Step ")?_e(n.summary||F.objective):F.objective}:F);return m.children=L,c[R]=m,c})}else f(R=>R.map(w=>w.index===n.index?{...w,status:n.status,duration:n.duration,phase:void 0,objective:w.objective.startsWith("Step ")?_e(n.summary||w.objective):w.objective}:w));{let w=W.current&&!W.current.isSingleFlow?Math.max(0,Y.current-1):0;e?.(n.index,w,n.child_id)}break}case"child_agent_start":{let B=n.objective??"",O=n.child_id;f(R=>{let w=be(R,c=>c.status==="running");return w?Se(R,w,c=>({...c,objective:`${B} (branch)`,phase:`child: ${B.slice(0,50)}`,branchObjective:B,branchChildId:O})):R});break}case"child_agent_end":{let B=n.child_id,O=`child ${n.success?"done":"failed"}`;f(R=>{let w=be(R,c=>c.branchChildId===B);return w?Se(R,w,c=>({...c,phase:O})):R.map(c=>c.phase?.startsWith("child:")?{...c,phase:O}:c)});break}case"describe_trigger":d?.(n);break;case"ask_user":h(n.question??"");break;case"run_end":f(B=>B.map(O=>O.status==="running"?{...O,status:n.status,phase:void 0}:O)),i(!1),N(n),g=!0;break;case"error":i(!1),v(n.message??"Runner error"),f(B=>B.map(O=>O.status==="running"?{...O,status:"failed",phase:void 0}:O));break}}let{code:S,signal:P}=await x.exited,_=x.stderr,le=S===0&&!P,oe=[];S!==null&&S!==0&&oe.push(`Runner exited with code ${S}`),P&&oe.push(`Runner killed by signal ${P}`),_&&(!le||!g?oe.push(_):b?.log?.("debug","RUNNER_STDERR_BENIGN","Runner stderr on clean exit",{stderr:_})),G.current===x&&(oe.length>0&&v(oe.join(`
2
+ import{b as We}from"./chunk-BQACGLXW.js";import{a as ue,b as Te}from"./chunk-DMG5QABA.js";import{d as Ke,f as xe}from"./chunk-LOIRZFV3.js";import{a as Ue}from"./chunk-6ATKQYAL.js";import{a as qe}from"./chunk-QSXYNJOW.js";import{b as Ge}from"./chunk-C6S4IEBC.js";import{x as l}from"./chunk-LRKWPAGK.js";import{a as D}from"./chunk-HCBYKLMW.js";import{a as u,b as s,i as Me,j as Ne,k as ye}from"./chunk-C44QQJR4.js";import{a as ce}from"./chunk-6YGTRKDT.js";import{e as k}from"./chunk-UR6MHSHU.js";var ee=k(ce(),1);var U=k(ce(),1);var A=k(ce(),1);function be(e,t){let r=null,a=(d,p)=>{for(let i=0;i<d.length;i++){let T=d[i],f=[...p,i];t(T)&&(r===null||f.length>r.length)&&(r=f),T.children&&T.children.length>0&&a(T.children,f)}};return a(e,[]),r}function Se(e,t,r){if(t.length===0)return[...e];let a=t[0],d=[...e],p=d[a];if(t.length===1)d[a]=r(p);else{let i=t.slice(1),T=Se(p.children??[],i,r);d[a]={...p,children:T}}return d}function _e(e){let t=e.indexOf(": ");return t>0&&t<15?e.slice(t+2):e}function Le(e){return e.map(t=>{let r=t.children?Le(t.children):t.children;return t.status==="running"?{...t,status:"stopped",phase:void 0,children:r}:r!==t.children?{...t,children:r}:t})}function He(e,t,r,a,d){let[p,i]=(0,A.useState)(!1),[T,f]=(0,A.useState)([]),[$,h]=(0,A.useState)(null),[M,N]=(0,A.useState)(null),[C,v]=(0,A.useState)(null),[I,E]=(0,A.useState)(null),[V,Q]=(0,A.useState)([]),[se,ie]=(0,A.useState)(null),[ne,ae]=(0,A.useState)(void 0),G=(0,A.useRef)(null),W=(0,A.useRef)(null),Y=(0,A.useRef)(0),me=(0,A.useRef)(!1),Re=(0,A.useCallback)(async(Z,b)=>{let y=G.current;if(y){try{await y.exited}catch{}G.current=null}f([]),h(null),N(null),v(null),E(null),Q([]),ie(null),ae(Z.max_steps),i(!0),W.current=null,Y.current=0;let x;try{x=We(Z,b)}catch(g){v(g instanceof Error?g.message:String(g)),i(!1);return}G.current=x,Ke("runner",()=>x.cancel()),(async()=>{me.current=!1;let g=!1;for await(let n of x.events){if(me.current)break;switch(n.type){case"run_start":if(n.child_id)break;if(W.current&&!W.current.isSingleFlow){let B=Y.current;Y.current++,f(O=>O.map((R,w)=>w===B?{...R,status:"running"}:R.status==="running"&&!R.children?.some(c=>c.status==="running")?{...R,status:R.children?.some(c=>c.status==="failed")?"failed":"passed"}:R))}break;case"bifurcation":{let B=n.flows??[],O=n.count??B.length,R={flows:B,isSingleFlow:n.is_single_flow??O<=1};E(R),W.current=R,Y.current=0,f(B.map((w,c)=>({index:c+1,objective:w??`Flow ${c+1}`,status:"pending"})));break}case"step_start":{t?.("STEP_START",`Step ${n.index} started`,{index:n.index,objective:n.objective,child_id:n.child_id});let B=n.index,O=n.objective??`Step ${B}`,R=n.child_id,w=W.current&&!W.current.isSingleFlow;if(R)f(c=>{let m=be(c,L=>L.branchChildId===R)??be(c,L=>L.status==="running");return m?Se(c,m,L=>{let F=(L.children??[]).map(H=>H.status==="running"&&H.childId===R?{...H,status:"stopped",phase:void 0}:H);return F.push({index:B,objective:O,status:"running",childId:R}),{...L,children:F}}):c});else if(w){let c=Math.max(0,Y.current-1);f(m=>{let L=[...m];if(c>=L.length)return m;let F={...L[c]},ge=[...F.children??[]].map(ve=>ve.status==="running"&&ve.childId===void 0?{...ve,status:"stopped",phase:void 0}:ve);return ge.push({index:B,objective:O,status:"running"}),F.children=ge,F.status="running",L[c]=F,L})}else f(c=>{let m=Le(c);return m.some(F=>F.index===B)?m.map(F=>F.index===B?{...F,status:"running",objective:O}:F):[...m,{index:B,objective:O,status:"running"}]});break}case"step_event":{t?.("STEP_EVENT",`Step ${n.index} ${n.event}`,{index:n.index,phase:n.event,action_type:n.action_type,detail:n.detail,child_id:n.child_id});let B=n.child_id,O=W.current&&!W.current.isSingleFlow;if(n.event==="cm_init"&&n.checkpoint_count!=null){Q(R=>[...R,n.checkpoint_count]);break}if(n.event==="replay_started"){ie({recordingLength:n.recording_length??0});break}if(n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&r?.(n.detail),B){let R=c=>{if(c.index!==n.index||c.childId!==B)return c;let m={phase:n.event};return n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(m.objective=n.detail),n.action_type&&(m.actionType=n.action_type),{...c,...m}},w=c=>c.map(m=>{let L=R(m);return L!==m?L:m.children&&m.children.length>0?{...m,children:w(m.children)}:m});f(c=>c.map(m=>m.children?{...m,children:w(m.children)}:m))}else if(O){let R=Math.max(0,Y.current-1);f(w=>{let c=[...w];if(R>=c.length)return w;let m={...c[R]},L=[...m.children??[]];if(!L.some(H=>H.index===n.index&&H.childId===void 0))L.push({index:n.index,objective:`Step ${n.index}`,status:"running",phase:n.event,actionType:n.action_type});else for(let H=0;H<L.length;H++){if(L[H].index!==n.index||L[H].childId!==void 0)continue;let ge={phase:n.event};n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(ge.objective=n.detail),n.action_type&&(ge.actionType=n.action_type),L[H]={...L[H],...ge}}return m.children=L,c[R]=m,c})}else f(R=>R.some(c=>c.index===n.index)?R.map(c=>{if(c.index!==n.index)return c;let m={phase:n.event};return n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(m.objective=n.detail),n.action_type&&(m.actionType=n.action_type),{...c,...m}}):[...Le(R),{index:n.index,objective:`Step ${n.index}`,status:"running",phase:n.event,actionType:n.action_type}]);break}case"step_end":{t?.("STEP_END",`Step ${n.index} ${n.status}`,{index:n.index,status:n.status,duration:n.duration,summary:n.summary,child_id:n.child_id}),a?.();let B=n.child_id,O=W.current&&!W.current.isSingleFlow;if(B){let R=c=>c.index===n.index&&c.childId===B?{...c,status:n.status,duration:n.duration,phase:void 0,objective:c.objective.startsWith("Step ")?_e(n.summary||c.objective):c.objective}:c,w=c=>c.map(m=>{let L=R(m);return L!==m?L:m.children&&m.children.length>0?{...m,children:w(m.children)}:m});f(c=>c.map(m=>m.children?{...m,children:w(m.children)}:m))}else if(O){let R=Math.max(0,Y.current-1);f(w=>{let c=[...w];if(R>=c.length)return w;let m={...c[R]},L=(m.children??[]).map(F=>F.index===n.index&&F.childId===void 0?{...F,status:n.status,duration:n.duration,phase:void 0,objective:F.objective.startsWith("Step ")?_e(n.summary||F.objective):F.objective}:F);return m.children=L,c[R]=m,c})}else f(R=>R.map(w=>w.index===n.index?{...w,status:n.status,duration:n.duration,phase:void 0,objective:w.objective.startsWith("Step ")?_e(n.summary||w.objective):w.objective}:w));{let w=W.current&&!W.current.isSingleFlow?Math.max(0,Y.current-1):0;e?.(n.index,w,n.child_id)}break}case"child_agent_start":{let B=n.objective??"",O=n.child_id;f(R=>{let w=be(R,c=>c.status==="running");return w?Se(R,w,c=>({...c,objective:`${B} (branch)`,phase:`child: ${B.slice(0,50)}`,branchObjective:B,branchChildId:O})):R});break}case"child_agent_end":{let B=n.child_id,O=`child ${n.success?"done":"failed"}`;f(R=>{let w=be(R,c=>c.branchChildId===B);return w?Se(R,w,c=>({...c,phase:O})):R.map(c=>c.phase?.startsWith("child:")?{...c,phase:O}:c)});break}case"describe_trigger":d?.(n);break;case"ask_user":h(n.question??"");break;case"run_end":f(B=>B.map(O=>O.status==="running"?{...O,status:n.status,phase:void 0}:O)),i(!1),N(n),g=!0;break;case"error":i(!1),v(n.message??"Runner error"),f(B=>B.map(O=>O.status==="running"?{...O,status:"failed",phase:void 0}:O));break}}let{code:S,signal:P}=await x.exited,_=x.stderr,le=S===0&&!P,oe=[];S!==null&&S!==0&&oe.push(`Runner exited with code ${S}`),P&&oe.push(`Runner killed by signal ${P}`),_&&(!le||!g?oe.push(_):b?.log?.("debug","RUNNER_STDERR_BENIGN","Runner stderr on clean exit",{stderr:_})),G.current===x&&(oe.length>0&&v(oe.join(`
3
3
  `)),i(!1),xe("runner","Event stream ended"),G.current=null)})().catch(g=>{let S=[`Runner event loop error: ${g}`];x.exitCode!==null&&x.exitCode!==0&&S.push(`Exit code: ${x.exitCode}`),x.exitSignal&&S.push(`Signal: ${x.exitSignal}`),x.stderr&&S.push(x.stderr),G.current===x&&(v(S.join(`
4
4
  `)),i(!1),xe("runner","Event loop error"),G.current=null)})},[e,t,r,a,d]),re=(0,A.useCallback)(Z=>{G.current?.sendUserResponse(Z),h(null)},[]),Ce=(0,A.useCallback)(()=>{let Z=G.current;Z&&(Z.sendCancel("user"),i(!1),h(null),setTimeout(()=>{G.current===Z&&(xe("runner","User cancelled run"),G.current=null)},5e3))},[]),Pe=(0,A.useCallback)(()=>{f([]),N(null),v(null)},[]);return(0,A.useEffect)(()=>()=>{me.current=!0,xe("runner","Component unmounted"),G.current=null},[]),{isRunning:p,steps:T,askingUser:$,lastRunEnd:M,runError:C,bifurcationInfo:I,cmInitCounts:V,replayInfo:se,maxSteps:ne,startRun:Re,sendAnswer:re,cancelRun:Ce,clearLastRun:Pe}}function Oe(e){let t=e.flatMap(p=>[p,...p.children??[]]),r=t.filter(p=>p.status==="passed").length,a=t.filter(p=>p.status==="failed").length,d=t.filter(p=>p.status==="passed"||p.status==="failed").length;return{passed:r,failed:a,total:d}}function Ve(e){let t=He(e.screenshotDispatcher,e.stepLogger,e.onReasoning,e.onStepComplete),[r,a]=(0,U.useState)(0),[d,p]=(0,U.useState)("idle"),i=(0,U.useRef)("idle"),T=(0,U.useRef)(0),f=(0,U.useRef)(!1),$=(0,U.useRef)(null),h=(0,U.useRef)(null),M=(0,U.useCallback)(v=>{i.current=v,p(v)},[]),N=(0,U.useCallback)(async v=>{let I=await e.getNextConfig(v);if(!I){M("done"),e.onAllComplete?.();return}let E=v?T.current+1:0;T.current=E,a(E),e.onStepStart?.(I,E),$.current=null,h.current=null,M("running"),await t.startRun(I,e.spawnOpts)},[t,e,M]);(0,U.useEffect)(()=>{f.current||(f.current=!0,N(null))},[]),(0,U.useEffect)(()=>{if(!t.lastRunEnd||t.lastRunEnd===$.current||i.current!=="running")return;$.current=t.lastRunEnd,i.current="transitioning",p("transitioning");let v=t.lastRunEnd,I=Oe(t.steps),E=t.bifurcationInfo,V={status:v.status==="passed"?"passed":"failed",duration_s:v.duration??0,reason:v.reason,runEnd:v,hadError:!1,stepsPassed:I.passed,stepsFailed:I.failed,stepsTotal:I.total,bifurcationFlows:E&&!E.isSingleFlow?E.flows:null};if(!(e.onStepEnd?.(V,T.current)??!0)){M("done"),e.onAllComplete?.();return}N(V)},[t.lastRunEnd]),(0,U.useEffect)(()=>{if(!t.runError||t.runError===h.current||t.lastRunEnd||i.current!=="running")return;h.current=t.runError,i.current="transitioning",p("transitioning");let v=Oe(t.steps),I={status:"failed",duration_s:0,reason:t.runError,runEnd:null,hadError:!0,stepsPassed:v.passed,stepsFailed:v.failed,stepsTotal:v.total,bifurcationFlows:null};if(!(e.onStepEnd?.(I,T.current)??!0)){M("done"),e.onAllComplete?.();return}N(I)},[t.runError,t.lastRunEnd]);let C=(0,U.useCallback)(()=>{t.cancelRun()},[t]);return{runner:t,currentStepIndex:r,phase:d,cancel:C}}var je=k(ce(),1);var Be=k(D(),1),ze=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function Xe({label:e,hasBifurcation:t=!1}){let[r,a]=(0,je.useState)(0),[d,p]=(0,je.useState)(0);ue(()=>{a(T=>(T+1)%ze.length)},80),ue(()=>{p(T=>(T+1)%4)},400);let i=e??(t?"Planning approach":"Analyzing objective");return(0,Be.jsxs)(u,{marginLeft:1,children:[(0,Be.jsxs)(s,{color:l.orange,children:[ze[r]," "]}),(0,Be.jsxs)(s,{color:l.dim,children:[i,".".repeat(d+1)]})]})}function Ye(e){if(!e.isRunning||e.replayInfo)return null;let t=e.bifurcationInfo;if(t&&!t.isSingleFlow){let r=e.steps.findIndex(d=>d.status==="running");return(r===-1?e.cmInitCounts.length===0:r>=e.cmInitCounts.length)?{label:r>0?`Planning flow ${r+1}`:void 0,hasBifurcation:!0}:null}return e.cmInitCounts.length>0||e.steps.some(r=>r.children?.length)?null:{hasBifurcation:!!t}}var q=k(ce(),1);var Qe=k(ce(),1);var we=k(D(),1),lt="#ffc580",ct="#ffd9a8",Je="#ffffff";function Ie({text:e,active:t=!0}){let[r,a]=(0,Qe.useState)(0),d=4;if(ue(()=>{a(i=>(i+1)%(e.length+d*2))},t?80:null),!t)return(0,we.jsx)(s,{color:Je,children:e});let p=e.split("").map((i,T)=>{let f=r-d,$=Math.abs(T-f-d/2),h;return $<=d/2?h=lt:$<=d?h=ct:h=Je,(0,we.jsx)(s,{color:h,children:i},T)});return(0,we.jsx)(s,{children:p})}var J=k(D(),1),ut={starting:l.orange,running:l.orange,passed:l.green,failed:l.red,cancelled:l.dim,timed_out:l.orange};function $e({currentStep:e,maxSteps:t,elapsed:r,status:a}){let d=ut[a]??l.orange,p=r<60?`${r.toFixed(1)}s`:`${Math.floor(r/60)}m ${Math.round(r%60)}s`;return(0,J.jsxs)(u,{marginLeft:3,children:[(0,J.jsx)(s,{color:l.dim,children:"Steps "}),(0,J.jsx)(s,{bold:!0,children:e}),(0,J.jsxs)(s,{color:l.dim,children:["/",t]}),(0,J.jsx)(s,{children:" "}),(0,J.jsx)(s,{color:l.dim,children:"Elapsed "}),(0,J.jsx)(s,{bold:!0,children:p}),(0,J.jsx)(s,{children:" "}),(0,J.jsx)(s,{color:l.dim,children:"Status "}),(0,J.jsx)(s,{bold:!0,color:d,children:a})]})}var dt={click:"\u25CF",type:"\u229E",scroll:"\u2195",navigate:"\u2192",analyze:"\u25CE",assert:"\u25C8","if-else":"\u2442",select:"\u25BC",press_key:"\u21B5",wait:"\u2026",tool_call:"\u2299"};function Ze(e){return dt[e]??"\u25CF"}var te=k(D(),1);function De({steps:e,flows:t,cmInitCounts:r,renderStep:a}){return(0,te.jsxs)(u,{flexDirection:"column",marginLeft:2,paddingLeft:1,children:[(0,te.jsxs)(s,{color:l.dim,children:["\u2501\u2501 Bifurcated into ",t?.length??e.length," flows \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501"]}),e.map((d,p)=>(0,te.jsxs)(u,{flexDirection:"column",marginTop:p>0?1:0,children:[(0,te.jsxs)(s,{color:l.orange,children:["Flow ",p+1,": ",t?.[p]??d.objective]}),r&&r[p]!=null&&(0,te.jsxs)(s,{color:l.dim,children:[" \u25AA Generated task with ",r[p]," checkpoints"]}),d.children&&d.children.length>0?d.children.map(i=>{let T=!!i.branchObjective,f=`f${p}-${i.childId??"p"}-${i.index}`;return T?(0,te.jsxs)(u,{flexDirection:"column",children:[a({...i,children:void 0},f),(i.children??[]).map($=>(0,te.jsx)(u,{marginLeft:2,children:a($,`${f}-${$.childId??"p"}-${$.index}`)},`${f}-${$.childId??"p"}-${$.index}`))]},`${f}-host`):a(i,f)}):d.status==="pending"&&(0,te.jsx)(s,{color:l.dim,children:" \u25CB Waiting..."})]},p))]})}var de=k(D(),1);function et({label:e,shimmer:t=!1}){return(0,de.jsxs)(u,{marginLeft:6,children:[(0,de.jsx)(Te,{}),(0,de.jsx)(s,{children:" "}),t?(0,de.jsx)(Ie,{text:e,active:!0}):(0,de.jsx)(s,{color:l.dim,children:e})]})}var tt=k(ce(),1);var Fe=k(D(),1);function pt(e,t){let r=[];for(let a of e.split(`
5
5
  `)){if(a===""){r.push("");continue}let d="";for(let p of a.split(" ")){let i=p;for(;i.length>t;)d&&(r.push(d),d=""),r.push(i.slice(0,t)),i=i.slice(t);d===""?d=i:d.length+1+i.length<=t?d+=" "+i:(r.push(d),d=i)}r.push(d)}return r}function nt({text:e,maxLines:t=3}){let{stdout:r}=ye(),a=Math.max(20,(r?.columns??80)-7),d=!e.trim(),[p,i]=(0,tt.useState)(!0);ue(()=>i($=>!$),500);let T=(d?"Thinking\u2026":e)+(p?"\u258C":" "),f=pt(T,a).slice(-t);for(;f.length<t;)f.push("");return(0,Fe.jsx)(u,{borderStyle:"round",borderColor:l.muted,paddingX:1,marginLeft:3,flexDirection:"column",children:f.map(($,h)=>(0,Fe.jsx)(s,{color:d?l.dim:l.secondary,wrap:"truncate-end",children:$.length?$:" "},h))})}var pe=k(D(),1);function Ee({activity:e,describe:t,describeVisible:r}){return(0,pe.jsxs)(pe.Fragment,{children:[e?(0,pe.jsx)(et,{label:e.label,shimmer:e.shimmer}):null,r?(0,pe.jsx)(nt,{text:t??""}):null]})}var o=k(D(),1);function ke(e){for(let t of e){if(t.children&&t.children.length>0){let r=ke(t.children);if(r)return r}if(t.status==="running")return t}}function he(e){return e.status==="running"&&!e.branchObjective&&(!e.children||e.children.length===0)}function rt(e){let t=[];for(let r of e)he(r)||(r.children&&r.children.length>0?t.push({...r,children:rt(r.children)}):t.push(r));return t}function Ae(e,t){if(!e)return null;let r=e.objective??"";return r.length>0&&!/^Step \d+$/.test(r)?{label:r+"\u2026",shimmer:!1}:{label:t?"Looking at the screen\u2026":"Deciding next action\u2026",shimmer:!0}}function K({step:e,indent:t=2}){let r=e.actionType?Ze(e.actionType):null,a=e.status==="running",d=e.status==="passed",p=e.status==="failed",i=e.status==="pending"||e.status==="stopped",{stdout:T}=ye(),f=T?.columns??80,$=Math.max(20,f-t-21),h=e.objective??"",M=h.length>$?h.slice(0,$-1)+"\u2026":h,N=(e.duration??0)*1e3,C=e.duration!=null?N<1e3?`${Math.round(N)}ms`:`${(N/1e3).toFixed(1)}s`:"";return(0,o.jsxs)(u,{flexDirection:"column",children:[(0,o.jsxs)(u,{marginLeft:t,children:[(0,o.jsx)(u,{width:4,children:(0,o.jsxs)(s,{color:l.muted,children:[String(e.index).padStart(2," ")," "]})}),(0,o.jsx)(u,{width:3,children:a?(0,o.jsx)(Te,{}):d?(0,o.jsx)(s,{color:l.green,bold:!0,children:"\u2713"}):p?(0,o.jsx)(s,{color:l.red,bold:!0,children:"\u2717"}):(0,o.jsx)(s,{color:l.muted,children:"\u25CB"})}),(0,o.jsx)(u,{flexGrow:1,children:a?(0,o.jsx)(Ie,{text:M,active:!0}):p?(0,o.jsx)(s,{color:l.red,children:M}):i?(0,o.jsx)(s,{color:l.dim,children:M}):(0,o.jsx)(s,{color:l.dim,children:M})}),(d||p)&&r?(0,o.jsx)(u,{width:3,marginLeft:1,children:(0,o.jsx)(s,{color:l.muted,children:r})}):(0,o.jsx)(u,{width:3,marginLeft:1}),(0,o.jsx)(u,{width:7,justifyContent:"flex-end",children:(0,o.jsx)(s,{color:l.dim,children:C})})]}),e.children&&e.children.length>0&&(0,o.jsx)(u,{flexDirection:"column",children:e.children.map((v,I)=>(0,o.jsx)(K,{step:v,indent:t+2},`child-${I}`))})]})}function ft(e){return e.type==="cm_init"?(0,o.jsx)(u,{marginLeft:2,paddingLeft:1,children:(0,o.jsxs)(s,{color:l.dim,children:["\u25AA Generated task with ",e.count," checkpoints"]})}):(0,o.jsx)(u,{marginLeft:2,paddingLeft:1,children:(0,o.jsx)(K,{step:e.step})})}function ot({steps:e,bifurcated:t,flows:r,cmInitCounts:a,maxSteps:d=50,staticSteps:p=!1,onStepCommit:i,describe:T,describeVisible:f,describeRevealing:$}){let h=(0,q.useRef)(new Set),M=(0,q.useRef)(!1),N=(0,q.useRef)(new Set),C=(0,q.useRef)(!1),v=(0,q.useRef)(new Set),I=(0,q.useRef)(0);(0,q.useEffect)(()=>{e.length===0&&I.current>0&&(h.current.clear(),M.current=!1,N.current.clear(),C.current=!1,v.current.clear()),I.current=e.length},[e.length]);let E=e.flatMap(b=>[b,...b.children??[]]),V=E.some(b=>b.status==="running"),Q=E.some(b=>b.status==="failed"),se=E.length===0||E.every(b=>b.status==="pending"),ie=E.filter(b=>b.status==="passed"||b.status==="failed").length,ne;se?ne="starting":V?ne="running":Q?ne="failed":ne="passed";let ae=(0,q.useRef)(null),[G,W]=(0,q.useState)(0);(0,q.useEffect)(()=>{E.length===0||se?(ae.current=null,W(0)):V&&ae.current==null&&(ae.current=Date.now())},[V,se,E.length]),(0,q.useEffect)(()=>{if(!V)return;let b=setInterval(()=>{ae.current!=null&&W((Date.now()-ae.current)/1e3)},500);return()=>clearInterval(b)},[V]);let Y=(0,q.useRef)(new Set),[,me]=(0,q.useState)(0),Re=(0,q.useRef)(!1);(0,q.useEffect)(()=>{if(!i||!p||t)return;let b=[];!Re.current&&a&&a[0]!=null&&(Re.current=!0,a[0]>0&&b.push({key:"cm_init_0",type:"cm_init",count:a[0]}));for(let y of e)(y.status==="passed"||y.status==="failed")&&!Y.current.has(y.index)&&(Y.current.add(y.index),b.push({key:`step_${y.index}`,type:"step",step:{...y,children:y.children?[...y.children]:void 0}}));if(b.length>0){for(let y of b)i(ft(y));me(y=>y+1)}},[e,t,a,p,i]),(0,q.useEffect)(()=>{if(!i||p)return;let b=h.current.size;if(!t&&!C.current&&a&&a[0]!=null&&(C.current=!0,a[0]>0&&i((0,o.jsx)(u,{marginLeft:2,children:(0,o.jsxs)(s,{color:l.dim,children:["\u25A0 Generated task with ",a[0]," checkpoints"]})}))),t&&r&&!M.current&&(M.current=!0,i((0,o.jsx)(s,{color:l.purple,children:"\u2501\u2501 Bifurcated into "+r.length+" flows \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501"}))),t){let y=e.flatMap((x,g)=>{let S=x.children??[];return!N.current.has(g)&&S.length>0&&(N.current.add(g),i((0,o.jsx)(s,{color:l.purple,children:" Flow "+(g+1)+": "+(r?.[g]??"")})),a?.[g]!=null&&a[g]>0&&!v.current.has(g)&&(v.current.add(g),i((0,o.jsx)(u,{marginLeft:2,children:(0,o.jsxs)(s,{color:l.dim,children:[" \u25AA Generated task with ",a[g]," checkpoints"]})})))),a?.[g]!=null&&a[g]>0&&N.current.has(g)&&!v.current.has(g)&&(v.current.add(g),i((0,o.jsx)(u,{marginLeft:2,children:(0,o.jsxs)(s,{color:l.dim,children:[" \u25AA Generated task with ",a[g]," checkpoints"]})}))),S});for(let x of y){let g=`${x.childId??"p"}-${x.index}-${x.objective}`;if(!!x.branchObjective){h.current.has(g)||(h.current.add(g),i((0,o.jsx)(u,{marginLeft:2,children:(0,o.jsx)(K,{step:{...x,children:void 0}})})));for(let P of x.children??[]){let _=`child-${x.childId??"p"}-${x.index}-${P.childId??"p"}-${P.index}-${P.objective}`;h.current.has(_)||(P.status==="passed"||P.status==="failed"||P.status==="stopped")&&(h.current.add(_),i((0,o.jsx)(u,{marginLeft:4,children:(0,o.jsx)(K,{step:P})})))}continue}h.current.has(g)||(x.status==="passed"||x.status==="failed"||x.status==="stopped")&&(h.current.add(g),i((0,o.jsx)(u,{marginLeft:2,children:(0,o.jsx)(K,{step:x})})))}}else for(let y of e){let x=`${y.index}-${y.objective}`,g=!!y.branchObjective;g&&!h.current.has(x)&&(h.current.add(x),i((0,o.jsx)(u,{marginLeft:2,children:(0,o.jsx)(K,{step:{...y,children:void 0}})})));for(let S of y.children??[]){let P=`child-${y.index}-${S.childId??"p"}-${S.index}-${S.objective}`;h.current.has(P)||(S.status==="passed"||S.status==="failed"||S.status==="stopped")&&(h.current.add(P),i((0,o.jsx)(u,{marginLeft:4,children:(0,o.jsx)(K,{step:S})})))}!g&&!h.current.has(x)&&(y.status==="passed"||y.status==="failed"||y.status==="stopped")&&(h.current.add(x),i((0,o.jsx)(u,{marginLeft:2,children:(0,o.jsx)(K,{step:{...y,children:void 0}})})))}h.current.size>b&&me(y=>y+1)},[e,i,t,r,a]);let re=[];if(p&&!t)for(let b of e)Y.current.has(b.index)||re.push(b);else if(i&&!p)if(t)for(let b of e){let y=b.children??[],x=[];for(let g of y){let S=`${g.childId??"p"}-${g.index}-${g.objective}`,P=h.current.has(S);if(g.branchObjective){let _=(g.children??[]).filter(le=>{let oe=`child-${g.childId??"p"}-${g.index}-${le.childId??"p"}-${le.index}-${le.objective}`;return!h.current.has(oe)});(!P||_.length>0)&&x.push({...g,children:_})}else P||x.push(g)}x.length>0&&re.push({...b,children:x})}else for(let b of e){let y=`${b.index}-${b.objective}`,x=h.current.has(y),g=(b.children??[]).filter(S=>{let P=`child-${b.index}-${S.childId??"p"}-${S.index}-${S.objective}`;return!h.current.has(P)});x?g.length>0&&re.push({...b,children:g}):re.push({...b,children:g})}if(!p){let b=i?re:e,y=ke(b),x=Ae(y,$);return(0,o.jsxs)(u,{flexDirection:"column",children:[t?i?b.length>0?(0,o.jsx)(u,{flexDirection:"column",marginLeft:2,paddingLeft:1,children:b.map((S,P)=>(0,o.jsx)(u,{flexDirection:"column",marginTop:P>0?1:0,children:S.children&&S.children.length>0?S.children.map(_=>{if(he(_))return null;let le=!!_.branchObjective,oe=`${_.childId??"p"}-${_.index}-${_.objective}`,n=h.current.has(oe);return le?(0,o.jsxs)(u,{flexDirection:"column",children:[!n&&(0,o.jsx)(K,{step:{..._,children:void 0}}),(_.children??[]).filter(B=>!he(B)).map(B=>(0,o.jsx)(u,{marginLeft:2,children:(0,o.jsx)(K,{step:B})},`f${P}-${_.index}-${B.childId??"p"}-${B.index}`))]},`f${P}-host-${_.childId??"p"}-${_.index}`):(0,o.jsx)(K,{step:_},`f${P}-${_.childId??"p"}-${_.index}`)}):S.status==="pending"&&(0,o.jsx)(s,{color:l.dim,children:" \u25CB Waiting..."})},P))}):null:(0,o.jsx)(De,{steps:e,flows:r,cmInitCounts:a,renderStep:(S,P)=>he(S)?null:(0,o.jsx)(K,{step:S},P)}):(0,o.jsxs)(u,{flexDirection:"column",marginLeft:2,paddingLeft:1,children:[!i&&a&&a[0]!=null&&(0,o.jsxs)(s,{color:l.dim,children:["\u25AA Generated task with ",a[0]," checkpoints"]}),b.filter(S=>!(S.status==="running"&&(!S.children||S.children.length===0))).map(S=>{let P=`${S.index}-${S.objective}`;return i&&h.current.has(P)?(0,o.jsx)(u,{flexDirection:"column",children:(S.children??[]).filter(_=>!he(_)).map(_=>(0,o.jsx)(u,{marginLeft:2,children:(0,o.jsx)(K,{step:_})},`${_.childId??"p"}-${_.index}`))},`branch-children-${S.index}`):(0,o.jsx)(K,{step:S},S.index)})]}),(0,o.jsx)(Ee,{activity:x,describe:T,describeVisible:f}),E.length>0&&(0,o.jsx)($e,{currentStep:ie,maxSteps:d,elapsed:G,status:ne})]})}if(t){let b=ke(e),y=Ae(b,$);return(0,o.jsxs)(u,{flexDirection:"column",children:[(0,o.jsx)(De,{steps:e,flows:r,cmInitCounts:a,renderStep:(x,g)=>he(x)?null:(0,o.jsx)(K,{step:x},g)}),(0,o.jsx)(Ee,{activity:y,describe:T,describeVisible:f}),E.length>0&&(0,o.jsx)($e,{currentStep:ie,maxSteps:d,elapsed:G,status:ne})]})}let Ce=ke(re),Pe=Ae(Ce,$),Z=rt(re);return(0,o.jsxs)(u,{flexDirection:"column",children:[Z.length>0&&(0,o.jsx)(u,{flexDirection:"column",marginLeft:2,paddingLeft:1,children:Z.map(b=>(0,o.jsx)(K,{step:b},b.index))}),(0,o.jsx)(Ee,{activity:Pe,describe:T,describeVisible:f}),E.length>0&&(0,o.jsx)($e,{currentStep:ie,maxSteps:d,elapsed:G,status:ne})]})}var fe=k(D(),1);function it({runner:e,runKey:t,onStepCommit:r}){let a=Ye({isRunning:e.isRunning,bifurcationInfo:e.bifurcationInfo,steps:e.steps,cmInitCounts:e.cmInitCounts,replayInfo:e.replayInfo});return(0,fe.jsxs)(fe.Fragment,{children:[a&&(0,fe.jsx)(Xe,{label:a.label,hasBifurcation:a.hasBifurcation}),e.isRunning&&e.steps.length>0&&(0,fe.jsx)(ot,{steps:e.steps,bifurcated:!!e.bifurcationInfo&&!e.bifurcationInfo.isSingleFlow,flows:e.bifurcationInfo?.flows,cmInitCounts:e.cmInitCounts,maxSteps:e.maxSteps,onStepCommit:r},`run-${t}`)]})}var z=k(D(),1),mt=64;function gt(e){return e.split(`
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as m}from"./chunk-LPUQ4HWQ.js";import{b as f,c as j}from"./chunk-VE3SUJMA.js";import{a as g}from"./chunk-HPJP7NES.js";var _="KaneAI Generated",E="Untitled";async function p(e){let r=e.config.load(),d=new m(g(e.env).tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key),l=e.projectName??_,o=e.folderName??E,t=r.project_id??null,s=r.project_name??null;if(!t){let a=(await d.listProjects()).find(n=>n.name===l);if(a)t=a.project_id,s=a.name,e.log("info","ENSURE_PROJECT_FOUND","Found default project",{project_id:t,name:s});else{let n=await d.createProject(l);t=n.id,s=n.name,e.log("info","ENSURE_PROJECT_CREATED","Created default project",{project_id:t,name:s})}f(e.creds,e.config,e.profile,e.env,{projectId:t,projectName:s})}let c=r.folder_id??null,i=r.folder_name??null,u=!r.project_id;if(!c||u){let a=(await d.listFolders(t)).find(n=>n.name===o);if(a)c=a.id,i=a.name,e.log("info","ENSURE_FOLDER_FOUND","Found default folder",{folder_id:c,name:i});else{let n=await d.createFolder(t,o);c=n.id,i=n.name,e.log("info","ENSURE_FOLDER_CREATED","Created default folder",{folder_id:c,name:i})}f(e.creds,e.config,e.profile,e.env,{folderId:c,folderName:i})}return{projectId:t,projectName:s??l,folderId:c,folderName:i??o}}function N(e,r,d){let l=e.loadProfileConfig(r,d)??{};return{projectId:l.project_id??null,folderId:l.folder_id??null}}function A(e,r){return e.projectId===null||e.folderId===null||r===null?"needs-picker":r.project==="ok"&&r.folder==="ok"?"ok":r.project==="error"&&r.folder==="error"?"ok-tms-degraded":"needs-picker"}var k=(e,r)=>`error: profile "${e}" (${r}) has no project/folder configured AND no TMS credentials were available to auto-configure one.
2
+ import{a as m}from"./chunk-LPUQ4HWQ.js";import{b as f,c as j}from"./chunk-VE3SUJMA.js";import{a as g}from"./chunk-KKIFXAJY.js";var _="KaneAI Generated",E="Untitled";async function p(e){let r=e.config.load(),d=new m(g(e.env).tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key),l=e.projectName??_,o=e.folderName??E,t=r.project_id??null,s=r.project_name??null;if(!t){let a=(await d.listProjects()).find(n=>n.name===l);if(a)t=a.project_id,s=a.name,e.log("info","ENSURE_PROJECT_FOUND","Found default project",{project_id:t,name:s});else{let n=await d.createProject(l);t=n.id,s=n.name,e.log("info","ENSURE_PROJECT_CREATED","Created default project",{project_id:t,name:s})}f(e.creds,e.config,e.profile,e.env,{projectId:t,projectName:s})}let c=r.folder_id??null,i=r.folder_name??null,u=!r.project_id;if(!c||u){let a=(await d.listFolders(t)).find(n=>n.name===o);if(a)c=a.id,i=a.name,e.log("info","ENSURE_FOLDER_FOUND","Found default folder",{folder_id:c,name:i});else{let n=await d.createFolder(t,o);c=n.id,i=n.name,e.log("info","ENSURE_FOLDER_CREATED","Created default folder",{folder_id:c,name:i})}f(e.creds,e.config,e.profile,e.env,{folderId:c,folderName:i})}return{projectId:t,projectName:s??l,folderId:c,folderName:i??o}}function N(e,r,d){let l=e.loadProfileConfig(r,d)??{};return{projectId:l.project_id??null,folderId:l.folder_id??null}}function A(e,r){return e.projectId===null||e.folderId===null||r===null?"needs-picker":r.project==="ok"&&r.folder==="ok"?"ok":r.project==="error"&&r.folder==="error"?"ok-tms-degraded":"needs-picker"}var k=(e,r)=>`error: profile "${e}" (${r}) has no project/folder configured AND no TMS credentials were available to auto-configure one.
3
3
 
4
4
  discover IDs:
5
5
  kane-cli projects list --search "<keyword>" --limit 10
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as R}from"./chunk-GBTPZGJB.js";import{x as r}from"./chunk-3UCNDPTN.js";import{a as Y}from"./chunk-HCBYKLMW.js";import{a,b as i,i as X}from"./chunk-C44QQJR4.js";import{a as G}from"./chunk-6YGTRKDT.js";import{e as P}from"./chunk-UR6MHSHU.js";var u=P(G(),1);var e=P(Y(),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:F,error:L=null,itemNoun:T="items",onSelect:H,onCancel:E,defaultActiveId:w,onTab:y,extraHint:N}=t,[x,d]=(0,u.useState)(0),[S,g]=(0,u.useState)(0),[s,A]=(0,u.useState)(""),[C,h]=(0,u.useState)(null);(0,u.useEffect)(()=>{if(c.length===0)return;if(t.preserveSelectionById&&C!==null){let n=c.findIndex(o=>o.id===C);if(n>=0){g(Math.floor(n/f)),d(n%f);return}}let l=w?c.findIndex(n=>n.id===w):c.findIndex(n=>n.isActive);l>=0?(g(Math.floor(l/f)),d(l%f),t.preserveSelectionById&&h(c[l].id)):t.preserveSelectionById&&(g(0),d(0),h(c[0]?.id??null))},[c,w,t.preserveSelectionById,C]),(0,u.useEffect)(()=>{if(!t.onSearch)return;let l=setTimeout(()=>t.onSearch(s),t.searchDebounceMs??250);return()=>clearTimeout(l)},[s,t.onSearch,t.searchDebounceMs]);let m=t.onSearch?c:K(c,s),M=S*f,p=Math.min(M+f,m.length),D=Math.ceil(m.length/f),O=p-M,v=m.slice(M,p);return X((l,n)=>{if(L){n.escape&&E();return}if(n.escape){s?(A(""),d(0),g(0)):E();return}if(n.tab&&y){y();return}if(n.upArrow){if(x>0){let o=x-1;d(o),t.preserveSelectionById&&h(v[o]?.id??null)}else if(S>0){let o=S-1,b=f-1;g(o),d(b),t.preserveSelectionById&&h(m[o*f+b]?.id??null)}return}if(n.downArrow){if(x<O-1){let o=x+1;d(o),t.preserveSelectionById&&h(v[o]?.id??null)}else if(S<D-1){let o=S+1,b=0;g(o),d(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)),d(0),g(0);return}l&&!n.ctrl&&!n.meta&&(A(o=>o+l),d(0),g(0))},{isActive:!B}),B?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.orange,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:r.orange,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(i,{color:r.secondary,children:F??`Loading ${T}\u2026`})})]}):L?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.red,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:r.red,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(i,{color:r.red,children:L})}),(0,e.jsx)(R,{bindings:[]})]}):(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.orange,paddingX:2,paddingY:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(i,{color:r.orange,bold:!0,children:I}),(0,e.jsxs)(i,{color:r.dim,children:[" (",m.length,!t.onSearch&&s?`/${c.length}`:""," ",T,t.loadingMore?" \xB7 loading more":"",")"]})]}),(0,e.jsxs)(a,{marginTop:1,children:[(0,e.jsx)(i,{color:r.secondary,children:s?"filter: ":""}),s?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(i,{children:s}),(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 "',s,'"']}):v.map((l,n)=>{let o=n===x,b=o?"\u276F ":" ",$=l.isActive?r.green:o?r.orange:void 0;return(0,e.jsxs)(i,{color:$,children:[b,l.label,l.isActive?" \u25CF selected":""]},l.id)})}),!t.searching&&D>1&&(0,e.jsx)(a,{marginTop:1,children:(0,e.jsxs)(i,{color:r.dim,children:["Page ",S+1,"/",D]})}),t.footer&&(0,e.jsx)(a,{marginTop:1,flexDirection:"column",children:t.footer}),(0,e.jsx)(R,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"type",label:"to search"},{keys:"\u21B5",label:"select"},...y&&N?[{keys:"tab",label:N}]:[]],escBackLabel:s?"clear":"back to chat"})]})}export{J as a};
2
+ import{a as R}from"./chunk-IT66S24L.js";import{x as r}from"./chunk-LRKWPAGK.js";import{a as Y}from"./chunk-HCBYKLMW.js";import{a,b as i,i as X}from"./chunk-C44QQJR4.js";import{a as G}from"./chunk-6YGTRKDT.js";import{e as P}from"./chunk-UR6MHSHU.js";var u=P(G(),1);var e=P(Y(),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:F,error:L=null,itemNoun:T="items",onSelect:H,onCancel:E,defaultActiveId:w,onTab:y,extraHint:N}=t,[x,d]=(0,u.useState)(0),[S,g]=(0,u.useState)(0),[s,A]=(0,u.useState)(""),[C,h]=(0,u.useState)(null);(0,u.useEffect)(()=>{if(c.length===0)return;if(t.preserveSelectionById&&C!==null){let n=c.findIndex(o=>o.id===C);if(n>=0){g(Math.floor(n/f)),d(n%f);return}}let l=w?c.findIndex(n=>n.id===w):c.findIndex(n=>n.isActive);l>=0?(g(Math.floor(l/f)),d(l%f),t.preserveSelectionById&&h(c[l].id)):t.preserveSelectionById&&(g(0),d(0),h(c[0]?.id??null))},[c,w,t.preserveSelectionById,C]),(0,u.useEffect)(()=>{if(!t.onSearch)return;let l=setTimeout(()=>t.onSearch(s),t.searchDebounceMs??250);return()=>clearTimeout(l)},[s,t.onSearch,t.searchDebounceMs]);let m=t.onSearch?c:K(c,s),M=S*f,p=Math.min(M+f,m.length),D=Math.ceil(m.length/f),O=p-M,v=m.slice(M,p);return X((l,n)=>{if(L){n.escape&&E();return}if(n.escape){s?(A(""),d(0),g(0)):E();return}if(n.tab&&y){y();return}if(n.upArrow){if(x>0){let o=x-1;d(o),t.preserveSelectionById&&h(v[o]?.id??null)}else if(S>0){let o=S-1,b=f-1;g(o),d(b),t.preserveSelectionById&&h(m[o*f+b]?.id??null)}return}if(n.downArrow){if(x<O-1){let o=x+1;d(o),t.preserveSelectionById&&h(v[o]?.id??null)}else if(S<D-1){let o=S+1,b=0;g(o),d(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)),d(0),g(0);return}l&&!n.ctrl&&!n.meta&&(A(o=>o+l),d(0),g(0))},{isActive:!B}),B?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.orange,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:r.orange,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(i,{color:r.secondary,children:F??`Loading ${T}\u2026`})})]}):L?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.red,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:r.red,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(i,{color:r.red,children:L})}),(0,e.jsx)(R,{bindings:[]})]}):(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.orange,paddingX:2,paddingY:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(i,{color:r.orange,bold:!0,children:I}),(0,e.jsxs)(i,{color:r.dim,children:[" (",m.length,!t.onSearch&&s?`/${c.length}`:""," ",T,t.loadingMore?" \xB7 loading more":"",")"]})]}),(0,e.jsxs)(a,{marginTop:1,children:[(0,e.jsx)(i,{color:r.secondary,children:s?"filter: ":""}),s?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(i,{children:s}),(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 "',s,'"']}):v.map((l,n)=>{let o=n===x,b=o?"\u276F ":" ",$=l.isActive?r.green:o?r.orange:void 0;return(0,e.jsxs)(i,{color:$,children:[b,l.label,l.isActive?" \u25CF selected":""]},l.id)})}),!t.searching&&D>1&&(0,e.jsx)(a,{marginTop:1,children:(0,e.jsxs)(i,{color:r.dim,children:["Page ",S+1,"/",D]})}),t.footer&&(0,e.jsx)(a,{marginTop:1,flexDirection:"column",children:t.footer}),(0,e.jsx)(R,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"type",label:"to search"},{keys:"\u21B5",label:"select"},...y&&N?[{keys:"tab",label:N}]:[]],escBackLabel:s?"clear":"back to chat"})]})}export{J as a};
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as T,f as P,g as $,h as G,j as N,k as M,l as B,m as I,n as L,o as U,p as F,r as z,s as C,t as _,u as O,v as K}from"./chunk-JQXARCVE.js";import{d as J}from"./chunk-VSJAOEBB.js";import{b as k}from"./chunk-FTMJTGT4.js";import{c as E}from"./chunk-DXJ5FL25.js";import"./chunk-L5LI2JF4.js";import{a as q}from"./chunk-QMAHNXS6.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import"./chunk-7N5H4KTV.js";import{d as x,e as A}from"./chunk-LOIRZFV3.js";import{g as H}from"./chunk-LJDFBQFR.js";import"./chunk-LPUQ4HWQ.js";import"./chunk-NLCCBXXV.js";import"./chunk-VE3SUJMA.js";import"./chunk-FN6ZRV4C.js";import{a as j}from"./chunk-LZUTY7XS.js";import"./chunk-RJFHOZG6.js";import{a as R}from"./chunk-HPJP7NES.js";import"./chunk-RZ4F3BHX.js";import"./chunk-3UCNDPTN.js";import"./chunk-UR6MHSHU.js";import{join as se}from"path";async function V(t){let e=t.projectId,n=t.folderId,r=null;if(!e&&t.autoResolve){let l=await t.resolver.resolve();if(!l)throw new $("unauthorized; run `kane-cli login`");let u=await H({creds:t.autoResolve.creds,config:t.autoResolve.config,profile:t.autoResolve.profile,env:t.autoResolve.envName,tmsCreds:{username:l.username,access_key:l.access_key},isLocal:!1,log:t.log});u.status==="ok"&&(e=u.projectId,n=n??u.folderId,u.autoDefaulted&&(r={projectId:u.autoDefaulted.projectId,projectName:u.autoDefaulted.projectName,folderId:u.autoDefaulted.folderId,folderName:u.autoDefaulted.folderName}))}return{baseUrl:`${t.env.testGeneratorBaseUrl}/test-generator/api/v2`,tmsBaseUrl:t.env.tmsBaseUrl,authResolver:t.resolver,projectId:e,folderId:n,suiteName:t.suiteName,autoDefaulted:r,log:t.log}}function Z(t){return t.reduce((e,n)=>e+(n.test_cases?.length??0),0)}var y=class{constructor(e=n=>process.stdout.write(n)){this.write=e}emit(e){this.write(JSON.stringify(e)+`
2
+ import{a as T,f as P,g as $,h as G,j as N,k as M,l as B,m as I,n as L,o as U,p as F,r as z,s as C,t as _,u as O,v as K}from"./chunk-QC73LMAN.js";import{d as J}from"./chunk-HUAOH2JK.js";import{b as k}from"./chunk-AKLIPQVR.js";import{c as E}from"./chunk-NAAPNSZD.js";import"./chunk-L5LI2JF4.js";import{a as q}from"./chunk-53O3GMZR.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import"./chunk-BQACGLXW.js";import{d as x,e as A}from"./chunk-LOIRZFV3.js";import{g as H}from"./chunk-XCYCX4TU.js";import"./chunk-LPUQ4HWQ.js";import"./chunk-NLCCBXXV.js";import"./chunk-VE3SUJMA.js";import"./chunk-JKLKZCJS.js";import{a as j}from"./chunk-RB2YKN77.js";import"./chunk-IGZPQQFP.js";import{a as R}from"./chunk-KKIFXAJY.js";import"./chunk-RZ4F3BHX.js";import"./chunk-LRKWPAGK.js";import"./chunk-UR6MHSHU.js";import{join as se}from"path";async function V(t){let e=t.projectId,n=t.folderId,r=null;if(!e&&t.autoResolve){let l=await t.resolver.resolve();if(!l)throw new $("unauthorized; run `kane-cli login`");let u=await H({creds:t.autoResolve.creds,config:t.autoResolve.config,profile:t.autoResolve.profile,env:t.autoResolve.envName,tmsCreds:{username:l.username,access_key:l.access_key},isLocal:!1,log:t.log});u.status==="ok"&&(e=u.projectId,n=n??u.folderId,u.autoDefaulted&&(r={projectId:u.autoDefaulted.projectId,projectName:u.autoDefaulted.projectName,folderId:u.autoDefaulted.folderId,folderName:u.autoDefaulted.folderName}))}return{baseUrl:`${t.env.testGeneratorBaseUrl}/test-generator/api/v2`,tmsBaseUrl:t.env.tmsBaseUrl,authResolver:t.resolver,projectId:e,folderId:n,suiteName:t.suiteName,autoDefaulted:r,log:t.log}}function Z(t){return t.reduce((e,n)=>e+(n.test_cases?.length??0),0)}var y=class{constructor(e=n=>process.stdout.write(n)){this.write=e}emit(e){this.write(JSON.stringify(e)+`
3
3
  `)}onStart(e){this.emit({type:"generate_start",request_id:e.requestId,objective_chars:e.objectiveChars,scenario_limit:e.scenarioLimit,per_scenario_limit:e.perScenarioLimit,is_refine:e.isRefine})}onUpload(e){this.emit({type:"generate_upload",file:e.file,index:e.index,total:e.total,status:e.status})}onThinking(e){this.emit({type:"generate_thinking",took_ms:e.tookMs})}onProgress(e){this.emit({type:"generate_progress",pct:e})}onSnapshot(e){this.emit({type:"generate_snapshot",scenario_count:e.scenarios.length,case_count:Z(e.scenarios),scenarios:e.scenarios})}onClarification(e){this.emit({type:"generate_clarification",text:e})}onChat(e){this.emit({type:"generate_chat",text:e})}onError(e){this.emit({type:"error",message:e})}onSaveResult(e){this.emit({type:"generate_save_result",suite_dir:e.suiteDir,saved:e.saved,fell_back:e.fellBack,...e.warning?{warning:e.warning}:{}})}onDone(e){this.emit({type:"generate_done",request_id:e.requestId,status:e.status,scenario_count:e.scenarioCount,case_count:e.caseCount,refine_hint:e.refineHint,save_hint:e.saveHint,...e.suiteDir?{suite_dir:e.suiteDir}:{}})}onUpdateAvailable(e){this.emit({type:"update_available",current:e.current,latest:e.latest,severity:e.severity})}},S=class{constructor(e=n=>process.stdout.write(n)){this.write=e}onStart(e){let n=e.isRefine?"Refining":"Generating";this.write(`${n} (request ${e.requestId})\u2026
4
4
  `)}onUpload(e){e.status==="uploading"&&this.write(` uploading ${e.file} (${e.index}/${e.total})
5
5
  `)}onThinking(e){let n=e.tookMs?` (${Math.round(e.tookMs/1e3)}s)`:"";this.write(` thinking${n}
@@ -16,6 +16,6 @@ import{a as T,f as P,g as $,h as G,j as N,k as M,l as B,m as I,n as L,o as U,p a
16
16
  `),this.write(` Save: ${e.saveHint}
17
17
  `),e.suiteDir&&this.write(` Saved: ${e.suiteDir}
18
18
  `)}onUpdateAvailable(e){this.write(`(update available: ${e.current} \u2192 ${e.latest})
19
- `)}};import{createHash as ee}from"crypto";function te(t){return ee("sha1").update(JSON.stringify({t:t.title,p:t.preconditions,m:t.manual_steps})).digest("hex")}function re(t){let e=[];for(let n of t.scenarios)for(let r of n.test_cases??[])I(r)&&r.manual_steps!=null&&e.push(r);return e}async function ne(t,e,n){let r=new Array(t.length),l=0,u=Array.from({length:Math.min(e,t.length)},async()=>{for(;;){let d=l++;if(d>=t.length)return;try{r[d]={ok:!0,value:await n(t[d])}}catch{r[d]={ok:!1}}}});return await Promise.all(u),r}async function Y(t,e,n){let r=re(t),l=n.run??(async(c,s)=>{let m=await n.resolveAuth(),o=U({objective:c,model:n.model,sessionId:n.sessionId,auth:m});return F(o,n.spawnOpts,s)}),u=r.map(te),d=[...new Set(u)],g=new Map;d.forEach(c=>{g.set(c,r[u.indexOf(c)])});let p=d.map(c=>g.get(c)),v=await ne(p,n.concurrency??3,c=>l(L(c))),i=new Map;d.forEach((c,s)=>{let m=v[s];m.ok&&i.set(c,m.value)});let f=new Map;r.forEach((c,s)=>{f.set(c.id,i.get(u[s]))});let a=0;for(let c of t.scenarios)for(let s of c.test_cases??[])I(s)&&!f.get(s.id)&&a++;let w=c=>{let s=f.get(c.id);return s?N(s,c):M(c)};return{...await B(t,e,{suiteName:n.suiteName,redirectBareCwd:!1},w),fellBack:a}}function Pe(t,e){let n=!!t.agent||!!t.refine||!!t.save||!e,r=t.agent?"agent":"plain";return{headless:n,mode:r}}function $e(t){return t.refine&&t.save?{error:"use --refine or --save, not both"}:t.save?t.objective?{error:"--save takes no objective; use --refine to add to a request"}:t.req?{op:"save"}:{error:"--save requires --req <id>"}:t.refine?t.req?t.objective?t.out?{error:"--out is only valid with --save"}:{op:"refine"}:{error:"--refine needs a refinement objective"}:{error:"--refine requires --req <id>"}:t.req?{error:"--req requires --refine or --save"}:t.out?{error:"--out is only valid with --save"}:t.objective?{op:"new"}:{error:"provide an objective, or use --refine/--save with --req"}}function ie(){return se(process.cwd(),".testmuai","tests")}function Ge(t){if(typeof t!="string")return;let e=t.split(",").map(n=>n.trim()).filter(Boolean);return e.length?e:void 0}var X="tcg-generate-headless";function Q(t){return{refineHint:`kane-cli generate "<refinement>" --refine --req ${t}`,saveHint:`kane-cli generate --save --req ${t}`}}function W(t){return t.scenarios.reduce((e,n)=>e+(n.test_cases?.length??0),0)}function oe(t){return t==="completed"?0:t==="stopped"?3:1}async function Ne(t,e){let n=e.write??(i=>process.stdout.write(i)),r=e.sink??(e.mode==="agent"?new y(n):new S(n)),l,u,d=null;try{let i=await e.makeClient();l=i.client,u=i.conn,d=i.autoDefaulted}catch(i){return r.onError(i.message),2}if(e.mode==="agent"&&d){let{buildAutoDefaultedNdjson:i}=await import("./require-project-folder-SEMMD3EG.js");n(i(d))}try{let i=await(e.checkUpdate??J)();i&&r.onUpdateAvailable(i)}catch{}let g=t.reqId??null;x(X,()=>{g&&l.cancel(g).catch(()=>{})});let p=process.cwd(),v={validate:e.validate??z,upload:e.upload??O,buildMappings:K,onUpload:i=>r.onUpload(i)};try{if(t.op==="save"){let s;try{s=(await l.attach(t.reqId)).state}catch(D){return r.onError(D.message),2}g=s.requestId,r.onSnapshot(s);let m=t.outDir??ie(),o=await e.materialize(s,m,t.suiteName);r.onSaveResult({suiteDir:o.suiteDir,saved:o.paths.length,fellBack:o.fellBack,warning:o.warning});let h=Q(s.requestId);return r.onDone({requestId:s.requestId,status:"completed",scenarioCount:s.scenarios.length,caseCount:W(s),refineHint:h.refineHint,saveHint:h.saveHint,suiteDir:o.suiteDir}),0}let i=t.op==="refine",f,a;if(i){let s;try{s=await l.attach(t.reqId)}catch(o){return r.onError(o.message),2}if(a=s.state,g=a.requestId,a.error)return r.onError(a.error),2;let m;try{m=await _({promptText:t.objective,filePaths:t.files??[],cwd:p,scenarios:a.scenarios,isRefine:!0,conn:u,deps:v})}catch(o){if(o instanceof C){for(let h of o.errors)r.onError(h);return 2}return r.onError(o.message),2}for(let o of m.warnings)process.stderr.write(`warning: ${o}
19
+ `)}};import{createHash as ee}from"crypto";function te(t){return ee("sha1").update(JSON.stringify({t:t.title,p:t.preconditions,m:t.manual_steps})).digest("hex")}function re(t){let e=[];for(let n of t.scenarios)for(let r of n.test_cases??[])I(r)&&r.manual_steps!=null&&e.push(r);return e}async function ne(t,e,n){let r=new Array(t.length),l=0,u=Array.from({length:Math.min(e,t.length)},async()=>{for(;;){let d=l++;if(d>=t.length)return;try{r[d]={ok:!0,value:await n(t[d])}}catch{r[d]={ok:!1}}}});return await Promise.all(u),r}async function Y(t,e,n){let r=re(t),l=n.run??(async(c,s)=>{let m=await n.resolveAuth(),o=U({objective:c,model:n.model,sessionId:n.sessionId,auth:m});return F(o,n.spawnOpts,s)}),u=r.map(te),d=[...new Set(u)],g=new Map;d.forEach(c=>{g.set(c,r[u.indexOf(c)])});let p=d.map(c=>g.get(c)),v=await ne(p,n.concurrency??3,c=>l(L(c))),i=new Map;d.forEach((c,s)=>{let m=v[s];m.ok&&i.set(c,m.value)});let f=new Map;r.forEach((c,s)=>{f.set(c.id,i.get(u[s]))});let a=0;for(let c of t.scenarios)for(let s of c.test_cases??[])I(s)&&!f.get(s.id)&&a++;let w=c=>{let s=f.get(c.id);return s?N(s,c):M(c)};return{...await B(t,e,{suiteName:n.suiteName,redirectBareCwd:!1},w),fellBack:a}}function Pe(t,e){let n=!!t.agent||!!t.refine||!!t.save||!e,r=t.agent?"agent":"plain";return{headless:n,mode:r}}function $e(t){return t.refine&&t.save?{error:"use --refine or --save, not both"}:t.save?t.objective?{error:"--save takes no objective; use --refine to add to a request"}:t.req?{op:"save"}:{error:"--save requires --req <id>"}:t.refine?t.req?t.objective?t.out?{error:"--out is only valid with --save"}:{op:"refine"}:{error:"--refine needs a refinement objective"}:{error:"--refine requires --req <id>"}:t.req?{error:"--req requires --refine or --save"}:t.out?{error:"--out is only valid with --save"}:t.objective?{op:"new"}:{error:"provide an objective, or use --refine/--save with --req"}}function ie(){return se(process.cwd(),".testmuai","tests")}function Ge(t){if(typeof t!="string")return;let e=t.split(",").map(n=>n.trim()).filter(Boolean);return e.length?e:void 0}var X="tcg-generate-headless";function Q(t){return{refineHint:`kane-cli generate "<refinement>" --refine --req ${t}`,saveHint:`kane-cli generate --save --req ${t}`}}function W(t){return t.scenarios.reduce((e,n)=>e+(n.test_cases?.length??0),0)}function oe(t){return t==="completed"?0:t==="stopped"?3:1}async function Ne(t,e){let n=e.write??(i=>process.stdout.write(i)),r=e.sink??(e.mode==="agent"?new y(n):new S(n)),l,u,d=null;try{let i=await e.makeClient();l=i.client,u=i.conn,d=i.autoDefaulted}catch(i){return r.onError(i.message),2}if(e.mode==="agent"&&d){let{buildAutoDefaultedNdjson:i}=await import("./require-project-folder-CFX6U6BZ.js");n(i(d))}try{let i=await(e.checkUpdate??J)();i&&r.onUpdateAvailable(i)}catch{}let g=t.reqId??null;x(X,()=>{g&&l.cancel(g).catch(()=>{})});let p=process.cwd(),v={validate:e.validate??z,upload:e.upload??O,buildMappings:K,onUpload:i=>r.onUpload(i)};try{if(t.op==="save"){let s;try{s=(await l.attach(t.reqId)).state}catch(D){return r.onError(D.message),2}g=s.requestId,r.onSnapshot(s);let m=t.outDir??ie(),o=await e.materialize(s,m,t.suiteName);r.onSaveResult({suiteDir:o.suiteDir,saved:o.paths.length,fellBack:o.fellBack,warning:o.warning});let h=Q(s.requestId);return r.onDone({requestId:s.requestId,status:"completed",scenarioCount:s.scenarios.length,caseCount:W(s),refineHint:h.refineHint,saveHint:h.saveHint,suiteDir:o.suiteDir}),0}let i=t.op==="refine",f,a;if(i){let s;try{s=await l.attach(t.reqId)}catch(o){return r.onError(o.message),2}if(a=s.state,g=a.requestId,a.error)return r.onError(a.error),2;let m;try{m=await _({promptText:t.objective,filePaths:t.files??[],cwd:p,scenarios:a.scenarios,isRefine:!0,conn:u,deps:v})}catch(o){if(o instanceof C){for(let h of o.errors)r.onError(h);return 2}return r.onError(o.message),2}for(let o of m.warnings)process.stderr.write(`warning: ${o}
20
20
  `);r.onStart({requestId:a.requestId,objectiveChars:m.promptText.length,scenarioLimit:t.scenarioLimit,perScenarioLimit:t.perScenarioLimit,isRefine:!0});try{await l.chat(t.reqId,m.promptText,{mappings:m.mappings,attachments:m.attachments})}catch(o){return r.onError(o.message),2}f=s.events}else{let s;try{s=await _({promptText:t.objective,filePaths:t.files??[],cwd:p,scenarios:[],isRefine:!1,conn:u,deps:v})}catch(o){if(o instanceof C){for(let h of o.errors)r.onError(h);return 2}return r.onError(o.message),2}for(let o of s.warnings)process.stderr.write(`warning: ${o}
21
21
  `);let m;try{m=await l.start({prompt:s.promptText,attachments:s.attachments,scenarioLimit:t.scenarioLimit,perScenarioLimit:t.perScenarioLimit,memoryEnhancement:t.memory})}catch(o){return r.onError(o.message),2}a=m.state,g=a.requestId,r.onStart({requestId:a.requestId,objectiveChars:s.promptText.length,scenarioLimit:t.scenarioLimit,perScenarioLimit:t.perScenarioLimit,isRefine:!1}),f=m.events}let w="";for await(let s of f){switch(a=P(a,s),s.type){case"thinking_done":r.onThinking({tookMs:s.tookMs});break;case"progress":r.onProgress(s.pct);break;case"clarification":r.onClarification(s.text);break;case"chat":r.onChat(s.text);break;case"error":r.onError(s.message);break;case"done":w=s.status;break;default:break}if(s.type==="done"||s.type!=="thinking"&&a.status&&T(a.status))break}r.onSnapshot(a);let b=w||a.status||"completed",c=Q(a.requestId);return r.onDone({requestId:a.requestId,status:b,scenarioCount:a.scenarios.length,caseCount:W(a),refineHint:c.refineHint,saveHint:c.saveHint,suiteDir:void 0}),oe(b)}finally{A(X)}}var ae=()=>{};async function Me(t){let e=new j,n=new q,r=e.getActiveProfile()??"default",l=t.env??e.getDefaultEnv()??"prod",u=R(l),d=new E;t.name&&d.setSessionName(t.name);let g=n.load().model,p=async()=>{let i=await k({creds:e,env:l,usernameFlag:t.username,accessKeyFlag:t.accessKey,log:()=>{}}),f=await V({resolver:i.resolver,env:u,log:ae,projectId:t.projectId,folderId:t.folderId,autoResolve:t.projectId?void 0:{creds:e,config:n,profile:r,envName:l}});return{client:G(f),conn:f,autoDefaulted:f.autoDefaulted??null}},v=async()=>{let i=await k({creds:e,env:l,usernameFlag:t.username,accessKeyFlag:t.accessKey,log:()=>{}});return i.basicAuth?{username:i.basicAuth.username,access_key:i.basicAuth.access_key}:i.token?{auth:{type:"bearer",token:i.token}}:{}};return{mode:t.mode,makeClient:p,materialize:(i,f,a)=>Y(i,f,{model:g,sessionId:d.sessionId,resolveAuth:v,spawnOpts:{environment:l},suiteName:a})}}export{Me as buildHeadlessDeps,Pe as decideGenerateMode,ie as defaultOutDir,Ge as parseFilesFlag,$e as resolveGenerateOp,Ne as runGenerateHeadless};
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
3
- import{a as zt,b as vn,c as bn,d as yn}from"./chunk-XA7UFTB7.js";import"./chunk-JQXARCVE.js";import{i as En}from"./chunk-6PBX7QI7.js";import"./chunk-3MSXQU2C.js";import"./chunk-IO3PBDKN.js";import{c as De}from"./chunk-42WWGBRK.js";import{a as Cn,d as Pe}from"./chunk-VSJAOEBB.js";import{a as Ye,b as Je,c as Qt,d as Xt,f as en,g as nn,h as on,i as sn,j as dn,k as $e,l as un,m as mn,n as fn,o as pn,p as hn,q as gn,r as Ze,s as et,t as tt,u as wn,v as _n}from"./chunk-QW5G7TX3.js";import"./chunk-C5UNZ6ZY.js";import"./chunk-BH6EP2LD.js";import"./chunk-YK63DTUC.js";import{b as ln}from"./chunk-JO3QZB6D.js";import{a as rn,b as ge}from"./chunk-FTMJTGT4.js";import"./chunk-MDBXYXSC.js";import"./chunk-AH36DUIX.js";import"./chunk-S3DAAAE5.js";import"./chunk-PUU7A26K.js";import"./chunk-AH4AXJML.js";import{a as an}from"./chunk-JBOXYLDH.js";import"./chunk-DKGNV3VP.js";import{c as Ht}from"./chunk-DXJ5FL25.js";import"./chunk-L5LI2JF4.js";import{a as le}from"./chunk-QMAHNXS6.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import{a as Ft,b as Ut,c as Vt,d as tn,e as Xe,f as Ie,g as cn}from"./chunk-SEU6OXMD.js";import{b as Zt}from"./chunk-7N5H4KTV.js";import"./chunk-HYOST7EA.js";import"./chunk-MUZCEGJD.js";import"./chunk-CY4HAOSP.js";import"./chunk-CLRWPXDJ.js";import"./chunk-WEPNJVBA.js";import"./chunk-KLVCLGHX.js";import"./chunk-YCCUBQY4.js";import"./chunk-2J3VB6DW.js";import{a as Wt,d as Te,f as ze,g,h as Ee,i as Qe,j as Gt}from"./chunk-LOIRZFV3.js";import{a as qt,f as Kt,g as Yt}from"./chunk-LJDFBQFR.js";import"./chunk-LPUQ4HWQ.js";import{a as Lt}from"./chunk-NLCCBXXV.js";import{a as Re,b as fe,c as Bt}from"./chunk-VE3SUJMA.js";import"./chunk-FN6ZRV4C.js";import{a as Jt}from"./chunk-UVBE3JJV.js";import{a as ne}from"./chunk-LZUTY7XS.js";import"./chunk-RJFHOZG6.js";import{a as Q}from"./chunk-HPJP7NES.js";import"./chunk-RZ4F3BHX.js";import"./chunk-E47GFYXA.js";import"./chunk-JHSSBES2.js";import"./chunk-UJDIXFEE.js";import{a as ye,b as Mt}from"./chunk-C6S4IEBC.js";import"./chunk-WKJY6TRR.js";import"./chunk-7NTOV5DV.js";import"./chunk-GBTPZGJB.js";import{a as Ae,c as ae,j as Ke,x as z}from"./chunk-3UCNDPTN.js";import{a as Oe}from"./chunk-HCBYKLMW.js";import{a as te,b as W,c as Ce,i as Ge,j as Nt}from"./chunk-C44QQJR4.js";import{a as We}from"./chunk-6YGTRKDT.js";import{a as be,c as me,e as re}from"./chunk-UR6MHSHU.js";var ke=me(it=>{"use strict";var je=class extends Error{constructor(e,n,i){super(i),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=n,this.exitCode=e,this.nestedError=void 0}},nt=class extends je{constructor(e){super(1,"commander.invalidArgument",e),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}};it.CommanderError=je;it.InvalidArgumentError=nt});var Ne=me(st=>{"use strict";var{InvalidArgumentError:ci}=ke(),ot=class{constructor(e,n){switch(this.description=n||"",this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,e[0]){case"<":this.required=!0,this._name=e.slice(1,-1);break;case"[":this.required=!1,this._name=e.slice(1,-1);break;default:this.required=!0,this._name=e;break}this._name.length>3&&this._name.slice(-3)==="..."&&(this.variadic=!0,this._name=this._name.slice(0,-3))}name(){return this._name}_concatValue(e,n){return n===this.defaultValue||!Array.isArray(n)?[e]:n.concat(e)}default(e,n){return this.defaultValue=e,this.defaultValueDescription=n,this}argParser(e){return this.parseArg=e,this}choices(e){return this.argChoices=e.slice(),this.parseArg=(n,i)=>{if(!this.argChoices.includes(n))throw new ci(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(n,i):n},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}};function di(l){let e=l.name()+(l.variadic===!0?"...":"");return l.required?"<"+e+">":"["+e+"]"}st.Argument=ot;st.humanReadableArgName=di});var at=me(An=>{"use strict";var{humanReadableArgName:ui}=Ne(),rt=class{constructor(){this.helpWidth=void 0,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}visibleCommands(e){let n=e.commands.filter(t=>!t._hidden),i=e._getHelpCommand();return i&&!i._hidden&&n.push(i),this.sortSubcommands&&n.sort((t,o)=>t.name().localeCompare(o.name())),n}compareOptions(e,n){let i=t=>t.short?t.short.replace(/^-/,""):t.long.replace(/^--/,"");return i(e).localeCompare(i(n))}visibleOptions(e){let n=e.options.filter(t=>!t.hidden),i=e._getHelpOption();if(i&&!i.hidden){let t=i.short&&e._findOption(i.short),o=i.long&&e._findOption(i.long);!t&&!o?n.push(i):i.long&&!o?n.push(e.createOption(i.long,i.description)):i.short&&!t&&n.push(e.createOption(i.short,i.description))}return this.sortOptions&&n.sort(this.compareOptions),n}visibleGlobalOptions(e){if(!this.showGlobalOptions)return[];let n=[];for(let i=e.parent;i;i=i.parent){let t=i.options.filter(o=>!o.hidden);n.push(...t)}return this.sortOptions&&n.sort(this.compareOptions),n}visibleArguments(e){return e._argsDescription&&e.registeredArguments.forEach(n=>{n.description=n.description||e._argsDescription[n.name()]||""}),e.registeredArguments.find(n=>n.description)?e.registeredArguments:[]}subcommandTerm(e){let n=e.registeredArguments.map(i=>ui(i)).join(" ");return e._name+(e._aliases[0]?"|"+e._aliases[0]:"")+(e.options.length?" [options]":"")+(n?" "+n:"")}optionTerm(e){return e.flags}argumentTerm(e){return e.name()}longestSubcommandTermLength(e,n){return n.visibleCommands(e).reduce((i,t)=>Math.max(i,n.subcommandTerm(t).length),0)}longestOptionTermLength(e,n){return n.visibleOptions(e).reduce((i,t)=>Math.max(i,n.optionTerm(t).length),0)}longestGlobalOptionTermLength(e,n){return n.visibleGlobalOptions(e).reduce((i,t)=>Math.max(i,n.optionTerm(t).length),0)}longestArgumentTermLength(e,n){return n.visibleArguments(e).reduce((i,t)=>Math.max(i,n.argumentTerm(t).length),0)}commandUsage(e){let n=e._name;e._aliases[0]&&(n=n+"|"+e._aliases[0]);let i="";for(let t=e.parent;t;t=t.parent)i=t.name()+" "+i;return i+n+" "+e.usage()}commandDescription(e){return e.description()}subcommandDescription(e){return e.summary()||e.description()}optionDescription(e){let n=[];return e.argChoices&&n.push(`choices: ${e.argChoices.map(i=>JSON.stringify(i)).join(", ")}`),e.defaultValue!==void 0&&(e.required||e.optional||e.isBoolean()&&typeof e.defaultValue=="boolean")&&n.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),e.presetArg!==void 0&&e.optional&&n.push(`preset: ${JSON.stringify(e.presetArg)}`),e.envVar!==void 0&&n.push(`env: ${e.envVar}`),n.length>0?`${e.description} (${n.join(", ")})`:e.description}argumentDescription(e){let n=[];if(e.argChoices&&n.push(`choices: ${e.argChoices.map(i=>JSON.stringify(i)).join(", ")}`),e.defaultValue!==void 0&&n.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),n.length>0){let i=`(${n.join(", ")})`;return e.description?`${e.description} ${i}`:i}return e.description}formatHelp(e,n){let i=n.padWidth(e,n),t=n.helpWidth||80,o=2,s=2;function a(d,b){if(b){let k=`${d.padEnd(i+s)}${b}`;return n.wrap(k,t-o,i+s)}return d}function r(d){return d.join(`
3
+ import{a as zt,b as vn,c as bn,d as yn}from"./chunk-UAYCLUUZ.js";import"./chunk-QC73LMAN.js";import{i as En}from"./chunk-G3PWEKD7.js";import"./chunk-3MSXQU2C.js";import"./chunk-EQC7WE2O.js";import{c as De}from"./chunk-FKAXPYV7.js";import{a as Cn,d as Pe}from"./chunk-HUAOH2JK.js";import{a as Ye,b as Je,c as Qt,d as Xt,f as en,g as nn,h as on,i as sn,j as dn,k as $e,l as un,m as mn,n as fn,o as pn,p as hn,q as gn,r as Ze,s as et,t as tt,u as wn,v as _n}from"./chunk-AT45XB6X.js";import"./chunk-C5UNZ6ZY.js";import"./chunk-BH6EP2LD.js";import"./chunk-IS62CNJW.js";import{b as ln}from"./chunk-SQOIKS77.js";import{a as rn,b as ge}from"./chunk-AKLIPQVR.js";import"./chunk-MDBXYXSC.js";import"./chunk-NUGGT2XH.js";import"./chunk-S3DAAAE5.js";import"./chunk-PUU7A26K.js";import"./chunk-AH4AXJML.js";import{a as an}from"./chunk-HPZREZKG.js";import"./chunk-G2GQ67DP.js";import{c as Ht}from"./chunk-NAAPNSZD.js";import"./chunk-L5LI2JF4.js";import{a as le}from"./chunk-53O3GMZR.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import{a as Ft,b as Ut,c as Vt,d as tn,e as Xe,f as Ie,g as cn}from"./chunk-XCOU6AYD.js";import{b as Zt}from"./chunk-BQACGLXW.js";import"./chunk-RQZCGHG7.js";import"./chunk-DMG5QABA.js";import"./chunk-UBN6J3ZA.js";import"./chunk-GSKA5DKJ.js";import"./chunk-OHT5RY5E.js";import"./chunk-VLWWDXBN.js";import"./chunk-YCCUBQY4.js";import"./chunk-YAOWO2GE.js";import{a as Wt,d as Te,f as ze,g,h as Ee,i as Qe,j as Gt}from"./chunk-LOIRZFV3.js";import{a as qt,f as Kt,g as Yt}from"./chunk-XCYCX4TU.js";import"./chunk-LPUQ4HWQ.js";import{a as Lt}from"./chunk-NLCCBXXV.js";import{a as Re,b as fe,c as Bt}from"./chunk-VE3SUJMA.js";import"./chunk-JKLKZCJS.js";import{a as Jt}from"./chunk-7GOX44H7.js";import{a as ne}from"./chunk-RB2YKN77.js";import"./chunk-IGZPQQFP.js";import{a as Q}from"./chunk-KKIFXAJY.js";import"./chunk-RZ4F3BHX.js";import"./chunk-E47GFYXA.js";import"./chunk-6ATKQYAL.js";import"./chunk-QSXYNJOW.js";import{a as ye,b as Mt}from"./chunk-C6S4IEBC.js";import"./chunk-GF44B552.js";import"./chunk-KJLOYIWT.js";import"./chunk-IT66S24L.js";import{a as Ae,c as ae,j as Ke,x as z}from"./chunk-LRKWPAGK.js";import{a as Oe}from"./chunk-HCBYKLMW.js";import{a as te,b as W,c as Ce,i as Ge,j as Nt}from"./chunk-C44QQJR4.js";import{a as We}from"./chunk-6YGTRKDT.js";import{a as be,c as me,e as re}from"./chunk-UR6MHSHU.js";var ke=me(it=>{"use strict";var je=class extends Error{constructor(e,n,i){super(i),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=n,this.exitCode=e,this.nestedError=void 0}},nt=class extends je{constructor(e){super(1,"commander.invalidArgument",e),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}};it.CommanderError=je;it.InvalidArgumentError=nt});var Ne=me(st=>{"use strict";var{InvalidArgumentError:ci}=ke(),ot=class{constructor(e,n){switch(this.description=n||"",this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,e[0]){case"<":this.required=!0,this._name=e.slice(1,-1);break;case"[":this.required=!1,this._name=e.slice(1,-1);break;default:this.required=!0,this._name=e;break}this._name.length>3&&this._name.slice(-3)==="..."&&(this.variadic=!0,this._name=this._name.slice(0,-3))}name(){return this._name}_concatValue(e,n){return n===this.defaultValue||!Array.isArray(n)?[e]:n.concat(e)}default(e,n){return this.defaultValue=e,this.defaultValueDescription=n,this}argParser(e){return this.parseArg=e,this}choices(e){return this.argChoices=e.slice(),this.parseArg=(n,i)=>{if(!this.argChoices.includes(n))throw new ci(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(n,i):n},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}};function di(l){let e=l.name()+(l.variadic===!0?"...":"");return l.required?"<"+e+">":"["+e+"]"}st.Argument=ot;st.humanReadableArgName=di});var at=me(An=>{"use strict";var{humanReadableArgName:ui}=Ne(),rt=class{constructor(){this.helpWidth=void 0,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}visibleCommands(e){let n=e.commands.filter(t=>!t._hidden),i=e._getHelpCommand();return i&&!i._hidden&&n.push(i),this.sortSubcommands&&n.sort((t,o)=>t.name().localeCompare(o.name())),n}compareOptions(e,n){let i=t=>t.short?t.short.replace(/^-/,""):t.long.replace(/^--/,"");return i(e).localeCompare(i(n))}visibleOptions(e){let n=e.options.filter(t=>!t.hidden),i=e._getHelpOption();if(i&&!i.hidden){let t=i.short&&e._findOption(i.short),o=i.long&&e._findOption(i.long);!t&&!o?n.push(i):i.long&&!o?n.push(e.createOption(i.long,i.description)):i.short&&!t&&n.push(e.createOption(i.short,i.description))}return this.sortOptions&&n.sort(this.compareOptions),n}visibleGlobalOptions(e){if(!this.showGlobalOptions)return[];let n=[];for(let i=e.parent;i;i=i.parent){let t=i.options.filter(o=>!o.hidden);n.push(...t)}return this.sortOptions&&n.sort(this.compareOptions),n}visibleArguments(e){return e._argsDescription&&e.registeredArguments.forEach(n=>{n.description=n.description||e._argsDescription[n.name()]||""}),e.registeredArguments.find(n=>n.description)?e.registeredArguments:[]}subcommandTerm(e){let n=e.registeredArguments.map(i=>ui(i)).join(" ");return e._name+(e._aliases[0]?"|"+e._aliases[0]:"")+(e.options.length?" [options]":"")+(n?" "+n:"")}optionTerm(e){return e.flags}argumentTerm(e){return e.name()}longestSubcommandTermLength(e,n){return n.visibleCommands(e).reduce((i,t)=>Math.max(i,n.subcommandTerm(t).length),0)}longestOptionTermLength(e,n){return n.visibleOptions(e).reduce((i,t)=>Math.max(i,n.optionTerm(t).length),0)}longestGlobalOptionTermLength(e,n){return n.visibleGlobalOptions(e).reduce((i,t)=>Math.max(i,n.optionTerm(t).length),0)}longestArgumentTermLength(e,n){return n.visibleArguments(e).reduce((i,t)=>Math.max(i,n.argumentTerm(t).length),0)}commandUsage(e){let n=e._name;e._aliases[0]&&(n=n+"|"+e._aliases[0]);let i="";for(let t=e.parent;t;t=t.parent)i=t.name()+" "+i;return i+n+" "+e.usage()}commandDescription(e){return e.description()}subcommandDescription(e){return e.summary()||e.description()}optionDescription(e){let n=[];return e.argChoices&&n.push(`choices: ${e.argChoices.map(i=>JSON.stringify(i)).join(", ")}`),e.defaultValue!==void 0&&(e.required||e.optional||e.isBoolean()&&typeof e.defaultValue=="boolean")&&n.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),e.presetArg!==void 0&&e.optional&&n.push(`preset: ${JSON.stringify(e.presetArg)}`),e.envVar!==void 0&&n.push(`env: ${e.envVar}`),n.length>0?`${e.description} (${n.join(", ")})`:e.description}argumentDescription(e){let n=[];if(e.argChoices&&n.push(`choices: ${e.argChoices.map(i=>JSON.stringify(i)).join(", ")}`),e.defaultValue!==void 0&&n.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),n.length>0){let i=`(${n.join(", ")})`;return e.description?`${e.description} ${i}`:i}return e.description}formatHelp(e,n){let i=n.padWidth(e,n),t=n.helpWidth||80,o=2,s=2;function a(d,b){if(b){let k=`${d.padEnd(i+s)}${b}`;return n.wrap(k,t-o,i+s)}return d}function r(d){return d.join(`
4
4
  `).replace(/^/gm," ".repeat(o))}let c=[`Usage: ${n.commandUsage(e)}`,""],m=n.commandDescription(e);m.length>0&&(c=c.concat([n.wrap(m,t,0),""]));let u=n.visibleArguments(e).map(d=>a(n.argumentTerm(d),n.argumentDescription(d)));u.length>0&&(c=c.concat(["Arguments:",r(u),""]));let f=n.visibleOptions(e).map(d=>a(n.optionTerm(d),n.optionDescription(d)));if(f.length>0&&(c=c.concat(["Options:",r(f),""])),this.showGlobalOptions){let d=n.visibleGlobalOptions(e).map(b=>a(n.optionTerm(b),n.optionDescription(b)));d.length>0&&(c=c.concat(["Global Options:",r(d),""]))}let p=n.visibleCommands(e).map(d=>a(n.subcommandTerm(d),n.subcommandDescription(d)));return p.length>0&&(c=c.concat(["Commands:",r(p),""])),c.join(`
5
5
  `)}padWidth(e,n){return Math.max(n.longestOptionTermLength(e,n),n.longestGlobalOptionTermLength(e,n),n.longestSubcommandTermLength(e,n),n.longestArgumentTermLength(e,n))}wrap(e,n,i,t=40){let o=" \\f\\t\\v\xA0\u1680\u2000-\u200A\u202F\u205F\u3000\uFEFF",s=new RegExp(`[\\n][${o}]+`);if(e.match(s))return e;let a=n-i;if(a<t)return e;let r=e.slice(0,i),c=e.slice(i).replace(`\r
6
6
  `,`
@@ -23,8 +23,8 @@ Expecting one of '${i.join("', '")}'`);return this._lifeCycleHooks[e]?this._life
23
23
  Expecting one of '${i.join("', '")}'`);let t=`${e}Help`;return this.on(t,o=>{let s;typeof n=="function"?s=n({error:o.error,command:o.command}):s=n,s&&o.write(`${s}
24
24
  `)}),this}_outputHelpIfRequested(e){let n=this._getHelpOption();n&&e.find(t=>n.is(t))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function $n(l){return l.map(e=>{if(!e.startsWith("--inspect"))return e;let n,i="127.0.0.1",t="9229",o;return(o=e.match(/^(--inspect(-brk)?)$/))!==null?n=o[1]:(o=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null?(n=o[1],/^\d+$/.test(o[3])?t=o[3]:i=o[3]):(o=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(n=o[1],i=o[3],t=o[4]),n&&t!=="0"?`${n}=${i}:${parseInt(t)+1}`:e})}Pn.Command=ht});var Fn=me(G=>{"use strict";var{Argument:jn}=Ne(),{Command:gt}=Dn(),{CommanderError:yi,InvalidArgumentError:Nn}=ke(),{Help:Ei}=at(),{Option:Mn}=ut();G.program=new gt;G.createCommand=l=>new gt(l);G.createOption=(l,e)=>new Mn(l,e);G.createArgument=(l,e)=>new jn(l,e);G.Command=gt;G.Option=Mn;G.Argument=jn;G.Help=Ei;G.CommanderError=yi;G.InvalidArgumentError=Nn;G.InvalidOptionArgumentError=Nn});var xe=re(We(),1);import P from"process";import*as li from"tls";function kn(){let l=li;if(!(typeof l.getCACertificates!="function"||typeof l.setDefaultCACertificates!="function"))try{let e=t=>typeof t=="string",n=l.getCACertificates("default").filter(e),i=l.getCACertificates("system").filter(e);l.setDefaultCACertificates([...new Set([...n,...i])])}catch{}}var Sn=!1;function xn(){if(!Sn)try{if(typeof process.emitWarning!="function")return;let l=process.emitWarning.bind(process),e=((n,...i)=>{let t=typeof n=="string"?n:n?.message??"";if(!((typeof i[0]=="string"?i[0]:typeof n=="object"&&n?n.name:void 0)==="ExperimentalWarning"&&t.includes("buffer.File")))return l(n,...i)});process.emitWarning=e,Sn=!0}catch{}}var Un=re(Fn(),1),{program:Qi,createCommand:Xi,createArgument:Zi,createOption:eo,CommanderError:to,InvalidArgumentError:no,InvalidOptionArgumentError:io,Command:Vn,Argument:oo,Option:X,Help:so}=Un.default;import{join as oe,resolve as $i}from"path";var wt=re(We(),1);var V=re(We(),1);var ce=re(Oe(),1);function Ln({steps:l,bifurcationInfo:e,perFlowMetadata:n}){return!e||e.isSingleFlow||!n||n.length<=1?null:(0,ce.jsx)(te,{flexDirection:"column",children:n.map((i,t)=>{let o=l[t],s=o?.children??[],a=s.filter(p=>p.status==="passed").length,r=s.filter(p=>p.status==="failed").length,c=a+r,m=s.reduce((p,d)=>p+(d.duration??0),0),u=o?.status==="failed"?"failed":"passed",f=e.flows[t]??o?.objective??`Flow ${t+1}`;return(0,ce.jsxs)(te,{flexDirection:"column",marginTop:t>0?1:0,children:[(0,ce.jsxs)(te,{marginLeft:1,children:[(0,ce.jsx)(W,{color:z.purple,bold:!0,children:"Flow "+(t+1)+": "}),(0,ce.jsx)(W,{color:z.purple,children:f})]}),(0,ce.jsx)(Ie,{status:u,summary:i?.summary??"",duration:m,steps:c,stepsPassed:a,stepsFailed:r,reason:i?.error_message??void 0,creditsConsumed:i?.credits_consumed??void 0})]},`flow-summary-${t}`)})})}var $=re(Oe(),1);function Hn({config:l,spawnOpts:e,cancelRef:n,banner:i,describeContext:t,onComplete:o,onStepEnd:s,onReasoning:a,onStepComplete:r}){let{exit:c}=Nt(),{append:m}=Mt(),{describe:u,onDescribe:f,creditsRef:p}=vn({resolve:()=>t??null,hostIsTTY:()=>!!process.stderr.isTTY}),d=tn(s,void 0,a,r,f),b=(0,V.useRef)(!1),k=(0,V.useRef)(!1),[E,A]=(0,V.useState)("");(0,V.useEffect)(()=>{b.current||(b.current=!0,d.startRun(l,e))},[l,e,d]),(0,V.useEffect)(()=>{n&&(n.current=()=>d.cancelRun())},[n,d]),(0,V.useEffect)(()=>{d.isRunning||u.stop()},[d.isRunning,u.stop]);let w=(0,V.useRef)(0);Ge((S,O)=>{O.ctrl&&S==="c"&&(d.isRunning?(w.current++,w.current>=2?c():d.cancelRun()):c())}),Ge((S,O)=>{d.askingUser&&(O.return?(d.sendAnswer(E),A("")):O.backspace||O.delete?A(M=>M.slice(0,-1)):S&&!O.ctrl&&!O.meta&&A(M=>M+S))},{isActive:!!d.askingUser}),(0,V.useEffect)(()=>{if(!d.isRunning&&d.lastRunEnd&&!k.current){k.current=!0;let{passed:S,failed:O,total:M}=Xe(d.steps),he=d.bifurcationInfo;o({lastRunEnd:d.lastRunEnd,stepsPassed:S,stepsFailed:O,stepsTotal:M,hadError:!1,bifurcationFlows:he&&!he.isSingleFlow?he.flows:null,describeCredits:p.current}),c()}},[d.isRunning,d.lastRunEnd,d.steps,o,c]),(0,V.useEffect)(()=>{d.runError&&!d.isRunning&&!k.current&&(k.current=!0,o({lastRunEnd:null,stepsPassed:0,stepsFailed:0,stepsTotal:0,hadError:!0,bifurcationFlows:null,describeCredits:p.current}),c())},[d.runError,d.isRunning,o,c]);let y=d.lastRunEnd?(()=>{let{passed:S,failed:O,total:M}=Xe(d.steps);return{status:d.lastRunEnd.status,duration:d.lastRunEnd.duration??0,summary:d.lastRunEnd.summary??"",stepsPassed:S,stepsFailed:O,stepsTotal:M,reason:d.lastRunEnd.reason,finalState:d.lastRunEnd.final_state,creditsConsumed:(d.lastRunEnd.credits_consumed??0)+p.current}})():null,j=(0,V.useRef)(!1);return(0,V.useEffect)(()=>{j.current||!i||(j.current=!0,m((0,$.jsxs)(te,{flexDirection:"column",marginBottom:1,children:[(0,$.jsxs)(te,{borderStyle:"round",borderColor:"#dc4e08",paddingX:2,children:[(0,$.jsx)(W,{color:"#ff9500",bold:!0,children:"KaneAI CLI"}),(0,$.jsx)(W,{color:z.dim,children:" \u2502 "}),(0,$.jsx)(W,{color:z.orange,children:i.model}),(0,$.jsx)(W,{color:z.dim,children:" \u2502 "}),(0,$.jsx)(W,{color:z.dim,children:i.auth})]}),i.status?.map((S,O)=>(0,$.jsx)(W,{color:z.dim,children:S},O))]})))},[]),(0,$.jsxs)(te,{flexDirection:"column",children:[(()=>{let S=Vt({isRunning:d.isRunning,bifurcationInfo:d.bifurcationInfo,steps:d.steps,cmInitCounts:d.cmInitCounts,replayInfo:d.replayInfo});return S?(0,$.jsx)(Ut,{label:S.label,hasBifurcation:S.hasBifurcation}):null})(),d.steps.length>0&&(0,$.jsx)(Ft,{steps:d.steps,bifurcated:!!d.bifurcationInfo&&!d.bifurcationInfo.isSingleFlow,flows:d.bifurcationInfo?.flows,cmInitCounts:d.cmInitCounts,staticSteps:!0,onStepCommit:m,describe:u.text,describeVisible:u.visible,describeRevealing:u.revealing}),d.askingUser&&(0,$.jsxs)(te,{flexDirection:"column",marginTop:1,children:[(0,$.jsxs)(W,{color:z.orange,children:['Agent is asking: "',d.askingUser,'"']}),(0,$.jsxs)(W,{children:["> ",E,"\u2588"]})]}),d.runError&&(0,$.jsx)(cn,{message:d.runError,code:"RUNNER_ERROR"}),y&&d.lastRunEnd&&(0,$.jsx)(Ln,{steps:d.steps,bifurcationInfo:d.bifurcationInfo,perFlowMetadata:d.lastRunEnd.per_flow_metadata??[]}),y&&(0,$.jsx)(Ie,{status:y.status==="passed"?"passed":"failed",summary:y.summary??"",duration:y.duration,steps:y.stepsTotal,stepsPassed:y.stepsPassed,stepsFailed:y.stepsFailed,reason:y.reason,creditsConsumed:y.creditsConsumed})]})}import{createInterface as ki}from"readline";function pe(l){process.stdout.write(JSON.stringify(l)+`
25
25
  `)}async function Bn(l,e,n){let i=Zt(l,e);Pe().then(u=>{u&&pe({type:"update_available",current:u.current,latest:u.latest,severity:u.severity})}).catch(()=>{}),De().then(u=>{u&&pe({type:"skill_update_available",current:u.current,latest:u.latestCompatible,install_cmd:"kane-cli install skill"})}).catch(()=>{});let t=ki({input:process.stdin});t.on("line",u=>{try{let f=JSON.parse(u);f.type==="user_response"?i.sendUserResponse(f.answer??""):f.type==="cancel"&&i.sendCancel(f.reason??"")}catch{}});let o=null,s=!1,a=0,r=null,c=0,m=!1;for await(let u of i.events)switch(u.type){case"run_start":m&&c++;break;case"step_start":{let f=u;n?.onStepLog?.("STEP_START",`Step ${f.index} started`,{index:f.index,objective:f.objective,child_id:f.child_id});let p={step:f.index+1,status:"running",remark:f.objective??`Step ${f.index+1}`};f.child_id&&(p.child_id=f.child_id),pe(p);break}case"step_event":u.event==="reasoning"&&u.detail&&u.detail!=="reasoning"&&n?.onReasoning?.(u.detail),n?.onStepLog?.("STEP_EVENT",`Step ${u.index} ${u.event}`,{index:u.index,phase:u.event,action_type:u.action_type,detail:u.detail,child_id:u.child_id});break;case"step_end":{let f=u;n?.onStepLog?.("STEP_END",`Step ${f.index} ${f.status}`,{index:f.index,status:f.status,duration:f.duration,summary:f.summary,child_id:f.child_id}),n?.onStepComplete?.(),a++;let p={step:f.index+1,status:f.status==="passed"?"done":"failed",remark:f.summary??""};f.child_id&&(p.child_id=f.child_id),pe(p);let d=m?Math.max(0,c-1):0;n?.onStepEnd?.(f.index,d);break}case"bifurcation":{let f=u,p=f.flows??[],d=f.count??p.length;(f.is_single_flow??d<=1)||(r=p,m=!0,c=0),pe({type:"bifurcation",flows:p,count:d});break}case"ask_user":{let f=u;pe({type:"ask_user",question:f.question,step_index:f.step_index,...f.options?{options:f.options}:{}});break}case"run_end":{o=u;break}case"error":{s=!0,pe({type:"error",message:u.message});break}default:break}return t.close(),await i.exited,{lastRunEnd:o,stepsTotal:a,hadError:s,bifurcationFlows:r}}import{join as Si}from"path";function qn(l){let e=l.command("testmd").description("Manage test.md files (run, list, status, delete, export)").action(async()=>{process.stdin.isTTY||(process.stderr.write(`error: testmd requires a sub-action in non-TTY mode (run | list | status | delete | export)
26
- `),process.exit(2));let{runListTui:n,resolveCurrentOrgId:i}=await import("./testmd-actions-N7VS4FS6.js"),t=await i({});t.ok||process.exit(t.code),process.exit(await n(t.orgId))});Ai(e),Oi(e),Ri(e),Ti(e),Ii(e)}function xi(l,e){return e.concat(l)}function Ai(l){l.command("run <path>").description("Run a test from a *_test.md file").option("--url <url>","Start URL for the first step (overrides frontmatter url: and config default_url)").option("--headless","Run Chrome in headless mode").option("--max-steps <n>","Max agent steps","30").option("--timeout <seconds>","Kill after N seconds").option("--cdp-endpoint <url>","Connect to existing Chrome via CDP").option("--ws-endpoint <url>","Playwright WebSocket endpoint").option("--global-context <file>",`Override global context (default: ${Si(ae,"global-memory.md")})`).option("--local-context <file>","Override local context (default: .testmuai/context.md in cwd)").addOption(new X("--model <name>","Model override").hideHelp()).option("--variables <json>","Inline variables JSON").option("--variables-file <path>","Load variables from file").option("--session-context <json>","Session context JSON (prior runs)").addOption(new X("--cft","Use Playwright Chromium instead of managed Chrome").hideHelp()).option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").option("--mode <name>","Run mode: action | testing").option("--assertion-mode <mode>","Assertion mode: visual (default) | dom (DOM extraction & assertions)").option("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").addOption(new X("--local","Skip TMS integration (no uploads, no variables/secrets push)").hideHelp()).option("--allow-missing-url","Non-TTY only: proceed from the browser's current page instead of failing when the first step has no start URL (frontmatter url:/--url still used)").option("--code-export","Generate code export after upload").option("--code-language <lang>","Code-export language (python|javascript)").option("--name <name>","Persist session under this name").option("--skip-code-validation","Skip post-codegen validation").option("--no-skip-code-validation","Force post-codegen validation").option("--on-lock-conflict <mode>","lock conflict policy: readonly|fail|wait",e=>{if(e!=="readonly"&&e!=="fail"&&e!=="wait")throw new Error(`--on-lock-conflict must be readonly|fail|wait, got: ${e}`);return e}).option("--push","always commit at end-of-run (no retry semantics)").option("--retry","on replay failure, full-restart with shrinking replay window; falls back to complete re-author after --retry-count attempts").option("--retry-count <n>","max replay restart attempts before falling back to complete re-author (default: 3)",e=>{let n=parseInt(e,10);if(Number.isNaN(n)||n<0)throw new Error(`--retry-count must be a non-negative integer, got: ${e}`);return e}).option("--author","bypass walker; force fresh test+testcase in TMS; replace local output entirely").action(async(e,n)=>{let{runTestMdFile:i}=await import("./run-test-md-PXG4RFDI.js"),t=await i(e,n);process.exit(t)})}function Oi(l){l.command("list").description("List *_test.md files in the working directory (recursive)").option("--root <dir>","Root directory to scan (default: cwd)").option("--ignore <name>","Skip a directory by name (repeatable)",xi,[]).option("--json","Force NDJSON output even on TTY").action(async e=>{let{runListAction:n,resolveCurrentOrgId:i}=await import("./testmd-actions-N7VS4FS6.js"),t=await i({json:!!e.json});t.ok||process.exit(t.code),process.exit(await n(e,t.orgId))})}function Ri(l){l.command("status <path>").description("Print local meta.json for a *_test.md (no live TMS check in v1)").action(async e=>{let{runStatusAction:n,resolveCurrentOrgId:i}=await import("./testmd-actions-N7VS4FS6.js"),t=await i({});t.ok||process.exit(t.code),process.exit(await n(e,t.orgId))})}function Ti(l){l.command("delete <path>").description("Remove output-<stem>/ and the *_test.md source file (TMS untouched)").option("--yes","Skip confirmation prompt (required in non-TTY)").action(async(e,n)=>{let{runDeleteAction:i,resolveCurrentOrgId:t}=await import("./testmd-actions-N7VS4FS6.js"),o=await t({});o.ok||process.exit(o.code),process.exit(await i(e,!!n.yes,o.orgId))})}function Ii(l){l.command("export <path>").description("Generate standalone test code (Playwright)").option("--language <lang>","python|javascript (falls back to tui-config)").option("--output <dir>","Override output dir (default: output-<stem>/playwright-<lang>-code/)").option("--force","Overwrite an existing local export").action(async(e,n)=>{let{runExportAction:i,resolveCurrentOrgId:t}=await import("./testmd-actions-N7VS4FS6.js"),o=await t({});o.ok||process.exit(o.code),process.exit(await i(e,n,o.orgId))})}function Se(l){let e=new Vn;if(e.name("kane-cli").version(Ae).showHelpAfterError("(run `kane-cli --help` to see all commands; `-h` and `help` also work)"),e.on("command:*",i=>{e.error(`error: unknown command '${i[0]}'`,{exitCode:2,code:"commander.unknownCommand"})}),l[0]==="--help"||l[0]==="-h"||l[0]==="help"){(async()=>{let{HelpView:i}=await import("./HelpView-ZZYE2TKZ.js"),{render:t}=await import("./build-JIKYOZUH.js"),o=await import("./react-QWOAB3TB.js"),{waitUntilExit:s}=t(o.default.createElement(i));await s(),g(0,"Help displayed")})();return}e.command("login").option("--oauth","Login via OAuth (opens browser)").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").addOption(new X("--env <name>","Environment (prod or stage)").default("prod").hideHelp()).option("--profile <name>","Profile name","default").option("--project-id <id>","Project ID (skip picker)").option("--folder-id <id>","Folder ID (skip picker)").addOption(new X("--model <name>","Model").default("v16-alpha").hideHelp()).option("--chrome-profile <path>","Chrome profile path").action(async i=>{let t=new ne,o=new le,s=i.env,a=i.profile;if(!process.stdin.isTTY||i.oauth||i.username){if(t.setDefaultEnv(s),i.oauth)await new Jt(a,s,t).login(),console.log(`Logged in as ${a} [${s}] via OAuth`);else if(i.username&&i.accessKey){try{let{validateBasicAuth:E}=await import("./validate-basic-EKSOPOMF.js");await E(s,i.username,i.accessKey)}catch{console.error("Credentials not valid. Please use valid credentials."),g(1,"Invalid basic-auth credentials");return}t.saveBasicAuth(a,s,{username:i.username,access_key:i.accessKey}),console.log(`Logged in as ${a} [${s}] via basic auth`)}else console.error("Provide --oauth, or --username and --access-key"),g(1,"Missing --oauth or credentials for login");t.setActiveProfile(a),o.set("model",i.model),i.chromeProfile&&o.set("chrome_profile_path",i.chromeProfile);let k=null;if(i.username&&i.accessKey)k={username:i.username,access_key:i.accessKey};else try{let A=await ge({creds:t,env:s,log:()=>{}});A.resolvedCreds&&(k={username:A.resolvedCreds.username,access_key:A.resolvedCreds.access_key})}catch{}if(i.projectId&&(fe(t,o,a,s,{projectId:i.projectId}),console.log(`Project set to ${i.projectId}`)),i.folderId&&(fe(t,o,a,s,{folderId:i.folderId}),console.log(`Folder set to ${i.folderId}`)),k&&(!i.projectId||!i.folderId))try{let E=await qt({creds:t,config:o,profile:a,env:s,tmsCreds:k,log:()=>{}});i.projectId||console.log(`Auto-selected project: ${E.projectName} (${E.projectId})`),i.folderId||console.log(`Auto-selected folder: ${E.folderName} (${E.folderId})`)}catch(E){console.warn(`Could not auto-select project/folder: ${E instanceof Error?E.message:E}`)}Re(t,o,a,s),console.log("Setup complete."),g(0,"Setup complete")}let{SingleShotApp:r}=await import("./SingleShotApp-IOEEYVGJ.js"),{ScrollbackProvider:c}=await import("./scrollback-6GINSTL2.js"),{render:m}=await import("./build-JIKYOZUH.js"),u=await import("./react-QWOAB3TB.js"),f={current:null},p={current:!1},{waitUntilExit:d,unmount:b}=m(u.default.createElement(c,null,u.default.createElement(r,{resultRef:f,mode:"login",loginCompleteRef:p})),{exitOnCtrlC:!1});Ee(()=>b()),await d();try{process.stdin.setRawMode?.(!1)}catch{}process.stdout.write("\x1B[?25h"),p.current&&console.log("Login setup complete."),process.exit(0)}),e.command("logout").action(async()=>{let i=new ne,t=i.getActiveProfile();if(!t){console.log("No active profile to logout");return}let o=i.getDefaultEnv(),s=await zt(i,t,o),a=new le;s.switchedTo?(Re(i,a,s.switchedTo.profile,s.switchedTo.env),console.log(`Logged out ${s.profile} [${s.env}]. Switched to ${s.switchedTo.profile} [${s.switchedTo.env}]`)):(a.save({project_id:null,project_name:null,folder_id:null,folder_name:null}),console.log(`Logged out ${s.profile} [${s.env}]. No profiles remaining.`))}),e.command("whoami").option("--profile <name>","Profile name").action(async i=>{let t=new ne,o=i.profile??t.getActiveProfile()??"default",s=t.getDefaultEnv(),a=t.loadCredentials(o,s),r=t.loadBasicAuth(o,s),c="none",m=r?.username,u,f,p,d;if(r?c="basic":a&&(c="oauth",f=new Date(a.expires_at*1e3).toISOString().slice(0,10)),c==="none")u="missing";else try{let w=await ge({creds:t,env:s,log:()=>{}});if(w.resolvedCreds)p="verified",u="valid",m=w.resolvedCreds.username??m;else{let{classifyAuthFailure:y}=await import("./resolver-IDCGRPFJ.js");y(w.resolver.lastError)==="auth"?(p="rejected",u="expired",d="Credentials rejected by the server \u2014 re-login or rotate your access key"):(p="unreachable",d=w.resolver.lastError?.message)}}catch(w){let y=w;y.code==="refresh_failed"?(p="rejected",u="expired",d="OAuth token refresh failed \u2014 run 'kane-cli login'"):y.code==="not_authenticated"?(c="none",u="missing"):(p="unreachable",d=y.message)}let{WhoamiView:b}=await import("./WhoamiView-GMM4V7ZV.js"),{render:k}=await import("./build-JIKYOZUH.js"),E=await import("./react-QWOAB3TB.js"),{waitUntilExit:A}=k(E.default.createElement(b,{profile:o,env:s,authenticated:p==="verified",authMethod:c,username:m,tokenStatus:u,expiresAt:f,serverStatus:p,detail:d}));await A(),c==="none"?g(1,"whoami: not-authenticated"):p&&p!=="verified"&&g(p==="unreachable"?3:1,`whoami: ${p}`)}),e.command("config <action> [value]").description("Show or change settings (show, set-mode, set-assertion-mode, set-network-ws, set-network-sse, set-url, set-window, chrome-profile, project, folder, reset)").option("--agent","Force JSON output for `show` (auto-on when stdin is not a TTY)").action(async(i,t,o)=>{let s=new le,a=new ne;if(i==="show"){let r=s.load(),c=a.getActiveProfile()??"default",m=a.getDefaultEnv(),u=a.loadProfileConfig(c,m)??{},f=u.project_id??r.project_id??null,p=u.project_name??r.project_name??null,d=u.folder_id??r.folder_id??null,b=u.folder_name??r.folder_name??null,k=a.loadBasicAuth(c,m),E=a.loadCredentials(c,m),A=k?`basic (${k.username})`:E?"oauth":"not configured";if(!!o?.agent||!process.stdin.isTTY||!process.stdout.isTTY){let M=Q(m);process.stdout.write(`${JSON.stringify({profile:c,env:m,auth:A,project_id:f,project_name:p,folder_id:d,folder_name:b,model:r.model,mode:r.mode,assertion_mode:r.assertion_mode,network_ws:r.network_ws,network_sse:r.network_sse,window_size:`${r.window_size.width}x${r.window_size.height}`,chrome_profile:r.chrome_profile_path,default_url:r.default_url??Ke,controller_base_url:M.controllerBaseUrl,tms_base_url:M.tmsBaseUrl})}
27
- `),g(0,"config show complete");return}let{ConfigView:y}=await import("./ConfigView-JPBD47MS.js"),{render:j}=await import("./build-JIKYOZUH.js"),S=await import("./react-QWOAB3TB.js"),{waitUntilExit:O}=j(S.default.createElement(y,{model:r.model,authLabel:A,profile:c,env:m,defaultUrl:r.default_url??Ke,projectId:f,projectName:p,folderId:d,folderName:b,windowSize:`${r.window_size.width}x${r.window_size.height}`,chromeProfile:r.chrome_profile_path}));await O()}else if(i==="set-window"&&t){let r=t.split("x").map(Number),[c,m]=r;!c||!m||!Number.isInteger(c)||!Number.isInteger(m)?console.error("Invalid format. Use: kane-cli config set-window WIDTHxHEIGHT"):c<800||c>3840?console.error(`Width must be between 800 and 3840 (got ${c})`):m<600||m>2160?console.error(`Height must be between 600 and 2160 (got ${m})`):(s.set("window_size",{width:c,height:m}),console.log(`Window size set to ${c}x${m}`))}else if(i==="set-mode"){if(t!=="action"&&t!=="testing"){console.error("Mode must be 'action' or 'testing'."),g(1,"Invalid mode");return}s.set("mode",t),console.log(`Mode set to ${t}`)}else if(i==="set-assertion-mode"){if(t!=="visual"&&t!=="dom"){console.error("Assertion mode must be 'visual' or 'dom'."),g(1,"Invalid assertion-mode");return}s.set("assertion_mode",t),console.log(`Assertion mode set to ${t}`)}else if(i==="set-network-ws"){if(t!=="on"&&t!=="off"){console.error("WebSocket capture must be 'on' or 'off'."),g(1,"Invalid network-ws value");return}s.set("network_ws",t==="on"),console.log(`WebSocket capture set to ${t}`)}else if(i==="set-network-sse"){if(t!=="on"&&t!=="off"){console.error("SSE capture must be 'on' or 'off'."),g(1,"Invalid network-sse value");return}s.set("network_sse",t==="on"),console.log(`SSE capture set to ${t}`)}else if(i==="set-url"){if(!t){console.error("Usage: kane-cli config set-url <url>"),g(1,"Missing URL");return}let r=nn(t);if(!r){console.error(`Invalid URL: ${t}`),g(1,"Invalid URL");return}s.set("default_url",r),console.log(`Default URL set to ${r}`)}else if(i==="chrome-profile"){if(t||!process.stdin.isTTY){t||(console.error("Usage: kane-cli config chrome-profile <path>"),g(1,"Missing chrome-profile path")),s.set("chrome_profile_path",t),console.log(`Chrome profile set to ${t}`);return}let{ChromeProfilePicker:r}=await import("./ChromeProfilePicker-BOTCHMXH.js"),{render:c}=await import("./build-JIKYOZUH.js"),m=await import("./react-QWOAB3TB.js");await new Promise(u=>{let{unmount:f}=c(m.default.createElement(r,{currentPath:s.load().chrome_profile_path,onSelect:p=>{s.set("chrome_profile_path",p),console.log(`Chrome profile set to ${p}`),f(),u()},onCancel:()=>{f(),u()}}))})}else if(i==="project"){if(t||!process.stdin.isTTY){t||(console.error("Usage: kane-cli config project <project-id>"),g(1,"Missing project ID"));let w=a.getActiveProfile()??"default",y=a.getDefaultEnv();fe(a,s,w,y,{projectId:t}),console.log(`Project set to ${t}`);return}let r=a.getDefaultEnv(),c=Q(r),m=a.getActiveProfile()??"default",{resolveTmsBasicAuth:u,formatAuthResolutionError:f}=await import("./list-commands-M3JL6XBB.js"),p=await u(m,r,{});if(!p.ok){let{message:w}=f(m,r,p);process.stderr.write(w),g(2,`${p.reason} for "${m}" [${r}]`);return}let{ProjectPicker:d}=await import("./ProjectPicker-CJVGBY42.js"),{AuthResolver:b}=await import("./resolver-IDCGRPFJ.js"),{render:k}=await import("./build-JIKYOZUH.js"),E=await import("./react-QWOAB3TB.js"),A=new b(c.controllerBaseUrl,async()=>null,{username:p.creds.username,access_key:p.creds.access_key});await A.resolve(),await new Promise(w=>{let{unmount:y}=k(E.default.createElement(d,{resolver:A,currentProjectId:s.load().project_id,env:r,onSelect:(j,S)=>{let O=a.getActiveProfile()??"default",M=a.getDefaultEnv();fe(a,s,O,M,{projectId:j,projectName:S}),console.log(`Project set to ${S} (${j})`),y(),w()},onCancel:()=>{y(),w()}}))})}else if(i==="folder"){if(t||!process.stdin.isTTY){if(t||(console.error("Usage: kane-cli config folder <folder-id>"),g(1,"Missing folder ID")),!s.load().project_id){console.log("Select a project first: kane-cli config project <id>");return}let j=a.getActiveProfile()??"default",S=a.getDefaultEnv();fe(a,s,j,S,{folderId:t}),console.log(`Folder set to ${t}`);return}let r=s.load();if(!r.project_id){console.log("Select a project first: kane-cli config project");return}let c=a.getDefaultEnv(),m=Q(c),u=a.getActiveProfile()??"default",{resolveTmsBasicAuth:f,formatAuthResolutionError:p}=await import("./list-commands-M3JL6XBB.js"),d=await f(u,c,{});if(!d.ok){let{message:y}=p(u,c,d);process.stderr.write(y),g(2,`${d.reason} for "${u}" [${c}]`);return}let{FolderPicker:b}=await import("./FolderPicker-M4RFRBYV.js"),{AuthResolver:k}=await import("./resolver-IDCGRPFJ.js"),{render:E}=await import("./build-JIKYOZUH.js"),A=await import("./react-QWOAB3TB.js"),w=new k(m.controllerBaseUrl,async()=>null,{username:d.creds.username,access_key:d.creds.access_key});await w.resolve(),await new Promise(y=>{let{unmount:j}=E(A.default.createElement(b,{resolver:w,projectId:r.project_id,currentFolderId:r.folder_id,env:c,onSelect:(S,O)=>{let M=a.getActiveProfile()??"default",he=a.getDefaultEnv();fe(a,s,M,he,{folderId:S,folderName:O}),console.log(`Folder set to ${O} (${S})`),j(),y()},onCancel:()=>{j(),y()}}))})}else console.log("Usage: kane-cli config show|set-url|set-window|set-mode|set-assertion-mode|set-network-ws|set-network-sse|chrome-profile|project|folder")}),e.command("run").argument("<objective>","Test objective (use {{var}} to reference variables)").option("--headless","Run Chrome in headless mode").option("--max-steps <n>","Maximum agent steps","30").option("--timeout <seconds>","Kill run after N seconds").option("--url <url>","Start URL for the run").option("--cdp-endpoint <url>","Connect to existing Chrome CDP endpoint").option("--ws-endpoint <url>","Connect via Playwright WebSocket (e.g. LambdaTest wss:// URL)").option("--global-context <file>",`Override global context markdown (default: ${oe(ae,"global-memory.md")})`).option("--local-context <file>","Override local context markdown (default: .testmuai/context.md in cwd)").addOption(new X("--model <name>","Model override").hideHelp()).option("--variables <json>",`Inline variables JSON, e.g. '{"user": {"value": "alice"}}'`).option("--variables-file <path>","Load variables from a JSON file").option("--session-context <json>","Session context JSON (prior runs)").addOption(new X("--cft","Use Playwright Chromium instead of managed Chrome").hideHelp()).option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key (skip OAuth)").option("--env <name>","Environment (prod or stage)").option("--mode <name>","Run mode: 'action' (strict \u2014 hard-stop on auth/blocked/error) or 'testing' (lenient \u2014 fall through). Overrides config; default: testing.").option("--assertion-mode <mode>","Assertion mode: 'visual' (default, vision model) or 'dom' (DOM-based extraction & assertions). Overrides config.").option("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").option("--network-ws","Capture WebSocket frames for assertions/extraction (experimental)").option("--network-sse","Capture Server-Sent Events messages (Chromium-only) for assertions/extraction (experimental)").addOption(new X("--local","Skip TMS integration (no uploads, no variables/secrets push)").hideHelp()).option("--allow-missing-url","Non-TTY only: proceed from the browser's current page instead of failing when no start URL resolves (a provided --url is still used)").option("--code-export","Generate code export after upload").option("--code-language <lang>","Code export language: python (default) | javascript").option("--name <name>","Persist the session under this name (validated [a-zA-Z0-9_-]+)").option("--chrome-profile <path>","Chrome user-data-dir for this run (overrides stored config)").option("--skip-code-validation","Skip post-codegen worker-side validation").option("--no-skip-code-validation","Force post-codegen worker-side validation").addHelpText("after",`
26
+ `),process.exit(2));let{runListTui:n,resolveCurrentOrgId:i}=await import("./testmd-actions-OUY5BOAV.js"),t=await i({});t.ok||process.exit(t.code),process.exit(await n(t.orgId))});Ai(e),Oi(e),Ri(e),Ti(e),Ii(e)}function xi(l,e){return e.concat(l)}function Ai(l){l.command("run <path>").description("Run a test from a *_test.md file").option("--url <url>","Start URL for the first step (overrides frontmatter url: and config default_url)").option("--headless","Run Chrome in headless mode").option("--max-steps <n>","Max agent steps","30").option("--timeout <seconds>","Kill after N seconds").option("--cdp-endpoint <url>","Connect to existing Chrome via CDP").option("--ws-endpoint <url>","Playwright WebSocket endpoint").option("--global-context <file>",`Override global context (default: ${Si(ae,"global-memory.md")})`).option("--local-context <file>","Override local context (default: .testmuai/context.md in cwd)").addOption(new X("--model <name>","Model override").hideHelp()).option("--variables <json>","Inline variables JSON").option("--variables-file <path>","Load variables from file").option("--session-context <json>","Session context JSON (prior runs)").addOption(new X("--cft","Use Playwright Chromium instead of managed Chrome").hideHelp()).option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").option("--mode <name>","Run mode: action | testing").option("--assertion-mode <mode>","Assertion mode: visual (default) | dom (DOM extraction & assertions)").option("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").addOption(new X("--local","Skip TMS integration (no uploads, no variables/secrets push)").hideHelp()).option("--allow-missing-url","Non-TTY only: proceed from the browser's current page instead of failing when the first step has no start URL (frontmatter url:/--url still used)").option("--code-export","Generate code export after upload").option("--code-language <lang>","Code-export language (python|javascript)").option("--name <name>","Persist session under this name").option("--skip-code-validation","Skip post-codegen validation").option("--no-skip-code-validation","Force post-codegen validation").option("--on-lock-conflict <mode>","lock conflict policy: readonly|fail|wait",e=>{if(e!=="readonly"&&e!=="fail"&&e!=="wait")throw new Error(`--on-lock-conflict must be readonly|fail|wait, got: ${e}`);return e}).option("--push","always commit at end-of-run (no retry semantics)").option("--retry","on replay failure, full-restart with shrinking replay window; falls back to complete re-author after --retry-count attempts").option("--retry-count <n>","max replay restart attempts before falling back to complete re-author (default: 3)",e=>{let n=parseInt(e,10);if(Number.isNaN(n)||n<0)throw new Error(`--retry-count must be a non-negative integer, got: ${e}`);return e}).option("--author","bypass walker; force fresh test+testcase in TMS; replace local output entirely").action(async(e,n)=>{let{runTestMdFile:i}=await import("./run-test-md-YWKVMQDJ.js"),t=await i(e,n);process.exit(t)})}function Oi(l){l.command("list").description("List *_test.md files in the working directory (recursive)").option("--root <dir>","Root directory to scan (default: cwd)").option("--ignore <name>","Skip a directory by name (repeatable)",xi,[]).option("--json","Force NDJSON output even on TTY").action(async e=>{let{runListAction:n,resolveCurrentOrgId:i}=await import("./testmd-actions-OUY5BOAV.js"),t=await i({json:!!e.json});t.ok||process.exit(t.code),process.exit(await n(e,t.orgId))})}function Ri(l){l.command("status <path>").description("Print local meta.json for a *_test.md (no live TMS check in v1)").action(async e=>{let{runStatusAction:n,resolveCurrentOrgId:i}=await import("./testmd-actions-OUY5BOAV.js"),t=await i({});t.ok||process.exit(t.code),process.exit(await n(e,t.orgId))})}function Ti(l){l.command("delete <path>").description("Remove output-<stem>/ and the *_test.md source file (TMS untouched)").option("--yes","Skip confirmation prompt (required in non-TTY)").action(async(e,n)=>{let{runDeleteAction:i,resolveCurrentOrgId:t}=await import("./testmd-actions-OUY5BOAV.js"),o=await t({});o.ok||process.exit(o.code),process.exit(await i(e,!!n.yes,o.orgId))})}function Ii(l){l.command("export <path>").description("Generate standalone test code (Playwright)").option("--language <lang>","python|javascript (falls back to tui-config)").option("--output <dir>","Override output dir (default: output-<stem>/playwright-<lang>-code/)").option("--force","Overwrite an existing local export").action(async(e,n)=>{let{runExportAction:i,resolveCurrentOrgId:t}=await import("./testmd-actions-OUY5BOAV.js"),o=await t({});o.ok||process.exit(o.code),process.exit(await i(e,n,o.orgId))})}function Se(l){let e=new Vn;if(e.name("kane-cli").version(Ae).showHelpAfterError("(run `kane-cli --help` to see all commands; `-h` and `help` also work)"),e.on("command:*",i=>{e.error(`error: unknown command '${i[0]}'`,{exitCode:2,code:"commander.unknownCommand"})}),l[0]==="--help"||l[0]==="-h"||l[0]==="help"){(async()=>{let{HelpView:i}=await import("./HelpView-KHQYGSD2.js"),{render:t}=await import("./build-JIKYOZUH.js"),o=await import("./react-QWOAB3TB.js"),{waitUntilExit:s}=t(o.default.createElement(i));await s(),g(0,"Help displayed")})();return}e.command("login").option("--oauth","Login via OAuth (opens browser)").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").addOption(new X("--env <name>","Environment (prod or stage)").default("prod").hideHelp()).option("--profile <name>","Profile name","default").option("--project-id <id>","Project ID (skip picker)").option("--folder-id <id>","Folder ID (skip picker)").addOption(new X("--model <name>","Model").default("v16-alpha").hideHelp()).option("--chrome-profile <path>","Chrome profile path").action(async i=>{let t=new ne,o=new le,s=i.env,a=i.profile;if(!process.stdin.isTTY||i.oauth||i.username){if(t.setDefaultEnv(s),i.oauth)await new Jt(a,s,t).login(),console.log(`Logged in as ${a} [${s}] via OAuth`);else if(i.username&&i.accessKey){try{let{validateBasicAuth:E}=await import("./validate-basic-4YMRWYLS.js");await E(s,i.username,i.accessKey)}catch{console.error("Credentials not valid. Please use valid credentials."),g(1,"Invalid basic-auth credentials");return}t.saveBasicAuth(a,s,{username:i.username,access_key:i.accessKey}),console.log(`Logged in as ${a} [${s}] via basic auth`)}else console.error("Provide --oauth, or --username and --access-key"),g(1,"Missing --oauth or credentials for login");t.setActiveProfile(a),o.set("model",i.model),i.chromeProfile&&o.set("chrome_profile_path",i.chromeProfile);let k=null;if(i.username&&i.accessKey)k={username:i.username,access_key:i.accessKey};else try{let A=await ge({creds:t,env:s,log:()=>{}});A.resolvedCreds&&(k={username:A.resolvedCreds.username,access_key:A.resolvedCreds.access_key})}catch{}if(i.projectId&&(fe(t,o,a,s,{projectId:i.projectId}),console.log(`Project set to ${i.projectId}`)),i.folderId&&(fe(t,o,a,s,{folderId:i.folderId}),console.log(`Folder set to ${i.folderId}`)),k&&(!i.projectId||!i.folderId))try{let E=await qt({creds:t,config:o,profile:a,env:s,tmsCreds:k,log:()=>{}});i.projectId||console.log(`Auto-selected project: ${E.projectName} (${E.projectId})`),i.folderId||console.log(`Auto-selected folder: ${E.folderName} (${E.folderId})`)}catch(E){console.warn(`Could not auto-select project/folder: ${E instanceof Error?E.message:E}`)}Re(t,o,a,s),console.log("Setup complete."),g(0,"Setup complete")}let{SingleShotApp:r}=await import("./SingleShotApp-RO25ZX2E.js"),{ScrollbackProvider:c}=await import("./scrollback-6GINSTL2.js"),{render:m}=await import("./build-JIKYOZUH.js"),u=await import("./react-QWOAB3TB.js"),f={current:null},p={current:!1},{waitUntilExit:d,unmount:b}=m(u.default.createElement(c,null,u.default.createElement(r,{resultRef:f,mode:"login",loginCompleteRef:p})),{exitOnCtrlC:!1});Ee(()=>b()),await d();try{process.stdin.setRawMode?.(!1)}catch{}process.stdout.write("\x1B[?25h"),p.current&&console.log("Login setup complete."),process.exit(0)}),e.command("logout").action(async()=>{let i=new ne,t=i.getActiveProfile();if(!t){console.log("No active profile to logout");return}let o=i.getDefaultEnv(),s=await zt(i,t,o),a=new le;s.switchedTo?(Re(i,a,s.switchedTo.profile,s.switchedTo.env),console.log(`Logged out ${s.profile} [${s.env}]. Switched to ${s.switchedTo.profile} [${s.switchedTo.env}]`)):(a.save({project_id:null,project_name:null,folder_id:null,folder_name:null}),console.log(`Logged out ${s.profile} [${s.env}]. No profiles remaining.`))}),e.command("whoami").option("--profile <name>","Profile name").action(async i=>{let t=new ne,o=i.profile??t.getActiveProfile()??"default",s=t.getDefaultEnv(),a=t.loadCredentials(o,s),r=t.loadBasicAuth(o,s),c="none",m=r?.username,u,f,p,d;if(r?c="basic":a&&(c="oauth",f=new Date(a.expires_at*1e3).toISOString().slice(0,10)),c==="none")u="missing";else try{let w=await ge({creds:t,env:s,log:()=>{}});if(w.resolvedCreds)p="verified",u="valid",m=w.resolvedCreds.username??m;else{let{classifyAuthFailure:y}=await import("./resolver-IDCGRPFJ.js");y(w.resolver.lastError)==="auth"?(p="rejected",u="expired",d="Credentials rejected by the server \u2014 re-login or rotate your access key"):(p="unreachable",d=w.resolver.lastError?.message)}}catch(w){let y=w;y.code==="refresh_failed"?(p="rejected",u="expired",d="OAuth token refresh failed \u2014 run 'kane-cli login'"):y.code==="not_authenticated"?(c="none",u="missing"):(p="unreachable",d=y.message)}let{WhoamiView:b}=await import("./WhoamiView-KVIQCGRC.js"),{render:k}=await import("./build-JIKYOZUH.js"),E=await import("./react-QWOAB3TB.js"),{waitUntilExit:A}=k(E.default.createElement(b,{profile:o,env:s,authenticated:p==="verified",authMethod:c,username:m,tokenStatus:u,expiresAt:f,serverStatus:p,detail:d}));await A(),c==="none"?g(1,"whoami: not-authenticated"):p&&p!=="verified"&&g(p==="unreachable"?3:1,`whoami: ${p}`)}),e.command("config <action> [value]").description("Show or change settings (show, set-mode, set-assertion-mode, set-network-ws, set-network-sse, set-url, set-window, chrome-profile, project, folder, reset)").option("--agent","Force JSON output for `show` (auto-on when stdin is not a TTY)").action(async(i,t,o)=>{let s=new le,a=new ne;if(i==="show"){let r=s.load(),c=a.getActiveProfile()??"default",m=a.getDefaultEnv(),u=a.loadProfileConfig(c,m)??{},f=u.project_id??r.project_id??null,p=u.project_name??r.project_name??null,d=u.folder_id??r.folder_id??null,b=u.folder_name??r.folder_name??null,k=a.loadBasicAuth(c,m),E=a.loadCredentials(c,m),A=k?`basic (${k.username})`:E?"oauth":"not configured";if(!!o?.agent||!process.stdin.isTTY||!process.stdout.isTTY){let M=Q(m);process.stdout.write(`${JSON.stringify({profile:c,env:m,auth:A,project_id:f,project_name:p,folder_id:d,folder_name:b,model:r.model,mode:r.mode,assertion_mode:r.assertion_mode,network_ws:r.network_ws,network_sse:r.network_sse,window_size:`${r.window_size.width}x${r.window_size.height}`,chrome_profile:r.chrome_profile_path,default_url:r.default_url??Ke,controller_base_url:M.controllerBaseUrl,tms_base_url:M.tmsBaseUrl})}
27
+ `),g(0,"config show complete");return}let{ConfigView:y}=await import("./ConfigView-Y7E4Q647.js"),{render:j}=await import("./build-JIKYOZUH.js"),S=await import("./react-QWOAB3TB.js"),{waitUntilExit:O}=j(S.default.createElement(y,{model:r.model,authLabel:A,profile:c,env:m,defaultUrl:r.default_url??Ke,projectId:f,projectName:p,folderId:d,folderName:b,windowSize:`${r.window_size.width}x${r.window_size.height}`,chromeProfile:r.chrome_profile_path}));await O()}else if(i==="set-window"&&t){let r=t.split("x").map(Number),[c,m]=r;!c||!m||!Number.isInteger(c)||!Number.isInteger(m)?console.error("Invalid format. Use: kane-cli config set-window WIDTHxHEIGHT"):c<800||c>3840?console.error(`Width must be between 800 and 3840 (got ${c})`):m<600||m>2160?console.error(`Height must be between 600 and 2160 (got ${m})`):(s.set("window_size",{width:c,height:m}),console.log(`Window size set to ${c}x${m}`))}else if(i==="set-mode"){if(t!=="action"&&t!=="testing"){console.error("Mode must be 'action' or 'testing'."),g(1,"Invalid mode");return}s.set("mode",t),console.log(`Mode set to ${t}`)}else if(i==="set-assertion-mode"){if(t!=="visual"&&t!=="dom"){console.error("Assertion mode must be 'visual' or 'dom'."),g(1,"Invalid assertion-mode");return}s.set("assertion_mode",t),console.log(`Assertion mode set to ${t}`)}else if(i==="set-network-ws"){if(t!=="on"&&t!=="off"){console.error("WebSocket capture must be 'on' or 'off'."),g(1,"Invalid network-ws value");return}s.set("network_ws",t==="on"),console.log(`WebSocket capture set to ${t}`)}else if(i==="set-network-sse"){if(t!=="on"&&t!=="off"){console.error("SSE capture must be 'on' or 'off'."),g(1,"Invalid network-sse value");return}s.set("network_sse",t==="on"),console.log(`SSE capture set to ${t}`)}else if(i==="set-url"){if(!t){console.error("Usage: kane-cli config set-url <url>"),g(1,"Missing URL");return}let r=nn(t);if(!r){console.error(`Invalid URL: ${t}`),g(1,"Invalid URL");return}s.set("default_url",r),console.log(`Default URL set to ${r}`)}else if(i==="chrome-profile"){if(t||!process.stdin.isTTY){t||(console.error("Usage: kane-cli config chrome-profile <path>"),g(1,"Missing chrome-profile path")),s.set("chrome_profile_path",t),console.log(`Chrome profile set to ${t}`);return}let{ChromeProfilePicker:r}=await import("./ChromeProfilePicker-EFEVOCWS.js"),{render:c}=await import("./build-JIKYOZUH.js"),m=await import("./react-QWOAB3TB.js");await new Promise(u=>{let{unmount:f}=c(m.default.createElement(r,{currentPath:s.load().chrome_profile_path,onSelect:p=>{s.set("chrome_profile_path",p),console.log(`Chrome profile set to ${p}`),f(),u()},onCancel:()=>{f(),u()}}))})}else if(i==="project"){if(t||!process.stdin.isTTY){t||(console.error("Usage: kane-cli config project <project-id>"),g(1,"Missing project ID"));let w=a.getActiveProfile()??"default",y=a.getDefaultEnv();fe(a,s,w,y,{projectId:t}),console.log(`Project set to ${t}`);return}let r=a.getDefaultEnv(),c=Q(r),m=a.getActiveProfile()??"default",{resolveTmsBasicAuth:u,formatAuthResolutionError:f}=await import("./list-commands-PNYMVI6X.js"),p=await u(m,r,{});if(!p.ok){let{message:w}=f(m,r,p);process.stderr.write(w),g(2,`${p.reason} for "${m}" [${r}]`);return}let{ProjectPicker:d}=await import("./ProjectPicker-Y4A4UVHA.js"),{AuthResolver:b}=await import("./resolver-IDCGRPFJ.js"),{render:k}=await import("./build-JIKYOZUH.js"),E=await import("./react-QWOAB3TB.js"),A=new b(c.controllerBaseUrl,async()=>null,{username:p.creds.username,access_key:p.creds.access_key});await A.resolve(),await new Promise(w=>{let{unmount:y}=k(E.default.createElement(d,{resolver:A,currentProjectId:s.load().project_id,env:r,onSelect:(j,S)=>{let O=a.getActiveProfile()??"default",M=a.getDefaultEnv();fe(a,s,O,M,{projectId:j,projectName:S}),console.log(`Project set to ${S} (${j})`),y(),w()},onCancel:()=>{y(),w()}}))})}else if(i==="folder"){if(t||!process.stdin.isTTY){if(t||(console.error("Usage: kane-cli config folder <folder-id>"),g(1,"Missing folder ID")),!s.load().project_id){console.log("Select a project first: kane-cli config project <id>");return}let j=a.getActiveProfile()??"default",S=a.getDefaultEnv();fe(a,s,j,S,{folderId:t}),console.log(`Folder set to ${t}`);return}let r=s.load();if(!r.project_id){console.log("Select a project first: kane-cli config project");return}let c=a.getDefaultEnv(),m=Q(c),u=a.getActiveProfile()??"default",{resolveTmsBasicAuth:f,formatAuthResolutionError:p}=await import("./list-commands-PNYMVI6X.js"),d=await f(u,c,{});if(!d.ok){let{message:y}=p(u,c,d);process.stderr.write(y),g(2,`${d.reason} for "${u}" [${c}]`);return}let{FolderPicker:b}=await import("./FolderPicker-LI5JKG2S.js"),{AuthResolver:k}=await import("./resolver-IDCGRPFJ.js"),{render:E}=await import("./build-JIKYOZUH.js"),A=await import("./react-QWOAB3TB.js"),w=new k(m.controllerBaseUrl,async()=>null,{username:d.creds.username,access_key:d.creds.access_key});await w.resolve(),await new Promise(y=>{let{unmount:j}=E(A.default.createElement(b,{resolver:w,projectId:r.project_id,currentFolderId:r.folder_id,env:c,onSelect:(S,O)=>{let M=a.getActiveProfile()??"default",he=a.getDefaultEnv();fe(a,s,M,he,{folderId:S,folderName:O}),console.log(`Folder set to ${O} (${S})`),j(),y()},onCancel:()=>{j(),y()}}))})}else console.log("Usage: kane-cli config show|set-url|set-window|set-mode|set-assertion-mode|set-network-ws|set-network-sse|chrome-profile|project|folder")}),e.command("run").argument("<objective>","Test objective (use {{var}} to reference variables)").option("--headless","Run Chrome in headless mode").option("--max-steps <n>","Maximum agent steps","30").option("--timeout <seconds>","Kill run after N seconds").option("--url <url>","Start URL for the run").option("--cdp-endpoint <url>","Connect to existing Chrome CDP endpoint").option("--ws-endpoint <url>","Connect via Playwright WebSocket (e.g. LambdaTest wss:// URL)").option("--global-context <file>",`Override global context markdown (default: ${oe(ae,"global-memory.md")})`).option("--local-context <file>","Override local context markdown (default: .testmuai/context.md in cwd)").addOption(new X("--model <name>","Model override").hideHelp()).option("--variables <json>",`Inline variables JSON, e.g. '{"user": {"value": "alice"}}'`).option("--variables-file <path>","Load variables from a JSON file").option("--session-context <json>","Session context JSON (prior runs)").addOption(new X("--cft","Use Playwright Chromium instead of managed Chrome").hideHelp()).option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key (skip OAuth)").option("--env <name>","Environment (prod or stage)").option("--mode <name>","Run mode: 'action' (strict \u2014 hard-stop on auth/blocked/error) or 'testing' (lenient \u2014 fall through). Overrides config; default: testing.").option("--assertion-mode <mode>","Assertion mode: 'visual' (default, vision model) or 'dom' (DOM-based extraction & assertions). Overrides config.").option("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").option("--network-ws","Capture WebSocket frames for assertions/extraction (experimental)").option("--network-sse","Capture Server-Sent Events messages (Chromium-only) for assertions/extraction (experimental)").addOption(new X("--local","Skip TMS integration (no uploads, no variables/secrets push)").hideHelp()).option("--allow-missing-url","Non-TTY only: proceed from the browser's current page instead of failing when no start URL resolves (a provided --url is still used)").option("--code-export","Generate code export after upload").option("--code-language <lang>","Code export language: python (default) | javascript").option("--name <name>","Persist the session under this name (validated [a-zA-Z0-9_-]+)").option("--chrome-profile <path>","Chrome user-data-dir for this run (overrides stored config)").option("--skip-code-validation","Skip post-codegen worker-side validation").option("--no-skip-code-validation","Force post-codegen worker-side validation").addHelpText("after",`
28
28
  Variables:
29
29
  Variables are loaded in order (later wins):
30
30
  1. Global: ${oe(ae,"variables")}/*.json
@@ -48,13 +48,13 @@ Context Files:
48
48
  Override with --global-context / --local-context flags.
49
49
  `).action(async(i,t)=>{try{if(t.name){let{validateNameOrThrow:h}=await import("./name-validator-5YGJXLZ7.js");try{h(t.name)}catch(v){console.error(`error: ${v.message}`),g(2,"Invalid --name");return}}if(i&&i.endsWith(".md")&&!i.startsWith("-")){process.stderr.write(`error: '.md' files are no longer accepted by 'kane run'.
50
50
  Use 'kane-cli testmd run <path>' instead.
51
- `),process.exit(2);return}let o=new ne,s=new le,a=s.load();t.chromeProfile&&(a.chrome_profile_path=t.chromeProfile);let r;if(t.mode===void 0)r=a.mode==="action"?"action":"testing";else if(t.mode==="action"||t.mode==="testing")r=t.mode;else{console.error("Invalid --mode. Must be 'action' or 'testing'."),g(2,"Invalid --mode");return}let c;if(t.assertionMode===void 0)c=a.assertion_mode==="dom"?"dom":"visual";else if(t.assertionMode==="visual"||t.assertionMode==="dom")c=t.assertionMode;else{console.error("Invalid --assertion-mode. Must be 'visual' or 'dom'."),g(2,"Invalid --assertion-mode");return}let m=new Ht,{printRecordingBanner:u}=await import("./recording-banner-P6EKDS2Y.js");await u({isAgent:!!t.agent||!process.stdin.isTTY,sessionId:m.sessionId,sessionName:t.name??null,testPath:t.name?oe(process.cwd(),".testmuai","tests",`${t.name}_test.md`):null,outputPath:t.name?oe(process.cwd(),".testmuai","tests",`output-${t.name}`):null});let f=!!(t.username&&t.accessKey);if(await ln({isInteractive:!!process.stdin.isTTY&&!t.agent&&!f,creds:o,config:s}),!f){let h=o.getActiveProfile(),v=o.getDefaultEnv();h&&(o.loadBasicAuth(h,v)||o.loadCredentials(h,v))||(console.error("Not authenticated. Run: kane-cli login --oauth, or kane-cli login --username <user> --access-key <key>"),g(1,"Not authenticated"))}let p=`${o.getActiveProfile()??"no profile"}/${o.getDefaultEnv()}`,d=[],b=t.env??o.getDefaultEnv(),k=null,E=[],A=(h,v,C,I)=>{k?k(h,v,C,I):E.push([h,v,C,I])},w;try{w=await ge({creds:o,env:b,usernameFlag:t.username,accessKeyFlag:t.accessKey,log:A})}catch(h){throw h instanceof rn&&(console.error(h.code==="not_authenticated"?"Not authenticated. Run: kane-cli login":"Token refresh failed. Run: kane-cli login"),g(2,h.code==="not_authenticated"?"Not authenticated":"Token refresh failed")),h}let y=!!w.basicAuth,j=w.basicAuth?.username,S=w.basicAuth?.access_key,O=w.token,M=w.resolver,he=w.resolvedCreds;w.basicAuth&&d.push(`Auth: ${w.basicAuth.username}`);let yt=o.getActiveProfile()??"default",Et=o.getDefaultEnv();Bt(o,s,yt,Et);let L=s.load(),we=w.basicAuth??(w.resolvedCreds?{username:w.resolvedCreds.username,access_key:w.resolvedCreds.access_key}:null);if(we){let h=!!t.agent||!process.stdin.isTTY,v=await Yt({creds:o,config:s,profile:yt,env:Et,tmsCreds:we,isLocal:!!t.local,log:A});v.status==="cancelled"&&(console.error("error: project/folder configuration failed. See remediation above, or use --local."),g(2,"project/folder gate failed")),v.status==="ok"&&v.autoDefaulted&&h&&process.stdout.write(Kt(v.autoDefaulted)),L=s.load()}else t.local||(console.error("Project and folder must be configured. Run `kane-cli login` to set up auth, or pass --username/--access-key, then `kane-cli config project <id>` / `kane-cli config folder <id>`."),g(2,"no TMS credentials for project/folder gate"));let _e=on({flag:t.url,configDefault:a.default_url}),ti=sn({resolvedUrl:_e,local:t.local,allowMissingUrl:t.allowMissingUrl,isTTY:!!process.stdin.isTTY}),F=hn({objective:i,globalDir:oe(ae,"variables"),localDir:oe(process.cwd(),".testmuai","variables"),file:t.variablesFile,inline:t.variables,onLoadError:h=>console.error(h)}),kt;if(t.sessionContext)try{kt=JSON.parse(t.sessionContext)}catch{console.error("Invalid --session-context JSON"),g(2,"Invalid --session-context JSON")}let ni=t.globalContext??oe(ae,"global-memory.md"),ii=t.localContext??oe(process.cwd(),".testmuai","context.md"),St=Ze(ni),xt=Ze(ii),Z;try{Z=await mn({config:a,startUrl:_e??void 0,headless:t.headless,cft:t.cft,wsEndpoint:t.wsEndpoint,cdpEndpoint:t.cdpEndpoint})}catch(h){console.error(Xt(h));let v=h instanceof Qt?"Chrome not found at standard paths":`Chrome failed: ${h instanceof Error?h.message:h}`;g(2,v)}Z.instance&&Te("chrome",()=>{Z.instance.kill()});let K=null,At=Z.cdpEndpoint??t.cdpEndpoint;At&&!t.cft&&!t.wsEndpoint&&(K=en({headless:t.headless,cdpEndpoint:At,chromePid:Z.instance?.process.pid}),K&&Te("marker-overlay",()=>K.kill())),t.cft?d.push("CfT mode: Playwright will manage its own browser"):t.wsEndpoint?d.push(`Playwright WS endpoint (${t.wsEndpoint.slice(0,60)}...)`):t.cdpEndpoint?d.push(`CDP connected (${t.cdpEndpoint})`):Z.cdpEndpoint&&d.push(`Chrome ready (${Z.cdpEndpoint})`);let _=m;_.start({model:t.model??a.model,environment:b,profile:o.getActiveProfile()}),t.name&&_.setSessionName(t.name),w.resolvedCreds?.org_id!==void 0&&_.setOrgId(String(w.resolvedCreds.org_id)),w.resolvedCreds?.plan!==void 0&&_.setPlan(w.resolvedCreds.plan??null),k=(h,v,C,I)=>_.log(h,v,C,I);for(let h of E)_.log(...h);E.length=0;let Ot=y&&j&&S?{username:j,accessKey:S}:O??null,ee=null;if(Ot!==null){let h=await _n({env:b,tmsCreds:w.resolvedCreds??null,resolver:w.resolver,auth:Ot,getToken:async()=>w.token??null,session:_,log:(v,C,I,Y)=>_.log(v,C,I,Y),skipScreenshotQueue:t.local,invocationMode:t.agent||!process.stdin.isTTY?"agent":"cli"});ee=h.screenshotQueue,h.remoteLogger&&(Te("remote-logger",()=>h.remoteLogger.shutdownSync()),Wt(h.remoteLogger))}let Rt=w.basicAuth&&!t.local?await gn({variables:F,auth:w.basicAuth,orgId:String(w.resolvedCreds?.org_id??""),env:b,localMode:!!t.local,log:(h,v,C,I)=>_.log(h,v,C,I)}):{};if(_.setAuteurVariables(F.auteur),_.setFirstRun(F.auteurObjective,_e??""),!t.local&&w.basicAuth&&L.project_id){let h=Q(b),v=await wn({tmsBaseUrl:h.tmsBaseUrl,auth:w.basicAuth,objective:F.auteurObjective,url:_e??"",projectId:L.project_id,folderId:L.folder_id??"",hasCustomProfile:!!a.chrome_profile_path,log:(C,I,Y,ue)=>_.log(C,I,Y,ue)});v&&_.setTestId(v)}_.setResolvedGlobal({mode:r,max_steps:parseInt(t.maxSteps,10),timeout:t.timeout?parseInt(t.timeout,10):void 0,target:Z.instance?"chrome":t.cdpEndpoint?"cdp":t.wsEndpoint?"ws":void 0,chrome_profile:a.chrome_profile_path||void 0,cdp_endpoint:t.cdpEndpoint||void 0,ws_endpoint:t.wsEndpoint||void 0,headless:t.headless,global_context:St??void 0,local_context:xt??void 0,variables:Object.keys(F.auteur).length>0?F.auteur:void 0});let Tt=pn(F.auteur,F.auteurObjective),It=fn({objective:F.auteurObjective,url:_e??void 0,requireStartUrl:ti,model:t.model??a.model,chrome:Z,auth:w,sessionId:_.sessionId,runIndex:0,windowSize:a.window_size,maxSteps:parseInt(t.maxSteps,10),headless:t.headless,disableAskUser:!process.stdin.isTTY,enableTaskSkills:t.taskSkills,networkWs:t.networkWs,networkSse:t.networkSse,variables:Object.keys(Tt).length>0?Tt:void 0,globalContext:St??void 0,localContext:xt??void 0,sessionContext:kt}),$t=ee?(h,v,C)=>{dn(_.sessionDir,v,h,ee,(I,Y,ue,D)=>_.log(I,Y,ue,D),C)}:void 0;if(!process.stdin.isTTY&&!t.agent&&(t.agent=!0),t.agent){let h=x=>{process.stdout.write(JSON.stringify(x)+`
52
- `)};K?.setRunActive(!0);let v;try{v=await Bn(It,{environment:b,mode:r,assertionMode:c,log:(x,R,H,se)=>_.log(x,R,H,se)},{onStepEnd:$t,onStepLog:(x,R,H)=>_.logStep(x,R,H),onReasoning:x=>K?.setStepText(x),onStepComplete:()=>K?.setStepComplete()})}finally{K?.setRunActive(!1)}let{lastRunEnd:C,stepsTotal:I,hadError:Y,bifurcationFlows:ue}=v;if(Y&&_.escalateRun(0),C){let x=Ye(C,0,ue);_.addRunResult(Je(C,F.auteurObjective,0,x),C.total_runs);let R=C.status==="passed"?"passed":Y?"error":"failed";_.addFlow({runIndex:0,objective:F.auteurObjective,status:R,summary:C.summary??"",duration:C.duration??0,steps:I,stepsPassed:R==="passed"?I:0,stepsFailed:R==="passed"?0:I,reason:C.reason,creditsConsumed:C.credits_consumed})}ze("chrome","Agent run completed");let D;if(_.log("info","DIRECT_UPLOAD_START","Starting direct upload (agent mode)",{agent_mode:!0,last_run_end:!!C,local:!!t.local}),C&&!t.local)try{let x=Q(b),R=L.project_id;if(w.basicAuth){let{UploadPipeline:H}=await import("./pipeline-34CX3UBO.js");ee&&await ee.drain();let se=et({session:_,env:b,auth:w,variables:F,variableIds:Rt,projectId:R,folderId:L.folder_id,totalSteps:I,totalDuration:C.duration??0,screenshotExtMap:ee?.getExtMap(),codeExport:tt({codeExport:t.codeExport,codeLanguage:t.codeLanguage,skipCodeValidation:t.skipCodeValidation},a.code_export),onProgress:()=>{},log:(J,qe,ri,ai)=>_.log(J,qe,ri,ai),shouldUploadArtifacts:!t.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0}),q=await new H(se).execute();q.success&&(q.testcaseId&&_.setTestcaseId(q.testcaseId),q.testcaseId&&q.shareId&&R&&(D=$e(x.testManagerUiUrl,R,q.testcaseId,q.shareId)));try{let{persistRecordedSession:J}=await import("./persist-recorded-session-3I4KMEXA.js");J(_,{testcaseId:_.testcaseId??void 0,projectId:L.project_id??void 0,folderId:L.folder_id??void 0,codeExportDir:q.codeExportDir})}catch(J){_.log("error","DIRECT_PERSIST_ERROR","Persist failed in agent mode",{error:String(J)})}}}catch(x){_.log("error","DIRECT_UPLOAD_ERROR","Upload failed in agent mode",{error:x instanceof Error?x.message:String(x)})}if(C){let x={...C};D&&(x.test_url=D),h(x)}await _.finish("complete"),C||g(Y?2:1,"Agent run ended with no result");let U=C.reason??"";(U.includes("Cancel")||U.includes("Timeout"))&&g(3,`Agent run: ${U}`),C.status==="passed"&&g(0,"Agent run passed"),g(1,"Agent run failed")}let N=null,ve=0,Le=!1,Pt=null,Dt=0,jt={current:null},oi=we?{authHeader:Lt(we.username,we.access_key),sessionId:_.sessionId,controllerBaseUrl:Q(b).controllerBaseUrl}:null,{waitUntilExit:si}=Ce(wt.default.createElement(ye,null,wt.default.createElement(Hn,{config:It,describeContext:oi,spawnOpts:{environment:b,mode:r,assertionMode:c,log:(h,v,C,I)=>_.log(h,v,C,I)},cancelRef:jt,banner:{model:t.model??a.model,auth:p,status:d},onComplete:h=>{N=h.lastRunEnd,ve=h.stepsTotal,Le=h.hadError,Pt=h.bifurcationFlows,Dt=h.describeCredits},onStepEnd:$t,onReasoning:h=>K?.setStepText(h),onStepComplete:()=>K?.setStepComplete()})),{stdout:process.stderr,exitOnCtrlC:!1}),He;if(t.timeout){let h=parseInt(t.timeout,10)*1e3;He=setTimeout(()=>{console.error(`
53
- Timeout: ${t.timeout}s exceeded \u2014 cancelling...`),jt.current?.()},h)}K?.setRunActive(!0);try{await si()}finally{K?.setRunActive(!1)}if(He&&clearTimeout(He),N){let h=Ye(N,0,Pt);_.addRunResult(Je(N,F.auteurObjective,0,h),N.total_runs);let v=N.status==="passed"?"passed":Le?"error":"failed";_.addFlow({runIndex:0,objective:F.auteurObjective,status:v,summary:N.summary??"",duration:N.duration??0,steps:ve,stepsPassed:v==="passed"?ve:0,stepsFailed:v==="passed"?0:ve,reason:N.reason,creditsConsumed:(N.credits_consumed??0)+Dt})}if(ze("chrome","Ink run completed"),_.log("info","DIRECT_UPLOAD_START","Starting direct upload (ink mode)",{ink_mode:!0,last_event:!!N,local:!!t.local}),N&&!t.local)try{let h=Q(b),v=L.project_id;if(w.basicAuth){let{UploadPipeline:C}=await import("./pipeline-34CX3UBO.js");ee&&(_.log("info","SCREENSHOT_UPLOAD_DRAIN","Draining screenshot upload queue before pipeline"),await ee.drain(),_.log("info","SCREENSHOT_UPLOAD_DRAINED","Screenshot upload queue drained"));let I=et({session:_,env:b,auth:w,variables:F,variableIds:Rt,projectId:L.project_id,folderId:L.folder_id,totalSteps:ve,totalDuration:N.duration??0,screenshotExtMap:ee?.getExtMap(),codeExport:tt({codeExport:t.codeExport,codeLanguage:t.codeLanguage,skipCodeValidation:t.skipCodeValidation},a.code_export),onProgress:()=>{},log:(U,x,R,H)=>_.log(U,x,R,H),shouldUploadArtifacts:!t.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0}),Y=new C(I),{renderUploadProgress:ue}=await import("./CliUploadProgress-Y4H43W5T.js"),D=await ue(Y,U=>{if(U.testcaseId&&U.shareId&&v)return $e(h.testManagerUiUrl,v,U.testcaseId,U.shareId)});if(D.success){D.testcaseId&&_.setTestcaseId(D.testcaseId);let U=r==="testing",x=_.nextRunIndex()>0;if(U&&!t.name&&x&&process.stdin.isTTY)try{let{renderSavePrompt:B,defaultSessionTimestamp:q}=await import("./SaveSessionPrompt-DFVUWTOK.js"),J=await B(q());J&&_.setSessionName(J)}catch(B){_.log("warn","DIRECT_SAVE_PROMPT_FAILED","Save prompt failed",{error:String(B)})}let R=null;try{let{persistRecordedSession:B}=await import("./persist-recorded-session-3I4KMEXA.js");R=B(_,{testcaseId:_.testcaseId??void 0,projectId:L.project_id??void 0,folderId:L.folder_id??void 0,codeExportDir:D.codeExportDir})}catch(B){_.log("error","DIRECT_PERSIST_ERROR","Persist failed in ink mode",{error:String(B)})}let H=D.testcaseId&&D.shareId&&v?$e(h.testManagerUiUrl,v,D.testcaseId,D.shareId):void 0,se=D.testcaseId&&v?un(h.testManagerUiUrl,v,D.testcaseId):void 0;if(H||se||D.codeExportDir||R){let{LinksBox:B}=await import("./LinksBox-UYMOQGSW.js"),{render:q}=await import("./build-JIKYOZUH.js"),J=await import("./react-QWOAB3TB.js"),{waitUntilExit:qe}=q(J.default.createElement(B,{recordedTestPath:R?.recordedTestPath,outputDir:R?.outputDir,shareableLink:H,testCaseLink:se,codeExportDir:D.codeExportDir}),{stdout:process.stderr});await qe()}}if(_.testId){let{renderFeedbackPrompt:U}=await import("./CliFeedbackPrompt-BV4VVYOY.js"),x=await U();if(x)try{await bn({tmsBaseUrl:h.tmsBaseUrl,username:w.basicAuth.username,accessKey:w.basicAuth.access_key,testId:_.testId,feedbackType:x,log:(R,H,se,B)=>_.log(R,H,se,B)})}catch(R){_.log("warn","FEEDBACK_FAILED","Feedback submission failed",{error:String(R)})}}}}catch(h){_.log("error","DIRECT_UPLOAD_FAILED","Direct upload failed (ink mode)",{error:h instanceof Error?h.stack??h.message:String(h)}),console.error(`Upload failed: ${h}`)}await _.finish("complete"),N||g(Le?2:1,"Run ended with no result");let Be=N.reason??"";(Be.includes("Cancel")||Be.includes("Timeout"))&&g(3,`Run: ${Be}`),N.status==="passed"&&g(0,"Run passed"),g(1,"Run failed")}catch(o){g(2,`CLI error: ${o instanceof Error?o.message:String(o)}`)}}),qn(e),En(e),e.command("install <target> [version]").description("Install kane-cli agent skill into Claude Code / Codex CLI / Gemini CLI (version defaults to latest compatible)").action(async(i,t)=>{if(i!=="skill"){console.error(`error: unknown install target '${i}'. Supported: skill`),g(2,`unknown install target '${i}'`);return}let{installSkill:o,formatInstallResult:s}=await import("./skill-installer-SU52XOIT.js"),a=await o(t);!process.stdin.isTTY?process.stdout.write(JSON.stringify({type:"skill_install_result",status:a.status,version:a.version,installed_targets:a.installedTargets,error:a.error})+`
51
+ `),process.exit(2);return}let o=new ne,s=new le,a=s.load();t.chromeProfile&&(a.chrome_profile_path=t.chromeProfile);let r;if(t.mode===void 0)r=a.mode==="action"?"action":"testing";else if(t.mode==="action"||t.mode==="testing")r=t.mode;else{console.error("Invalid --mode. Must be 'action' or 'testing'."),g(2,"Invalid --mode");return}let c;if(t.assertionMode===void 0)c=a.assertion_mode==="dom"?"dom":"visual";else if(t.assertionMode==="visual"||t.assertionMode==="dom")c=t.assertionMode;else{console.error("Invalid --assertion-mode. Must be 'visual' or 'dom'."),g(2,"Invalid --assertion-mode");return}let m=new Ht,{printRecordingBanner:u}=await import("./recording-banner-3XTXU2VL.js");await u({isAgent:!!t.agent||!process.stdin.isTTY,sessionId:m.sessionId,sessionName:t.name??null,testPath:t.name?oe(process.cwd(),".testmuai","tests",`${t.name}_test.md`):null,outputPath:t.name?oe(process.cwd(),".testmuai","tests",`output-${t.name}`):null});let f=!!(t.username&&t.accessKey);if(await ln({isInteractive:!!process.stdin.isTTY&&!t.agent&&!f,creds:o,config:s}),!f){let h=o.getActiveProfile(),v=o.getDefaultEnv();h&&(o.loadBasicAuth(h,v)||o.loadCredentials(h,v))||(console.error("Not authenticated. Run: kane-cli login --oauth, or kane-cli login --username <user> --access-key <key>"),g(1,"Not authenticated"))}let p=`${o.getActiveProfile()??"no profile"}/${o.getDefaultEnv()}`,d=[],b=t.env??o.getDefaultEnv(),k=null,E=[],A=(h,v,C,I)=>{k?k(h,v,C,I):E.push([h,v,C,I])},w;try{w=await ge({creds:o,env:b,usernameFlag:t.username,accessKeyFlag:t.accessKey,log:A})}catch(h){throw h instanceof rn&&(console.error(h.code==="not_authenticated"?"Not authenticated. Run: kane-cli login":"Token refresh failed. Run: kane-cli login"),g(2,h.code==="not_authenticated"?"Not authenticated":"Token refresh failed")),h}let y=!!w.basicAuth,j=w.basicAuth?.username,S=w.basicAuth?.access_key,O=w.token,M=w.resolver,he=w.resolvedCreds;w.basicAuth&&d.push(`Auth: ${w.basicAuth.username}`);let yt=o.getActiveProfile()??"default",Et=o.getDefaultEnv();Bt(o,s,yt,Et);let L=s.load(),we=w.basicAuth??(w.resolvedCreds?{username:w.resolvedCreds.username,access_key:w.resolvedCreds.access_key}:null);if(we){let h=!!t.agent||!process.stdin.isTTY,v=await Yt({creds:o,config:s,profile:yt,env:Et,tmsCreds:we,isLocal:!!t.local,log:A});v.status==="cancelled"&&(console.error("error: project/folder configuration failed. See remediation above, or use --local."),g(2,"project/folder gate failed")),v.status==="ok"&&v.autoDefaulted&&h&&process.stdout.write(Kt(v.autoDefaulted)),L=s.load()}else t.local||(console.error("Project and folder must be configured. Run `kane-cli login` to set up auth, or pass --username/--access-key, then `kane-cli config project <id>` / `kane-cli config folder <id>`."),g(2,"no TMS credentials for project/folder gate"));let _e=on({flag:t.url,configDefault:a.default_url}),ti=sn({resolvedUrl:_e,local:t.local,allowMissingUrl:t.allowMissingUrl,isTTY:!!process.stdin.isTTY}),F=hn({objective:i,globalDir:oe(ae,"variables"),localDir:oe(process.cwd(),".testmuai","variables"),file:t.variablesFile,inline:t.variables,onLoadError:h=>console.error(h)}),kt;if(t.sessionContext)try{kt=JSON.parse(t.sessionContext)}catch{console.error("Invalid --session-context JSON"),g(2,"Invalid --session-context JSON")}let ni=t.globalContext??oe(ae,"global-memory.md"),ii=t.localContext??oe(process.cwd(),".testmuai","context.md"),St=Ze(ni),xt=Ze(ii),Z;try{Z=await mn({config:a,startUrl:_e??void 0,headless:t.headless,cft:t.cft,wsEndpoint:t.wsEndpoint,cdpEndpoint:t.cdpEndpoint})}catch(h){console.error(Xt(h));let v=h instanceof Qt?"Chrome not found at standard paths":`Chrome failed: ${h instanceof Error?h.message:h}`;g(2,v)}Z.instance&&Te("chrome",()=>{Z.instance.kill()});let K=null,At=Z.cdpEndpoint??t.cdpEndpoint;At&&!t.cft&&!t.wsEndpoint&&(K=en({headless:t.headless,cdpEndpoint:At,chromePid:Z.instance?.process.pid}),K&&Te("marker-overlay",()=>K.kill())),t.cft?d.push("CfT mode: Playwright will manage its own browser"):t.wsEndpoint?d.push(`Playwright WS endpoint (${t.wsEndpoint.slice(0,60)}...)`):t.cdpEndpoint?d.push(`CDP connected (${t.cdpEndpoint})`):Z.cdpEndpoint&&d.push(`Chrome ready (${Z.cdpEndpoint})`);let _=m;_.start({model:t.model??a.model,environment:b,profile:o.getActiveProfile()}),t.name&&_.setSessionName(t.name),w.resolvedCreds?.org_id!==void 0&&_.setOrgId(String(w.resolvedCreds.org_id)),w.resolvedCreds?.plan!==void 0&&_.setPlan(w.resolvedCreds.plan??null),k=(h,v,C,I)=>_.log(h,v,C,I);for(let h of E)_.log(...h);E.length=0;let Ot=y&&j&&S?{username:j,accessKey:S}:O??null,ee=null;if(Ot!==null){let h=await _n({env:b,tmsCreds:w.resolvedCreds??null,resolver:w.resolver,auth:Ot,getToken:async()=>w.token??null,session:_,log:(v,C,I,Y)=>_.log(v,C,I,Y),skipScreenshotQueue:t.local,invocationMode:t.agent||!process.stdin.isTTY?"agent":"cli"});ee=h.screenshotQueue,h.remoteLogger&&(Te("remote-logger",()=>h.remoteLogger.shutdownSync()),Wt(h.remoteLogger))}let Rt=w.basicAuth&&!t.local?await gn({variables:F,auth:w.basicAuth,orgId:String(w.resolvedCreds?.org_id??""),env:b,localMode:!!t.local,log:(h,v,C,I)=>_.log(h,v,C,I)}):{};if(_.setAuteurVariables(F.auteur),_.setFirstRun(F.auteurObjective,_e??""),!t.local&&w.basicAuth&&L.project_id){let h=Q(b),v=await wn({tmsBaseUrl:h.tmsBaseUrl,auth:w.basicAuth,objective:F.auteurObjective,url:_e??"",projectId:L.project_id,folderId:L.folder_id??"",hasCustomProfile:!!a.chrome_profile_path,log:(C,I,Y,ue)=>_.log(C,I,Y,ue)});v&&_.setTestId(v)}_.setResolvedGlobal({mode:r,max_steps:parseInt(t.maxSteps,10),timeout:t.timeout?parseInt(t.timeout,10):void 0,target:Z.instance?"chrome":t.cdpEndpoint?"cdp":t.wsEndpoint?"ws":void 0,chrome_profile:a.chrome_profile_path||void 0,cdp_endpoint:t.cdpEndpoint||void 0,ws_endpoint:t.wsEndpoint||void 0,headless:t.headless,global_context:St??void 0,local_context:xt??void 0,variables:Object.keys(F.auteur).length>0?F.auteur:void 0});let Tt=pn(F.auteur,F.auteurObjective),It=fn({objective:F.auteurObjective,url:_e??void 0,requireStartUrl:ti,model:t.model??a.model,chrome:Z,auth:w,sessionId:_.sessionId,runIndex:0,windowSize:a.window_size,maxSteps:parseInt(t.maxSteps,10),headless:t.headless,disableAskUser:!process.stdin.isTTY,enableTaskSkills:t.taskSkills,networkWs:t.networkWs,networkSse:t.networkSse,variables:Object.keys(Tt).length>0?Tt:void 0,globalContext:St??void 0,localContext:xt??void 0,sessionContext:kt}),$t=ee?(h,v,C)=>{dn(_.sessionDir,v,h,ee,(I,Y,ue,D)=>_.log(I,Y,ue,D),C)}:void 0;if(!process.stdin.isTTY&&!t.agent&&(t.agent=!0),t.agent){let h=x=>{process.stdout.write(JSON.stringify(x)+`
52
+ `)};K?.setRunActive(!0);let v;try{v=await Bn(It,{environment:b,mode:r,assertionMode:c,log:(x,R,H,se)=>_.log(x,R,H,se)},{onStepEnd:$t,onStepLog:(x,R,H)=>_.logStep(x,R,H),onReasoning:x=>K?.setStepText(x),onStepComplete:()=>K?.setStepComplete()})}finally{K?.setRunActive(!1)}let{lastRunEnd:C,stepsTotal:I,hadError:Y,bifurcationFlows:ue}=v;if(Y&&_.escalateRun(0),C){let x=Ye(C,0,ue);_.addRunResult(Je(C,F.auteurObjective,0,x),C.total_runs);let R=C.status==="passed"?"passed":Y?"error":"failed";_.addFlow({runIndex:0,objective:F.auteurObjective,status:R,summary:C.summary??"",duration:C.duration??0,steps:I,stepsPassed:R==="passed"?I:0,stepsFailed:R==="passed"?0:I,reason:C.reason,creditsConsumed:C.credits_consumed})}ze("chrome","Agent run completed");let D;if(_.log("info","DIRECT_UPLOAD_START","Starting direct upload (agent mode)",{agent_mode:!0,last_run_end:!!C,local:!!t.local}),C&&!t.local)try{let x=Q(b),R=L.project_id;if(w.basicAuth){let{UploadPipeline:H}=await import("./pipeline-34CX3UBO.js");ee&&await ee.drain();let se=et({session:_,env:b,auth:w,variables:F,variableIds:Rt,projectId:R,folderId:L.folder_id,totalSteps:I,totalDuration:C.duration??0,screenshotExtMap:ee?.getExtMap(),codeExport:tt({codeExport:t.codeExport,codeLanguage:t.codeLanguage,skipCodeValidation:t.skipCodeValidation},a.code_export),onProgress:()=>{},log:(J,qe,ri,ai)=>_.log(J,qe,ri,ai),shouldUploadArtifacts:!t.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0}),q=await new H(se).execute();q.success&&(q.testcaseId&&_.setTestcaseId(q.testcaseId),q.testcaseId&&q.shareId&&R&&(D=$e(x.testManagerUiUrl,R,q.testcaseId,q.shareId)));try{let{persistRecordedSession:J}=await import("./persist-recorded-session-OJPXI4HP.js");J(_,{testcaseId:_.testcaseId??void 0,projectId:L.project_id??void 0,folderId:L.folder_id??void 0,codeExportDir:q.codeExportDir})}catch(J){_.log("error","DIRECT_PERSIST_ERROR","Persist failed in agent mode",{error:String(J)})}}}catch(x){_.log("error","DIRECT_UPLOAD_ERROR","Upload failed in agent mode",{error:x instanceof Error?x.message:String(x)})}if(C){let x={...C};D&&(x.test_url=D),h(x)}await _.finish("complete"),C||g(Y?2:1,"Agent run ended with no result");let U=C.reason??"";(U.includes("Cancel")||U.includes("Timeout"))&&g(3,`Agent run: ${U}`),C.status==="passed"&&g(0,"Agent run passed"),g(1,"Agent run failed")}let N=null,ve=0,Le=!1,Pt=null,Dt=0,jt={current:null},oi=we?{authHeader:Lt(we.username,we.access_key),sessionId:_.sessionId,controllerBaseUrl:Q(b).controllerBaseUrl}:null,{waitUntilExit:si}=Ce(wt.default.createElement(ye,null,wt.default.createElement(Hn,{config:It,describeContext:oi,spawnOpts:{environment:b,mode:r,assertionMode:c,log:(h,v,C,I)=>_.log(h,v,C,I)},cancelRef:jt,banner:{model:t.model??a.model,auth:p,status:d},onComplete:h=>{N=h.lastRunEnd,ve=h.stepsTotal,Le=h.hadError,Pt=h.bifurcationFlows,Dt=h.describeCredits},onStepEnd:$t,onReasoning:h=>K?.setStepText(h),onStepComplete:()=>K?.setStepComplete()})),{stdout:process.stderr,exitOnCtrlC:!1}),He;if(t.timeout){let h=parseInt(t.timeout,10)*1e3;He=setTimeout(()=>{console.error(`
53
+ Timeout: ${t.timeout}s exceeded \u2014 cancelling...`),jt.current?.()},h)}K?.setRunActive(!0);try{await si()}finally{K?.setRunActive(!1)}if(He&&clearTimeout(He),N){let h=Ye(N,0,Pt);_.addRunResult(Je(N,F.auteurObjective,0,h),N.total_runs);let v=N.status==="passed"?"passed":Le?"error":"failed";_.addFlow({runIndex:0,objective:F.auteurObjective,status:v,summary:N.summary??"",duration:N.duration??0,steps:ve,stepsPassed:v==="passed"?ve:0,stepsFailed:v==="passed"?0:ve,reason:N.reason,creditsConsumed:(N.credits_consumed??0)+Dt})}if(ze("chrome","Ink run completed"),_.log("info","DIRECT_UPLOAD_START","Starting direct upload (ink mode)",{ink_mode:!0,last_event:!!N,local:!!t.local}),N&&!t.local)try{let h=Q(b),v=L.project_id;if(w.basicAuth){let{UploadPipeline:C}=await import("./pipeline-34CX3UBO.js");ee&&(_.log("info","SCREENSHOT_UPLOAD_DRAIN","Draining screenshot upload queue before pipeline"),await ee.drain(),_.log("info","SCREENSHOT_UPLOAD_DRAINED","Screenshot upload queue drained"));let I=et({session:_,env:b,auth:w,variables:F,variableIds:Rt,projectId:L.project_id,folderId:L.folder_id,totalSteps:ve,totalDuration:N.duration??0,screenshotExtMap:ee?.getExtMap(),codeExport:tt({codeExport:t.codeExport,codeLanguage:t.codeLanguage,skipCodeValidation:t.skipCodeValidation},a.code_export),onProgress:()=>{},log:(U,x,R,H)=>_.log(U,x,R,H),shouldUploadArtifacts:!t.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0}),Y=new C(I),{renderUploadProgress:ue}=await import("./CliUploadProgress-3GGOTLPQ.js"),D=await ue(Y,U=>{if(U.testcaseId&&U.shareId&&v)return $e(h.testManagerUiUrl,v,U.testcaseId,U.shareId)});if(D.success){D.testcaseId&&_.setTestcaseId(D.testcaseId);let U=r==="testing",x=_.nextRunIndex()>0;if(U&&!t.name&&x&&process.stdin.isTTY)try{let{renderSavePrompt:B,defaultSessionTimestamp:q}=await import("./SaveSessionPrompt-IS6HZSF4.js"),J=await B(q());J&&_.setSessionName(J)}catch(B){_.log("warn","DIRECT_SAVE_PROMPT_FAILED","Save prompt failed",{error:String(B)})}let R=null;try{let{persistRecordedSession:B}=await import("./persist-recorded-session-OJPXI4HP.js");R=B(_,{testcaseId:_.testcaseId??void 0,projectId:L.project_id??void 0,folderId:L.folder_id??void 0,codeExportDir:D.codeExportDir})}catch(B){_.log("error","DIRECT_PERSIST_ERROR","Persist failed in ink mode",{error:String(B)})}let H=D.testcaseId&&D.shareId&&v?$e(h.testManagerUiUrl,v,D.testcaseId,D.shareId):void 0,se=D.testcaseId&&v?un(h.testManagerUiUrl,v,D.testcaseId):void 0;if(H||se||D.codeExportDir||R){let{LinksBox:B}=await import("./LinksBox-DX6BJAX5.js"),{render:q}=await import("./build-JIKYOZUH.js"),J=await import("./react-QWOAB3TB.js"),{waitUntilExit:qe}=q(J.default.createElement(B,{recordedTestPath:R?.recordedTestPath,outputDir:R?.outputDir,shareableLink:H,testCaseLink:se,codeExportDir:D.codeExportDir}),{stdout:process.stderr});await qe()}}if(_.testId){let{renderFeedbackPrompt:U}=await import("./CliFeedbackPrompt-PPGJMKHQ.js"),x=await U();if(x)try{await bn({tmsBaseUrl:h.tmsBaseUrl,username:w.basicAuth.username,accessKey:w.basicAuth.access_key,testId:_.testId,feedbackType:x,log:(R,H,se,B)=>_.log(R,H,se,B)})}catch(R){_.log("warn","FEEDBACK_FAILED","Feedback submission failed",{error:String(R)})}}}}catch(h){_.log("error","DIRECT_UPLOAD_FAILED","Direct upload failed (ink mode)",{error:h instanceof Error?h.stack??h.message:String(h)}),console.error(`Upload failed: ${h}`)}await _.finish("complete"),N||g(Le?2:1,"Run ended with no result");let Be=N.reason??"";(Be.includes("Cancel")||Be.includes("Timeout"))&&g(3,`Run: ${Be}`),N.status==="passed"&&g(0,"Run passed"),g(1,"Run failed")}catch(o){g(2,`CLI error: ${o instanceof Error?o.message:String(o)}`)}}),qn(e),En(e),e.command("install <target> [version]").description("Install kane-cli agent skill into Claude Code / Codex CLI / Gemini CLI (version defaults to latest compatible)").action(async(i,t)=>{if(i!=="skill"){console.error(`error: unknown install target '${i}'. Supported: skill`),g(2,`unknown install target '${i}'`);return}let{installSkill:o,formatInstallResult:s}=await import("./skill-installer-GYYMVNE4.js"),a=await o(t);!process.stdin.isTTY?process.stdout.write(JSON.stringify({type:"skill_install_result",status:a.status,version:a.version,installed_targets:a.installedTargets,error:a.error})+`
54
54
  `):process.stderr.write(s(a)+`
55
- `),g(a.status==="failed"?1:0,`install skill: ${a.status}`)}),e.command("profiles [action] [name]").option("--env <name>","Environment for switch/delete").action(async(i,t,o)=>{let s=new ne;if(i==="list"||!i&&!process.stdin.isTTY){let m=s.listProfiles();if(m.length===0){console.log("No profiles configured. Run: kane-cli login");return}let u=s.getActiveProfile(),f=s.getDefaultEnv();for(let p of m){let d=p.profile===u&&p.env===f?" (active)":"";console.log(`${p.profile} [${p.env}]${d}`)}return}if(i==="switch"&&t){let m=o?.env??s.getDefaultEnv();s.setActiveProfile(t),s.setDefaultEnv(m),Re(s,new le,t,m),console.log(`Switched to ${t} [${m}]`);return}if(i==="delete"&&t){let m=o?.env??s.getDefaultEnv();s.deleteProfileFull(t,m),console.log(`Deleted profile ${t} [${m}]`);return}process.stdin.isTTY||(console.error("Usage: kane-cli profiles list|switch|delete <name> [--env <env>]"),g(1,"Invalid profiles usage"));let{ProfilesView:a}=await import("./ProfilesView-YUMYSOZ4.js"),{render:r}=await import("./build-JIKYOZUH.js"),c=await import("./react-QWOAB3TB.js");await new Promise(m=>{let{unmount:u}=r(c.default.createElement(a,{creds:s,onSwitch:(f,p)=>{s.setActiveProfile(f),s.setDefaultEnv(p),console.log(`Switched to ${f} [${p}]`)},onCancel:()=>{u(),m()}}))})}),e.command("feedback").requiredOption("--test-id <id>","Test ID").requiredOption("--feedback-type <type>","Feedback type: positive or negative").option("--details <text>","Feedback details (max 500 characters)").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").action(async i=>{i.feedbackType!=="positive"&&i.feedbackType!=="negative"&&(console.error('Error: --feedback-type must be "positive" or "negative"'),g(1,'Invalid --feedback-type (must be "positive" or "negative")')),i.details&&i.details.length>500&&(console.error("Error: --details must be 500 characters or fewer"),g(1,"--details exceeds 500 character limit"));let t=new ne,o=i.env??t.getDefaultEnv(),s=Q(o),a,r;try{let c=await ge({creds:t,env:o,usernameFlag:i.username,accessKeyFlag:i.accessKey,log:()=>{}});a=c.resolvedCreds?.username??c.basicAuth?.username,r=c.resolvedCreds?.access_key??c.basicAuth?.access_key}catch{console.error("Not authenticated. Run: kane-cli login"),g(2,"Not authenticated for feedback")}(!a||!r)&&(console.error(JSON.stringify({error:"Could not resolve TMS credentials"})),g(1,"Could not resolve TMS credentials for feedback"));try{let{TmsClient:c}=await import("./tms-client-NNYXLXZK.js"),u=await new c(s.tmsBaseUrl,a,r).submitFeedback({instruction_id:"",test_id:i.testId,feedback_type:i.feedbackType,details:i.details,mode:"agent"});console.log(JSON.stringify(u)),g(0,"Feedback submitted")}catch(c){console.error(JSON.stringify({error:c instanceof Error?c.message:String(c)})),g(1,`Feedback failed: ${c instanceof Error?c.message:String(c)}`)}}),e.command("balance").description("Check credit balance").option("--profile <name>","Profile name").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").action(async i=>{let t=new ne,o=i.env??t.getDefaultEnv(),s=Q(o),a=null;try{let r=await ge({creds:t,env:o,usernameFlag:i.username,accessKeyFlag:i.accessKey,log:()=>{}}),c=r.resolvedCreds??(r.basicAuth?{username:r.basicAuth.username,access_key:r.basicAuth.access_key}:null);c&&(a={username:c.username,accessKey:c.access_key})}catch{console.error(`Not authenticated [${o}]. Run "kane-cli login" first.`),g(2,`Not authenticated for balance [${o}]`)}a||(console.error(`Could not resolve credentials [${o}]. Run "kane-cli login" again.`),g(2,`Could not resolve credentials for balance [${o}]`));try{let{ControllerClient:r}=await import("./controller-client-RD2YEMAH.js"),m=await new r(s.controllerBaseUrl,a).getCreditBalance();console.log(`Available credits: ${m.available_credits}`),console.log(`Total credits: ${m.total_credits}`),g(0,"Balance retrieved")}catch(r){console.error(`Error: ${r instanceof Error?r.message:String(r)}`),g(1,`Balance check failed: ${r instanceof Error?r.message:String(r)}`)}}),e.command("generate").description("Generate TCG test cases (TUI when interactive; NDJSON/plain when piped, --agent, --refine, or --save)").argument("[objective]",'Generation prompt (e.g. "checkout flow on staging"). Required for new + --refine; omit for --save.').option("--refine","Refine an existing request with <objective>. Requires --req.").option("--save","Save an existing request to disk. Requires --req; --out optional (defaults to <cwd>/.testmuai/tests). Takes no objective.").option("--req <id>","The request id to --refine or --save.").option("--out <dir>","Save target dir (only with --save; default <cwd>/.testmuai/tests).").option("--agent","Emit typed NDJSON on stdout (auto-on when stdin is not a TTY)").option("--name <name>","Name for this generation: sets the session name (like run/testmd) AND the --save suite folder (overrides the auto-derived name)").option("--scenario-limit <n>","Max number of scenarios to generate (1-20)").option("--per-scenario-limit <n>","Max test cases per scenario (1-20)").option("--memory","Enable memory enhancement for generation").option("--project <id>","TMS project id (default: org/config default)").option("--folder <id>","TMS folder id").option("--env <name>","Environment (prod or stage)").option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").option("--files <paths>","Comma-separated local files to attach (allowlisted types, \u226450MB each, \u226410; new/refine only)").action(async(i,t)=>{let o=t.scenarioLimit?parseInt(t.scenarioLimit,10):void 0,s=t.perScenarioLimit?parseInt(t.perScenarioLimit,10):void 0,{decideGenerateMode:a,resolveGenerateOp:r,defaultOutDir:c,buildHeadlessDeps:m,runGenerateHeadless:u,parseFilesFlag:f}=await import("./generate-headless-ZRRQT56R.js"),p=r({objective:i,refine:t.refine,save:t.save,req:t.req,out:t.out});if("error"in p){process.stderr.write(`error: ${p.error}
55
+ `),g(a.status==="failed"?1:0,`install skill: ${a.status}`)}),e.command("profiles [action] [name]").option("--env <name>","Environment for switch/delete").action(async(i,t,o)=>{let s=new ne;if(i==="list"||!i&&!process.stdin.isTTY){let m=s.listProfiles();if(m.length===0){console.log("No profiles configured. Run: kane-cli login");return}let u=s.getActiveProfile(),f=s.getDefaultEnv();for(let p of m){let d=p.profile===u&&p.env===f?" (active)":"";console.log(`${p.profile} [${p.env}]${d}`)}return}if(i==="switch"&&t){let m=o?.env??s.getDefaultEnv();s.setActiveProfile(t),s.setDefaultEnv(m),Re(s,new le,t,m),console.log(`Switched to ${t} [${m}]`);return}if(i==="delete"&&t){let m=o?.env??s.getDefaultEnv();s.deleteProfileFull(t,m),console.log(`Deleted profile ${t} [${m}]`);return}process.stdin.isTTY||(console.error("Usage: kane-cli profiles list|switch|delete <name> [--env <env>]"),g(1,"Invalid profiles usage"));let{ProfilesView:a}=await import("./ProfilesView-X35WWM4L.js"),{render:r}=await import("./build-JIKYOZUH.js"),c=await import("./react-QWOAB3TB.js");await new Promise(m=>{let{unmount:u}=r(c.default.createElement(a,{creds:s,onSwitch:(f,p)=>{s.setActiveProfile(f),s.setDefaultEnv(p),console.log(`Switched to ${f} [${p}]`)},onCancel:()=>{u(),m()}}))})}),e.command("feedback").requiredOption("--test-id <id>","Test ID").requiredOption("--feedback-type <type>","Feedback type: positive or negative").option("--details <text>","Feedback details (max 500 characters)").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").action(async i=>{i.feedbackType!=="positive"&&i.feedbackType!=="negative"&&(console.error('Error: --feedback-type must be "positive" or "negative"'),g(1,'Invalid --feedback-type (must be "positive" or "negative")')),i.details&&i.details.length>500&&(console.error("Error: --details must be 500 characters or fewer"),g(1,"--details exceeds 500 character limit"));let t=new ne,o=i.env??t.getDefaultEnv(),s=Q(o),a,r;try{let c=await ge({creds:t,env:o,usernameFlag:i.username,accessKeyFlag:i.accessKey,log:()=>{}});a=c.resolvedCreds?.username??c.basicAuth?.username,r=c.resolvedCreds?.access_key??c.basicAuth?.access_key}catch{console.error("Not authenticated. Run: kane-cli login"),g(2,"Not authenticated for feedback")}(!a||!r)&&(console.error(JSON.stringify({error:"Could not resolve TMS credentials"})),g(1,"Could not resolve TMS credentials for feedback"));try{let{TmsClient:c}=await import("./tms-client-NNYXLXZK.js"),u=await new c(s.tmsBaseUrl,a,r).submitFeedback({instruction_id:"",test_id:i.testId,feedback_type:i.feedbackType,details:i.details,mode:"agent"});console.log(JSON.stringify(u)),g(0,"Feedback submitted")}catch(c){console.error(JSON.stringify({error:c instanceof Error?c.message:String(c)})),g(1,`Feedback failed: ${c instanceof Error?c.message:String(c)}`)}}),e.command("balance").description("Check credit balance").option("--profile <name>","Profile name").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").action(async i=>{let t=new ne,o=i.env??t.getDefaultEnv(),s=Q(o),a=null;try{let r=await ge({creds:t,env:o,usernameFlag:i.username,accessKeyFlag:i.accessKey,log:()=>{}}),c=r.resolvedCreds??(r.basicAuth?{username:r.basicAuth.username,access_key:r.basicAuth.access_key}:null);c&&(a={username:c.username,accessKey:c.access_key})}catch{console.error(`Not authenticated [${o}]. Run "kane-cli login" first.`),g(2,`Not authenticated for balance [${o}]`)}a||(console.error(`Could not resolve credentials [${o}]. Run "kane-cli login" again.`),g(2,`Could not resolve credentials for balance [${o}]`));try{let{ControllerClient:r}=await import("./controller-client-RD2YEMAH.js"),m=await new r(s.controllerBaseUrl,a).getCreditBalance();console.log(`Available credits: ${m.available_credits}`),console.log(`Total credits: ${m.total_credits}`),g(0,"Balance retrieved")}catch(r){console.error(`Error: ${r instanceof Error?r.message:String(r)}`),g(1,`Balance check failed: ${r instanceof Error?r.message:String(r)}`)}}),e.command("generate").description("Generate TCG test cases (TUI when interactive; NDJSON/plain when piped, --agent, --refine, or --save)").argument("[objective]",'Generation prompt (e.g. "checkout flow on staging"). Required for new + --refine; omit for --save.').option("--refine","Refine an existing request with <objective>. Requires --req.").option("--save","Save an existing request to disk. Requires --req; --out optional (defaults to <cwd>/.testmuai/tests). Takes no objective.").option("--req <id>","The request id to --refine or --save.").option("--out <dir>","Save target dir (only with --save; default <cwd>/.testmuai/tests).").option("--agent","Emit typed NDJSON on stdout (auto-on when stdin is not a TTY)").option("--name <name>","Name for this generation: sets the session name (like run/testmd) AND the --save suite folder (overrides the auto-derived name)").option("--scenario-limit <n>","Max number of scenarios to generate (1-20)").option("--per-scenario-limit <n>","Max test cases per scenario (1-20)").option("--memory","Enable memory enhancement for generation").option("--project <id>","TMS project id (default: org/config default)").option("--folder <id>","TMS folder id").option("--env <name>","Environment (prod or stage)").option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").option("--files <paths>","Comma-separated local files to attach (allowlisted types, \u226450MB each, \u226410; new/refine only)").action(async(i,t)=>{let o=t.scenarioLimit?parseInt(t.scenarioLimit,10):void 0,s=t.perScenarioLimit?parseInt(t.perScenarioLimit,10):void 0,{decideGenerateMode:a,resolveGenerateOp:r,defaultOutDir:c,buildHeadlessDeps:m,runGenerateHeadless:u,parseFilesFlag:f}=await import("./generate-headless-ODYT3HT7.js"),p=r({objective:i,refine:t.refine,save:t.save,req:t.req,out:t.out});if("error"in p){process.stderr.write(`error: ${p.error}
56
56
  `),g(2,`generate: ${p.error}`);return}let d=p.op,b=f(t.files);if(d==="save"&&b){process.stderr.write(`error: --files is not valid with --save
57
- `),g(2,"generate: --files not valid with --save");return}let{headless:k,mode:E}=a(t,!!process.stdin.isTTY);if(!k){let{runGenerate:y}=await import("./tcg-generate-5T6S2E7L.js");await y({objective:i,scenarioLimit:o,perScenarioLimit:s});return}let A=await m({mode:E,env:t.env,projectId:t.project,folderId:t.folder,username:t.username,accessKey:t.accessKey,name:t.name}),w=await u({op:d,objective:i,reqId:t.req,outDir:d==="save"?t.out?$i(process.cwd(),t.out):c():void 0,suiteName:t.name,scenarioLimit:o,perScenarioLimit:s,memory:t.memory,files:b},A);g(w,"generate complete")}),e.command("help").action(()=>{e.help()}),e.command("changelog").description("Show recent release notes").option("--all","Show all releases instead of latest 5").action(async i=>{let{fetchChangelog:t,formatChangelog:o}=await import("./changelog-FNJ4P2IF.js"),s=await t({all:i.all});console.log(o(s))}),e.parse(["node","kane-cli",...l])}function Wn(l){let e,n,i,t=[];for(let o=0;o<l.length;o++){let s=l[o];if(s==="--code-export")e=!0;else if(s==="--skip-code-validation")i=!0;else if(s==="--no-skip-code-validation")i=!1;else if(s==="--code-language"){let a=l[o+1];a!==void 0&&(n=a,o++)}else s.startsWith("--code-language=")?n=s.slice(16):t.push(s)}return{codeExport:e,codeLanguage:n,skipCodeValidation:i,filteredArgs:t}}function Me(l,e){let n=l.split(".").map(t=>Number(t)||0),i=e.split(".").map(t=>Number(t)||0);for(let t=0;t<3;t++){let o=n[t]??0,s=i[t]??0;if(o<s)return-1;if(o>s)return 1}return 0}var Pi=[{version:"0.2.11",description:"Code export is now enabled by default (Python remains the default language; JavaScript is also available). Default run mode is now 'testing'.",apply:l=>{let e=[];return l.code_export.enabled===!1&&e.push({field:"code_export.enabled",from:!1,to:!0,description:"Code export is now enabled by default."}),l.mode==="action"&&e.push({field:"mode",from:"action",to:"testing",description:"Default run mode is now 'testing'."}),{cfg:{...l,code_export:{...l.code_export,enabled:!0},mode:"testing"},changes:e}}}];function Gn(l,e=Ae,n=Pi){let i=l.exists(),t=l.load();if(!i)return l.set("last_seen_version",e),{changes:[],fromVersion:e,toVersion:e,appliedVersions:[]};let o=t.last_seen_version||"0.0.0";if(Me(o,e)>=0)return{changes:[],fromVersion:o,toVersion:o,appliedVersions:[]};let s=n.filter(u=>Me(o,u.version)<0&&Me(u.version,e)<=0).sort((u,f)=>Me(u.version,f.version)),a=t,r=[],c=[];for(let u of s){let{cfg:f,changes:p}=u.apply(a);a=f,r.push(...p),c.push(u.version)}let m={...a,last_seen_version:e};return l.writeRaw(m),{changes:r,fromVersion:o,toVersion:e,appliedVersions:c}}function Kn(l){return l.changes.length===0?"":[`kane-cli updated to ${l.toVersion}. Default settings changed:`,...l.changes.map(n=>` \u2022 ${n.description} (${n.field}: ${JSON.stringify(n.from)} \u2192 ${JSON.stringify(n.to)})`),"","Use /config to review or revert any of these."].join(`
57
+ `),g(2,"generate: --files not valid with --save");return}let{headless:k,mode:E}=a(t,!!process.stdin.isTTY);if(!k){let{runGenerate:y}=await import("./tcg-generate-KLY7QZY2.js");await y({objective:i,scenarioLimit:o,perScenarioLimit:s});return}let A=await m({mode:E,env:t.env,projectId:t.project,folderId:t.folder,username:t.username,accessKey:t.accessKey,name:t.name}),w=await u({op:d,objective:i,reqId:t.req,outDir:d==="save"?t.out?$i(process.cwd(),t.out):c():void 0,suiteName:t.name,scenarioLimit:o,perScenarioLimit:s,memory:t.memory,files:b},A);g(w,"generate complete")}),e.command("help").action(()=>{e.help()}),e.command("changelog").description("Show recent release notes").option("--all","Show all releases instead of latest 5").action(async i=>{let{fetchChangelog:t,formatChangelog:o}=await import("./changelog-S4ZLEQLC.js"),s=await t({all:i.all});console.log(o(s))}),e.parse(["node","kane-cli",...l])}function Wn(l){let e,n,i,t=[];for(let o=0;o<l.length;o++){let s=l[o];if(s==="--code-export")e=!0;else if(s==="--skip-code-validation")i=!0;else if(s==="--no-skip-code-validation")i=!1;else if(s==="--code-language"){let a=l[o+1];a!==void 0&&(n=a,o++)}else s.startsWith("--code-language=")?n=s.slice(16):t.push(s)}return{codeExport:e,codeLanguage:n,skipCodeValidation:i,filteredArgs:t}}function Me(l,e){let n=l.split(".").map(t=>Number(t)||0),i=e.split(".").map(t=>Number(t)||0);for(let t=0;t<3;t++){let o=n[t]??0,s=i[t]??0;if(o<s)return-1;if(o>s)return 1}return 0}var Pi=[{version:"0.2.11",description:"Code export is now enabled by default (Python remains the default language; JavaScript is also available). Default run mode is now 'testing'.",apply:l=>{let e=[];return l.code_export.enabled===!1&&e.push({field:"code_export.enabled",from:!1,to:!0,description:"Code export is now enabled by default."}),l.mode==="action"&&e.push({field:"mode",from:"action",to:"testing",description:"Default run mode is now 'testing'."}),{cfg:{...l,code_export:{...l.code_export,enabled:!0},mode:"testing"},changes:e}}}];function Gn(l,e=Ae,n=Pi){let i=l.exists(),t=l.load();if(!i)return l.set("last_seen_version",e),{changes:[],fromVersion:e,toVersion:e,appliedVersions:[]};let o=t.last_seen_version||"0.0.0";if(Me(o,e)>=0)return{changes:[],fromVersion:o,toVersion:o,appliedVersions:[]};let s=n.filter(u=>Me(o,u.version)<0&&Me(u.version,e)<=0).sort((u,f)=>Me(u.version,f.version)),a=t,r=[],c=[];for(let u of s){let{cfg:f,changes:p}=u.apply(a);a=f,r.push(...p),c.push(u.version)}let m={...a,last_seen_version:e};return l.writeRaw(m),{changes:r,fromVersion:o,toVersion:e,appliedVersions:c}}function Kn(l){return l.changes.length===0?"":[`kane-cli updated to ${l.toVersion}. Default settings changed:`,...l.changes.map(n=>` \u2022 ${n.description} (${n.field}: ${JSON.stringify(n.from)} \u2192 ${JSON.stringify(n.to)})`),"","Use /config to review or revert any of these."].join(`
58
58
  `)}var _t=new Set(["balance","changelog","config","feedback","folders","generate","help","install","login","logout","profiles","projects","run","sessions","setup","testmd","update","whoami"]);function Di(l,e){if(l===e)return 0;if(l.length===0)return e.length;if(e.length===0)return l.length;let n=new Array(e.length+1),i=new Array(e.length+1);for(let t=0;t<=e.length;t++)n[t]=t;for(let t=1;t<=l.length;t++){i[0]=t;for(let o=1;o<=e.length;o++){let s=l[t-1]===e[o-1]?0:1;i[o]=Math.min(n[o]+1,i[o-1]+1,n[o-1]+s)}[n,i]=[i,n]}return n[e.length]}function Yn(l,e){let n=l.toLowerCase(),i=[...e],t=[];for(let o of i){let s=o.toLowerCase();s!==n&&s.startsWith(n)&&t.push({name:o,distance:0})}if(t.length===0)for(let o of i){let s=o.toLowerCase();if(s===n)continue;let a=Di(n,s);a<=2&&t.push({name:o,distance:a})}return t.sort((o,s)=>o.distance-s.distance||o.name.localeCompare(s.name)),t.slice(0,3).map(o=>o.name)}function Jn(l,e){let n=e.length>0?` \u2014 did you mean ${e.map(i=>`'${i}'`).join(" or ")}?`:"";return`error: unknown command '${l}'${n}
59
59
 
60
60
  Run an objective with: kane-cli run "<objective>"
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a,b,c,d,e,f,g,h,i}from"./chunk-6PBX7QI7.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import"./chunk-LOIRZFV3.js";import"./chunk-LPUQ4HWQ.js";import"./chunk-NLCCBXXV.js";import"./chunk-LZUTY7XS.js";import"./chunk-HPJP7NES.js";import"./chunk-RZ4F3BHX.js";import"./chunk-3UCNDPTN.js";import"./chunk-UR6MHSHU.js";export{d as emitNdjson,b as filterByName,g as formatAuthResolutionError,c as paginate,a as parsePagination,i as registerListCommands,e as renderTable,f as resolveTmsBasicAuth,h as validateCreateName};
2
+ import{a,b,c,d,e,f,g,h,i}from"./chunk-G3PWEKD7.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import"./chunk-LOIRZFV3.js";import"./chunk-LPUQ4HWQ.js";import"./chunk-NLCCBXXV.js";import"./chunk-RB2YKN77.js";import"./chunk-KKIFXAJY.js";import"./chunk-RZ4F3BHX.js";import"./chunk-LRKWPAGK.js";import"./chunk-UR6MHSHU.js";export{d as emitNdjson,b as filterByName,g as formatAuthResolutionError,c as paginate,a as parsePagination,i as registerListCommands,e as renderTable,f as resolveTmsBasicAuth,h as validateCreateName};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a}from"./chunk-7GOX44H7.js";import"./chunk-RB2YKN77.js";import"./chunk-IGZPQQFP.js";import"./chunk-KKIFXAJY.js";import"./chunk-RZ4F3BHX.js";import"./chunk-LRKWPAGK.js";import"./chunk-UR6MHSHU.js";export{a as LoginFlow};