@testmuai/kane-cli 0.4.1 → 0.4.2
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-63JS7QX6.js → ChromeProfilePicker-HNP7QQ4J.js} +1 -1
- package/dist/{CliFeedbackPrompt-3SDJ5GZP.js → CliFeedbackPrompt-OSNATI4W.js} +1 -1
- package/dist/{CliUploadProgress-ZSZ7TGCN.js → CliUploadProgress-7HRWDZ4P.js} +1 -1
- package/dist/{ConfigView-OOQYCHWM.js → ConfigView-PQH67FUK.js} +1 -1
- package/dist/FolderPicker-SET7IG6S.js +2 -0
- package/dist/HelpView-HFKFRKG3.js +2 -0
- package/dist/{InfoBox-QECFIGGW.js → InfoBox-3IN3IZ2I.js} +1 -1
- package/dist/{LinksBox-2L2UX4LB.js → LinksBox-DI5QKX6K.js} +1 -1
- package/dist/{ProfilesView-72UTQ5PX.js → ProfilesView-N6XNSUHQ.js} +1 -1
- package/dist/{ProjectPicker-NLEAW232.js → ProjectPicker-6QIVHOO7.js} +1 -1
- package/dist/{SaveSessionPrompt-VNJDLJTF.js → SaveSessionPrompt-7CZHPNYK.js} +1 -1
- package/dist/SingleShotApp-A4VXMXEZ.js +2 -0
- package/dist/{SummaryBox-O772FRGO.js → SummaryBox-7ZK2A6MA.js} +1 -1
- package/dist/TestMdRunView-KGHEZZBK.js +2 -0
- package/dist/{WhoamiView-LR2EFCTK.js → WhoamiView-3E447A3G.js} +1 -1
- package/dist/{changelog-VCAUV47V.js → changelog-ZBTZCYKI.js} +1 -1
- package/dist/{chunk-CMRNCZGV.js → chunk-34YRU7WM.js} +2 -2
- package/dist/chunk-3QWAABMG.js +2 -0
- package/dist/{chunk-P7ZUISQG.js → chunk-4UKCDU64.js} +1 -1
- package/dist/{chunk-KJEJ7VW5.js → chunk-4ZHU4DLD.js} +1 -1
- package/dist/{chunk-UYHNJUPY.js → chunk-7CBWZLRS.js} +1 -1
- package/dist/{chunk-7I2SQ2KP.js → chunk-AAJSF67A.js} +1 -1
- package/dist/{chunk-RHUD7MK4.js → chunk-AKKATURY.js} +2 -2
- package/dist/{chunk-AGS57DSG.js → chunk-BM25JQ3Z.js} +1 -1
- package/dist/{chunk-UHFCCGVX.js → chunk-CZBHDBID.js} +1 -1
- package/dist/chunk-DGUXTSHM.js +11 -0
- package/dist/{chunk-LEXQLAWB.js → chunk-DQASLGFG.js} +33 -33
- package/dist/{chunk-4QO6JYHX.js → chunk-ELZIC2EH.js} +1 -1
- package/dist/chunk-FFTIDI5K.js +5 -0
- package/dist/{chunk-JGXJDTMO.js → chunk-GNJBT6SS.js} +1 -1
- package/dist/{chunk-YSSBAIJI.js → chunk-H2P7UJAU.js} +1 -1
- package/dist/chunk-K4PLPKPF.js +5 -0
- package/dist/{chunk-OFEPMULV.js → chunk-KPF3BPJ5.js} +1 -1
- package/dist/{chunk-J2KTLZAW.js → chunk-LOSNFBZV.js} +1 -1
- package/dist/chunk-LY5LHKGG.js +18 -0
- package/dist/{chunk-7U4NY37W.js → chunk-NKFXY5TF.js} +2 -2
- package/dist/chunk-OISHNB7D.js +2 -0
- package/dist/{chunk-T46Z27UL.js → chunk-PF7PBYCJ.js} +1 -1
- package/dist/{chunk-7NDFOI6Z.js → chunk-PQIPYWTP.js} +1 -1
- package/dist/chunk-QXVI3LI4.js +6 -0
- package/dist/{chunk-RJNGCQCL.js → chunk-R7T6Z6QW.js} +1 -1
- package/dist/{chunk-77SZF4ZU.js → chunk-RCL22HDJ.js} +1 -1
- package/dist/{chunk-DAVPOA2L.js → chunk-RD6G3CMN.js} +1 -1
- package/dist/chunk-RLSBAT6P.js +2 -0
- package/dist/chunk-S7JV4A3U.js +2 -0
- package/dist/{chunk-V3FSESZ4.js → chunk-TQGNNJX5.js} +1 -1
- package/dist/{chunk-HUOC7DUT.js → chunk-UHGECBEN.js} +1 -1
- package/dist/{chunk-TCLKNUAL.js → chunk-VBZIIF5N.js} +1 -1
- package/dist/chunk-VL57GII7.js +2 -0
- package/dist/chunk-WFSTRBQF.js +2 -0
- package/dist/{chunk-YAVIOVVP.js → chunk-Y6IUJZMV.js} +1 -1
- package/dist/{chunk-VKG45YIL.js → chunk-YB67GRWE.js} +1 -1
- package/dist/generate-headless-WL6A6ACX.js +21 -0
- package/dist/index.js +38 -33
- package/dist/{list-commands-Y6A3XR4L.js → list-commands-MK4W3Q7O.js} +1 -1
- package/dist/login-flow-CDR6ARK3.js +2 -0
- package/dist/{persist-recorded-session-WBPLUA55.js → persist-recorded-session-A5EJ25AE.js} +1 -1
- package/dist/{recording-banner-Q36WARSF.js → recording-banner-6UI6NNRK.js} +1 -1
- package/dist/{require-project-folder-DBXAG7FB.js → require-project-folder-J5WZR653.js} +1 -1
- package/dist/{run-test-md-H2X6CUIX.js → run-test-md-I76IV7QA.js} +3 -3
- package/dist/skill-installer-ZLBRT4QP.js +3 -0
- package/dist/tcg-generate-R6P4QUGO.js +2 -0
- package/dist/testmd-actions-W2INQVTH.js +2 -0
- package/dist/token-refresh-4QLWR5ZI.js +2 -0
- package/dist/{validate-basic-VFJZKHOE.js → validate-basic-QUPVT2EV.js} +1 -1
- package/dist/{version-check-5NUDIYG4.js → version-check-RVK5YKDZ.js} +1 -1
- package/package.json +8 -6
- package/dist/FolderPicker-FILMS64I.js +0 -2
- package/dist/HelpView-KBFE4EMP.js +0 -2
- package/dist/SingleShotApp-V2UTGNZO.js +0 -2
- package/dist/TestMdRunView-OVHCLNI7.js +0 -2
- package/dist/chunk-45VTQLJS.js +0 -6
- package/dist/chunk-FGC74Z76.js +0 -2
- package/dist/chunk-G6AXOEED.js +0 -2
- package/dist/chunk-H4XK55B3.js +0 -5
- package/dist/chunk-IBDWHXNE.js +0 -2
- package/dist/chunk-JJERCR2W.js +0 -5
- package/dist/chunk-LAR7I5SR.js +0 -2
- package/dist/chunk-OIPVMEM7.js +0 -2
- package/dist/chunk-Z7AXAKPX.js +0 -9
- package/dist/chunk-ZUIWBVGF.js +0 -14
- package/dist/generate-headless-XWVVEFQR.js +0 -18
- package/dist/login-flow-MKAYO6IS.js +0 -2
- package/dist/tcg-generate-WURS7TXW.js +0 -2
- package/dist/testmd-actions-MQ3N7IS4.js +0 -2
- package/dist/token-refresh-HHNMHTYX.js +0 -2
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as v}from"./chunk-S7JV4A3U.js";import{spawn as x,execSync as N}from"child_process";import{existsSync as g}from"fs";import{resolve as e,dirname as b}from"path";import{fileURLToPath as A}from"url";import{createInterface as w}from"readline";async function*_(i){let n=w({input:i,crlfDelay:1/0});for await(let l of n){let r=l.trim();if(r)try{let d=JSON.parse(r);d&&typeof d.type=="string"&&(yield d)}catch{}}}function E(i){return i==="action"?{set:{V16_AGENT_ENABLE_ALL_BLOCKERS:"true",V16_AGENT_SKIP_CP_FINAL:"true",V16_BIFURCATION_PHASES:"1"},unset:[]}:{set:{},unset:["V16_AGENT_ENABLE_ALL_BLOCKERS","V16_AGENT_SKIP_CP_FINAL","V16_BIFURCATION_PHASES"]}}var c=b(A(import.meta.url));function C(){for(let i of["python3","python"])try{return N(`${i} --version`,{stdio:"ignore"}),i}catch{}return null}function h(){let n=process.platform==="win32"?"v16-runner.exe":"v16-runner",l={"darwin-arm64":["@testmuai/kane-cli-darwin-arm64","@lambdatestincprivate/kane-cli-darwin-arm64"],"darwin-x64":["@testmuai/kane-cli-darwin-x64","@lambdatestincprivate/kane-cli-darwin-x64"],"linux-x64":["@testmuai/kane-cli-linux-x64","@lambdatestincprivate/kane-cli-linux-x64"],"win32-x64":["@testmuai/kane-cli-win-x64","@lambdatestincprivate/kane-cli-win-x64"]},r=`${process.platform}-${process.arch}`,d=l[r];if(d)for(let t of d){let a=[e(c,"..","node_modules",t,"bin",n),e(c,"..","..","node_modules",t,"bin",n),e(c,"..","..","..","node_modules",t,"bin",n),e(c,"..","..","..","..","node_modules",t,"bin",n)];for(let u of a)if(g(u))return{cmd:u,args:[]}}let p=[e(c,"bin",n),e(c,"..","bin",n),e(c,"..","..","..","..","v16-runner","dist",n),e(c,"..","..","..","v16-runner","dist",n),e(process.cwd(),"v16-runner","dist",n),e(process.cwd(),"..","v16-runner","dist",n)];for(let t of p)if(g(t))return{cmd:t,args:[]};let s=[e(c,"..","..","..","..","v16-runner"),e(c,"..","..","..","v16-runner"),e(process.cwd(),"v16-runner"),e(process.cwd(),"..","v16-runner")];for(let t of s)if(g(e(t,"main.py"))){for(let u of[e(t,".venv","bin","python"),e(t,"..","browser-agent",".venv","bin","python")])if(g(u))return{cmd:u,args:["main.py"],cwd:t};let a=C();if(a)return{cmd:a,args:["main.py"],cwd:t}}return null}function G(i,n){let l=h();if(!l)throw new Error("v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.");let r={...process.env};n?.environment&&(r.TESTMUAI_ENV=n.environment),r.TESTMUAI_SOURCE="kane-cli",process.platform==="win32"&&(r.PYTHONIOENCODING="utf-8");let d=v(n?.environment);r.V16_SERVER_API_HOST=d.v16ServerHost,r.ATMS_URL=d.tmsBaseUrl.replace(/\/api\/?$/,""),i.username&&i.access_key&&(r.LT_USERNAME=i.username,r.LT_ACCESS_KEY=i.access_key),i.session_id&&(r.TESTMUAI_SESSION_ID=i.session_id);let p=E(n?.mode??"testing");Object.assign(r,p.set);for(let o of p.unset)delete r[o];let s=x(l.cmd,l.args,{stdio:["pipe","pipe","pipe"],env:r,cwd:l.cwd});s.stdin.on("error",()=>{}),s.stdin.write(JSON.stringify(i)+`
|
|
3
|
+
`);let t=1e5,a="";s.stderr.on("data",o=>{a+=o.toString(),a.length>t&&(a=a.slice(-t))}),s.on("error",o=>{n?.log?.("error","RUNNER_SPAWN_ERROR","Runner spawn error",{error:o.message})});let u=null,f=null,S=new Promise(o=>{s.on("close",(m,y)=>{u=m,f=y?String(y):null,n?.log?.("info","RUNNER_EXIT","Runner exited",{code:m,signal:f??"none"}),o({code:m,signal:f})})}),R=_(s.stdout);return{child:s,events:R,sendUserResponse(o){let m=JSON.stringify({type:"user_response",answer:o});try{s.stdin.write(m+`
|
|
4
|
+
`)}catch{}},sendCancel(o){let m=JSON.stringify({type:"cancel",reason:o});try{s.stdin.write(m+`
|
|
5
|
+
`)}catch{}},cancel(){s.kill("SIGTERM")},get stderr(){return a},get exitCode(){return u},get exitSignal(){return f},exited:S}}export{h as a,G as b};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as l}from"./chunk-RZ4F3BHX.js";import{a,c,e as o}from"./chunk-
|
|
2
|
+
import{a as l}from"./chunk-RZ4F3BHX.js";import{a,c,e as o}from"./chunk-3QWAABMG.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,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as D}from"./chunk-
|
|
2
|
+
import{a as D}from"./chunk-PF7PBYCJ.js";import{a as A}from"./chunk-WFSTRBQF.js";import{n as S,o as C,p as P,q as U,r as N}from"./chunk-3QWAABMG.js";import{createServer as Oe}from"http";import{randomBytes as He}from"crypto";import{URL as $e}from"url";import Z from"process";import{Buffer as ee}from"buffer";import re from"path";import{fileURLToPath as ke}from"url";import{promisify as Le}from"util";import te from"child_process";import Me,{constants as Ie}from"fs/promises";import Y from"process";import G,{constants as me}from"fs/promises";import j from"process";import le from"os";import L from"fs";import se from"fs";import z from"fs";var E;function ie(){try{return z.statSync("/.dockerenv"),!0}catch{return!1}}function ae(){try{return z.readFileSync("/proc/self/cgroup","utf8").includes("docker")}catch{return!1}}function B(){return E===void 0&&(E=ie()||ae()),E}var k,ce=()=>{try{return se.statSync("/run/.containerenv"),!0}catch{return!1}};function u(){return k===void 0&&(k=ce()||B()),k}var K=()=>{if(j.platform!=="linux")return!1;if(le.release().toLowerCase().includes("microsoft"))return!u();try{if(L.readFileSync("/proc/version","utf8").toLowerCase().includes("microsoft"))return!u()}catch{}return L.existsSync("/proc/sys/fs/binfmt_misc/WSLInterop")||L.existsSync("/run/WSL")?!u():!1},d=j.env.__IS_WSL_TEST__?K:K();var de=(()=>{let e="/mnt/",r;return async function(){if(r)return r;let t="/etc/wsl.conf",n=!1;try{await G.access(t,me.F_OK),n=!0}catch{}if(!n)return e;let o=await G.readFile(t,{encoding:"utf8"}),i=/(?<!#.*)root\s*=\s*(?<mountPoint>.*)/g.exec(o);return i?(r=i.groups.mountPoint.trim(),r=r.endsWith("/")?r:`${r}/`,r):e}})(),fe=async()=>`${await de()}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`,M=async()=>d?fe():`${Y.env.SYSTEMROOT||Y.env.windir||String.raw`C:\Windows`}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`;function f(e,r,t){let n=o=>Object.defineProperty(e,r,{value:o,enumerable:!0,writable:!0});return Object.defineProperty(e,r,{configurable:!0,enumerable:!0,get(){let o=t();return n(o),o},set(o){n(o)}}),e}import{promisify as Pe}from"util";import O from"process";import{execFile as Ae}from"child_process";import{promisify as pe}from"util";import ue from"process";import{execFile as ge}from"child_process";var he=pe(ge);async function I(){if(ue.platform!=="darwin")throw new Error("macOS only");let{stdout:e}=await he("defaults",["read","com.apple.LaunchServices/com.apple.launchservices.secure","LSHandlers"]),t=/LSHandlerRoleAll = "(?!-)(?<id>[^"]+?)";\s+?LSHandlerURLScheme = (?:http|https);/.exec(e)?.groups.id??"com.apple.Safari";return t==="com.apple.safari"?"com.apple.Safari":t}import we from"process";import{promisify as xe}from"util";import{execFile as ye,execFileSync as cr}from"child_process";var ve=xe(ye);async function X(e,{humanReadableOutput:r=!0,signal:t}={}){if(we.platform!=="darwin")throw new Error("macOS only");let n=r?[]:["-ss"],o={};t&&(o.signal=t);let{stdout:i}=await ve("osascript",["-e",e,n],o);return i.trim()}async function T(e){return X(`tell application "Finder" to set app_path to application file id "${e}" as string
|
|
3
3
|
tell application "System Events" to get value of property list item "CFBundleName" of property list file (app_path & ":Contents:Info.plist")`)}import{promisify as be}from"util";import{execFile as Se}from"child_process";var Ce=be(Se),y={MSEdgeHTM:{name:"Edge",id:"com.microsoft.edge"},MSEdgeBHTML:{name:"Edge Beta",id:"com.microsoft.edge.beta"},MSEdgeDHTML:{name:"Edge Dev",id:"com.microsoft.edge.dev"},AppXq0fevzme2pys62n3e0fbqa7peapykr8v:{name:"Edge",id:"com.microsoft.edge.old"},ChromeHTML:{name:"Chrome",id:"com.google.chrome"},ChromeBHTML:{name:"Chrome Beta",id:"com.google.chrome.beta"},ChromeDHTML:{name:"Chrome Dev",id:"com.google.chrome.dev"},ChromiumHTM:{name:"Chromium",id:"org.chromium.Chromium"},BraveHTML:{name:"Brave",id:"com.brave.Browser"},BraveBHTML:{name:"Brave Beta",id:"com.brave.Browser.beta"},BraveDHTML:{name:"Brave Dev",id:"com.brave.Browser.dev"},BraveSSHTM:{name:"Brave Nightly",id:"com.brave.Browser.nightly"},FirefoxURL:{name:"Firefox",id:"org.mozilla.firefox"},OperaStable:{name:"Opera",id:"com.operasoftware.Opera"},VivaldiHTM:{name:"Vivaldi",id:"com.vivaldi.Vivaldi"},"IE.HTTP":{name:"Internet Explorer",id:"com.microsoft.ie"}},ur=new Map(Object.entries(y)),F=class extends Error{};async function _(e=Ce){let{stdout:r}=await e("reg",["QUERY"," HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice","/v","ProgId"]),t=/ProgId\s*REG_SZ\s*(?<id>\S+)/.exec(r);if(!t)throw new F(`Cannot find Windows browser in stdout: ${JSON.stringify(r)}`);let{id:n}=t.groups,o=n.lastIndexOf("."),i=n.lastIndexOf("-"),c=o===-1?void 0:n.slice(0,o),a=i===-1?void 0:n.slice(0,i);return y[n]??y[c]??y[a]??{name:n,id:n}}var Ee=Pe(Ae),Be=e=>e.toLowerCase().replaceAll(/(?:^|\s|-)\S/g,r=>r.toUpperCase());async function H(){if(O.platform==="darwin"){let e=await I();return{name:await T(e),id:e}}if(O.platform==="linux"){let{stdout:e}=await Ee("xdg-mime",["query","default","x-scheme-handler/http"]),r=e.trim();return{name:Be(r.replace(/.desktop$/,"").replace("-"," ")),id:r}}if(O.platform==="win32")return _();throw new Error("Only macOS, Linux, and Windows are supported")}var Te=Le(te.execFile),$=re.dirname(ke(import.meta.url)),q=re.join($,"xdg-open"),{platform:w,arch:V}=Z;async function Fe(){let e=await M(),r=String.raw`(Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice").ProgId`,t=ee.from(r,"utf16le").toString("base64"),{stdout:n}=await Te(e,["-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-EncodedCommand",t],{encoding:"utf8"}),o=n.trim(),i={ChromeHTML:"com.google.chrome",BraveHTML:"com.brave.Browser",MSEdgeHTM:"com.microsoft.edge",FirefoxURL:"org.mozilla.firefox"};return i[o]?{id:i[o]}:{}}var J=async(e,r)=>{let t;for(let n of e)try{return await r(n)}catch(o){t=o}throw t},v=async e=>{if(e={wait:!1,background:!1,newInstance:!1,allowNonzeroExitCode:!1,...e},Array.isArray(e.app))return J(e.app,a=>v({...e,app:a}));let{name:r,arguments:t=[]}=e.app??{};if(t=[...t],Array.isArray(r))return J(r,a=>v({...e,app:{name:a,arguments:t}}));if(r==="browser"||r==="browserPrivate"){let a={"com.google.chrome":"chrome","google-chrome.desktop":"chrome","com.brave.Browser":"brave","org.mozilla.firefox":"firefox","firefox.desktop":"firefox","com.microsoft.msedge":"edge","com.microsoft.edge":"edge","com.microsoft.edgemac":"edge","microsoft-edge.desktop":"edge"},l={chrome:"--incognito",brave:"--incognito",firefox:"--private-window",edge:"--inPrivate"},s=d?await Fe():await H();if(s.id in a){let m=a[s.id];return r==="browserPrivate"&&t.push(l[m]),v({...e,app:{name:g[m],arguments:t}})}throw new Error(`${s.name} is not supported as a default browser`)}let n,o=[],i={};if(w==="darwin")n="open",e.wait&&o.push("--wait-apps"),e.background&&o.push("--background"),e.newInstance&&o.push("--new"),r&&o.push("-a",r);else if(w==="win32"||d&&!u()&&!r){n=await M(),o.push("-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-EncodedCommand"),d||(i.windowsVerbatimArguments=!0);let a=["Start"];e.wait&&a.push("-Wait"),r?(a.push(`"\`"${r}\`""`),e.target&&t.push(e.target)):e.target&&a.push(`"${e.target}"`),t.length>0&&(t=t.map(l=>`"\`"${l}\`""`),a.push("-ArgumentList",t.join(","))),e.target=ee.from(a.join(" "),"utf16le").toString("base64")}else{if(r)n=r;else{let a=!$||$==="/",l=!1;try{await Me.access(q,Ie.X_OK),l=!0}catch{}n=Z.versions.electron??(w==="android"||a||!l)?"xdg-open":q}t.length>0&&o.push(...t),e.wait||(i.stdio="ignore",i.detached=!0)}w==="darwin"&&t.length>0&&o.push("--args",...t),e.target&&o.push(e.target);let c=te.spawn(n,o,i);return e.wait?new Promise((a,l)=>{c.once("error",l),c.once("close",s=>{if(!e.allowNonzeroExitCode&&s>0){l(new Error(`Exited with code ${s}`));return}a(c)})}):(c.unref(),c)},_e=(e,r)=>{if(typeof e!="string")throw new TypeError("Expected a `target`");return v({...r,target:e})};function Q(e){if(typeof e=="string"||Array.isArray(e))return e;let{[V]:r}=e;if(!r)throw new Error(`${V} is not supported`);return r}function b({[w]:e},{wsl:r}){if(r&&d)return Q(r);if(!e)throw new Error(`${w} is not supported`);return Q(e)}var g={};f(g,"chrome",()=>b({darwin:"google chrome",win32:"chrome",linux:["google-chrome","google-chrome-stable","chromium"]},{wsl:{ia32:"/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe",x64:["/mnt/c/Program Files/Google/Chrome/Application/chrome.exe","/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe"]}}));f(g,"brave",()=>b({darwin:"brave browser",win32:"brave",linux:["brave-browser","brave"]},{wsl:{ia32:"/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe",x64:["/mnt/c/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe","/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe"]}}));f(g,"firefox",()=>b({darwin:"firefox",win32:String.raw`C:\Program Files\Mozilla Firefox\firefox.exe`,linux:"firefox"},{wsl:"/mnt/c/Program Files/Mozilla Firefox/firefox.exe"}));f(g,"edge",()=>b({darwin:"microsoft edge",win32:"msedge",linux:["microsoft-edge","microsoft-edge-dev"]},{wsl:"/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe"}));f(g,"browser",()=>"browser");f(g,"browserPrivate",()=>"browserPrivate");var oe=_e;var ne=class{profile;environment;creds;oauth;constructor(r="default",t="prod",n){this.profile=r,this.environment=t,this.creds=n??new D,this.oauth=new A(t)}async login(){let{server:r,port:t}=await this.startCallbackServer(),n=N(t);try{let o=this.creds.loadClient(this.profile,this.environment),i=o?.redirect_uris;(!o||!i?.includes(n))&&(o=await this.oauth.registerClient(n),this.creds.saveClient(this.profile,this.environment,o));let c=o.client_id,[a,l]=A.generatePkce(),s=He(32).toString("hex"),m=this.oauth.buildAuthorizationUrl(c,l,s,n),p=await this.waitForCallback(r,t,m,s);if(!p)throw new Error("Login cancelled or timed out");let h=await this.oauth.exchangeCode(p,c,a,n),x={access_token:h.access_token,refresh_token:h.refresh_token,expires_at:Math.floor(Date.now()/1e3)+h.expires_in,scope:h.scope??"*"};return this.creds.saveCredentials(this.profile,this.environment,x),this.creds.setActiveProfile(this.profile),x}catch(o){throw r.close(),o}}startCallbackServer(){return new Promise((r,t)=>{let n=C,o=()=>{let i=Oe();i.on("error",c=>{c.code==="EADDRINUSE"&&n<P?(n++,o()):t(new Error(`Failed to start callback server: ${c.message}. Ports ${C}-${P} are all in use.`))}),i.listen(n,S,()=>{r({server:i,port:n})})};o()})}waitForCallback(r,t,n,o){return new Promise(i=>{let c=!1,a=setTimeout(()=>l(null),12e4),l=s=>{c||(c=!0,clearTimeout(a),r.close(),i(s))};r.on("request",(s,m)=>{let p=new $e(s.url??"/",`http://${S}:${t}`);if(p.pathname!==U){m.writeHead(404),m.end();return}let h=p.searchParams.get("state"),x=p.searchParams.get("code");if(p.searchParams.get("error")){m.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),m.end(R({state:"error",title:"Login failed",message:"We couldn't complete the sign-in. You can close this tab and try again from your terminal."})),l(null);return}if(h!==o){m.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),m.end(R({state:"error",title:"Invalid state",message:"The sign-in response didn't match this session. Please return to your terminal and try again."})),l(null);return}m.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),m.end(R({state:"success",title:"You're signed in",message:"Head back to your terminal \u2014 KaneAI is ready when you are.",autoClose:!0})),l(x)}),oe(n).catch(s=>{let m=s instanceof Error?s.message:String(s);process.stderr.write(`[auth] Could not open browser: ${m}
|
|
4
4
|
Please open this URL manually: ${n}
|
|
5
5
|
`)})})}};function R(e){let r=e.state==="success",t=r?"#22c55e":"#ef4444",n=r?"rgba(34, 197, 94, 0.12)":"rgba(239, 68, 68, 0.12)",o=r?'<svg viewBox="0 0 24 24" width="36" height="36" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12.5l4.5 4.5L19 7"/></svg>':'<svg viewBox="0 0 24 24" width="36" height="36" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18"/></svg>',i=e.autoClose?"<script>setTimeout(function(){try{window.close();}catch(e){}}, 1500);</script>":"";return`<!doctype html>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as fi,b as Gr,c as Gn,d as pi,e as qn,f as gi,h as hi,i as xi,j as vi,k as bi,l as yi,m as it,n as Ti,o as wi,p as Si,q as Wn,r as Ri,s as qr,t as ki,u as Ci,v as Ii}from"./chunk-QXVI3LI4.js";import{a as Dr,b as Co}from"./chunk-3MSXQU2C.js";import{a as Ei}from"./chunk-OISHNB7D.js";import{a as Po,b as Do,d as No,e as Uo,f as Go,g as ni,h as Fr,i as Nr,k as ri,l as oi,m as ii,n as si,o as Ur,p as ai,q as ci,r as li,t as ot,u as di}from"./chunk-DQASLGFG.js";import{a as ui}from"./chunk-EEF6OT52.js";import{a as Yo,b as Jo,l as mi}from"./chunk-AKKATURY.js";import{a as _i,b as Wr}from"./chunk-R7T6Z6QW.js";import{a as Qo}from"./chunk-HN7DVSVI.js";import{b as Ko}from"./chunk-AH4AXJML.js";import{a as Io,b as Lr,c as yt,d as $n,e as Ho,f as zo}from"./chunk-DGUXTSHM.js";import{c as Fn}from"./chunk-BM25JQ3Z.js";import{a as qt}from"./chunk-H2P7UJAU.js";import{a as Fo}from"./chunk-FPFOW6BS.js";import{a as _o,b as Ao,c as Bo,d as qo,e as Wo,f as Xo,h as Zo}from"./chunk-FFTIDI5K.js";import{a as Nn,b as ei,c as $r}from"./chunk-VL57GII7.js";import{a as jr}from"./chunk-PQIPYWTP.js";import{c as ti}from"./chunk-TQGNNJX5.js";import{a as Un}from"./chunk-RD6G3CMN.js";import{b as Ut}from"./chunk-4ZHU4DLD.js";import{b as Gt}from"./chunk-4UKCDU64.js";import{a as jo,d as rt,e as dn,f as Tt,g as Wt}from"./chunk-LOIRZFV3.js";import{g as Mo}from"./chunk-VBZIIF5N.js";import{a as un}from"./chunk-LPUQ4HWQ.js";import{a as Xe,b as et,c as Lo}from"./chunk-VE3SUJMA.js";import{a as Oo}from"./chunk-Y6IUJZMV.js";import{a as $o}from"./chunk-LOSNFBZV.js";import{a as On}from"./chunk-PF7PBYCJ.js";import{a as Vo}from"./chunk-WFSTRBQF.js";import{a as qe}from"./chunk-S7JV4A3U.js";import{a as Mr}from"./chunk-7CBWZLRS.js";import{a as dt}from"./chunk-UHGECBEN.js";import{b as Eo}from"./chunk-C6S4IEBC.js";import{b as Vr}from"./chunk-ELZIC2EH.js";import{c as Or}from"./chunk-YB67GRWE.js";import{a as Nt}from"./chunk-GNJBT6SS.js";import{a as cn,c as je,j as ln,v as r}from"./chunk-3QWAABMG.js";import{a as M}from"./chunk-HCBYKLMW.js";import{a as g,b as n,i as ye,j as ko,k as Vn}from"./chunk-C44QQJR4.js";import{a as me}from"./chunk-6YGTRKDT.js";import{e as k}from"./chunk-UR6MHSHU.js";var S=k(me(),1);var Ai=k(me(),1);var Ht=k(M(),1);function Bi({path:e}){return e.length===0?null:(0,Ht.jsx)(g,{children:e.map((t,o)=>(0,Ht.jsxs)(Ai.default.Fragment,{children:[o>0&&(0,Ht.jsx)(n,{color:r.muted,children:" \u203A "}),(0,Ht.jsx)(n,{color:r.dim,children:t})]},o))})}var z=k(M(),1);function Pi({profile:e,environment:t,tokenValid:o,runCount:i,sessionId:m,viewMode:s,breadcrumb:u,chatMode:x,tcgRequestId:h,tcgStreamStatus:y}){let{stdout:A}=Vn(),T=A?.columns??80,C=x??"run",l=t==="stage",d=t==="prod",B=C==="generate"?r.generateAccent:r.orange,V=y==="completed"?r.green:y==="failed"?r.red:r.generateAccent;return(0,z.jsxs)(g,{flexDirection:"column",children:[(0,z.jsx)(n,{color:r.muted,children:"\u2500".repeat(T)}),u&&u.length>0&&(0,z.jsx)(g,{paddingX:1,children:(0,z.jsx)(Bi,{path:u})}),(0,z.jsxs)(g,{paddingX:1,gap:1,children:[(0,z.jsx)(n,{color:r.dim,children:"Mode:"}),(0,z.jsx)(n,{color:B,bold:!0,children:C==="generate"?"Generate":"Run"}),(0,z.jsx)(n,{color:r.muted,children:"|"}),C==="generate"?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(n,{color:r.dim,children:"req"}),(0,z.jsx)(n,{color:r.dim,children:h??"\u2014"}),y&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(n,{color:r.muted,children:"\xB7"}),(0,z.jsx)(n,{color:V,children:y})]})]}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(n,{color:r.dim,children:"Session:"}),(0,z.jsx)(n,{color:r.dim,children:m})]}),(0,z.jsx)(n,{color:r.muted,children:"|"}),(0,z.jsx)(n,{color:o?r.green:r.red,children:"\u25CF"}),(0,z.jsx)(n,{color:r.dim,children:o?"authenticated":"not logged in"}),!d&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(n,{color:r.muted,children:"|"}),l?(0,z.jsx)(n,{color:r.orange,bold:!0,children:"\u26A0 stage"}):(0,z.jsx)(n,{color:r.green,children:t})]})]}),(0,z.jsxs)(g,{paddingX:1,gap:1,children:[(0,z.jsx)(n,{color:r.dim,children:e??"no profile"}),C==="run"&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(n,{color:r.muted,children:"|"}),(0,z.jsxs)(n,{color:r.dim,children:["runs: ",i]})]}),(0,z.jsx)(n,{color:r.muted,children:"|"}),(0,z.jsx)(n,{dimColor:!0,children:Co()})]}),(0,z.jsx)(g,{paddingX:1,children:(0,z.jsx)(n,{dimColor:!0,children:s==="chat"?"ctrl+c cancel/exit":"\u2191\u2193 navigate \u21B5 select esc back"})})]})}var Bt=k(me(),1);var mn=[[[" "],[" "],[" "],[" "],["\u2584","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],[" "],[" "],[" "],[" "],[" "],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2584","#af87d7"],[" "],[" "],[" "],[" "]],[[" "],[" "],["\u2584","#875faf"],["\u2584","#af87d7","#875faf"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2584","#af87d7","#875faf"],["\u2584","#875faf"],[" "],[" "]],[[" "],[" "],["\u2588","#875faf"],["\u2588","#af87d7"],["\u2584","#000000","#af87d7"],["\u2584","#000000","#303030"],["\u2584","#000000","#303030"],["\u2584","#000000","#303030"],["\u2584","#000000","#303030"],["\u2584","#000000","#303030"],["\u2584","#000000","#303030"],["\u2584","#000000","#303030"],["\u2584","#000000","#303030"],["\u2584","#000000","#303030"],["\u2584","#000000","#303030"],["\u2584","#000000","#303030"],["\u2584","#000000","#af87d7"],["\u2588","#af87d7"],["\u2588","#875faf"],[" "],[" "]],[[" "],["\u2588","#875faf"],["\u2588","#875faf"],["\u2588","#af87d7"],["\u2588","#000000"],["\u2584","#585858","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#af87d7"],["\u2588","#875faf"],["\u2588","#875faf"],[" "]],[[" "],["\u2588","#875faf"],["\u2588","#875faf"],["\u2588","#af87d7"],["\u2588","#000000"],["\u2588","#585858"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#af87d7"],["\u2588","#875faf"],["\u2588","#875faf"],[" "]],[[" "],[" "],["\u2588","#875faf"],["\u2588","#af87d7"],["\u2588","#000000"],["\u2584","#000000","#585858"],["\u2588","#000000"],["\u2588","#000000"],["\u2584","#af87d7","#000000"],["\u2584","#af87d7","#000000"],["\u2584","#af87d7","#000000"],["\u2584","#af87d7","#000000"],["\u2584","#af87d7","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#000000"],["\u2588","#af87d7"],["\u2588","#875faf"],[" "],[" "]],[[" "],[" "],["\u2580","#875faf"],["\u2580","#af87d7"],["\u2580","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2580","#af87d7"],["\u2580","#af87d7"],["\u2580","#875faf"],[" "],[" "]],[[" "],[" "],[" "],[" "],[" "],["\u2580","#af87d7"],["\u2580","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2588","#af87d7"],["\u2580","#af87d7"],["\u2580","#af87d7"],[" "],[" "],[" "],[" "],[" "]]];var J=k(M(),1),Hn="#af87d7",Hr="#875faf",Di="#5b3a7a",ga="#ff9500",ha="#ea580c";var zr="#666666",xa="#555555",At=[[Hn,"\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588"],[Hn,"\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588"],[Hn,"\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588"],[Hn,"\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588"],[Hr,"\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588"],[Hr,"\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588"],[Hr,"\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588"]],Xr=At.map(([,e])=>[...e]);function Li({visibleRows:e=At.length}){let t=Math.min(e,At.length);return(0,J.jsxs)(g,{flexDirection:"column",children:[At.slice(0,t).map(([o,i],m)=>{let s=Xr[m];return(0,J.jsx)(n,{children:s.map((u,x)=>{if(u==="\u2588")return(0,J.jsx)(n,{color:o,children:"\u2588"},x);let h=x>0&&s[x-1]==="\u2588",y=m>0&&x>0&&Xr[m-1][x-1]==="\u2588";return h||y?(0,J.jsx)(n,{color:Di,children:"\u2592"},x):(0,J.jsx)(n,{children:" "},x)})},m)}),t>=At.length&&(0,J.jsxs)(n,{children:[" ",Xr[At.length-1].map((o,i)=>o==="\u2588"?(0,J.jsx)(n,{color:Di,children:"\u2580"},i):(0,J.jsx)(n,{children:" "},i))]})]})}function va({visibleRows:e=mn.length}){let t=Math.min(e,mn.length);return(0,J.jsx)(g,{flexDirection:"column",children:mn.slice(0,t).map((o,i)=>(0,J.jsx)(n,{children:o.map((m,s)=>{let u=m[0],x=m[1],h=m[2];return x?(0,J.jsx)(n,{color:x,backgroundColor:h,children:u},s):(0,J.jsx)(n,{children:u},s)})},i))})}function zn({size:e="compact",helmetVisibleRows:t=mn.length,textVisibleRows:o=At.length,showMeta:i=!1,user:m=null,authenticated:s=!1,version:u=""}){return e==="compact"?(0,J.jsx)(Li,{}):(0,J.jsxs)(g,{flexDirection:"column",paddingX:1,paddingY:1,children:[(0,J.jsx)(n,{color:ga,italic:!0,children:" Welcome to"}),(0,J.jsx)(n,{children:" "}),(0,J.jsxs)(g,{gap:2,children:[(0,J.jsx)(va,{visibleRows:t}),(0,J.jsxs)(g,{flexDirection:"column",children:[(0,J.jsx)(Li,{visibleRows:o}),(0,J.jsx)(g,{justifyContent:"flex-end",width:73,children:(0,J.jsx)(n,{color:ha,italic:!0,children:"Command-line interface"})})]})]}),i&&(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(n,{children:" "}),(0,J.jsxs)(n,{children:[(0,J.jsx)(n,{color:zr,children:" Browser automation powered by AI. "}),(0,J.jsx)(n,{color:xa,children:`v${u}`})]}),(0,J.jsx)(n,{children:" "}),(0,J.jsx)(n,{children:(0,J.jsx)(n,{color:zr,children:" KaneCLI can navigate websites, fill forms, test web UI, and extract"})}),(0,J.jsx)(n,{children:(0,J.jsx)(n,{color:zr,children:" data \u2014 right from your terminal."})}),(0,J.jsx)(n,{children:" "})]})]})}var Jr=k(M(),1),Kr=8,Yr=7;function ji({onComplete:e}){let[t,o]=(0,Bt.useState)(0),[i,m]=(0,Bt.useState)(0),[s,u]=(0,Bt.useState)(!1),[x]=(0,Bt.useState)(()=>{let h=new On,y=h.getActiveProfile(),A=h.getDefaultEnv(),T=y?h.loadCredentials(y,A):null,C=y?h.loadBasicAuth(y,A):null;return{authenticated:!!(T||C),user:C?.username??y??null}});return jr(()=>{o(h=>Math.min(Kr,h+1))},t<Kr?60:null),jr(()=>{m(h=>Math.min(Yr,h+1))},i<Yr?80:null),(0,Bt.useEffect)(()=>{t>=Kr&&i>=Yr&&!s&&(u(!0),e?.())},[t,i,s,e]),(0,Jr.jsx)(g,{flexDirection:"column",children:(0,Jr.jsx)(zn,{size:"full",helmetVisibleRows:t,textVisibleRows:i,showMeta:s,user:x.user,authenticated:x.authenticated,version:cn})})}var mt=k(M(),1);function Mi({entry:e}){return e.type==="input"?(0,mt.jsxs)(g,{children:[(0,mt.jsx)(n,{color:r.orange,children:"\u276F "}),(0,mt.jsx)(n,{children:e.text})]}):e.type==="error"?(0,mt.jsx)(g,{marginLeft:2,children:(0,mt.jsx)(n,{color:r.red,children:e.text})}):(0,mt.jsx)(g,{marginLeft:2,children:(0,mt.jsx)(n,{color:e.type==="info"?r.dim:void 0,children:e.text})})}var st=k(me(),1);var Me=k(M(),1);function ba(e,t){let o=[],m=Math.max(t-4,30);o.push({type:"title",text:e.title});for(let s=0;s<e.sections.length;s++){let u=e.sections[s];s>0&&o.push({type:"divider",text:"\u2500".repeat(m)}),u.label&&o.push({type:"header",text:u.label});let x=u.entries.length>0?Math.max(...u.entries.map(h=>h.key.length)):0;for(let h of u.entries){let y="\xB7".repeat(Math.max(2,x-h.key.length+3)),A=`${h.key} ${y} ${h.value}`;o.push({type:"entry",text:A,color:h.color})}}return o.push({type:"footer",text:"esc back"}),o}function Vi({data:e,width:t=60}){let o=ba(e,t);return(0,Me.jsx)(g,{flexDirection:"column",borderStyle:"round",borderColor:r.orange,paddingX:2,paddingY:1,children:o.map((i,m)=>{if(i.type==="title")return(0,Me.jsx)(n,{color:r.orange,bold:!0,children:i.text},m);if(i.type==="header")return(0,Me.jsx)(g,{marginTop:1,children:(0,Me.jsx)(n,{color:r.dim,children:i.text})},m);if(i.type==="divider")return(0,Me.jsx)(g,{marginTop:1,marginBottom:0,children:(0,Me.jsx)(n,{color:r.muted,children:i.text})},m);if(i.type==="footer")return(0,Me.jsx)(g,{marginTop:1,children:(0,Me.jsx)(n,{color:r.dim,children:i.text})},m);let s=i.text.match(/^(.+?) (·+) (.+)$/);return s?(0,Me.jsxs)(n,{children:[(0,Me.jsxs)(n,{color:r.secondary,children:[s[1]," "]}),(0,Me.jsxs)(n,{color:r.muted,children:[s[2]," "]}),(0,Me.jsx)(n,{color:i.color,children:s[3]})]},m):(0,Me.jsx)(n,{color:i.color,children:i.text},m)})})}var Ce=k(M(),1);function Qr(e,t){let o=[];function i(m,s){for(let u of m)o.push({item:u,depth:s}),u.type==="submenu"&&u.children&&t.length>s&&t[s]===u.id&&i(u.children,s+1)}return i(e,0),o}function Zr({items:e,onRunSelected:t,initialExpandedPath:o,onDismiss:i,renderLoginWizard:m,renderProfilesView:s,renderChromeProfilePicker:u,renderProjectPicker:x,renderFolderPicker:h,renderWindowSizePicker:y,onActiveViewChange:A}){let[T,C]=(0,st.useState)(()=>{let j=o??[],F=Qr(e,j),E=0;if(j.length>0){let O=F.findIndex(ee=>ee.item.id===j[0]);O>=0&&O+1<F.length&&(E=O+1)}return{expandedPath:j,selectedIndex:E,inputValue:"",isEditing:!1,isSelecting:!1,feedback:null,activeView:null,infoData:null}}),l=Qr(e,T.expandedPath),d=l[T.selectedIndex]?.item,B=(0,st.useRef)(null),V=(0,st.useCallback)(j=>{C(F=>({...F,feedback:j})),B.current&&clearTimeout(B.current),B.current=setTimeout(()=>{C(F=>({...F,feedback:null})),B.current=null},4e3)},[]);(0,st.useEffect)(()=>()=>{B.current&&clearTimeout(B.current)},[]),(0,st.useEffect)(()=>{A?.(T.activeView)},[T.activeView,A]);let $=(0,st.useCallback)(()=>{C(j=>({...j,activeView:null,infoData:null}))},[]);return ye((j,F)=>{if(T.activeView==="infoView"){F.escape&&$();return}if(!(T.activeView==="loginWizard"||T.activeView==="profilesView"||T.activeView==="chromeProfilePicker"||T.activeView==="projectPicker"||T.activeView==="folderPicker"||T.activeView==="windowSizePicker")){if(T.isEditing){if(F.escape){C(E=>({...E,isEditing:!1,inputValue:""}));return}if(F.return){let E=T.inputValue.trim();if(d?.onValue&&E){let O=d.currentValue;d.onValue(E),V(O?`${d.label}: ${O} \u2192 ${E}`:`${d.label}: ${E}`)}C(O=>({...O,isEditing:!1,inputValue:""}));return}if(F.backspace||F.delete){C(E=>({...E,inputValue:E.inputValue.slice(0,-1)}));return}j&&!F.ctrl&&!F.meta&&C(E=>({...E,inputValue:E.inputValue+j}));return}if(T.isSelecting&&d?.options){let E=d.options;if(F.escape){C(O=>({...O,isSelecting:!1}));return}if(F.upArrow){C(O=>({...O,inputValue:String(Math.max(0,Number(O.inputValue||"0")-1))}));return}if(F.downArrow){C(O=>({...O,inputValue:String(Math.min(E.length-1,Number(O.inputValue||"0")+1))}));return}if(F.return){let O=Number(T.inputValue||"0"),ee=E[O];if(ee&&d.onValue){let te=d.currentValue;d.onValue(ee.value),V(te?`${d.label}: ${te} \u2192 ${ee.label}`:`${d.label}: ${ee.label}`)}C(te=>({...te,isSelecting:!1,inputValue:""}));return}return}if(F.upArrow){C(E=>({...E,selectedIndex:Math.max(0,E.selectedIndex-1)}));return}if(F.downArrow){C(E=>({...E,selectedIndex:Math.min(l.length-1,E.selectedIndex+1)}));return}if(F.escape){if(T.expandedPath.length===0){i?.();return}C(E=>{let O=E.expandedPath.slice(0,-1),ee=Qr(e,O),te=E.expandedPath[E.expandedPath.length-1],ae=ee.findIndex(q=>q.item.id===te);return{...E,expandedPath:O,selectedIndex:ae>=0?ae:0}});return}if(F.return&&d){if(d.id==="run-start"){t();return}if(d.type==="submenu"){let E=l[T.selectedIndex]?.depth??0;C(O=>({...O,expandedPath:[...O.expandedPath.slice(0,E),d.id],selectedIndex:O.selectedIndex+1}));return}if(d.onInfo){let E=d.onInfo();C(O=>({...O,activeView:"infoView",infoData:E}));return}if(d.onLoginWizard){d.onLoginWizard(),C(E=>({...E,activeView:"loginWizard"}));return}if(d.onProfilesView){d.onProfilesView(),C(E=>({...E,activeView:"profilesView"}));return}if(d.onChromeProfilePicker){d.onChromeProfilePicker(),C(E=>({...E,activeView:"chromeProfilePicker"}));return}if(d.onProjectPicker){d.onProjectPicker(),C(E=>({...E,activeView:"projectPicker"}));return}if(d.onFolderPicker){d.onFolderPicker(),C(E=>({...E,activeView:"folderPicker"}));return}if(d.onWindowSizePicker){d.onWindowSizePicker(),C(E=>({...E,activeView:"windowSizePicker"}));return}if(d.type==="action"){d.onAction?.(),d.suppressFeedback||V(`${d.label} done`);return}if(d.type==="select"&&d.options){let E=d.options.findIndex(O=>O.value===d.currentValue);C(O=>({...O,isSelecting:!0,inputValue:String(Math.max(0,E))}));return}if(d.type==="text-input"){C(E=>({...E,isEditing:!0,inputValue:d.currentValue??""}));return}}}}),(0,Ce.jsx)(g,{flexDirection:"column",paddingX:1,children:T.activeView==="infoView"&&T.infoData?(0,Ce.jsx)(Vi,{data:T.infoData}):T.activeView==="loginWizard"&&m?m($):T.activeView==="profilesView"&&s?s($):T.activeView==="chromeProfilePicker"&&u?u($):T.activeView==="projectPicker"&&x?x($):T.activeView==="folderPicker"&&h?h($):T.activeView==="windowSizePicker"&&y?y($):(0,Ce.jsxs)(Ce.Fragment,{children:[l.map(({item:j,depth:F},E)=>{let O=E===T.selectedIndex,ee=" ".repeat(F),te=O?"\u276F ":" ",ae=j.type==="submenu"?T.expandedPath.includes(j.id)?"\u25BC ":"\u25B6 ":" ",q=j.currentValue!=null?` [${j.currentValue}]`:"";if(O&&T.isSelecting&&j.options){let ue=Number(T.inputValue||"0");return(0,Ce.jsxs)(g,{flexDirection:"column",children:[(0,Ce.jsxs)(n,{color:r.orange,children:[ee,te,ae,j.label]}),j.options.map((be,Ve)=>(0,Ce.jsxs)(n,{color:Ve===ue?r.orange:void 0,children:[ee," ",Ve===ue?"\u276F ":" ",be.label]},be.value))]},j.id)}return O&&T.isEditing?(0,Ce.jsxs)(n,{color:r.orange,children:[ee,te,ae,j.label,": ",T.inputValue,(0,Ce.jsx)(n,{color:r.dim,children:"\u2588"})]},j.id):(0,Ce.jsxs)(n,{color:O?r.orange:void 0,dimColor:!O&&F>0,children:[ee,te,ae,j.label,(0,Ce.jsx)(n,{dimColor:!0,children:q})]},j.id)}),T.feedback&&(0,Ce.jsx)(g,{marginTop:1,children:(0,Ce.jsxs)(n,{color:r.green,children:["\u2713 ",T.feedback]})}),(0,Ce.jsx)(Nt,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"select"}],escBackLabel:"back"})]})})}var fn=k(me(),1);var Ae=k(M(),1),eo=800,to=3840,no=600,ro=2160;function Oi(e,t){if(!t)return"Enter a value";let o=Number(t);if(!Number.isInteger(o))return"Must be a whole number";if(e==="width"){if(o<eo)return`Min ${eo}`;if(o>to)return`Max ${to}`}else{if(o<no)return`Min ${no}`;if(o>ro)return`Max ${ro}`}return null}function oo({currentWidth:e,currentHeight:t,onSelect:o,onCancel:i}){let[m,s]=(0,fn.useState)("width"),[u,x]=(0,fn.useState)(String(e)),[h,y]=(0,fn.useState)(String(t)),[A,T]=(0,fn.useState)(null);ye((l,d)=>{if(d.escape){i();return}if(d.tab||d.rightArrow||d.leftArrow){s(B=>B==="width"?"height":"width"),T(null);return}if(d.return){let B=Oi("width",u);if(B){s("width"),T(`Width: ${B}`);return}let V=Oi("height",h);if(V){s("height"),T(`Height: ${V}`);return}o(Number(u),Number(h));return}if(d.backspace||d.delete){m==="width"?x(B=>B.slice(0,-1)):y(B=>B.slice(0,-1)),T(null);return}l&&/^\d$/.test(l)&&(m==="width"?x(B=>B+l):y(B=>B+l),T(null))});let C=(l,d,B)=>{let V=m===B,$=V?r.orange:r.secondary;return(0,Ae.jsxs)(g,{flexDirection:"column",children:[(0,Ae.jsxs)(n,{color:r.dim,children:[" ",l]}),(0,Ae.jsx)(g,{borderStyle:"round",borderColor:$,paddingX:1,width:10,children:(0,Ae.jsxs)(n,{color:V?void 0:r.dim,children:[d||" ",V?(0,Ae.jsx)(n,{color:r.dim,children:"\u2588"}):""]})}),(0,Ae.jsxs)(n,{color:r.dim,dimColor:!0,children:[" ",B==="width"?`${eo}\u2013${to}`:`${no}\u2013${ro}`]})]})};return(0,Ae.jsxs)(g,{flexDirection:"column",paddingX:1,children:[(0,Ae.jsx)(n,{color:r.orange,bold:!0,children:"Window Size"}),(0,Ae.jsxs)(g,{marginTop:1,gap:1,children:[C("Width",u,"width"),(0,Ae.jsx)(g,{alignItems:"center",marginTop:1,children:(0,Ae.jsx)(n,{color:r.dim,children:"x"})}),C("Height",h,"height")]}),A&&(0,Ae.jsx)(g,{marginTop:1,children:(0,Ae.jsx)(n,{color:r.red,children:A})}),(0,Ae.jsx)(Nt,{bindings:[{keys:"tab/\u2190\u2192",label:"switch field"},{keys:"\u21B5",label:"save"}],escBackLabel:"cancel"})]})}var Be=k(me(),1);async function $i(e,t,o){let i=e.loadCredentials(t,o),m=e.loadClient(t,o);if(i&&m){let u=new Vo(o);await Promise.allSettled([u.revokeToken(i.access_token,m.client_id,"access_token"),u.revokeToken(i.refresh_token,m.client_id,"refresh_token")])}e.deleteProfileFull(t,o);let s=e.listProfiles();return s.length>0&&(e.setActiveProfile(s[0].profile),e.setDefaultEnv(s[0].env)),{profile:t,env:o,switchedTo:s.length>0?s[0]:void 0}}function Fi(){let[e]=(0,Be.useState)(()=>new On),[t,o]=(0,Be.useState)(()=>{let d=e.resolveAuth();if(!d)return!1;if(d.method==="basic")return!0;let{credentials:B}=e.getActiveCredentials();return B?B.expires_at>Date.now()/1e3:!1}),i=(0,Be.useRef)(null),m=(0,Be.useRef)(null),s=(0,Be.useCallback)(()=>{let d=e.resolveAuth();return d?{method:d.method,profile:d.profile,env:d.env}:null},[e]),u=(0,Be.useCallback)(async()=>{let{credentials:d,profile:B,env:V}=e.getActiveCredentials();if(!d||!B||!V)return null;let $=d.expires_at,j=Date.now()/1e3;if($-j<300){if(m.current)return m.current;let F=(async()=>{try{let E=await Oo({creds:e,profile:B,env:V,credentials:d});return E?(o(!0),E.accessToken):null}catch{return o(!1),null}finally{m.current=null}})();return m.current=F,F}return o(!0),d.access_token},[e]),x=(0,Be.useCallback)(()=>{let d=e.resolveAuth();return!d||d.method!=="basic"?null:{username:d.username,access_key:d.access_key}},[e]),h=(0,Be.useCallback)((d,B)=>{i.current?.revoke();let V=qe(d),$=x(),j=new Fo(V.controllerBaseUrl,u,$,B);return i.current=j,j},[x,u]),y=(0,Be.useCallback)(()=>i.current,[]),A=(0,Be.useCallback)(()=>{let d=x();if(d)return d;let B=i.current?.cached;return B?{username:B.username,access_key:B.access_key}:null},[x]),T=(0,Be.useCallback)(async()=>{let d=i.current;return d?d.resolve():null},[]),C=(0,Be.useCallback)(async(d="default")=>{let B=e.getDefaultEnv();await new $o(d,B,e).login(),e.setActiveProfile(d);try{let $=new qt;Xe(e,$,d,B)}catch{}o(!0)},[e]),l=(0,Be.useCallback)(async()=>{let d=e.getActiveProfile();if(!d)return null;let B=e.getDefaultEnv(),V=await $i(e,d,B);return o(!1),{profile:V.profile,env:V.env}},[e]);return{creds:e,tokenValid:t,setTokenValid:o,getToken:u,getBasicAuth:x,getAuthInfo:s,login:C,logout:l,initResolver:h,getResolver:y,getResolvedBasicAuth:A,resolveBasicAuth:T}}var ft=k(me(),1);import{mkdtempSync as ya,rmSync as Ta}from"fs";import{join as wa}from"path";import{tmpdir as Sa}from"os";function Ni(){let[e]=(0,ft.useState)(()=>new qt),t=(0,ft.useRef)(null),o=(0,ft.useRef)(null),i=(0,ft.useRef)(null),m=(0,ft.useCallback)(async u=>{if(t.current)return t.current;if(i.current)return i.current;let x=(async()=>{let h=e.load(),y;if(h.chrome_profile_path)y=h.chrome_profile_path.replace("~",process.env.HOME??"~");else{o.current&&(Tt("tempDir","Previous temp dir removed before retry"),o.current=null);let T=ya(wa(Sa(),"kane-clean-"));o.current=T,y=T,rt("tempDir",()=>{try{Ta(T,{recursive:!0,force:!0})}catch{}})}let A=await Uo({userDataDir:y,width:h.window_size.width,height:h.window_size.height,startUrl:u??h.default_url??void 0});return t.current=A,rt("chrome",()=>{A.kill()}),A})();i.current=x;try{return await x}finally{i.current=null}},[e]),s=(0,ft.useCallback)(()=>{Tt("chrome","Chrome killed"),Tt("tempDir","Temp dir removed"),t.current=null,o.current=null},[]);return{ensureChrome:m,killChrome:s}}var Xn=[{name:"run",description:"Execute a test run",args:'"objective"'},{name:"login",description:"OAuth login",args:"[--profile name]"},{name:"logout",description:"Logout & revoke tokens",args:"[--profile name]"},{name:"whoami",description:"Show profile info",args:"[--profile name]"},{name:"balance",description:"Show credit balance"},{name:"profiles",description:"Manage profiles",args:"list|switch|delete"},{name:"config",description:"Manage configuration",args:"show|set-window|set-mode|chrome-profile|project|folder"},{name:"new",description:"Start a fresh session (uploads current first)"},{name:"name",description:"Set the current session's name (used at /exit save)",args:"<new-name>"},{name:"summary",description:"View detailed run summaries",args:"[index]"},{name:"cancel",description:"Abort current run"},{name:"help",description:"Show command reference"},{name:"clear",description:"Clear chat history"},{name:"exit",description:"Quit kane-cli"}];function Kn(e){let t=e.trim();if(!t.startsWith("/"))return null;let i=t.slice(1).match(/(?:[^\s"]+|"[^"]*")+/g)??[];if(i.length===0)return null;let m=i[0],s={},u=1;for(;u<i.length;){let x=i[u];if(x.startsWith("--")){let h=x.slice(2),y=i[u+1];y&&!y.startsWith("--")?(s[h]=y.replace(/^"|"$/g,""),u+=2):(s[h]=void 0,u++)}else{let h=x.replace(/^"|"$/g,"");m==="run"?s.objective=h:m==="config"?s.action?s.value=h:s.action=h:m==="profiles"?s.action=h:m==="summary"&&(s.index=h),u++}}return{command:m,args:s,raw:t}}var Rl=[{name:"Testing",commands:Xn.filter(e=>["run","cancel"].includes(e.name))},{name:"Auth",commands:Xn.filter(e=>["login","logout","whoami","balance","profiles"].includes(e.name))},{name:"Settings",commands:Xn.filter(e=>["config"].includes(e.name))},{name:"Session",commands:Xn.filter(e=>["new","name","summary","help","clear","exit"].includes(e.name))}];var Ui=[{name:"testmd",description:"Browse & run saved tests under cwd"},{name:"auth",description:"Login, logout, profiles"},{name:"config",description:"View/change settings"},{name:"help",description:"Command reference"},{name:"new",description:"Start a fresh session"},{name:"name",description:"Set the session name",args:"<new-name>"},{name:"exit",description:"Quit kane-cli"}],Ra={name:"cancel",description:"Abort current run"},ka={name:"cancel",description:"Cancel current generation"},zt=[{name:"generate",description:"Switch to Generate mode (test case generator)"},{name:"summary",description:"View run summaries",args:"[index]"},Ra,...Ui],pn=[{name:"run",description:"Switch back to Run mode"},{name:"save",description:"Save the current test cases"},{name:"view",description:"Open the scenario browser",args:"[S<n>]"},ka,...Ui],Gi=zt;function Yn(e,t="run"){let o=t==="generate"?pn:zt,i=e.startsWith("/")?e.slice(1):e;return i?o.filter(m=>m.name.startsWith(i)):o}var Ca=new Set([...zt,...pn].map(e=>e.name));function qi(e,t){let o=t==="generate"?pn:zt;return Ca.has(e)?o.some(i=>i.name===e):!0}function Wi(e,t){let o=t?.trim();return o?e==="generate"?{kind:"reject"}:{kind:"run",objective:o}:e==="generate"?{kind:"toggle"}:{kind:"already"}}var wt=k(M(),1);function io({flows:e,filterIndex:t}){let o=t!==void 0?e.filter(i=>i.index===t):e;return o.length===0?null:(0,wt.jsx)(g,{flexDirection:"column",children:o.map(i=>(0,wt.jsxs)(g,{flexDirection:"column",marginTop:1,children:[(0,wt.jsxs)(g,{marginLeft:1,children:[(0,wt.jsx)(n,{color:r.purple,bold:!0,children:"Flow "+i.index+": "}),(0,wt.jsx)(n,{color:r.purple,children:i.objective})]}),(0,wt.jsx)(Xo,{status:i.status==="error"?"failed":i.status,summary:i.summary,duration:i.duration,steps:i.steps,stepsPassed:i.stepsPassed,stepsFailed:i.stepsFailed,reason:i.reason,creditsConsumed:i.creditsConsumed})]},i.index))})}var St=k(M(),1),Ia={ok:"\u2713",error:"\u2717",cancelled:"\u2298"},Ea={ok:r.green,error:r.red,cancelled:r.dim};function Hi({status:e,command:t,message:o,details:i,accentColor:m}){let s=t.startsWith("/")?t.slice(1):t,u=m??Ea[e];return(0,St.jsxs)(g,{flexDirection:"column",marginLeft:2,marginTop:1,children:[(0,St.jsx)(g,{marginLeft:1,children:(0,St.jsxs)(n,{color:u,bold:!0,children:[Ia[e]," ",s]})}),(0,St.jsxs)(g,{borderStyle:"round",borderColor:u,paddingX:2,flexDirection:"column",width:70,children:[(0,St.jsx)(n,{children:o}),i&&(0,St.jsx)(n,{color:r.dim,children:i})]})]})}var vn=k(me(),1);import{join as hn}from"path";var gn=k(M(),1);function zi({tabs:e,activeIndex:t}){return(0,gn.jsx)(g,{children:e.map((o,i)=>(0,gn.jsx)(g,{marginRight:1,children:i===t?(0,gn.jsx)(n,{color:r.orange,bold:!0,children:`[ ${o} ]`}):(0,gn.jsx)(n,{color:r.dim,children:` ${o} `})},o))})}var R=k(M(),1),xn=["Commands","Shortcuts","Tests","Setup","About"],Jn=18,_a="https://www.testmuai.com/support/docs/kane-cli-introduction",Aa="https://github.com/LambdaTest/kane-cli/issues";function Xi({onClose:e,version:t,environment:o,sessionId:i,runUrl:m,mode:s="run"}){let[u,x]=(0,vn.useState)(0),[h,y]=(0,vn.useState)(0);(0,vn.useEffect)(()=>{y(0)},[u]);let A=xn[u],T=A==="Commands"?Ba(s):A==="Shortcuts"?Pa():A==="Tests"?Da():A==="Setup"?La():ja({version:t,environment:o,sessionId:i,runUrl:m}),C=T.length,l=h>0,d=h+Jn<C,B=T.slice(h,h+Jn);ye(($,j)=>{if(j.escape){e();return}if(j.rightArrow||j.tab){x(F=>(F+1)%xn.length);return}if(j.leftArrow){x(F=>(F-1+xn.length)%xn.length);return}if(j.upArrow){y(F=>Math.max(0,F-1));return}if(j.downArrow){y(F=>Math.min(Math.max(0,C-Jn),F+1));return}});let V=[{keys:"\u2190\u2192/tab",label:"switch tabs"}];return C>Jn&&V.push({keys:"\u2191\u2193",label:"scroll"}),(0,R.jsxs)(g,{flexDirection:"column",borderStyle:"round",borderColor:r.orange,paddingX:2,paddingY:1,children:[(0,R.jsx)(zi,{tabs:[...xn],activeIndex:u,onChange:x}),l&&(0,R.jsx)(g,{marginTop:1,children:(0,R.jsx)(n,{color:r.dim,children:"\u25B2 more above"})}),(0,R.jsx)(g,{marginTop:l?0:1,flexDirection:"column",children:B}),d&&(0,R.jsx)(g,{children:(0,R.jsx)(n,{color:r.dim,children:"\u25BC more below"})}),(0,R.jsx)(Nt,{bindings:V,escBackLabel:"back to chat"})]})}function Ba(e){let t=e==="generate"?pn:zt;return[(0,R.jsx)(n,{color:r.dim,children:"Type a natural-language objective and press \u21B5 to run, e.g."},"intro"),(0,R.jsx)(g,{marginLeft:2,children:(0,R.jsx)(n,{color:r.orange,children:'"search amazon for laptop"'})},"ex"),(0,R.jsx)(g,{marginBottom:1},"sp"),(0,R.jsx)(n,{color:r.dim,bold:!0,children:"Slash commands"},"cmd-h"),...t.map(o=>(0,R.jsxs)(g,{marginLeft:2,children:[(0,R.jsx)(g,{width:14,children:(0,R.jsxs)(n,{color:r.orange,children:["/",o.name]})}),o.args&&(0,R.jsx)(g,{width:14,children:(0,R.jsx)(n,{color:r.dim,children:o.args})}),(0,R.jsx)(n,{color:r.dim,children:o.description})]},o.name)),(0,R.jsx)(g,{marginBottom:1},"sp2"),(0,R.jsx)(g,{marginLeft:2,children:(0,R.jsx)(n,{color:r.dim,children:"/auth submenu: login \xB7 logout \xB7 whoami \xB7 profiles \xB7 balance"})},"auth-sub"),(0,R.jsx)(g,{marginLeft:2,children:(0,R.jsx)(n,{color:r.dim,children:"/config submenu: show \xB7 set-mode \xB7 set-window \xB7 chrome-profile \xB7 project \xB7 folder"})},"config-sub")]}function Qn(e,t){return[(0,R.jsx)(n,{color:r.dim,bold:!0,children:e},`h-${e}`),...t.map(([o,i],m)=>(0,R.jsxs)(g,{marginLeft:2,children:[(0,R.jsx)(g,{width:26,children:(0,R.jsx)(n,{color:r.orange,children:o})}),(0,R.jsx)(n,{color:r.dim,children:i})]},`r-${e}-${m}`)),(0,R.jsx)(g,{marginBottom:1},`s-${e}`)]}function Pa(){return[...Qn("Cursor & word edit",[["\u2190 \u2192","Cursor by char"],["Ctrl+A Ctrl+E","Start / end of line"],["Home End","Start / end (Linux/Win; rare on Mac laptops)"],["Backspace","Delete char before cursor"],["Ctrl+W","Delete word back"],["Ctrl+U","Clear input"],["Ctrl+K","Kill from cursor to end"],["Ctrl+\u2190 Ctrl+\u2192","Word jump (Linux/Win, iTerm2)"],["Option+\u2190 Option+\u2192","Word jump (Mac native)"],["Option+B Option+F","Word jump (Mac, Emacs-style)"],["Alt+Backspace","Delete word back (Option+Delete on Mac)"],["Ctrl+Delete Option+Fn+Del","Delete word forward"]]),...Qn("History & completion",[["\u2191 \u2193","Previous / next history"],["Tab","Accept ghost / fill highlighted command"],["Ctrl+R","Reverse-search history"],["\u21B5","Submit"],["Esc","Close overlay / clear / back"]]),...Qn("Lists & menus",[["\u2191 \u2193","Navigate"],["type any char","Filter"],["\u21B5","Select"],["Tab","Create-new (in pickers)"],["Esc","Clear filter, then back"]]),...Qn("Global",[["Ctrl+C","Cancel run \xB7 twice exits"]]),(0,R.jsx)(n,{color:r.dim,bold:!0,children:"Platform caveats"},"cv-h"),(0,R.jsx)(n,{color:r.dim,children:'\u2022 Mac Terminal.app: enable "Use Option as Meta key" (Profile \u2192 Keyboard)'},"cv-1"),(0,R.jsx)(n,{color:r.dim,children:"\u2022 Mac iTerm2: works by default (Esc+ mode)"},"cv-2"),(0,R.jsx)(n,{color:r.dim,children:"\u2022 Mac Mission Control may intercept Ctrl+arrow \u2014 use Option+arrow instead"},"cv-3"),(0,R.jsx)(n,{color:r.dim,children:"\u2022 Bare Forward Delete acts as Backspace (Ink can't disambiguate)"},"cv-4"),(0,R.jsx)(n,{color:r.dim,children:"\u2022 Shift+arrow is parsed but unbound (selection model is future)"},"cv-5"),(0,R.jsx)(n,{color:r.dim,children:"\u2022 Thousands of terminals exist \u2014 if a shortcut fails, run `cat` to see bytes"},"cv-6")]}function Da(){return[(0,R.jsxs)(n,{color:r.dim,children:["Sessions you run here are saved as ",(0,R.jsx)(n,{color:r.orange,children:"*_test.md"})," files you can replay later."]},"t-intro"),(0,R.jsx)(g,{marginBottom:1},"t-sp1"),(0,R.jsx)(n,{color:r.dim,bold:!0,children:"Auto-save"},"t-save-h"),(0,R.jsxs)(n,{color:r.dim,children:[" In ",(0,R.jsx)(n,{color:r.orange,children:"testing"})," mode, /exit prompts to save the session under a name (default: timestamp)."]},"t-save-1"),(0,R.jsxs)(n,{color:r.dim,children:[" In ",(0,R.jsx)(n,{color:r.orange,children:"action"})," mode, sessions are ephemeral unless launched with --name or set via /name."]},"t-save-2"),(0,R.jsxs)(n,{color:r.dim,children:[" Output: ",(0,R.jsx)(n,{color:r.orange,children:"<cwd>/.testmuai/tests/<name>_test.md"})," + sibling ",(0,R.jsx)(n,{color:r.orange,children:"output-<name>/"})," (Result.md + .internal/meta.json)."]},"t-save-3"),(0,R.jsx)(g,{marginBottom:1},"t-sp2"),(0,R.jsx)(n,{color:r.dim,bold:!0,children:"Replay from a shell"},"t-run-h"),(0,R.jsxs)(n,{color:r.dim,children:[" ",(0,R.jsx)(n,{color:r.orange,children:"kane-cli testmd run path/to/foo_test.md"})," \xB7 ",(0,R.jsx)(n,{color:r.orange,children:"kane-cli testmd list"})," \xB7 bare ",(0,R.jsx)(n,{color:r.orange,children:"kane-cli testmd"})," opens a TTY picker."]},"t-run-1"),(0,R.jsx)(n,{color:r.dim,children:" The .md file carries its own config (mode, max_steps, variables, \u2026) so the replay is reproducible."},"t-run-2"),(0,R.jsx)(g,{marginBottom:1},"t-sp3"),(0,R.jsx)(n,{color:r.dim,bold:!0,children:"Naming a session mid-run"},"t-name-h"),(0,R.jsxs)(n,{color:r.dim,children:[" Type ",(0,R.jsxs)(n,{color:r.orange,children:["/name ","<new-name>"]})," any time before /exit. Name allowed chars: letters, digits, _, -."]},"t-name-1"),(0,R.jsxs)(n,{color:r.dim,children:[" Discarding at the save prompt: press ",(0,R.jsx)(n,{color:r.orange,children:"N"})," (only key that discards \u2014 every other key saves with default)."]},"t-name-2")]}function La(){return[(0,R.jsx)(n,{color:r.dim,bold:!0,children:"1. Login"},"s1-h"),(0,R.jsx)(n,{color:r.dim,children:" /auth \u2192 login. OAuth opens browser; basic uses LambdaTest username + access key."},"s1-b"),(0,R.jsx)(n,{color:r.dim,bold:!0,children:"2. Project & folder"},"s2-h"),(0,R.jsx)(n,{color:r.dim,children:" /config project / /config folder. Esc auto-picks KaneAI Generated / Untitled."},"s2-b"),(0,R.jsx)(n,{color:r.dim,bold:!0,children:"3. Mode"},"s3-h"),(0,R.jsx)(n,{color:r.dim,children:" testing (saves to TMS) | action (local report). /config set-mode"},"s3-b"),(0,R.jsx)(g,{marginBottom:1},"spacer-1"),(0,R.jsx)(n,{color:r.dim,bold:!0,children:"Variables (later wins)"},"v-h"),(0,R.jsxs)(n,{color:r.dim,children:[" ",`${hn(je,"variables")}/*.json`," (global)"]},"v-1"),(0,R.jsxs)(n,{color:r.dim,children:[" ","{cwd}/.testmuai/variables/*.json"," (local) \xB7 --variables-file \xB7 --variables ","'{...}'"]},"v-2"),(0,R.jsx)(n,{color:r.dim,children:' Format: { "key": { "value": "...", "secret": false } } \xB7 ref via {{key}}'},"v-3"),(0,R.jsx)(g,{marginBottom:1},"spacer-2"),(0,R.jsx)(n,{color:r.dim,bold:!0,children:"Context files"},"c-h"),(0,R.jsxs)(n,{color:r.dim,children:[" Global: ",hn(je,"global-memory.md")]},"c-1"),(0,R.jsxs)(n,{color:r.dim,children:[" Local: ","{cwd}/.testmuai/context.md"," \xB7 CLI: --global-context, --local-context"]},"c-2"),(0,R.jsx)(g,{marginBottom:1},"spacer-3"),(0,R.jsx)(n,{color:r.dim,bold:!0,children:"Paths"},"p-h"),(0,R.jsxs)(n,{color:r.dim,children:[" Config: ",hn(je,"tui-config.json")," \xB7 Auth: ",hn(je,"config.json")]},"p-1"),(0,R.jsxs)(n,{color:r.dim,children:[" Sessions: ",hn(je,"sessions"),"/"]},"p-2")]}function ja({version:e,environment:t,sessionId:o,runUrl:i}){return[(0,R.jsxs)(g,{children:[(0,R.jsx)(n,{color:r.orange,bold:!0,children:"kane-cli "}),(0,R.jsxs)(n,{color:r.muted,children:["v",e]})]},"title"),(0,R.jsx)(g,{marginBottom:1},"sp"),(0,R.jsxs)(g,{children:[(0,R.jsx)(g,{width:14,children:(0,R.jsx)(n,{color:r.dim,children:"Environment"})}),(0,R.jsx)(n,{children:t})]},"env"),(0,R.jsxs)(g,{children:[(0,R.jsx)(g,{width:14,children:(0,R.jsx)(n,{color:r.dim,children:"Session"})}),(0,R.jsx)(n,{children:o})]},"sess"),(0,R.jsxs)(g,{children:[(0,R.jsx)(g,{width:14,children:(0,R.jsx)(n,{color:r.dim,children:"Default URL"})}),(0,R.jsx)(n,{color:r.orange,children:i})]},"url"),(0,R.jsx)(g,{marginBottom:1},"sp2"),(0,R.jsxs)(g,{children:[(0,R.jsx)(g,{width:14,children:(0,R.jsx)(n,{color:r.dim,children:"Docs"})}),(0,R.jsx)(n,{color:r.orange,underline:!0,children:_a})]},"docs"),(0,R.jsxs)(g,{children:[(0,R.jsx)(g,{width:14,children:(0,R.jsx)(n,{color:r.dim,children:"Bugs"})}),(0,R.jsx)(n,{color:r.orange,underline:!0,children:Aa})]},"bugs")]}var Zn=k(me(),1);import{existsSync as Ki,readFileSync as zl,rmSync as Ma,unlinkSync as Va}from"fs";function Yi(e){let t=Ko(e);Ki(t)&&Ma(t,{recursive:!0,force:!0}),Ki(e)&&Va(e)}var so=k(M(),1);function Ji({cwd:e,currentOrgId:t,onClose:o,onRun:i,onExport:m}){let[s,u]=(0,Zn.useState)("list"),[x,h]=(0,Zn.useState)(null),[y,A]=(0,Zn.useState)(0);return s==="inspect"&&x?(0,so.jsx)(Jo,{path:x.path,relPath:x.relPath,onBack:()=>u("list"),onAction:T=>{if(T==="run")i(x);else if(T==="export")m(x);else{try{Yi(x.path)}catch{}h(null),u("list"),A(C=>C+1)}}}):(0,so.jsx)(Yo,{root:e,currentOrgId:t,onSelect:T=>{h(T),u("inspect")},onCancel:o},y)}var Pe=k(me(),1);function Qi(e){let[t,o]=(0,Pe.useState)(null),[i,m]=(0,Pe.useState)(!1),[s,u]=(0,Pe.useState)(null),[x,h]=(0,Pe.useState)(null),[y,A]=(0,Pe.useState)(null),T=(0,Pe.useRef)(0),C=(0,Pe.useRef)([]),l=(0,Pe.useRef)(!1),d=(0,Pe.useRef)(null),B=(0,Pe.useRef)(e);B.current=e;let V=(0,Pe.useCallback)(async F=>{if(l.current)return null;l.current=!0;let E=++T.current,O=[];C.current=O;let ee=q=>`testmd-run-${E}-${q}`,te={register:(q,ue)=>{let be=ee(q);O.push(be),rt(be,ue)},deregister:q=>dn(ee(q)),cleanup:(q,ue)=>Tt(ee(q),ue),remoteLogger:B.current.remoteLogger},ae={runSteps:q=>new Promise(ue=>{let be=()=>{d.current=null,ue()};d.current=be,o({...q,exitOnComplete:!1,onAllComplete:()=>{q.onAllComplete?.(),be()}})}),onLockState:q=>{},onRetryAttempt:q=>{},onSummary:async q=>{u(q)},onLinks:async q=>{h(q)},runUpload:q=>q.execute(),onAgentEvent:q=>{}};m(!0),u(null),h(null),A(null);try{let q=await B.current.buildInput(F),ue=await di(q,ae,te);return A(ue),ue}finally{l.current=!1,d.current=null,m(!1),o(null);for(let q of O)Tt(q,"run-finished");O.length=0}},[]),$=(0,Pe.useCallback)(()=>{for(let E of C.current)Tt(E,"cancelled");C.current=[];let F=d.current;d.current=null,F?.()},[]),j=(0,Pe.useCallback)(()=>{u(null),h(null),A(null)},[]);return{start:V,cancel:$,clearResult:j,running:i,runViewProps:t,summary:s,links:x,runSummary:y}}var Ie=k(me(),1);function Zi(e={}){let[t,o]=(0,Ie.useState)(()=>Gn({requestId:"",objective:""})),[i,m]=(0,Ie.useState)(!1),[s,u]=(0,Ie.useState)(null),x=(0,Ie.useRef)(null),h=(0,Ie.useRef)(!1),y=(0,Ie.useRef)(null),A=(0,Ie.useCallback)(async(V,$,j)=>{h.current=!1;let F=0,E=0,O=0;for await(let ee of V){if(h.current)break;switch(o(te=>gi(te,ee)),ee.type){case"thinking_done":j?.("tcg_thinking",{tookMs:ee.tookMs});break;case"progress":{let te=Math.min(100,Math.floor(ee.pct/25)*25);te>O&&(O=te,j?.("tcg_progress",{pct:te}));break}case"snapshot":F=ee.data.scenarios.length,E=ee.data.scenarios.reduce((te,ae)=>te+(ae.test_cases?.length??0),0),j?.("tcg_snapshot",{scenarioCount:F,caseCount:E});break;case"clarification":j?.("tcg_clarification",{});break;case"done":j?.("tcg_request_done",{status:ee.status,scenarioCount:F,caseCount:E,durationMs:Date.now()-$});break;case"error":j?.("tcg_request_error",{errorCode:"tcg_request_failed",durationMs:Date.now()-$});break}}},[]),T=(0,Ie.useCallback)(async(V,$)=>{if(x.current)throw new Error("useTcgSession: a session is already active; call reset() or end() first");let j=e.makeClient??hi;x.current=j(V),y.current=new AbortController;let F=Gn({requestId:"",objective:$.prompt});o(qn(F));let E;try{E=await x.current.start($,y.current.signal)}catch(ee){throw x.current=null,y.current=null,o(te=>({...te,turnActive:!1})),ee}u(E.requestId),o(qn({...E.state,requestId:E.requestId,objective:$.prompt}));let O=Date.now();e.log?.("tcg_request_start",{request_id:E.requestId,objectiveChars:$.prompt.length,scenarioLimit:$.scenarioLimit,perScenarioLimit:$.perScenarioLimit,memoryEnhancement:$.memoryEnhancement}),await A(E.events,O,e.log)},[A,e.makeClient,e.log]),C=(0,Ie.useCallback)(async(V,$)=>{if(!x.current||!s)throw new Error("useTcgSession: chat() with no active request");o(j=>qn(pi(j)));try{await x.current.chat(s,V,$)}catch(j){throw o(F=>({...F,turnActive:!1})),j}},[s]),l=(0,Ie.useCallback)(async()=>{if(!(!s||!x.current)){h.current=!0,y.current&&y.current.abort();try{await x.current.cancel(s)}catch{}x.current=null,u(null),o(V=>({...V,turnActive:!1}))}},[s]),d=(0,Ie.useCallback)(async()=>{if(!(!s||!x.current)){h.current=!0,y.current&&y.current.abort();try{await x.current.end(s)}catch{}x.current=null,u(null),o(V=>({...V,turnActive:!1}))}},[s]),B=(0,Ie.useCallback)(()=>{h.current=!0,y.current&&y.current.abort(),y.current=null,o(Gn({requestId:"",objective:""})),u(null),m(!1),x.current=null},[]);return(0,Ie.useEffect)(()=>()=>{h.current=!0,y.current&&y.current.abort()},[]),{state:t,isStreaming:t.turnActive,isTerminal:fi(t.status),isReconnecting:i,turnActive:t.turnActive,inReview:t.scenarios.length>0&&!t.turnActive&&!Gr(t.status),isSessionClosed:Gr(t.status),requestId:s,startWith:T,chat:C,cancel:l,end:d,reset:B}}var Y=k(me(),1);import{join as Xt,resolve as Ya}from"path";import{mkdirSync as co,writeFileSync as ps,appendFileSync as Ja}from"fs";function es(e){let t=qe(e.env);return!t||!t.testGeneratorBaseUrl?{ok:!1,error:`Unknown environment "${e.env}" \u2014 fix default_env via /config`}:{ok:!0,conn:{baseUrl:`${t.testGeneratorBaseUrl}/test-generator/api/v2`,tmsBaseUrl:t.tmsBaseUrl,authResolver:e.resolver,projectId:e.projectId,folderId:e.folderId,log:e.log}}}function ts(e){return e.turnActive?!0:e.requestId!=null&&!e.isSessionClosed&&!e.saved}function ns(e){return e.isRunning||e.hasLiveResults}function rs(e){let t=(e??"").trim().match(/^[sS](\d+)$/);if(!t)return{level:"scenarios"};let o=parseInt(t[1],10);return o<1?{level:"scenarios"}:{level:"cases",scenarioIdx:o-1}}function os(e,t){return`S${e+1}.C${t+1}`}function is(e,t){return e.reduce((o,i)=>o+(i.test_cases??[]).filter(m=>!t.has(m.id)).length,0)}function ss(e,t){return e.map(o=>({...o,test_cases:(o.test_cases??[]).filter(i=>!t.has(i.id))})).filter(o=>(o.test_cases??[]).length>0)}var bn=k(me(),1);import{createHash as Oa}from"crypto";function $a(e){return Oa("sha1").update(JSON.stringify({t:e.title,p:e.preconditions,m:e.manual_steps})).digest("hex")}var er=class{constructor(t){this.deps=t;this.max=t.maxConcurrent??3}cache=new Map;caseById=new Map;queue=[];active=0;max;onSnapshot(t){t.forEach((o,i)=>{(o.test_cases??[]).forEach((m,s)=>{if(!it(m)||m.manual_steps==null)return;let u=$a(m),x=this.cache.get(m.id);x&&x.hash===u||(x?.controller?.abort(),this.caseById.set(m.id,m),this.cache.set(m.id,{hash:u,ref:os(i,s),status:"pending"}),this.queue.includes(m.id)||this.queue.push(m.id))})}),this.pump()}pump(){for(;this.active<this.max&&this.queue.length>0;){let t=this.queue.shift(),o=this.cache.get(t),i=this.caseById.get(t);!o||!i||o.status!=="pending"||(this.active++,this.runOne(t,i,o))}}async runOne(t,o,i){let m=`bifurcation-${t}`,s=new AbortController;i.controller=s;let u=this.deps.run??this.defaultRun.bind(this);rt(m,()=>s.abort());let x=Date.now();try{this.safeLog("tcg_bif_start",{caseId:t,ref:i.ref});let h=await u(Ti(o),s.signal);if(!s.signal.aborted&&this.cache.get(t)===i){i.status="done",i.result=h;try{this.deps.persist?.(t,h,i.ref)}catch{}this.safeLog("tcg_bif_done",{caseId:t,ref:i.ref,total_flows:h.total_flows,is_single_flow:h.is_single_flow,estimated_steps_total:(h.sub_objectives??[]).reduce((y,A)=>y+(A.estimated_steps??0),0),credits_consumed:h.credits_consumed,durationMs:Date.now()-x})}}catch(h){!s.signal.aborted&&this.cache.get(t)===i&&(i.status="error",i.error=h.message,this.safeLog("tcg_bif_error",{caseId:t,ref:i.ref,errorCode:"bifurcation_failed",durationMs:Date.now()-x}))}finally{dn(m),this.active--,this.pump()}}safeLog(t,o){try{this.deps.log?.(t,o)}catch{}}async defaultRun(t,o){let i=await this.deps.resolveAuth(),m=wi({objective:t,model:this.deps.model,sessionId:this.deps.sessionId,auth:i});return Si(m,this.deps.spawnOpts,o)}getStatus(t){return this.cache.get(t)?.status}getResult(t){return this.cache.get(t)?.result}dispose(){for(let[t,o]of this.cache)o.controller?.abort(),dn(`bifurcation-${t}`);this.cache.clear(),this.caseById.clear(),this.queue=[],this.active=0}};function as(e){let t=(0,bn.useRef)(null);return(0,bn.useEffect)(()=>{if(!e.enabled)return;let o=e.log,i=o?(m,s,u,x)=>o(s,x??{}):void 0;return t.current=new er({model:e.model,sessionId:e.sessionId,resolveAuth:e.resolveAuth,spawnOpts:{environment:e.environment,log:i},log:o,persist:e.persist}),()=>{t.current?.dispose(),t.current=null}},[e.enabled,e.sessionId,e.model,e.environment]),(0,bn.useEffect)(()=>{t.current&&t.current.onSnapshot(e.scenarios)},[e.scenarios]),{getStatus:o=>t.current?.getStatus(o),getResult:o=>t.current?.getResult(o),manager:t}}import{resolve as us,isAbsolute as Na,extname as Ua}from"path";import{homedir as ls}from"os";var Fa=/(?<=^|\s)@(?:"([^"]*)"|([^\s@]+))/g;function cs(e){let t=[];for(let o of e.matchAll(Fa)){let i=o[1]!==void 0?o[1]:o[2];t.push({raw:o[0],value:i,start:o.index,end:o.index+o[0].length})}return t}var Ga=/^s\d+(\.c\d+)?$/i;function qa(e){return e==="~"?ls():e.startsWith("~/")?us(ls(),e.slice(2)):e}function Wa(e){return/^https?:\/\//i.test(e)?!1:e.includes("/")?!0:Wn.has(Ua(e).toLowerCase())}function ds(e,t){let o=cs(e),i=[],m=[];for(let u of o){let x=u.value,h=u.end;if(!u.raw.includes('"')){let T=x.match(/[.,;:!?]+$/);T&&(x=x.slice(0,-T[0].length),h-=T[0].length)}if(Ga.test(x)||!Wa(x))continue;let y=qa(x),A=Na(y)?y:us(t,y);i.push(A),m.push([u.start,h])}let s=e;for(let[u,x]of m.sort((h,y)=>y[0]-h[0]))s=s.slice(0,u)+s.slice(x);return s=s.replace(/[ \t]{2,}/g," ").replace(/ +([.,;:!?])/g,"$1").trim(),{paths:i,promptText:s}}var Ha=["request_id","session_id","caseId","ref","total_flows","is_single_flow","estimated_steps_total","credits_consumed","durationMs","pct","tookMs","scenarioCount","caseCount","savedCount","fellBack","turnIndex","status","errorCode","objectiveChars","scenarioLimit","perScenarioLimit","memoryEnhancement"],za=new Set(Ha);function ao(e){let t={};for(let o of Object.keys(e))za.has(o)&&e[o]!==void 0&&(t[o]=e[o]);return t}import{mkdirSync as Xa,appendFileSync as Ka}from"fs";import{join as ms}from"path";function fs(e,t,o,i,m=je){let s=ms(m,"tcg",e&&e.length>0?e:"pending"),u=ms(s,"errors.log");try{let x=o instanceof Error?o.stack??o.message:String(o),h=`[${new Date().toISOString()}] phase=${t} ${x}${i?" "+JSON.stringify(i):""}
|
|
3
|
+
`;Xa(s,{recursive:!0}),Ka(u,h)}catch{}return u}var Te=k(M(),1);async function Qa(e){let t=e?.getResolvedBasicAuth?.();if(t)return{username:t.username,access_key:t.access_key};let o=await e?.getToken?.();return typeof o=="string"&&o.length>0?{auth:{type:"bearer",token:o}}:{}}function gs(e){return typeof e=="object"&&e!==null&&e.name==="AbortError"}function hs(e){let{tcg:t,initialChatMode:o,tuiConfig:i,auth:m,session:s,appendStatic:u,handleInput:x,freezeTcgArtifact:h,rearmArtifactFreeze:y,initialGenerateLimits:A,ensureProjectAndFolder:T,config:C}=e,[l,d]=(0,Y.useState)(o??"run"),[B,V]=(0,Y.useState)(null),[$,j]=(0,Y.useState)(null),[F,E]=(0,Y.useState)(null),[O,ee]=(0,Y.useState)(0),[te,ae]=(0,Y.useState)(!1),q=(0,Y.useRef)(null),ue=(0,Y.useRef)(()=>{}),be=(0,Y.useCallback)(()=>Qa(m),[m]),Ve=(0,Y.useRef)(null);Ve.current=t.requestId;let De=(0,Y.useCallback)((U,H)=>{let Q=U.endsWith("_error")?"warn":"info",W=ao({request_id:Ve.current??void 0,...H});s.log(Q,U,JSON.stringify(W),W);try{let re=typeof W.request_id=="string"&&W.request_id||Ve.current||"unknown",he=Xt(je,"tcg",re);co(he,{recursive:!0}),Ja(Xt(he,"tcg_tui.log"),`[${new Date().toISOString()}] ${U} ${JSON.stringify(W)}
|
|
4
|
+
`)}catch{}},[s]),Ne=(0,Y.useCallback)((U,H)=>{let Q=fs(Ve.current,H.phase,U),W=typeof U?.status=="number"?U.status:void 0;De(`${H.phase}_error`,{errorCode:`${H.phase}_failed`,status:W});let re=H.phase==="upload"?"\u2717 Couldn't upload attachments \u2014 generation not started. Try again.":"\u2717 Generation failed \u2014 send another request.";u((0,Te.jsxs)(g,{flexDirection:"column",marginTop:1,marginBottom:1,children:[(0,Te.jsx)(n,{color:r.red,children:re}),(0,Te.jsx)(n,{color:r.dim,children:`details: ${Q}`})]})),V(null)},[De,u]),Rt=(0,Y.useRef)(0),Ue=(0,Y.useCallback)((U,H,Q)=>{try{let W=Xt(je,"tcg",Ve.current??"unknown","bifurcation");co(W,{recursive:!0}),ps(Xt(W,`${U}.json`),JSON.stringify({request_id:Ve.current,ref:Q,...H},null,2))}catch{}},[]),tt=as({scenarios:t.state?.scenarios??[],model:i.model,sessionId:s.sessionId,resolveAuth:be,environment:m?.creds?.getDefaultEnv?.(),enabled:!!t.requestId&&!t.isSessionClosed,log:De,persist:Ue}),Jt=(0,Y.useRef)(null);(0,Y.useEffect)(()=>{let U=t.requestId;if(!U||!t.isSessionClosed&&!t.isTerminal)return;let H=t.state?.scenarios??[];if(H.length!==0&&Jt.current!==U){Jt.current=U;try{let Q=Xt(je,"tcg",U);co(Q,{recursive:!0}),ps(Xt(Q,"request.json"),JSON.stringify({request_id:U,objective:t.state?.objective,headline:t.state?.headline,scenarios:H,status:t.state?.status},null,2))}catch{}}},[t.requestId,t.isTerminal,t.isSessionClosed,t.state?.scenarios,t.state?.status,t.state?.objective,t.state?.headline]);let Qt=(0,Y.useCallback)((U,H=1500)=>{E(U),q.current&&clearTimeout(q.current),q.current=setTimeout(()=>{E(null),q.current=null},H)},[]);(0,Y.useEffect)(()=>()=>{q.current&&clearTimeout(q.current)},[]);let Le=(0,Y.useCallback)((U,H)=>{let Q=m.getResolver();if(!Q)return{ok:!1,error:"Not logged in \u2014 use /login"};let W=es({env:m.creds.getDefaultEnv(),resolver:Q,projectId:U??i.project_id??void 0,folderId:H??i.folder_id??void 0,log:(re,he,Ye,X)=>s.log(re,he,"",ao(X??{}))});return W.ok?{ok:!0,conn:W.conn}:{ok:!1,error:W.error}},[m,i,s]),Oe=(0,Y.useRef)(!1),ke=(0,Y.useRef)(null),[yn,Pt]=(0,Y.useState)(!1),kt=(0,Y.useCallback)((U,H,Q,W,re)=>{let he=process.cwd(),{paths:Ye,promptText:X}=ds(U,he);return ki({promptText:X,filePaths:Ye,cwd:he,scenarios:t.state?.scenarios??[],isRefine:H,conn:Q,deps:{validate:Ri,upload:(ne,xe,Lt)=>Ci(ne,xe,Lt,{signal:re}),buildMappings:Ii},onValidated:W})},[t]),Zt=(0,Y.useRef)(!1);(0,Y.useEffect)(()=>{if(l!=="generate"){Zt.current=!1;return}Zt.current||i.project_id&&i.folder_id||T&&m.getResolver()&&(Zt.current=!0,T())},[l,i.project_id,i.folder_id,T,m]);let Tn=(0,Y.useCallback)(async U=>{V(null),j(null),ae(!1);let H=U.trim();if(!H)return;if(H.startsWith("/")){ue.current(H),ee(ne=>ne+1);return}let Q=i.project_id??null,W=i.folder_id??null;if(T){let ne=await T();if(ne)Q=ne.projectId,W=ne.folderId;else if(C){let xe=C.load();Q=xe.project_id??Q,W=xe.folder_id??W}}else if(C){let ne=C.load();Q=ne.project_id??Q,W=ne.folder_id??W}if(!Q||!W){j("Set a project and folder first \u2014 use /config");return}let re=Le(Q,W);if(!re.ok){V(re.error);return}if(Oe.current)return;Oe.current=!0;let he=new AbortController;ke.current=he;let Ye=re.conn,X;try{X=await kt(H,!1,Ye,()=>{u((0,Te.jsx)(g,{marginTop:1,children:(0,Te.jsx)(n,{color:r.generateAccent,bold:!0,children:`\u276F ${H}`})})),Pt(!0)},he.signal)}catch(ne){if(ne instanceof qr){j(ne.errors.join(`
|
|
5
|
+
`));return}if(gs(ne))return;Ne(ne,{phase:"upload"});return}finally{Oe.current=!1,Pt(!1),ke.current===he&&(ke.current=null)}if(!he.signal.aborted){for(let ne of X.warnings)e.emitFeedback("ok","/generate",ne,void 0,r.generateAccent);h(),t.reset(),y();try{let ne=A??{};await t.startWith(Ye,{prompt:X.promptText,attachments:X.attachments,scenarioLimit:ne.scenarioLimit??i.generate.scenario_limit,perScenarioLimit:ne.perScenarioLimit??i.generate.per_scenario_limit,memoryEnhancement:i.generate.memory_enabled})}catch(ne){Ne(ne,{phase:"generation"})}}},[i,t,Le,kt,e,T,C,A,u,h,y,Ne]),Ct=(0,Y.useCallback)(()=>V(null),[]),en=(0,Y.useCallback)(async U=>{let H=Le();if(!H.ok){V(H.error);return}if(Oe.current)return;Oe.current=!0;let Q=new AbortController;ke.current=Q;let W;try{W=await kt(U,!0,H.conn,()=>{u((0,Te.jsx)(n,{color:r.generateAccent,bold:!0,children:`\u276F ${U}`})),Rt.current+=1,De("tcg_refine",{turnIndex:Rt.current}),Pt(!0)},Q.signal)}catch(re){if(re instanceof qr){j(re.errors.join(`
|
|
6
|
+
`));return}if(gs(re))return;Ne(re,{phase:"upload"});return}finally{Oe.current=!1,Pt(!1),ke.current===Q&&(ke.current=null)}if(!Q.signal.aborted){for(let re of W.warnings)e.emitFeedback("ok","/generate",re,void 0,r.generateAccent);try{await t.chat(W.promptText,{mappings:W.mappings,attachments:W.attachments})}catch(re){Ne(re,{phase:"chat"})}}},[u,t,De,Le,kt,e,Ne]),wn=(0,Y.useCallback)(async U=>{if(!Oe.current){Oe.current=!0,u((0,Te.jsx)(n,{color:r.generateAccent,bold:!0,children:`\u276F ${U}`}));try{await t.chat(U)}catch(H){Ne(H,{phase:"chat"})}finally{Oe.current=!1}}},[u,t,Ne]),Dt=(0,Y.useCallback)(U=>{let H=Kn(U);if(H?.command==="view"){let Q=U.trim().split(/\s+/).slice(1)[0];if(t.state.scenarios.length===0){e.emitFeedback("ok","/view","(no generation yet)");return}let W=rs(Q);if(W.level==="cases"&&W.scenarioIdx>=t.state.scenarios.length){e.emitFeedback("error","/view",`No scenario S${W.scenarioIdx+1}`);return}e.openBrowse(W);return}if(H?.command==="save"){let Q=t.state.scenarios;if(Q.length===0){e.emitFeedback("error","/save","Nothing to save yet.");return}let W=ss(Q,e.excluded),re=W.reduce((ne,xe)=>ne+(xe.test_cases??[]).filter(it).length,0);if(re===0){e.emitFeedback("error","/save",is(Q,e.excluded)===0?"All cases removed \u2014 nothing to save.":"No functional test cases to save.");return}let he={...t.state,scenarios:W},Ye=U.trim().split(/\s+/).slice(1)[0],X=Ye?Ya(process.cwd(),Ye):process.cwd();ae(!0),e.freezeTcgArtifact(),(async()=>{let ne=W.flatMap(fe=>(fe.test_cases??[]).filter(it)),xe=Date.now()+3e4;for(;Date.now()<xe&&ne.some(fe=>tt.getStatus(fe.id)==="pending");)await new Promise(fe=>setTimeout(fe,250));let Lt=new Map;for(let fe of ne)Lt.set(fe.id,tt.getStatus(fe.id)==="done"?tt.getResult(fe.id):void 0);t.end();let jt=0,hr=fe=>{let Sn=Lt.get(fe.id);return Sn?vi(Sn,fe):(jt++,bi(fe))};try{let fe=await yi(he,X,{},hr);De("tcg_save",{savedCount:fe.paths.length,fellBack:jt})}catch(fe){e.emitFeedback("error","/save",`Save failed: ${fe.message}`);return}let Mt=`test case${re===1?"":"s"}`;e.emitFeedback("ok","/save",jt>0?`Saved ${re} ${Mt} \xB7 ${jt} fell back to raw steps.`:`Saved ${re} ${Mt}.`)})();return}H?.command==="new"&&ae(!1),x(U)},[x,e,t,tt,De]);ue.current=Dt;let It=(0,Y.useCallback)(U=>{d(U),ee(H=>H+1)},[]),pr=(0,Y.useCallback)(U=>{let H=l==="generate"&&U==="run",Q=l==="run"&&U==="generate",W=ts({requestId:t.requestId,isSessionClosed:t.isSessionClosed,turnActive:t.turnActive,saved:te}),re=ns({isRunning:e.runner.isRunning,hasLiveResults:e.runner.lastRunEnd!=null});return H&&W?(e.openSwitchConfirm("run"),!1):Q&&re?(e.openSwitchConfirm("generate"),!1):(It(U),!0)},[l,t.requestId,t.isSessionClosed,t.turnActive,te,e,It]),Et=(0,Y.useCallback)(async U=>{l==="generate"?(e.freezeTcgArtifact(),await t.end().catch(()=>{}),t.reset(),ae(!1),e.appendStatic((0,Te.jsxs)(g,{marginBottom:1,children:[(0,Te.jsx)(n,{color:r.red,children:"\u2717 "}),(0,Te.jsx)(n,{color:r.dim,children:"Discarded generation"})]}))):(e.runner.isRunning&&e.runner.cancelRun(),e.runner.clearLastRun(),e.appendStatic((0,Te.jsxs)(g,{marginBottom:1,children:[(0,Te.jsx)(n,{color:r.red,children:"\u2717 "}),(0,Te.jsx)(n,{color:r.dim,children:"Discarded run"})]}))),It(U),U==="generate"?e.emitFeedback("ok","/generate","Switched to Generate mode.",void 0,r.generateAccent):e.emitFeedback("ok","/run","Switched to Run mode.",void 0,r.orange)},[l,t,e,It]),gr=(0,Y.useCallback)(()=>{if(t.isStreaming)e.freezeTcgArtifact(),t.cancel();else if(ke.current)ke.current.abort();else return;e.appendStatic((0,Te.jsxs)(g,{marginBottom:1,children:[(0,Te.jsx)(n,{color:r.red,children:"\u2717 "}),(0,Te.jsx)(n,{color:r.dim,children:"Generation cancelled"})]}))},[e,t]);return{chatMode:l,tcgError:B,tcgValidationError:$,composeIdleHint:F,inputClearSeq:O,submitting:yn,handleGenerateSubmit:Tn,onRefine:en,onClarificationAnswer:wn,onSlash:Dt,onClearError:Ct,flashComposeHint:Qt,setInputClearSeq:ee,setChatMode:d,setTcgError:V,setTcgValidationError:j,generateSaved:te,requestSwitch:pr,confirmSwitch:Et,cancelGenerate:gr,bifurcation:tt,tcgLog:De}}var at=k(me(),1);function tr(e){return e.level==="cases"?{level:"cases",scenarioIdx:e.scenarioIdx,caseIdx:0,cursor:0}:{level:"scenarios",scenarioIdx:0,caseIdx:0,cursor:0}}var Za=(e,t)=>Math.max(0,Math.min(t,e));function lo(e,t,o){switch(t.type){case"open":return tr(t.target);case"move":{let i=e.level==="scenarios"?o.length-1:e.level==="cases"?(o[e.scenarioIdx]??1)-1:0;return{...e,cursor:Za(e.cursor+t.delta,Math.max(0,i))}}case"enter":return e.level==="scenarios"?{...e,level:"cases",scenarioIdx:e.cursor,caseIdx:0,cursor:0}:e.level==="cases"?{...e,level:"detail",caseIdx:e.cursor}:e;case"back":return e.level==="detail"?{...e,level:"cases",cursor:e.caseIdx}:e.level==="cases"?{...e,level:"scenarios",cursor:e.scenarioIdx}:e;default:return e}}function xs(e){let[t,o]=(0,at.useState)(null),[i,m]=(0,at.useReducer)((T,C)=>lo(T,C,e),tr({level:"scenarios"})),[s,u]=(0,at.useState)(new Set),x=(0,at.useCallback)(T=>{o(T),m({type:"open",target:T})},[]),h=(0,at.useCallback)(()=>o(null),[]),y=(0,at.useCallback)(T=>{u(C=>{let l=new Set(C);return l.has(T)?l.delete(T):l.add(T),l})},[]),A=(0,at.useCallback)(T=>{u(C=>{let l=new Set(C),d=T.length>0&&T.every(B=>l.has(B));return T.forEach(B=>d?l.delete(B):l.add(B)),l})},[]);return{target:t,open:x,close:h,isOpen:t!=null,state:i,excluded:s,toggleCase:y,toggleScenario:A}}var or=k(me(),1);function vs(){return{committedChat:0,committedThinking:0,prevTurnActive:!1}}function bs(e,t,o){let i=[],m={...e};if(e.prevTurnActive&&!o&&t.thinkingLog.length>e.committedThinking){let u=t.thinkingLog.slice(e.committedThinking).reduce((h,y)=>h+(y.tookMs??0),0),x=Math.round(u/1e3);i.push({kind:"thinking-summary",text:` thought for ${x}s`}),m.committedThinking=t.thinkingLog.length}m.prevTurnActive=o;for(let s=e.committedChat;s<t.chatLog.length;s++)i.push({kind:"chat",text:t.chatLog[s].text});return m.committedChat=t.chatLog.length,{items:i,next:m}}function ys(e){let t=e;return t=t.replace(/@TS\{([^}]+)\}/g,"@S{$1}"),t=t.replace(/@TS-(\d+)/g,(o,i)=>`@S${parseInt(i,10)}.C1`),t=t.replace(/@TS(\d+)/g,(o,i)=>`@S${parseInt(i,10)}`),t=t.replace(/\\n/g,`
|
|
7
|
+
`),t}var We=k(M(),1),Ts=e=>e!==void 0&&/[A-Za-z0-9]/.test(e);function nr(e){let t=[],o="",i=()=>{o&&(t.push({text:o}),o="")},m=(u,x,h)=>(u===0||!Ts(e[u-1]))&&(x+h>=e.length||!Ts(e[x+h])),s=0;for(;s<e.length;){let u=e.slice(s,s+2),x=e[s];if(u==="**"||u==="__"){let h=e.indexOf(u,s+2);if(h!==-1&&h>s+2&&(u==="**"||m(s,h,2))){i(),t.push({text:e.slice(s+2,h),bold:!0}),s=h+2;continue}}if(x==="`"){let h=e.indexOf("`",s+1);if(h!==-1&&h>s+1){i(),t.push({text:e.slice(s+1,h),code:!0}),s=h+1;continue}}if(x==="*"||x==="_"){let h=e.indexOf(x,s+1);if(h!==-1&&h>s+1&&(x==="*"||m(s,h,1))){i(),t.push({text:e.slice(s+1,h),italic:!0}),s=h+1;continue}}o+=x,s+=1}return i(),t.length===0&&t.push({text:""}),t}function rr(e){return e.map((t,o)=>(0,We.jsx)(n,{bold:t.bold,italic:t.italic,color:t.code?r.dim:void 0,children:t.text},o))}function ec(e){return e.split(`
|
|
8
|
+
`).map(t=>{if(t.trim()==="")return{kind:"blank"};let o=t.match(/^\s*[-*+]\s+(.*)$/);if(o)return{kind:"bullet",segs:nr(o[1])};let i=t.match(/^\s*(\d+)\.\s+(.*)$/);if(i)return{kind:"numbered",n:i[1],segs:nr(i[2])};let m=t.match(/^#{1,6}\s+(.*)$/);return m?{kind:"heading",segs:nr(m[1])}:{kind:"para",segs:nr(t)}})}function tc(e,t,o=""){switch(e.kind){case"blank":return(0,We.jsx)(n,{children:o||" "},t);case"heading":return(0,We.jsxs)(n,{bold:!0,children:[o,rr(e.segs)]},t);case"bullet":return(0,We.jsx)(g,{marginLeft:1,children:(0,We.jsxs)(n,{children:[o,"\u2022 ",rr(e.segs)]})},t);case"numbered":return(0,We.jsx)(g,{marginLeft:1,children:(0,We.jsxs)(n,{children:[o,`${e.n}. `,rr(e.segs)]})},t);default:return(0,We.jsxs)(n,{children:[o,rr(e.segs)]},t)}}function ws({text:e}){let t=ec(ys(e));return(0,We.jsxs)(g,{marginBottom:1,children:[(0,We.jsx)(n,{color:r.generateAccent,children:"\u2503 "}),(0,We.jsx)(g,{flexDirection:"column",children:t.map((o,i)=>tc(o,i))})]})}var uo=k(M(),1);function nc(e){return e.kind==="thinking-summary"?(0,uo.jsx)(n,{color:r.dim,children:e.text}):(0,uo.jsx)(ws,{text:e.text})}function Ss(e,t,o){let i=(0,or.useRef)(vs());(0,or.useEffect)(()=>{let{items:m,next:s}=bs(i.current,e,t);i.current=s;for(let u of m)o(nc(u))})}var Rs=k(me(),1);import{readdir as rc}from"fs/promises";import{join as oc,relative as ic,extname as sc}from"path";var ac=new Set(["node_modules",".git"]),cc=e=>e.startsWith("output-");async function ir(e,t,o={}){let i=o.limit??50,m=o.maxDepth??6,s=t.toLowerCase(),u=[];async function x(h,y){if(u.length>=i||y>m)return;let A;try{A=await rc(h,{withFileTypes:!0})}catch{return}for(let T of A){if(u.length>=i)return;if(T.name.startsWith(".")||ac.has(T.name)||cc(T.name))continue;let C=oc(h,T.name);if(T.isDirectory())await x(C,y+1);else if(T.isFile()){if(!Wn.has(sc(T.name).toLowerCase()))continue;let l=ic(e,C);(!s||l.toLowerCase().includes(s))&&u.push(l)}}}return await x(e,0),u.slice(0,i)}var we=k(M(),1);function ks({projectId:e,folderId:t,onSubmit:o,history:i,error:m,validationError:s,composeIdleHint:u,clearSeq:x,closedNotice:h,busy:y=!1}){let A=!!e&&!!t,T=(0,Rs.useCallback)(C=>ir(process.cwd(),C),[]);return(0,we.jsxs)(g,{flexDirection:"column",children:[(0,we.jsx)(g,{marginLeft:2,marginTop:1,children:!A&&(0,we.jsxs)(n,{color:r.orange,children:["\u2691 ",(0,we.jsx)(n,{color:r.muted,children:"project / folder not set \u2014 use "}),(0,we.jsx)(n,{bold:!0,children:"/config"})]})}),s&&(0,we.jsx)(g,{marginLeft:2,marginTop:1,children:(0,we.jsx)(dt,{variant:"error",paddingY:0,children:(0,we.jsx)(n,{color:r.red,children:s})})}),m&&(0,we.jsx)(g,{marginLeft:2,marginTop:1,children:(0,we.jsx)(dt,{variant:"error",paddingY:0,children:(0,we.jsx)(n,{color:r.red,children:m})})}),h&&(0,we.jsx)(g,{paddingX:1,children:(0,we.jsx)(n,{color:r.dim,children:h})}),u&&(0,we.jsx)(g,{marginLeft:2,marginTop:1,children:(0,we.jsx)(n,{color:r.dim,children:u})}),(0,we.jsx)(yt,{inert:y,onSubmit:o,history:i,accent:r.generateAccent,commands:Yn("","generate"),clearSeq:x,clearOnSubmit:!1,mentionFiles:T,placeholder:y?"Processing files\u2026 (Ctrl+C to cancel)":"Describe what to generate... (/ = commands)",footerBindings:y?[{keys:"ctrl+c",label:"cancel"}]:[{keys:"\u2191\u2193",label:"history"},{keys:"\u21B5",label:"generate"},{keys:"tab",label:"complete"},{keys:"/run",label:"Run mode"},{keys:"ctrl+t",label:"thinking"}]})]})}var Ps=k(me(),1);var Ee=k(M(),1);function lc(e){return e?`[${e[0].toUpperCase()}]`:""}var uc=8;function sr({scenarios:e,headline:t,activeSid:o}){let i=e.slice(0,uc),m=e.length-i.length;return(0,Ee.jsxs)(g,{flexDirection:"column",marginBottom:1,marginLeft:2,children:[t&&(0,Ee.jsx)(g,{paddingX:1,children:(0,Ee.jsx)(n,{color:r.generateAccent,bold:!0,children:t})}),(0,Ee.jsxs)(dt,{title:`Scenarios (${e.length})`,titleColor:r.generateAccent,borderColor:r.generateAccent,paddingX:1,children:[i.map(s=>{let u=!!o&&s.sid===o,x=u?"\u2237":"\u2713",h=u?r.generateAccent:r.green,y=s.test_cases?.length??0;return(0,Ee.jsxs)(g,{gap:1,children:[(0,Ee.jsx)(n,{color:h,children:x}),(0,Ee.jsx)(n,{color:r.dim,children:s.sid??`#${s.id}`}),(0,Ee.jsx)(n,{children:s.title??"(untitled)"}),(0,Ee.jsx)(n,{color:r.muted,children:lc(s.priority)}),(0,Ee.jsxs)(n,{color:r.dim,children:[y," case",y===1?"":"s"]})]},s.id)}),m>0&&(0,Ee.jsx)(n,{color:r.muted,children:`\u22EE +${m} more`}),(0,Ee.jsx)(g,{marginTop:1,children:(0,Ee.jsxs)(n,{color:r.dim,children:[(0,Ee.jsx)(n,{color:r.generateAccent,children:"/view"})," view/edit \xB7 ",(0,Ee.jsx)(n,{color:r.generateAccent,children:"/save"})," save as runnable tests"]})})]})]})}var pt=k(M(),1),dc=5;function Cs({thinking:e,expanded:t,thinkingDone:o,maxLines:i=dc}){if(!t)return(0,pt.jsxs)(g,{paddingX:1,children:[(0,pt.jsx)(n,{color:r.dim,children:o?"\u2237 thinking complete ":"\u2237 thinking\u2026 "}),(0,pt.jsx)(n,{color:r.muted,children:o?"(ctrl+t to view)":"(ctrl+t to show)"})]});let m=e.split(`
|
|
9
|
+
`),s=Math.max(0,m.length-i),u=s>0?m.slice(-i).join(`
|
|
10
|
+
`):e;return(0,pt.jsxs)(dt,{variant:"default",paddingX:1,children:[s>0&&(0,pt.jsxs)(n,{color:r.muted,children:["\u22EE (",s," earlier line",s===1?"":"s"," hidden)"]}),(0,pt.jsx)(n,{color:r.dim,children:u}),o&&(0,pt.jsx)(n,{color:r.muted,children:"\u2014 thinking complete"})]})}var Kt=k(M(),1),Is=24;function mc(e){let t=Math.max(0,Math.min(100,e)),o=Math.round(t/100*Is);return{filled:"\u2588".repeat(o),empty:"\u2591".repeat(Is-o)}}function Es({pct:e}){let t=mc(e);return(0,Kt.jsxs)(g,{paddingX:1,children:[(0,Kt.jsx)(n,{color:r.generateAccent,children:t.filled}),(0,Kt.jsx)(n,{color:r.muted,children:t.empty}),(0,Kt.jsx)(n,{color:r.dim,children:` ${e}%`})]})}var _s=k(me(),1);var gt=k(M(),1);function As(e,t){let o=e.trim();return o.startsWith("/")?{kind:"slash",text:o}:o?t?{kind:"ignore",text:o}:{kind:"refine",text:o}:{kind:"ignore",text:""}}function Bs({state:e,history:t,turnActive:o,busy:i=!1,onClarificationAnswer:m,onClearError:s,onRefine:u,onSlash:x}){let h=(0,_s.useCallback)(A=>ir(process.cwd(),A),[]),y=m?A=>{s?.(),m(A)}:void 0;return(0,gt.jsxs)(gt.Fragment,{children:[e.pendingClarification&&y&&(0,gt.jsx)(g,{paddingX:1,marginTop:1,flexDirection:"column",children:(0,gt.jsx)(yt,{onSubmit:y,history:t,noHistory:!0,accent:r.generateAccent,placeholder:"Type your answer\u2026",submitVerb:"answer",footerBindings:[{keys:"\u21B5",label:"answer"}]})}),!(e.pendingClarification&&y)&&(o||i?(0,gt.jsx)(yt,{inert:!0,onSubmit:()=>{},history:t,placeholder:o?"(generating\u2026 input inert \u2014 Ctrl+C to cancel)":"(processing files\u2026 Ctrl+C to cancel)",footerBindings:o?void 0:[{keys:"ctrl+c",label:"cancel"}]}):(0,gt.jsx)(yt,{onSubmit:A=>{let T=As(A,o);T.kind==="slash"?x?.(T.text):T.kind==="refine"&&u?.(T.text)},history:t,noHistory:!0,accent:r.generateAccent,commands:Yn("","generate"),scenarios:e.scenarios,mentionFiles:h,placeholder:"Refine, or /save \xB7 /view \xB7 /run",submitVerb:"refine",footerBindings:[{keys:"\u21B5",label:"refine"},{keys:"tab",label:"complete"},{keys:"/run",label:"Run mode"},{keys:"ctrl+t",label:"thinking"}]}))]})}var Ke=k(M(),1);function Ds({state:e,requestId:t,history:o,onClarificationAnswer:i,error:m,onClearError:s,turnActive:u,busy:x=!1,onRefine:h,onSlash:y}){let[A,T]=(0,Ps.useState)(!1),C=e.thinking.length===0&&e.thinkingLog.length>0,l=[...e.thinkingLog.map(d=>d.text),e.thinking].filter(d=>d.length>0).join(`
|
|
11
|
+
|
|
12
|
+
`);return ye((d,B)=>{B.ctrl&&d==="t"&&T(V=>!V)}),(0,Ke.jsxs)(g,{flexDirection:"column",children:[(0,Ke.jsx)(g,{marginBottom:1,marginLeft:2,children:(0,Ke.jsx)(Cs,{thinking:l,expanded:A,thinkingDone:C})}),u&&(0,Ke.jsx)(g,{marginLeft:2,children:(0,Ke.jsx)(Es,{pct:e.progress})}),m&&(0,Ke.jsx)(g,{marginLeft:2,marginTop:1,children:(0,Ke.jsx)(dt,{variant:"error",paddingY:0,children:(0,Ke.jsx)(n,{color:r.red,children:m})})}),e.scenarios.length>0&&(0,Ke.jsx)(sr,{scenarios:e.scenarios,headline:e.headline,activeSid:null}),(0,Ke.jsx)(Bs,{state:e,history:o,turnActive:u,busy:x,onClarificationAnswer:i,onClearError:s,onRefine:h,onSlash:y})]})}var Os=k(me(),1);var _e=k(M(),1);function fc(e,t){return(e.test_cases??[]).some(o=>!t.has(o.id))}function Ls({scenarios:e,cursor:t,excluded:o}){let i=e.reduce((m,s)=>m+(s.test_cases??[]).length,0);return(0,_e.jsxs)(g,{flexDirection:"column",paddingX:1,children:[(0,_e.jsxs)(n,{children:[(0,_e.jsx)(n,{color:r.dim,children:"Generate \u203A "}),(0,_e.jsx)(n,{color:r.generateAccent,children:"Scenarios"}),(0,_e.jsx)(n,{color:r.dim,children:` ${e.length} scenarios \xB7 ${i} cases`})]}),(0,_e.jsx)(n,{color:r.muted,children:"\u2500".repeat(60)}),(0,_e.jsx)(g,{flexDirection:"column",marginY:1,children:e.map((m,s)=>{let u=s===t,x=fc(m,o);return(0,_e.jsxs)(n,{children:[(0,_e.jsx)(n,{color:r.generateAccent,children:u?"\u276F ":" "}),(0,_e.jsx)(n,{color:r.generateAccent,children:`S${s+1}`}),(0,_e.jsx)(n,{children:` ${m.title??"(untitled)"}`}),(0,_e.jsx)(n,{color:r.dim,children:` [${m.priority??"-"}] ${(m.test_cases??[]).length} cases `}),(0,_e.jsx)(n,{color:x?r.green:r.red,children:x?"\u2713":"\u2717"})]},m.id)})}),(0,_e.jsx)(n,{color:r.muted,children:"\u2500".repeat(60)}),(0,_e.jsx)(n,{color:r.dim,children:"\u2191\u2193 move \u21B5 open x remove esc back to chat"})]})}var Se=k(M(),1);function js({scenario:e,scenarioIdx:t,cursor:o,excluded:i}){let m=e.test_cases??[],s=m.some(u=>!it(u));return(0,Se.jsxs)(g,{flexDirection:"column",paddingX:1,children:[(0,Se.jsxs)(n,{children:[(0,Se.jsx)(n,{color:r.dim,children:"Generate \u203A Scenarios \u203A "}),(0,Se.jsx)(n,{color:r.generateAccent,children:`S${t+1} ${e.title??"(untitled)"}`}),(0,Se.jsx)(n,{color:r.dim,children:` ${m.length} cases`})]}),(0,Se.jsx)(n,{color:r.muted,children:"\u2500".repeat(60)}),(0,Se.jsx)(g,{flexDirection:"column",marginY:1,children:m.map((u,x)=>{let h=x===o,y=i.has(u.id);return(0,Se.jsxs)(n,{children:[(0,Se.jsx)(n,{color:r.generateAccent,children:h?"\u276F ":" "}),(0,Se.jsx)(n,{color:r.generateAccent,children:`C${x+1}`}),(0,Se.jsx)(n,{children:` ${u.title??"(untitled)"} `}),it(u)?(0,Se.jsx)(n,{color:y?r.red:r.green,children:y?"\u2717 removed":"\u2713 included"}):(0,Se.jsx)(n,{color:r.dim,children:"\u2713"})]},u.id)})}),(0,Se.jsx)(n,{color:r.muted,children:"\u2500".repeat(60)}),s&&(0,Se.jsx)(n,{color:r.dim,children:"gray \u2713 = non-functional \xB7 won't be saved by /save"}),(0,Se.jsx)(n,{color:r.dim,children:"\u2191\u2193 move \u21B5 view detail x remove case \u2190 / esc back"})]})}var lr=k(me(),1);function ar(e,t){let o=Math.max(1,t),i=[];for(let m of e.split(`
|
|
13
|
+
`)){let s=m.split(/\s+/).filter(h=>h.length>0);if(s.length===0){i.push("");continue}let u="",x=()=>{u&&(i.push(u),u="")};for(let h of s){for(;h.length>o;)x(),i.push(h.slice(0,o)),h=h.slice(o);u===""?u=h:u.length+1+h.length<=o?u+=" "+h:(x(),u=h)}x()}return i}function Ms(e,t,o,i){let m=Math.max(20,i),s=[];if(o){for(let x of ar(o,m))s.push({text:x,tone:"meta"});s.push({text:"",tone:"blank"})}let u=(x,h)=>{let y=h?.trim();if(y){s.push({text:x,tone:"label"});for(let A of ar(y,m-2))s.push({text:" "+A,tone:"text"});s.push({text:"",tone:"blank"})}};return u("Description",e?.description),u("Preconditions",e?.preconditions),t.length>0&&(s.push({text:"Steps",tone:"label"}),t.forEach((x,h)=>{let y=`${h+1}. `;ar(x.step||"",Math.max(1,m-y.length)).forEach((C,l)=>{l===0?s.push({text:C,tone:"step",accent:y}):s.push({text:" ".repeat(y.length)+C,tone:"step"})});let T=x.expected?.trim();if(T){let C=" \u2192 ",l=" ";ar(T,Math.max(1,m-C.length)).forEach((d,B)=>s.push({text:(B===0?C:l)+d,tone:"expected"}))}})),s}function cr(e,t,o){let i=Math.max(0,t-o);return Math.max(0,Math.min(e,i))}var Re=k(M(),1),pc=7;function gc(e){return e==="text"||e==="step"?void 0:r.dim}function Vs({scenario:e,scenarioIdx:t,caseIdx:o,excluded:i,getStatus:m,getResult:s}){let u=(e.test_cases??[])[o],x=u?i.has(u.id):!1,h=u?it(u):!0,y=u&&m?m(u.id):void 0,A=y==="done"?(0,Re.jsx)(n,{color:r.generateAccent,children:"ready"}):y==="error"?(0,Re.jsx)(n,{color:r.red,children:"failed \u2192 raw steps"}):y==="pending"?(0,Re.jsx)(n,{color:r.dim,children:"bifurcating\u2026"}):null,T=y==="done"&&u&&s?s(u.id):void 0,C=T?T.sub_objectives.map(ae=>({step:ae.objective,expected:""})):xi(u?.manual_steps),l=[u?.priority&&`Priority ${u.priority}`,u?.polarity&&`Polarity ${u.polarity}`,u?.tags&&`Tags ${u.tags}`].filter(Boolean).join(" \xB7 "),{stdout:d}=Vn(),B=Math.max(20,(d?.columns??80)-4),V=Math.max(3,(d?.rows??24)-pc),$=Ms(u,C,l,B),[j,F]=(0,lr.useState)(0);(0,lr.useEffect)(()=>{F(0)},[u?.id]);let E=cr(j,$.length,V);ye((ae,q)=>{if(q.upArrow){F(ue=>cr(ue-1,$.length,V));return}if(q.downArrow){F(ue=>cr(ue+1,$.length,V));return}});let O=$.slice(E,E+V),te=$.length>V?` ${E+1}-${Math.min(E+V,$.length)}/${$.length}`:"";return(0,Re.jsxs)(g,{flexDirection:"column",paddingX:1,children:[(0,Re.jsxs)(n,{children:[(0,Re.jsx)(n,{color:r.dim,children:`Generate \u203A S${t+1} \u203A `}),(0,Re.jsx)(n,{color:r.generateAccent,children:`C${o+1} ${u?.title??"(untitled)"}`}),A?(0,Re.jsx)(n,{children:" "}):null,A]}),h?(0,Re.jsx)(n,{color:x?r.red:r.green,children:x?"\u2717 removed":"\u2713 included"}):(0,Re.jsx)(n,{color:r.dim,children:"\u2713 non-functional \xB7 not saved by /save"}),(0,Re.jsx)(n,{color:r.muted,children:"\u2500".repeat(60)}),(0,Re.jsx)(g,{flexDirection:"column",marginTop:1,children:O.map((ae,q)=>(0,Re.jsxs)(n,{color:gc(ae.tone),children:[ae.accent?(0,Re.jsx)(n,{color:r.generateAccent,children:ae.accent}):null,ae.text]},E+q))}),(0,Re.jsx)(n,{color:r.muted,children:"\u2500".repeat(60)}),(0,Re.jsx)(n,{color:r.dim,children:`\u2191\u2193 scroll \u2190 / esc back x remove${te}`})]})}var ur=k(M(),1);function $s({scenarios:e,target:t,onClose:o,excluded:i,onToggleCase:m,onToggleScenario:s,getStatus:u,getResult:x}){let h=e.map(l=>(l.test_cases??[]).length),[y,A]=(0,Os.useReducer)((l,d)=>lo(l,d,h),tr(t)),T=()=>{y.level==="scenarios"?o():A({type:"back"})};ye((l,d)=>{if(d.escape||d.leftArrow){T();return}if(y.level!=="detail"){if(d.return){A({type:"enter"});return}if(d.upArrow){A({type:"move",delta:-1});return}if(d.downArrow){A({type:"move",delta:1});return}}if(l==="x"){if(y.level==="scenarios"){let B=(e[y.cursor]?.test_cases??[]).map(V=>V.id);B.length>0&&s(B)}else{let B=y.level==="cases"?y.cursor:y.caseIdx,V=(e[y.scenarioIdx]?.test_cases??[])[B];V&&m(V.id)}return}});let C=e[y.scenarioIdx];if(y.level==="scenarios"||C===void 0){let l=y.level==="scenarios"?y.cursor:0;return(0,ur.jsx)(Ls,{scenarios:e,cursor:l,excluded:i})}return y.level==="cases"?(0,ur.jsx)(js,{scenario:C,scenarioIdx:y.scenarioIdx,cursor:y.cursor,excluded:i}):(0,ur.jsx)(Vs,{scenario:C,scenarioIdx:y.scenarioIdx,caseIdx:y.caseIdx,excluded:i,getStatus:u,getResult:x})}var dr=k(M(),1);function Fs({tcg:e,gm:t,history:o,tuiConfig:i,browse:m}){return m?(0,dr.jsx)($s,{scenarios:e.state.scenarios,target:m.target,onClose:m.onClose,excluded:m.excluded,onToggleCase:m.onToggleCase,onToggleScenario:m.onToggleScenario,getStatus:m.getStatus,getResult:m.getResult}):!e.requestId||e.isSessionClosed?(0,dr.jsx)(ks,{projectId:i.project_id,folderId:i.folder_id,onSubmit:t.handleGenerateSubmit,history:o,error:t.tcgError,validationError:t.tcgValidationError,composeIdleHint:t.composeIdleHint,clearSeq:t.inputClearSeq,busy:t.submitting,closedNotice:e.isSessionClosed?`Generation ${e.state.status}. Type a new objective or /run.`:void 0}):(0,dr.jsx)(Ds,{state:e.state,requestId:e.requestId,history:o,turnActive:e.turnActive,busy:t.submitting,error:t.tcgError??e.state.error,onClearError:()=>t.onClearError?.(),onClarificationAnswer:s=>t.onClarificationAnswer?.(s),onRefine:t.onRefine,onSlash:t.onSlash})}var Ns=k(me(),1);var ct=k(M(),1);function hc({message:e,confirmLabel:t,choice:o}){return(0,ct.jsxs)(g,{flexDirection:"column",borderStyle:"round",borderColor:r.dim,paddingX:1,children:[(0,ct.jsx)(n,{bold:!0,children:e}),(0,ct.jsxs)(g,{marginTop:1,children:[(0,ct.jsx)(n,{color:o==="yes"?r.red:r.dim,children:`\u276F ${t}`}),(0,ct.jsx)(n,{children:" "}),(0,ct.jsx)(n,{color:o==="no"?r.green:r.dim,children:"\u276F No"})]}),(0,ct.jsx)(n,{color:r.dim,children:"\u2190 \u2192 choose \xB7 \u21B5 confirm \xB7 esc cancel"})]})}function Us({message:e,onConfirm:t,onCancel:o,confirmLabel:i="Yes, end"}){let[m,s]=(0,Ns.useState)("no");return ye((u,x)=>{(x.leftArrow||x.rightArrow)&&s(h=>h==="yes"?"no":"yes"),x.return&&(m==="yes"?t:o)(),x.escape&&o()}),(0,ct.jsx)(hc,{message:e,confirmLabel:i,choice:m})}var xc=null;function Gs(e){xc=e}import{join as Yt,resolve as vc}from"path";var mr=k(M(),1);function qs({status:e,steps:t,duration:o,creditsConsumed:i,reason:m}){let s=e==="passed",u=s?r.green:r.red,x=s?"\u2713":"\u2717",h=s?"Passed":"Failed",y=o<60?`${o.toFixed(1)}s`:`${Math.floor(o/60)}m ${Math.round(o%60)}s`,A=typeof i=="number"&&i>0?` \xB7 ${i.toFixed(4)} credits`:"",T=!s&&m?` \xB7 ${m}`:"";return(0,mr.jsxs)(g,{children:[(0,mr.jsxs)(n,{bold:!0,color:u,children:[x," ",h]}),(0,mr.jsxs)(n,{color:r.dim,children:[" ","\xB7 ",t," steps \xB7 ",y,A,T]})]})}var Hs=k(M(),1);function Ws(){return(0,Hs.jsx)(n,{color:r.dim,children:"Continue below \xB7 /new fresh session \xB7 /summary view details \xB7 Ctrl+C exit"})}var fr=e=>({kind:"login",env:e}),mo=e=>({kind:"switch",env:e}),zs=(e,t)=>e?{kind:"switch",env:t}:{kind:"logout"};async function Xs(e){await new un(e.tmsBaseUrl,e.username,e.accessKey).submitFeedback({instruction_id:"",test_id:e.testId,feedback_type:e.feedbackType,mode:e.mode??"human",...e.details?{details:e.details}:{}}),e.log("info","FEEDBACK_SUBMITTED","Feedback submitted",{type:e.feedbackType})}var b=k(M(),1);function op({localMode:e=!1,codeExport:t,codeLanguage:o,skipCodeValidation:i,updatePromise:m,migrationResult:s,sessionName:u,initialChatMode:x,initialObjective:h,initialGenerateLimits:y}={}){ko();let A=(0,S.useRef)(new Fn),[T,C]=(0,S.useState)(0),l=A.current,[d]=(0,S.useState)(()=>new qt),B=(0,S.useRef)(0),V=(0,S.useCallback)(()=>`msg-${++B.current}`,[]),[$,j]=(0,S.useState)(!1),[F,E]=(0,S.useState)(null),[O,ee]=(0,S.useState)(!1),[te,ae]=(0,S.useState)(0),[q,ue]=(0,S.useState)(!1),[be,Ve]=(0,S.useState)(null),[De,Ne]=(0,S.useState)(null),Rt=(0,S.useRef)(null),[Ue,tt]=(0,S.useState)(null),[Jt,Qt]=(0,S.useState)(Nn()),[Le,Oe]=(0,S.useState)(null),[ke,yn]=(0,S.useState)([]),[Pt,kt]=(0,S.useState)(!1),[Zt,Tn]=(0,S.useState)(!1),[Ct,en]=(0,S.useState)(null),[wn,Dt]=(0,S.useState)(null),[It,pr]=(0,S.useState)(null),Et=(0,S.useRef)(null),gr=(0,S.useRef)(null),U=(0,S.useRef)(0),H=(0,S.useRef)(""),Q=(0,S.useRef)(null),W=(0,S.useRef)(null),re=(0,S.useRef)({}),he=(0,S.useRef)(null),{append:Ye}=Eo(),X=(0,S.useCallback)(c=>Ye((0,b.jsx)(g,{paddingX:1,children:c})),[Ye]),[ne,xe]=(0,S.useState)("booting"),[Lt,jt]=(0,S.useState)([]),[hr,Mt]=(0,S.useState)(!1),[fe,Sn]=(0,S.useState)(!1),[Rn,Ks]=(0,S.useState)("chat"),[nt,tn]=(0,S.useState)(null),[kn,fo]=(0,S.useState)(null),[nn,po]=(0,S.useState)(!1),[rn,Cn]=(0,S.useState)(!1),go=(0,S.useRef)(()=>{}),Ys=(0,S.useCallback)((c,p)=>go.current(c,p),[]),Z=Zi({log:Ys});Ss(Z.state,Z.turnActive,X);let xr=(0,S.useRef)(!1),ht=(0,S.useCallback)(()=>{xr.current||Z.state.scenarios.length!==0&&(xr.current=!0,X((0,b.jsx)(sr,{scenarios:Z.state.scenarios,activeSid:null})))},[Z.state.scenarios,X]);(0,S.useEffect)(()=>{Z.isSessionClosed&&ht()},[Z.isSessionClosed,ht]);let[In,on]=(0,S.useState)(null),[ie,sn]=(0,S.useState)({headless:!1,maxSteps:50,timeout:0,cdpEndpoint:"",wsEndpoint:"",useCft:!1}),Js=Lr(),Qs=Lr(Io),v=Fi(),En=Ni(),He=(0,S.useMemo)(()=>({auth:{initResolver:c=>v.initResolver(c,(p,a,f,w)=>A.current.log(p,a,f,w)),getResolver:()=>v.getResolver(),getBasicAuth:()=>v.getBasicAuth(),getToken:()=>v.getToken()},getSession:()=>A.current,log:(c,p,a,f)=>A.current.log(c,p,a,f),state:{getTmsCredsCache:()=>Le,setTmsCredsCache:Oe,identityServicesRef:gr,screenshotQueueRef:Et},exit:{registerCleanup:rt,setExitRemoteLogger:jo},options:{skipScreenshotQueue:e}}),[v.initResolver,v.getResolver,v.getBasicAuth,v.getToken,Le,e]),Zs=(0,S.useCallback)((c,p,a)=>{let f=Et.current;if(!f)return;let w=U.current+p;ni(l.sessionDir,w,c,f,(L,N,G,K)=>l.log(L,N,G,K),a)},[l]),ea=(0,S.useCallback)((c,p,a)=>{l.logStep(c,p,a)},[l]),ta=(0,S.useCallback)(c=>he.current?.setStepText(c),[]),na=(0,S.useCallback)(()=>he.current?.setStepComplete(),[]),P=qo(Zs,ea,ta,na),[I,ve]=(0,S.useState)(()=>d.load()),[,ra]=(0,S.useState)(0),$e=(0,S.useCallback)(()=>ra(c=>c+1),[]),[_,pe]=(0,S.useState)(null),Vt=v.creds.getActiveProfile(),ce=v.creds.getDefaultEnv(),Je=(0,S.useCallback)((c,p)=>{let a=c?v.creds.loadProfileConfig(c,p):null;d.save({project_id:a?.project_id??null,project_name:a?.project_name??null,folder_id:a?.folder_id??null,folder_name:a?.folder_name??null}),ve(d.load())},[v.creds,d]),vr=(0,S.useCallback)(async(c,p)=>{let a=v.getResolver();if(!a)return null;let f=a.cached??await a.resolve();if(!f)return null;let w=qe(p),L=new un(w.tmsBaseUrl,f.username,f.access_key);try{let G=(await L.listProjects()).find(oe=>oe.name==="KaneAI Generated");if(G)return{id:G.project_id,name:G.name};let K=await L.createProject("KaneAI Generated");return{id:K.id,name:K.name}}catch{return null}},[v]),br=(0,S.useCallback)(async(c,p)=>{let a=v.getResolver();if(!a)return null;let f=a.cached??await a.resolve();if(!f)return null;let w=qe(c),L=new un(w.tmsBaseUrl,f.username,f.access_key);try{let G=(await L.listFolders(p)).find(oe=>oe.name==="Untitled");if(G)return{id:G.id,name:G.name};let K=await L.createFolder(p,"Untitled");return{id:K.id,name:K.name}}catch{return null}},[v]);(0,S.useEffect)(()=>{O||(l.start({model:I.model,environment:ce,profile:Vt}),u&&l.setSessionName(u),ee(!0))},[l,O,I.model,ce,Vt,u]);let ho=(0,S.useRef)(!1);(0,S.useEffect)(()=>{if(!O||ho.current)return;ho.current=!0;let c=u?[{label:"session",value:u},{label:"test",value:Dr(Yt(process.cwd(),".testmuai","tests",`${u}_test.md`))},{label:"output",value:Dr(Yt(process.cwd(),".testmuai","tests",`output-${u}`))}]:[{label:"session",value:"ephemeral"},{label:"note",value:"use /name <name> to persist this session"}];X((0,b.jsx)(Mr,{title:"Recording",titleColor:"#ff9500",rows:c}))},[O,u,X]);let xo=(0,S.useRef)(!1);(0,S.useEffect)(()=>{if(!$||xo.current||!O)return;xo.current=!0;let c=He.state.getTmsCredsCache();if(!c){l.log("warn","BOOT_RESOLVE_FAILED","Boot done but tmsCredsCache empty \u2014 non-controller APIs may fail");return}ot({kind:"boot",tmsCreds:c,env:ce},He).then(p=>{p&&(c.org_id!==void 0&&l.setOrgId(String(c.org_id)),l.setPlan(c.plan??null),l.log("info","BOOT_RESOLVE_OK","Boot identity attached",{username:c.username,org_id:c.org_id,plan:c.plan??null}))}).catch(p=>{l.log("error","BOOT_RESOLVE_ERROR","Boot identity attach error",{error:p instanceof Error?p.message:String(p)})})},[$,O,He,ce,l]);let _t=(0,S.useCallback)(async()=>{if(Le)return l.log("info","TMS_CREDS_CACHED","Using cached TMS credentials",{username:Le.username,org_id:Le.org_id}),Le;let c=await v.resolveBasicAuth();return c?(l.log("info","TMS_CREDS_OK","TMS credentials resolved",{username:c.username,org_id:c.org_id,user_id:c.user_id}),Oe(c)):l.log("warn","TMS_CREDS_FAILED","No TMS credentials resolved"),c},[v,Le,l]),_n=(0,S.useCallback)(c=>{X((0,b.jsx)(Mr,{title:"\u24D8 Auto-configured",titleColor:r.orange,rows:[{label:"project",value:`${c.projectName} (${c.projectId})`},{label:"folder",value:`${c.folderName} (${c.folderId})`},{label:"change with",value:(0,b.jsxs)(g,{flexDirection:"column",children:[(0,b.jsx)(n,{color:r.dim,children:"kane-cli config project <id>"}),(0,b.jsx)(n,{color:r.dim,children:"kane-cli config folder <id>"})]})}]}))},[X]),An=(0,S.useCallback)(async()=>{let c=await _t();if(!c)return l.log("warn","PROJECT_FAILED","No TMS credentials for project/folder gate"),null;let p=v.creds.getActiveProfile()??"default",a=v.creds.getDefaultEnv(),f=await Mo({creds:v.creds,config:d,profile:p,env:a,tmsCreds:{username:c.username,access_key:c.access_key},isLocal:e,log:(w,L,N,G)=>l.log(w,L,N,G),onAnnounce:_n});return f.status==="ok"?{projectId:f.projectId,folderId:f.folderId}:null},[_t,d,l,v.creds,e,_n]),le=(0,S.useCallback)(c=>{let p=V(),a={...c,id:p};X((0,b.jsx)(Mi,{entry:a}))},[V,X]),D=(0,S.useCallback)((c,p,a,f,w)=>{X((0,b.jsx)(Hi,{status:c,command:p,message:a,details:f,accentColor:w})),p==="/save"&&c==="ok"&&X((0,b.jsx)(g,{marginLeft:2,children:(0,b.jsxs)(n,{color:r.dim,children:["\u2192 Run ",(0,b.jsx)(n,{color:r.generateAccent,children:"/testmd"})," to list your saved tests."]})}))},[X]),vo=(0,S.useRef)(()=>{}),xt=xs(Z.state.scenarios.map(c=>(c.test_cases??[]).length)),oa=(0,S.useCallback)(async()=>{let c=await An();return ve(d.load()),c},[An,d]),Qe=hs({tcg:Z,initialChatMode:x,tuiConfig:I,auth:v,session:l,runner:P,appendStatic:X,handleInput:c=>vo.current(c),freezeTcgArtifact:ht,rearmArtifactFreeze:()=>{xr.current=!1},openSwitchConfirm:c=>on({reason:"switch",to:c}),emitFeedback:D,excluded:xt.excluded,openBrowse:xt.open,initialGenerateLimits:y,ensureProjectAndFolder:oa,config:d});go.current=Qe.tcgLog;let{chatMode:ge,tcgError:yc,tcgValidationError:Tc,composeIdleHint:wc,inputClearSeq:ia,handleGenerateSubmit:sa,flashComposeHint:Bn,setTcgError:Sc}=Qe,yr=(0,S.useCallback)(async(c,p)=>{let a=ii({objective:c,globalDir:Yt(je,"variables"),localDir:Yt(process.cwd(),".testmuai","variables")}),f=l.nextRunIndex();U.current=f,H.current=a.auteurObjective,l.logRunStart(f,a.auteurObjective,p??""),l.setFirstRun(a.auteurObjective,p??"");let w=v.getResolvedBasicAuth(),L=w,N=null;if(!L&&(N=await v.getToken(),!N)){le({type:"error",text:"Not authenticated. Run /login first."});return}let G={basicAuth:w??null,token:N,resolver:v.getResolver(),resolvedCreds:null};Q.current=G;let K=v.creds.getActiveProfile()??"default",oe=v.creds.getDefaultEnv();Lo(v.creds,d,K,oe,(de,Ge,ut,Ze)=>l.log(de,Ge,ut,Ze));let Fe=d.load();if(ve(Fe),f===0&&!e){l.log("info","ATM_CREATE_START","Creating test via ATM endpoint",{run_index:0});let de=await An(),Ge=d.load();ve(Ge);let ut=qe(ce),Ze=L?{username:L.username,access_key:L.access_key}:await _t();if(Ze){let bt=await li({tmsBaseUrl:ut.tmsBaseUrl,auth:{username:Ze.username,access_key:Ze.access_key},objective:a.auteurObjective,url:p??I.default_url??"",projectId:de?.projectId??Ge.project_id??"",folderId:de?.folderId??Ge.folder_id??"",hasCustomProfile:!!I.chrome_profile_path,log:(Pr,ma,fa,pa)=>l.log(Pr,ma,fa,pa)});bt&&(l.setTestId(bt),de?.projectId&&l.setProjectId(de.projectId))}}let ze=null;if(ie.useCft)le({type:"info",text:"CfT mode: Playwright will manage browser"});else if(ie.wsEndpoint)le({type:"info",text:`WS endpoint: ${ie.wsEndpoint.slice(0,60)}...`});else if(ie.cdpEndpoint)le({type:"info",text:`CDP endpoint: ${ie.cdpEndpoint}`});else{le({type:"info",text:"Starting Chrome..."});try{ze=await En.ensureChrome(p)}catch(Ge){le({type:"error",text:No(Ge)});return}l.logChromeLaunch(ze.port,ze.cdpEndpoint),le({type:"info",text:`Chrome ready (port ${ze.port})`});let de=Go({headless:ie.headless,cdpEndpoint:ze.cdpEndpoint,chromePid:ze.process.pid});de&&(he.current=de,rt("marker-overlay",()=>de.kill()))}l.setAuteurVariables(a.auteur),W.current=a;let Ot=L&&!e?await si({variables:a,auth:L,orgId:String((await _t())?.org_id??""),env:ce,localMode:e,log:(de,Ge,ut,Ze)=>l.log(de,Ge,ut,Ze)}):{};re.current=Ot;let lt=Ur(Yt(je,"global-memory.md")),$t=Ur(Yt(process.cwd(),".testmuai","context.md")),an=ze?{cdpEndpoint:ze.cdpEndpoint,instance:ze,tempDir:null}:ie.wsEndpoint?{wsEndpoint:ie.wsEndpoint,instance:null,tempDir:null}:ie.cdpEndpoint?{cdpEndpoint:ie.cdpEndpoint,instance:null,tempDir:null}:{instance:null,tempDir:null};if(f===0){let de={mode:I.mode,max_steps:ie.maxSteps,timeout:ie.timeout>0?ie.timeout:void 0,target:ze?"chrome":ie.cdpEndpoint?"cdp":ie.wsEndpoint?"ws":void 0,chrome_profile:I.chrome_profile_path||void 0,cdp_endpoint:ie.cdpEndpoint||void 0,ws_endpoint:ie.wsEndpoint||void 0,headless:ie.headless,global_context:lt??void 0,local_context:$t??void 0,variables:Object.keys(a.auteur).length>0?a.auteur:void 0};l.setResolvedGlobal(de)}let Ft=oi(a.auteur,a.auteurObjective),Mn=ri({objective:a.auteurObjective,url:p,model:I.model,chrome:an,auth:G,sessionId:l.sessionId,runIndex:f,windowSize:I.window_size,maxSteps:ie.maxSteps,headless:ie.headless,variables:Object.keys(Ft).length>0?Ft:void 0,globalContext:lt??void 0,localContext:$t??void 0,sessionContext:l.getContext()});p&&E(p),Ve(null),P.startRun(Mn,{environment:ce,mode:I.mode,log:(de,Ge,ut,Ze)=>l.log(de,Ge,ut,Ze)}),ae(de=>de+1)},[v,En,d,I,l,ce,P,le,ie,An,_t]),aa=(0,S.useCallback)(async c=>{let p=vc(c),a=Qo(p),f=new Fn,w=v.getResolvedBasicAuth(),L=null;w||(L=await v.getToken());let N={basicAuth:w??null,token:L,resolver:v.getResolver(),resolvedCreds:null},G=ce,K=qe(G),oe=v.creds.getActiveProfile()??"default";return{path:p,cwd:process.cwd(),opts:{},isAgent:!1,resolved:a,resolvedAuth:N,cliOverrides:{},environment:G,envConfig:K,profile:oe,model:"v16-alpha",creds:v.creds,configStore:d,session:f,skipGlobalRemoteLogger:!0,onAnnounce:_n}},[v,d,ce,_n]),se=Qi({buildInput:aa,remoteLogger:null}),Tr=(0,S.useRef)(null);(0,S.useEffect)(()=>{if(P.bifurcationInfo&&P.bifurcationInfo!==Tr.current){Tr.current=P.bifurcationInfo;let{flows:c,isSingleFlow:p}=P.bifurcationInfo;if(p&&c.length===1&&c[0])l.log("info","OBJECTIVE_REWRITTEN","Objective rewritten",{objective:c[0]}),le({type:"info",text:`Objective: ${c[0]}`});else if(!p&&c.length>1){let a=[`Bifurcated into ${c.length} flows:`];c.forEach((f,w)=>a.push(` ${w+1}. ${f}`)),l.log("info","BIFURCATION","Objective bifurcated into flows",{flow_count:c.length}),le({type:"info",text:a.join(`
|
|
14
|
+
`)})}}},[P.bifurcationInfo,l,le]);let wr=S.default.useRef(null),Sr=S.default.useRef(0),Rr=S.default.useRef(0);(0,S.useEffect)(()=>{if(P.lastRunEnd&&P.lastRunEnd!==wr.current){wr.current=P.lastRunEnd;let{status:c,duration:p,summary:a,reason:f,context:w}=P.lastRunEnd,{passed:L,failed:N,total:G}=Wo(P.steps);Sr.current+=G,Rr.current+=p??0,Ve({status:c,duration:p??0,summary:a??"",stepsPassed:L,stepsFailed:N,stepsTotal:G,reason:f,finalState:P.lastRunEnd?.final_state,creditsConsumed:P.lastRunEnd?.credits_consumed}),l.logRunEnd(U.current,c,p,a);let K=P.bifurcationInfo,oe=K&&!K.isSingleFlow?K.flows:null,Fe=Po(P.lastRunEnd,U.current,oe),ze=Do(P.lastRunEnd,H.current,U.current,Fe);l.addRunResult(ze,P.lastRunEnd?.total_runs);let Ot=P.lastRunEnd?.per_flow_metadata;if(K&&!K.isSingleFlow&&Ot&&Ot.length>1)for(let lt=0;lt<Ot.length;lt++){let $t=Ot[lt],an=P.steps[lt],Ft=an?.children??[],Mn=Ft.filter(bt=>bt.status==="passed").length,de=Ft.filter(bt=>bt.status==="failed").length,Ge=Ft.reduce((bt,Pr)=>bt+(Pr.duration??0),0),ut=an?.status==="failed"?"failed":"passed",Ze=K.flows[lt]??an?.objective??H.current;l.addFlow({runIndex:U.current,flowId:K.flows[lt],objective:Ze,status:ut,summary:$t.summary??"",duration:Ge,steps:Mn+de,stepsPassed:Mn,stepsFailed:de,reason:$t.error_message??void 0,creditsConsumed:$t.credits_consumed??void 0})}else l.addFlow({runIndex:U.current,objective:H.current,status:c,summary:a??"",duration:p??0,steps:G,stepsPassed:L,stepsFailed:N,reason:f,creditsConsumed:P.lastRunEnd?.credits_consumed})}},[P.lastRunEnd,l,le]);let kr=(0,S.useRef)(null);(0,S.useEffect)(()=>{P.askingUser&&(kr.current=P.askingUser)},[P.askingUser]);let Cr=(0,S.useRef)(null);(0,S.useEffect)(()=>{if(be&&!P.isRunning&&P.lastRunEnd){if(Cr.current===P.lastRunEnd)return;Cr.current=P.lastRunEnd,X((0,b.jsxs)(g,{flexDirection:"column",children:[(0,b.jsx)(qs,{status:be.status,steps:be.stepsTotal,duration:be.duration,creditsConsumed:be.creditsConsumed,reason:be.reason}),(0,b.jsx)(Ws,{})]})),Ve(null)}},[be,P.isRunning,P.lastRunEnd,X]);let bo=(0,S.useRef)(null);(0,S.useEffect)(()=>{if(se.runSummary&&!se.running){if(bo.current===se.runSummary)return;bo.current=se.runSummary,(se.summary||se.links)&&X((0,b.jsxs)(g,{flexDirection:"column",children:[se.summary&&(0,b.jsx)(ti,{data:se.summary}),se.links&&(0,b.jsx)(Un,{...se.links,autoExit:!1})]}))}},[se.runSummary,se.running,se.summary,se.links,X]),(0,S.useEffect)(()=>{he.current?.setRunActive(P.isRunning)},[P.isRunning]),(0,S.useEffect)(()=>{if(P.runError&&!P.isRunning){let c=P.runError.trim();l.log("error","RUNNER_ERROR","Runner error occurred",{error:c}),l.escalateRun(l.nextRunIndex()-1);let a=c.split(`
|
|
15
|
+
`).slice(-8).join(`
|
|
16
|
+
`);le({type:"error",text:`Runner error:
|
|
17
|
+
${a}`})}},[P.runError,P.isRunning,le,l]);let Pn=(0,S.useCallback)(async()=>{l.log("info","EXIT_UPLOAD_START","Starting exit upload pipeline"),Qt(Nn()),tt({status:"uploading"});let c=v.getResolvedBasicAuth(),p=null;if(!c&&(p=await v.getToken(),!p))return l.log("warn","EXIT_UPLOAD_ABORTED","Exit upload aborted \u2014 no auth available"),null;let a=Le??await _t();if(!a)return l.log("warn","EXIT_UPLOAD_ABORTED","Exit upload aborted \u2014 no TMS credentials"),l.setUploadStatus("failed","Could not get TMS credentials"),null;l.log("info","EXIT_UPLOAD_CONFIG","Exit upload configuration",{test_id:l.testId,commit_id:l.sessionId,project_id:I.project_id,session_dir:l.sessionDir,run_dirs:l.getRunDirs()});let f={basicAuth:c??null,token:p,resolver:v.getResolver(),resolvedCreds:a};Et.current&&(l.log("info","SCREENSHOT_UPLOAD_DRAIN","Draining screenshot queue before pipeline"),await Et.current.drain(),l.log("info","SCREENSHOT_UPLOAD_DRAINED","Screenshot queue drained"));let w=ai({session:l,env:ce,auth:f,variables:W.current??{raw:{},auteur:{},auteurObjective:"",secretEntries:[],nonSecretEntries:[]},variableIds:re.current,projectId:I.project_id,folderId:I.folder_id,totalSteps:Sr.current,totalDuration:Rr.current,screenshotExtMap:Et.current?.getExtMap(),codeExport:ci({codeExport:t,codeLanguage:o,skipCodeValidation:i},I.code_export),onProgress:(G,K,oe)=>{l.log("info","EXIT_PROGRESS","Upload progress",{step:G,status:K,detail:oe}),Qt(Fe=>ei(Fe,G,K,oe))},log:(G,K,oe,Fe)=>l.log(G,K,oe,Fe),shouldUploadArtifacts:!0,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0}),N=await new ui(w).execute();if(N.success){l.log("info","EXIT_UPLOAD_OK","Exit upload succeeded",{test_id:N.testId,testcase_id:N.testcaseId??null,share_id:N.shareId??null}),l.setUploadStatus("uploaded"),N.testId&&l.setTestId(N.testId),N.testcaseId&&l.setTestcaseId(N.testcaseId);let G=qe(ce),K=I.project_id,oe=N.testcaseId&&N.shareId&&K?Fr(G.testManagerUiUrl,K,N.testcaseId,N.shareId):void 0,Fe=N.testcaseId&&K?Nr(G.testManagerUiUrl,K,N.testcaseId):void 0;tt({status:"success",testUrl:oe,testCaseLink:Fe,codeExportDir:N.codeExportDir}),Gs({shareableLink:oe,testCaseLink:Fe,codeExportDir:N.codeExportDir})}else l.log("error","EXIT_UPLOAD_FAILED","Exit upload failed",{error:N.error}),l.setUploadStatus("failed",N.error),tt({status:"failed",error:N.error});return N},[v,ce,l,I,Le,_t]),Dn=(0,S.useCallback)(async()=>{l.log("info","SESSION_RESET_START","Starting session reset via /new"),kt(!0);let c=l.getFlows();c.length>0&&X((0,b.jsx)(io,{flows:c}));let p=null;if(!e)try{p=await Pn()??null}catch(w){l.log("error","SESSION_RESET_UPLOAD_FAILED","Upload failed during /new",{error:String(w)}),le({type:"error",text:"Upload failed \u2014 session data saved locally."})}let a=null;try{let{persistRecordedSession:w}=await import("./persist-recorded-session-A5EJ25AE.js");a=w(l,{testcaseId:l.testcaseId??void 0,projectId:I.project_id??void 0,folderId:I.folder_id??void 0,codeExportDir:p?.codeExportDir})}catch(w){l.log("error","SESSION_RESET_PERSIST_FAILED","Persist failed during /new",{error:String(w)})}if(p?.success&&p.testcaseId||a){let w=qe(ce),L=I.project_id,N=p?.testcaseId;X((0,b.jsx)(Un,{recordedTestPath:a?.recordedTestPath,outputDir:a?.outputDir,shareableLink:N&&p?.shareId&&L?Fr(w.testManagerUiUrl,L,N,p.shareId):void 0,testCaseLink:N&&L?Nr(w.testManagerUiUrl,L,N):void 0,codeExportDir:p?.codeExportDir,autoExit:!1}))}l.testId&&yn(w=>[...w,{testId:l.testId,runCount:te}]),En.killChrome(),await l.finish("complete");let f=new Fn;f.start({model:I.model,environment:ce,profile:Vt??null}),A.current=f,C(w=>w+1),l.log("info","SESSION_RESET_COMPLETE","Session reset complete",{new_session_id:f.sessionId}),await ot({kind:"resessionize",env:ce},He),ae(0),Sr.current=0,Rr.current=0,U.current=0,H.current="",W.current=null,re.current={},jn.current=0,Er.current=0,kr.current=null,Cr.current=null,wr.current=null,Tr.current=null,Ve(null),E(null),tt(null),Qt(Nn()),kt(!1),X((0,b.jsxs)(g,{flexDirection:"column",marginY:1,children:[(0,b.jsx)(n,{color:r.dim,children:"\u2500".repeat(44)}),(0,b.jsx)(n,{color:r.green,bold:!0,children:"New session started"})]}))},[l,le,X,e,Pn,En,te,I,ce,Vt,He]),yo=(0,S.useCallback)(async()=>{if(!(l.nextRunIndex()>0)){le({type:"info",text:"No runs in current session."});return}if(P.isRunning){le({type:"error",text:"Cannot reset while a run is in progress. Cancel the run first."});return}if(I.mode==="testing"&&!l.sessionName){Dt("new"),en(Wr());return}await Dn()},[l,P,le,I.mode,Dn]),To=(0,S.useCallback)(async()=>{await l.finish("complete"),Wt(0,"Session complete")},[l]),ca=(0,S.useCallback)(async c=>{Tn(!1);let p=l.testId??(ke.length>0?ke[ke.length-1].testId:null);if(c&&p){l.log("info","EXIT_FEEDBACK_SUBMIT","Submitting session feedback",{choice:c});try{let a=qe(ce),f=v.getResolvedBasicAuth();f&&await Xs({tmsBaseUrl:a.tmsBaseUrl,username:f.username,accessKey:f.access_key,testId:p,feedbackType:c,log:(w,L,N,G)=>l.log(w,L,N,G)})}catch(a){l.log("error","EXIT_FEEDBACK_FAILED","Feedback submission failed",{error:String(a)})}}else l.log("info","EXIT_FEEDBACK_SKIPPED","Feedback skipped");To()},[ce,v,l,To,ke]),Ln=(0,S.useCallback)(async()=>{let c=l.nextRunIndex()>0,p=null;if(c&&!e){l.log("info","EXIT_WITH_ACTIVE_SESSION","Exit with active session \u2014 uploading first"),ue(!0);try{p=await Pn()??null}catch(f){l.log("error","EXIT_UPLOAD_FAILED","Exit upload failed",{error:String(f)})}l.testId&&yn(f=>[...f,{testId:l.testId,runCount:te}])}try{let{persistRecordedSession:f}=await import("./persist-recorded-session-A5EJ25AE.js"),w=f(l,{testcaseId:l.testcaseId??void 0,projectId:I.project_id??void 0,folderId:I.folder_id??void 0,codeExportDir:p?.codeExportDir});w&&pr(w)}catch(f){l.log("error","EXIT_PERSIST_FAILED","Persist failed during /exit",{error:String(f)})}if(c&&!e&&await l.finish("complete"),!(l.testId??(ke.length>0?ke[ke.length-1].testId:null))||e){await l.finish("complete"),Wt(0,"No test ID \u2014 quick exit");return}ue(!0),Tn(!0)},[l,e,Pn,te,ke,I]),vt=(0,S.useCallback)(async()=>{if(q)return;l.log("info","EXIT_START","TUI exit initiated");let c=I.mode==="testing",p=l.nextRunIndex()>0;if(c&&p&&!l.sessionName){Dt("exit"),en(Wr());return}await Ln()},[q,l,I.mode,Ln]),la=(0,S.useCallback)(c=>{c&&l.setSessionName(c);let p=wn;en(null),Dt(null),p==="new"?Dn():Ln()},[l,wn,Ln,Dn]);(0,S.useEffect)(()=>{if(!q)return;let c=300*1e3,p=setTimeout(async()=>{l.setUploadStatus("failed","Upload timed out after 5m"),await l.finish("complete"),Wt(0,"Upload timed out after 5m")},c);return()=>clearTimeout(p)},[q,l]);let jn=S.default.useRef(0),Ir=S.default.useRef(null),Er=S.default.useRef(0),_r=S.default.useRef(0),Ar=S.default.useRef(null);ye((c,p)=>{if(p.ctrl&&c==="c"){if(ge==="generate"&&(Z.isStreaming||Qe.submitting)){Qe.cancelGenerate(),_r.current++,Ar.current&&clearTimeout(Ar.current),Ar.current=setTimeout(()=>{_r.current=0},2e3),_r.current>=2&&vt();return}if(!se.running){if(q){Er.current+=1,Er.current>=2&&(l.setUploadStatus("pending","Force exit by user"),l.finish("complete"),Wt(0,"Force exit by user"));return}if(P.isRunning){P.cancelRun(),le({type:"info",text:"Run cancelled."}),jn.current++,Ir.current&&clearTimeout(Ir.current),Ir.current=setTimeout(()=>{jn.current=0},2e3),jn.current>=2&&vt();return}vt()}}}),ye((c,p)=>{if(p.ctrl&&c==="t"&&ge==="generate"&&!Z.isStreaming){Bn("no thinking yet");return}});let wo=S.default.useMemo(()=>{let c=v.creds.getActiveProfile()??"none",p=v.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:ie.headless?"on":"off",options:[{label:"off",value:"off"},{label:"on",value:"on"}],onValue:a=>{sn(f=>({...f,headless:a==="on"}))}},{id:"run-max-steps",label:"Max Steps",type:"text-input",currentValue:String(ie.maxSteps),onValue:a=>{let f=parseInt(a,10);f>0&&sn(w=>({...w,maxSteps:f}))}},{id:"run-timeout",label:"Timeout (sec)",type:"text-input",currentValue:ie.timeout?String(ie.timeout):"",placeholder:"0 = no timeout",onValue:a=>{let f=parseInt(a,10);sn(w=>({...w,timeout:isNaN(f)?0:f}))}},{id:"run-cdp",label:"CDP Endpoint",type:"text-input",currentValue:ie.cdpEndpoint,placeholder:"http://127.0.0.1:9222",onValue:a=>{sn(f=>({...f,cdpEndpoint:a}))}},{id:"run-ws",label:"WS Endpoint",type:"text-input",currentValue:ie.wsEndpoint,placeholder:"wss://...",onValue:a=>{sn(f=>({...f,wsEndpoint:a}))}}]}]},{id:"auth",label:"Auth",type:"submenu",children:[{id:"login",label:"Login",type:"action",onLoginWizard:()=>{}},{id:"logout",label:"Logout",type:"action",onAction:()=>{v.logout().then(a=>{$e();let f=v.creds.getActiveProfile(),w=v.creds.getDefaultEnv();Je(f,w);let L=zs(f,w);ot(L,He).catch(()=>{}),a?D("ok","/logout",`Logged out: ${a.profile} [${a.env}]`):D("ok","/logout","No active profile")}).catch(()=>{D("error","/logout","Logout failed")})}},{id:"whoami",label:"Who Am I",type:"action",onInfo:()=>{let a=v.creds.getActiveProfile()??"none",f=v.creds.getDefaultEnv(),w=v.creds.loadBasicAuth(a,f),L=w?"basic":v.creds.loadCredentials(a,f)?"oauth":"not configured";return{title:"Who Am I",sections:[{label:"Identity",entries:[{key:"Profile",value:a},{key:"Environment",value:f}]},{label:"Authentication",entries:[{key:"Method",value:L},...w?[{key:"Username",value:w.username}]:[]]},{label:"Token",entries:[{key:"Status",value:v.tokenValid?"valid":"not logged in",color:v.tokenValid?r.green:r.red}]}]}}},{id:"balance",label:"Credit Balance",type:"action",suppressFeedback:!0,onAction:()=>{(async()=>{let a=v.creds.getActiveProfile()??"default",f=v.creds.getDefaultEnv(),w=qe(f);try{let L=v.getBasicAuth(),N=L?null:await v.getToken();if(!L&&!N){Ne({text:"Not authenticated. Run /login first.",color:r.red});return}let{ControllerClient:G}=await import("./controller-client-RD2YEMAH.js"),oe=await(L?new G(w.controllerBaseUrl,{username:L.username,accessKey:L.access_key}):new G(w.controllerBaseUrl,N)).getCreditBalance();Ne({text:`Credits \u2014 available: ${oe.available_credits}, total: ${oe.total_credits} (${a} / ${f})`,color:r.green})}catch(L){Ne({text:`Balance check failed: ${L instanceof Error?L.message:String(L)}`,color:r.red})}Rt.current&&clearTimeout(Rt.current),Rt.current=setTimeout(()=>{Ne(null),Rt.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:ln}]},{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:r.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:a=>{(a==="action"||a==="testing")&&(d.set("mode",a),ve(d.load()),D("ok","/config set-mode",a))}},{id:"config-generate",label:"Generate",type:"submenu",currentValue:`${I.generate.scenario_limit}x${I.generate.per_scenario_limit}`,children:[{id:"config-generate-scenario-limit",label:"Scenario limit",type:"text-input",currentValue:String(I.generate.scenario_limit),placeholder:"5",onValue:a=>{let f=parseInt(a,10);if(!Number.isFinite(f)||f<1||f>20){D("error","/config",`Scenario limit must be 1-20 (got ${a})`);return}d.set("generate",{...I.generate,scenario_limit:f}),ve(d.load()),D("ok","/config",`Scenario limit: ${f}`)}},{id:"config-generate-per-scenario-limit",label:"Per-scenario limit",type:"text-input",currentValue:String(I.generate.per_scenario_limit),placeholder:"4",onValue:a=>{let f=parseInt(a,10);if(!Number.isFinite(f)||f<1||f>20){D("error","/config",`Per-scenario limit must be 1-20 (got ${a})`);return}d.set("generate",{...I.generate,per_scenario_limit:f}),ve(d.load()),D("ok","/config",`Per-scenario limit: ${f}`)}},{id:"config-generate-memory",label:"Memory",type:"select",currentValue:I.generate.memory_enabled?"on":"off",options:[{label:"on",value:"on"},{label:"off",value:"off"}],onValue:a=>{let f=a==="on";d.set("generate",{...I.generate,memory_enabled:f}),ve(d.load()),D("ok","/config",`Memory: ${f?"on":"off"}`)}}]},{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:a=>{d.set("code_export",{...I.code_export,enabled:a==="on"}),ve(d.load()),D("ok","/config code-export enabled",a)}},{id:"config-code-export-language",label:"Language",type:"select",currentValue:I.code_export.language,options:[{label:"python",value:"python"},{label:"javascript",value:"javascript"}],onValue:a=>{a!=="python"&&a!=="javascript"||(d.set("code_export",{...I.code_export,language:a}),ve(d.load()),D("ok","/config code-export language",a))}},{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:a=>{d.set("code_export",{...I.code_export,skip_validation:a==="on"}),ve(d.load()),D("ok","/config code-export skip-validation",a)}}]}]},{id:"exit",label:"Exit",type:"action",onAction:()=>{vt()}}]},[v,d,I,le,vt,ie,$e,D]),Br=(0,S.useCallback)(c=>{if(P.askingUser){let a=P.askingUser;X((0,b.jsxs)(g,{flexDirection:"column",marginLeft:2,paddingLeft:1,marginTop:1,children:[(0,b.jsx)(g,{marginLeft:1,children:(0,b.jsx)(n,{color:r.orange,bold:!0,children:"Agent Question"})}),(0,b.jsxs)(g,{borderStyle:"round",borderColor:r.orange,flexDirection:"column",paddingX:2,paddingY:1,width:70,children:[(0,b.jsxs)(g,{children:[(0,b.jsx)(g,{width:3,children:(0,b.jsx)(n,{color:r.orange,bold:!0,children:"?"})}),(0,b.jsx)(g,{flexShrink:1,children:(0,b.jsx)(n,{wrap:"wrap",children:a})})]}),(0,b.jsxs)(g,{marginTop:1,children:[(0,b.jsx)(g,{width:3,children:(0,b.jsx)(n,{color:r.dim,bold:!0,children:"\u2192"})}),(0,b.jsx)(g,{flexShrink:1,children:(0,b.jsx)(n,{wrap:"wrap",children:c})})]})]})]})),kr.current=null,P.sendAnswer(c);return}if(l.logCommand(c),P.isRunning){le({type:"error",text:"Run in progress. Ctrl+C to cancel."});return}let p=Kn(c);if(p){if(!qi(p.command,ge)){D("error",`/${p.command}`,`/${p.command} isn't available in ${ge==="run"?"Run":"Generate"} mode.`);return}switch(p.command){case"profiles":if(ge==="generate"&&Z.requestId&&p.args.action==="switch"){on({reason:"profile",pendingArgs:p.args});return}tn("auth");return;case"login":case"logout":case"whoami":case"balance":case"auth":tn("auth");return;case"config":tn("config");return;case"help":po(!0);return;case"testmd":if(P.isRunning||Z.isStreaming||se.running){D("error","/testmd","Finish or cancel the current run/generation first.");return}se.clearResult(),Cn(!0);return;case"generate":if(se.running){D("error","/generate","Finish or cancel the running test first.");return}ge==="run"?Qe.requestSwitch("generate")&&D("ok","/generate","Switched to Generate mode.",void 0,r.generateAccent):D("ok","/generate","Already in Generate mode.",void 0,r.generateAccent);return;case"run":{let a=Wi(ge,p.args.objective);switch(a.kind){case"run":yr(a.objective,ln);return;case"reject":D("error","/run",'Switch to Run mode first (bare /run), then /run "objective".');return;case"already":D("ok","/run","Already in Run mode.",void 0,r.orange);return;case"toggle":Qe.requestSwitch("run")&&D("ok","/run","Switched to Run mode.",void 0,r.orange);return}return}case"update":{(async()=>{let{getUpdateCommand:a}=await import("./version-check-RVK5YKDZ.js");D("ok","/update",`To update kane-cli, run: ${a()}`)})();return}case"summary":{if(ge==="generate"&&!Z.requestId){Bn("no generation yet"),D("ok","/summary","(no generation yet)");return}let a=l.getFlows();if(a.length===0){D("ok","/summary","No runs yet in this session.");return}let f=p.args.index?parseInt(p.args.index,10):void 0;if(f!==void 0&&!l.getFlow(f)){D("error","/summary",`No flow at index ${f}`,`${a.length} flow${a.length===1?"":"s"} available. Use /summary to see all.`);return}X((0,b.jsx)(io,{flows:a,filterIndex:f})),D("ok","/summary",f!==void 0?`Flow ${f}`:`${a.length} flow${a.length===1?"":"s"}`);return}case"new":ge==="generate"&&Z.requestId&&(ht(),Z.end().catch(a=>{D("error","/new",`Could not end generation cleanly: ${a.message}`)}),Z.reset()),yo(),D("ok","/new","Session reset");return;case"name":{let a=p.raw.replace(/^\/name\s*/,"").trim();if(!a){D("error","/name","Usage: /name <new-name>");return}(async()=>{let{validateNameOrThrow:f}=await import("./name-validator-5YGJXLZ7.js");try{f(a),l.setSessionName(a),D("ok","/name",`Session name set: ${a}`)}catch(w){D("error","/name",w.message)}})();return}case"cancel":if(ge==="generate"&&Z.isStreaming){ht(),Z.cancel(),D("ok","/cancel","Cancelled");return}if(ge==="generate"&&!Z.requestId){Bn("no generation yet"),D("ok","/cancel","(no generation yet)");return}if(se.running){se.cancel(),D("ok","/cancel","Run cancelled");return}P.cancelRun(),D("ok","/cancel","Run cancelled");return;case"clear":D("ok","/clear","Chat cleared");return;case"exit":ge==="generate"&&Z.requestId&&(ht(),Z.end()),vt();return;default:D("error",`/${p.command}`,"Unknown command");return}}if(c.trim().toLowerCase()==="exit"){vt();return}X((0,b.jsxs)(g,{children:[(0,b.jsx)(n,{color:r.orange,children:"\u276F "}),(0,b.jsx)(n,{children:c})]})),yr(c,ln)},[P,le,D,X,l,yr,vt,yo,ge,Z.isStreaming,Z.requestId,Z,Bn,ht,se]);vo.current=Br;let So=(0,S.useRef)(!1);(0,S.useEffect)(()=>{if(!So.current&&$&&x==="generate"&&h){So.current=!0;let c=setTimeout(()=>{sa(h)},50);return()=>clearTimeout(c)}},[$,x,h]);let Ro=v.getAuthInfo(),ua=Ro?Ro.method==="basic"?"basic auth":"oauth":"not logged in",da=(()=>{if(nn)return["help"];if(rn)return["testmd"];if(_)return _.phase==="wizard"?["auth","login"]:_.phase==="project"?["auth","login","project"]:_.phase==="folder"?["auth","login","folder"]:["auth","login"];let c={infoView:"info",loginWizard:"login",profilesView:"profiles",chromeProfilePicker:"chrome-profile",projectPicker:"project",folderPicker:"folder",windowSizePicker:"set-window"};return nt==="auth"?kn?["auth",c[kn]]:["auth"]:nt==="config"?kn?["config",c[kn]]:["config"]:nt==="help"?["help"]:P.askingUser?["agent question"]:[]})();return(0,b.jsxs)(g,{flexDirection:"column",children:[!$&&!fe&&(0,b.jsx)(ji,{onComplete:()=>{let c=v.creds.getActiveProfile(),p=v.creds.getDefaultEnv(),a=c?v.creds.loadCredentials(c,p):null,f=c?v.creds.loadBasicAuth(c,p):null,w=!!(a||f),L=f?.username??c??null;X((0,b.jsx)(zn,{size:"full",helmetVisibleRows:8,textVisibleRows:7,showMeta:!0,version:cn,authenticated:w,user:L})),Sn(!0);let N=(G,K,oe,Fe)=>{l.log(G,K,oe,Fe)};if(zo(v.creds,N).then(G=>{if(G.status==="authenticated"){let{profile:K,env:oe,tmsCreds:Fe}=G.result;v.creds.setActiveProfile(K),v.creds.setDefaultEnv(oe),$e(),Oe(Fe),xe("ready"),j(!0)}else G.status==="needs_pick"?(jt(G.profiles),xe("pick")):xe("login")}).catch(G=>{l.log("error","STARTUP_GATE_ERROR","Auth gate failed",{error:String(G)}),xe("login")}),m&&m.then(async G=>{if(G){let{getUpdateCommand:K}=await import("./version-check-RVK5YKDZ.js");D("ok","update available",`${G.current} \u2192 ${G.latest}`,`Run: ${K()}`)}}).catch(()=>{}),s&&s.changes.length>0){let G=`kane-cli updated to ${s.toVersion}. Default settings changed:`,K=[...s.changes.map(oe=>`\u2022 ${oe.description} (${oe.field}: ${JSON.stringify(oe.from)} \u2192 ${JSON.stringify(oe.to)})`),"","Use /config to review or revert any of these."].join(`
|
|
18
|
+
`);D("ok","defaults updated",G,K)}}}),!$&&ne==="booting"&&fe&&(0,b.jsx)(g,{paddingX:1,children:(0,b.jsx)(n,{color:"yellow",children:"Checking authentication..."})}),!$&&ne==="pick"&&(0,b.jsx)(bc,{profiles:Lt,onCancel:()=>xe("login"),onSelect:async(c,p)=>{v.creds.setActiveProfile(c),v.creds.setDefaultEnv(p),$e(),Mt(!0);let a=(f,w,L,N)=>{l.log(f,w,L,N)};try{let f=await Ho(v.creds,c,p,a);Mt(!1),f.status==="authenticated"?(Je(c,p),Oe(f.result.tmsCreds),xe("ready"),j(!0)):xe("login")}catch{Mt(!1),xe("login")}},validating:hr}),!$&&ne==="login"&&!_&&(0,b.jsx)($n,{devMode:process.env.KANE_DEV_MODE==="1",profiles:v.creds.listProfiles(),onBasicLogin:async(c,p,a,f)=>{let{validateBasicAuth:w}=await import("./validate-basic-QUPVT2EV.js");await w(p,a,f),v.creds.saveBasicAuth(c,p,{username:a,access_key:f}),v.creds.setActiveProfile(c),v.creds.setDefaultEnv(p),Xe(v.creds,d,c,p),v.setTokenValid(!0),$e()},onOAuthLogin:async(c,p)=>{v.creds.setDefaultEnv(p),await v.login(c),Xe(v.creds,d,c,p),$e()},onComplete:(c,p)=>{ot(fr(p),He).then(()=>{$e(),pe({phase:"project",profile:c,env:p})}).catch(()=>{pe({phase:"project",profile:c,env:p})})},onCancel:()=>{Wt(0,"Login cancelled at startup")}}),!$&&ne==="login"&&_?.phase==="project"&&(0,b.jsx)(Ut,{resolver:v.getResolver(),currentProjectId:null,env:_.env,onSelect:(c,p)=>{v.creds.saveProfileConfig(_.profile,_.env,{project_id:c,project_name:p}),D("ok","/config project",p,`id: ${c}`),pe({..._,phase:"folder"})},onCancel:async()=>{let c=await vr(_.profile,_.env);c&&(et(v.creds,d,_.profile,_.env,{projectId:c.id,projectName:c.name}),D("ok","/config project",c.name,`id: ${c.id}`),pe({..._,phase:"folder"}))}}),!$&&ne==="login"&&_?.phase==="folder"&&(0,b.jsx)(Gt,{resolver:v.getResolver(),projectId:v.creds.loadProfileConfig(_.profile,_.env)?.project_id??"",currentFolderId:null,env:_.env,onSelect:(c,p)=>{v.creds.saveProfileConfig(_.profile,_.env,{folder_id:c,folder_name:p}),D("ok","/config folder",p,`id: ${c}`),Je(_.profile,_.env),pe(null),xe("ready"),j(!0)},onCancel:async()=>{let c=v.creds.loadProfileConfig(_.profile,_.env);if(!c?.project_id)return;let p=await br(_.env,c.project_id);p&&(et(v.creds,d,_.profile,_.env,{folderId:p.id,folderName:p.name}),D("ok","/config folder",p.name,`id: ${p.id}`),Je(_.profile,_.env),pe(null),xe("ready"),j(!0))}}),$&&Rn==="menu"&&!q&&(0,b.jsx)(g,{marginBottom:1,children:(0,b.jsxs)(g,{borderStyle:"round",borderColor:"#dc4e08",paddingX:2,children:[(0,b.jsx)(n,{color:"#ff9500",bold:!0,children:"KaneAI CLI"}),(0,b.jsx)(n,{color:r.dim,children:" \u2502 "}),(0,b.jsx)(n,{color:"#ff9500",children:I.model}),(0,b.jsx)(n,{color:r.dim,children:" \u2502 "}),(0,b.jsx)(n,{color:r.dim,children:ua}),(0,b.jsx)(n,{color:r.dim,children:" \u2502 "}),(0,b.jsxs)(n,{color:r.dim,children:[Vt??"no profile","/",ce]})]})}),$&&!q&&(0,b.jsxs)(g,{flexDirection:"column",flexGrow:1,children:[Rn==="menu"&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(Zr,{items:wo,onRunSelected:()=>Ks("chat"),onActiveViewChange:fo,renderLoginWizard:c=>{let p=_?.phase??"wizard";if(p==="project")return(0,b.jsx)(Ut,{resolver:v.getResolver(),currentProjectId:null,env:_.env,onSelect:(a,f)=>{v.creds.saveProfileConfig(_.profile,_.env,{project_id:a,project_name:f}),D("ok","/config project",f,`id: ${a}`),pe(w=>w?{...w,phase:"folder"}:null)},onCancel:async()=>{if(!_)return;let a=await vr(_.profile,_.env);a&&(et(v.creds,d,_.profile,_.env,{projectId:a.id,projectName:a.name}),D("ok","/config project",a.name,`id: ${a.id}`),pe(f=>f?{...f,phase:"folder"}:null))}});if(p==="folder"){let a=v.creds.loadProfileConfig(_.profile,_.env);return(0,b.jsx)(Gt,{resolver:v.getResolver(),projectId:a?.project_id??"",currentFolderId:null,env:_.env,onSelect:(f,w)=>{v.creds.saveProfileConfig(_.profile,_.env,{folder_id:f,folder_name:w}),D("ok","/config folder",w,`id: ${f}`),Je(_.profile,_.env),pe(null),c()},onCancel:async()=>{if(!_)return;let f=v.creds.loadProfileConfig(_.profile,_.env);if(!f?.project_id)return;let w=await br(_.env,f.project_id);w&&(et(v.creds,d,_.profile,_.env,{folderId:w.id,folderName:w.name}),D("ok","/config folder",w.name,`id: ${w.id}`),Je(_.profile,_.env),pe(null),c())}})}return(0,b.jsx)($n,{devMode:process.env.KANE_DEV_MODE==="1",profiles:v.creds.listProfiles(),onBasicLogin:async(a,f,w,L)=>{let{validateBasicAuth:N}=await import("./validate-basic-QUPVT2EV.js");await N(f,w,L),v.creds.saveBasicAuth(a,f,{username:w,access_key:L}),v.creds.setActiveProfile(a),v.creds.setDefaultEnv(f),Xe(v.creds,d,a,f),v.setTokenValid(!0),$e()},onOAuthLogin:async(a,f)=>{v.creds.setDefaultEnv(f),await v.login(a),Xe(v.creds,d,a,f),$e()},onComplete:(a,f)=>{ot(fr(f),He).then(()=>{pe({phase:"project",profile:a,env:f})}).catch(()=>{pe({phase:"project",profile:a,env:f})})},onCancel:()=>{pe(null),c()}})},renderProfilesView:c=>(0,b.jsx)(Vr,{creds:v.creds,onSwitch:(p,a)=>{let f=v.creds.getActiveProfile()??"(none)";v.creds.setActiveProfile(p),v.creds.setDefaultEnv(a),Xe(v.creds,d,p,a),Je(p,a),$e(),ot(mo(a),He).catch(()=>{}),D("ok","/profiles switch",`${f} \u2192 ${p} [${a}]`)},onCancel:c}),renderChromeProfilePicker:c=>(0,b.jsx)(Or,{currentPath:I.chrome_profile_path,onSelect:p=>{d.set("chrome_profile_path",p),ve(d.load()),D("ok","/config chrome-profile",p),c()},onCancel:c}),renderProjectPicker:c=>(0,b.jsx)(Ut,{resolver:v.getResolver(),currentProjectId:I.project_id,env:ce,onSelect:(p,a)=>{et(v.creds,d,v.creds.getActiveProfile()??"default",v.creds.getDefaultEnv(),{projectId:p,projectName:a}),D("ok","/config project",a,`id: ${p}`),ve(d.load()),c()},onCancel:c}),renderFolderPicker:c=>(0,b.jsx)(Gt,{resolver:v.getResolver(),projectId:I.project_id??"",currentFolderId:I.folder_id,env:ce,onSelect:(p,a)=>{et(v.creds,d,v.creds.getActiveProfile()??"default",v.creds.getDefaultEnv(),{folderId:p,folderName:a}),D("ok","/config folder",a,`id: ${p}`),ve(d.load()),c()},onCancel:c}),renderWindowSizePicker:c=>(0,b.jsx)(oo,{currentWidth:I.window_size.width,currentHeight:I.window_size.height,onSelect:(p,a)=>{d.set("window_size",{width:p,height:a}),ve(d.load()),D("ok","/config set-window",`${p} \xD7 ${a}`),c()},onCancel:c})}),De&&(0,b.jsx)(g,{paddingX:1,marginTop:1,children:(0,b.jsx)(n,{color:De.color,children:De.text})})]}),Rn==="chat"&&(0,b.jsxs)(b.Fragment,{children:[(()=>{let c=Bo({isRunning:P.isRunning,bifurcationInfo:P.bifurcationInfo,steps:P.steps,cmInitCounts:P.cmInitCounts,replayInfo:P.replayInfo});return c?(0,b.jsx)(Ao,{label:c.label,hasBifurcation:c.hasBifurcation}):null})(),P.isRunning&&P.steps.length>0&&(0,b.jsx)(_o,{steps:P.steps,bifurcated:!!P.bifurcationInfo&&!P.bifurcationInfo.isSingleFlow,flows:P.bifurcationInfo?.flows,cmInitCounts:P.cmInitCounts,onStepCommit:X},`run-${U.current}`),se.runViewProps&&(0,b.jsx)(Zo,{...se.runViewProps,onCancel:()=>{se.runViewProps?.onCancel?.(),se.cancel()}}),nn&&(0,b.jsx)(Xi,{onClose:()=>po(!1),version:cn,environment:v.creds.getDefaultEnv(),sessionId:l.sessionId,runUrl:I.default_url??ln,mode:ge}),rn&&(0,b.jsx)(Ji,{cwd:process.cwd(),currentOrgId:String(Le?.org_id??""),onClose:()=>Cn(!1),onRun:c=>{if(P.isRunning||Z.isStreaming||se.running){setTimeout(()=>D("error","/testmd","Finish or cancel the current run first."),0);return}Cn(!1),!(ge==="generate"&&!Qe.requestSwitch("run"))&&(ge==="generate"&&setTimeout(()=>D("ok","/testmd",`Switched to Run mode to run ${c.relPath}`,void 0,r.orange),0),se.start(c.path).catch(p=>setTimeout(()=>D("error","/testmd",`Run failed: ${p.message}`),0)))},onExport:c=>{Cn(!1),mi(c.path,{language:I.code_export.language??"python",env:ce}).then(p=>setTimeout(()=>D("ok","/testmd",`Exported code \u2192 ${p.codeDir}`),0)).catch(p=>setTimeout(()=>D("error","/testmd",`Export failed: ${p.message}`),0))}}),nt&&!P.isRunning&&(()=>{let c=wo.find(p=>p.id===nt);return c?.children?(0,b.jsx)(Zr,{items:c.children,onRunSelected:()=>tn(null),onDismiss:()=>tn(null),onActiveViewChange:fo,renderLoginWizard:p=>{let a=_?.phase??"wizard";if(a==="project")return(0,b.jsx)(Ut,{resolver:v.getResolver(),currentProjectId:null,env:_.env,onSelect:(f,w)=>{v.creds.saveProfileConfig(_.profile,_.env,{project_id:f,project_name:w}),D("ok","/config project",w,`id: ${f}`),pe(L=>L?{...L,phase:"folder"}:null)},onCancel:async()=>{if(!_)return;let f=await vr(_.profile,_.env);f&&(et(v.creds,d,_.profile,_.env,{projectId:f.id,projectName:f.name}),D("ok","/config project",f.name,`id: ${f.id}`),pe(w=>w?{...w,phase:"folder"}:null))}});if(a==="folder"){let f=v.creds.loadProfileConfig(_.profile,_.env);return(0,b.jsx)(Gt,{resolver:v.getResolver(),projectId:f?.project_id??"",currentFolderId:null,env:_.env,onSelect:(w,L)=>{v.creds.saveProfileConfig(_.profile,_.env,{folder_id:w,folder_name:L}),D("ok","/config folder",L,`id: ${w}`),Je(_.profile,_.env),pe(null),p()},onCancel:async()=>{if(!_)return;let w=v.creds.loadProfileConfig(_.profile,_.env);if(!w?.project_id)return;let L=await br(_.env,w.project_id);L&&(et(v.creds,d,_.profile,_.env,{folderId:L.id,folderName:L.name}),D("ok","/config folder",L.name,`id: ${L.id}`),Je(_.profile,_.env),pe(null),p())}})}return(0,b.jsx)($n,{devMode:process.env.KANE_DEV_MODE==="1",profiles:v.creds.listProfiles(),onBasicLogin:async(f,w,L,N)=>{let{validateBasicAuth:G}=await import("./validate-basic-QUPVT2EV.js");await G(w,L,N),v.creds.saveBasicAuth(f,w,{username:L,access_key:N}),v.creds.setActiveProfile(f),v.creds.setDefaultEnv(w),Xe(v.creds,d,f,w),v.setTokenValid(!0),$e()},onOAuthLogin:async(f,w)=>{v.creds.setDefaultEnv(w),await v.login(f),Xe(v.creds,d,f,w),$e()},onComplete:(f,w)=>{ot(fr(w),He).then(()=>{pe({phase:"project",profile:f,env:w})}).catch(()=>{pe({phase:"project",profile:f,env:w})})},onCancel:()=>{pe(null),p()}})},renderProfilesView:p=>(0,b.jsx)(Vr,{creds:v.creds,onSwitch:(a,f)=>{let w=v.creds.getActiveProfile()??"(none)";v.creds.setActiveProfile(a),v.creds.setDefaultEnv(f),Xe(v.creds,d,a,f),Je(a,f),$e(),ot(mo(f),He).catch(()=>{}),D("ok","/profiles switch",`${w} \u2192 ${a} [${f}]`),p()},onCancel:p}),renderChromeProfilePicker:p=>(0,b.jsx)(Or,{currentPath:I.chrome_profile_path,onSelect:a=>{d.save({chrome_profile_path:a}),ve(d.load()),D("ok","/config chrome-profile",a),p()},onCancel:p}),renderProjectPicker:p=>(0,b.jsx)(Ut,{resolver:v.getResolver(),currentProjectId:I.project_id,env:ce,onSelect:(a,f)=>{et(v.creds,d,v.creds.getActiveProfile()??"default",v.creds.getDefaultEnv(),{projectId:a,projectName:f}),ve(d.load()),D("ok","/config project",f,`id: ${a}`),p()},onCancel:p}),renderFolderPicker:p=>(0,b.jsx)(Gt,{resolver:v.getResolver(),projectId:I.project_id??"",currentFolderId:I.folder_id,env:ce,onSelect:(a,f)=>{et(v.creds,d,v.creds.getActiveProfile()??"default",v.creds.getDefaultEnv(),{folderId:a,folderName:f}),ve(d.load()),D("ok","/config folder",f,`id: ${a}`),p()},onCancel:p}),renderWindowSizePicker:p=>(0,b.jsx)(oo,{currentWidth:I.window_size.width,currentHeight:I.window_size.height,onSelect:(a,f)=>{d.set("window_size",{width:a,height:f}),ve(d.load()),D("ok","/config set-window",`${a} \xD7 ${f}`),p()},onCancel:p})},nt):null})(),nt&&De&&(0,b.jsx)(g,{paddingX:1,marginTop:1,children:(0,b.jsx)(n,{color:De.color,children:De.text})}),ge==="run"&&!nt&&!nn&&!rn&&!Ct&&P.askingUser&&(0,b.jsxs)(g,{flexDirection:"column",marginLeft:2,paddingLeft:1,marginTop:1,children:[(0,b.jsx)(g,{marginLeft:1,children:(0,b.jsx)(n,{color:r.orange,bold:!0,children:"Agent Question"})}),(0,b.jsx)(g,{borderStyle:"round",borderColor:r.orange,flexDirection:"column",paddingX:2,paddingY:1,width:70,children:(0,b.jsxs)(g,{children:[(0,b.jsx)(g,{width:3,children:(0,b.jsx)(n,{color:r.orange,bold:!0,children:"?"})}),(0,b.jsx)(g,{flexShrink:1,children:(0,b.jsx)(n,{wrap:"wrap",children:P.askingUser})})]})})]}),In&&(()=>{let c=In,p=c.reason==="switch"?c.to==="run"?"Discard the current generation and switch to Run?":"Stop the current run / discard its results and switch to Generate?":"Switching profile will end this generation. Continue?",a=c.reason==="switch"?"Discard & switch":"Yes, end";return(0,b.jsx)(Us,{message:p,confirmLabel:a,onConfirm:async()=>{if(c.reason==="switch"){let w=c.to;on(null),Qe.confirmSwitch(w);return}ht();let f=c.pendingArgs;if(on(null),await Z.end(),Z.reset(),f.profile){let w=v.creds.getDefaultEnv(),L=v.creds.getActiveProfile()??"(none)";v.creds.setActiveProfile(f.profile),v.creds.setDefaultEnv(w),Xe(v.creds,d,f.profile,w),Je(f.profile,w),$e(),ot({kind:"switch",env:w},He).catch(()=>{}),D("ok","/profiles switch",`${L} \u2192 ${f.profile} [${w}]`)}else Br("/profiles switch")},onCancel:()=>on(null)})})(),ge==="run"&&!nt&&!nn&&!rn&&!Ct&&!In&&!se.running&&(0,b.jsx)(yt,{onSubmit:Br,onEscape:void 0,history:Js,commands:Gi,clearSeq:ia,placeholder:P.askingUser?"Type your answer...":P.isRunning?"Run in progress... Ctrl+C to cancel":"Type an objective... (/ = commands)",footerBindings:[{keys:"\u2191\u2193",label:"history"},{keys:"\u21B5",label:"submit"},{keys:"tab",label:"complete"},{keys:"ctrl+r",label:"search"},{keys:"/generate",label:"test cases"}]}),ge==="generate"&&!nt&&!nn&&!rn&&!Ct&&!In&&(0,b.jsx)(Fs,{tcg:Z,gm:Qe,history:Qs,tuiConfig:I,browse:xt.isOpen?{target:xt.target,onClose:xt.close,excluded:xt.excluded,onToggleCase:xt.toggleCase,onToggleScenario:xt.toggleScenario,getStatus:Qe.bifurcation.getStatus,getResult:Qe.bifurcation.getResult}:null})]})]}),$&&q&&Ue&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)($r,{steps:Jt,status:Ue.status,testUrl:Ue.testUrl,error:Ue.error}),Ue.status==="success"&&(0,b.jsx)(Un,{recordedTestPath:It?.recordedTestPath,outputDir:It?.outputDir,shareableLink:Ue.testUrl,testCaseLink:Ue.testCaseLink,codeExportDir:Ue.codeExportDir,autoExit:!1})]}),Ct&&(0,b.jsx)(_i,{defaultName:Ct,onSubmit:la}),Zt&&(0,b.jsx)(Ei,{onSubmit:ca}),Pt&&Ue&&(0,b.jsx)($r,{steps:Jt,status:Ue.status,error:Ue.error}),$&&!q&&(0,b.jsx)(Pi,{profile:Vt,environment:ce,tokenValid:v.tokenValid,runCount:te,sessionId:l.sessionId,viewMode:Rn,breadcrumb:da,chatMode:ge,tcgRequestId:Z.requestId,tcgStreamStatus:Z.isStreaming?"streaming":Z.isReconnecting?"reconnecting":Z.isTerminal&&Z.state.status.toLowerCase()==="completed"?"completed":Z.isTerminal&&Z.state.status.toLowerCase()==="failed"?"failed":null})]})}function bc({profiles:e,onSelect:t,onCancel:o,validating:i}){let[m,s]=(0,S.useState)(0);return ye((u,x)=>{if(!i){if(x.escape){o();return}if(x.upArrow&&m>0&&s(h=>h-1),x.downArrow&&m<e.length-1&&s(h=>h+1),x.return){let h=e[m];t(h.profile,h.env)}}}),(0,b.jsxs)(g,{flexDirection:"column",paddingX:1,children:[(0,b.jsx)(n,{color:"#ff9500",bold:!0,children:"Select a profile:"}),(0,b.jsx)(g,{marginTop:1,flexDirection:"column",children:e.map((u,x)=>(0,b.jsxs)(n,{children:[x===m?"\u276F ":" ",(0,b.jsx)(n,{color:x===m?"#ff9500":"white",bold:x===m,children:u.profile}),(0,b.jsxs)(n,{color:"gray",children:[" [",u.env,"]"]})]},`${u.profile}-${u.env}`))}),i&&(0,b.jsx)(g,{marginTop:1,children:(0,b.jsx)(n,{color:"yellow",children:"Validating credentials..."})}),!i&&(0,b.jsx)(g,{marginTop:1,children:(0,b.jsx)(n,{color:"gray",children:"Esc = new login"})})]})}export{$i as a,Xs as b,op as c};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as k}from"./chunk-FPFOW6BS.js";import{g as a}from"./chunk-LOIRZFV3.js";import{a as m}from"./chunk-LPUQ4HWQ.js";import{a as h}from"./chunk-
|
|
2
|
+
import{a as k}from"./chunk-FPFOW6BS.js";import{g as a}from"./chunk-LOIRZFV3.js";import{a as m}from"./chunk-LPUQ4HWQ.js";import{a as h}from"./chunk-PF7PBYCJ.js";import{a as y}from"./chunk-S7JV4A3U.js";var $=10,u=200,N=1e4,S=1e6;function T(t,e,r="streaming"){let n=r==="full-fetch"?S:N,o=$,i=0;if(t!==void 0){let s=Number(t);if(!Number.isInteger(s)||s<1||s>u)return{error:`--limit must be an integer in [1, ${u}] (got "${t}")`};o=s}if(e!==void 0){let s=Number(e);if(!Number.isInteger(s)||s<0||s>n)return{error:`--offset must be an integer in [0, ${n}] (got "${e}")`};i=s}return{limit:o,offset:i}}function C(t,e){if(!e)return t;let r=e.toLowerCase();return t.filter(n=>n.name.toLowerCase().includes(r))}function j(t,{limit:e,offset:r}){let n=t.slice(r,r+e),o=t.length>r+e;return{slice:n,hasMore:o}}function v(t,e,r=n=>process.stdout.write(`${n}
|
|
3
3
|
`)){for(let n of t)r(JSON.stringify(n));r(JSON.stringify({_meta:"page",limit:e.limit,offset:e.offset,returned:t.length,has_more:e.has_more}))}function b(t,e,r=n=>process.stdout.write(`${n}
|
|
4
|
-
`)){if(t.length===0){r("(no results)");return}let n=Math.max(2,...t.map(s=>s.id.length)),o=`${"ID".padEnd(n)} NAME`;r(o),r(`${"-".repeat(n)} ----`);for(let s of t)r(`${s.id.padEnd(n)} ${s.name}`);r("");let i=e.offset+t.length;if(e.hasMore){let s=e.totalIsLowerBound?`${e.total}+`:`${e.total}`;r(`${i} of ${s} \u2014 next: --offset ${e.offset+e.limit}`)}else r(`${t.length} shown (${e.total} total)`)}async function B(t,e,r){if(r.username&&r.accessKey)return{ok:!0,creds:{username:r.username,access_key:r.accessKey}};let n=new h,o=n.loadBasicAuth(t,e);if(o)return{ok:!0,creds:{username:o.username,access_key:o.access_key}};let i=n.loadCredentials(t,e);if(!i)return{ok:!1,reason:"no_credentials"};let s=i.access_token;try{let{refreshOAuthToken:d}=await import("./token-refresh-
|
|
4
|
+
`)){if(t.length===0){r("(no results)");return}let n=Math.max(2,...t.map(s=>s.id.length)),o=`${"ID".padEnd(n)} NAME`;r(o),r(`${"-".repeat(n)} ----`);for(let s of t)r(`${s.id.padEnd(n)} ${s.name}`);r("");let i=e.offset+t.length;if(e.hasMore){let s=e.totalIsLowerBound?`${e.total}+`:`${e.total}`;r(`${i} of ${s} \u2014 next: --offset ${e.offset+e.limit}`)}else r(`${t.length} shown (${e.total} total)`)}async function B(t,e,r){if(r.username&&r.accessKey)return{ok:!0,creds:{username:r.username,access_key:r.accessKey}};let n=new h,o=n.loadBasicAuth(t,e);if(o)return{ok:!0,creds:{username:o.username,access_key:o.access_key}};let i=n.loadCredentials(t,e);if(!i)return{ok:!1,reason:"no_credentials"};let s=i.access_token;try{let{refreshOAuthToken:d}=await import("./token-refresh-4QLWR5ZI.js"),w=await d({creds:n,profile:t,env:e,credentials:i});w&&(s=w.accessToken)}catch(d){return{ok:!1,reason:"refresh_failed",detail:d instanceof Error?d.message:String(d)}}let c=y(e),f=await new k(c.controllerBaseUrl,async()=>s,null).resolve();return f?{ok:!0,creds:{username:f.username,access_key:f.access_key}}:{ok:!1,reason:"exchange_failed"}}function E(t,e,r){switch(r.reason){case"no_credentials":return{message:`error: no credentials for profile "${t}" [${e}]. Run \`kane-cli login\` or pass --username/--access-key.
|
|
5
5
|
`,exitCode:2};case"refresh_failed":return{message:`error: OAuth token refresh failed for profile "${t}" [${e}]${r.detail?`: ${r.detail}`:""}. Run \`kane-cli login\` to re-auth.
|
|
6
6
|
`,exitCode:2};case"exchange_failed":return{message:`error: TMS credential exchange failed for profile "${t}" [${e}]. Token may be revoked \u2014 try \`kane-cli login\`; if the problem persists, TMS may be down.
|
|
7
7
|
`,exitCode:2}}}function O(t){return{id:t.project_id,name:t.name}}function M(t){return{id:t.id,name:t.name}}async function P(t,e,r,n){let o=r+n+1,i=[],s=!0;for await(let c of t.listProjectsStream({name:e})){if(i.push(...c.projects),c.done){s=!0;break}if(i.length>=o){s=!1;break}}return{items:i,doneStreaming:s}}function g(t){return!!t.agent||!process.stdin.isTTY||!process.stdout.isTTY}function _(t,e=r=>process.stdout.write(`${r}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as m}from"./chunk-GNJBT6SS.js";import{v as t}from"./chunk-3QWAABMG.js";import{a as p}from"./chunk-HCBYKLMW.js";import{a,b as r,i as u}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as n}from"./chunk-UR6MHSHU.js";var c=n(b(),1);var e=n(p(),1);function R({onSubmit:l}){let[o,f]=(0,c.useState)(0),s=(0,c.useRef)(!1);return u((x,i)=>{s.current||(i.leftArrow||i.rightArrow?f(d=>d===0?1:0):i.return?(s.current=!0,l(o===0?"positive":"negative")):i.escape&&(s.current=!0,l(null)))}),(0,e.jsxs)(a,{flexDirection:"column",marginTop:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(r,{color:t.secondary,children:"Rate this session: "}),(0,e.jsx)(r,{color:o===0?t.orange:t.dim,children:o===0?"[ \u{1F44D} ]":" \u{1F44D} "}),(0,e.jsx)(r,{children:" "}),(0,e.jsx)(r,{color:o===1?t.orange:t.dim,children:o===1?"[ \u{1F44E} ]":" \u{1F44E} "})]}),(0,e.jsx)(m,{bindings:[{keys:"\u2190/\u2192",label:"select"},{keys:"\u21B5",label:"submit"}],escBackLabel:"skip"})]})}export{R as a};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{c as g}from"./chunk-
|
|
2
|
+
import{c as g}from"./chunk-3QWAABMG.js";import{readFileSync as o,writeFileSync as h,mkdirSync as u,readdirSync as a,unlinkSync as s,existsSync as l,chmodSync as f}from"fs";import{join as n,dirname as P}from"path";var d=class{baseDir;profilesDir;configFile;constructor(t=g){this.baseDir=t,this.profilesDir=n(t,"profiles"),this.configFile=n(t,"config.json")}readConfig(){try{return JSON.parse(o(this.configFile,"utf-8"))}catch{return{}}}writeConfig(t){u(this.baseDir,{recursive:!0,mode:448}),h(this.configFile,JSON.stringify(t,null,2)+`
|
|
3
3
|
`),f(this.configFile,384)}getActiveProfile(){return this.readConfig().active_profile??null}setActiveProfile(t){let i=this.readConfig();i.active_profile=t,this.writeConfig(i)}getDefaultEnv(){return this.readConfig().default_env??"prod"}setDefaultEnv(t){let i=this.readConfig();i.default_env=t,this.writeConfig(i)}credentialsPath(t,i){return n(this.profilesDir,t,i,"credentials")}clientPath(t,i){return n(this.profilesDir,t,i,"client.json")}basicAuthPath(t,i){return n(this.profilesDir,t,i,"basic-auth")}profileConfigPath(t,i){return n(this.profilesDir,t,i,"profile-config.json")}saveProfileConfig(t,i,r){let e=this.loadProfileConfig(t,i)??{};this.writeSecure(this.profileConfigPath(t,i),{...e,...r})}loadProfileConfig(t,i){try{return JSON.parse(o(this.profileConfigPath(t,i),"utf-8"))}catch{return null}}writeSecure(t,i){try{u(P(t),{recursive:!0,mode:448}),h(t,JSON.stringify(i,null,2)+`
|
|
4
4
|
`),f(t,384)}catch(r){let e=r instanceof Error?r.message:String(r);process.stderr.write(`[auth] Failed to save credentials: ${e}
|
|
5
5
|
`)}}saveCredentials(t,i,r){this.writeSecure(this.credentialsPath(t,i),r)}loadCredentials(t,i){try{return JSON.parse(o(this.credentialsPath(t,i),"utf-8"))}catch{return null}}saveClient(t,i,r){this.writeSecure(this.clientPath(t,i),r)}loadClient(t,i){try{return JSON.parse(o(this.clientPath(t,i),"utf-8"))}catch{return null}}getActiveCredentials(){let t=this.getActiveProfile();if(!t)return{credentials:null,profile:null,env:null};let i=this.getDefaultEnv();return{credentials:this.loadCredentials(t,i),profile:t,env:i}}saveBasicAuth(t,i,r){this.writeSecure(this.basicAuthPath(t,i),r)}loadBasicAuth(t,i){try{return JSON.parse(o(this.basicAuthPath(t,i),"utf-8"))}catch{return null}}deleteBasicAuth(t,i){try{s(this.basicAuthPath(t,i))}catch{}}resolveAuth(){let t=this.getActiveProfile();if(!t)return null;let i=this.getDefaultEnv(),r=this.loadBasicAuth(t,i);return r?{method:"basic",...r,profile:t,env:i}:this.loadCredentials(t,i)?{method:"oauth",profile:t,env:i}:null}listProfiles(){let t=[];try{for(let i of a(this.profilesDir)){let r=n(this.profilesDir,i);try{for(let e of a(r)){let c=n(r,e),v=l(n(c,"credentials")),p=l(n(c,"client.json")),y=l(n(c,"basic-auth"));(v||p||y)&&t.push({profile:i,env:e})}}catch{}}}catch{}return t}deleteProfile(t,i){try{s(this.credentialsPath(t,i))}catch{}if(this.getActiveProfile()===t){let r=this.readConfig();delete r.active_profile,this.writeConfig(r)}}deleteProfileFull(t,i){if(i){try{s(this.credentialsPath(t,i))}catch{}try{s(this.clientPath(t,i))}catch{}try{s(this.basicAuthPath(t,i))}catch{}try{s(this.profileConfigPath(t,i))}catch{}}else try{let r=n(this.profilesDir,t);for(let e of a(r)){try{s(n(r,e,"credentials"))}catch{}try{s(n(r,e,"client.json"))}catch{}try{s(n(r,e,"basic-auth"))}catch{}try{s(n(r,e,"profile-config.json"))}catch{}}}catch{}}};export{d as a};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{
|
|
2
|
+
import{v as a}from"./chunk-3QWAABMG.js";import{a as c}from"./chunk-HCBYKLMW.js";import{b as u}from"./chunk-C44QQJR4.js";import{a as l}from"./chunk-6YGTRKDT.js";import{e as n}from"./chunk-UR6MHSHU.js";var s=n(l(),1);var o=n(l(),1);function f(r,e){let t=(0,o.useRef)(r);t.current=r,(0,o.useEffect)(()=>{if(e===null)return;let i=setInterval(()=>t.current(),e);return()=>clearInterval(i)},[e])}var p=n(c(),1),m=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function I({active:r=!0}){let[e,t]=(0,s.useState)(0);return f(()=>{t(i=>(i+1)%m.length)},r?80:null),(0,p.jsx)(u,{color:a.orange,children:r?m[e]:"\u25CF"})}export{f as a,I as b};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as $}from"./chunk-BM25JQ3Z.js";import{b as D}from"./chunk-K4PLPKPF.js";import{a as E}from"./chunk-NLCCBXXV.js";function U(e){return["completed","failed","ended","stopped"].includes(e.trim().toLowerCase())}function je(e){return["ended","stopped"].includes(e.trim().toLowerCase())}function q(e){return{requestId:e.requestId,objective:e.objective,status:"",turnActive:!1,scenarios:[],thinking:"",thinkingLog:[],chatLog:[],progress:0}}function Re(e){return e.pendingClarification===void 0?e:{...e,pendingClarification:void 0}}function Ce(e){return{...e,turnActive:!0,error:void 0,thinking:"",thinkingLog:[]}}function P(e,t){switch(t.type){case"thinking":return{...e,status:"thinking",thinking:e.thinking+t.delta};case"thinking_done":return{...e,thinkingLog:[...e.thinkingLog,{text:e.thinking,tookMs:t.tookMs}],thinking:""};case"progress":return{...e,progress:t.pct};case"snapshot":return{...e,scenarios:t.data.scenarios,status:t.data.status,headline:t.data.headline??e.headline};case"chat":return{...e,turnActive:!1,chatLog:[...e.chatLog,{role:"model",text:t.text}]};case"clarification":return{...e,turnActive:!1,chatLog:[...e.chatLog,{role:"model",text:t.text}],pendingClarification:t.text};case"limit":return{...e,limits:{scenarioLimit:t.scenarioLimit,perScenarioLimit:t.perScenarioLimit}};case"error":return{...e,error:t.message};case"done":return{...e,status:t.status,turnActive:!1,error:t.status==="failed"&&!e.error?"generation failed":e.error}}}function H(e,t){let n=[],i=e.type??"",l=e.status??"";if(i==="ping")return n;switch(i){case"thinking_token":typeof e.data=="string"&&n.push({type:"thinking",delta:e.data});break;case"thinking_stopped":{let r=e.data??{},o=se(r.time_taken);n.push({type:"thinking_done",text:typeof e.data=="string"?e.data:r.message??"",tookMs:o});break}case"progress":{let r=e.data??{};typeof r.progress=="number"&&n.push({type:"progress",pct:r.progress});break}case"clarification":{let r=e.data??{};typeof r.message=="string"&&n.push({type:"clarification",text:r.message});break}case"chatting_stopped":{let r=e.data??{};typeof r.message=="string"&&r.message.length>0&&n.push({type:"chat",text:r.message});break}case"limit_update":{let r=e.data??{},o=r.test_cases_limit??e.test_cases_limit,p=r.per_scenario_test_cases_limit??e.per_scenario_test_cases_limit;n.push({type:"limit",scenarioLimit:o,perScenarioLimit:p});break}case"error":{let r=typeof e.data=="string"?e.data:e.data?.message??"generation error";n.push({type:"error",message:r});break}case"request_cancelled":return n.push({type:"done",status:"stopped"}),n;case"session_ended":return n.push({type:"done",status:"ended"}),n;default:break}if(Array.isArray(e.scenarios)&&n.push({type:"snapshot",data:{requestId:t,status:l,headline:e.headline,scenarios:e.scenarios}}),l&&U(l)){let r=l.trim().toLowerCase();n.push({type:"done",status:r})}return n}function se(e){if(!e)return;let t=/^([\d.]+)(ms|s)?$/.exec(e.trim());if(!t)return;let n=Number(t[1]);if(Number.isFinite(n))return t[2]==="ms"?Math.round(n):Math.round(n*1e3)}var v=class extends Error{constructor(t){super(t),this.name="AuthError"}},M=class extends Error{constructor(t){super(t),this.name="ForbiddenError"}},I=class extends Error{constructor(t){super(t),this.name="InsufficientCreditsError"}},k=class extends Error{constructor(n,i){super(n);this.cause=i;this.name="TransportError"}};function x(e,t){let n=t?.message??t?.error??`HTTP ${e}`;return e===401?new v(n):e===403?t?.key==="insufficient_credits"?new I(n):new M(n):new k(n)}async function*J(e){let t=e.fetchImpl??fetch,n=e.maxRetries??5,i=e.maxBackoffMs??3e4,l=e.connectTimeoutMs??1e4,r=0,o=!1;for(;;){if(e.signal.aborted)return;let p=new AbortController,a=()=>p.abort();e.signal.addEventListener("abort",a,{once:!0});let c=setTimeout(()=>p.abort(),l),h;try{h=await t(e.url,{method:"GET",headers:{Authorization:await e.authHeader(),Accept:"text/event-stream"},signal:p.signal})}catch(w){if(clearTimeout(c),e.signal.removeEventListener("abort",a),e.signal.aborted)return;if(++r>n)throw new k("SSE connect failed",w);await O(F(r,i));continue}if(clearTimeout(c),!h.ok){e.signal.removeEventListener("abort",a);let w=await oe(h);if(h.status===401&&o){if(++r>n)throw x(401,w);await O(F(r,i));continue}throw x(h.status,w)}if(!h.body)throw e.signal.removeEventListener("abort",a),new k("SSE response had no body");o=!0,r=0;let g=h.body.getReader(),m=new TextDecoder("utf-8"),b="";try{for(;;){if(e.signal.aborted){await g.cancel().catch(()=>{});return}let{done:w,value:s}=await g.read();if(w)break;b+=m.decode(s,{stream:!0});let f;for(;(f=b.indexOf(`
|
|
3
|
+
|
|
4
|
+
`))>=0;){let u=b.slice(0,f);b=b.slice(f+2);let d=ie(u);d&&(yield d)}}}catch(w){if(e.signal.aborted)return;if(++r>n)throw new k("SSE stream dropped",w);await O(F(r,i));continue}finally{e.signal.removeEventListener("abort",a)}return}}function ie(e){let t="message",n="";for(let i of e.split(`
|
|
5
|
+
`))i.startsWith("event:")?t=i.slice(6).trim():i.startsWith("data:")&&(n+=i.slice(5).trim());if(t!=="message"||!n)return null;try{let i=Buffer.from(n,"base64").toString("utf-8");return JSON.parse(i)}catch{return null}}function F(e,t){return Math.min(t,1e3*2**(e-1))}function O(e){return new Promise(t=>setTimeout(t,e))}async function oe(e){try{return await e.clone().json()}catch{return}}function W(e,t){t?.length&&(e.append("files",t.map(n=>n.fileKey).join(",")),e.append("gemini_metadata",JSON.stringify(t.map(n=>({fileData:{fileUri:n.geminiUri,mimeType:n.mimeType}})))))}function Ue(e,t={}){let n=t.fetchImpl??fetch,i=new Map,l=!0;async function r(){let s=await e.authResolver.resolve();if(!s)throw new v("unauthorized; run `kane-cli login`");return E(s.username,s.access_key)}function o(s){return`${e.baseUrl}${s}`}async function p(s){if(!s.ok){let f;try{f=await s.clone().json()}catch{f=void 0}throw x(s.status,f)}return s.json()}function a(s){let f=s?.data??s;return{request_id:f.request_id??f.id,status:f.status??""}}function c(s,f,u,d){let y=q({requestId:s,objective:f});d&&(y=P(y,{type:"snapshot",data:d}),d.status==="cleaned_up"&&(y={...y,error:"session was reaped (cleaned_up) \u2014 continuing will destructively regenerate"}));let S=new AbortController;u&&(u.aborted?S.abort():u.addEventListener("abort",()=>S.abort(),{once:!0})),i.set(s,S);let A={requestId:s,state:y,events:void 0};return A.events=(async function*(){try{let C=J({url:o(`/requests/${s}/sse`),authHeader:r,signal:S.signal,log:e.log,fetchImpl:n});for await(let L of C)for(let z of H(L,s))A.state=P(A.state,z),yield z}finally{i.delete(s)}})(),A}async function h(s,f){let u=new FormData;u.append("prompt",s.prompt),l=s.memoryEnhancement??!0,u.append("memory_enhancement",String(l)),s.scenarioLimit!==void 0&&u.append("test_scenario_limit",String(s.scenarioLimit)),s.perScenarioLimit!==void 0&&u.append("per_scenario_test_cases_limit",String(s.perScenarioLimit));let d=s.projectId??e.projectId,y=s.folderId??e.folderId;d&&u.append("project_id",d),y&&u.append("folder_id",y),W(u,s.attachments);let S=await n(o("/requests"),{method:"POST",headers:{Authorization:await r()},body:u}),A=await p(S),{request_id:C}=a(A),L=String(C);return c(L,s.prompt,f)}async function g(s,f){let u=await n(o(`/requests/${s}`),{method:"GET",headers:{Authorization:await r()}}),d=await p(u),y=d?.data??d,S={requestId:s,status:y.status??"",headline:y.headline,scenarios:Array.isArray(y.scenarios)?y.scenarios:[]};return c(s,"",f,S)}async function m(s,f,u){let d=new FormData;d.append("prompt",f),d.append("chat_enabled","true"),d.append("memory_enhancement",String(l)),u?.mappings&&d.append("mappings",JSON.stringify(u.mappings)),W(d,u?.attachments);let y=await n(o(`/requests/${s}`),{method:"PUT",headers:{Authorization:await r()},body:d});if(!y.ok){let S;try{S=await y.clone().json()}catch{}throw x(y.status,S)}}async function b(s){i.get(s)?.abort();let u=await n(o(`/requests/${s}/stop`),{method:"DELETE",headers:{Authorization:await r()}});if(!u.ok&&u.status!==404){let d;try{d=await u.clone().json()}catch{}throw x(u.status,d)}}async function w(s){i.get(s)?.abort();let u=await n(o(`/requests/${s}/end`),{method:"DELETE",headers:{Authorization:await r()}});if(!u.ok&&u.status!==404){let d;try{d=await u.clone().json()}catch{}throw x(u.status,d)}}return{start:h,attach:g,chat:m,cancel:b,end:w}}import{statSync as ae,realpathSync as G,existsSync as ce}from"fs";import{extname as ue,resolve as j,isAbsolute as pe}from"path";import{homedir as V}from"os";var le=new Set([".txt",".json",".xml",".jpg",".jpeg",".png",".gif",".bmp",".webp",".pdf",".docx",".csv",".xlsx",".mp3",".wav",".m4a",".webm",".mpeg",".mpga",".mp4",".mov"]),de=50*1024*1024,X=10;function fe(e){return e==="~"?V():e.startsWith("~/")?j(V(),e.slice(2)):e}function Ge(e,t){let n=[],i=[],l=new Set,r=[],o=(()=>{try{return G(j(t))}catch{return j(t)}})(),p=o.endsWith("/")?o:o+"/";for(let a of e){let c=fe(a),h=pe(c)?c:j(t,c);if(!ce(h)){n.push(`Not found: ${a}`);continue}let g;try{g=G(h)}catch{n.push(`Cannot resolve: ${a}`);continue}if(l.has(g))continue;let m;try{m=ae(g)}catch{n.push(`Cannot read: ${a}`);continue}if(!m.isFile()){n.push(`Not a file: ${a}`);continue}if(m.size===0){n.push(`Empty file: ${a}`);continue}let b=ue(g).toLowerCase();if(!le.has(b)){n.push(`Unsupported type ${b||"(none)"}: ${a}`);continue}if(m.size>de){n.push(`Too large (>50MB): ${a}`);continue}g!==o&&!g.startsWith(p)&&i.push(`Outside working dir: ${a}`),l.add(g),r.push(g)}return r.length>X&&n.push(`Too many files: ${r.length} (max ${X})`),{ok:n.length?[]:r,errors:n,warnings:i}}var B=class extends Error{constructor(n){super(n.join("; "));this.errors=n;this.name="AttachmentValidationError"}};async function Xe(e){let{promptText:t,filePaths:n,cwd:i,scenarios:l,isRefine:r,conn:o,deps:p}=e,{ok:a,errors:c,warnings:h}=p.validate(n,i);if(c.length)throw new B(c);e.onValidated?.();let g=a.length?await p.upload(o,a,p.onUpload):[],m=r?p.buildMappings(t,l):void 0;return{promptText:t,mappings:m,attachments:g,warnings:h}}import{readFile as me}from"fs/promises";import{basename as K}from"path";async function ge(e){let t=await e.authResolver.resolve();if(!t)throw new v("unauthorized; run `kane-cli login`");return E(t.username,t.access_key)}async function he(e,t,n={}){let i=n.fetchImpl??fetch,l=await me(t),r=K(t),o=new FormData;o.append("file",new Blob([l]),r),o.append("source","omniBox"),o.append("geminiFileUpload","true");let p=await i(`${e.tmsBaseUrl}/v1/attachment`,{method:"POST",headers:{Authorization:await ge(e)},body:o,signal:n.signal});if(!p.ok){let m;try{m=await p.clone().json()}catch{}throw x(p.status,m)}let a=await p.json(),c=a?.data??a,h=c?.gemini_response?.uri,g=c?.gemini_response?.mimeType;if(!c?.file_key||!h){let m=c&&typeof c=="object"?Object.keys(c).join(","):typeof c,b=(()=>{try{return JSON.stringify(c).slice(0,500)}catch{return"<unserializable>"}})();throw new Error(`attachment upload for ${r} returned no file_key/gemini uri \u2014 status ${p.status}, body keys: [${m}], raw: ${b}`)}return{fileName:c.file_name??r,fileKey:c.file_key,geminiUri:h,mimeType:g??"application/octet-stream"}}async function tt(e,t,n,i={}){let l=[];for(let r=0;r<t.length;r++){if(i.signal?.aborted)throw Object.assign(new Error("upload aborted"),{name:"AbortError"});let o=K(t[r]);n?.({file:o,index:r+1,total:t.length,status:"uploading"});try{l.push(await he(e,t[r],i)),n?.({file:o,index:r+1,total:t.length,status:"done"})}catch(p){throw n?.({file:o,index:r+1,total:t.length,status:"failed"}),p}}return l}var ye=/@([sS])(\d+)\.([cC])(\d+)/g,be=/@([sS])(\d+)(?!\d)(?!\.[cC]\d)/g;function rt(e,t){let n={},i={};for(let l of e.matchAll(ye)){let r=Number(l[2]),o=Number(l[4]),p=t[r-1];if(!p)continue;n[`s${r}`]=String(p.id);let a=p.test_cases??[];if(a[o-1])for(let c=0;c<o;c++){let h=a[c];h&&(i[`s${r}.c${c+1}`]=String(h.id))}}for(let l of e.matchAll(be)){let r=Number(l[2]),o=t[r-1];o&&(n[`s${r}`]=String(o.id))}if(!(Object.keys(n).length===0&&Object.keys(i).length===0))return{scenario:n,testcase:i}}function R(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(n==null||typeof n!="object")return[];let i=n;if(typeof i.step!="string")return[];let l=typeof i.expected_result=="string"?i.expected_result:typeof i.outcome=="string"?i.outcome:"";t.push({step:i.step,expected:l})}return t}var we=30,Se=300;function Z(){return{mode:"testing",max_steps:we,timeout:Se,variables:{}}}function Q(e){return e.title??`Test case ${e.id}`}function ct(e,t){return $({frontmatter:Z(),heading:Q(t),steps:e.sub_objectives.map(n=>n.objective)})}function Y(e){let t=R(e.manual_steps).map(n=>n.step);return $({frontmatter:Z(),heading:Q(e),steps:t})}import{mkdtempSync as xe,mkdirSync as N,writeFileSync as ee,rmSync as te,renameSync as _e,existsSync as ne,readFileSync as ve}from"fs";import{join as _,resolve as ke}from"path";async function ft(e,t,n,i=Y){(n.redirectBareCwd??!0)&&ke(t)===process.cwd()&&(t=_(t,".testmuai","tests"));let l=T(e.objective)??e.headline,r=T(n.suiteName)??`${T(re(l,4))??"tcg"}-${e.requestId}`,o=r,p=_(t,r);ne(p)&&!Te(p,e.requestId)&&(o=`${r}-${e.requestId}`);let a=_(t,o),c=[],h=new Map;for(let m of e.scenarios){let b=(m.test_cases??[]).filter(Ae);if(b.length===0)continue;let w=T(Ee(m.scode))??T(m.sid)??`s${m.id}`,s=h.get(w)??new Set;h.set(w,s);for(let f of b){let u=T(re(f.title,5))??"case",d=`${u}_test.md`;for(let y=2;s.has(d);y++)d=`${u}-${y}_test.md`;s.add(d),c.push({dir:w,file:d,tc:f})}}if(c.length===0)return{suiteDir:a,paths:[],warning:"no functional test cases generated"};N(t,{recursive:!0});let g=xe(_(t,".tcg-tmp-"));try{N(_(g,"helpers"),{recursive:!0}),ee(_(g,".tcg-suite.json"),JSON.stringify({requestId:e.requestId,suiteName:o}));let m=[],b=new Set;for(let s of c){let f=_(g,s.dir);b.has(f)||(N(f,{recursive:!0}),b.add(f));let u=_(f,s.file);ee(u,i(s.tc)),m.push(u)}ne(a)&&te(a,{recursive:!0,force:!0}),_e(g,a);let w=m.map(s=>s.replace(g,a));return{suiteDir:a,paths:w}}catch(m){try{te(g,{recursive:!0,force:!0})}catch{}throw m}}function Ae(e){return(e.category??"").trim().toLowerCase()==="functional"}function Te(e,t){try{return JSON.parse(ve(_(e,".tcg-suite.json"),"utf-8"))?.requestId===t}catch{return!1}}function T(e){return e&&e.length>0?e:void 0}function re(e,t){return e?e.toLowerCase().replace(/[^a-z0-9]+/g," ").trim().split(/\s+/).filter(Boolean).slice(0,t).join("-"):""}function Ee(e){return e?e.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,""):""}function ht(e){let t=[];e.title&&t.push(e.title),e.description&&t.push("",e.description);let n=R(e.manual_steps);return n.length>0&&(t.push("","Steps:"),n.forEach((i,l)=>{t.push(`${l+1}. ${i.step}`)})),t.join(`
|
|
6
|
+
`).trim()}function wt(e){return{mode:"bifurcate",objective:e.objective,model:e.model,session_id:e.sessionId,run_index:0,width:0,height:0,stream:!0,variables:e.variables,...e.auth}}async function St(e,t,n){let i=D(e,t),l=()=>i.cancel();n?.addEventListener("abort",l);let r=null,o=null;try{for await(let p of i.events)if(p.type==="bifurcation_result"){let a=p,c=a.sub_objectives??[];r={sub_objectives:c,extracted_variables:a.extracted_variables??{},total_flows:a.total_flows??c.length,is_single_flow:a.is_single_flow??c.length<=1,credits_consumed:a.credits_consumed??0}}else p.type==="error"&&(o=p.message??"bifurcation error")}finally{n?.removeEventListener("abort",l),i.cancel()}if(r)return r;throw new Error(o??"bifurcation produced no result")}export{U as a,je as b,q as c,Re as d,Ce as e,P as f,v as g,Ue as h,R as i,ct as j,Y as k,ft as l,Ae as m,ht as n,wt as o,St as p,le as q,Ge as r,B as s,Xe as t,tt as u,rt as v};
|
|
@@ -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 g}from"./chunk-
|
|
2
|
+
import{b as B}from"./chunk-S3DAAAE5.js";import{a as g}from"./chunk-7CBWZLRS.js";import{v as s}from"./chunk-3QWAABMG.js";import{a as w}from"./chunk-HCBYKLMW.js";import{a as x,b as t,c as h,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"),[f,a]=(0,o.useState)(""),[m,u]=(0,o.useState)(null),l=(0,o.useMemo)(()=>f.trim()||i,[f,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)(g,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsx)(t,{color:s.orange,children:i})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[(0,e.jsx)(t,{color:s.dim,children:"enter \u2014 save with this name"}),(0,e.jsx)(t,{color:s.dim,children:"Y \u2014 edit name"}),(0,e.jsx)(t,{color:s.dim,children:"N/esc \u2014 discard session"})]})}):(0,e.jsx)(g,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsxs)(x,{children:[(0,e.jsx)(t,{color:s.orange,children:f}),(0,e.jsx)(t,{inverse:!0,children:" "})]})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[m&&(0,e.jsx)(t,{color:s.red,children:m}),(0,e.jsx)(t,{color:s.dim,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(),[m,u]=(0,o.useState)(!1);return(0,o.useEffect)(()=>{if(m){let l=setTimeout(()=>a(),50);return()=>clearTimeout(l)}},[m,a]),(0,e.jsx)(D,{defaultName:i,onSubmit:l=>{c(l),u(!0)}})}let{waitUntilExit:p,unmount:f}=h((0,e.jsx)(d,{}),{stdout:process.stderr,exitOnCtrlC:!1});p().then(()=>{try{f()}catch{}})})}export{D as a,V as b,Y as c};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as f}from"./chunk-FPFOW6BS.js";import{a as h}from"./chunk-
|
|
2
|
+
import{a as f}from"./chunk-FPFOW6BS.js";import{a as h}from"./chunk-Y6IUJZMV.js";import{a as d}from"./chunk-S7JV4A3U.js";var o=class extends Error{constructor(a,l){super(a);this.code=l;this.name="AuthError"}};async function k(c){let{creds:i,env:a,usernameFlag:l,accessKeyFlag:g,log:t}=c,e=null,u=null;if(l&&g)e={username:l,access_key:g},t("info","AUTH_RESOLVE_FLAGS","Auth resolved via CLI flags",{username:l});else{let r=i.resolveAuth();r?.method==="basic"&&(e={username:r.username,access_key:r.access_key},t("info","AUTH_RESOLVE_CONFIG","Auth resolved via config",{username:r.username}))}if(!e){let{credentials:r,profile:E}=i.getActiveCredentials();if(!r)throw new o("Not authenticated \u2014 no credentials found","not_authenticated");if(u=r.access_token,r.expires_at-Date.now()/1e3<300)try{let n=await h({creds:i,profile:E,env:a,credentials:r});n&&(u=n.accessToken,t("info","AUTH_TOKEN_REFRESHED","OAuth token refreshed"))}catch(n){let m=n instanceof Error?n.message:String(n);throw t("error","TOKEN_REFRESH_FAILED","Token refresh failed",{error:m}),new o(`Token refresh failed: ${m}`,"refresh_failed")}}let v=d(a),b=async()=>u,y=e?{username:e.username,access_key:e.access_key}:null,p=new f(v.controllerBaseUrl,b,y,t),s=await p.resolve();return s&&!e&&(e={username:s.username,access_key:s.access_key},t("info","AUTH_RESOLVE_CONTROLLER","Auth resolved via controller",{username:s.username})),{basicAuth:e,token:u,resolver:p,resolvedCreds:s}}export{o as a,k as b};
|