@testmuai/kane-cli 0.3.7 → 0.4.1
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-CBF6SP67.js → ChromeProfilePicker-63JS7QX6.js} +1 -1
- package/dist/{CliFeedbackPrompt-P2FJBV3S.js → CliFeedbackPrompt-3SDJ5GZP.js} +1 -1
- package/dist/{CliUploadProgress-B4CVWX62.js → CliUploadProgress-ZSZ7TGCN.js} +1 -1
- package/dist/ConfigView-OOQYCHWM.js +2 -0
- package/dist/FolderPicker-FILMS64I.js +2 -0
- package/dist/HelpView-KBFE4EMP.js +2 -0
- package/dist/{InfoBox-SYT7CVM4.js → InfoBox-QECFIGGW.js} +1 -1
- package/dist/{LinksBox-R3VLKMYS.js → LinksBox-2L2UX4LB.js} +1 -1
- package/dist/{ProfilesView-XKUXSFMQ.js → ProfilesView-72UTQ5PX.js} +1 -1
- package/dist/ProjectPicker-NLEAW232.js +2 -0
- package/dist/{SaveSessionPrompt-WAVXAYCK.js → SaveSessionPrompt-VNJDLJTF.js} +1 -1
- package/dist/SingleShotApp-V2UTGNZO.js +2 -0
- package/dist/SummaryBox-O772FRGO.js +2 -0
- package/dist/TestMdRunView-OVHCLNI7.js +2 -0
- package/dist/WhoamiView-LR2EFCTK.js +2 -0
- package/dist/{changelog-M5VP33UN.js → changelog-VCAUV47V.js} +1 -1
- package/dist/chunk-45VTQLJS.js +6 -0
- package/dist/chunk-4QO6JYHX.js +2 -0
- package/dist/chunk-77SZF4ZU.js +2 -0
- package/dist/chunk-7I2SQ2KP.js +2 -0
- package/dist/chunk-7NDFOI6Z.js +2 -0
- package/dist/chunk-7U4NY37W.js +22 -0
- package/dist/chunk-AGS57DSG.js +17 -0
- package/dist/chunk-C6S4IEBC.js +2 -0
- package/dist/chunk-CMRNCZGV.js +6 -0
- package/dist/chunk-DAVPOA2L.js +2 -0
- package/dist/{chunk-VUIXILBR.js → chunk-EEF6OT52.js} +8 -8
- package/dist/chunk-FGC74Z76.js +2 -0
- package/dist/chunk-FPFOW6BS.js +2 -0
- package/dist/chunk-G6AXOEED.js +2 -0
- package/dist/{chunk-74MJWDIW.js → chunk-H4XK55B3.js} +1 -1
- package/dist/chunk-HN7DVSVI.js +11 -0
- package/dist/chunk-HUOC7DUT.js +2 -0
- package/dist/chunk-IBDWHXNE.js +2 -0
- package/dist/{chunk-QKM3RHSQ.js → chunk-J2KTLZAW.js} +1 -1
- package/dist/{chunk-PQGNWC33.js → chunk-JGXJDTMO.js} +1 -1
- package/dist/chunk-JJERCR2W.js +5 -0
- package/dist/{chunk-L256AYYL.js → chunk-KJEJ7VW5.js} +1 -1
- package/dist/chunk-LAR7I5SR.js +2 -0
- package/dist/chunk-LEXQLAWB.js +60 -0
- package/dist/chunk-LOIRZFV3.js +10 -0
- package/dist/chunk-LPUQ4HWQ.js +2 -0
- package/dist/{chunk-X5CCG35O.js → chunk-OFEPMULV.js} +1 -1
- package/dist/chunk-OIPVMEM7.js +2 -0
- package/dist/chunk-P7ZUISQG.js +2 -0
- package/dist/chunk-RHUD7MK4.js +20 -0
- package/dist/chunk-RJNGCQCL.js +2 -0
- package/dist/chunk-T46Z27UL.js +5 -0
- package/dist/chunk-TCLKNUAL.js +17 -0
- package/dist/chunk-UHFCCGVX.js +2 -0
- package/dist/chunk-UYHNJUPY.js +2 -0
- package/dist/chunk-V3FSESZ4.js +2 -0
- package/dist/chunk-VKG45YIL.js +2 -0
- package/dist/chunk-YAVIOVVP.js +2 -0
- package/dist/chunk-YSSBAIJI.js +8 -0
- package/dist/chunk-Z7AXAKPX.js +9 -0
- package/dist/chunk-ZUIWBVGF.js +14 -0
- package/dist/exit-manager-V2NW7A7U.js +2 -0
- package/dist/generate-headless-XWVVEFQR.js +18 -0
- package/dist/index.js +39 -38
- package/dist/list-commands-Y6A3XR4L.js +2 -0
- package/dist/login-flow-MKAYO6IS.js +2 -0
- package/dist/persist-recorded-session-WBPLUA55.js +3 -0
- package/dist/{pipeline-L3VM7QEX.js → pipeline-L5TDZMLS.js} +1 -1
- package/dist/{recording-banner-Q66Y2UIC.js → recording-banner-Q36WARSF.js} +1 -1
- package/dist/require-project-folder-DBXAG7FB.js +2 -0
- package/dist/resolver-IDCGRPFJ.js +2 -0
- package/dist/run-test-md-H2X6CUIX.js +14 -0
- package/dist/scrollback-6GINSTL2.js +2 -0
- package/dist/tcg-generate-WURS7TXW.js +2 -0
- package/dist/testmd-actions-MQ3N7IS4.js +2 -0
- package/dist/{tms-client-R5ZIAOBH.js → tms-client-NNYXLXZK.js} +1 -1
- package/dist/token-refresh-HHNMHTYX.js +2 -0
- package/dist/validate-basic-VFJZKHOE.js +2 -0
- package/dist/{version-check-WWOS4OEZ.js → version-check-5NUDIYG4.js} +1 -1
- package/package.json +5 -5
- package/dist/ConfigView-PCX3TZNC.js +0 -2
- package/dist/FolderPicker-UTY6XQHP.js +0 -2
- package/dist/HelpView-CDK7II5Q.js +0 -2
- package/dist/ProjectPicker-TWTR6SWR.js +0 -2
- package/dist/SingleShotApp-JH6A65TZ.js +0 -2
- package/dist/SummaryBox-FDNFQYSC.js +0 -2
- package/dist/TestMdRunView-E4UDWIGT.js +0 -2
- package/dist/WhoamiView-YG6SSQTV.js +0 -2
- package/dist/chunk-2SXNPFGD.js +0 -2
- package/dist/chunk-5XTLIGWL.js +0 -2
- package/dist/chunk-7CLUJYMW.js +0 -2
- package/dist/chunk-BDC7IOXP.js +0 -17
- package/dist/chunk-BPF7TDRU.js +0 -2
- package/dist/chunk-EIZXV3UH.js +0 -2
- package/dist/chunk-G7VF5SDK.js +0 -10
- package/dist/chunk-HROFBRMS.js +0 -5
- package/dist/chunk-JHNEE2MB.js +0 -2
- package/dist/chunk-KMTNMUVS.js +0 -8
- package/dist/chunk-KX7K3Y7R.js +0 -5
- package/dist/chunk-LYSEA5FB.js +0 -6
- package/dist/chunk-MJQ2EHSC.js +0 -2
- package/dist/chunk-OQZG3V6B.js +0 -2
- package/dist/chunk-PJMTAAZ7.js +0 -2
- package/dist/chunk-PYU2JPAY.js +0 -2
- package/dist/chunk-QCNKJUPT.js +0 -2
- package/dist/chunk-R7JZMKC7.js +0 -9
- package/dist/chunk-TP6KYKPD.js +0 -2
- package/dist/chunk-U4XV5KUD.js +0 -2
- package/dist/chunk-VS5FTXRZ.js +0 -13
- package/dist/chunk-WZCGEQ6M.js +0 -2
- package/dist/chunk-X7VI7KK3.js +0 -11
- package/dist/chunk-YX3YFXT5.js +0 -2
- package/dist/chunk-ZAUHYR76.js +0 -2
- package/dist/chunk-ZY4BZQHD.js +0 -2
- package/dist/login-flow-3YFO62HA.js +0 -2
- package/dist/persist-recorded-session-LVQLORT4.js +0 -3
- package/dist/resolver-OA35IO7J.js +0 -2
- package/dist/run-test-md-5TNUTTEA.js +0 -64
- package/dist/testmd-actions-O4NTH2OR.js +0 -20
- package/dist/validate-basic-JJOEAFLT.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a,b,c}from"./chunk-
|
|
2
|
+
import{a,b,c}from"./chunk-VKG45YIL.js";import"./chunk-JGXJDTMO.js";import"./chunk-IBDWHXNE.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{c as ChromeProfilePicker,b as formatChromeProfileLine,a as listChromeProfiles};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as r}from"./chunk-
|
|
2
|
+
import{a as r}from"./chunk-FGC74Z76.js";import"./chunk-JGXJDTMO.js";import"./chunk-IBDWHXNE.js";import"./chunk-HCBYKLMW.js";import{c as e}from"./chunk-C44QQJR4.js";import{a as i}from"./chunk-6YGTRKDT.js";import{e as m}from"./chunk-UR6MHSHU.js";var t=m(i(),1);async function d(){return new Promise(o=>{let c=e(t.default.createElement(r,{onSubmit:n=>{c.unmount(),o(n)}}),{stdout:process.stderr,exitOnCtrlC:!1})})}export{d as renderFeedbackPrompt};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as P,b as g,c as f}from"./chunk-
|
|
2
|
+
import{a as P,b as g,c as f}from"./chunk-G6AXOEED.js";import"./chunk-7NDFOI6Z.js";import"./chunk-IBDWHXNE.js";import{a as c}from"./chunk-HCBYKLMW.js";import{c as d}from"./chunk-C44QQJR4.js";import{a as h}from"./chunk-6YGTRKDT.js";import{e as p}from"./chunk-UR6MHSHU.js";var e=p(h(),1);var m=p(c(),1);function w({pipeline:t,buildShareUrl:r,onDone:o}){let[n,i]=(0,e.useState)(P()),[S,l]=(0,e.useState)("uploading"),[U,R]=(0,e.useState)(),[C,E]=(0,e.useState)();return(0,e.useEffect)(()=>{let x=t.config.onProgress;t.config.onProgress=(s,u,a)=>{x(s,u,a),i(y=>g(y,s,u,a))},t.execute().then(s=>{s.success?(R(r?.(s)),l("success")):(E(s.error),l("failed")),setTimeout(()=>o(s),1500)})},[]),(0,m.jsx)(f,{steps:n,status:S,testUrl:U,error:C})}async function O(t,r){return new Promise(o=>{let n=d(e.default.createElement(w,{pipeline:t,buildShareUrl:r,onDone:i=>{n.unmount(),o(i)}}),{stdout:process.stderr,exitOnCtrlC:!1})})}export{O as renderUploadProgress};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as p,b as l,c as n}from"./chunk-HUOC7DUT.js";import{t as o}from"./chunk-IBDWHXNE.js";import{a as g}from"./chunk-HCBYKLMW.js";import{a,j as c}from"./chunk-C44QQJR4.js";import{a as R}from"./chunk-6YGTRKDT.js";import{e as t}from"./chunk-UR6MHSHU.js";var b=t(R(),1);var e=t(g(),1);function A({model:d,authLabel:v,profile:x,env:w,defaultUrl:u,projectId:r,projectName:s,folderId:i,folderName:f,windowSize:B,chromeProfile:C}){let h=r?s?`${s} (${r})`:r:"(none)",D=i?f?`${f} (${i})`:i:"(none)",{exit:m}=c();return(0,b.useEffect)(()=>{let P=setTimeout(()=>m(),50);return()=>clearTimeout(P)},[m]),(0,e.jsx)(a,{flexDirection:"column",children:(0,e.jsx)(p,{title:"Configuration",children:(0,e.jsxs)(a,{flexDirection:"column",paddingY:1,children:[(0,e.jsx)(n,{label:"Auth"}),(0,e.jsx)(l,{label:" method",value:v}),(0,e.jsx)(l,{label:" profile",value:x}),(0,e.jsx)(l,{label:" env",value:w}),(0,e.jsx)(n,{label:"Defaults"}),(0,e.jsx)(l,{label:" url",value:u??"(none)",valueColor:u?o.orange:o.dim}),(0,e.jsx)(l,{label:" model",value:d}),(0,e.jsx)(l,{label:" window",value:B}),(0,e.jsx)(l,{label:" project",value:h}),(0,e.jsx)(l,{label:" folder",value:D}),(0,e.jsx)(n,{label:"Paths"}),(0,e.jsx)(l,{label:" chrome",value:C,valueColor:o.dim})]})})})}export{A as ConfigView};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a,b}from"./chunk-P7ZUISQG.js";import"./chunk-YCCUBQY4.js";import"./chunk-UHFCCGVX.js";import"./chunk-LPUQ4HWQ.js";import"./chunk-NLCCBXXV.js";import"./chunk-LAR7I5SR.js";import"./chunk-RZ4F3BHX.js";import"./chunk-JGXJDTMO.js";import"./chunk-IBDWHXNE.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{b as FolderPicker,a as formatFolderLine};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as f,b as i,t}from"./chunk-IBDWHXNE.js";import{a as T}from"./chunk-HCBYKLMW.js";import{a as n,b as o,j as p,k as x}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as h}from"./chunk-UR6MHSHU.js";var w=h(b(),1);var e=h(T(),1),S="https://www.testmuai.com/support/docs/kane-cli-introduction",v="https://github.com/LambdaTest/kane-cli/issues";function k(){let{exit:l}=p(),{stdout:r}=x(),c=r?.columns??80;return(0,w.useEffect)(()=>{let m=setTimeout(()=>l(),50);return()=>clearTimeout(m)},[l]),(0,e.jsxs)(n,{flexDirection:"column",children:[(0,e.jsxs)(n,{paddingX:1,paddingTop:1,flexDirection:"column",children:[(0,e.jsx)(o,{color:t.orange,bold:!0,children:i}),(0,e.jsxs)(n,{children:[(0,e.jsx)(o,{color:t.dim,children:"Browser automation powered by AI "}),(0,e.jsxs)(o,{color:t.muted,children:[" v",f]})]})]}),(0,e.jsx)(o,{children:" "}),(0,e.jsxs)(d,{title:"USAGE",children:[(0,e.jsx)(g,{cmd:`${i}`,desc:"Single-shot prompt (no args, TTY)"}),(0,e.jsx)(g,{cmd:`${i} --tui`,desc:"Full interactive TUI",highlight:!0}),(0,e.jsx)(g,{cmd:`${i} run "<objective>"`,desc:"Inline objective"}),(0,e.jsx)(g,{cmd:`${i} testmd run <path>.md`,desc:"Replay a saved *_test.md file"})]}),(0,e.jsxs)(d,{title:"HELP",children:[(0,e.jsx)(g,{cmd:`${i} --help`,desc:"Show this help (long form)"}),(0,e.jsx)(g,{cmd:`${i} -h`,desc:"Show this help (short form)"}),(0,e.jsx)(g,{cmd:`${i} help`,desc:"Show this help (subcommand form)"}),(0,e.jsxs)(n,{marginLeft:2,marginTop:0,flexDirection:"column",children:[(0,e.jsxs)(o,{color:t.dim,children:["These are the only supported help invocations. Anything else (e.g. ",(0,e.jsx)(o,{color:t.orange,children:"-help"}),") is an unknown flag."]}),(0,e.jsxs)(o,{color:t.dim,children:["Terminal tab-completion is a shell feature; ",i," does not ship shell-completion scripts, so any flag your shell suggests is a generic guess \u2014 not from ",i,"."]})]})]}),(0,e.jsxs)(d,{title:"COMMANDS",children:[(0,e.jsx)(a,{cmd:"run",args:"<objective>",desc:"Run an objective (inline string)",highlight:!0}),(0,e.jsx)(a,{cmd:"testmd",args:"run|list|status|delete|export",desc:"Manage *_test.md files"}),(0,e.jsx)(a,{cmd:"login",desc:"Auth setup (interactive, --oauth, or --username)"}),(0,e.jsx)(a,{cmd:"logout",desc:"Revoke tokens + delete profile"}),(0,e.jsx)(a,{cmd:"whoami",desc:"Show authenticated identity"}),(0,e.jsx)(a,{cmd:"config",args:"show|set-\u2026|reset",desc:"Manage configuration"}),(0,e.jsx)(a,{cmd:"profiles",args:"list|switch|delete",desc:"Manage auth profiles"}),(0,e.jsx)(a,{cmd:"changelog",args:"[--all]",desc:"Show recent release notes"})]}),(0,e.jsxs)(d,{title:"TESTMD ACTIONS",children:[(0,e.jsx)(a,{cmd:"testmd run",args:"<path>",desc:"Replay a saved *_test.md file",highlight:!0}),(0,e.jsx)(a,{cmd:"testmd list",desc:"List *_test.md files in cwd (recursive)"}),(0,e.jsx)(a,{cmd:"testmd status",args:"<path>",desc:"Print local meta.json for a test"}),(0,e.jsx)(a,{cmd:"testmd delete",args:"<path>",desc:"Remove output-<stem>/ and the source file"}),(0,e.jsx)(a,{cmd:"testmd export",args:"<path> --language <py|js>",desc:"Generate standalone Playwright code"})]}),(0,e.jsxs)(d,{title:"RUN FLAGS",children:[(0,e.jsx)(s,{long:"--max-steps",arg:"<n>",desc:"Max agent steps (default: 30)"}),(0,e.jsx)(s,{long:"--timeout",arg:"<sec>",desc:"Kill run after N seconds"}),(0,e.jsx)(s,{long:"--headless",desc:"No visible browser window"}),(0,e.jsx)(s,{long:"--mode",arg:"<action|testing>",desc:"Run mode (default: testing)"}),(0,e.jsx)(s,{long:"--name",arg:"<name>",desc:"Persist session under this name"}),(0,e.jsx)(s,{long:"--variables",arg:"<json>",desc:"Inline variables as JSON"}),(0,e.jsx)(s,{long:"--variables-file",arg:"<path>",desc:"Load variables from file"}),(0,e.jsx)(s,{long:"--session-context",arg:"<json>",desc:"Prior runs context JSON"}),(0,e.jsx)(s,{long:"--global-context",arg:"<file>",desc:"Override global context markdown"}),(0,e.jsx)(s,{long:"--local-context",arg:"<file>",desc:"Override local context markdown"}),(0,e.jsx)(s,{long:"--ws-endpoint",arg:"<url>",desc:"Remote browser (LambdaTest)"}),(0,e.jsx)(s,{long:"--cdp-endpoint",arg:"<url>",desc:"Connect to existing Chrome CDP"}),(0,e.jsx)(s,{long:"--task-skills",desc:"Domain-specific task skills (experimental)"}),(0,e.jsx)(s,{long:"--code-export",desc:"Generate code export after upload"}),(0,e.jsx)(s,{long:"--code-language",arg:"<lang>",desc:"Code export language: python | javascript"}),(0,e.jsx)(s,{long:"--skip-code-validation",desc:"Skip post-codegen validation"}),(0,e.jsx)(s,{long:"--username",arg:"<user>",desc:"Basic auth (skip OAuth)"}),(0,e.jsx)(s,{long:"--access-key",arg:"<key>",desc:"Basic auth access key"}),(0,e.jsx)(s,{long:"--env",arg:"<name>",desc:"Environment (prod or stage)"}),(0,e.jsx)(s,{long:"--agent",desc:"NDJSON output (no UI)",highlight:!0})]}),(0,e.jsxs)(d,{title:"EXAMPLES",children:[(0,e.jsx)(u,{label:"Inline objective",cmd:`${i} run "Search for laptop"`}),(0,e.jsx)(u,{label:"Replay a saved test",cmd:`${i} testmd run smoke_test.md`}),(0,e.jsx)(u,{label:"Variables",cmd:`${i} run "Login as {{user}}" --variables '{"user":{"value":"alice"}}'`}),(0,e.jsx)(u,{label:"Agent mode (NDJSON)",cmd:`${i} run "Add to cart" --agent | jq .status`})]}),(0,e.jsx)(d,{title:"TEST FILES",children:(0,e.jsxs)(n,{marginLeft:2,flexDirection:"column",children:[(0,e.jsxs)(o,{color:t.dim,children:[(0,e.jsx)(o,{color:t.orange,children:"*_test.md"})," \u2014 markdown test files with YAML frontmatter and ",(0,e.jsx)(o,{color:t.orange,children:"## "}),"step headings."]}),(0,e.jsxs)(o,{color:t.dim,children:["Run with ",(0,e.jsxs)(o,{color:t.orange,children:[i," testmd run path/to/foo_test.md"]}),". (`.md` paths are not accepted by `",i," run`.)"]}),(0,e.jsxs)(o,{color:t.dim,children:["Sessions you run in TUI auto-save to ",(0,e.jsx)(o,{color:t.orange,children:"<cwd>/.testmuai/tests/<name>_test.md"})," (testing mode prompts on exit)."]})]})}),(0,e.jsxs)(n,{flexDirection:"column",marginTop:0,paddingX:1,children:[(0,e.jsx)(o,{color:t.muted,children:"\u2500".repeat(Math.min(c-2,70))}),(0,e.jsxs)(n,{gap:3,children:[(0,e.jsxs)(n,{children:[(0,e.jsx)(o,{color:t.dim,children:"Docs "}),(0,e.jsx)(o,{color:t.orange,underline:!0,children:S})]}),(0,e.jsxs)(n,{children:[(0,e.jsx)(o,{color:t.dim,children:"Bugs "}),(0,e.jsx)(o,{color:t.orange,underline:!0,children:v})]})]})]}),(0,e.jsx)(o,{children:" "})]})}function d({title:l,children:r}){return(0,e.jsxs)(n,{flexDirection:"column",marginBottom:1,children:[(0,e.jsx)(n,{marginLeft:1,children:(0,e.jsx)(o,{bold:!0,color:t.dim,children:l})}),r]})}function g({cmd:l,desc:r,highlight:c}){return(0,e.jsxs)(n,{marginLeft:2,children:[(0,e.jsxs)(n,{width:40,children:[(0,e.jsx)(o,{color:t.dim,children:"$ "}),(0,e.jsx)(o,{color:c?t.orange:t.orange,children:l})]}),(0,e.jsx)(o,{color:t.dim,children:r})]})}function a({cmd:l,args:r,desc:c,highlight:m}){return(0,e.jsxs)(n,{marginLeft:2,children:[(0,e.jsx)(n,{width:16,children:(0,e.jsx)(o,{color:m?t.orange:t.green,bold:!0,children:l})}),(0,e.jsx)(n,{width:32,children:r?(0,e.jsx)(o,{color:t.dim,children:r}):null}),(0,e.jsx)(o,{color:t.dim,children:c})]})}function s({long:l,arg:r,desc:c,highlight:m}){return(0,e.jsxs)(n,{marginLeft:2,children:[(0,e.jsxs)(n,{width:30,children:[(0,e.jsx)(o,{color:m?t.orange:t.orange,children:l}),r&&(0,e.jsxs)(o,{color:t.dim,children:[" ",r]})]}),(0,e.jsx)(o,{color:t.dim,children:c})]})}function u({label:l,cmd:r}){return(0,e.jsxs)(n,{marginLeft:2,flexDirection:"column",children:[(0,e.jsxs)(o,{color:t.dim,children:["# ",l]}),(0,e.jsxs)(o,{color:t.orange,children:["$ ",r]})]})}export{k as HelpView};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a}from"./chunk-
|
|
2
|
+
import{a}from"./chunk-UYHNJUPY.js";import"./chunk-HUOC7DUT.js";import"./chunk-IBDWHXNE.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{a as InfoBox};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a}from"./chunk-
|
|
2
|
+
import{a}from"./chunk-DAVPOA2L.js";import"./chunk-IBDWHXNE.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{a as LinksBox};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a,b}from"./chunk-
|
|
2
|
+
import{a,b}from"./chunk-4QO6JYHX.js";import"./chunk-JGXJDTMO.js";import"./chunk-IBDWHXNE.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{b as ProfilesView,a as formatProfileLine};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a,b}from"./chunk-KJEJ7VW5.js";import"./chunk-YCCUBQY4.js";import"./chunk-UHFCCGVX.js";import"./chunk-LPUQ4HWQ.js";import"./chunk-NLCCBXXV.js";import"./chunk-LAR7I5SR.js";import"./chunk-RZ4F3BHX.js";import"./chunk-JGXJDTMO.js";import"./chunk-IBDWHXNE.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{b as ProjectPicker,a as formatProjectLine};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a,b,c}from"./chunk-
|
|
2
|
+
import{a,b,c}from"./chunk-RJNGCQCL.js";import"./chunk-S3DAAAE5.js";import"./chunk-UYHNJUPY.js";import"./chunk-HUOC7DUT.js";import"./chunk-IBDWHXNE.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{a as SaveSessionPrompt,b as defaultSessionTimestamp,c as renderSavePrompt};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a}from"./chunk-7I2SQ2KP.js";import"./chunk-Z7AXAKPX.js";import"./chunk-AGS57DSG.js";import"./chunk-L5LI2JF4.js";import"./chunk-YSSBAIJI.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import"./chunk-KJEJ7VW5.js";import"./chunk-P7ZUISQG.js";import"./chunk-YCCUBQY4.js";import"./chunk-UHFCCGVX.js";import"./chunk-LOIRZFV3.js";import"./chunk-LPUQ4HWQ.js";import"./chunk-NLCCBXXV.js";import"./chunk-VE3SUJMA.js";import"./chunk-T46Z27UL.js";import"./chunk-OIPVMEM7.js";import"./chunk-LAR7I5SR.js";import"./chunk-RZ4F3BHX.js";import"./chunk-JGXJDTMO.js";import"./chunk-IBDWHXNE.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{a as SingleShotApp};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a,b,c,d}from"./chunk-V3FSESZ4.js";import"./chunk-UYHNJUPY.js";import"./chunk-HUOC7DUT.js";import"./chunk-IBDWHXNE.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{d as AutoExitSummaryBox,c as SummaryBox,b as buildSummaryEvent,a as buildSummaryRendered};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{h as a}from"./chunk-JJERCR2W.js";import"./chunk-H4XK55B3.js";import"./chunk-7NDFOI6Z.js";import"./chunk-LOIRZFV3.js";import"./chunk-LAR7I5SR.js";import"./chunk-UYHNJUPY.js";import"./chunk-HUOC7DUT.js";import"./chunk-C6S4IEBC.js";import"./chunk-IBDWHXNE.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{a as TestMdRunView};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as b,b as r}from"./chunk-HUOC7DUT.js";import{t as o}from"./chunk-IBDWHXNE.js";import{a as p}from"./chunk-HCBYKLMW.js";import{a as i,b as l,j as s}from"./chunk-C44QQJR4.js";import{a as T}from"./chunk-6YGTRKDT.js";import{e as a}from"./chunk-UR6MHSHU.js";var f=a(T(),1);var e=a(p(),1);function V({profile:g,env:v,authenticated:n,authMethod:h,username:c,tokenStatus:t,expiresAt:d,serverStatus:u,detail:m}){let{exit:x}=s();return(0,f.useEffect)(()=>{let B=setTimeout(()=>x(),50);return()=>clearTimeout(B)},[x]),(0,e.jsx)(i,{flexDirection:"column",children:(0,e.jsx)(b,{title:"Identity",variant:n?"success":"warning",children:(0,e.jsxs)(i,{flexDirection:"column",paddingY:1,children:[(0,e.jsx)(i,{children:u==="rejected"?(0,e.jsx)(l,{color:o.red,bold:!0,children:"\u2717 Not authenticated"}):u==="unreachable"?(0,e.jsx)(l,{color:o.orange,bold:!0,children:"\u26A0 Couldn't verify"}):n?(0,e.jsx)(l,{color:o.green,bold:!0,children:"\u2713 Authenticated"}):(0,e.jsx)(l,{color:o.orange,bold:!0,children:"\u26A0 Not logged in"})}),(0,e.jsxs)(i,{flexDirection:"column",marginTop:1,children:[(0,e.jsx)(r,{label:"Profile",value:g}),(0,e.jsx)(r,{label:"Environment",value:v}),(0,e.jsx)(r,{label:"Method",value:h}),c&&(0,e.jsx)(r,{label:"User",value:c}),t&&(0,e.jsx)(r,{label:"Token",value:t,valueColor:t==="valid"?o.green:t==="expired"?o.red:o.dim}),d&&(0,e.jsx)(r,{label:"Expires",value:d}),m&&(0,e.jsx)(r,{label:"Detail",value:m})]})]})})})}export{V as WhoamiView};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{
|
|
2
|
+
import{a as l}from"./chunk-RZ4F3BHX.js";import{c as i,f as c}from"./chunk-IBDWHXNE.js";import"./chunk-UR6MHSHU.js";import{readFileSync as u,writeFileSync as g,mkdirSync as d}from"fs";import{join as f}from"path";var h=f(i,"changelog-cache.json"),p=3600*1e3;function y(){try{let e=JSON.parse(u(h,"utf-8"));if(Date.now()-e.cachedAt<p)return e}catch{}return null}function m(e){try{d(i,{recursive:!0}),g(h,JSON.stringify({entries:e,cachedAt:Date.now()}))}catch{}}async function A(e){try{let t=y();if(t){let r=t.entries;return e?.all?r:r.slice(0,5)}let n=new AbortController,o=setTimeout(()=>n.abort(),5e3),a=await l(`${c}?per_page=30`,{headers:{Accept:"application/vnd.github+json"},signal:n.signal});if(clearTimeout(o),!a.ok)return[];let s=(await a.json()).map(r=>({version:r.tag_name.replace(/^v/,""),date:r.published_at?r.published_at.slice(0,10):"",body:r.body??""}));return m(s),e?.all?s:s.slice(0,5)}catch{return[]}}function v(e){if(e.length===0)return"Could not fetch changelog. Visit https://github.com/LambdaTest/kane-cli/releases";let t=["kane-cli Changelog","\u2500".repeat(40),""];for(let n of e){if(t.push(`v${n.version} (${n.date})`),n.body){let o=n.body.split(`
|
|
3
3
|
`).filter(a=>a.trim());for(let a of o)t.push(` ${a}`)}t.push("")}return t.join(`
|
|
4
4
|
`)}export{A as fetchChangelog,v as formatChangelog};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as R}from"./chunk-AGS57DSG.js";import{b as z}from"./chunk-H4XK55B3.js";import{a as q}from"./chunk-NLCCBXXV.js";function O(e){return["completed","failed","ended","stopped"].includes(e.trim().toLowerCase())}function ue(e){return["ended","stopped"].includes(e.trim().toLowerCase())}function D(e){return{requestId:e.requestId,objective:e.objective,status:"",turnActive:!1,scenarios:[],thinking:"",thinkingLog:[],chatLog:[],progress:0}}function de(e){return e.pendingClarification===void 0?e:{...e,pendingClarification:void 0}}function le(e){return{...e,turnActive:!0,error:void 0,thinking:"",thinkingLog:[]}}function A(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 N(e,t){let n=[],i=e.type??"",p=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 s=e.data??{},u=Q(s.time_taken);n.push({type:"thinking_done",text:typeof e.data=="string"?e.data:s.message??"",tookMs:u});break}case"progress":{let s=e.data??{};typeof s.progress=="number"&&n.push({type:"progress",pct:s.progress});break}case"clarification":{let s=e.data??{};typeof s.message=="string"&&n.push({type:"clarification",text:s.message});break}case"chatting_stopped":{let s=e.data??{};typeof s.message=="string"&&s.message.length>0&&n.push({type:"chat",text:s.message});break}case"limit_update":{let s=e.data??{},u=s.test_cases_limit??e.test_cases_limit,f=s.per_scenario_test_cases_limit??e.per_scenario_test_cases_limit;n.push({type:"limit",scenarioLimit:u,perScenarioLimit:f});break}case"error":{let s=typeof e.data=="string"?e.data:e.data?.message??"generation error";n.push({type:"error",message:s});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:p,headline:e.headline,scenarios:e.scenarios}}),p&&O(p)){let s=p.trim().toLowerCase();n.push({type:"done",status:s})}return n}function Q(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 E=class extends Error{constructor(t){super(t),this.name="AuthError"}},M=class extends Error{constructor(t){super(t),this.name="ForbiddenError"}},F=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 v(e,t){let n=t?.message??t?.error??`HTTP ${e}`;return e===401?new E(n):e===403?t?.key==="insufficient_credits"?new F(n):new M(n):new k(n)}async function*H(e){let t=e.fetchImpl??fetch,n=e.maxRetries??5,i=e.maxBackoffMs??3e4,p=e.connectTimeoutMs??1e4,s=0,u=!1;for(;;){if(e.signal.aborted)return;let f=new AbortController,d=()=>f.abort();e.signal.addEventListener("abort",d,{once:!0});let g=setTimeout(()=>f.abort(),p),b;try{b=await t(e.url,{method:"GET",headers:{Authorization:await e.authHeader(),Accept:"text/event-stream"},signal:f.signal})}catch(m){if(clearTimeout(g),e.signal.removeEventListener("abort",d),e.signal.aborted)return;if(++s>n)throw new k("SSE connect failed",m);await B(I(s,i));continue}if(clearTimeout(g),!b.ok){e.signal.removeEventListener("abort",d);let m=await Y(b);if(b.status===401&&u){if(++s>n)throw v(401,m);await B(I(s,i));continue}throw v(b.status,m)}if(!b.body)throw e.signal.removeEventListener("abort",d),new k("SSE response had no body");u=!0,s=0;let w=b.body.getReader(),h=new TextDecoder("utf-8"),y="";try{for(;;){if(e.signal.aborted){await w.cancel().catch(()=>{});return}let{done:m,value:r}=await w.read();if(m)break;y+=h.decode(r,{stream:!0});let a;for(;(a=y.indexOf(`
|
|
3
|
+
|
|
4
|
+
`))>=0;){let o=y.slice(0,a);y=y.slice(a+2);let c=V(o);c&&(yield c)}}}catch(m){if(e.signal.aborted)return;if(++s>n)throw new k("SSE stream dropped",m);await B(I(s,i));continue}finally{e.signal.removeEventListener("abort",d)}return}}function V(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 I(e,t){return Math.min(t,1e3*2**(e-1))}function B(e){return new Promise(t=>setTimeout(t,e))}async function Y(e){try{return await e.clone().json()}catch{return}}function ke(e,t={}){let n=t.fetchImpl??fetch,i=new Map,p=!0;async function s(){let r=await e.authResolver.resolve();if(!r)throw new E("unauthorized; run `kane-cli login`");return q(r.username,r.access_key)}function u(r){return`${e.baseUrl}${r}`}async function f(r){if(!r.ok){let a;try{a=await r.clone().json()}catch{a=void 0}throw v(r.status,a)}return r.json()}function d(r){let a=r?.data??r;return{request_id:a.request_id??a.id,status:a.status??""}}function g(r,a,o,c){let l=D({requestId:r,objective:a});c&&(l=A(l,{type:"snapshot",data:c}),c.status==="cleaned_up"&&(l={...l,error:"session was reaped (cleaned_up) \u2014 continuing will destructively regenerate"}));let S=new AbortController;o&&(o.aborted?S.abort():o.addEventListener("abort",()=>S.abort(),{once:!0})),i.set(r,S);let x={requestId:r,state:l,events:void 0};return x.events=(async function*(){try{let C=H({url:u(`/requests/${r}/sse`),authHeader:s,signal:S.signal,log:e.log,fetchImpl:n});for await(let L of C)for(let $ of N(L,r))x.state=A(x.state,$),yield $}finally{i.delete(r)}})(),x}async function b(r,a){let o=new FormData;o.append("prompt",r.prompt),p=r.memoryEnhancement??!0,o.append("memory_enhancement",String(p)),r.scenarioLimit!==void 0&&o.append("test_scenario_limit",String(r.scenarioLimit)),r.perScenarioLimit!==void 0&&o.append("per_scenario_test_cases_limit",String(r.perScenarioLimit));let c=r.projectId??e.projectId,l=r.folderId??e.folderId;c&&o.append("project_id",c),l&&o.append("folder_id",l);let S=await n(u("/requests"),{method:"POST",headers:{Authorization:await s()},body:o}),x=await f(S),{request_id:C}=d(x),L=String(C);return g(L,r.prompt,a)}async function w(r,a){let o=await n(u(`/requests/${r}`),{method:"GET",headers:{Authorization:await s()}}),c=await f(o),l=c?.data??c,S={requestId:r,status:l.status??"",headline:l.headline,scenarios:Array.isArray(l.scenarios)?l.scenarios:[]};return g(r,"",a,S)}async function h(r,a,o){let c=new FormData;c.append("prompt",a),c.append("chat_enabled","true"),c.append("memory_enhancement",String(p)),o&&c.append("mappings",JSON.stringify(o));let l=await n(u(`/requests/${r}`),{method:"PUT",headers:{Authorization:await s()},body:c});if(!l.ok){let S;try{S=await l.clone().json()}catch{}throw v(l.status,S)}}async function y(r){i.get(r)?.abort();let o=await n(u(`/requests/${r}/stop`),{method:"DELETE",headers:{Authorization:await s()}});if(!o.ok&&o.status!==404){let c;try{c=await o.clone().json()}catch{}throw v(o.status,c)}}async function m(r){i.get(r)?.abort();let o=await n(u(`/requests/${r}/end`),{method:"DELETE",headers:{Authorization:await s()}});if(!o.ok&&o.status!==404){let c;try{c=await o.clone().json()}catch{}throw v(o.status,c)}}return{start:b,attach:w,chat:h,cancel:y,end:m}}function j(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 p=typeof i.expected_result=="string"?i.expected_result:typeof i.outcome=="string"?i.outcome:"";t.push({step:i.step,expected:p})}return t}var ee=30,te=300;function J(){return{mode:"testing",max_steps:ee,timeout:te,variables:{}}}function U(e){return e.title??`Test case ${e.id}`}function Ce(e,t){return R({frontmatter:J(),heading:U(t),steps:e.sub_objectives.map(n=>n.objective)})}function G(e){let t=j(e.manual_steps).map(n=>n.step);return R({frontmatter:J(),heading:U(e),steps:t})}import{mkdtempSync as ne,mkdirSync as P,writeFileSync as W,rmSync as X,renameSync as re,existsSync as Z,readFileSync as se}from"fs";import{join as _,resolve as ie}from"path";async function Fe(e,t,n,i=G){(n.redirectBareCwd??!0)&&ie(t)===process.cwd()&&(t=_(t,".testmuai","tests"));let p=T(e.objective)??e.headline,s=T(n.suiteName)??`${T(K(p,4))??"tcg"}-${e.requestId}`,u=s,f=_(t,s);Z(f)&&!ae(f,e.requestId)&&(u=`${s}-${e.requestId}`);let d=_(t,u),g=[],b=new Map;for(let h of e.scenarios){let y=(h.test_cases??[]).filter(oe);if(y.length===0)continue;let m=T(ce(h.scode))??T(h.sid)??`s${h.id}`,r=b.get(m)??new Set;b.set(m,r);for(let a of y){let o=T(K(a.title,5))??"case",c=`${o}_test.md`;for(let l=2;r.has(c);l++)c=`${o}-${l}_test.md`;r.add(c),g.push({dir:m,file:c,tc:a})}}if(g.length===0)return{suiteDir:d,paths:[],warning:"no functional test cases generated"};P(t,{recursive:!0});let w=ne(_(t,".tcg-tmp-"));try{P(_(w,"helpers"),{recursive:!0}),W(_(w,".tcg-suite.json"),JSON.stringify({requestId:e.requestId,suiteName:u}));let h=[],y=new Set;for(let r of g){let a=_(w,r.dir);y.has(a)||(P(a,{recursive:!0}),y.add(a));let o=_(a,r.file);W(o,i(r.tc)),h.push(o)}Z(d)&&X(d,{recursive:!0,force:!0}),re(w,d);let m=h.map(r=>r.replace(w,d));return{suiteDir:d,paths:m}}catch(h){try{X(w,{recursive:!0,force:!0})}catch{}throw h}}function oe(e){return(e.category??"").trim().toLowerCase()==="functional"}function ae(e,t){try{return JSON.parse(se(_(e,".tcg-suite.json"),"utf-8"))?.requestId===t}catch{return!1}}function T(e){return e&&e.length>0?e:void 0}function K(e,t){return e?e.toLowerCase().replace(/[^a-z0-9]+/g," ").trim().split(/\s+/).filter(Boolean).slice(0,t).join("-"):""}function ce(e){return e?e.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,""):""}function Pe(e){let t=[];e.title&&t.push(e.title),e.description&&t.push("",e.description);let n=j(e.manual_steps);return n.length>0&&(t.push("","Steps:"),n.forEach((i,p)=>{t.push(`${p+1}. ${i.step}`)})),t.join(`
|
|
6
|
+
`).trim()}function ze(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 Oe(e,t,n){let i=z(e,t),p=()=>i.cancel();n?.addEventListener("abort",p);let s=null,u=null;try{for await(let f of i.events)if(f.type==="bifurcation_result"){let d=f,g=d.sub_objectives??[];s={sub_objectives:g,extracted_variables:d.extracted_variables??{},total_flows:d.total_flows??g.length,is_single_flow:d.is_single_flow??g.length<=1,credits_consumed:d.credits_consumed??0}}else f.type==="error"&&(u=f.message??"bifurcation error")}finally{n?.removeEventListener("abort",p),i.cancel()}if(s)return s;throw new Error(u??"bifurcation produced no result")}export{O as a,ue as b,D as c,de as d,le as e,A as f,E as g,ke as h,j as i,Ce as j,G as k,Fe as l,oe as m,Pe as n,ze as o,Oe as p};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as h}from"./chunk-JGXJDTMO.js";import{t as l}from"./chunk-IBDWHXNE.js";import{a as A}from"./chunk-HCBYKLMW.js";import{a as c,b as f,i as P}from"./chunk-C44QQJR4.js";import{a as B}from"./chunk-6YGTRKDT.js";import{e as x}from"./chunk-UR6MHSHU.js";var L=x(B(),1);var n=x(A(),1);function S(r,d,s,u,m){let p=s==="basic"&&u?`basic (${u})`:s,i=20,a=`${r} [${d}]`,g="\xB7".repeat(Math.max(2,i-a.length+3));return{label:`${a} ${g} ${p}`,profile:r,env:d,isActive:m}}function M({creds:r,onSwitch:d,onCancel:s}){let u=r.listProfiles(),m=r.getActiveProfile(),p=r.getDefaultEnv(),i=u.map(e=>{let o=r.loadBasicAuth(e.profile,e.env),t=r.loadCredentials(e.profile,e.env)!==null,v=o?"basic":t?"oauth":"none",b=o?o.username:null,w=e.profile===m&&e.env===p;return S(e.profile,e.env,v,b,w)}),[a,g]=(0,L.useState)(()=>{let e=i.findIndex(o=>o.isActive);return e>=0?e:0});return P((e,o)=>{if(o.escape){s();return}if(o.upArrow){g(t=>Math.max(0,t-1));return}if(o.downArrow){g(t=>Math.min(i.length-1,t+1));return}if(o.return&&i[a]){let t=i[a];t.isActive||d(t.profile,t.env),s();return}}),i.length===0?(0,n.jsxs)(c,{flexDirection:"column",borderStyle:"round",borderColor:l.orange,paddingX:2,paddingY:1,children:[(0,n.jsx)(f,{color:l.orange,bold:!0,children:"Profiles"}),(0,n.jsx)(c,{marginTop:1,children:(0,n.jsx)(f,{color:l.dim,children:"No profiles \u2014 use Login to create one"})}),(0,n.jsx)(h,{bindings:[],escBackLabel:"back"})]}):(0,n.jsxs)(c,{flexDirection:"column",borderStyle:"round",borderColor:l.orange,paddingX:2,paddingY:1,children:[(0,n.jsx)(f,{color:l.orange,bold:!0,children:"Profiles"}),(0,n.jsx)(c,{flexDirection:"column",marginTop:1,children:i.map((e,o)=>{let t=o===a,v=t?"\u276F ":" ",b=e.isActive?l.green:t?l.orange:void 0;return(0,n.jsxs)(f,{color:b,children:[v,e.label,e.isActive?" \u25CF active":""]},`${e.profile}-${e.env}`)})}),(0,n.jsx)(h,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"switch"}],escBackLabel:"back"})]})}export{S as a,M as b};
|
|
@@ -0,0 +1,2 @@
|
|
|
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-YAVIOVVP.js";import{a as d}from"./chunk-LAR7I5SR.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};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as K,b as V,c as z,d as ee,e as te}from"./chunk-Z7AXAKPX.js";import{c as J}from"./chunk-AGS57DSG.js";import{a as Q}from"./chunk-YSSBAIJI.js";import{a as Z}from"./chunk-FPFOW6BS.js";import{b as H}from"./chunk-KJEJ7VW5.js";import{b as W}from"./chunk-P7ZUISQG.js";import{g as E}from"./chunk-LOIRZFV3.js";import{a as O}from"./chunk-LPUQ4HWQ.js";import{a as k,b as A,d as Y}from"./chunk-VE3SUJMA.js";import{a as q}from"./chunk-T46Z27UL.js";import{a as _}from"./chunk-LAR7I5SR.js";import{a as G}from"./chunk-HCBYKLMW.js";import{a as c,b as u,i as I,j as X}from"./chunk-C44QQJR4.js";import{a as ue}from"./chunk-6YGTRKDT.js";import{e as F}from"./chunk-UR6MHSHU.js";var i=F(ue(),1);var r=F(G(),1);function _e({resultRef:h,mode:d="singleshot",loginCompleteRef:f}){let{exit:m}=X(),C=(0,i.useRef)(new q),S=(0,i.useRef)(new Q),v=(0,i.useRef)(new J),t=C.current,l=S.current,$=v.current,ne=K(),[P,g]=(0,i.useState)(d==="login"?"login":"gate"),[L,re]=(0,i.useState)(null),[de,R]=(0,i.useState)(null),[ge,T]=(0,i.useState)(null),[N,oe]=(0,i.useState)(null),[U,B]=(0,i.useState)([]),x=(0,i.useCallback)((e,n,s,o)=>$.log(e,n,s,o),[$]),pe=(0,i.useCallback)((e,n)=>{e?k(t,l,e,n):l.save({project_id:null,project_name:null,folder_id:null,folder_name:null})},[t,l]),y=(0,i.useCallback)(()=>{d==="login"?(f&&(f.current=!0),m()):g("input")},[d,m,f]),D=(0,i.useCallback)((e,n)=>{let s=k(t,l,e,n);if(d==="login"){g("ensure-project");return}Y(s)?y():s.projectId?g("ensure-folder"):g("ensure-project")},[t,l,y,d]);I((e,n)=>{n.ctrl&&e==="c"&&E(0,"Ctrl+C exit")});let M=(0,i.useRef)(!1);i.default.useEffect(()=>{M.current||(M.current=!0,d!=="login"&&te(t,x).then(e=>{re(e),e.status==="authenticated"?D(e.result.profile,e.result.env):e.status==="needs_pick"?g("pick"):(R(e.profile??null),T(e.env??null),g("login"))}).catch(e=>{oe(`Auth check failed: ${e instanceof Error?e.message:String(e)}`)}))},[t,x]);let ie=(0,i.useCallback)(e=>{h.current={objective:e},m()},[h,m]),se=(0,i.useCallback)(async(e,n)=>{t.setActiveProfile(e),t.setDefaultEnv(n),(await ee(t,e,n,x)).status==="authenticated"?D(e,n):(R(e),T(n),g("login"))},[t,x,D]),w=(0,i.useCallback)(()=>{let e=t.getActiveProfile(),n=t.getDefaultEnv();if(!e)return null;let s=_(n),o=t.loadBasicAuth(e,n);return new Z(s.controllerBaseUrl,async()=>t.loadCredentials(e,n)?.access_token??null,o,x)},[t,x]),le=(0,i.useCallback)(async()=>{let e=w();if(!e)return null;let n=e.cached??await e.resolve();if(!n)return null;let s=_(t.getDefaultEnv()),o=new O(s.tmsBaseUrl,n.username,n.access_key);try{let p=(await o.listProjects()).find(b=>b.name==="KaneAI Generated");if(p)return{id:p.project_id,name:p.name};let j=await o.createProject("KaneAI Generated");return{id:j.id,name:j.name}}catch{return null}},[w,t]),ae=(0,i.useCallback)(async e=>{let n=w();if(!n)return null;let s=n.cached??await n.resolve();if(!s)return null;let o=_(t.getDefaultEnv()),a=new O(o.tmsBaseUrl,s.username,s.access_key);try{let j=(await a.listFolders(e)).find(ce=>ce.name==="Untitled");if(j)return{id:j.id,name:j.name};let b=await a.createFolder(e,"Untitled");return{id:b.id,name:b.name}}catch{return null}},[w,t]);if(P==="gate")return(0,r.jsx)(c,{paddingX:1,children:(0,r.jsx)(u,{color:"yellow",children:"Checking authentication..."})});if(N)return(0,r.jsxs)(c,{flexDirection:"column",paddingX:1,children:[(0,r.jsx)(u,{color:"red",children:N}),(0,r.jsx)(u,{color:"gray",children:"Press Ctrl+C to exit."})]});if(P==="pick"&&L?.status==="needs_pick")return(0,r.jsx)(fe,{profiles:L.profiles,onSelect:se});if(P==="login")return(0,r.jsx)(z,{devMode:process.env.KANE_DEV_MODE==="1",profiles:t.listProfiles(),onBasicLogin:async(e,n,s,o)=>{let{validateBasicAuth:a}=await import("./validate-basic-VFJZKHOE.js");await a(n,s,o),t.saveBasicAuth(e,n,{username:s,access_key:o}),t.setActiveProfile(e),t.setDefaultEnv(n)},onOAuthLogin:async(e,n)=>{let{LoginFlow:s}=await import("./login-flow-MKAYO6IS.js");t.setDefaultEnv(n),t.setActiveProfile(e),await new s(e,n,t).login()},onComplete:(e,n)=>{R(e),T(n),t.setActiveProfile(e),t.setDefaultEnv(n),D(e,n)},onCancel:()=>{E(0,"Login cancelled")}});if(P==="ensure-project"){let e=t.getActiveProfile()??"default",n=t.getDefaultEnv(),s=()=>{if(d==="login"){g("ensure-folder");return}k(t,l,e,n).folderId?y():g("ensure-folder")};return(0,r.jsxs)(c,{flexDirection:"column",children:[(0,r.jsx)(c,{paddingX:1,marginBottom:1,children:(0,r.jsx)(u,{color:"yellow",children:"Project & folder are required to save tests \xB7 Esc to use defaults \xB7 Ctrl+C to exit"})}),(0,r.jsx)(H,{resolver:w(),currentProjectId:l.load().project_id,env:n,onSelect:(o,a)=>{A(t,l,e,n,{projectId:o,projectName:a}),B(p=>[...p,`\u2713 Project: ${a} (${o})`]),s()},onCancel:async()=>{let o=await le();o&&(A(t,l,e,n,{projectId:o.id,projectName:o.name}),B(a=>[...a,`\u2713 Default project: ${o.name} (${o.id})`]),s())}})]})}if(P==="ensure-folder"){let e=t.getActiveProfile()??"default",n=t.getDefaultEnv(),s=t.loadProfileConfig(e,n);return(0,r.jsxs)(c,{flexDirection:"column",children:[(0,r.jsx)(c,{paddingX:1,marginBottom:1,children:(0,r.jsx)(u,{color:"yellow",children:"Project & folder are required to save tests \xB7 Esc to use defaults \xB7 Ctrl+C to exit"})}),(0,r.jsx)(W,{resolver:w(),projectId:s?.project_id??"",currentFolderId:l.load().folder_id,env:n,onSelect:(o,a)=>{A(t,l,e,n,{folderId:o,folderName:a}),B(p=>[...p,`\u2713 Folder: ${a} (${o})`]),y()},onCancel:async()=>{if(!s?.project_id)return;let o=await ae(s.project_id);o&&(A(t,l,e,n,{folderId:o.id,folderName:o.name}),B(a=>[...a,`\u2713 Default folder: ${o.name} (${o.id})`]),y())}})]})}return P==="input"?(0,r.jsxs)(c,{flexDirection:"column",children:[U.length>0&&(0,r.jsx)(c,{flexDirection:"column",paddingX:1,marginBottom:1,children:U.map((e,n)=>(0,r.jsx)(u,{color:"green",children:e},n))}),(0,r.jsx)(V,{onSubmit:ie,onEscape:()=>E(0,"User pressed Escape"),history:ne,placeholder:"Type an objective..."})]}):(0,r.jsx)(r.Fragment,{})}function fe({profiles:h,onSelect:d}){let[f,m]=(0,i.useState)(0),[C,S]=(0,i.useState)(!1);return I((v,t)=>{if(!C){if(t.escape){E(0,"Profile picker cancelled");return}if(t.upArrow&&f>0&&m(l=>l-1),t.downArrow&&f<h.length-1&&m(l=>l+1),t.return){S(!0);let l=h[f];d(l.profile,l.env).catch(()=>S(!1))}}}),(0,r.jsxs)(c,{flexDirection:"column",paddingX:1,children:[(0,r.jsx)(u,{color:"#ff9500",bold:!0,children:"Select a profile:"}),(0,r.jsx)(c,{marginTop:1,flexDirection:"column",children:h.map((v,t)=>(0,r.jsxs)(u,{children:[t===f?"\u276F ":" ",(0,r.jsx)(u,{color:t===f?"#ff9500":"white",bold:t===f,children:v.profile}),(0,r.jsxs)(u,{color:"gray",children:[" [",v.env,"]"]})]},`${v.profile}-${v.env}`))}),C&&(0,r.jsx)(c,{marginTop:1,children:(0,r.jsx)(u,{color:"yellow",children:"Validating credentials..."})})]})}export{_e as a};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{t as a}from"./chunk-IBDWHXNE.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,22 @@
|
|
|
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-T46Z27UL.js";import{a as y}from"./chunk-LAR7I5SR.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
|
+
`)){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-HHNMHTYX.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
|
+
`,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
|
+
`,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
|
+
`,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}
|
|
8
|
+
`)){e(JSON.stringify(t))}function x(t,e){if(!t)return{error:`${e} name is required: kane-cli ${e}s create "<name>"`};let r=t.trim();return r.length===0?{error:`${e} name cannot be empty or whitespace`}:r.length>255?{error:`${e} name must be <= 255 characters`}:{name:r}}async function A(t){let e=T(t.limit,t.offset);if("error"in e){process.stderr.write(`error: ${e.error}
|
|
9
|
+
`),a(2,`projects: ${e.error}`);return}let r=await p(t);if(r)try{let n=new m(r.tmsBaseUrl,r.auth.username,r.auth.access_key),{items:o,doneStreaming:i}=await P(n,t.search,e.offset,e.limit),{slice:s,hasMore:c}=j(o,e),l=!i||c,f=s.map(O);g(t)?v(f,{limit:e.limit,offset:e.offset,has_more:l}):b(f,{limit:e.limit,offset:e.offset,total:o.length,hasMore:l,totalIsLowerBound:!i}),a(0,"projects list complete")}catch(n){process.stderr.write(`error: ${n instanceof Error?n.message:String(n)}
|
|
10
|
+
`),a(1,`projects list failed: ${n instanceof Error?n.message:String(n)}`)}}async function I(t,e){let r=x(t,"project");if("error"in r){process.stderr.write(`error: ${r.error}
|
|
11
|
+
`),a(2,`projects create: ${r.error}`);return}let n=await p(e);if(n)try{let i=await new m(n.tmsBaseUrl,n.auth.username,n.auth.access_key).createProject(r.name,e.description),s={id:i.id,name:i.name};g(e)?_(s):(process.stdout.write(`Created project "${s.name}" (${s.id}).
|
|
12
|
+
`),process.stdout.write(`Bind it to your active profile with: kane-cli config project ${s.id}
|
|
13
|
+
`)),a(0,"projects create complete")}catch(o){process.stderr.write(`error: ${o instanceof Error?o.message:String(o)}
|
|
14
|
+
`),a(1,`projects create failed: ${o instanceof Error?o.message:String(o)}`)}}async function F(t){let e=T(t.limit,t.offset,"full-fetch");if("error"in e){process.stderr.write(`error: ${e.error}
|
|
15
|
+
`),a(2,`folders: ${e.error}`);return}let r=await p(t);if(r)try{let o=await new m(r.tmsBaseUrl,r.auth.username,r.auth.access_key).listFolders(t.project),i=C(o,t.search),{slice:s,hasMore:c}=j(i,e),l=s.map(M);g(t)?v(l,{limit:e.limit,offset:e.offset,has_more:c}):b(l,{limit:e.limit,offset:e.offset,total:i.length,hasMore:c}),a(0,"folders list complete")}catch(n){process.stderr.write(`error: ${n instanceof Error?n.message:String(n)}
|
|
16
|
+
`),a(1,`folders list failed: ${n instanceof Error?n.message:String(n)}`)}}async function L(t,e){let r=x(t,"folder");if("error"in r){process.stderr.write(`error: ${r.error}
|
|
17
|
+
`),a(2,`folders create: ${r.error}`);return}let n=await p(e);if(n)try{let i=await new m(n.tmsBaseUrl,n.auth.username,n.auth.access_key).createFolder(e.project,r.name,e.description),s={id:i.id,name:i.name};g(e)?_(s):(process.stdout.write(`Created folder "${s.name}" (${s.id}).
|
|
18
|
+
`),process.stdout.write(`Bind it to your active profile with: kane-cli config folder ${s.id}
|
|
19
|
+
`)),a(0,"folders create complete")}catch(o){process.stderr.write(`error: ${o instanceof Error?o.message:String(o)}
|
|
20
|
+
`),a(1,`folders create failed: ${o instanceof Error?o.message:String(o)}`)}}async function p(t){let e=new h,r=t.profile??e.getActiveProfile()??"default",n=t.env??e.getDefaultEnv(),o=y(n),i=await B(r,n,t);if(!i.ok){let{message:s,exitCode:c}=E(r,n,i);return process.stderr.write(s),a(c,`${i.reason} for "${r}" [${n}]`),null}return{profile:r,envName:n,tmsBaseUrl:o.tmsBaseUrl,auth:i.creds}}function q(t){t.command("projects").description("List or create TMS projects (TTY = friendly output; non-TTY / --agent = NDJSON). After `create`, bind the new id to the active profile with `kane-cli config project <id>`.").argument("<action>","'list' or 'create'").argument("[name]","Project name (required for 'create')").option("--search <term>","Server-side name search (case-insensitive substring; list only)").option("--limit <n>",`Max items to return (1-${u}, default ${$}; list only)`).option("--offset <n>","Skip N items from the start (default 0; list only)").option("--description <text>","Project description (create only; default empty)").option("--profile <name>","Profile name (default: active)").option("--env <name>","Environment (prod or stage)").option("--username <user>","Basic auth username (skip stored creds)").option("--access-key <key>","Basic auth access key").option("--agent","Force NDJSON output (auto-on when stdin is not a TTY)").action(async(e,r,n)=>{if(e==="list")return A(n);if(e==="create")return I(r,n);process.stderr.write(`error: unknown action "${e}" (try: list, create)
|
|
21
|
+
`),a(2,`projects: unknown action "${e}"`)}),t.command("folders").description("List or create TMS folders (TTY = friendly output; non-TTY / --agent = NDJSON). After `create`, bind the new id to the active profile with `kane-cli config folder <id>`.").argument("<action>","'list' or 'create'").argument("[name]","Folder name (required for 'create')").requiredOption("--project <id>","TMS project id (required for both list and create)").option("--search <term>","Client-side name substring filter (case-insensitive; list only)").option("--limit <n>",`Max items to return (1-${u}, default ${$}; list only)`).option("--offset <n>","Skip N items from the start (default 0; list only)").option("--description <text>","Folder description (create only; default empty)").option("--profile <name>","Profile name (default: active)").option("--env <name>","Environment (prod or stage)").option("--username <user>","Basic auth username (skip stored creds)").option("--access-key <key>","Basic auth access key").option("--agent","Force NDJSON output (auto-on when stdin is not a TTY)").action(async(e,r,n)=>{if(e==="list")return F(n);if(e==="create")return L(r,n);process.stderr.write(`error: unknown action "${e}" (try: list, create)
|
|
22
|
+
`),a(2,`folders: unknown action "${e}"`)})}export{T as a,C as b,j as c,v as d,b as e,B as f,E as g,x as h,q as i};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{b as m}from"./chunk-L5LI2JF4.js";import{c as h}from"./chunk-IBDWHXNE.js";import{randomUUID as N}from"crypto";import{mkdirSync as F,writeFileSync as f,appendFileSync as A,existsSync as v}from"fs";import{join as a}from"path";import{writeFileSync as w,mkdirSync as x,existsSync as I}from"fs";import{join as p,relative as j}from"path";function _(n){let t=Object.keys(n.frontmatter).length>0?m(n.frontmatter).trimEnd():"",s=["---"];return t&&s.push(t),s.push("---",""),s.push(`# ${n.heading}`,""),n.steps.forEach((i,r)=>{s.push(`## Step ${r+1}`,i,"")}),s.join(`
|
|
3
|
+
`)}function k(n,e){let t={},s={},i=e;for(let[r,l]of Object.entries(n)){if(r.startsWith("global.")||r.startsWith("secrets.user.")||r.startsWith("environment.")){let o=r.startsWith("secrets.user.");t[r]={value:l.value,secret:o,syntax:`{{${r}}}`,type:o?"secret":r.startsWith("environment.")?"environment":"global"},s[r]=r;continue}if(l.secret){let o=`secrets.user.${r}`;t[o]={value:l.value,secret:!0,syntax:`{{secrets.user.${r}}}`,type:"secret"},s[r]=o,i=i.replaceAll(`{{${r}}}`,`{{secrets.user.${r}}}`)}else{let o=`global.${r}`;t[o]={value:l.value,secret:!1,syntax:`{{global.${r}}}`,type:"global"},s[r]=o,i=i.replaceAll(`{{${r}}}`,`{{global.${r}}}`)}}return{variables:t,objective:i,keyMap:s}}var y=/\{\{\s*(?:global|secrets\.user|environment)\.([^{}]+?)\s*\}\}/g;function c(n){return typeof n!="string"||!n.includes("{{")?n:n.replace(y,"{{$1}}")}function d(n){if(typeof n=="string")return c(n);if(Array.isArray(n))return n.map(e=>d(e));if(n&&typeof n=="object"){let e={};for(let[t,s]of Object.entries(n))e[t]=d(s);return e}return n}var L=new Set(["username","access_key","oauth","profile","project_id","folder_id"]),$=new Set(["model","env"]),g=class{constructor(e){this.opts=e}objectives=[];flushed=!1;lastWrittenPath=null;lastCollisionSuffixed=!1;appendObjective(e){this.objectives.push(e)}flush(){if(this.flushed||(this.flushed=!0,this.objectives.length===0))return;let e=this.opts.getName();if(!e)return;let t=p(this.opts.cwd,".testmuai","tests");try{x(t,{recursive:!0})}catch(u){process.stderr.write(`
|
|
4
|
+
\u26A0 Failed to create ${j(this.opts.cwd,t)}/
|
|
5
|
+
${u.message}
|
|
6
|
+
Your test recording was NOT saved.
|
|
7
|
+
|
|
8
|
+
`);return}let s=p(t,`${e}_test.md`),i=2,r=!1;for(;I(s);)s=p(t,`${e}-${i}_test.md`),i++,r=!0;let l=d(E(this.opts.getResolvedGlobal())),o=_({frontmatter:l,heading:`Session: ${e}`,steps:this.objectives.map(c)});try{w(s,o,"utf8")}catch(u){process.stderr.write(`
|
|
9
|
+
\u26A0 Failed to save your test recording.
|
|
10
|
+
${u.message}
|
|
11
|
+
Path: ${s}
|
|
12
|
+
|
|
13
|
+
`);return}this.lastWrittenPath=s,this.lastCollisionSuffixed=r}};function E(n){let e={};for(let[t,s]of Object.entries(n))L.has(t)||$.has(t)||(e[t]=s);return e}var D=a(h,"sessions"),b=class{sessionId;sessionDir;runs=[];_flows=[];_nextIndex=0;_started=!1;_testId=null;_testcaseId=null;_projectId=null;_orgId=null;_uploadStatus="pending";_uploadAttempts=0;_uploadError=null;_firstObjective=null;_firstUrl=null;_auteurVariables={};_screenshotSas=null;_model="";_environment="";_profile=null;_plan=null;_startedAt="";_remoteLogger=null;_earlyLogBuffer=[];_recorder=null;_resolvedGlobal={};_sessionName=null;_recordingEnabled=!0;_stepRunRecords=[];constructor(e){this.sessionId=N();let t=e?.baseDir?a(e.baseDir,"sessions"):D;this.sessionDir=a(t,this.sessionId)}setResolvedGlobal(e){this._resolvedGlobal={...this._resolvedGlobal,...e}}setSessionName(e){this._sessionName=e}get sessionName(){return this._sessionName}setRecordingEnabled(e){this._recordingEnabled=e}get recorder(){return this._recorder}flushRecorder(){try{this._recorder?.flush()}catch(e){process.stderr.write(`[recorder] flush failed: ${e.message}
|
|
14
|
+
`)}}start(e){if(!this._started){this._started=!0,this._model=e.model,this._environment=e.environment,this._profile=e.profile,this._startedAt=new Date().toISOString();try{F(this.sessionDir,{recursive:!0}),this._recorder=new g({cwd:process.cwd(),getResolvedGlobal:()=>this._resolvedGlobal,getName:()=>this._sessionName});let t={session_id:this.sessionId,started_at:this._startedAt,model:e.model,environment:e.environment,profile:e.profile,plan:this._plan,objectives:[],runs:[],status:"in_progress"};f(a(this.sessionDir,"session.json"),JSON.stringify(t,null,2)+`
|
|
15
|
+
`)}catch{}this._log(`SESSION START session_id=${this.sessionId}`),this._log(`CONFIG model=${e.model} env=${e.environment} profile=${e.profile}`),this._earlyLogBuffer.push({level:"info",event:"SESSION_START",message:"Session started",context:{session_id:this.sessionId}},{level:"info",event:"CONFIG",message:"Session config",context:{model:e.model,environment:e.environment,profile:e.profile}})}}setPlan(e){this._plan=e;let t={level:"info",event:"SESSION_INFO",message:"Session info",context:{session_id:this.sessionId,plan:e??null}};this._remoteLogger?this._remoteLogger.log(t.level,t.event,t.message,t.context):this._earlyLogBuffer.push(t)}get plan(){return this._plan}setRemoteLogger(e){this._remoteLogger=e;for(let t of this._earlyLogBuffer)e.log(t.level,t.event,t.message,t.context);this._earlyLogBuffer=[]}get hasRemoteLogger(){return this._remoteLogger!==null}setAuteurVariables(e){Object.assign(this._auteurVariables,e)}get auteurVariables(){return this._auteurVariables}setScreenshotSas(e){this._screenshotSas=e}get screenshotSas(){return this._screenshotSas}get screenshotBaseUrl(){return this._screenshotSas?`${this._screenshotSas.base_url}/${this._screenshotSas.container}`:""}get startedAt(){return this._startedAt||new Date().toISOString()}log(e,t,s,i){if(t===void 0){this._log(e);let o=e.indexOf(" "),u=o>0?e.slice(0,o):e,R=o>0?e.slice(o+1):"",S=/fail|error/i.test(e)?"error":"info";this._remoteLogger?.log(S,u,R||e);return}let r=e,l=s;this._log(`${t} ${l}`),this._remoteLogger?.log(r,t,l,i)}logStep(e,t,s){this._log(`${e} ${t}`);let i=this._nextIndex>0?this._nextIndex-1:0;this._remoteLogger?.logStep(i,e,t,s)}logCommand(e){this._log(`COMMAND ${e}`)}logRunStart(e,t,s){this._log(`RUN ${e} START objective="${t.slice(0,100)}" url=${s}`),this._remoteLogger?.setRunIndex(e),this._remoteLogger?.log("info","RUN_START",`Run ${e} started`,{run_index:e,objective:t,url:s})}logRunEnd(e,t,s,i){let r=(s??0).toFixed(1),l=(i??"").slice(0,100);this._log(`RUN ${e} END status=${t} duration=${r}s summary="${l}"`),this._remoteLogger?.log("info","RUN_END",`Run ${e} ended`,{run_index:e,status:t,duration:s??0,summary:i??""}),t!=="failed"&&t!=="error"&&this._remoteLogger?.discardSteps(e)}escalateRun(e){this._remoteLogger?.escalate(e)}logChromeLaunch(e,t){this._log(`CHROME LAUNCH port=${e} endpoint=${t}`),this._remoteLogger?.log("info","CHROME_LAUNCH","Chrome launched",{port:e,cdp_endpoint:t})}async finish(e="complete"){this._log(`SESSION END status=${e} total_runs=${this.runs.length}`),this._remoteLogger?.log("info","SESSION_END","Session ended",{status:e,total_runs:this.runs.length}),await this._remoteLogger?.shutdown();let t={session_id:this.sessionId,started_at:this._startedAt,ended_at:new Date().toISOString(),model:this._model,environment:this._environment,profile:this._profile,plan:this._plan,status:e,total_runs:this.runs.length,test_id:this._testId,testcase_id:this._testcaseId,commit_id:this.sessionId,project_id:this._projectId,upload_status:this._uploadStatus,upload_attempts:this._uploadAttempts,last_upload_attempt:this._uploadAttempts>0?new Date().toISOString():null,upload_error:this._uploadError,runs:this.runs.map(s=>({index:s.index,objective:s.objective,status:s.status,summary:s.summary,run_dir:s.run_dir}))};v(this.sessionDir)&&f(a(this.sessionDir,"session.json"),JSON.stringify(t,null,2)+`
|
|
16
|
+
`),this.flushRecorder(),this._recorder=null}nextRunIndex(){return this._nextIndex}addRunResult(e,t){this.runs.push(e),this._nextIndex+=t??1,this._recordingEnabled&&this._recorder?.appendObjective(e.objective)}getContext(){return{prior_runs:this.runs.map(e=>({index:e.index,objective:e.objective,summary:e.summary,status:e.status,memory:e.context.memory,variables:e.context.variables,pointer:e.context.pointer}))}}addFlow(e){let t={...e,index:this._flows.length+1};return this._flows.push(t),t}getFlows(){return[...this._flows]}getFlow(e){return this._flows.find(t=>t.index===e)}clearFlows(){this._flows=[]}recordStepRun(e){this._stepRunRecords.push(e)}getStepRunRecords(){return[...this._stepRunRecords]}getRunsAsStepRecords(){return this.runs.map((e,t)=>({testmdStepIndex:t+1,runIndex:e.index,totalRunDirs:e.run_dirs?.length??1}))}snapshot(){return{runsLen:this.runs.length,nextRunIndex:this._nextIndex,stepRunRecordsLen:this._stepRunRecords.length}}rollback(e){this.runs.length=e.runsLen,this._nextIndex=e.nextRunIndex,this._stepRunRecords.length=e.stepRunRecordsLen}setTestId(e){this._testId=e}get testId(){return this._testId}setTestcaseId(e){this._testcaseId=e}get testcaseId(){return this._testcaseId}setProjectId(e){this._projectId=e}setOrgId(e){this._orgId=e}get orgId(){return this._orgId}setFirstRun(e,t){this._firstObjective||(this._firstObjective=e,this._firstUrl=t)}get firstObjective(){return this._firstObjective}get firstUrl(){return this._firstUrl}getRunDirs(){let e=[];for(let t of this.runs)t.run_dirs&&t.run_dirs.length>0?e.push(...t.run_dirs):t.run_dir&&e.push(t.run_dir);return e}getRunObjectives(){let e=[];for(let t of this.runs)t.flow_objectives&&t.flow_objectives.length>0?e.push(...t.flow_objectives):e.push(t.objective);return e}getRunMetadata(){let e=[];for(let t of this.runs)if(t.perFlowMetadata&&t.perFlowMetadata.length>0)e.push(...t.perFlowMetadata);else{let s={resultCode:t.resultCode,reasonCode:t.reasonCode,errorMessage:t.status==="failed"?t.summary??null:null,summary:t.summary,oneLiner:t.oneLiner},i=t.run_dirs?.length??1;for(let r=0;r<i;r++)e.push(s)}return e}setUploadStatus(e,t){this._uploadStatus=e,this._uploadAttempts+=1,this._uploadError=t??null}_log(e){if(!(!this._started||!v(this.sessionDir)))try{let t=new Date().toISOString().slice(0,19).replace("T"," "),s=a(this.sessionDir,"tui.log");A(s,`[${t}] ${e}
|
|
17
|
+
`)}catch{}}};export{_ as a,k as b,b as c};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as l}from"./chunk-HCBYKLMW.js";import{a as i,d as a}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as c}from"./chunk-UR6MHSHU.js";var e=c(b(),1);var t=c(l(),1),d=(0,e.createContext)(null);function f({children:o}){let[n,p]=(0,e.useState)([]),s=(0,e.useRef)(0),u=(0,e.useMemo)(()=>({append:r=>p(S=>[...S,{id:`sb-${++s.current}`,content:r}])}),[]);return(0,t.jsxs)(d.Provider,{value:u,children:[n.length>0&&(0,t.jsx)(a,{items:n,children:r=>(0,t.jsx)(i,{children:r.content},r.id)}),o]})}function v(){let o=(0,e.useContext)(d);if(!o)throw new Error("useScrollback must be used within a ScrollbackProvider. Wrap this Ink render() root in <ScrollbackProvider>. Never render <Static> directly \u2014 push via append().");return o}export{f as a,v as b};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{b as l,d,e as m,f as g,g as S,k as y}from"./chunk-AH4AXJML.js";import{a as u}from"./chunk-YSSBAIJI.js";import{g as p,h as f}from"./chunk-LOIRZFV3.js";import{existsSync as s,mkdirSync as h,readFileSync as C,renameSync as w,writeFileSync as R}from"fs";import{join as x}from"path";function G(e){y(l(e));let r=l(e);if(!s(r))return;let n=x(r,"meta.json"),o=m(e);if(s(n)&&!s(o))try{h(d(e),{recursive:!0}),w(n,o)}catch(t){process.stderr.write(`warn: meta.json migration failed: ${t.message}
|
|
3
|
+
`)}let a=S(e);if(s(a)){let t="python";try{let i=new u().load();i.code_export?.language&&(t=i.code_export.language)}catch{}let c=g(e,"playwright",t);if(!s(c))try{w(a,c)}catch(i){process.stderr.write(`warn: generated-code migration failed: ${i.message}
|
|
4
|
+
`)}}if(s(o))try{let t=JSON.parse(C(o,"utf8"));"md5sum"in t&&(delete t.md5sum,R(o,JSON.stringify(t,null,2)+`
|
|
5
|
+
`,"utf8"))}catch(t){process.stderr.write(`warn: meta.json md5sum strip failed: ${t.message}
|
|
6
|
+
`)}}async function O(e){if(!e.isInteractive)return{recovered:!1};if(E(e.creds))return{recovered:!1};let{SingleShotApp:r}=await import("./SingleShotApp-V2UTGNZO.js"),{ScrollbackProvider:n}=await import("./scrollback-6GINSTL2.js"),{render:o}=await import("./build-JIKYOZUH.js"),a=await import("./react-QWOAB3TB.js"),t={current:null},c={current:!1},{waitUntilExit:i,unmount:v}=o(a.default.createElement(n,null,a.default.createElement(r,{resultRef:t,mode:"login",loginCompleteRef:c})),{exitOnCtrlC:!1});f(()=>v()),await i();try{process.stdin.setRawMode?.(!1)}catch{}return process.stdout.write("\x1B[?25h"),c.current?{recovered:!0}:(p(0,"Startup gate cancelled"),{recovered:!1})}function E(e){let r=e.getActiveProfile(),n=e.getDefaultEnv();if(!r||!!!(e.loadBasicAuth(r,n)||e.loadCredentials(r,n)))return!1;let a=e.loadProfileConfig(r,n)??{};return!!a.project_id&&!!a.folder_id}export{G as a,O as b};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{t as m}from"./chunk-IBDWHXNE.js";import{a as x}from"./chunk-HCBYKLMW.js";import{a as u,b as a,j as g}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as f}from"./chunk-UR6MHSHU.js";var T=f(b(),1);function k(i,n){if(!n)return i;let l=i.trim()||n;return`\x1B]8;;${n}\x07${l}\x1B]8;;\x07`}var r=f(x(),1);function $({shareableLink:i,testCaseLink:n,codeExportDir:l,recordedTestPath:s,outputDir:o,autoExit:p=!0}){let{exit:c}=g();(0,T.useEffect)(()=>{if(!p)return;let t=setTimeout(()=>c(),100);return()=>clearTimeout(t)},[c,p]);let e=[];return s&&e.push({label:"Test",url:s,linkUrl:`file://${s}`}),o&&e.push({label:"Output",url:o,linkUrl:`file://${o}`}),i&&e.push({label:"ShareLink",url:i}),n&&e.push({label:"TestCase",url:n}),l&&!o&&e.push({label:"CodeExport",url:l,linkUrl:`file://${l}`}),e.length===0?(0,r.jsx)(r.Fragment,{}):(0,r.jsx)(u,{flexDirection:"column",marginTop:1,marginLeft:1,children:e.map(t=>(0,r.jsxs)(u,{flexDirection:"column",marginBottom:1,children:[(0,r.jsxs)(a,{color:m.orange,children:[t.label,":"]}),(0,r.jsx)(a,{color:m.dim,children:k(t.url,t.linkUrl??t.url)})]},t.label))})}export{$ as a};
|