@testmuai/kane-cli 0.3.5 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ChromeProfilePicker-PWCOETN2.js → ChromeProfilePicker-CBF6SP67.js} +1 -1
- package/dist/{CliFeedbackPrompt-2JOU3UTZ.js → CliFeedbackPrompt-P2FJBV3S.js} +1 -1
- package/dist/{CliUploadProgress-EWQKUP74.js → CliUploadProgress-B4CVWX62.js} +1 -1
- package/dist/{ConfigView-FFJW43N4.js → ConfigView-PCX3TZNC.js} +1 -1
- package/dist/FolderPicker-UTY6XQHP.js +2 -0
- package/dist/{HelpView-MXW6PGOP.js → HelpView-CDK7II5Q.js} +1 -1
- package/dist/{InfoBox-ZZ2TGFEJ.js → InfoBox-SYT7CVM4.js} +1 -1
- package/dist/{LinksBox-PGDOE3OB.js → LinksBox-R3VLKMYS.js} +1 -1
- package/dist/{ProfilesView-ZVDOESOW.js → ProfilesView-XKUXSFMQ.js} +1 -1
- package/dist/{ProjectPicker-2LMGEOK6.js → ProjectPicker-TWTR6SWR.js} +1 -1
- package/dist/{SaveSessionPrompt-UK7FCGBC.js → SaveSessionPrompt-WAVXAYCK.js} +1 -1
- package/dist/SingleShotApp-JH6A65TZ.js +2 -0
- package/dist/{SummaryBox-5Y5FYFC7.js → SummaryBox-FDNFQYSC.js} +1 -1
- package/dist/{TestMdRunView-YKEM6CUM.js → TestMdRunView-E4UDWIGT.js} +1 -1
- package/dist/{WhoamiView-CAX7W64M.js → WhoamiView-YG6SSQTV.js} +1 -1
- package/dist/{changelog-FSOH4L6K.js → changelog-M5VP33UN.js} +1 -1
- package/dist/{chunk-6NM5ZRG6.js → chunk-2SXNPFGD.js} +1 -1
- package/dist/{chunk-XR7EOTSN.js → chunk-5XTLIGWL.js} +1 -1
- package/dist/{chunk-YZBUZYJK.js → chunk-74MJWDIW.js} +1 -1
- package/dist/{chunk-NQHLMFWC.js → chunk-BDC7IOXP.js} +1 -1
- package/dist/{chunk-GLXO4WSE.js → chunk-EIZXV3UH.js} +1 -1
- package/dist/{chunk-5T6JVIN2.js → chunk-HROFBRMS.js} +1 -1
- package/dist/{chunk-RSRXL3HE.js → chunk-JHNEE2MB.js} +1 -1
- package/dist/{chunk-4MW543EE.js → chunk-KMTNMUVS.js} +1 -1
- package/dist/{chunk-OEYN4LRD.js → chunk-KX7K3Y7R.js} +1 -1
- package/dist/{chunk-YCJ6JUDU.js → chunk-L256AYYL.js} +1 -1
- package/dist/{chunk-JSOBQIZW.js → chunk-LYSEA5FB.js} +1 -1
- package/dist/{chunk-NNJVV4QO.js → chunk-MJQ2EHSC.js} +1 -1
- package/dist/{chunk-ATB32X4H.js → chunk-PJMTAAZ7.js} +1 -1
- package/dist/{chunk-HGIGF7SF.js → chunk-PQGNWC33.js} +1 -1
- package/dist/{chunk-FHZXMPSR.js → chunk-PYU2JPAY.js} +1 -1
- package/dist/{chunk-XOSYGSRB.js → chunk-QCNKJUPT.js} +1 -1
- package/dist/{chunk-NMCYRB5A.js → chunk-QKM3RHSQ.js} +1 -1
- package/dist/{chunk-4ITKSPTN.js → chunk-R7JZMKC7.js} +2 -2
- package/dist/{chunk-OWTKDTKK.js → chunk-TP6KYKPD.js} +1 -1
- package/dist/{chunk-2BJVZ75R.js → chunk-U4XV5KUD.js} +1 -1
- package/dist/{chunk-OP5NDZ64.js → chunk-VS5FTXRZ.js} +1 -1
- package/dist/{chunk-MBZOXXA4.js → chunk-VUIXILBR.js} +11 -11
- package/dist/{chunk-KLRD7F46.js → chunk-WZCGEQ6M.js} +1 -1
- package/dist/{chunk-LJCHLJEV.js → chunk-X5CCG35O.js} +1 -1
- package/dist/{chunk-OLHVJQTO.js → chunk-YX3YFXT5.js} +1 -1
- package/dist/{chunk-VYHMUBWM.js → chunk-ZAUHYR76.js} +1 -1
- package/dist/{chunk-WKKV77JW.js → chunk-ZY4BZQHD.js} +1 -1
- package/dist/index.js +7 -7
- package/dist/{login-flow-C22P3I5G.js → login-flow-3YFO62HA.js} +1 -1
- package/dist/{persist-recorded-session-6X37MMUB.js → persist-recorded-session-LVQLORT4.js} +1 -1
- package/dist/{pipeline-A6ZHMRPH.js → pipeline-L3VM7QEX.js} +1 -1
- package/dist/{recording-banner-ZQW7RTTP.js → recording-banner-Q66Y2UIC.js} +1 -1
- package/dist/{run-test-md-3WLYVWFB.js → run-test-md-5TNUTTEA.js} +5 -5
- package/dist/{testmd-actions-5JCGAZLL.js → testmd-actions-O4NTH2OR.js} +2 -2
- package/dist/{validate-basic-Q5IZSBIG.js → validate-basic-JJOEAFLT.js} +1 -1
- package/dist/{version-check-VVNXNEGO.js → version-check-WWOS4OEZ.js} +1 -1
- package/package.json +5 -5
- package/dist/FolderPicker-BE3KYGZX.js +0 -2
- package/dist/SingleShotApp-QA4SYSCP.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as P}from"./chunk-
|
|
2
|
+
import{a as P}from"./chunk-PQGNWC33.js";import{a as X}from"./chunk-HCBYKLMW.js";import{t as r}from"./chunk-5XTLIGWL.js";import{a,b as i,i as N}from"./chunk-C44QQJR4.js";import{a as G}from"./chunk-6YGTRKDT.js";import{e as D}from"./chunk-UR6MHSHU.js";var g=D(G(),1);var e=D(X(),1),f=5;function K(t,I){if(!I)return t;let c=I.toLowerCase();return t.filter(B=>B.label.toLowerCase().includes(c))}function J(t){let{title:I,items:c,loading:B=!1,loadingText:Y,error:y=null,itemNoun:T="items",onSelect:H,onCancel:R,defaultActiveId:L,onTab:w,extraHint:E}=t,[x,s]=(0,g.useState)(0),[S,u]=(0,g.useState)(0),[d,A]=(0,g.useState)(""),[p,h]=(0,g.useState)(null);(0,g.useEffect)(()=>{if(c.length===0)return;if(t.preserveSelectionById&&p!==null){let n=c.findIndex(o=>o.id===p);if(n>=0){u(Math.floor(n/f)),s(n%f);return}}let l=L?c.findIndex(n=>n.id===L):c.findIndex(n=>n.isActive);l>=0?(u(Math.floor(l/f)),s(l%f),t.preserveSelectionById&&h(c[l].id)):t.preserveSelectionById&&(u(0),s(0),h(c[0]?.id??null))},[c,L,t.preserveSelectionById,p]),(0,g.useEffect)(()=>{if(!t.onSearch)return;let l=setTimeout(()=>t.onSearch(d),t.searchDebounceMs??250);return()=>clearTimeout(l)},[d,t.onSearch,t.searchDebounceMs]);let m=t.onSearch?c:K(c,d),C=S*f,F=Math.min(C+f,m.length),M=Math.ceil(m.length/f),O=F-C,v=m.slice(C,F);return N((l,n)=>{if(y){n.escape&&R();return}if(n.escape){d?(A(""),s(0),u(0)):R();return}if(n.tab&&w){w();return}if(n.upArrow){if(x>0){let o=x-1;s(o),t.preserveSelectionById&&h(v[o]?.id??null)}else if(S>0){let o=S-1,b=f-1;u(o),s(b),t.preserveSelectionById&&h(m[o*f+b]?.id??null)}return}if(n.downArrow){if(x<O-1){let o=x+1;s(o),t.preserveSelectionById&&h(v[o]?.id??null)}else if(S<M-1){let o=S+1,b=0;u(o),s(b),t.preserveSelectionById&&h(m[o*f+b]?.id??null)}return}if(n.return&&v[x]){H(v[x]);return}if(n.backspace||n.delete){A(o=>o.slice(0,-1)),s(0),u(0);return}l&&!n.ctrl&&!n.meta&&(A(o=>o+l),s(0),u(0))},{isActive:!B}),B?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.primary,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:r.primary,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(i,{color:r.secondary,children:Y??`Loading ${T}\u2026`})})]}):y?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.statusFail,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:r.statusFail,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(i,{color:r.statusFail,children:y})}),(0,e.jsx)(P,{bindings:[]})]}):(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.primary,paddingX:2,paddingY:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(i,{color:r.primary,bold:!0,children:I}),(0,e.jsxs)(i,{color:r.dim,children:[" (",m.length,!t.onSearch&&d?`/${c.length}`:""," ",T,t.loadingMore?" \xB7 loading more":"",")"]})]}),(0,e.jsxs)(a,{marginTop:1,children:[(0,e.jsx)(i,{color:r.secondary,children:d?"filter: ":""}),d?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(i,{children:d}),(0,e.jsx)(i,{inverse:!0,children:" "})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)(i,{color:r.dim,children:["Search ",T,"\u2026"]}),(0,e.jsx)(i,{inverse:!0,children:" "})]})]}),(0,e.jsx)(a,{flexDirection:"column",marginTop:1,children:t.searching?(0,e.jsxs)(i,{color:r.secondary,children:["Searching ",T,"\u2026"]}):m.length===0?(0,e.jsxs)(i,{color:r.dim,children:["No ",T,' match "',d,'"']}):v.map((l,n)=>{let o=n===x,b=o?"\u276F ":" ",$=l.isActive?r.statusPass:o?r.primary:void 0;return(0,e.jsxs)(i,{color:$,children:[b,l.label,l.isActive?" \u25CF selected":""]},l.id)})}),!t.searching&&M>1&&(0,e.jsx)(a,{marginTop:1,children:(0,e.jsxs)(i,{color:r.dim,children:["Page ",S+1,"/",M]})}),t.footer&&(0,e.jsx)(a,{marginTop:1,flexDirection:"column",children:t.footer}),(0,e.jsx)(P,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"type",label:"to search"},{keys:"\u21B5",label:"select"},...w&&E?[{keys:"tab",label:E}]:[]],escBackLabel:d?"clear":"back to chat"})]})}export{J as a};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a,c,e as o}from"./chunk-
|
|
2
|
+
import{a,c,e as o}from"./chunk-5XTLIGWL.js";import{a as l}from"./chunk-RZ4F3BHX.js";import{readFileSync as f,writeFileSync as d,mkdirSync as h,realpathSync as g}from"fs";import{join as y}from"path";var C="npm install -g @testmuai/kane-cli@latest",b="brew upgrade lambdatest/kane/kane-cli";function w(){try{let t=process.argv[1];if(t&&g(t).includes("/Cellar/"))return b}catch{}return C}var m=y(c,"version-check.json"),S=1440*60*1e3;function k(){try{let t=JSON.parse(f(m,"utf-8"));if(Date.now()-t.checkedAt<S)return t}catch{}return null}function A(t){try{h(c,{recursive:!0}),d(m,JSON.stringify({latest:t,checkedAt:Date.now()}))}catch{}}function u(t,r){let i=t.split(".").map(Number),n=r.split(".").map(Number);for(let s=0;s<3;s++){let e=(n[s]??0)-(i[s]??0);if(e!==0)return e}return 0}function p(t,r){let i=t.split(".").map(Number),n=r.split(".").map(Number);return(n[0]??0)!==(i[0]??0)?"major":(n[1]??0)!==(i[1]??0)?"minor":"patch"}async function j(){try{let t=k();if(t)return u(a,t.latest)>0?{current:a,latest:t.latest,severity:p(a,t.latest)}:null;let r=new AbortController,i=setTimeout(()=>r.abort(),5e3),n=await l(o,{headers:{Accept:"application/json"},signal:r.signal});if(clearTimeout(i),!n.ok)return null;let e=(await n.json())["dist-tags"]?.latest;return e?(A(e),u(a,e)>0?{current:a,latest:e,severity:p(a,e)}:null):null}catch{return null}}export{w as a,u as b,p as c,j 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-
|
|
2
|
+
import{a as A}from"./chunk-YCCUBQY4.js";import{a as _}from"./chunk-WZCGEQ6M.js";import{a as B}from"./chunk-JHNEE2MB.js";import{a as R}from"./chunk-PQGNWC33.js";import{a as P}from"./chunk-HCBYKLMW.js";import{t as c}from"./chunk-5XTLIGWL.js";import{a as u,b as l}from"./chunk-C44QQJR4.js";import{a as J}from"./chunk-6YGTRKDT.js";import{a as k}from"./chunk-7CLUJYMW.js";import{e as L}from"./chunk-UR6MHSHU.js";var t=L(J(),1);var e=L(P(),1);function X(n,s,y,m){return{id:n,label:`${s} (${n}) \xB7 ${y} tests`,isActive:n===m}}function W({resolver:n,projectId:s,currentFolderId:y,env:m,onSelect:x,onCancel:w}){let[I,M]=(0,t.useState)([]),[$,d]=(0,t.useState)(!0),[O,g]=(0,t.useState)(!1),[U,N]=(0,t.useState)(null),[p,b]=(0,t.useState)("list"),[S,v]=(0,t.useState)(""),[E,f]=(0,t.useState)(null),h=(0,t.useRef)(!1);(0,t.useEffect)(()=>{if(!n){N("Login first to browse folders"),d(!1);return}let o=new AbortController;return d(!0),g(!0),(async()=>{try{let r=n.cached??await n.resolve();if(!r){N("Login first to browse folders"),d(!1),g(!1);return}let a=B(m),T=new k(a.tmsBaseUrl,r.username,r.access_key),F=(async function*(){if(o.signal.aborted)return;let i=await T.listFolders(s);yield{page:1,folders:i,totalLoaded:i.length,done:!0}})();for await(let i of F){if(d(!1),i.totalLoaded===0){h.current=!0,b("naming"),g(!1);return}M(i.folders.map(C=>X(C.id,C.name,C.test_cases_count,y))),i.done&&g(!1)}}catch(r){if(r?.name==="AbortError")return;N(r instanceof Error?r.message:String(r)),d(!1),g(!1)}})(),()=>o.abort()},[n,s,y,m]);let D=(0,t.useCallback)(o=>{let r=o.trim();if(!r){f("Name cannot be empty");return}if(!s){f("No project selected \u2014 pick a project first");return}f(null),b("creating"),(async()=>{try{if(!n)throw new Error("Not authenticated");let a=n.cached??await n.resolve();if(!a)throw new Error("Not authenticated");let T=B(m),i=await new k(T.tmsBaseUrl,a.username,a.access_key).createFolder(s,r);x(i.id,i.name)}catch(a){f(a instanceof Error?a.message:String(a)),b("naming")}})()},[n,s,m,x]),H=(0,t.useCallback)(()=>{v(""),f(null),h.current?w():b("list")},[w]);return p==="naming"||p==="creating"?(0,e.jsxs)(u,{flexDirection:"column",borderStyle:"round",borderColor:c.primary,paddingX:2,paddingY:1,children:[(0,e.jsx)(l,{color:c.primary,bold:!0,children:"Create new folder"}),h.current&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.dim,children:"No folders yet \u2014 let's create one."})}),(0,e.jsxs)(u,{marginTop:1,children:[(0,e.jsx)(l,{color:c.dim,children:"Name: "}),p==="naming"?(0,e.jsx)(A,{value:S,onChange:o=>{v(o),E&&f(null)},onSubmit:D,onCancel:H}):(0,e.jsx)(l,{children:S})]}),E&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.red,children:E})}),p==="creating"&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.dim,children:"Creating..."})}),p==="naming"&&(0,e.jsx)(R,{bindings:[{keys:"\u21B5",label:"create"}],escBackLabel:h.current?"cancel":"back"})]}):(0,e.jsx)(_,{title:"Folders",items:I,loading:$,loadingMore:O,preserveSelectionById:!0,error:U,itemNoun:"folders",onTab:()=>{h.current=!1,b("naming")},extraHint:"tab to create new",onSelect:o=>{let r=o.label.split(" (")[0];x(o.id,r)},onCancel:w})}export{X as a,W as b};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as x}from"./chunk-HCBYKLMW.js";import{t as m}from"./chunk-
|
|
2
|
+
import{a as x}from"./chunk-HCBYKLMW.js";import{t as m}from"./chunk-5XTLIGWL.js";import{a as u,b as a,j as g}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as f}from"./chunk-UR6MHSHU.js";var T=f(b(),1);function k(n,t){if(!t)return n;let l=n.trim()||t;return`\x1B]8;;${t}\x07${l}\x1B]8;;\x07`}var r=f(x(),1);function $({shareableLink:n,testCaseLink:t,codeExportDir:l,recordedTestPath:s,outputDir:o,autoExit:p=!0}){let{exit:c}=g();(0,T.useEffect)(()=>{if(!p)return;let i=setTimeout(()=>c(),100);return()=>clearTimeout(i)},[c,p]);let e=[];return s&&e.push({label:"Test",url:s,linkUrl:`file://${s}`}),o&&e.push({label:"Output",url:o,linkUrl:`file://${o}`}),n&&e.push({label:"ShareLink",url:n}),t&&e.push({label:"TestCase",url:t}),l&&!o&&e.push({label:"CodeExport",url:l,linkUrl:`file://${l}`}),e.length===0?(0,r.jsx)(r.Fragment,{}):(0,r.jsx)(u,{flexDirection:"column",marginTop:1,marginLeft:1,children:e.map(i=>(0,r.jsxs)(u,{flexDirection:"column",marginBottom:1,children:[(0,r.jsxs)(a,{color:m.primary,children:[i.label,":"]}),(0,r.jsx)(a,{color:m.dim,children:k(i.url,i.linkUrl??i.url)})]},i.label))})}export{$ as a};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as B}from"./chunk-S3DAAAE5.js";import{a as h}from"./chunk-
|
|
2
|
+
import{b as B}from"./chunk-S3DAAAE5.js";import{a as h}from"./chunk-MJQ2EHSC.js";import{a as w}from"./chunk-HCBYKLMW.js";import{t as s}from"./chunk-5XTLIGWL.js";import{a as x,b as t,c as g,i as P,j as S}from"./chunk-C44QQJR4.js";import{a as C}from"./chunk-6YGTRKDT.js";import{e as T}from"./chunk-UR6MHSHU.js";var o=T(C(),1);var e=T(w(),1);function D({defaultName:i,onSubmit:c}){let[d,p]=(0,o.useState)("confirm"),[m,a]=(0,o.useState)(""),[f,u]=(0,o.useState)(null),l=(0,o.useMemo)(()=>m.trim()||i,[m,i]);return P((n,r)=>{if(d==="confirm"){if(n==="y"||n==="Y"){a(i),p("name");return}if(n==="n"||n==="N"||r.escape||r.ctrl&&n==="c"){c(null);return}if(r.return){c(i);return}return}if(r.return){if(!B(l)){u(`name "${l}" is invalid; allowed: letters, digits, underscore, hyphen`);return}c(l);return}if(r.escape||r.ctrl&&n==="c"){c(null);return}if(r.backspace||r.delete){a(v=>v.slice(0,-1)),u(null);return}n&&!r.ctrl&&!r.meta&&(a(v=>v+n),u(null))}),d==="confirm"?(0,e.jsx)(h,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsx)(t,{color:s.cyan,children:i})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[(0,e.jsx)(t,{color:s.dimmed,children:"enter \u2014 save with this name"}),(0,e.jsx)(t,{color:s.dimmed,children:"Y \u2014 edit name"}),(0,e.jsx)(t,{color:s.dimmed,children:"N/esc \u2014 discard session"})]})}):(0,e.jsx)(h,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsxs)(x,{children:[(0,e.jsx)(t,{color:s.cyan,children:m}),(0,e.jsx)(t,{inverse:!0,children:" "})]})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[f&&(0,e.jsx)(t,{color:s.red,children:f}),(0,e.jsx)(t,{color:s.dimmed,children:"enter \u2014 save \xB7 esc \u2014 discard"})]})})}function V(){return new Date().toISOString().slice(0,19).replace(/:/g,"-")}async function Y(i){return new Promise(c=>{function d(){let{exit:a}=S(),[f,u]=(0,o.useState)(!1);return(0,o.useEffect)(()=>{if(f){let l=setTimeout(()=>a(),50);return()=>clearTimeout(l)}},[f,a]),(0,e.jsx)(D,{defaultName:i,onSubmit:l=>{c(l),u(!0)}})}let{waitUntilExit:p,unmount:m}=g((0,e.jsx)(d,{}),{stdout:process.stderr,exitOnCtrlC:!1});p().then(()=>{try{m()}catch{}})})}export{D as a,V as b,Y as c};
|
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 So,b as Tr}from"./chunk-3MSXQU2C.js";import{a as Ur}from"./chunk-
|
|
3
|
+
import{a as So,b as Tr}from"./chunk-3MSXQU2C.js";import{a as Ur}from"./chunk-PYU2JPAY.js";import{a as qn,b as Nr,c as Po}from"./chunk-EIZXV3UH.js";import{A as Bo,a as rn,b as sn,c as Br,d as Nn,e as $r,f as Un,g as Wt,h as It,i as cn,j as Wn,k as Wr,l as ct,p as Kn,q as zn,r as Gn,s as Xn,w as dn,x as un,y as Jn,z as Xr}from"./chunk-VS5FTXRZ.js";import{a as Dr,b as Gr,c as jo,d as Jr}from"./chunk-2SXNPFGD.js";import{a as Hr,b as Do}from"./chunk-ZY4BZQHD.js";import"./chunk-S3DAAAE5.js";import"./chunk-X7VI7KK3.js";import"./chunk-AH4AXJML.js";import{a as qr,d as Yn}from"./chunk-X5CCG35O.js";import{a as Rr,b as Ir,c as $n,d as Lr,e as Fr,f as Kr}from"./chunk-R7JZMKC7.js";import{a as on}from"./chunk-BDC7IOXP.js";import"./chunk-L5LI2JF4.js";import{a as Be}from"./chunk-KMTNMUVS.js";import{a as Dn,b as jn,c as Bn,d as Hn,e as ln,f as Ht,g as zr}from"./chunk-HROFBRMS.js";import{a as To}from"./chunk-TP6KYKPD.js";import{b as Vr}from"./chunk-74MJWDIW.js";import{a as Mn,d as ot,e as At,f as q,g as an,h as Io,i as jr}from"./chunk-G7VF5SDK.js";import{b as Nt}from"./chunk-L256AYYL.js";import{b as Ut}from"./chunk-YX3YFXT5.js";import"./chunk-YCCUBQY4.js";import"./chunk-WZCGEQ6M.js";import{a as Te,b as pe,c as Vn,d as Pr}from"./chunk-VE3SUJMA.js";import{a as Ln}from"./chunk-QKM3RHSQ.js";import{a as Le,b as Or}from"./chunk-KX7K3Y7R.js";import{a as ve}from"./chunk-JHNEE2MB.js";import{a as Fn}from"./chunk-BPF7TDRU.js";import{a as Mr}from"./chunk-VUIXILBR.js";import"./chunk-MDBXYXSC.js";import"./chunk-WAOCHXJ5.js";import{a as Oo}from"./chunk-ZAUHYR76.js";import"./chunk-E47GFYXA.js";import{a as Ar}from"./chunk-MJQ2EHSC.js";import"./chunk-U4XV5KUD.js";import{b as Ro}from"./chunk-PJMTAAZ7.js";import{c as Ao}from"./chunk-QCNKJUPT.js";import{a as Ft}from"./chunk-PQGNWC33.js";import{a as X}from"./chunk-HCBYKLMW.js";import{a as at,c as xe,h as lt,t as p}from"./chunk-5XTLIGWL.js";import{a as b,b as l,c as nn,d as Pn,i as qe,j as On,k as Sr}from"./chunk-C44QQJR4.js";import{a as Ze}from"./chunk-6YGTRKDT.js";import{a as Mt}from"./chunk-7CLUJYMW.js";import"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import{a as tn,c as Rt,e as N}from"./chunk-UR6MHSHU.js";var wn=Rt(Qo=>{"use strict";var lo=class extends Error{constructor(e,t,n){super(n),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=t,this.exitCode=e,this.nestedError=void 0}},Yo=class extends lo{constructor(e){super(1,"commander.invalidArgument",e),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}};Qo.CommanderError=lo;Qo.InvalidArgumentError=Yo});var co=Rt(er=>{"use strict";var{InvalidArgumentError:Ss}=wn(),Zo=class{constructor(e,t){switch(this.description=t||"",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,t){return t===this.defaultValue||!Array.isArray(t)?[e]:t.concat(e)}default(e,t){return this.defaultValue=e,this.defaultValueDescription=t,this}argParser(e){return this.parseArg=e,this}choices(e){return this.argChoices=e.slice(),this.parseArg=(t,n)=>{if(!this.argChoices.includes(t))throw new Ss(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(t,n):t},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}};function Ts(i){let e=i.name()+(i.variadic===!0?"...":"");return i.required?"<"+e+">":"["+e+"]"}er.Argument=Zo;er.humanReadableArgName=Ts});var nr=Rt(bi=>{"use strict";var{humanReadableArgName:Rs}=co(),tr=class{constructor(){this.helpWidth=void 0,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}visibleCommands(e){let t=e.commands.filter(o=>!o._hidden),n=e._getHelpCommand();return n&&!n._hidden&&t.push(n),this.sortSubcommands&&t.sort((o,r)=>o.name().localeCompare(r.name())),t}compareOptions(e,t){let n=o=>o.short?o.short.replace(/^-/,""):o.long.replace(/^--/,"");return n(e).localeCompare(n(t))}visibleOptions(e){let t=e.options.filter(o=>!o.hidden),n=e._getHelpOption();if(n&&!n.hidden){let o=n.short&&e._findOption(n.short),r=n.long&&e._findOption(n.long);!o&&!r?t.push(n):n.long&&!r?t.push(e.createOption(n.long,n.description)):n.short&&!o&&t.push(e.createOption(n.short,n.description))}return this.sortOptions&&t.sort(this.compareOptions),t}visibleGlobalOptions(e){if(!this.showGlobalOptions)return[];let t=[];for(let n=e.parent;n;n=n.parent){let o=n.options.filter(r=>!r.hidden);t.push(...o)}return this.sortOptions&&t.sort(this.compareOptions),t}visibleArguments(e){return e._argsDescription&&e.registeredArguments.forEach(t=>{t.description=t.description||e._argsDescription[t.name()]||""}),e.registeredArguments.find(t=>t.description)?e.registeredArguments:[]}subcommandTerm(e){let t=e.registeredArguments.map(n=>Rs(n)).join(" ");return e._name+(e._aliases[0]?"|"+e._aliases[0]:"")+(e.options.length?" [options]":"")+(t?" "+t:"")}optionTerm(e){return e.flags}argumentTerm(e){return e.name()}longestSubcommandTermLength(e,t){return t.visibleCommands(e).reduce((n,o)=>Math.max(n,t.subcommandTerm(o).length),0)}longestOptionTermLength(e,t){return t.visibleOptions(e).reduce((n,o)=>Math.max(n,t.optionTerm(o).length),0)}longestGlobalOptionTermLength(e,t){return t.visibleGlobalOptions(e).reduce((n,o)=>Math.max(n,t.optionTerm(o).length),0)}longestArgumentTermLength(e,t){return t.visibleArguments(e).reduce((n,o)=>Math.max(n,t.argumentTerm(o).length),0)}commandUsage(e){let t=e._name;e._aliases[0]&&(t=t+"|"+e._aliases[0]);let n="";for(let o=e.parent;o;o=o.parent)n=o.name()+" "+n;return n+t+" "+e.usage()}commandDescription(e){return e.description()}subcommandDescription(e){return e.summary()||e.description()}optionDescription(e){let t=[];return e.argChoices&&t.push(`choices: ${e.argChoices.map(n=>JSON.stringify(n)).join(", ")}`),e.defaultValue!==void 0&&(e.required||e.optional||e.isBoolean()&&typeof e.defaultValue=="boolean")&&t.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),e.presetArg!==void 0&&e.optional&&t.push(`preset: ${JSON.stringify(e.presetArg)}`),e.envVar!==void 0&&t.push(`env: ${e.envVar}`),t.length>0?`${e.description} (${t.join(", ")})`:e.description}argumentDescription(e){let t=[];if(e.argChoices&&t.push(`choices: ${e.argChoices.map(n=>JSON.stringify(n)).join(", ")}`),e.defaultValue!==void 0&&t.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),t.length>0){let n=`(${t.join(", ")})`;return e.description?`${e.description} ${n}`:n}return e.description}formatHelp(e,t){let n=t.padWidth(e,t),o=t.helpWidth||80,r=2,a=2;function f(h,T){if(T){let V=`${h.padEnd(n+a)}${T}`;return t.wrap(V,o-r,n+a)}return h}function d(h){return h.join(`
|
|
4
4
|
`).replace(/^/gm," ".repeat(r))}let u=[`Usage: ${t.commandUsage(e)}`,""],s=t.commandDescription(e);s.length>0&&(u=u.concat([t.wrap(s,o,0),""]));let c=t.visibleArguments(e).map(h=>f(t.argumentTerm(h),t.argumentDescription(h)));c.length>0&&(u=u.concat(["Arguments:",d(c),""]));let y=t.visibleOptions(e).map(h=>f(t.optionTerm(h),t.optionDescription(h)));if(y.length>0&&(u=u.concat(["Options:",d(y),""])),this.showGlobalOptions){let h=t.visibleGlobalOptions(e).map(T=>f(t.optionTerm(T),t.optionDescription(T)));h.length>0&&(u=u.concat(["Global Options:",d(h),""]))}let P=t.visibleCommands(e).map(h=>f(t.subcommandTerm(h),t.subcommandDescription(h)));return P.length>0&&(u=u.concat(["Commands:",d(P),""])),u.join(`
|
|
5
5
|
`)}padWidth(e,t){return Math.max(t.longestOptionTermLength(e,t),t.longestGlobalOptionTermLength(e,t),t.longestSubcommandTermLength(e,t),t.longestArgumentTermLength(e,t))}wrap(e,t,n,o=40){let r=" \\f\\t\\v\xA0\u1680\u2000-\u200A\u202F\u205F\u3000\uFEFF",a=new RegExp(`[\\n][${r}]+`);if(e.match(a))return e;let f=t-n;if(f<o)return e;let d=e.slice(0,n),u=e.slice(n).replace(`\r
|
|
6
6
|
`,`
|
|
@@ -25,10 +25,10 @@ Expecting one of '${n.join("', '")}'`);let o=`${e}Help`;return this.on(o,r=>{let
|
|
|
25
25
|
`)})}}},[j.bifurcationInfo,s,ce]);let wo=S.default.useRef(null),xo=S.default.useRef(0),bo=S.default.useRef(0);(0,S.useEffect)(()=>{if(j.lastRunEnd&&j.lastRunEnd!==wo.current){wo.current=j.lastRunEnd;let{status:g,duration:v,summary:m,reason:w,context:k}=j.lastRunEnd,{passed:B,failed:$,total:F}=ln(j.steps);xo.current+=F,bo.current+=v??0,ze({status:g,duration:v??0,summary:m??"",stepsPassed:B,stepsFailed:$,stepsTotal:F,reason:w,finalState:j.lastRunEnd?.final_state,creditsConsumed:j.lastRunEnd?.credits_consumed}),s.logRunEnd(He.current,g,v,m);let W=j.bifurcationInfo,J=W&&!W.isSingleFlow?W.flows:null,de=rn(j.lastRunEnd,He.current,J),je=sn(j.lastRunEnd,Ct.current,He.current,de);s.addRunResult(je,j.lastRunEnd?.total_runs);let pt=j.lastRunEnd?.per_flow_metadata;if(W&&!W.isSingleFlow&&pt&&pt.length>1)for(let Je=0;Je<pt.length;Je++){let Vt=pt[Je],en=j.steps[Je],Lt=en?.children??[],In=Lt.filter(Tt=>Tt.status==="passed").length,fe=Lt.filter(Tt=>Tt.status==="failed").length,Ye=Lt.reduce((Tt,ko)=>Tt+(ko.duration??0),0),Qe=en?.status==="failed"?"failed":"passed",nt=W.flows[Je]??en?.objective??Ct.current;s.addFlow({runIndex:He.current,flowId:W.flows[Je],objective:nt,status:Qe,summary:Vt.summary??"",duration:Ye,steps:In+fe,stepsPassed:In,stepsFailed:fe,reason:Vt.error_message??void 0,creditsConsumed:Vt.credits_consumed??void 0})}else s.addFlow({runIndex:He.current,objective:Ct.current,status:g,summary:m??"",duration:v??0,steps:F,stepsPassed:B,stepsFailed:$,reason:w,creditsConsumed:j.lastRunEnd?.credits_consumed})}},[j.lastRunEnd,s,ce]);let yo=(0,S.useRef)(null);(0,S.useEffect)(()=>{j.askingUser&&(yo.current=j.askingUser)},[j.askingUser]);let _o=(0,S.useRef)(null);(0,S.useEffect)(()=>{if(Ee&&!j.isRunning&&j.lastRunEnd){if(_o.current===j.lastRunEnd)return;_o.current=j.lastRunEnd,ne((0,_.jsxs)(b,{flexDirection:"column",children:[(0,_.jsx)(gi,{status:Ee.status,steps:Ee.stepsTotal,duration:Ee.duration,creditsConsumed:Ee.creditsConsumed,reason:Ee.reason}),(0,_.jsx)(hi,{})]})),ze(null)}},[Ee,j.isRunning,j.lastRunEnd,ne]),(0,S.useEffect)(()=>{H.current?.setRunActive(j.isRunning)},[j.isRunning]),(0,S.useEffect)(()=>{if(j.runError&&!j.isRunning){let g=j.runError.trim();s.log("error","RUNNER_ERROR","Runner error occurred",{error:g}),s.escalateRun(s.nextRunIndex()-1);let m=g.split(`
|
|
26
26
|
`).slice(-8).join(`
|
|
27
27
|
`);ce({type:"error",text:`Runner error:
|
|
28
|
-
${m}`})}},[j.runError,j.isRunning,ce,s]);let Sn=(0,S.useCallback)(async()=>{s.log("info","EXIT_UPLOAD_START","Starting exit upload pipeline"),Xt(qn()),xt({status:"uploading"});let g=x.getResolvedBasicAuth(),v=null;if(!g&&(v=await x.getToken(),!v))return s.log("warn","EXIT_UPLOAD_ABORTED","Exit upload aborted \u2014 no auth available"),null;let m=Ne??await kt();if(!m)return s.log("warn","EXIT_UPLOAD_ABORTED","Exit upload aborted \u2014 no TMS credentials"),s.setUploadStatus("failed","Could not get TMS credentials"),null;s.log("info","EXIT_UPLOAD_CONFIG","Exit upload configuration",{test_id:s.testId,commit_id:s.sessionId,project_id:I.project_id,session_dir:s.sessionDir,run_dirs:s.getRunDirs()});let w={basicAuth:g??null,token:v,resolver:x.getResolver(),resolvedCreds:m};st.current&&(s.log("info","SCREENSHOT_UPLOAD_DRAIN","Draining screenshot queue before pipeline"),await st.current.drain(),s.log("info","SCREENSHOT_UPLOAD_DRAINED","Screenshot queue drained"));let k=dn({session:s,env:ie,auth:w,variables:Et.current??{raw:{},auteur:{},auteurObjective:"",secretEntries:[],nonSecretEntries:[]},variableIds:D.current,projectId:I.project_id,folderId:I.folder_id,totalSteps:xo.current,totalDuration:bo.current,screenshotExtMap:st.current?.getExtMap(),codeExport:un({codeExport:e,codeLanguage:t,skipCodeValidation:n},I.code_export),onProgress:(F,W,J)=>{s.log("info","EXIT_PROGRESS","Upload progress",{step:F,status:W,detail:J}),Xt(de=>Nr(de,F,W,J))},log:(F,W,J,de)=>s.log(F,W,J,de),shouldUploadArtifacts:!0,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0}),$=await new Mr(k).execute();if($.success){s.log("info","EXIT_UPLOAD_OK","Exit upload succeeded",{test_id:$.testId,testcase_id:$.testcaseId??null,share_id:$.shareId??null}),s.setUploadStatus("uploaded"),$.testId&&s.setTestId($.testId),$.testcaseId&&s.setTestcaseId($.testcaseId);let F=ve(ie),W=I.project_id,J=$.testcaseId&&$.shareId&&W?It(F.testManagerUiUrl,W,$.testcaseId,$.shareId):void 0,de=$.testcaseId&&W?cn(F.testManagerUiUrl,W,$.testcaseId):void 0;xt({status:"success",testUrl:J,testCaseLink:de,codeExportDir:$.codeExportDir}),pi({shareableLink:J,testCaseLink:de,codeExportDir:$.codeExportDir})}else s.log("error","EXIT_UPLOAD_FAILED","Exit upload failed",{error:$.error}),s.setUploadStatus("failed",$.error),xt({status:"failed",error:$.error});return $},[x,ie,s,I,Ne,kt]),Tn=(0,S.useCallback)(async()=>{s.log("info","SESSION_RESET_START","Starting session reset via /new"),L(!0);let g=s.getFlows();g.length>0&&ne((0,_.jsx)(Xo,{flows:g}));let v=null;if(!i)try{v=await Sn()??null}catch(k){s.log("error","SESSION_RESET_UPLOAD_FAILED","Upload failed during /new",{error:String(k)}),ce({type:"error",text:"Upload failed \u2014 session data saved locally."})}let m=null;try{let{persistRecordedSession:k}=await import("./persist-recorded-session-6X37MMUB.js");m=k(s,{testcaseId:s.testcaseId??void 0,projectId:I.project_id??void 0,folderId:I.folder_id??void 0,codeExportDir:v?.codeExportDir})}catch(k){s.log("error","SESSION_RESET_PERSIST_FAILED","Persist failed during /new",{error:String(k)})}if(v?.success&&v.testcaseId||m){let k=ve(ie),B=I.project_id,$=v?.testcaseId;ne((0,_.jsx)(Oo,{recordedTestPath:m?.recordedTestPath,outputDir:m?.outputDir,shareableLink:$&&v?.shareId&&B?It(k.testManagerUiUrl,B,$,v.shareId):void 0,testCaseLink:$&&B?cn(k.testManagerUiUrl,B,$):void 0,codeExportDir:v?.codeExportDir,autoExit:!1}))}s.testId&&Ie(k=>[...k,{testId:s.testId,runCount:O}]),kn.killChrome(),await s.finish("complete");let w=new on;w.start({model:I.model,environment:ie,profile:$t??null}),f.current=w,u(k=>k+1),s.log("info","SESSION_RESET_COMPLETE","Session reset complete",{new_session_id:w.sessionId}),await ct({kind:"resessionize",env:ie},Xe),U(0),xo.current=0,bo.current=0,He.current=0,Ct.current="",Et.current=null,D.current={},An.current=0,Eo.current=0,yo.current=null,_o.current=null,wo.current=null,vo.current=null,ze(null),A(null),xt(null),Xt(qn()),L(!1),ne((0,_.jsxs)(b,{flexDirection:"column",marginY:1,children:[(0,_.jsx)(l,{color:p.dimmed,children:"\u2500".repeat(44)}),(0,_.jsx)(l,{color:p.green,bold:!0,children:"New session started"})]}))},[s,ce,ne,i,Sn,kn,O,I,ie,$t,Xe]),_r=(0,S.useCallback)(async()=>{if(!(s.nextRunIndex()>0)){ce({type:"info",text:"No runs in current session."});return}if(j.isRunning){ce({type:"error",text:"Cannot reset while a run is in progress. Cancel the run first."});return}if(I.mode==="testing"&&!s.sessionName){jt("new"),Dt(Do());return}await Tn()},[s,j,ce,I.mode,Tn]),Cr=(0,S.useCallback)(async()=>{await s.finish("complete"),q(0,"Session complete")},[s]),Zi=(0,S.useCallback)(async g=>{Ue(!1);let v=s.testId??(we.length>0?we[we.length-1].testId:null);if(g&&v){s.log("info","EXIT_FEEDBACK_SUBMIT","Submitting session feedback",{choice:g});try{let m=ve(ie),w=x.getResolvedBasicAuth();w&&await ao({tmsBaseUrl:m.tmsBaseUrl,username:w.username,accessKey:w.access_key,testId:v,feedbackType:g,log:(k,B,$,F)=>s.log(k,B,$,F)})}catch(m){s.log("error","EXIT_FEEDBACK_FAILED","Feedback submission failed",{error:String(m)})}}else s.log("info","EXIT_FEEDBACK_SKIPPED","Feedback skipped");Cr()},[ie,x,s,Cr,we]),Rn=(0,S.useCallback)(async()=>{let g=s.nextRunIndex()>0,v=null;if(g&&!i){s.log("info","EXIT_WITH_ACTIVE_SESSION","Exit with active session \u2014 uploading first"),Ae(!0);try{v=await Sn()??null}catch(w){s.log("error","EXIT_UPLOAD_FAILED","Exit upload failed",{error:String(w)})}s.testId&&Ie(w=>[...w,{testId:s.testId,runCount:O}])}try{let{persistRecordedSession:w}=await import("./persist-recorded-session-6X37MMUB.js"),k=w(s,{testcaseId:s.testcaseId??void 0,projectId:I.project_id??void 0,folderId:I.folder_id??void 0,codeExportDir:v?.codeExportDir});k&&_t(k)}catch(w){s.log("error","EXIT_PERSIST_FAILED","Persist failed during /exit",{error:String(w)})}if(g&&!i&&await s.finish("complete"),!(s.testId??(we.length>0?we[we.length-1].testId:null))||i){await s.finish("complete"),q(0,"No test ID \u2014 quick exit");return}Ae(!0),Ue(!0)},[s,i,Sn,O,we,I]),St=(0,S.useCallback)(async()=>{if(oe)return;s.log("info","EXIT_START","TUI exit initiated");let g=I.mode==="testing",v=s.nextRunIndex()>0;if(g&&v&&!s.sessionName){jt("exit"),Dt(Do());return}await Rn()},[oe,s,I.mode,Rn]),es=(0,S.useCallback)(g=>{g&&s.setSessionName(g);let v=Jt;Dt(null),jt(null),v==="new"?Tn():Rn()},[s,Jt,Rn,Tn]);(0,S.useEffect)(()=>{if(!oe)return;let g=300*1e3,v=setTimeout(async()=>{s.setUploadStatus("failed","Upload timed out after 5m"),await s.finish("complete"),q(0,"Upload timed out after 5m")},g);return()=>clearTimeout(v)},[oe,s]);let An=S.default.useRef(0),Co=S.default.useRef(null),Eo=S.default.useRef(0);qe((g,v)=>{if(v.ctrl&&g==="c"){if(oe){Eo.current+=1,Eo.current>=2&&(s.setUploadStatus("pending","Force exit by user"),s.finish("complete"),q(0,"Force exit by user"));return}if(j.isRunning){j.cancelRun(),ce({type:"info",text:"Run cancelled."}),An.current++,Co.current&&clearTimeout(Co.current),Co.current=setTimeout(()=>{An.current=0},2e3),An.current>=2&&St();return}St()}});let Er=S.default.useMemo(()=>{let g=x.creds.getActiveProfile()??"none",v=x.creds.getDefaultEnv();return[{id:"run",label:"Run",type:"submenu",children:[{id:"run-start",label:"Start Run",type:"action"},{id:"run-config",label:"Run Config",type:"submenu",children:[{id:"run-headless",label:"Headless",type:"select",currentValue:Y.headless?"on":"off",options:[{label:"off",value:"off"},{label:"on",value:"on"}],onValue:m=>{Zt(w=>({...w,headless:m==="on"}))}},{id:"run-max-steps",label:"Max Steps",type:"text-input",currentValue:String(Y.maxSteps),onValue:m=>{let w=parseInt(m,10);w>0&&Zt(k=>({...k,maxSteps:w}))}},{id:"run-timeout",label:"Timeout (sec)",type:"text-input",currentValue:Y.timeout?String(Y.timeout):"",placeholder:"0 = no timeout",onValue:m=>{let w=parseInt(m,10);Zt(k=>({...k,timeout:isNaN(w)?0:w}))}},{id:"run-cdp",label:"CDP Endpoint",type:"text-input",currentValue:Y.cdpEndpoint,placeholder:"http://127.0.0.1:9222",onValue:m=>{Zt(w=>({...w,cdpEndpoint:m}))}},{id:"run-ws",label:"WS Endpoint",type:"text-input",currentValue:Y.wsEndpoint,placeholder:"wss://...",onValue:m=>{Zt(w=>({...w,wsEndpoint:m}))}}]}]},{id:"auth",label:"Auth",type:"submenu",children:[{id:"login",label:"Login",type:"action",onLoginWizard:()=>{}},{id:"logout",label:"Logout",type:"action",onAction:()=>{x.logout().then(m=>{Ve();let w=x.creds.getActiveProfile(),k=x.creds.getDefaultEnv();tt(w,k);let B=wi(w,k);ct(B,Xe).catch(()=>{}),m?K("ok","/logout",`Logged out: ${m.profile} [${m.env}]`):K("ok","/logout","No active profile")}).catch(()=>{K("error","/logout","Logout failed")})}},{id:"whoami",label:"Who Am I",type:"action",onInfo:()=>{let m=x.creds.getActiveProfile()??"none",w=x.creds.getDefaultEnv(),k=x.creds.loadBasicAuth(m,w),B=k?"basic":x.creds.loadCredentials(m,w)?"oauth":"not configured";return{title:"Who Am I",sections:[{label:"Identity",entries:[{key:"Profile",value:m},{key:"Environment",value:w}]},{label:"Authentication",entries:[{key:"Method",value:B},...k?[{key:"Username",value:k.username}]:[]]},{label:"Token",entries:[{key:"Status",value:x.tokenValid?"valid":"not logged in",color:x.tokenValid?p.statusPass:p.statusFail}]}]}}},{id:"balance",label:"Credit Balance",type:"action",suppressFeedback:!0,onAction:()=>{(async()=>{let m=x.creds.getActiveProfile()??"default",w=x.creds.getDefaultEnv(),k=ve(w);try{let B=x.getBasicAuth(),$=B?null:await x.getToken();if(!B&&!$){te({text:"Not authenticated. Run /login first.",color:p.red});return}let{ControllerClient:F}=await import("./controller-client-RD2YEMAH.js"),J=await(B?new F(k.controllerBaseUrl,{username:B.username,accessKey:B.access_key}):new F(k.controllerBaseUrl,$)).getCreditBalance();te({text:`Credits \u2014 available: ${J.available_credits}, total: ${J.total_credits} (${m} / ${w})`,color:p.green})}catch(B){te({text:`Balance check failed: ${B instanceof Error?B.message:String(B)}`,color:p.red})}et.current&&clearTimeout(et.current),et.current=setTimeout(()=>{te(null),et.current=null},5e3)})()}},{id:"profiles",label:"Profiles",type:"action",onProfilesView:()=>{}}]},{id:"config",label:"Config",type:"submenu",children:[{id:"config-show",label:"Show",type:"action",onInfo:()=>({title:"Show Config",sections:[{label:"General",entries:[{key:"Model",value:"v16-alpha"},{key:"Mode",value:I.mode}]},{label:"Browser",entries:[{key:"Window",value:`${I.window_size.width}x${I.window_size.height}`},{key:"Chrome Profile",value:I.chrome_profile_path?I.chrome_profile_path.split("/").pop()??I.chrome_profile_path:"(temporary)"}]},{label:"Project",entries:[{key:"Project",value:I.project_name?`${I.project_name} (${I.project_id})`:I.project_id??"(none)"},{key:"Folder",value:I.folder_name?`${I.folder_name} (${I.folder_id})`:I.folder_id??"(none)"},{key:"Default URL",value:lt}]},{label:"Code Export",entries:[{key:"Enabled",value:I.code_export.enabled?"yes":"no"},{key:"Language",value:I.code_export.language},{key:"Skip Validation",value:I.code_export.skip_validation?"yes":"no"}]}]})},{id:"config-chrome",label:"Chrome Profile",type:"action",onChromeProfilePicker:()=>{}},{id:"config-project",label:"Project",type:"action",onProjectPicker:()=>{}},{id:"config-folder",label:"Folder",type:"action",...I.project_id?{onFolderPicker:()=>{}}:{onInfo:()=>({title:"Folder",sections:[{entries:[{key:"Status",value:"Select a project first",color:p.dim}]}]})}},{id:"config-window",label:"Window Size",type:"action",currentValue:`${I.window_size.width}x${I.window_size.height}`,onWindowSizePicker:()=>{}},{id:"config-mode",label:"Mode",type:"select",currentValue:I.mode,options:[{label:"testing",value:"testing"},{label:"action",value:"action"}],onValue:m=>{(m==="action"||m==="testing")&&(c.set("mode",m),De(c.load()),K("ok","/config set-mode",m))}},{id:"config-code-export",label:"Code Export",type:"submenu",currentValue:I.code_export.enabled?"enabled":"disabled",children:[{id:"config-code-export-enabled",label:"Enabled",type:"select",currentValue:I.code_export.enabled?"on":"off",options:[{label:"off",value:"off"},{label:"on",value:"on"}],onValue:m=>{c.set("code_export",{...I.code_export,enabled:m==="on"}),De(c.load()),K("ok","/config code-export enabled",m)}},{id:"config-code-export-language",label:"Language",type:"select",currentValue:I.code_export.language,options:[{label:"python",value:"python"},{label:"javascript",value:"javascript"}],onValue:m=>{m!=="python"&&m!=="javascript"||(c.set("code_export",{...I.code_export,language:m}),De(c.load()),K("ok","/config code-export language",m))}},{id:"config-code-export-skip-validation",label:"Skip Validation",type:"select",currentValue:I.code_export.skip_validation?"on":"off",options:[{label:"off",value:"off"},{label:"on",value:"on"}],onValue:m=>{c.set("code_export",{...I.code_export,skip_validation:m==="on"}),De(c.load()),K("ok","/config code-export skip-validation",m)}}]}]},{id:"exit",label:"Exit",type:"action",onAction:()=>{St()}}]},[x,c,I,ce,St,Y,Ve,K]),ts=(0,S.useCallback)(g=>{if(j.askingUser){let m=j.askingUser;ne((0,_.jsxs)(b,{flexDirection:"column",marginLeft:2,paddingLeft:1,marginTop:1,children:[(0,_.jsx)(b,{marginLeft:1,children:(0,_.jsx)(l,{color:p.primary,bold:!0,children:"Agent Question"})}),(0,_.jsxs)(b,{borderStyle:"round",borderColor:p.primary,flexDirection:"column",paddingX:2,paddingY:1,width:70,children:[(0,_.jsxs)(b,{children:[(0,_.jsx)(b,{width:3,children:(0,_.jsx)(l,{color:p.primary,bold:!0,children:"?"})}),(0,_.jsx)(b,{flexShrink:1,children:(0,_.jsx)(l,{wrap:"wrap",children:m})})]}),(0,_.jsxs)(b,{marginTop:1,children:[(0,_.jsx)(b,{width:3,children:(0,_.jsx)(l,{color:p.dim,bold:!0,children:"\u2192"})}),(0,_.jsx)(b,{flexShrink:1,children:(0,_.jsx)(l,{color:p.accent,wrap:"wrap",children:g})})]})]})]})),yo.current=null,j.sendAnswer(g);return}if(s.logCommand(g),j.isRunning){ce({type:"error",text:"Run in progress. Ctrl+C to cancel."});return}let v=ci(g);if(v)switch(v.command){case"login":case"logout":case"whoami":case"profiles":case"balance":case"auth":Bt("auth");return;case"config":Bt("config");return;case"help":vr(!0);return;case"update":{(async()=>{let{getUpdateCommand:m}=await import("./version-check-VVNXNEGO.js");K("ok","/update",`To update kane-cli, run: ${m()}`)})();return}case"summary":{let m=s.getFlows();if(m.length===0){K("ok","/summary","No runs yet in this session.");return}let w=v.args.index?parseInt(v.args.index,10):void 0;if(w!==void 0&&!s.getFlow(w)){K("error","/summary",`No flow at index ${w}`,`${m.length} flow${m.length===1?"":"s"} available. Use /summary to see all.`);return}ne((0,_.jsx)(Xo,{flows:m,filterIndex:w})),K("ok","/summary",w!==void 0?`Flow ${w}`:`${m.length} flow${m.length===1?"":"s"}`);return}case"new":_r(),K("ok","/new","Session reset");return;case"name":{let m=v.raw.replace(/^\/name\s*/,"").trim();if(!m){K("error","/name","Usage: /name <new-name>");return}(async()=>{let{validateNameOrThrow:w}=await import("./name-validator-5YGJXLZ7.js");try{w(m),s.setSessionName(m),K("ok","/name",`Session name set: ${m}`)}catch(k){K("error","/name",k.message)}})();return}case"cancel":j.cancelRun(),K("ok","/cancel","Run cancelled");return;case"clear":K("ok","/clear","Chat cleared");return;case"exit":St();return;default:K("error",`/${v.command}`,"Unknown command");return}if(g.trim().toLowerCase()==="exit"){St();return}ne((0,_.jsxs)(b,{children:[(0,_.jsx)(l,{color:"#b388ff",children:"\u276F "}),(0,_.jsx)(l,{children:g})]})),yr(g,lt)},[j,ce,K,ne,s,yr,St,_r]),kr=x.getAuthInfo(),ns=kr?kr.method==="basic"?"basic auth":"oauth":"not logged in",os=(()=>{if(En)return["help"];if(R)return R.phase==="wizard"?["auth","login"]:R.phase==="project"?["auth","login","project"]:R.phase==="folder"?["auth","login","folder"]:["auth","login"];let g={infoView:"info",loginWizard:"login",profilesView:"profiles",chromeProfilePicker:"chrome-profile",projectPicker:"project",folderPicker:"folder",windowSizePicker:"set-window"};return Ge==="auth"?Cn?["auth",g[Cn]]:["auth"]:Ge==="config"?Cn?["config",g[Cn]]:["config"]:Ge==="help"?["help"]:j.askingUser?["agent question"]:[]})();return(0,_.jsxs)(b,{flexDirection:"column",children:[se.length>0&&(0,_.jsx)(Pn,{items:se,children:g=>(0,_.jsx)(b,{paddingX:1,children:g.content},g.id)}),!h&&!ke&&(0,_.jsx)(oi,{onComplete:()=>{let g=x.creds.getActiveProfile(),v=x.creds.getDefaultEnv(),m=g?x.creds.loadCredentials(g,v):null,w=g?x.creds.loadBasicAuth(g,v):null,k=!!(m||w),B=w?.username??g??null;ne((0,_.jsx)(Zn,{size:"full",helmetVisibleRows:8,textVisibleRows:7,showMeta:!0,version:at,authenticated:k,user:B})),Oe(!0);let $=(F,W,J,de)=>{s.log(F,W,J,de)};if(Fr(x.creds,$).then(F=>{if(F.status==="authenticated"){let{profile:W,env:J,tmsCreds:de}=F.result;x.creds.setActiveProfile(W),x.creds.setDefaultEnv(J),Ve(),bt(de),re("ready"),T(!0)}else F.status==="needs_pick"?(le(F.profiles),re("pick")):re("login")}).catch(F=>{s.log("error","STARTUP_GATE_ERROR","Auth gate failed",{error:String(F)}),re("login")}),o&&o.then(async F=>{if(F){let{getUpdateCommand:W}=await import("./version-check-VVNXNEGO.js");K("ok","update available",`${F.current} \u2192 ${F.latest}`,`Run: ${W()}`)}}).catch(()=>{}),r&&r.changes.length>0){let F=`kane-cli updated to ${r.toVersion}. Default settings changed:`,W=[...r.changes.map(J=>`\u2022 ${J.description} (${J.field}: ${JSON.stringify(J.from)} \u2192 ${JSON.stringify(J.to)})`),"","Use /config to review or revert any of these."].join(`
|
|
29
|
-
`);K("ok","defaults updated",F,W)}}}),!h&&ae==="booting"&&ke&&(0,_.jsx)(b,{paddingX:1,children:(0,_.jsx)(l,{color:"yellow",children:"Checking authentication..."})}),!h&&ae==="pick"&&(0,_.jsx)(ks,{profiles:ee,onCancel:()=>re("login"),onSelect:async(g,v)=>{x.creds.setActiveProfile(g),x.creds.setDefaultEnv(v),Ve(),We(!0);let m=(w,k,B,$)=>{s.log(w,k,B,$)};try{let w=await Lr(x.creds,g,v,m);We(!1),w.status==="authenticated"?(tt(g,v),bt(w.result.tmsCreds),re("ready"),T(!0)):re("login")}catch{We(!1),re("login")}},validating:Pe}),!h&&ae==="login"&&!R&&(0,_.jsx)($n,{devMode:process.env.KANE_DEV_MODE==="1",profiles:x.creds.listProfiles(),onBasicLogin:async(g,v,m,w)=>{let{validateBasicAuth:k}=await import("./validate-basic-Q5IZSBIG.js");await k(v,m,w),x.creds.saveBasicAuth(g,v,{username:m,access_key:w}),x.creds.setActiveProfile(g),x.creds.setDefaultEnv(v),Te(x.creds,c,g,v),x.setTokenValid(!0),Ve()},onOAuthLogin:async(g,v)=>{x.creds.setDefaultEnv(v),await x.login(g),Te(x.creds,c,g,v),Ve()},onComplete:(g,v)=>{ct(so(v),Xe).then(()=>{Ve(),me({phase:"project",profile:g,env:v})}).catch(()=>{me({phase:"project",profile:g,env:v})})},onCancel:()=>{q(0,"Login cancelled at startup")}}),!h&&ae==="login"&&R?.phase==="project"&&(0,_.jsx)(Nt,{resolver:x.getResolver(),currentProjectId:null,env:R.env,onSelect:(g,v)=>{x.creds.saveProfileConfig(R.profile,R.env,{project_id:g,project_name:v}),K("ok","/config project",v,`id: ${g}`),me({...R,phase:"folder"})},onCancel:async()=>{let g=await go(R.profile,R.env);g&&(pe(x.creds,c,R.profile,R.env,{projectId:g.id,projectName:g.name}),K("ok","/config project",g.name,`id: ${g.id}`),me({...R,phase:"folder"}))}}),!h&&ae==="login"&&R?.phase==="folder"&&(0,_.jsx)(Ut,{resolver:x.getResolver(),projectId:x.creds.loadProfileConfig(R.profile,R.env)?.project_id??"",currentFolderId:null,env:R.env,onSelect:(g,v)=>{x.creds.saveProfileConfig(R.profile,R.env,{folder_id:g,folder_name:v}),K("ok","/config folder",v,`id: ${g}`),tt(R.profile,R.env),me(null),re("ready"),T(!0)},onCancel:async()=>{let g=x.creds.loadProfileConfig(R.profile,R.env);if(!g?.project_id)return;let v=await ho(R.env,g.project_id);v&&(pe(x.creds,c,R.profile,R.env,{folderId:v.id,folderName:v.name}),K("ok","/config folder",v.name,`id: ${v.id}`),tt(R.profile,R.env),me(null),re("ready"),T(!0))}}),h&&Se==="menu"&&!oe&&(0,_.jsx)(b,{marginBottom:1,children:(0,_.jsxs)(b,{borderStyle:"round",borderColor:"#dc4e08",paddingX:2,children:[(0,_.jsx)(l,{color:"#ff9500",bold:!0,children:"KaneAI CLI"}),(0,_.jsx)(l,{color:p.dimmed,children:" \u2502 "}),(0,_.jsx)(l,{color:"#ff9500",children:I.model}),(0,_.jsx)(l,{color:p.dimmed,children:" \u2502 "}),(0,_.jsx)(l,{color:p.dimmed,children:ns}),(0,_.jsx)(l,{color:p.dimmed,children:" \u2502 "}),(0,_.jsxs)(l,{color:p.dimmed,children:[$t??"no profile","/",ie]})]})}),h&&!oe&&(0,_.jsxs)(b,{flexDirection:"column",flexGrow:1,children:[Se==="menu"&&(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(Ho,{items:Er,onRunSelected:()=>Qt("chat"),onActiveViewChange:hr,renderLoginWizard:g=>{let v=R?.phase??"wizard";if(v==="project")return(0,_.jsx)(Nt,{resolver:x.getResolver(),currentProjectId:null,env:R.env,onSelect:(m,w)=>{x.creds.saveProfileConfig(R.profile,R.env,{project_id:m,project_name:w}),K("ok","/config project",w,`id: ${m}`),me(k=>k?{...k,phase:"folder"}:null)},onCancel:async()=>{if(!R)return;let m=await go(R.profile,R.env);m&&(pe(x.creds,c,R.profile,R.env,{projectId:m.id,projectName:m.name}),K("ok","/config project",m.name,`id: ${m.id}`),me(w=>w?{...w,phase:"folder"}:null))}});if(v==="folder"){let m=x.creds.loadProfileConfig(R.profile,R.env);return(0,_.jsx)(Ut,{resolver:x.getResolver(),projectId:m?.project_id??"",currentFolderId:null,env:R.env,onSelect:(w,k)=>{x.creds.saveProfileConfig(R.profile,R.env,{folder_id:w,folder_name:k}),K("ok","/config folder",k,`id: ${w}`),tt(R.profile,R.env),me(null),g()},onCancel:async()=>{if(!R)return;let w=x.creds.loadProfileConfig(R.profile,R.env);if(!w?.project_id)return;let k=await ho(R.env,w.project_id);k&&(pe(x.creds,c,R.profile,R.env,{folderId:k.id,folderName:k.name}),K("ok","/config folder",k.name,`id: ${k.id}`),tt(R.profile,R.env),me(null),g())}})}return(0,_.jsx)($n,{devMode:process.env.KANE_DEV_MODE==="1",profiles:x.creds.listProfiles(),onBasicLogin:async(m,w,k,B)=>{let{validateBasicAuth:$}=await import("./validate-basic-Q5IZSBIG.js");await $(w,k,B),x.creds.saveBasicAuth(m,w,{username:k,access_key:B}),x.creds.setActiveProfile(m),x.creds.setDefaultEnv(w),Te(x.creds,c,m,w),x.setTokenValid(!0),Ve()},onOAuthLogin:async(m,w)=>{x.creds.setDefaultEnv(w),await x.login(m),Te(x.creds,c,m,w),Ve()},onComplete:(m,w)=>{ct(so(w),Xe).then(()=>{me({phase:"project",profile:m,env:w})}).catch(()=>{me({phase:"project",profile:m,env:w})})},onCancel:()=>{me(null),g()}})},renderProfilesView:g=>(0,_.jsx)(Ro,{creds:x.creds,onSwitch:(v,m)=>{let w=x.creds.getActiveProfile()??"(none)";x.creds.setActiveProfile(v),x.creds.setDefaultEnv(m),Te(x.creds,c,v,m),tt(v,m),Ve(),ct(Jo(m),Xe).catch(()=>{}),K("ok","/profiles switch",`${w} \u2192 ${v} [${m}]`)},onCancel:g}),renderChromeProfilePicker:g=>(0,_.jsx)(Ao,{currentPath:I.chrome_profile_path,onSelect:v=>{c.set("chrome_profile_path",v),De(c.load()),K("ok","/config chrome-profile",v),g()},onCancel:g}),renderProjectPicker:g=>(0,_.jsx)(Nt,{resolver:x.getResolver(),currentProjectId:I.project_id,env:ie,onSelect:(v,m)=>{pe(x.creds,c,x.creds.getActiveProfile()??"default",x.creds.getDefaultEnv(),{projectId:v,projectName:m}),K("ok","/config project",m,`id: ${v}`),De(c.load()),g()},onCancel:g}),renderFolderPicker:g=>(0,_.jsx)(Ut,{resolver:x.getResolver(),projectId:I.project_id??"",currentFolderId:I.folder_id,env:ie,onSelect:(v,m)=>{pe(x.creds,c,x.creds.getActiveProfile()??"default",x.creds.getDefaultEnv(),{folderId:v,folderName:m}),K("ok","/config folder",m,`id: ${v}`),De(c.load()),g()},onCancel:g}),renderWindowSizePicker:g=>(0,_.jsx)(Go,{currentWidth:I.window_size.width,currentHeight:I.window_size.height,onSelect:(v,m)=>{c.set("window_size",{width:v,height:m}),De(c.load()),K("ok","/config set-window",`${v} \xD7 ${m}`),g()},onCancel:g})}),Me&&(0,_.jsx)(b,{paddingX:1,marginTop:1,children:(0,_.jsx)(l,{color:Me.color,children:Me.text})})]}),Se==="chat"&&(0,_.jsxs)(_.Fragment,{children:[(()=>{let g=Bn({isRunning:j.isRunning,bifurcationInfo:j.bifurcationInfo,steps:j.steps,cmInitCounts:j.cmInitCounts,replayInfo:j.replayInfo});return g?(0,_.jsx)(jn,{label:g.label,hasBifurcation:g.hasBifurcation}):null})(),j.isRunning&&j.steps.length>0&&(0,_.jsx)(Dn,{steps:j.steps,bifurcated:!!j.bifurcationInfo&&!j.bifurcationInfo.isSingleFlow,flows:j.bifurcationInfo?.flows,cmInitCounts:j.cmInitCounts,onStepCommit:ne},`run-${He.current}`),En&&(0,_.jsx)(mi,{onClose:()=>vr(!1),version:at,environment:x.creds.getDefaultEnv(),sessionId:s.sessionId,runUrl:I.default_url??lt}),Ge&&!j.isRunning&&(()=>{let g=Er.find(v=>v.id===Ge);return g?.children?(0,_.jsx)(Ho,{items:g.children,onRunSelected:()=>Bt(null),onDismiss:()=>Bt(null),onActiveViewChange:hr,renderLoginWizard:v=>{let m=R?.phase??"wizard";if(m==="project")return(0,_.jsx)(Nt,{resolver:x.getResolver(),currentProjectId:null,env:R.env,onSelect:(w,k)=>{x.creds.saveProfileConfig(R.profile,R.env,{project_id:w,project_name:k}),K("ok","/config project",k,`id: ${w}`),me(B=>B?{...B,phase:"folder"}:null)},onCancel:async()=>{if(!R)return;let w=await go(R.profile,R.env);w&&(pe(x.creds,c,R.profile,R.env,{projectId:w.id,projectName:w.name}),K("ok","/config project",w.name,`id: ${w.id}`),me(k=>k?{...k,phase:"folder"}:null))}});if(m==="folder"){let w=x.creds.loadProfileConfig(R.profile,R.env);return(0,_.jsx)(Ut,{resolver:x.getResolver(),projectId:w?.project_id??"",currentFolderId:null,env:R.env,onSelect:(k,B)=>{x.creds.saveProfileConfig(R.profile,R.env,{folder_id:k,folder_name:B}),K("ok","/config folder",B,`id: ${k}`),tt(R.profile,R.env),me(null),v()},onCancel:async()=>{if(!R)return;let k=x.creds.loadProfileConfig(R.profile,R.env);if(!k?.project_id)return;let B=await ho(R.env,k.project_id);B&&(pe(x.creds,c,R.profile,R.env,{folderId:B.id,folderName:B.name}),K("ok","/config folder",B.name,`id: ${B.id}`),tt(R.profile,R.env),me(null),v())}})}return(0,_.jsx)($n,{devMode:process.env.KANE_DEV_MODE==="1",profiles:x.creds.listProfiles(),onBasicLogin:async(w,k,B,$)=>{let{validateBasicAuth:F}=await import("./validate-basic-Q5IZSBIG.js");await F(k,B,$),x.creds.saveBasicAuth(w,k,{username:B,access_key:$}),x.creds.setActiveProfile(w),x.creds.setDefaultEnv(k),Te(x.creds,c,w,k),x.setTokenValid(!0),Ve()},onOAuthLogin:async(w,k)=>{x.creds.setDefaultEnv(k),await x.login(w),Te(x.creds,c,w,k),Ve()},onComplete:(w,k)=>{ct(so(k),Xe).then(()=>{me({phase:"project",profile:w,env:k})}).catch(()=>{me({phase:"project",profile:w,env:k})})},onCancel:()=>{me(null),v()}})},renderProfilesView:v=>(0,_.jsx)(Ro,{creds:x.creds,onSwitch:(m,w)=>{let k=x.creds.getActiveProfile()??"(none)";x.creds.setActiveProfile(m),x.creds.setDefaultEnv(w),Te(x.creds,c,m,w),tt(m,w),Ve(),ct(Jo(w),Xe).catch(()=>{}),K("ok","/profiles switch",`${k} \u2192 ${m} [${w}]`),v()},onCancel:v}),renderChromeProfilePicker:v=>(0,_.jsx)(Ao,{currentPath:I.chrome_profile_path,onSelect:m=>{c.save({chrome_profile_path:m}),De(c.load()),K("ok","/config chrome-profile",m),v()},onCancel:v}),renderProjectPicker:v=>(0,_.jsx)(Nt,{resolver:x.getResolver(),currentProjectId:I.project_id,env:ie,onSelect:(m,w)=>{pe(x.creds,c,x.creds.getActiveProfile()??"default",x.creds.getDefaultEnv(),{projectId:m,projectName:w}),De(c.load()),K("ok","/config project",w,`id: ${m}`),v()},onCancel:v}),renderFolderPicker:v=>(0,_.jsx)(Ut,{resolver:x.getResolver(),projectId:I.project_id??"",currentFolderId:I.folder_id,env:ie,onSelect:(m,w)=>{pe(x.creds,c,x.creds.getActiveProfile()??"default",x.creds.getDefaultEnv(),{folderId:m,folderName:w}),De(c.load()),K("ok","/config folder",w,`id: ${m}`),v()},onCancel:v}),renderWindowSizePicker:v=>(0,_.jsx)(Go,{currentWidth:I.window_size.width,currentHeight:I.window_size.height,onSelect:(m,w)=>{c.set("window_size",{width:m,height:w}),De(c.load()),K("ok","/config set-window",`${m} \xD7 ${w}`),v()},onCancel:v})},Ge):null})(),Ge&&Me&&(0,_.jsx)(b,{paddingX:1,marginTop:1,children:(0,_.jsx)(l,{color:Me.color,children:Me.text})}),!Ge&&!En&&!yt&&j.askingUser&&(0,_.jsxs)(b,{flexDirection:"column",marginLeft:2,paddingLeft:1,marginTop:1,children:[(0,_.jsx)(b,{marginLeft:1,children:(0,_.jsx)(l,{color:p.primary,bold:!0,children:"Agent Question"})}),(0,_.jsx)(b,{borderStyle:"round",borderColor:p.primary,flexDirection:"column",paddingX:2,paddingY:1,width:70,children:(0,_.jsxs)(b,{children:[(0,_.jsx)(b,{width:3,children:(0,_.jsx)(l,{color:p.primary,bold:!0,children:"?"})}),(0,_.jsx)(b,{flexShrink:1,children:(0,_.jsx)(l,{wrap:"wrap",children:j.askingUser})})]})})]}),!Ge&&!En&&!yt&&(0,_.jsx)(Ir,{onSubmit:ts,onEscape:void 0,history:zi,commands:no,placeholder:j.askingUser?"Type your answer...":j.isRunning?"Run in progress... Ctrl+C to cancel":"Type an objective... (/ = commands)"})]})]}),h&&oe&&Z&&(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(Po,{steps:xn,status:Z.status,testUrl:Z.testUrl,error:Z.error}),Z.status==="success"&&(0,_.jsx)(Oo,{recordedTestPath:he?.recordedTestPath,outputDir:he?.outputDir,shareableLink:Z.testUrl,testCaseLink:Z.testCaseLink,codeExportDir:Z.codeExportDir,autoExit:!1})]}),yt&&(0,_.jsx)(Hr,{defaultName:yt,onSubmit:es}),yn&&(0,_.jsx)(Ur,{onSubmit:Zi}),bn&&Z&&(0,_.jsx)(Po,{steps:xn,status:Z.status,error:Z.error}),h&&!oe&&(0,_.jsx)(ei,{profile:$t,environment:ie,model:I.model,tokenValid:x.tokenValid,sessionId:s.sessionId,runCount:O,viewMode:Se,breadcrumb:os})]})}function ks({profiles:i,onSelect:e,onCancel:t,validating:n}){let[o,r]=(0,S.useState)(0);return qe((a,f)=>{if(!n){if(f.escape){t();return}if(f.upArrow&&o>0&&r(d=>d-1),f.downArrow&&o<i.length-1&&r(d=>d+1),f.return){let d=i[o];e(d.profile,d.env)}}}),(0,_.jsxs)(b,{flexDirection:"column",paddingX:1,children:[(0,_.jsx)(l,{color:"#ff9500",bold:!0,children:"Select a profile:"}),(0,_.jsx)(b,{marginTop:1,flexDirection:"column",children:i.map((a,f)=>(0,_.jsxs)(l,{children:[f===o?"\u276F ":" ",(0,_.jsx)(l,{color:f===o?"#ff9500":"white",bold:f===o,children:a.profile}),(0,_.jsxs)(l,{color:"gray",children:[" [",a.env,"]"]})]},`${a.profile}-${a.env}`))}),n&&(0,_.jsx)(b,{marginTop:1,children:(0,_.jsx)(l,{color:"yellow",children:"Validating credentials..."})}),!n&&(0,_.jsx)(b,{marginTop:1,children:(0,_.jsx)(l,{color:"gray",children:"Esc = new login"})})]})}var Oi=N(Pi(),1),{program:Wc,createCommand:qc,createArgument:Kc,createOption:zc,CommanderError:Gc,InvalidArgumentError:Xc,InvalidOptionArgumentError:Jc,Command:Di,Argument:Yc,Option:it,Help:Qc}=Oi.default;import{join as mt}from"path";var Li=N(Ze(),1);var Fe=N(Ze(),1);var vt=N(X(),1);function ji({steps:i,bifurcationInfo:e,perFlowMetadata:t}){return!e||e.isSingleFlow||!t||t.length<=1?null:(0,vt.jsx)(b,{flexDirection:"column",children:t.map((n,o)=>{let r=i[o],a=r?.children??[],f=a.filter(P=>P.status==="passed").length,d=a.filter(P=>P.status==="failed").length,u=f+d,s=a.reduce((P,h)=>P+(h.duration??0),0),c=r?.status==="failed"?"failed":"passed",y=e.flows[o]??r?.objective??`Flow ${o+1}`;return(0,vt.jsxs)(b,{flexDirection:"column",marginTop:o>0?1:0,children:[(0,vt.jsxs)(b,{marginLeft:1,children:[(0,vt.jsx)(l,{color:"#b388ff",bold:!0,children:"Flow "+(o+1)+": "}),(0,vt.jsx)(l,{color:"#b388ff",children:y})]}),(0,vt.jsx)(Ht,{status:c,summary:n?.summary??"",duration:s,steps:u,stepsPassed:f,stepsFailed:d,reason:n?.error_message??void 0,creditsConsumed:n?.credits_consumed??void 0})]},`flow-summary-${o}`)})})}var ge=N(X(),1);function Bi({config:i,spawnOpts:e,cancelRef:t,banner:n,onComplete:o,onStepEnd:r,onReasoning:a,onStepComplete:f}){let{exit:d}=On(),u=Hn(r,void 0,a,f),s=(0,Fe.useRef)(!1),c=(0,Fe.useRef)(!1),[y,P]=(0,Fe.useState)("");(0,Fe.useEffect)(()=>{s.current||(s.current=!0,u.startRun(i,e))},[i,e,u]),(0,Fe.useEffect)(()=>{t&&(t.current=()=>u.cancelRun())},[t,u]);let h=(0,Fe.useRef)(0);qe((A,E)=>{E.ctrl&&A==="c"&&(u.isRunning?(h.current++,h.current>=2?d():u.cancelRun()):d())}),qe((A,E)=>{u.askingUser&&(E.return?(u.sendAnswer(y),P("")):E.backspace||E.delete?P(M=>M.slice(0,-1)):A&&!E.ctrl&&!E.meta&&P(M=>M+A))},{isActive:!!u.askingUser}),(0,Fe.useEffect)(()=>{if(!u.isRunning&&u.lastRunEnd&&!c.current){c.current=!0;let{passed:A,failed:E,total:M}=ln(u.steps),O=u.bifurcationInfo;o({lastRunEnd:u.lastRunEnd,stepsPassed:A,stepsFailed:E,stepsTotal:M,hadError:!1,bifurcationFlows:O&&!O.isSingleFlow?O.flows:null}),d()}},[u.isRunning,u.lastRunEnd,u.steps,o,d]),(0,Fe.useEffect)(()=>{u.runError&&!u.isRunning&&!c.current&&(c.current=!0,o({lastRunEnd:null,stepsPassed:0,stepsFailed:0,stepsTotal:0,hadError:!0,bifurcationFlows:null}),d())},[u.runError,u.isRunning,o,d]);let T=u.lastRunEnd?(()=>{let{passed:A,failed:E,total:M}=ln(u.steps);return{status:u.lastRunEnd.status,duration:u.lastRunEnd.duration??0,summary:u.lastRunEnd.summary??"",stepsPassed:A,stepsFailed:E,stepsTotal:M,reason:u.lastRunEnd.reason,finalState:u.lastRunEnd.final_state,creditsConsumed:u.lastRunEnd.credits_consumed}})():null,V=(0,Fe.useMemo)(()=>n?[{key:"banner",...n}]:[],[n]);return(0,ge.jsxs)(b,{flexDirection:"column",children:[(0,ge.jsx)(Pn,{items:V,children:A=>(0,ge.jsxs)(b,{flexDirection:"column",marginBottom:1,children:[(0,ge.jsxs)(b,{borderStyle:"round",borderColor:"#dc4e08",paddingX:2,children:[(0,ge.jsx)(l,{color:"#ff9500",bold:!0,children:"KaneAI CLI"}),(0,ge.jsx)(l,{color:p.dimmed,children:" \u2502 "}),(0,ge.jsx)(l,{color:p.cyan,children:A.model}),(0,ge.jsx)(l,{color:p.dimmed,children:" \u2502 "}),(0,ge.jsx)(l,{color:p.dimmed,children:A.auth})]}),A.status?.map((E,M)=>(0,ge.jsx)(l,{color:p.dimmed,children:E},M))]},A.key)}),(()=>{let A=Bn({isRunning:u.isRunning,bifurcationInfo:u.bifurcationInfo,steps:u.steps,cmInitCounts:u.cmInitCounts,replayInfo:u.replayInfo});return A?(0,ge.jsx)(jn,{label:A.label,hasBifurcation:A.hasBifurcation}):null})(),u.steps.length>0&&(0,ge.jsx)(Dn,{steps:u.steps,bifurcated:!!u.bifurcationInfo&&!u.bifurcationInfo.isSingleFlow,flows:u.bifurcationInfo?.flows,cmInitCounts:u.cmInitCounts,staticSteps:!0}),u.askingUser&&(0,ge.jsxs)(b,{flexDirection:"column",marginTop:1,children:[(0,ge.jsxs)(l,{color:p.yellow,children:['Agent is asking: "',u.askingUser,'"']}),(0,ge.jsxs)(l,{children:["> ",y,"\u2588"]})]}),u.runError&&(0,ge.jsx)(zr,{message:u.runError,code:"RUNNER_ERROR"}),T&&u.lastRunEnd&&(0,ge.jsx)(ji,{steps:u.steps,bifurcationInfo:u.bifurcationInfo,perFlowMetadata:u.lastRunEnd.per_flow_metadata??[]}),T&&(0,ge.jsx)(Ht,{status:T.status==="passed"?"passed":"failed",summary:T.summary??"",duration:T.duration,steps:T.stepsTotal,stepsPassed:T.stepsPassed,stepsFailed:T.stepsFailed,reason:T.reason,creditsConsumed:T.creditsConsumed})]})}import{createInterface as Ns}from"readline";function zt(i){process.stdout.write(JSON.stringify(i)+`
|
|
28
|
+
${m}`})}},[j.runError,j.isRunning,ce,s]);let Sn=(0,S.useCallback)(async()=>{s.log("info","EXIT_UPLOAD_START","Starting exit upload pipeline"),Xt(qn()),xt({status:"uploading"});let g=x.getResolvedBasicAuth(),v=null;if(!g&&(v=await x.getToken(),!v))return s.log("warn","EXIT_UPLOAD_ABORTED","Exit upload aborted \u2014 no auth available"),null;let m=Ne??await kt();if(!m)return s.log("warn","EXIT_UPLOAD_ABORTED","Exit upload aborted \u2014 no TMS credentials"),s.setUploadStatus("failed","Could not get TMS credentials"),null;s.log("info","EXIT_UPLOAD_CONFIG","Exit upload configuration",{test_id:s.testId,commit_id:s.sessionId,project_id:I.project_id,session_dir:s.sessionDir,run_dirs:s.getRunDirs()});let w={basicAuth:g??null,token:v,resolver:x.getResolver(),resolvedCreds:m};st.current&&(s.log("info","SCREENSHOT_UPLOAD_DRAIN","Draining screenshot queue before pipeline"),await st.current.drain(),s.log("info","SCREENSHOT_UPLOAD_DRAINED","Screenshot queue drained"));let k=dn({session:s,env:ie,auth:w,variables:Et.current??{raw:{},auteur:{},auteurObjective:"",secretEntries:[],nonSecretEntries:[]},variableIds:D.current,projectId:I.project_id,folderId:I.folder_id,totalSteps:xo.current,totalDuration:bo.current,screenshotExtMap:st.current?.getExtMap(),codeExport:un({codeExport:e,codeLanguage:t,skipCodeValidation:n},I.code_export),onProgress:(F,W,J)=>{s.log("info","EXIT_PROGRESS","Upload progress",{step:F,status:W,detail:J}),Xt(de=>Nr(de,F,W,J))},log:(F,W,J,de)=>s.log(F,W,J,de),shouldUploadArtifacts:!0,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0}),$=await new Mr(k).execute();if($.success){s.log("info","EXIT_UPLOAD_OK","Exit upload succeeded",{test_id:$.testId,testcase_id:$.testcaseId??null,share_id:$.shareId??null}),s.setUploadStatus("uploaded"),$.testId&&s.setTestId($.testId),$.testcaseId&&s.setTestcaseId($.testcaseId);let F=ve(ie),W=I.project_id,J=$.testcaseId&&$.shareId&&W?It(F.testManagerUiUrl,W,$.testcaseId,$.shareId):void 0,de=$.testcaseId&&W?cn(F.testManagerUiUrl,W,$.testcaseId):void 0;xt({status:"success",testUrl:J,testCaseLink:de,codeExportDir:$.codeExportDir}),pi({shareableLink:J,testCaseLink:de,codeExportDir:$.codeExportDir})}else s.log("error","EXIT_UPLOAD_FAILED","Exit upload failed",{error:$.error}),s.setUploadStatus("failed",$.error),xt({status:"failed",error:$.error});return $},[x,ie,s,I,Ne,kt]),Tn=(0,S.useCallback)(async()=>{s.log("info","SESSION_RESET_START","Starting session reset via /new"),L(!0);let g=s.getFlows();g.length>0&&ne((0,_.jsx)(Xo,{flows:g}));let v=null;if(!i)try{v=await Sn()??null}catch(k){s.log("error","SESSION_RESET_UPLOAD_FAILED","Upload failed during /new",{error:String(k)}),ce({type:"error",text:"Upload failed \u2014 session data saved locally."})}let m=null;try{let{persistRecordedSession:k}=await import("./persist-recorded-session-LVQLORT4.js");m=k(s,{testcaseId:s.testcaseId??void 0,projectId:I.project_id??void 0,folderId:I.folder_id??void 0,codeExportDir:v?.codeExportDir})}catch(k){s.log("error","SESSION_RESET_PERSIST_FAILED","Persist failed during /new",{error:String(k)})}if(v?.success&&v.testcaseId||m){let k=ve(ie),B=I.project_id,$=v?.testcaseId;ne((0,_.jsx)(Oo,{recordedTestPath:m?.recordedTestPath,outputDir:m?.outputDir,shareableLink:$&&v?.shareId&&B?It(k.testManagerUiUrl,B,$,v.shareId):void 0,testCaseLink:$&&B?cn(k.testManagerUiUrl,B,$):void 0,codeExportDir:v?.codeExportDir,autoExit:!1}))}s.testId&&Ie(k=>[...k,{testId:s.testId,runCount:O}]),kn.killChrome(),await s.finish("complete");let w=new on;w.start({model:I.model,environment:ie,profile:$t??null}),f.current=w,u(k=>k+1),s.log("info","SESSION_RESET_COMPLETE","Session reset complete",{new_session_id:w.sessionId}),await ct({kind:"resessionize",env:ie},Xe),U(0),xo.current=0,bo.current=0,He.current=0,Ct.current="",Et.current=null,D.current={},An.current=0,Eo.current=0,yo.current=null,_o.current=null,wo.current=null,vo.current=null,ze(null),A(null),xt(null),Xt(qn()),L(!1),ne((0,_.jsxs)(b,{flexDirection:"column",marginY:1,children:[(0,_.jsx)(l,{color:p.dimmed,children:"\u2500".repeat(44)}),(0,_.jsx)(l,{color:p.green,bold:!0,children:"New session started"})]}))},[s,ce,ne,i,Sn,kn,O,I,ie,$t,Xe]),_r=(0,S.useCallback)(async()=>{if(!(s.nextRunIndex()>0)){ce({type:"info",text:"No runs in current session."});return}if(j.isRunning){ce({type:"error",text:"Cannot reset while a run is in progress. Cancel the run first."});return}if(I.mode==="testing"&&!s.sessionName){jt("new"),Dt(Do());return}await Tn()},[s,j,ce,I.mode,Tn]),Cr=(0,S.useCallback)(async()=>{await s.finish("complete"),q(0,"Session complete")},[s]),Zi=(0,S.useCallback)(async g=>{Ue(!1);let v=s.testId??(we.length>0?we[we.length-1].testId:null);if(g&&v){s.log("info","EXIT_FEEDBACK_SUBMIT","Submitting session feedback",{choice:g});try{let m=ve(ie),w=x.getResolvedBasicAuth();w&&await ao({tmsBaseUrl:m.tmsBaseUrl,username:w.username,accessKey:w.access_key,testId:v,feedbackType:g,log:(k,B,$,F)=>s.log(k,B,$,F)})}catch(m){s.log("error","EXIT_FEEDBACK_FAILED","Feedback submission failed",{error:String(m)})}}else s.log("info","EXIT_FEEDBACK_SKIPPED","Feedback skipped");Cr()},[ie,x,s,Cr,we]),Rn=(0,S.useCallback)(async()=>{let g=s.nextRunIndex()>0,v=null;if(g&&!i){s.log("info","EXIT_WITH_ACTIVE_SESSION","Exit with active session \u2014 uploading first"),Ae(!0);try{v=await Sn()??null}catch(w){s.log("error","EXIT_UPLOAD_FAILED","Exit upload failed",{error:String(w)})}s.testId&&Ie(w=>[...w,{testId:s.testId,runCount:O}])}try{let{persistRecordedSession:w}=await import("./persist-recorded-session-LVQLORT4.js"),k=w(s,{testcaseId:s.testcaseId??void 0,projectId:I.project_id??void 0,folderId:I.folder_id??void 0,codeExportDir:v?.codeExportDir});k&&_t(k)}catch(w){s.log("error","EXIT_PERSIST_FAILED","Persist failed during /exit",{error:String(w)})}if(g&&!i&&await s.finish("complete"),!(s.testId??(we.length>0?we[we.length-1].testId:null))||i){await s.finish("complete"),q(0,"No test ID \u2014 quick exit");return}Ae(!0),Ue(!0)},[s,i,Sn,O,we,I]),St=(0,S.useCallback)(async()=>{if(oe)return;s.log("info","EXIT_START","TUI exit initiated");let g=I.mode==="testing",v=s.nextRunIndex()>0;if(g&&v&&!s.sessionName){jt("exit"),Dt(Do());return}await Rn()},[oe,s,I.mode,Rn]),es=(0,S.useCallback)(g=>{g&&s.setSessionName(g);let v=Jt;Dt(null),jt(null),v==="new"?Tn():Rn()},[s,Jt,Rn,Tn]);(0,S.useEffect)(()=>{if(!oe)return;let g=300*1e3,v=setTimeout(async()=>{s.setUploadStatus("failed","Upload timed out after 5m"),await s.finish("complete"),q(0,"Upload timed out after 5m")},g);return()=>clearTimeout(v)},[oe,s]);let An=S.default.useRef(0),Co=S.default.useRef(null),Eo=S.default.useRef(0);qe((g,v)=>{if(v.ctrl&&g==="c"){if(oe){Eo.current+=1,Eo.current>=2&&(s.setUploadStatus("pending","Force exit by user"),s.finish("complete"),q(0,"Force exit by user"));return}if(j.isRunning){j.cancelRun(),ce({type:"info",text:"Run cancelled."}),An.current++,Co.current&&clearTimeout(Co.current),Co.current=setTimeout(()=>{An.current=0},2e3),An.current>=2&&St();return}St()}});let Er=S.default.useMemo(()=>{let g=x.creds.getActiveProfile()??"none",v=x.creds.getDefaultEnv();return[{id:"run",label:"Run",type:"submenu",children:[{id:"run-start",label:"Start Run",type:"action"},{id:"run-config",label:"Run Config",type:"submenu",children:[{id:"run-headless",label:"Headless",type:"select",currentValue:Y.headless?"on":"off",options:[{label:"off",value:"off"},{label:"on",value:"on"}],onValue:m=>{Zt(w=>({...w,headless:m==="on"}))}},{id:"run-max-steps",label:"Max Steps",type:"text-input",currentValue:String(Y.maxSteps),onValue:m=>{let w=parseInt(m,10);w>0&&Zt(k=>({...k,maxSteps:w}))}},{id:"run-timeout",label:"Timeout (sec)",type:"text-input",currentValue:Y.timeout?String(Y.timeout):"",placeholder:"0 = no timeout",onValue:m=>{let w=parseInt(m,10);Zt(k=>({...k,timeout:isNaN(w)?0:w}))}},{id:"run-cdp",label:"CDP Endpoint",type:"text-input",currentValue:Y.cdpEndpoint,placeholder:"http://127.0.0.1:9222",onValue:m=>{Zt(w=>({...w,cdpEndpoint:m}))}},{id:"run-ws",label:"WS Endpoint",type:"text-input",currentValue:Y.wsEndpoint,placeholder:"wss://...",onValue:m=>{Zt(w=>({...w,wsEndpoint:m}))}}]}]},{id:"auth",label:"Auth",type:"submenu",children:[{id:"login",label:"Login",type:"action",onLoginWizard:()=>{}},{id:"logout",label:"Logout",type:"action",onAction:()=>{x.logout().then(m=>{Ve();let w=x.creds.getActiveProfile(),k=x.creds.getDefaultEnv();tt(w,k);let B=wi(w,k);ct(B,Xe).catch(()=>{}),m?K("ok","/logout",`Logged out: ${m.profile} [${m.env}]`):K("ok","/logout","No active profile")}).catch(()=>{K("error","/logout","Logout failed")})}},{id:"whoami",label:"Who Am I",type:"action",onInfo:()=>{let m=x.creds.getActiveProfile()??"none",w=x.creds.getDefaultEnv(),k=x.creds.loadBasicAuth(m,w),B=k?"basic":x.creds.loadCredentials(m,w)?"oauth":"not configured";return{title:"Who Am I",sections:[{label:"Identity",entries:[{key:"Profile",value:m},{key:"Environment",value:w}]},{label:"Authentication",entries:[{key:"Method",value:B},...k?[{key:"Username",value:k.username}]:[]]},{label:"Token",entries:[{key:"Status",value:x.tokenValid?"valid":"not logged in",color:x.tokenValid?p.statusPass:p.statusFail}]}]}}},{id:"balance",label:"Credit Balance",type:"action",suppressFeedback:!0,onAction:()=>{(async()=>{let m=x.creds.getActiveProfile()??"default",w=x.creds.getDefaultEnv(),k=ve(w);try{let B=x.getBasicAuth(),$=B?null:await x.getToken();if(!B&&!$){te({text:"Not authenticated. Run /login first.",color:p.red});return}let{ControllerClient:F}=await import("./controller-client-RD2YEMAH.js"),J=await(B?new F(k.controllerBaseUrl,{username:B.username,accessKey:B.access_key}):new F(k.controllerBaseUrl,$)).getCreditBalance();te({text:`Credits \u2014 available: ${J.available_credits}, total: ${J.total_credits} (${m} / ${w})`,color:p.green})}catch(B){te({text:`Balance check failed: ${B instanceof Error?B.message:String(B)}`,color:p.red})}et.current&&clearTimeout(et.current),et.current=setTimeout(()=>{te(null),et.current=null},5e3)})()}},{id:"profiles",label:"Profiles",type:"action",onProfilesView:()=>{}}]},{id:"config",label:"Config",type:"submenu",children:[{id:"config-show",label:"Show",type:"action",onInfo:()=>({title:"Show Config",sections:[{label:"General",entries:[{key:"Model",value:"v16-alpha"},{key:"Mode",value:I.mode}]},{label:"Browser",entries:[{key:"Window",value:`${I.window_size.width}x${I.window_size.height}`},{key:"Chrome Profile",value:I.chrome_profile_path?I.chrome_profile_path.split("/").pop()??I.chrome_profile_path:"(temporary)"}]},{label:"Project",entries:[{key:"Project",value:I.project_name?`${I.project_name} (${I.project_id})`:I.project_id??"(none)"},{key:"Folder",value:I.folder_name?`${I.folder_name} (${I.folder_id})`:I.folder_id??"(none)"},{key:"Default URL",value:lt}]},{label:"Code Export",entries:[{key:"Enabled",value:I.code_export.enabled?"yes":"no"},{key:"Language",value:I.code_export.language},{key:"Skip Validation",value:I.code_export.skip_validation?"yes":"no"}]}]})},{id:"config-chrome",label:"Chrome Profile",type:"action",onChromeProfilePicker:()=>{}},{id:"config-project",label:"Project",type:"action",onProjectPicker:()=>{}},{id:"config-folder",label:"Folder",type:"action",...I.project_id?{onFolderPicker:()=>{}}:{onInfo:()=>({title:"Folder",sections:[{entries:[{key:"Status",value:"Select a project first",color:p.dim}]}]})}},{id:"config-window",label:"Window Size",type:"action",currentValue:`${I.window_size.width}x${I.window_size.height}`,onWindowSizePicker:()=>{}},{id:"config-mode",label:"Mode",type:"select",currentValue:I.mode,options:[{label:"testing",value:"testing"},{label:"action",value:"action"}],onValue:m=>{(m==="action"||m==="testing")&&(c.set("mode",m),De(c.load()),K("ok","/config set-mode",m))}},{id:"config-code-export",label:"Code Export",type:"submenu",currentValue:I.code_export.enabled?"enabled":"disabled",children:[{id:"config-code-export-enabled",label:"Enabled",type:"select",currentValue:I.code_export.enabled?"on":"off",options:[{label:"off",value:"off"},{label:"on",value:"on"}],onValue:m=>{c.set("code_export",{...I.code_export,enabled:m==="on"}),De(c.load()),K("ok","/config code-export enabled",m)}},{id:"config-code-export-language",label:"Language",type:"select",currentValue:I.code_export.language,options:[{label:"python",value:"python"},{label:"javascript",value:"javascript"}],onValue:m=>{m!=="python"&&m!=="javascript"||(c.set("code_export",{...I.code_export,language:m}),De(c.load()),K("ok","/config code-export language",m))}},{id:"config-code-export-skip-validation",label:"Skip Validation",type:"select",currentValue:I.code_export.skip_validation?"on":"off",options:[{label:"off",value:"off"},{label:"on",value:"on"}],onValue:m=>{c.set("code_export",{...I.code_export,skip_validation:m==="on"}),De(c.load()),K("ok","/config code-export skip-validation",m)}}]}]},{id:"exit",label:"Exit",type:"action",onAction:()=>{St()}}]},[x,c,I,ce,St,Y,Ve,K]),ts=(0,S.useCallback)(g=>{if(j.askingUser){let m=j.askingUser;ne((0,_.jsxs)(b,{flexDirection:"column",marginLeft:2,paddingLeft:1,marginTop:1,children:[(0,_.jsx)(b,{marginLeft:1,children:(0,_.jsx)(l,{color:p.primary,bold:!0,children:"Agent Question"})}),(0,_.jsxs)(b,{borderStyle:"round",borderColor:p.primary,flexDirection:"column",paddingX:2,paddingY:1,width:70,children:[(0,_.jsxs)(b,{children:[(0,_.jsx)(b,{width:3,children:(0,_.jsx)(l,{color:p.primary,bold:!0,children:"?"})}),(0,_.jsx)(b,{flexShrink:1,children:(0,_.jsx)(l,{wrap:"wrap",children:m})})]}),(0,_.jsxs)(b,{marginTop:1,children:[(0,_.jsx)(b,{width:3,children:(0,_.jsx)(l,{color:p.dim,bold:!0,children:"\u2192"})}),(0,_.jsx)(b,{flexShrink:1,children:(0,_.jsx)(l,{color:p.accent,wrap:"wrap",children:g})})]})]})]})),yo.current=null,j.sendAnswer(g);return}if(s.logCommand(g),j.isRunning){ce({type:"error",text:"Run in progress. Ctrl+C to cancel."});return}let v=ci(g);if(v)switch(v.command){case"login":case"logout":case"whoami":case"profiles":case"balance":case"auth":Bt("auth");return;case"config":Bt("config");return;case"help":vr(!0);return;case"update":{(async()=>{let{getUpdateCommand:m}=await import("./version-check-WWOS4OEZ.js");K("ok","/update",`To update kane-cli, run: ${m()}`)})();return}case"summary":{let m=s.getFlows();if(m.length===0){K("ok","/summary","No runs yet in this session.");return}let w=v.args.index?parseInt(v.args.index,10):void 0;if(w!==void 0&&!s.getFlow(w)){K("error","/summary",`No flow at index ${w}`,`${m.length} flow${m.length===1?"":"s"} available. Use /summary to see all.`);return}ne((0,_.jsx)(Xo,{flows:m,filterIndex:w})),K("ok","/summary",w!==void 0?`Flow ${w}`:`${m.length} flow${m.length===1?"":"s"}`);return}case"new":_r(),K("ok","/new","Session reset");return;case"name":{let m=v.raw.replace(/^\/name\s*/,"").trim();if(!m){K("error","/name","Usage: /name <new-name>");return}(async()=>{let{validateNameOrThrow:w}=await import("./name-validator-5YGJXLZ7.js");try{w(m),s.setSessionName(m),K("ok","/name",`Session name set: ${m}`)}catch(k){K("error","/name",k.message)}})();return}case"cancel":j.cancelRun(),K("ok","/cancel","Run cancelled");return;case"clear":K("ok","/clear","Chat cleared");return;case"exit":St();return;default:K("error",`/${v.command}`,"Unknown command");return}if(g.trim().toLowerCase()==="exit"){St();return}ne((0,_.jsxs)(b,{children:[(0,_.jsx)(l,{color:"#b388ff",children:"\u276F "}),(0,_.jsx)(l,{children:g})]})),yr(g,lt)},[j,ce,K,ne,s,yr,St,_r]),kr=x.getAuthInfo(),ns=kr?kr.method==="basic"?"basic auth":"oauth":"not logged in",os=(()=>{if(En)return["help"];if(R)return R.phase==="wizard"?["auth","login"]:R.phase==="project"?["auth","login","project"]:R.phase==="folder"?["auth","login","folder"]:["auth","login"];let g={infoView:"info",loginWizard:"login",profilesView:"profiles",chromeProfilePicker:"chrome-profile",projectPicker:"project",folderPicker:"folder",windowSizePicker:"set-window"};return Ge==="auth"?Cn?["auth",g[Cn]]:["auth"]:Ge==="config"?Cn?["config",g[Cn]]:["config"]:Ge==="help"?["help"]:j.askingUser?["agent question"]:[]})();return(0,_.jsxs)(b,{flexDirection:"column",children:[se.length>0&&(0,_.jsx)(Pn,{items:se,children:g=>(0,_.jsx)(b,{paddingX:1,children:g.content},g.id)}),!h&&!ke&&(0,_.jsx)(oi,{onComplete:()=>{let g=x.creds.getActiveProfile(),v=x.creds.getDefaultEnv(),m=g?x.creds.loadCredentials(g,v):null,w=g?x.creds.loadBasicAuth(g,v):null,k=!!(m||w),B=w?.username??g??null;ne((0,_.jsx)(Zn,{size:"full",helmetVisibleRows:8,textVisibleRows:7,showMeta:!0,version:at,authenticated:k,user:B})),Oe(!0);let $=(F,W,J,de)=>{s.log(F,W,J,de)};if(Fr(x.creds,$).then(F=>{if(F.status==="authenticated"){let{profile:W,env:J,tmsCreds:de}=F.result;x.creds.setActiveProfile(W),x.creds.setDefaultEnv(J),Ve(),bt(de),re("ready"),T(!0)}else F.status==="needs_pick"?(le(F.profiles),re("pick")):re("login")}).catch(F=>{s.log("error","STARTUP_GATE_ERROR","Auth gate failed",{error:String(F)}),re("login")}),o&&o.then(async F=>{if(F){let{getUpdateCommand:W}=await import("./version-check-WWOS4OEZ.js");K("ok","update available",`${F.current} \u2192 ${F.latest}`,`Run: ${W()}`)}}).catch(()=>{}),r&&r.changes.length>0){let F=`kane-cli updated to ${r.toVersion}. Default settings changed:`,W=[...r.changes.map(J=>`\u2022 ${J.description} (${J.field}: ${JSON.stringify(J.from)} \u2192 ${JSON.stringify(J.to)})`),"","Use /config to review or revert any of these."].join(`
|
|
29
|
+
`);K("ok","defaults updated",F,W)}}}),!h&&ae==="booting"&&ke&&(0,_.jsx)(b,{paddingX:1,children:(0,_.jsx)(l,{color:"yellow",children:"Checking authentication..."})}),!h&&ae==="pick"&&(0,_.jsx)(ks,{profiles:ee,onCancel:()=>re("login"),onSelect:async(g,v)=>{x.creds.setActiveProfile(g),x.creds.setDefaultEnv(v),Ve(),We(!0);let m=(w,k,B,$)=>{s.log(w,k,B,$)};try{let w=await Lr(x.creds,g,v,m);We(!1),w.status==="authenticated"?(tt(g,v),bt(w.result.tmsCreds),re("ready"),T(!0)):re("login")}catch{We(!1),re("login")}},validating:Pe}),!h&&ae==="login"&&!R&&(0,_.jsx)($n,{devMode:process.env.KANE_DEV_MODE==="1",profiles:x.creds.listProfiles(),onBasicLogin:async(g,v,m,w)=>{let{validateBasicAuth:k}=await import("./validate-basic-JJOEAFLT.js");await k(v,m,w),x.creds.saveBasicAuth(g,v,{username:m,access_key:w}),x.creds.setActiveProfile(g),x.creds.setDefaultEnv(v),Te(x.creds,c,g,v),x.setTokenValid(!0),Ve()},onOAuthLogin:async(g,v)=>{x.creds.setDefaultEnv(v),await x.login(g),Te(x.creds,c,g,v),Ve()},onComplete:(g,v)=>{ct(so(v),Xe).then(()=>{Ve(),me({phase:"project",profile:g,env:v})}).catch(()=>{me({phase:"project",profile:g,env:v})})},onCancel:()=>{q(0,"Login cancelled at startup")}}),!h&&ae==="login"&&R?.phase==="project"&&(0,_.jsx)(Nt,{resolver:x.getResolver(),currentProjectId:null,env:R.env,onSelect:(g,v)=>{x.creds.saveProfileConfig(R.profile,R.env,{project_id:g,project_name:v}),K("ok","/config project",v,`id: ${g}`),me({...R,phase:"folder"})},onCancel:async()=>{let g=await go(R.profile,R.env);g&&(pe(x.creds,c,R.profile,R.env,{projectId:g.id,projectName:g.name}),K("ok","/config project",g.name,`id: ${g.id}`),me({...R,phase:"folder"}))}}),!h&&ae==="login"&&R?.phase==="folder"&&(0,_.jsx)(Ut,{resolver:x.getResolver(),projectId:x.creds.loadProfileConfig(R.profile,R.env)?.project_id??"",currentFolderId:null,env:R.env,onSelect:(g,v)=>{x.creds.saveProfileConfig(R.profile,R.env,{folder_id:g,folder_name:v}),K("ok","/config folder",v,`id: ${g}`),tt(R.profile,R.env),me(null),re("ready"),T(!0)},onCancel:async()=>{let g=x.creds.loadProfileConfig(R.profile,R.env);if(!g?.project_id)return;let v=await ho(R.env,g.project_id);v&&(pe(x.creds,c,R.profile,R.env,{folderId:v.id,folderName:v.name}),K("ok","/config folder",v.name,`id: ${v.id}`),tt(R.profile,R.env),me(null),re("ready"),T(!0))}}),h&&Se==="menu"&&!oe&&(0,_.jsx)(b,{marginBottom:1,children:(0,_.jsxs)(b,{borderStyle:"round",borderColor:"#dc4e08",paddingX:2,children:[(0,_.jsx)(l,{color:"#ff9500",bold:!0,children:"KaneAI CLI"}),(0,_.jsx)(l,{color:p.dimmed,children:" \u2502 "}),(0,_.jsx)(l,{color:"#ff9500",children:I.model}),(0,_.jsx)(l,{color:p.dimmed,children:" \u2502 "}),(0,_.jsx)(l,{color:p.dimmed,children:ns}),(0,_.jsx)(l,{color:p.dimmed,children:" \u2502 "}),(0,_.jsxs)(l,{color:p.dimmed,children:[$t??"no profile","/",ie]})]})}),h&&!oe&&(0,_.jsxs)(b,{flexDirection:"column",flexGrow:1,children:[Se==="menu"&&(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(Ho,{items:Er,onRunSelected:()=>Qt("chat"),onActiveViewChange:hr,renderLoginWizard:g=>{let v=R?.phase??"wizard";if(v==="project")return(0,_.jsx)(Nt,{resolver:x.getResolver(),currentProjectId:null,env:R.env,onSelect:(m,w)=>{x.creds.saveProfileConfig(R.profile,R.env,{project_id:m,project_name:w}),K("ok","/config project",w,`id: ${m}`),me(k=>k?{...k,phase:"folder"}:null)},onCancel:async()=>{if(!R)return;let m=await go(R.profile,R.env);m&&(pe(x.creds,c,R.profile,R.env,{projectId:m.id,projectName:m.name}),K("ok","/config project",m.name,`id: ${m.id}`),me(w=>w?{...w,phase:"folder"}:null))}});if(v==="folder"){let m=x.creds.loadProfileConfig(R.profile,R.env);return(0,_.jsx)(Ut,{resolver:x.getResolver(),projectId:m?.project_id??"",currentFolderId:null,env:R.env,onSelect:(w,k)=>{x.creds.saveProfileConfig(R.profile,R.env,{folder_id:w,folder_name:k}),K("ok","/config folder",k,`id: ${w}`),tt(R.profile,R.env),me(null),g()},onCancel:async()=>{if(!R)return;let w=x.creds.loadProfileConfig(R.profile,R.env);if(!w?.project_id)return;let k=await ho(R.env,w.project_id);k&&(pe(x.creds,c,R.profile,R.env,{folderId:k.id,folderName:k.name}),K("ok","/config folder",k.name,`id: ${k.id}`),tt(R.profile,R.env),me(null),g())}})}return(0,_.jsx)($n,{devMode:process.env.KANE_DEV_MODE==="1",profiles:x.creds.listProfiles(),onBasicLogin:async(m,w,k,B)=>{let{validateBasicAuth:$}=await import("./validate-basic-JJOEAFLT.js");await $(w,k,B),x.creds.saveBasicAuth(m,w,{username:k,access_key:B}),x.creds.setActiveProfile(m),x.creds.setDefaultEnv(w),Te(x.creds,c,m,w),x.setTokenValid(!0),Ve()},onOAuthLogin:async(m,w)=>{x.creds.setDefaultEnv(w),await x.login(m),Te(x.creds,c,m,w),Ve()},onComplete:(m,w)=>{ct(so(w),Xe).then(()=>{me({phase:"project",profile:m,env:w})}).catch(()=>{me({phase:"project",profile:m,env:w})})},onCancel:()=>{me(null),g()}})},renderProfilesView:g=>(0,_.jsx)(Ro,{creds:x.creds,onSwitch:(v,m)=>{let w=x.creds.getActiveProfile()??"(none)";x.creds.setActiveProfile(v),x.creds.setDefaultEnv(m),Te(x.creds,c,v,m),tt(v,m),Ve(),ct(Jo(m),Xe).catch(()=>{}),K("ok","/profiles switch",`${w} \u2192 ${v} [${m}]`)},onCancel:g}),renderChromeProfilePicker:g=>(0,_.jsx)(Ao,{currentPath:I.chrome_profile_path,onSelect:v=>{c.set("chrome_profile_path",v),De(c.load()),K("ok","/config chrome-profile",v),g()},onCancel:g}),renderProjectPicker:g=>(0,_.jsx)(Nt,{resolver:x.getResolver(),currentProjectId:I.project_id,env:ie,onSelect:(v,m)=>{pe(x.creds,c,x.creds.getActiveProfile()??"default",x.creds.getDefaultEnv(),{projectId:v,projectName:m}),K("ok","/config project",m,`id: ${v}`),De(c.load()),g()},onCancel:g}),renderFolderPicker:g=>(0,_.jsx)(Ut,{resolver:x.getResolver(),projectId:I.project_id??"",currentFolderId:I.folder_id,env:ie,onSelect:(v,m)=>{pe(x.creds,c,x.creds.getActiveProfile()??"default",x.creds.getDefaultEnv(),{folderId:v,folderName:m}),K("ok","/config folder",m,`id: ${v}`),De(c.load()),g()},onCancel:g}),renderWindowSizePicker:g=>(0,_.jsx)(Go,{currentWidth:I.window_size.width,currentHeight:I.window_size.height,onSelect:(v,m)=>{c.set("window_size",{width:v,height:m}),De(c.load()),K("ok","/config set-window",`${v} \xD7 ${m}`),g()},onCancel:g})}),Me&&(0,_.jsx)(b,{paddingX:1,marginTop:1,children:(0,_.jsx)(l,{color:Me.color,children:Me.text})})]}),Se==="chat"&&(0,_.jsxs)(_.Fragment,{children:[(()=>{let g=Bn({isRunning:j.isRunning,bifurcationInfo:j.bifurcationInfo,steps:j.steps,cmInitCounts:j.cmInitCounts,replayInfo:j.replayInfo});return g?(0,_.jsx)(jn,{label:g.label,hasBifurcation:g.hasBifurcation}):null})(),j.isRunning&&j.steps.length>0&&(0,_.jsx)(Dn,{steps:j.steps,bifurcated:!!j.bifurcationInfo&&!j.bifurcationInfo.isSingleFlow,flows:j.bifurcationInfo?.flows,cmInitCounts:j.cmInitCounts,onStepCommit:ne},`run-${He.current}`),En&&(0,_.jsx)(mi,{onClose:()=>vr(!1),version:at,environment:x.creds.getDefaultEnv(),sessionId:s.sessionId,runUrl:I.default_url??lt}),Ge&&!j.isRunning&&(()=>{let g=Er.find(v=>v.id===Ge);return g?.children?(0,_.jsx)(Ho,{items:g.children,onRunSelected:()=>Bt(null),onDismiss:()=>Bt(null),onActiveViewChange:hr,renderLoginWizard:v=>{let m=R?.phase??"wizard";if(m==="project")return(0,_.jsx)(Nt,{resolver:x.getResolver(),currentProjectId:null,env:R.env,onSelect:(w,k)=>{x.creds.saveProfileConfig(R.profile,R.env,{project_id:w,project_name:k}),K("ok","/config project",k,`id: ${w}`),me(B=>B?{...B,phase:"folder"}:null)},onCancel:async()=>{if(!R)return;let w=await go(R.profile,R.env);w&&(pe(x.creds,c,R.profile,R.env,{projectId:w.id,projectName:w.name}),K("ok","/config project",w.name,`id: ${w.id}`),me(k=>k?{...k,phase:"folder"}:null))}});if(m==="folder"){let w=x.creds.loadProfileConfig(R.profile,R.env);return(0,_.jsx)(Ut,{resolver:x.getResolver(),projectId:w?.project_id??"",currentFolderId:null,env:R.env,onSelect:(k,B)=>{x.creds.saveProfileConfig(R.profile,R.env,{folder_id:k,folder_name:B}),K("ok","/config folder",B,`id: ${k}`),tt(R.profile,R.env),me(null),v()},onCancel:async()=>{if(!R)return;let k=x.creds.loadProfileConfig(R.profile,R.env);if(!k?.project_id)return;let B=await ho(R.env,k.project_id);B&&(pe(x.creds,c,R.profile,R.env,{folderId:B.id,folderName:B.name}),K("ok","/config folder",B.name,`id: ${B.id}`),tt(R.profile,R.env),me(null),v())}})}return(0,_.jsx)($n,{devMode:process.env.KANE_DEV_MODE==="1",profiles:x.creds.listProfiles(),onBasicLogin:async(w,k,B,$)=>{let{validateBasicAuth:F}=await import("./validate-basic-JJOEAFLT.js");await F(k,B,$),x.creds.saveBasicAuth(w,k,{username:B,access_key:$}),x.creds.setActiveProfile(w),x.creds.setDefaultEnv(k),Te(x.creds,c,w,k),x.setTokenValid(!0),Ve()},onOAuthLogin:async(w,k)=>{x.creds.setDefaultEnv(k),await x.login(w),Te(x.creds,c,w,k),Ve()},onComplete:(w,k)=>{ct(so(k),Xe).then(()=>{me({phase:"project",profile:w,env:k})}).catch(()=>{me({phase:"project",profile:w,env:k})})},onCancel:()=>{me(null),v()}})},renderProfilesView:v=>(0,_.jsx)(Ro,{creds:x.creds,onSwitch:(m,w)=>{let k=x.creds.getActiveProfile()??"(none)";x.creds.setActiveProfile(m),x.creds.setDefaultEnv(w),Te(x.creds,c,m,w),tt(m,w),Ve(),ct(Jo(w),Xe).catch(()=>{}),K("ok","/profiles switch",`${k} \u2192 ${m} [${w}]`),v()},onCancel:v}),renderChromeProfilePicker:v=>(0,_.jsx)(Ao,{currentPath:I.chrome_profile_path,onSelect:m=>{c.save({chrome_profile_path:m}),De(c.load()),K("ok","/config chrome-profile",m),v()},onCancel:v}),renderProjectPicker:v=>(0,_.jsx)(Nt,{resolver:x.getResolver(),currentProjectId:I.project_id,env:ie,onSelect:(m,w)=>{pe(x.creds,c,x.creds.getActiveProfile()??"default",x.creds.getDefaultEnv(),{projectId:m,projectName:w}),De(c.load()),K("ok","/config project",w,`id: ${m}`),v()},onCancel:v}),renderFolderPicker:v=>(0,_.jsx)(Ut,{resolver:x.getResolver(),projectId:I.project_id??"",currentFolderId:I.folder_id,env:ie,onSelect:(m,w)=>{pe(x.creds,c,x.creds.getActiveProfile()??"default",x.creds.getDefaultEnv(),{folderId:m,folderName:w}),De(c.load()),K("ok","/config folder",w,`id: ${m}`),v()},onCancel:v}),renderWindowSizePicker:v=>(0,_.jsx)(Go,{currentWidth:I.window_size.width,currentHeight:I.window_size.height,onSelect:(m,w)=>{c.set("window_size",{width:m,height:w}),De(c.load()),K("ok","/config set-window",`${m} \xD7 ${w}`),v()},onCancel:v})},Ge):null})(),Ge&&Me&&(0,_.jsx)(b,{paddingX:1,marginTop:1,children:(0,_.jsx)(l,{color:Me.color,children:Me.text})}),!Ge&&!En&&!yt&&j.askingUser&&(0,_.jsxs)(b,{flexDirection:"column",marginLeft:2,paddingLeft:1,marginTop:1,children:[(0,_.jsx)(b,{marginLeft:1,children:(0,_.jsx)(l,{color:p.primary,bold:!0,children:"Agent Question"})}),(0,_.jsx)(b,{borderStyle:"round",borderColor:p.primary,flexDirection:"column",paddingX:2,paddingY:1,width:70,children:(0,_.jsxs)(b,{children:[(0,_.jsx)(b,{width:3,children:(0,_.jsx)(l,{color:p.primary,bold:!0,children:"?"})}),(0,_.jsx)(b,{flexShrink:1,children:(0,_.jsx)(l,{wrap:"wrap",children:j.askingUser})})]})})]}),!Ge&&!En&&!yt&&(0,_.jsx)(Ir,{onSubmit:ts,onEscape:void 0,history:zi,commands:no,placeholder:j.askingUser?"Type your answer...":j.isRunning?"Run in progress... Ctrl+C to cancel":"Type an objective... (/ = commands)"})]})]}),h&&oe&&Z&&(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(Po,{steps:xn,status:Z.status,testUrl:Z.testUrl,error:Z.error}),Z.status==="success"&&(0,_.jsx)(Oo,{recordedTestPath:he?.recordedTestPath,outputDir:he?.outputDir,shareableLink:Z.testUrl,testCaseLink:Z.testCaseLink,codeExportDir:Z.codeExportDir,autoExit:!1})]}),yt&&(0,_.jsx)(Hr,{defaultName:yt,onSubmit:es}),yn&&(0,_.jsx)(Ur,{onSubmit:Zi}),bn&&Z&&(0,_.jsx)(Po,{steps:xn,status:Z.status,error:Z.error}),h&&!oe&&(0,_.jsx)(ei,{profile:$t,environment:ie,model:I.model,tokenValid:x.tokenValid,sessionId:s.sessionId,runCount:O,viewMode:Se,breadcrumb:os})]})}function ks({profiles:i,onSelect:e,onCancel:t,validating:n}){let[o,r]=(0,S.useState)(0);return qe((a,f)=>{if(!n){if(f.escape){t();return}if(f.upArrow&&o>0&&r(d=>d-1),f.downArrow&&o<i.length-1&&r(d=>d+1),f.return){let d=i[o];e(d.profile,d.env)}}}),(0,_.jsxs)(b,{flexDirection:"column",paddingX:1,children:[(0,_.jsx)(l,{color:"#ff9500",bold:!0,children:"Select a profile:"}),(0,_.jsx)(b,{marginTop:1,flexDirection:"column",children:i.map((a,f)=>(0,_.jsxs)(l,{children:[f===o?"\u276F ":" ",(0,_.jsx)(l,{color:f===o?"#ff9500":"white",bold:f===o,children:a.profile}),(0,_.jsxs)(l,{color:"gray",children:[" [",a.env,"]"]})]},`${a.profile}-${a.env}`))}),n&&(0,_.jsx)(b,{marginTop:1,children:(0,_.jsx)(l,{color:"yellow",children:"Validating credentials..."})}),!n&&(0,_.jsx)(b,{marginTop:1,children:(0,_.jsx)(l,{color:"gray",children:"Esc = new login"})})]})}var Oi=N(Pi(),1),{program:Wc,createCommand:qc,createArgument:Kc,createOption:zc,CommanderError:Gc,InvalidArgumentError:Xc,InvalidOptionArgumentError:Jc,Command:Di,Argument:Yc,Option:it,Help:Qc}=Oi.default;import{join as mt}from"path";var Li=N(Ze(),1);var Fe=N(Ze(),1);var vt=N(X(),1);function ji({steps:i,bifurcationInfo:e,perFlowMetadata:t}){return!e||e.isSingleFlow||!t||t.length<=1?null:(0,vt.jsx)(b,{flexDirection:"column",children:t.map((n,o)=>{let r=i[o],a=r?.children??[],f=a.filter(P=>P.status==="passed").length,d=a.filter(P=>P.status==="failed").length,u=f+d,s=a.reduce((P,h)=>P+(h.duration??0),0),c=r?.status==="failed"?"failed":"passed",y=e.flows[o]??r?.objective??`Flow ${o+1}`;return(0,vt.jsxs)(b,{flexDirection:"column",marginTop:o>0?1:0,children:[(0,vt.jsxs)(b,{marginLeft:1,children:[(0,vt.jsx)(l,{color:"#b388ff",bold:!0,children:"Flow "+(o+1)+": "}),(0,vt.jsx)(l,{color:"#b388ff",children:y})]}),(0,vt.jsx)(Ht,{status:c,summary:n?.summary??"",duration:s,steps:u,stepsPassed:f,stepsFailed:d,reason:n?.error_message??void 0,creditsConsumed:n?.credits_consumed??void 0})]},`flow-summary-${o}`)})})}var ge=N(X(),1);function Bi({config:i,spawnOpts:e,cancelRef:t,banner:n,onComplete:o,onStepEnd:r,onReasoning:a,onStepComplete:f}){let{exit:d}=On(),u=Hn(r,void 0,a,f),s=(0,Fe.useRef)(!1),c=(0,Fe.useRef)(!1),[y,P]=(0,Fe.useState)("");(0,Fe.useEffect)(()=>{s.current||(s.current=!0,u.startRun(i,e))},[i,e,u]),(0,Fe.useEffect)(()=>{t&&(t.current=()=>u.cancelRun())},[t,u]);let h=(0,Fe.useRef)(0);qe((A,E)=>{E.ctrl&&A==="c"&&(u.isRunning?(h.current++,h.current>=2?d():u.cancelRun()):d())}),qe((A,E)=>{u.askingUser&&(E.return?(u.sendAnswer(y),P("")):E.backspace||E.delete?P(M=>M.slice(0,-1)):A&&!E.ctrl&&!E.meta&&P(M=>M+A))},{isActive:!!u.askingUser}),(0,Fe.useEffect)(()=>{if(!u.isRunning&&u.lastRunEnd&&!c.current){c.current=!0;let{passed:A,failed:E,total:M}=ln(u.steps),O=u.bifurcationInfo;o({lastRunEnd:u.lastRunEnd,stepsPassed:A,stepsFailed:E,stepsTotal:M,hadError:!1,bifurcationFlows:O&&!O.isSingleFlow?O.flows:null}),d()}},[u.isRunning,u.lastRunEnd,u.steps,o,d]),(0,Fe.useEffect)(()=>{u.runError&&!u.isRunning&&!c.current&&(c.current=!0,o({lastRunEnd:null,stepsPassed:0,stepsFailed:0,stepsTotal:0,hadError:!0,bifurcationFlows:null}),d())},[u.runError,u.isRunning,o,d]);let T=u.lastRunEnd?(()=>{let{passed:A,failed:E,total:M}=ln(u.steps);return{status:u.lastRunEnd.status,duration:u.lastRunEnd.duration??0,summary:u.lastRunEnd.summary??"",stepsPassed:A,stepsFailed:E,stepsTotal:M,reason:u.lastRunEnd.reason,finalState:u.lastRunEnd.final_state,creditsConsumed:u.lastRunEnd.credits_consumed}})():null,V=(0,Fe.useMemo)(()=>n?[{key:"banner",...n}]:[],[n]);return(0,ge.jsxs)(b,{flexDirection:"column",children:[(0,ge.jsx)(Pn,{items:V,children:A=>(0,ge.jsxs)(b,{flexDirection:"column",marginBottom:1,children:[(0,ge.jsxs)(b,{borderStyle:"round",borderColor:"#dc4e08",paddingX:2,children:[(0,ge.jsx)(l,{color:"#ff9500",bold:!0,children:"KaneAI CLI"}),(0,ge.jsx)(l,{color:p.dimmed,children:" \u2502 "}),(0,ge.jsx)(l,{color:p.cyan,children:A.model}),(0,ge.jsx)(l,{color:p.dimmed,children:" \u2502 "}),(0,ge.jsx)(l,{color:p.dimmed,children:A.auth})]}),A.status?.map((E,M)=>(0,ge.jsx)(l,{color:p.dimmed,children:E},M))]},A.key)}),(()=>{let A=Bn({isRunning:u.isRunning,bifurcationInfo:u.bifurcationInfo,steps:u.steps,cmInitCounts:u.cmInitCounts,replayInfo:u.replayInfo});return A?(0,ge.jsx)(jn,{label:A.label,hasBifurcation:A.hasBifurcation}):null})(),u.steps.length>0&&(0,ge.jsx)(Dn,{steps:u.steps,bifurcated:!!u.bifurcationInfo&&!u.bifurcationInfo.isSingleFlow,flows:u.bifurcationInfo?.flows,cmInitCounts:u.cmInitCounts,staticSteps:!0}),u.askingUser&&(0,ge.jsxs)(b,{flexDirection:"column",marginTop:1,children:[(0,ge.jsxs)(l,{color:p.yellow,children:['Agent is asking: "',u.askingUser,'"']}),(0,ge.jsxs)(l,{children:["> ",y,"\u2588"]})]}),u.runError&&(0,ge.jsx)(zr,{message:u.runError,code:"RUNNER_ERROR"}),T&&u.lastRunEnd&&(0,ge.jsx)(ji,{steps:u.steps,bifurcationInfo:u.bifurcationInfo,perFlowMetadata:u.lastRunEnd.per_flow_metadata??[]}),T&&(0,ge.jsx)(Ht,{status:T.status==="passed"?"passed":"failed",summary:T.summary??"",duration:T.duration,steps:T.stepsTotal,stepsPassed:T.stepsPassed,stepsFailed:T.stepsFailed,reason:T.reason,creditsConsumed:T.creditsConsumed})]})}import{createInterface as Ns}from"readline";function zt(i){process.stdout.write(JSON.stringify(i)+`
|
|
30
30
|
`)}async function $i(i,e,t){let n=Vr(i,e);Yn().then(c=>{c&&zt({type:"update_available",current:c.current,latest:c.latest,severity:c.severity})}).catch(()=>{});let o=Ns({input:process.stdin});o.on("line",c=>{try{let y=JSON.parse(c);y.type==="user_response"?n.sendUserResponse(y.answer??""):y.type==="cancel"&&n.sendCancel(y.reason??"")}catch{}});let r=null,a=!1,f=0,d=null,u=0,s=!1;for await(let c of n.events)switch(c.type){case"run_start":s&&u++;break;case"step_start":{let y=c;t?.onStepLog?.("STEP_START",`Step ${y.index} started`,{index:y.index,objective:y.objective,child_id:y.child_id});let P={step:y.index+1,status:"running",remark:y.objective??`Step ${y.index+1}`};y.child_id&&(P.child_id=y.child_id),zt(P);break}case"step_event":c.event==="reasoning"&&c.detail&&c.detail!=="reasoning"&&t?.onReasoning?.(c.detail),t?.onStepLog?.("STEP_EVENT",`Step ${c.index} ${c.event}`,{index:c.index,phase:c.event,action_type:c.action_type,detail:c.detail,child_id:c.child_id});break;case"step_end":{let y=c;t?.onStepLog?.("STEP_END",`Step ${y.index} ${y.status}`,{index:y.index,status:y.status,duration:y.duration,summary:y.summary,child_id:y.child_id}),t?.onStepComplete?.(),f++;let P={step:y.index+1,status:y.status==="passed"?"done":"failed",remark:y.summary??""};y.child_id&&(P.child_id=y.child_id),zt(P);let h=s?Math.max(0,u-1):0;t?.onStepEnd?.(y.index,h);break}case"bifurcation":{let y=c,P=y.flows??[],h=y.count??P.length;(y.is_single_flow??h<=1)||(d=P,s=!0,u=0),zt({type:"bifurcation",flows:P,count:h});break}case"ask_user":{let y=c;zt({type:"ask_user",question:y.question,step_index:y.step_index,...y.options?{options:y.options}:{}});break}case"run_end":{r=c;break}case"error":{a=!0,zt({type:"error",message:c.message});break}default:break}return o.close(),await n.exited,{lastRunEnd:r,stepsTotal:f,hadError:a,bifurcationFlows:d}}import{join as Us}from"path";function Vi(i){let e=i.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)
|
|
31
|
-
`),process.exit(2));let{runListTui:t,resolveCurrentOrgId:n}=await import("./testmd-actions-5JCGAZLL.js"),o=await n({});o.ok||process.exit(o.code),process.exit(await t(o.orgId))});Ws(e),qs(e),Ks(e),zs(e),Gs(e)}function Hs(i,e){return e.concat(i)}function Ws(i){i.command("run <path>").description("Run a test from a *_test.md file").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: ${Us(xe,"global-memory.md")})`).option("--local-context <file>","Override local context (default: .testmuai/context.md in cwd)").addOption(new it("--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 it("--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("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").addOption(new it("--local","Skip TMS integration (no uploads, no variables/secrets push)").hideHelp()).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 t=parseInt(e,10);if(Number.isNaN(t)||t<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,t)=>{let{runTestMdFile:n}=await import("./run-test-md-3WLYVWFB.js"),o=await n(e,t);process.exit(o)})}function qs(i){i.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)",Hs,[]).option("--json","Force NDJSON output even on TTY").action(async e=>{let{runListAction:t,resolveCurrentOrgId:n}=await import("./testmd-actions-5JCGAZLL.js"),o=await n({json:!!e.json});o.ok||process.exit(o.code),process.exit(await t(e,o.orgId))})}function Ks(i){i.command("status <path>").description("Print local meta.json for a *_test.md (no live TMS check in v1)").action(async e=>{let{runStatusAction:t,resolveCurrentOrgId:n}=await import("./testmd-actions-5JCGAZLL.js"),o=await n({});o.ok||process.exit(o.code),process.exit(await t(e,o.orgId))})}function zs(i){i.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,t)=>{let{runDeleteAction:n,resolveCurrentOrgId:o}=await import("./testmd-actions-5JCGAZLL.js"),r=await o({});r.ok||process.exit(r.code),process.exit(await n(e,!!t.yes,r.orgId))})}function Gs(i){i.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,t)=>{let{runExportAction:n,resolveCurrentOrgId:o}=await import("./testmd-actions-5JCGAZLL.js"),r=await o({});r.ok||process.exit(r.code),process.exit(await n(e,t,r.orgId))})}function Gt(i){let e=new Di;if(e.name("kane-cli").version(at).showHelpAfterError("(run `kane-cli --help` to see all commands; `-h` and `help` also work)"),e.on("command:*",n=>{e.error(`error: unknown command '${n[0]}'`,{exitCode:2,code:"commander.unknownCommand"})}),i[0]==="--help"||i[0]==="-h"||i[0]==="help"){(async()=>{let{HelpView:n}=await import("./HelpView-MXW6PGOP.js"),{render:o}=await import("./build-JIKYOZUH.js"),r=await import("./react-QWOAB3TB.js"),{waitUntilExit:a}=o(r.default.createElement(n));await a(),q(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 it("--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 it("--model <name>","Model").default("v16-alpha").hideHelp()).option("--chrome-profile <path>","Chrome profile path").action(async n=>{let o=new Le,r=new Be,a=n.env,f=n.profile;if(!process.stdin.isTTY||n.oauth||n.username){if(o.setDefaultEnv(a),n.oauth)await new Ln(f,a,o).login(),console.log(`Logged in as ${f} [${a}] via OAuth`);else if(n.username&&n.accessKey){try{let{validateBasicAuth:V}=await import("./validate-basic-Q5IZSBIG.js");await V(a,n.username,n.accessKey)}catch{console.error("Credentials not valid. Please use valid credentials."),q(1,"Invalid basic-auth credentials");return}o.saveBasicAuth(f,a,{username:n.username,access_key:n.accessKey}),console.log(`Logged in as ${f} [${a}] via basic auth`)}else console.error("Provide --oauth, or --username and --access-key"),q(1,"Missing --oauth or credentials for login");o.setActiveProfile(f),r.set("model",n.model),n.chromeProfile&&r.set("chrome_profile_path",n.chromeProfile);let T=null;if(n.username&&n.accessKey)T={username:n.username,access_key:n.accessKey};else try{let A=await jo({creds:o,env:a,log:()=>{}});A.resolvedCreds&&(T={username:A.resolvedCreds.username,access_key:A.resolvedCreds.access_key})}catch{}if(n.projectId&&(pe(o,r,f,a,{projectId:n.projectId}),console.log(`Project set to ${n.projectId}`)),n.folderId&&(pe(o,r,f,a,{folderId:n.folderId}),console.log(`Folder set to ${n.folderId}`)),T&&(!n.projectId||!n.folderId))try{let V=await Bo({creds:o,config:r,profile:f,env:a,tmsCreds:T,log:()=>{}});n.projectId||console.log(`Auto-selected project: ${V.projectName} (${V.projectId})`),n.folderId||console.log(`Auto-selected folder: ${V.folderName} (${V.folderId})`)}catch(V){console.warn(`Could not auto-select project/folder: ${V instanceof Error?V.message:V}`)}Te(o,r,f,a),console.log("Setup complete."),q(0,"Setup complete")}let{SingleShotApp:d}=await import("./SingleShotApp-QA4SYSCP.js"),{render:u}=await import("./build-JIKYOZUH.js"),s=await import("./react-QWOAB3TB.js"),c={current:null},y={current:!1},{waitUntilExit:P,unmount:h}=u(s.default.createElement(d,{resultRef:c,mode:"login",loginCompleteRef:y}),{exitOnCtrlC:!1});an(()=>h()),await P();try{process.stdin.setRawMode?.(!1)}catch{}process.stdout.write("\x1B[?25h"),y.current&&console.log("Login setup complete."),process.exit(0)}),e.command("logout").action(async()=>{let n=new Le,o=n.getActiveProfile();if(!o){console.log("No active profile to logout");return}let r=n.getDefaultEnv(),a=await eo(n,o,r),f=new Be;a.switchedTo?(Te(n,f,a.switchedTo.profile,a.switchedTo.env),console.log(`Logged out ${a.profile} [${a.env}]. Switched to ${a.switchedTo.profile} [${a.switchedTo.env}]`)):(f.save({project_id:null,project_name:null,folder_id:null,folder_name:null}),console.log(`Logged out ${a.profile} [${a.env}]. No profiles remaining.`))}),e.command("whoami").option("--profile <name>","Profile name").action(async n=>{let o=new Le,r=n.profile??o.getActiveProfile()??"default",a=o.getDefaultEnv(),f=o.loadCredentials(r,a),d=o.loadBasicAuth(r,a),u="none",s,c,y;if(d)u="basic",s=d.username;else if(f){u="oauth";let A=f.expires_at,E=Date.now()/1e3;c=A>E?"valid":"expired",y=new Date(A*1e3).toISOString().slice(0,10)}else c="missing";let{WhoamiView:P}=await import("./WhoamiView-CAX7W64M.js"),{render:h}=await import("./build-JIKYOZUH.js"),T=await import("./react-QWOAB3TB.js"),{waitUntilExit:V}=h(T.default.createElement(P,{profile:r,env:a,authenticated:u!=="none",authMethod:u,username:s,tokenStatus:c,expiresAt:y}));await V()}),e.command("config <action> [value]").action(async(n,o)=>{let r=new Be,a=new Le;if(n==="show"){let f=r.load(),d=a.getActiveProfile()??"default",u=a.getDefaultEnv(),s=a.loadBasicAuth(d,u),c=a.loadCredentials(d,u),y=s?`basic (${s.username})`:c?"oauth":"not configured",{ConfigView:P}=await import("./ConfigView-FFJW43N4.js"),{render:h}=await import("./build-JIKYOZUH.js"),T=await import("./react-QWOAB3TB.js"),{waitUntilExit:V}=h(T.default.createElement(P,{model:f.model,authLabel:y,profile:d,env:u,defaultUrl:lt,projectId:f.project_id,projectName:f.project_name,folderId:f.folder_id,windowSize:`${f.window_size.width}x${f.window_size.height}`,chromeProfile:f.chrome_profile_path}));await V()}else if(n==="set-window"&&o){let f=o.split("x").map(Number),[d,u]=f;!d||!u||!Number.isInteger(d)||!Number.isInteger(u)?console.error("Invalid format. Use: kane-cli config set-window WIDTHxHEIGHT"):d<800||d>3840?console.error(`Width must be between 800 and 3840 (got ${d})`):u<600||u>2160?console.error(`Height must be between 600 and 2160 (got ${u})`):(r.set("window_size",{width:d,height:u}),console.log(`Window size set to ${d}x${u}`))}else if(n==="set-mode"){if(o!=="action"&&o!=="testing"){console.error("Mode must be 'action' or 'testing'."),q(1,"Invalid mode");return}r.set("mode",o),console.log(`Mode set to ${o}`)}else if(n==="chrome-profile"){if(o||!process.stdin.isTTY){o||(console.error("Usage: kane-cli config chrome-profile <path>"),q(1,"Missing chrome-profile path")),r.set("chrome_profile_path",o),console.log(`Chrome profile set to ${o}`);return}let{ChromeProfilePicker:f}=await import("./ChromeProfilePicker-PWCOETN2.js"),{render:d}=await import("./build-JIKYOZUH.js"),u=await import("./react-QWOAB3TB.js");await new Promise(s=>{let{unmount:c}=d(u.default.createElement(f,{currentPath:r.load().chrome_profile_path,onSelect:y=>{r.set("chrome_profile_path",y),console.log(`Chrome profile set to ${y}`),c(),s()},onCancel:()=>{c(),s()}}))})}else if(n==="project"){if(o||!process.stdin.isTTY){o||(console.error("Usage: kane-cli config project <project-id>"),q(1,"Missing project ID"));let T=a.getActiveProfile()??"default",V=a.getDefaultEnv();pe(a,r,T,V,{projectId:o}),console.log(`Project set to ${o}`);return}let f=a.getDefaultEnv(),d=ve(f),u=a.loadBasicAuth(a.getActiveProfile()??"default",f);if(!u){console.log("Login first to browse projects");return}let{ProjectPicker:s}=await import("./ProjectPicker-2LMGEOK6.js"),{AuthResolver:c}=await import("./resolver-OA35IO7J.js"),{render:y}=await import("./build-JIKYOZUH.js"),P=await import("./react-QWOAB3TB.js"),h=new c(d.controllerBaseUrl,async()=>null,u);await h.resolve(),await new Promise(T=>{let{unmount:V}=y(P.default.createElement(s,{resolver:h,currentProjectId:r.load().project_id,env:f,onSelect:(A,E)=>{let M=a.getActiveProfile()??"default",O=a.getDefaultEnv();pe(a,r,M,O,{projectId:A,projectName:E}),console.log(`Project set to ${E} (${A})`),V(),T()},onCancel:()=>{V(),T()}}))})}else if(n==="folder"){if(o||!process.stdin.isTTY){if(o||(console.error("Usage: kane-cli config folder <folder-id>"),q(1,"Missing folder ID")),!r.load().project_id){console.log("Select a project first: kane-cli config project <id>");return}let A=a.getActiveProfile()??"default",E=a.getDefaultEnv();pe(a,r,A,E,{folderId:o}),console.log(`Folder set to ${o}`);return}let f=r.load();if(!f.project_id){console.log("Select a project first: kane-cli config project");return}let d=a.getDefaultEnv(),u=ve(d),s=a.loadBasicAuth(a.getActiveProfile()??"default",d);if(!s){console.log("Login first to browse folders");return}let{FolderPicker:c}=await import("./FolderPicker-BE3KYGZX.js"),{AuthResolver:y}=await import("./resolver-OA35IO7J.js"),{render:P}=await import("./build-JIKYOZUH.js"),h=await import("./react-QWOAB3TB.js"),T=new y(u.controllerBaseUrl,async()=>null,s);await T.resolve(),await new Promise(V=>{let{unmount:A}=P(h.default.createElement(c,{resolver:T,projectId:f.project_id,currentFolderId:f.folder_id,env:d,onSelect:(E,M)=>{let O=a.getActiveProfile()??"default",U=a.getDefaultEnv();pe(a,r,O,U,{folderId:E,folderName:M}),console.log(`Folder set to ${M} (${E})`),A(),V()},onCancel:()=>{A(),V()}}))})}else console.log("Usage: kane-cli config show|set-window|set-mode|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("--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: ${mt(xe,"global-memory.md")})`).option("--local-context <file>","Override local context markdown (default: .testmuai/context.md in cwd)").addOption(new it("--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 it("--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("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").addOption(new it("--local","Skip TMS integration (no uploads, no variables/secrets push)").hideHelp()).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("--skip-code-validation","Skip post-codegen worker-side validation").option("--no-skip-code-validation","Force post-codegen worker-side validation").addHelpText("after",`
|
|
31
|
+
`),process.exit(2));let{runListTui:t,resolveCurrentOrgId:n}=await import("./testmd-actions-O4NTH2OR.js"),o=await n({});o.ok||process.exit(o.code),process.exit(await t(o.orgId))});Ws(e),qs(e),Ks(e),zs(e),Gs(e)}function Hs(i,e){return e.concat(i)}function Ws(i){i.command("run <path>").description("Run a test from a *_test.md file").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: ${Us(xe,"global-memory.md")})`).option("--local-context <file>","Override local context (default: .testmuai/context.md in cwd)").addOption(new it("--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 it("--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("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").addOption(new it("--local","Skip TMS integration (no uploads, no variables/secrets push)").hideHelp()).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 t=parseInt(e,10);if(Number.isNaN(t)||t<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,t)=>{let{runTestMdFile:n}=await import("./run-test-md-5TNUTTEA.js"),o=await n(e,t);process.exit(o)})}function qs(i){i.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)",Hs,[]).option("--json","Force NDJSON output even on TTY").action(async e=>{let{runListAction:t,resolveCurrentOrgId:n}=await import("./testmd-actions-O4NTH2OR.js"),o=await n({json:!!e.json});o.ok||process.exit(o.code),process.exit(await t(e,o.orgId))})}function Ks(i){i.command("status <path>").description("Print local meta.json for a *_test.md (no live TMS check in v1)").action(async e=>{let{runStatusAction:t,resolveCurrentOrgId:n}=await import("./testmd-actions-O4NTH2OR.js"),o=await n({});o.ok||process.exit(o.code),process.exit(await t(e,o.orgId))})}function zs(i){i.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,t)=>{let{runDeleteAction:n,resolveCurrentOrgId:o}=await import("./testmd-actions-O4NTH2OR.js"),r=await o({});r.ok||process.exit(r.code),process.exit(await n(e,!!t.yes,r.orgId))})}function Gs(i){i.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,t)=>{let{runExportAction:n,resolveCurrentOrgId:o}=await import("./testmd-actions-O4NTH2OR.js"),r=await o({});r.ok||process.exit(r.code),process.exit(await n(e,t,r.orgId))})}function Gt(i){let e=new Di;if(e.name("kane-cli").version(at).showHelpAfterError("(run `kane-cli --help` to see all commands; `-h` and `help` also work)"),e.on("command:*",n=>{e.error(`error: unknown command '${n[0]}'`,{exitCode:2,code:"commander.unknownCommand"})}),i[0]==="--help"||i[0]==="-h"||i[0]==="help"){(async()=>{let{HelpView:n}=await import("./HelpView-CDK7II5Q.js"),{render:o}=await import("./build-JIKYOZUH.js"),r=await import("./react-QWOAB3TB.js"),{waitUntilExit:a}=o(r.default.createElement(n));await a(),q(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 it("--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 it("--model <name>","Model").default("v16-alpha").hideHelp()).option("--chrome-profile <path>","Chrome profile path").action(async n=>{let o=new Le,r=new Be,a=n.env,f=n.profile;if(!process.stdin.isTTY||n.oauth||n.username){if(o.setDefaultEnv(a),n.oauth)await new Ln(f,a,o).login(),console.log(`Logged in as ${f} [${a}] via OAuth`);else if(n.username&&n.accessKey){try{let{validateBasicAuth:V}=await import("./validate-basic-JJOEAFLT.js");await V(a,n.username,n.accessKey)}catch{console.error("Credentials not valid. Please use valid credentials."),q(1,"Invalid basic-auth credentials");return}o.saveBasicAuth(f,a,{username:n.username,access_key:n.accessKey}),console.log(`Logged in as ${f} [${a}] via basic auth`)}else console.error("Provide --oauth, or --username and --access-key"),q(1,"Missing --oauth or credentials for login");o.setActiveProfile(f),r.set("model",n.model),n.chromeProfile&&r.set("chrome_profile_path",n.chromeProfile);let T=null;if(n.username&&n.accessKey)T={username:n.username,access_key:n.accessKey};else try{let A=await jo({creds:o,env:a,log:()=>{}});A.resolvedCreds&&(T={username:A.resolvedCreds.username,access_key:A.resolvedCreds.access_key})}catch{}if(n.projectId&&(pe(o,r,f,a,{projectId:n.projectId}),console.log(`Project set to ${n.projectId}`)),n.folderId&&(pe(o,r,f,a,{folderId:n.folderId}),console.log(`Folder set to ${n.folderId}`)),T&&(!n.projectId||!n.folderId))try{let V=await Bo({creds:o,config:r,profile:f,env:a,tmsCreds:T,log:()=>{}});n.projectId||console.log(`Auto-selected project: ${V.projectName} (${V.projectId})`),n.folderId||console.log(`Auto-selected folder: ${V.folderName} (${V.folderId})`)}catch(V){console.warn(`Could not auto-select project/folder: ${V instanceof Error?V.message:V}`)}Te(o,r,f,a),console.log("Setup complete."),q(0,"Setup complete")}let{SingleShotApp:d}=await import("./SingleShotApp-JH6A65TZ.js"),{render:u}=await import("./build-JIKYOZUH.js"),s=await import("./react-QWOAB3TB.js"),c={current:null},y={current:!1},{waitUntilExit:P,unmount:h}=u(s.default.createElement(d,{resultRef:c,mode:"login",loginCompleteRef:y}),{exitOnCtrlC:!1});an(()=>h()),await P();try{process.stdin.setRawMode?.(!1)}catch{}process.stdout.write("\x1B[?25h"),y.current&&console.log("Login setup complete."),process.exit(0)}),e.command("logout").action(async()=>{let n=new Le,o=n.getActiveProfile();if(!o){console.log("No active profile to logout");return}let r=n.getDefaultEnv(),a=await eo(n,o,r),f=new Be;a.switchedTo?(Te(n,f,a.switchedTo.profile,a.switchedTo.env),console.log(`Logged out ${a.profile} [${a.env}]. Switched to ${a.switchedTo.profile} [${a.switchedTo.env}]`)):(f.save({project_id:null,project_name:null,folder_id:null,folder_name:null}),console.log(`Logged out ${a.profile} [${a.env}]. No profiles remaining.`))}),e.command("whoami").option("--profile <name>","Profile name").action(async n=>{let o=new Le,r=n.profile??o.getActiveProfile()??"default",a=o.getDefaultEnv(),f=o.loadCredentials(r,a),d=o.loadBasicAuth(r,a),u="none",s,c,y;if(d)u="basic",s=d.username;else if(f){u="oauth";let A=f.expires_at,E=Date.now()/1e3;c=A>E?"valid":"expired",y=new Date(A*1e3).toISOString().slice(0,10)}else c="missing";let{WhoamiView:P}=await import("./WhoamiView-YG6SSQTV.js"),{render:h}=await import("./build-JIKYOZUH.js"),T=await import("./react-QWOAB3TB.js"),{waitUntilExit:V}=h(T.default.createElement(P,{profile:r,env:a,authenticated:u!=="none",authMethod:u,username:s,tokenStatus:c,expiresAt:y}));await V()}),e.command("config <action> [value]").action(async(n,o)=>{let r=new Be,a=new Le;if(n==="show"){let f=r.load(),d=a.getActiveProfile()??"default",u=a.getDefaultEnv(),s=a.loadBasicAuth(d,u),c=a.loadCredentials(d,u),y=s?`basic (${s.username})`:c?"oauth":"not configured",{ConfigView:P}=await import("./ConfigView-PCX3TZNC.js"),{render:h}=await import("./build-JIKYOZUH.js"),T=await import("./react-QWOAB3TB.js"),{waitUntilExit:V}=h(T.default.createElement(P,{model:f.model,authLabel:y,profile:d,env:u,defaultUrl:lt,projectId:f.project_id,projectName:f.project_name,folderId:f.folder_id,windowSize:`${f.window_size.width}x${f.window_size.height}`,chromeProfile:f.chrome_profile_path}));await V()}else if(n==="set-window"&&o){let f=o.split("x").map(Number),[d,u]=f;!d||!u||!Number.isInteger(d)||!Number.isInteger(u)?console.error("Invalid format. Use: kane-cli config set-window WIDTHxHEIGHT"):d<800||d>3840?console.error(`Width must be between 800 and 3840 (got ${d})`):u<600||u>2160?console.error(`Height must be between 600 and 2160 (got ${u})`):(r.set("window_size",{width:d,height:u}),console.log(`Window size set to ${d}x${u}`))}else if(n==="set-mode"){if(o!=="action"&&o!=="testing"){console.error("Mode must be 'action' or 'testing'."),q(1,"Invalid mode");return}r.set("mode",o),console.log(`Mode set to ${o}`)}else if(n==="chrome-profile"){if(o||!process.stdin.isTTY){o||(console.error("Usage: kane-cli config chrome-profile <path>"),q(1,"Missing chrome-profile path")),r.set("chrome_profile_path",o),console.log(`Chrome profile set to ${o}`);return}let{ChromeProfilePicker:f}=await import("./ChromeProfilePicker-CBF6SP67.js"),{render:d}=await import("./build-JIKYOZUH.js"),u=await import("./react-QWOAB3TB.js");await new Promise(s=>{let{unmount:c}=d(u.default.createElement(f,{currentPath:r.load().chrome_profile_path,onSelect:y=>{r.set("chrome_profile_path",y),console.log(`Chrome profile set to ${y}`),c(),s()},onCancel:()=>{c(),s()}}))})}else if(n==="project"){if(o||!process.stdin.isTTY){o||(console.error("Usage: kane-cli config project <project-id>"),q(1,"Missing project ID"));let T=a.getActiveProfile()??"default",V=a.getDefaultEnv();pe(a,r,T,V,{projectId:o}),console.log(`Project set to ${o}`);return}let f=a.getDefaultEnv(),d=ve(f),u=a.loadBasicAuth(a.getActiveProfile()??"default",f);if(!u){console.log("Login first to browse projects");return}let{ProjectPicker:s}=await import("./ProjectPicker-TWTR6SWR.js"),{AuthResolver:c}=await import("./resolver-OA35IO7J.js"),{render:y}=await import("./build-JIKYOZUH.js"),P=await import("./react-QWOAB3TB.js"),h=new c(d.controllerBaseUrl,async()=>null,u);await h.resolve(),await new Promise(T=>{let{unmount:V}=y(P.default.createElement(s,{resolver:h,currentProjectId:r.load().project_id,env:f,onSelect:(A,E)=>{let M=a.getActiveProfile()??"default",O=a.getDefaultEnv();pe(a,r,M,O,{projectId:A,projectName:E}),console.log(`Project set to ${E} (${A})`),V(),T()},onCancel:()=>{V(),T()}}))})}else if(n==="folder"){if(o||!process.stdin.isTTY){if(o||(console.error("Usage: kane-cli config folder <folder-id>"),q(1,"Missing folder ID")),!r.load().project_id){console.log("Select a project first: kane-cli config project <id>");return}let A=a.getActiveProfile()??"default",E=a.getDefaultEnv();pe(a,r,A,E,{folderId:o}),console.log(`Folder set to ${o}`);return}let f=r.load();if(!f.project_id){console.log("Select a project first: kane-cli config project");return}let d=a.getDefaultEnv(),u=ve(d),s=a.loadBasicAuth(a.getActiveProfile()??"default",d);if(!s){console.log("Login first to browse folders");return}let{FolderPicker:c}=await import("./FolderPicker-UTY6XQHP.js"),{AuthResolver:y}=await import("./resolver-OA35IO7J.js"),{render:P}=await import("./build-JIKYOZUH.js"),h=await import("./react-QWOAB3TB.js"),T=new y(u.controllerBaseUrl,async()=>null,s);await T.resolve(),await new Promise(V=>{let{unmount:A}=P(h.default.createElement(c,{resolver:T,projectId:f.project_id,currentFolderId:f.folder_id,env:d,onSelect:(E,M)=>{let O=a.getActiveProfile()??"default",U=a.getDefaultEnv();pe(a,r,O,U,{folderId:E,folderName:M}),console.log(`Folder set to ${M} (${E})`),A(),V()},onCancel:()=>{A(),V()}}))})}else console.log("Usage: kane-cli config show|set-window|set-mode|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("--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: ${mt(xe,"global-memory.md")})`).option("--local-context <file>","Override local context markdown (default: .testmuai/context.md in cwd)").addOption(new it("--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 it("--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("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").addOption(new it("--local","Skip TMS integration (no uploads, no variables/secrets push)").hideHelp()).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("--skip-code-validation","Skip post-codegen worker-side validation").option("--no-skip-code-validation","Force post-codegen worker-side validation").addHelpText("after",`
|
|
32
32
|
Variables:
|
|
33
33
|
Variables are loaded in order (later wins):
|
|
34
34
|
1. Global: ${mt(xe,"variables")}/*.json
|
|
@@ -52,9 +52,9 @@ Context Files:
|
|
|
52
52
|
Override with --global-context / --local-context flags.
|
|
53
53
|
`).action(async(n,o)=>{try{if(o.name){let{validateNameOrThrow:D}=await import("./name-validator-5YGJXLZ7.js");try{D(o.name)}catch(H){console.error(`error: ${H.message}`),q(2,"Invalid --name");return}}if(n&&n.endsWith(".md")&&!n.startsWith("-")){process.stderr.write(`error: '.md' files are no longer accepted by 'kane run'.
|
|
54
54
|
Use 'kane-cli testmd run <path>' instead.
|
|
55
|
-
`),process.exit(2);return}let r=new Le,a=new Be,f=a.load(),d;if(o.mode===void 0)d=f.mode==="action"?"action":"testing";else if(o.mode==="action"||o.mode==="testing")d=o.mode;else{console.error("Invalid --mode. Must be 'action' or 'testing'."),q(2,"Invalid --mode");return}let u=new on,{printRecordingBanner:s}=await import("./recording-banner-
|
|
56
|
-
`)};Ie?.setRunActive(!0);let H;try{H=await $i(Jt,{environment:h,mode:d,log:(ee,le,Pe,We)=>L.log(ee,le,Pe,We)},{onStepEnd:jt,onStepLog:(ee,le,Pe)=>L.logStep(ee,le,Pe),onReasoning:ee=>Ie?.setStepText(ee),onStepComplete:()=>Ie?.setStepComplete()})}finally{Ie?.setRunActive(!1)}let{lastRunEnd:z,stepsTotal:se,hadError:$e,bifurcationFlows:ne}=H;if($e&&L.escalateRun(0),z){let ee=rn(z,0,ne);L.addRunResult(sn(z,Z.auteurObjective,0,ee),z.total_runs);let le=z.status==="passed"?"passed":$e?"error":"failed";L.addFlow({runIndex:0,objective:Z.auteurObjective,status:le,summary:z.summary??"",duration:z.duration??0,steps:se,stepsPassed:le==="passed"?se:0,stepsFailed:le==="passed"?0:se,reason:z.reason,creditsConsumed:z.credits_consumed})}At("chrome","Agent run completed");let ae;if(L.log("info","DIRECT_UPLOAD_START","Starting direct upload (agent mode)",{agent_mode:!0,last_run_end:!!z,local:!!o.local}),z&&!o.local)try{let ee=ve(h),le=te.project_id;if(E.basicAuth){let{UploadPipeline:Pe}=await import("./pipeline-
|
|
57
|
-
Timeout: ${o.timeout}s exceeded \u2014 cancelling...`),He.current?.()},D)}Ie?.setRunActive(!0);try{await Ct()}finally{Ie?.setRunActive(!1)}if(Yt&&clearTimeout(Yt),he){let D=rn(he,0,_n);L.addRunResult(sn(he,Z.auteurObjective,0,D),he.total_runs);let H=he.status==="passed"?"passed":st?"error":"failed";L.addFlow({runIndex:0,objective:Z.auteurObjective,status:H,summary:he.summary??"",duration:he.duration??0,steps:_t,stepsPassed:H==="passed"?_t:0,stepsFailed:H==="passed"?0:_t,reason:he.reason,creditsConsumed:he.credits_consumed})}if(At("chrome","Ink run completed"),L.log("info","DIRECT_UPLOAD_START","Starting direct upload (ink mode)",{ink_mode:!0,last_event:!!he,local:!!o.local}),he&&!o.local)try{let D=ve(h),H=te.project_id;if(E.basicAuth){let{UploadPipeline:z}=await import("./pipeline-A6ZHMRPH.js");Ue&&(L.log("info","SCREENSHOT_UPLOAD_DRAIN","Draining screenshot upload queue before pipeline"),await Ue.drain(),L.log("info","SCREENSHOT_UPLOAD_DRAINED","Screenshot upload queue drained"));let se=dn({session:L,env:h,auth:E,variables:Z,variableIds:yt,projectId:te.project_id,folderId:te.folder_id,totalSteps:_t,totalDuration:he.duration??0,screenshotExtMap:Ue?.getExtMap(),codeExport:un({codeExport:o.codeExport,codeLanguage:o.codeLanguage,skipCodeValidation:o.skipCodeValidation},f.code_export),onProgress:()=>{},log:(re,ee,le,Pe)=>L.log(re,ee,le,Pe),shouldUploadArtifacts:!o.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0}),$e=new z(se),{renderUploadProgress:ne}=await import("./CliUploadProgress-EWQKUP74.js"),ae=await ne($e,re=>{if(re.testcaseId&&re.shareId&&H)return It(D.testManagerUiUrl,H,re.testcaseId,re.shareId)});if(ae.success){ae.testcaseId&&L.setTestcaseId(ae.testcaseId);let re=d==="testing",ee=L.nextRunIndex()>0;if(re&&!o.name&&ee&&process.stdin.isTTY)try{let{renderSavePrompt:ke,defaultSessionTimestamp:Oe}=await import("./SaveSessionPrompt-UK7FCGBC.js"),Se=await ke(Oe());Se&&L.setSessionName(Se)}catch(ke){L.log("warn","DIRECT_SAVE_PROMPT_FAILED","Save prompt failed",{error:String(ke)})}let le=null;try{let{persistRecordedSession:ke}=await import("./persist-recorded-session-6X37MMUB.js");le=ke(L,{testcaseId:L.testcaseId??void 0,projectId:te.project_id??void 0,folderId:te.folder_id??void 0,codeExportDir:ae.codeExportDir})}catch(ke){L.log("error","DIRECT_PERSIST_ERROR","Persist failed in ink mode",{error:String(ke)})}let Pe=ae.testcaseId&&ae.shareId&&H?It(D.testManagerUiUrl,H,ae.testcaseId,ae.shareId):void 0,We=ae.testcaseId&&H?cn(D.testManagerUiUrl,H,ae.testcaseId):void 0;if(Pe||We||ae.codeExportDir||le){let{LinksBox:ke}=await import("./LinksBox-PGDOE3OB.js"),{render:Oe}=await import("./build-JIKYOZUH.js"),Se=await import("./react-QWOAB3TB.js"),{waitUntilExit:Qt}=Oe(Se.default.createElement(ke,{recordedTestPath:le?.recordedTestPath,outputDir:le?.outputDir,shareableLink:Pe,testCaseLink:We,codeExportDir:ae.codeExportDir}),{stdout:process.stderr});await Qt()}}if(L.testId){let{renderFeedbackPrompt:re}=await import("./CliFeedbackPrompt-2JOU3UTZ.js"),ee=await re();if(ee)try{await ao({tmsBaseUrl:D.tmsBaseUrl,username:E.basicAuth.username,accessKey:E.basicAuth.access_key,testId:L.testId,feedbackType:ee,log:(le,Pe,We,ke)=>L.log(le,Pe,We,ke)})}catch(le){L.log("warn","FEEDBACK_FAILED","Feedback submission failed",{error:String(le)})}}}}catch(D){L.log("error","DIRECT_UPLOAD_FAILED","Direct upload failed (ink mode)",{error:D instanceof Error?D.stack??D.message:String(D)}),console.error(`Upload failed: ${D}`)}await L.finish("complete"),he||q(st?2:1,"Run ended with no result");let Et=he.reason??"";(Et.includes("Cancel")||Et.includes("Timeout"))&&q(3,`Run: ${Et}`),he.status==="passed"&&q(0,"Run passed"),q(1,"Run failed")}catch(r){q(2,`CLI error: ${r instanceof Error?r.message:String(r)}`)}}),Vi(e),e.command("profiles [action] [name]").option("--env <name>","Environment for switch/delete").action(async(n,o,r)=>{let a=new Le;if(n==="list"||!n&&!process.stdin.isTTY){let s=a.listProfiles();if(s.length===0){console.log("No profiles configured. Run: kane-cli login");return}let c=a.getActiveProfile(),y=a.getDefaultEnv();for(let P of s){let h=P.profile===c&&P.env===y?" (active)":"";console.log(`${P.profile} [${P.env}]${h}`)}return}if(n==="switch"&&o){let s=r?.env??a.getDefaultEnv();a.setActiveProfile(o),a.setDefaultEnv(s),Te(a,new Be,o,s),console.log(`Switched to ${o} [${s}]`);return}if(n==="delete"&&o){let s=r?.env??a.getDefaultEnv();a.deleteProfileFull(o,s),console.log(`Deleted profile ${o} [${s}]`);return}process.stdin.isTTY||(console.error("Usage: kane-cli profiles list|switch|delete <name> [--env <env>]"),q(1,"Invalid profiles usage"));let{ProfilesView:f}=await import("./ProfilesView-ZVDOESOW.js"),{render:d}=await import("./build-JIKYOZUH.js"),u=await import("./react-QWOAB3TB.js");await new Promise(s=>{let{unmount:c}=d(u.default.createElement(f,{creds:a,onSwitch:(y,P)=>{a.setActiveProfile(y),a.setDefaultEnv(P),console.log(`Switched to ${y} [${P}]`)},onCancel:()=>{c(),s()}}))})}),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 n=>{n.feedbackType!=="positive"&&n.feedbackType!=="negative"&&(console.error('Error: --feedback-type must be "positive" or "negative"'),q(1,'Invalid --feedback-type (must be "positive" or "negative")')),n.details&&n.details.length>500&&(console.error("Error: --details must be 500 characters or fewer"),q(1,"--details exceeds 500 character limit"));let o=new Le,r=n.env??o.getDefaultEnv(),a=ve(r),f=!1,d=n.username,u=n.accessKey,s;if(n.username&&n.accessKey)f=!0;else{let A=o.resolveAuth();A?.method==="basic"&&(f=!0,d=A.username,u=A.access_key)}if(!f){let{credentials:A}=o.getActiveCredentials();A||(console.error("Not authenticated. Run: kane-cli login"),q(2,"Not authenticated for feedback")),s=A.access_token}let c=async()=>s??null,y=f&&d&&u?{username:d,access_key:u}:null,h=await new Fn(a.controllerBaseUrl,c,y).resolve(),T=h?.username??d,V=h?.access_key??u;(!T||!V)&&(console.error(JSON.stringify({error:"Could not resolve TMS credentials"})),q(1,"Could not resolve TMS credentials for feedback"));try{let{TmsClient:A}=await import("./tms-client-R5ZIAOBH.js"),M=await new A(a.tmsBaseUrl,T,V).submitFeedback({instruction_id:"",test_id:n.testId,feedback_type:n.feedbackType,details:n.details,mode:"agent"});console.log(JSON.stringify(M)),q(0,"Feedback submitted")}catch(A){console.error(JSON.stringify({error:A instanceof Error?A.message:String(A)})),q(1,`Feedback failed: ${A instanceof Error?A.message:String(A)}`)}}),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 n=>{let o=new Le,r=n.profile??o.getActiveProfile()??"default",a=n.env??o.getDefaultEnv(),f=ve(a),d=o.loadBasicAuth(r,a),u=null;if(n.username&&n.accessKey)u={username:n.username,accessKey:n.accessKey};else if(d)u={username:d.username,accessKey:d.access_key};else{let s=o.loadCredentials(r,a);s||(console.error(`No credentials for profile "${r}" [${a}]. Run "kane-cli login" first.`),q(2,`No credentials for profile "${r}" [${a}]`)),u=s.access_token}try{let{ControllerClient:s}=await import("./controller-client-RD2YEMAH.js"),y=await new s(f.controllerBaseUrl,u).getCreditBalance();console.log(`Available credits: ${y.available_credits}`),console.log(`Total credits: ${y.total_credits}`),q(0,"Balance retrieved")}catch(s){console.error(`Error: ${s instanceof Error?s.message:String(s)}`),q(1,`Balance check failed: ${s instanceof Error?s.message:String(s)}`)}}),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 n=>{let{fetchChangelog:o,formatChangelog:r}=await import("./changelog-FSOH4L6K.js"),a=await o({all:n.all});console.log(r(a))}),e.parse(["node","kane-cli",...i])}function Fi(i){let e,t,n,o=[];for(let r=0;r<i.length;r++){let a=i[r];if(a==="--code-export")e=!0;else if(a==="--skip-code-validation")n=!0;else if(a==="--no-skip-code-validation")n=!1;else if(a==="--code-language"){let f=i[r+1];f!==void 0&&(t=f,r++)}else a.startsWith("--code-language=")?t=a.slice(16):o.push(a)}return{codeExport:e,codeLanguage:t,skipCodeValidation:n,filteredArgs:o}}function uo(i,e){let t=i.split(".").map(o=>Number(o)||0),n=e.split(".").map(o=>Number(o)||0);for(let o=0;o<3;o++){let r=t[o]??0,a=n[o]??0;if(r<a)return-1;if(r>a)return 1}return 0}var Xs=[{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:i=>{let e=[];return i.code_export.enabled===!1&&e.push({field:"code_export.enabled",from:!1,to:!0,description:"Code export is now enabled by default."}),i.mode==="action"&&e.push({field:"mode",from:"action",to:"testing",description:"Default run mode is now 'testing'."}),{cfg:{...i,code_export:{...i.code_export,enabled:!0},mode:"testing"},changes:e}}}];function Mi(i,e=at,t=Xs){let n=i.exists(),o=i.load();if(!n)return i.set("last_seen_version",e),{changes:[],fromVersion:e,toVersion:e,appliedVersions:[]};let r=o.last_seen_version||"0.0.0";if(uo(r,e)>=0)return{changes:[],fromVersion:r,toVersion:r,appliedVersions:[]};let a=t.filter(c=>uo(r,c.version)<0&&uo(c.version,e)<=0).sort((c,y)=>uo(c.version,y.version)),f=o,d=[],u=[];for(let c of a){let{cfg:y,changes:P}=c.apply(f);f=y,d.push(...P),u.push(c.version)}let s={...f,last_seen_version:e};return i.writeRaw(s),{changes:d,fromVersion:r,toVersion:e,appliedVersions:u}}function Ni(i){return i.changes.length===0?"":[`kane-cli updated to ${i.toVersion}. Default settings changed:`,...i.changes.map(t=>` \u2022 ${t.description} (${t.field}: ${JSON.stringify(t.from)} \u2192 ${JSON.stringify(t.to)})`),"","Use /config to review or revert any of these."].join(`
|
|
55
|
+
`),process.exit(2);return}let r=new Le,a=new Be,f=a.load(),d;if(o.mode===void 0)d=f.mode==="action"?"action":"testing";else if(o.mode==="action"||o.mode==="testing")d=o.mode;else{console.error("Invalid --mode. Must be 'action' or 'testing'."),q(2,"Invalid --mode");return}let u=new on,{printRecordingBanner:s}=await import("./recording-banner-Q66Y2UIC.js");await s({isAgent:!!o.agent||!process.stdin.isTTY,sessionId:u.sessionId,sessionName:o.name??null,testPath:o.name?mt(process.cwd(),".testmuai","tests",`${o.name}_test.md`):null,outputPath:o.name?mt(process.cwd(),".testmuai","tests",`output-${o.name}`):null});let c=!!(o.username&&o.accessKey);if(await Jr({isInteractive:!!process.stdin.isTTY&&!o.agent&&!c,creds:r,config:a}),!c){let D=r.getActiveProfile(),H=r.getDefaultEnv();D&&(r.loadBasicAuth(D,H)||r.loadCredentials(D,H))||(console.error("Not authenticated. Run: kane-cli login --oauth, or kane-cli login --username <user> --access-key <key>"),q(1,"Not authenticated"))}let y=`${r.getActiveProfile()??"no profile"}/${r.getDefaultEnv()}`,P=[],h=o.env??r.getDefaultEnv(),T=null,V=[],A=(D,H,z,se)=>{T?T(D,H,z,se):V.push([D,H,z,se])},E;try{E=await jo({creds:r,env:h,usernameFlag:o.username,accessKeyFlag:o.accessKey,log:A})}catch(D){throw D instanceof Gr&&(console.error(D.code==="not_authenticated"?"Not authenticated. Run: kane-cli login":"Token refresh failed. Run: kane-cli login"),q(2,D.code==="not_authenticated"?"Not authenticated":"Token refresh failed")),D}let M=!!E.basicAuth,O=E.basicAuth?.username,U=E.basicAuth?.access_key,oe=E.token,Ae=E.resolver,Ee=E.resolvedCreds;E.basicAuth&&P.push(`Auth: ${E.basicAuth.username}`);let ze=r.getActiveProfile()??"default",Me=r.getDefaultEnv();Vn(r,a,ze,Me);let te=a.load();if(!o.local&&!Pr({projectId:te.project_id,projectName:te.project_name,folderId:te.folder_id,folderName:te.folder_name})){let D=E.basicAuth??(E.resolvedCreds?{username:E.resolvedCreds.username,access_key:E.resolvedCreds.access_key}:null);if(D)try{await Bo({creds:r,config:a,profile:ze,env:Me,tmsCreds:D,log:A}),te=a.load()}catch(H){console.error(`Could not auto-configure project/folder: ${H instanceof Error?H.message:H}`),q(2,"Project/folder auto-configure failed")}else console.error("Project and folder must be configured. Run `kane-cli login` to set up defaults, or `kane-cli config project <id>` and `kane-cli config folder <id>` to set them manually."),q(2,"Project/folder not configured")}let et=lt,Z=zn({objective:n,globalDir:mt(xe,"variables"),localDir:mt(process.cwd(),".testmuai","variables"),file:o.variablesFile,inline:o.variables,onLoadError:D=>console.error(D)}),xt;if(o.sessionContext)try{xt=JSON.parse(o.sessionContext)}catch{console.error("Invalid --session-context JSON"),q(2,"Invalid --session-context JSON")}let xn=o.globalContext??mt(xe,"global-memory.md"),Xt=o.localContext??mt(process.cwd(),".testmuai","context.md"),Ne=Wt(xn),bt=Wt(Xt),we;try{we=await Xr({config:f,startUrl:et??void 0,headless:o.headless,cft:o.cft,wsEndpoint:o.wsEndpoint,cdpEndpoint:o.cdpEndpoint})}catch(D){console.error(Nn(D));let H=D instanceof Br?"Chrome not found at standard paths":`Chrome failed: ${D instanceof Error?D.message:D}`;q(2,H)}we.instance&&ot("chrome",()=>{we.instance.kill()});let Ie=null,bn=we.cdpEndpoint??o.cdpEndpoint;bn&&!o.cft&&!o.wsEndpoint&&(Ie=Un({headless:o.headless,cdpEndpoint:bn,chromePid:we.instance?.process.pid}),Ie&&ot("marker-overlay",()=>Ie.kill())),o.cft?P.push("CfT mode: Playwright will manage its own browser"):o.wsEndpoint?P.push(`Playwright WS endpoint (${o.wsEndpoint.slice(0,60)}...)`):o.cdpEndpoint?P.push(`CDP connected (${o.cdpEndpoint})`):we.cdpEndpoint&&P.push(`Chrome ready (${we.cdpEndpoint})`);let L=u;L.start({model:o.model??f.model,environment:h,profile:r.getActiveProfile()}),o.name&&L.setSessionName(o.name),E.resolvedCreds?.org_id!==void 0&&L.setOrgId(String(E.resolvedCreds.org_id)),T=(D,H,z,se)=>L.log(D,H,z,se);for(let D of V)L.log(...D);V.length=0;let yn=M&&O&&U?{username:O,accessKey:U}:oe??null,Ue=null;if(yn!==null){let D=await Wr({env:h,tmsCreds:E.resolvedCreds??null,resolver:E.resolver,auth:yn,getToken:async()=>E.token??null,session:L,log:(H,z,se,$e)=>L.log(H,z,se,$e),skipScreenshotQueue:o.local});Ue=D.screenshotQueue,D.remoteLogger&&(ot("remote-logger",()=>D.remoteLogger.shutdownSync()),Mn(D.remoteLogger))}let yt=E.basicAuth&&!o.local?await Gn({variables:Z,auth:E.basicAuth,orgId:String(E.resolvedCreds?.org_id??""),env:h,localMode:!!o.local,log:(D,H,z,se)=>L.log(D,H,z,se)}):{};if(L.setAuteurVariables(Z.auteur),L.setFirstRun(Z.auteurObjective,lt),!o.local&&E.basicAuth&&te.project_id){let D=ve(h),H=await Jn({tmsBaseUrl:D.tmsBaseUrl,auth:E.basicAuth,objective:Z.auteurObjective,url:lt,projectId:te.project_id,folderId:te.folder_id??"",hasCustomProfile:!!f.chrome_profile_path,log:(z,se,$e,ne)=>L.log(z,se,$e,ne)});H&&L.setTestId(H)}L.setResolvedGlobal({mode:d,max_steps:parseInt(o.maxSteps,10),timeout:o.timeout?parseInt(o.timeout,10):void 0,target:we.instance?"chrome":o.cdpEndpoint?"cdp":o.wsEndpoint?"ws":void 0,chrome_profile:te.chrome_profile_path||void 0,cdp_endpoint:o.cdpEndpoint||void 0,ws_endpoint:o.wsEndpoint||void 0,headless:o.headless,global_context:Ne??void 0,local_context:bt??void 0,variables:Object.keys(Z.auteur).length>0?Z.auteur:void 0});let Dt=Kn(Z.auteur,Z.auteurObjective),Jt=Xn({objective:Z.auteurObjective,url:et??void 0,model:o.model??f.model,chrome:we,auth:E,sessionId:L.sessionId,runIndex:0,windowSize:f.window_size,maxSteps:parseInt(o.maxSteps,10),headless:o.headless,disableAskUser:!process.stdin.isTTY,enableTaskSkills:o.taskSkills,variables:Object.keys(Dt).length>0?Dt:void 0,globalContext:Ne??void 0,localContext:bt??void 0,sessionContext:xt}),jt=Ue?(D,H,z)=>{Wn(L.sessionDir,H,D,Ue,(se,$e,ne,ae)=>L.log(se,$e,ne,ae),z)}:void 0;if(!process.stdin.isTTY&&!o.agent&&(o.agent=!0),o.agent){let D=ee=>{process.stdout.write(JSON.stringify(ee)+`
|
|
56
|
+
`)};Ie?.setRunActive(!0);let H;try{H=await $i(Jt,{environment:h,mode:d,log:(ee,le,Pe,We)=>L.log(ee,le,Pe,We)},{onStepEnd:jt,onStepLog:(ee,le,Pe)=>L.logStep(ee,le,Pe),onReasoning:ee=>Ie?.setStepText(ee),onStepComplete:()=>Ie?.setStepComplete()})}finally{Ie?.setRunActive(!1)}let{lastRunEnd:z,stepsTotal:se,hadError:$e,bifurcationFlows:ne}=H;if($e&&L.escalateRun(0),z){let ee=rn(z,0,ne);L.addRunResult(sn(z,Z.auteurObjective,0,ee),z.total_runs);let le=z.status==="passed"?"passed":$e?"error":"failed";L.addFlow({runIndex:0,objective:Z.auteurObjective,status:le,summary:z.summary??"",duration:z.duration??0,steps:se,stepsPassed:le==="passed"?se:0,stepsFailed:le==="passed"?0:se,reason:z.reason,creditsConsumed:z.credits_consumed})}At("chrome","Agent run completed");let ae;if(L.log("info","DIRECT_UPLOAD_START","Starting direct upload (agent mode)",{agent_mode:!0,last_run_end:!!z,local:!!o.local}),z&&!o.local)try{let ee=ve(h),le=te.project_id;if(E.basicAuth){let{UploadPipeline:Pe}=await import("./pipeline-L3VM7QEX.js");Ue&&await Ue.drain();let We=dn({session:L,env:h,auth:E,variables:Z,variableIds:yt,projectId:le,folderId:te.folder_id,totalSteps:se,totalDuration:z.duration??0,screenshotExtMap:Ue?.getExtMap(),codeExport:un({codeExport:o.codeExport,codeLanguage:o.codeLanguage,skipCodeValidation:o.skipCodeValidation},f.code_export),onProgress:()=>{},log:(Se,Qt,Ge,Bt)=>L.log(Se,Qt,Ge,Bt),shouldUploadArtifacts:!o.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0}),Oe=await new Pe(We).execute();Oe.success&&(Oe.testcaseId&&L.setTestcaseId(Oe.testcaseId),Oe.testcaseId&&Oe.shareId&&le&&(ae=It(ee.testManagerUiUrl,le,Oe.testcaseId,Oe.shareId)));try{let{persistRecordedSession:Se}=await import("./persist-recorded-session-LVQLORT4.js");Se(L,{testcaseId:L.testcaseId??void 0,projectId:te.project_id??void 0,folderId:te.folder_id??void 0,codeExportDir:Oe.codeExportDir})}catch(Se){L.log("error","DIRECT_PERSIST_ERROR","Persist failed in agent mode",{error:String(Se)})}}}catch(ee){L.log("error","DIRECT_UPLOAD_ERROR","Upload failed in agent mode",{error:ee instanceof Error?ee.message:String(ee)})}if(z){let ee={...z};ae&&(ee.test_url=ae),D(ee)}await L.finish("complete"),z||q($e?2:1,"Agent run ended with no result");let re=z.reason??"";(re.includes("Cancel")||re.includes("Timeout"))&&q(3,`Agent run: ${re}`),z.status==="passed"&&q(0,"Agent run passed"),q(1,"Agent run failed")}let he=null,_t=0,st=!1,_n=null,He={current:null},{waitUntilExit:Ct}=nn(Li.default.createElement(Bi,{config:Jt,spawnOpts:{environment:h,mode:d,log:(D,H,z,se)=>L.log(D,H,z,se)},cancelRef:He,banner:{model:o.model??f.model,auth:y,status:P},onComplete:D=>{he=D.lastRunEnd,_t=D.stepsTotal,st=D.hadError,_n=D.bifurcationFlows},onStepEnd:jt,onReasoning:D=>Ie?.setStepText(D),onStepComplete:()=>Ie?.setStepComplete()}),{stdout:process.stderr,exitOnCtrlC:!1}),Yt;if(o.timeout){let D=parseInt(o.timeout,10)*1e3;Yt=setTimeout(()=>{console.error(`
|
|
57
|
+
Timeout: ${o.timeout}s exceeded \u2014 cancelling...`),He.current?.()},D)}Ie?.setRunActive(!0);try{await Ct()}finally{Ie?.setRunActive(!1)}if(Yt&&clearTimeout(Yt),he){let D=rn(he,0,_n);L.addRunResult(sn(he,Z.auteurObjective,0,D),he.total_runs);let H=he.status==="passed"?"passed":st?"error":"failed";L.addFlow({runIndex:0,objective:Z.auteurObjective,status:H,summary:he.summary??"",duration:he.duration??0,steps:_t,stepsPassed:H==="passed"?_t:0,stepsFailed:H==="passed"?0:_t,reason:he.reason,creditsConsumed:he.credits_consumed})}if(At("chrome","Ink run completed"),L.log("info","DIRECT_UPLOAD_START","Starting direct upload (ink mode)",{ink_mode:!0,last_event:!!he,local:!!o.local}),he&&!o.local)try{let D=ve(h),H=te.project_id;if(E.basicAuth){let{UploadPipeline:z}=await import("./pipeline-L3VM7QEX.js");Ue&&(L.log("info","SCREENSHOT_UPLOAD_DRAIN","Draining screenshot upload queue before pipeline"),await Ue.drain(),L.log("info","SCREENSHOT_UPLOAD_DRAINED","Screenshot upload queue drained"));let se=dn({session:L,env:h,auth:E,variables:Z,variableIds:yt,projectId:te.project_id,folderId:te.folder_id,totalSteps:_t,totalDuration:he.duration??0,screenshotExtMap:Ue?.getExtMap(),codeExport:un({codeExport:o.codeExport,codeLanguage:o.codeLanguage,skipCodeValidation:o.skipCodeValidation},f.code_export),onProgress:()=>{},log:(re,ee,le,Pe)=>L.log(re,ee,le,Pe),shouldUploadArtifacts:!o.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0}),$e=new z(se),{renderUploadProgress:ne}=await import("./CliUploadProgress-B4CVWX62.js"),ae=await ne($e,re=>{if(re.testcaseId&&re.shareId&&H)return It(D.testManagerUiUrl,H,re.testcaseId,re.shareId)});if(ae.success){ae.testcaseId&&L.setTestcaseId(ae.testcaseId);let re=d==="testing",ee=L.nextRunIndex()>0;if(re&&!o.name&&ee&&process.stdin.isTTY)try{let{renderSavePrompt:ke,defaultSessionTimestamp:Oe}=await import("./SaveSessionPrompt-WAVXAYCK.js"),Se=await ke(Oe());Se&&L.setSessionName(Se)}catch(ke){L.log("warn","DIRECT_SAVE_PROMPT_FAILED","Save prompt failed",{error:String(ke)})}let le=null;try{let{persistRecordedSession:ke}=await import("./persist-recorded-session-LVQLORT4.js");le=ke(L,{testcaseId:L.testcaseId??void 0,projectId:te.project_id??void 0,folderId:te.folder_id??void 0,codeExportDir:ae.codeExportDir})}catch(ke){L.log("error","DIRECT_PERSIST_ERROR","Persist failed in ink mode",{error:String(ke)})}let Pe=ae.testcaseId&&ae.shareId&&H?It(D.testManagerUiUrl,H,ae.testcaseId,ae.shareId):void 0,We=ae.testcaseId&&H?cn(D.testManagerUiUrl,H,ae.testcaseId):void 0;if(Pe||We||ae.codeExportDir||le){let{LinksBox:ke}=await import("./LinksBox-R3VLKMYS.js"),{render:Oe}=await import("./build-JIKYOZUH.js"),Se=await import("./react-QWOAB3TB.js"),{waitUntilExit:Qt}=Oe(Se.default.createElement(ke,{recordedTestPath:le?.recordedTestPath,outputDir:le?.outputDir,shareableLink:Pe,testCaseLink:We,codeExportDir:ae.codeExportDir}),{stdout:process.stderr});await Qt()}}if(L.testId){let{renderFeedbackPrompt:re}=await import("./CliFeedbackPrompt-P2FJBV3S.js"),ee=await re();if(ee)try{await ao({tmsBaseUrl:D.tmsBaseUrl,username:E.basicAuth.username,accessKey:E.basicAuth.access_key,testId:L.testId,feedbackType:ee,log:(le,Pe,We,ke)=>L.log(le,Pe,We,ke)})}catch(le){L.log("warn","FEEDBACK_FAILED","Feedback submission failed",{error:String(le)})}}}}catch(D){L.log("error","DIRECT_UPLOAD_FAILED","Direct upload failed (ink mode)",{error:D instanceof Error?D.stack??D.message:String(D)}),console.error(`Upload failed: ${D}`)}await L.finish("complete"),he||q(st?2:1,"Run ended with no result");let Et=he.reason??"";(Et.includes("Cancel")||Et.includes("Timeout"))&&q(3,`Run: ${Et}`),he.status==="passed"&&q(0,"Run passed"),q(1,"Run failed")}catch(r){q(2,`CLI error: ${r instanceof Error?r.message:String(r)}`)}}),Vi(e),e.command("profiles [action] [name]").option("--env <name>","Environment for switch/delete").action(async(n,o,r)=>{let a=new Le;if(n==="list"||!n&&!process.stdin.isTTY){let s=a.listProfiles();if(s.length===0){console.log("No profiles configured. Run: kane-cli login");return}let c=a.getActiveProfile(),y=a.getDefaultEnv();for(let P of s){let h=P.profile===c&&P.env===y?" (active)":"";console.log(`${P.profile} [${P.env}]${h}`)}return}if(n==="switch"&&o){let s=r?.env??a.getDefaultEnv();a.setActiveProfile(o),a.setDefaultEnv(s),Te(a,new Be,o,s),console.log(`Switched to ${o} [${s}]`);return}if(n==="delete"&&o){let s=r?.env??a.getDefaultEnv();a.deleteProfileFull(o,s),console.log(`Deleted profile ${o} [${s}]`);return}process.stdin.isTTY||(console.error("Usage: kane-cli profiles list|switch|delete <name> [--env <env>]"),q(1,"Invalid profiles usage"));let{ProfilesView:f}=await import("./ProfilesView-XKUXSFMQ.js"),{render:d}=await import("./build-JIKYOZUH.js"),u=await import("./react-QWOAB3TB.js");await new Promise(s=>{let{unmount:c}=d(u.default.createElement(f,{creds:a,onSwitch:(y,P)=>{a.setActiveProfile(y),a.setDefaultEnv(P),console.log(`Switched to ${y} [${P}]`)},onCancel:()=>{c(),s()}}))})}),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 n=>{n.feedbackType!=="positive"&&n.feedbackType!=="negative"&&(console.error('Error: --feedback-type must be "positive" or "negative"'),q(1,'Invalid --feedback-type (must be "positive" or "negative")')),n.details&&n.details.length>500&&(console.error("Error: --details must be 500 characters or fewer"),q(1,"--details exceeds 500 character limit"));let o=new Le,r=n.env??o.getDefaultEnv(),a=ve(r),f=!1,d=n.username,u=n.accessKey,s;if(n.username&&n.accessKey)f=!0;else{let A=o.resolveAuth();A?.method==="basic"&&(f=!0,d=A.username,u=A.access_key)}if(!f){let{credentials:A}=o.getActiveCredentials();A||(console.error("Not authenticated. Run: kane-cli login"),q(2,"Not authenticated for feedback")),s=A.access_token}let c=async()=>s??null,y=f&&d&&u?{username:d,access_key:u}:null,h=await new Fn(a.controllerBaseUrl,c,y).resolve(),T=h?.username??d,V=h?.access_key??u;(!T||!V)&&(console.error(JSON.stringify({error:"Could not resolve TMS credentials"})),q(1,"Could not resolve TMS credentials for feedback"));try{let{TmsClient:A}=await import("./tms-client-R5ZIAOBH.js"),M=await new A(a.tmsBaseUrl,T,V).submitFeedback({instruction_id:"",test_id:n.testId,feedback_type:n.feedbackType,details:n.details,mode:"agent"});console.log(JSON.stringify(M)),q(0,"Feedback submitted")}catch(A){console.error(JSON.stringify({error:A instanceof Error?A.message:String(A)})),q(1,`Feedback failed: ${A instanceof Error?A.message:String(A)}`)}}),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 n=>{let o=new Le,r=n.profile??o.getActiveProfile()??"default",a=n.env??o.getDefaultEnv(),f=ve(a),d=o.loadBasicAuth(r,a),u=null;if(n.username&&n.accessKey)u={username:n.username,accessKey:n.accessKey};else if(d)u={username:d.username,accessKey:d.access_key};else{let s=o.loadCredentials(r,a);s||(console.error(`No credentials for profile "${r}" [${a}]. Run "kane-cli login" first.`),q(2,`No credentials for profile "${r}" [${a}]`)),u=s.access_token}try{let{ControllerClient:s}=await import("./controller-client-RD2YEMAH.js"),y=await new s(f.controllerBaseUrl,u).getCreditBalance();console.log(`Available credits: ${y.available_credits}`),console.log(`Total credits: ${y.total_credits}`),q(0,"Balance retrieved")}catch(s){console.error(`Error: ${s instanceof Error?s.message:String(s)}`),q(1,`Balance check failed: ${s instanceof Error?s.message:String(s)}`)}}),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 n=>{let{fetchChangelog:o,formatChangelog:r}=await import("./changelog-M5VP33UN.js"),a=await o({all:n.all});console.log(r(a))}),e.parse(["node","kane-cli",...i])}function Fi(i){let e,t,n,o=[];for(let r=0;r<i.length;r++){let a=i[r];if(a==="--code-export")e=!0;else if(a==="--skip-code-validation")n=!0;else if(a==="--no-skip-code-validation")n=!1;else if(a==="--code-language"){let f=i[r+1];f!==void 0&&(t=f,r++)}else a.startsWith("--code-language=")?t=a.slice(16):o.push(a)}return{codeExport:e,codeLanguage:t,skipCodeValidation:n,filteredArgs:o}}function uo(i,e){let t=i.split(".").map(o=>Number(o)||0),n=e.split(".").map(o=>Number(o)||0);for(let o=0;o<3;o++){let r=t[o]??0,a=n[o]??0;if(r<a)return-1;if(r>a)return 1}return 0}var Xs=[{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:i=>{let e=[];return i.code_export.enabled===!1&&e.push({field:"code_export.enabled",from:!1,to:!0,description:"Code export is now enabled by default."}),i.mode==="action"&&e.push({field:"mode",from:"action",to:"testing",description:"Default run mode is now 'testing'."}),{cfg:{...i,code_export:{...i.code_export,enabled:!0},mode:"testing"},changes:e}}}];function Mi(i,e=at,t=Xs){let n=i.exists(),o=i.load();if(!n)return i.set("last_seen_version",e),{changes:[],fromVersion:e,toVersion:e,appliedVersions:[]};let r=o.last_seen_version||"0.0.0";if(uo(r,e)>=0)return{changes:[],fromVersion:r,toVersion:r,appliedVersions:[]};let a=t.filter(c=>uo(r,c.version)<0&&uo(c.version,e)<=0).sort((c,y)=>uo(c.version,y.version)),f=o,d=[],u=[];for(let c of a){let{cfg:y,changes:P}=c.apply(f);f=y,d.push(...P),u.push(c.version)}let s={...f,last_seen_version:e};return i.writeRaw(s),{changes:d,fromVersion:r,toVersion:e,appliedVersions:u}}function Ni(i){return i.changes.length===0?"":[`kane-cli updated to ${i.toVersion}. Default settings changed:`,...i.changes.map(t=>` \u2022 ${t.description} (${t.field}: ${JSON.stringify(t.from)} \u2192 ${JSON.stringify(t.to)})`),"","Use /config to review or revert any of these."].join(`
|
|
58
58
|
`)}jr();Yr();var qi=Yn().catch(()=>null),fo=null,Ki=()=>fo||(fo=Mi(new Be),fo),mo=Ce.argv.slice(2),Js=mo.includes("--dev"),fr=mo.includes("--local"),Ys=mo.includes("--tui");Js&&(Ce.env.KANE_DEV_MODE="1");var Qs=mo.filter(i=>!["--dev","--local","--tui"].includes(i));function Zs(i){let e=[],t;for(let n=0;n<i.length;n++){let o=i[n];if(o==="--name"&&n+1<i.length){t=i[n+1],n++;continue}if(o.startsWith("--name=")){t=o.slice(7);continue}e.push(o)}return{name:t,rest:e}}var po=Fi(Qs),wt=po.filteredArgs,Ui=po.codeExport,mr=po.codeLanguage,pr=po.skipCodeValidation,Hi=()=>{qi.then(i=>{i&&Ce.stderr.write(`
|
|
59
59
|
Update available: ${i.current} \u2192 ${i.latest} \u2014 run \`${qr()}\` to update
|
|
60
60
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a}from"./chunk-
|
|
2
|
+
import{a}from"./chunk-QKM3RHSQ.js";import"./chunk-KX7K3Y7R.js";import"./chunk-JHNEE2MB.js";import"./chunk-5XTLIGWL.js";import"./chunk-RZ4F3BHX.js";import"./chunk-UR6MHSHU.js";export{a as LoginFlow};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as h}from"./chunk-OQZG3V6B.js";import{g as S}from"./chunk-X7VI7KK3.js";import{a as m,b as I,j as _}from"./chunk-AH4AXJML.js";import"./chunk-L5LI2JF4.js";import{a as f}from"./chunk-
|
|
2
|
+
import{a as h}from"./chunk-OQZG3V6B.js";import{g as S}from"./chunk-X7VI7KK3.js";import{a as m,b as I,j as _}from"./chunk-AH4AXJML.js";import"./chunk-L5LI2JF4.js";import{a as f}from"./chunk-KMTNMUVS.js";import"./chunk-5XTLIGWL.js";import"./chunk-UR6MHSHU.js";function y(e,d={}){e.flushRecorder();let o=e.recorder?.lastWrittenPath??null;if(!o)return e.log("info","PERSIST_SKIPPED","No recorded path \u2014 recorder.flush no-op",{reason:e.sessionName?"recorder_flush_failed":"no_session_name",session_name:e.sessionName}),null;let p;try{p=h(o)}catch(t){throw e.log("error","PERSIST_RESOLVE_FAILED","resolveTestMd threw",{error:t.message,recorded_path:o}),t}let i=e.getRunsAsStepRecords(),u=e.getFlows(),a=[],c=0;for(let t=0;t<i.length;t++){let r=i[t],l=u.slice(c,c+r.totalRunDirs);c+=r.totalRunDirs;let g=l.find(n=>n.status==="failed"||n.status==="error"),R=g?"failed":l.length===0?"skipped":"passed";a.push({rootStepIndex:t+1,status:R,duration_s:l.reduce((n,D)=>n+(D.duration??0),0),reason:g?.reason})}let P=a.some(t=>t.status==="failed")?"failed":"passed",E=new f().load().code_export?.language==="javascript"?"javascript":"python",s=I(o);e.log("info","PERSIST_START","Building staging dir",{recorded_path:o,output_dir:s,session_dir:e.sessionDir,step_count:i.length,flow_count:u.length});try{S({resolvedTest:p,sessionDir:e.sessionDir,stepRunRecords:i,outcomes:a,overallStatus:P,startedISO:e.startedAt,durationS:a.reduce((t,r)=>t+(r.duration_s??0),0),sessionId:e.sessionId,commitId:e.sessionId,tmsIds:{testId:e.testId??void 0,testcaseId:d.testcaseId,projectId:d.projectId,folderId:d.folderId,orgId:d.orgId??e.orgId??void 0,sessionName:e.sessionName??m(o)},codeExportDir:d.codeExportDir,codeExportLanguage:E}),e.log("info","PERSIST_STAGING_OK","Staging dir built",{output_dir:s}),_(s),e.log("info","PERSIST_OK","Persist complete",{output_dir:s})}catch(t){let r=t;e.log("error","PERSIST_FAILED","staging build / atomic replace failed",{error:r.message,stack:r.stack,output_dir:s}),process.stderr.write(`[persist] staging build / atomic replace failed: ${r.message}
|
|
3
3
|
`)}return{recordedTestPath:o,outputDir:s}}export{y as persistRecordedSession};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a}from"./chunk-
|
|
2
|
+
import{a}from"./chunk-VUIXILBR.js";import"./chunk-MDBXYXSC.js";import"./chunk-WAOCHXJ5.js";import"./chunk-7CLUJYMW.js";import"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-UR6MHSHU.js";export{a as UploadPipeline};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
2
|
import{a as n}from"./chunk-3MSXQU2C.js";import"./chunk-UR6MHSHU.js";function p(t){let s=t.sessionName!==null,e={type:"recording_state",enabled:!0,session_id:t.sessionId,persist:s};return t.sessionName&&(e.session_name=t.sessionName),t.testPath&&(e.test_path=t.testPath),t.outputPath&&(e.output_path=t.outputPath),e}async function g(t){if(t.isAgent){process.stdout.write(JSON.stringify(p(t))+`
|
|
3
|
-
`);return}let s=(await import("./react-QWOAB3TB.js")).default,{render:e,useApp:a}=await import("./build-JIKYOZUH.js"),{useEffect:o}=s,{InfoBox:r}=await import("./InfoBox-
|
|
3
|
+
`);return}let s=(await import("./react-QWOAB3TB.js")).default,{render:e,useApp:a}=await import("./build-JIKYOZUH.js"),{useEffect:o}=s,{InfoBox:r}=await import("./InfoBox-SYT7CVM4.js"),u=t.sessionName?[{label:"session",value:t.sessionName},{label:"test",value:n(t.testPath??"")},{label:"output",value:n(t.outputPath??"")}]:[{label:"session",value:"ephemeral"},{label:"note",value:"use /name <name> to persist this session"}];function l(){let{exit:i}=a();return o(()=>{let c=setTimeout(()=>i(),50);return()=>clearTimeout(c)},[i]),s.createElement(r,{title:"Recording",titleColor:"#ff9500",rows:u})}await e(s.createElement(l),{stdout:process.stderr}).waitUntilExit()}export{p as buildRecordingStateEvent,g as printRecordingBanner};
|