@testmuai/kane-cli 0.3.7 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ChromeProfilePicker-CBF6SP67.js → ChromeProfilePicker-27QCT4NT.js} +1 -1
- package/dist/{CliFeedbackPrompt-P2FJBV3S.js → CliFeedbackPrompt-LMXDRY5F.js} +1 -1
- package/dist/{CliUploadProgress-B4CVWX62.js → CliUploadProgress-QP5SPC7G.js} +1 -1
- package/dist/ConfigView-RQM2JY4K.js +2 -0
- package/dist/FolderPicker-YN2YQJXI.js +2 -0
- package/dist/HelpView-2IYG5AC3.js +2 -0
- package/dist/{InfoBox-SYT7CVM4.js → InfoBox-JELKGWY5.js} +1 -1
- package/dist/{LinksBox-R3VLKMYS.js → LinksBox-NUSUOUIW.js} +1 -1
- package/dist/{ProfilesView-XKUXSFMQ.js → ProfilesView-RXYI2IS3.js} +1 -1
- package/dist/{ProjectPicker-TWTR6SWR.js → ProjectPicker-RUR7HH2P.js} +1 -1
- package/dist/{SaveSessionPrompt-WAVXAYCK.js → SaveSessionPrompt-GUBVAQ3O.js} +1 -1
- package/dist/SingleShotApp-3XDTU2BU.js +2 -0
- package/dist/SummaryBox-5Y2YYOUM.js +2 -0
- package/dist/TestMdRunView-PPZPUVVZ.js +2 -0
- package/dist/{WhoamiView-YG6SSQTV.js → WhoamiView-IJZUFJ7B.js} +1 -1
- package/dist/{changelog-M5VP33UN.js → changelog-N4SSER5V.js} +1 -1
- package/dist/chunk-3C7ATCDM.js +2 -0
- package/dist/chunk-3Z4EHIOW.js +2 -0
- package/dist/chunk-5TOE4RHH.js +2 -0
- package/dist/chunk-6IQWD272.js +2 -0
- package/dist/{chunk-VUIXILBR.js → chunk-6NEJEMA6.js} +8 -8
- package/dist/{chunk-KX7K3Y7R.js → chunk-7G7ZLAJH.js} +1 -1
- package/dist/{chunk-X5CCG35O.js → chunk-7RPMUEEN.js} +1 -1
- package/dist/{chunk-PQGNWC33.js → chunk-AT2Y5UNP.js} +1 -1
- package/dist/chunk-BKXTOQWL.js +5 -0
- package/dist/chunk-CGAX3AXA.js +2 -0
- package/dist/chunk-CKY3UXTY.js +2 -0
- package/dist/chunk-DTFPHZE7.js +62 -0
- package/dist/chunk-H4XV224I.js +6 -0
- package/dist/chunk-H6OVTXJQ.js +2 -0
- package/dist/chunk-HN7DVSVI.js +11 -0
- package/dist/chunk-HYVAYSRZ.js +2 -0
- package/dist/chunk-IH45REQA.js +2 -0
- package/dist/chunk-J37YPPCD.js +2 -0
- package/dist/chunk-JCR3T34A.js +20 -0
- package/dist/chunk-JLOY7SNA.js +14 -0
- package/dist/chunk-L3RTVAPG.js +6 -0
- package/dist/chunk-LMV2F35W.js +2 -0
- package/dist/chunk-LRF6UP42.js +10 -0
- package/dist/chunk-M5RHRHFC.js +9 -0
- package/dist/{chunk-QKM3RHSQ.js → chunk-O2UU4TS5.js} +1 -1
- package/dist/chunk-PKQJHIKJ.js +2 -0
- package/dist/{chunk-74MJWDIW.js → chunk-PN7LNQ7G.js} +1 -1
- package/dist/{chunk-L256AYYL.js → chunk-PWHFNSDC.js} +1 -1
- package/dist/{chunk-BDC7IOXP.js → chunk-SJ7VGRQU.js} +11 -11
- package/dist/chunk-TAEW7PXN.js +2 -0
- package/dist/chunk-UJZCMEEH.js +8 -0
- package/dist/chunk-UVBDUDSL.js +2 -0
- package/dist/chunk-VS2BXLH4.js +2 -0
- package/dist/chunk-VTDVK3DK.js +2 -0
- package/dist/chunk-XQXSPUIX.js +2 -0
- package/dist/generate-headless-7UYAPXE5.js +18 -0
- package/dist/index.js +34 -38
- package/dist/{login-flow-3YFO62HA.js → login-flow-LK7GAUCZ.js} +1 -1
- package/dist/persist-recorded-session-VEFILVPX.js +3 -0
- package/dist/{pipeline-L3VM7QEX.js → pipeline-3GVPCDRE.js} +1 -1
- package/dist/{recording-banner-Q66Y2UIC.js → recording-banner-WS4Y7LVH.js} +1 -1
- package/dist/run-test-md-SXZUOYSG.js +14 -0
- package/dist/tcg-generate-CEBFKKJE.js +2 -0
- package/dist/testmd-actions-IZPOBSTC.js +2 -0
- package/dist/{validate-basic-JJOEAFLT.js → validate-basic-Y73NBDAD.js} +1 -1
- package/dist/{version-check-WWOS4OEZ.js → version-check-LNKXGYZE.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/SingleShotApp-JH6A65TZ.js +0 -2
- package/dist/SummaryBox-FDNFQYSC.js +0 -2
- package/dist/TestMdRunView-E4UDWIGT.js +0 -2
- package/dist/chunk-2SXNPFGD.js +0 -2
- package/dist/chunk-5XTLIGWL.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-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/persist-recorded-session-LVQLORT4.js +0 -3
- package/dist/run-test-md-5TNUTTEA.js +0 -64
- package/dist/testmd-actions-O4NTH2OR.js +0 -20
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as
|
|
3
|
-
|
|
4
|
-
${
|
|
2
|
+
import{b as h}from"./chunk-L5LI2JF4.js";import{c}from"./chunk-3Z4EHIOW.js";import{randomUUID as j}from"crypto";import{mkdirSync as $,writeFileSync as p,appendFileSync as E,existsSync as _}from"fs";import{join as a}from"path";import{writeFileSync as S,mkdirSync as b,existsSync as w}from"fs";import{join as g,relative as I}from"path";function m(i){let t=Object.keys(i.frontmatter).length>0?h(i.frontmatter).trimEnd():"",s=["---"];return t&&s.push(t),s.push("---",""),s.push(`# ${i.heading}`,""),i.steps.forEach((r,n)=>{s.push(`## Step ${n+1}`,r,"")}),s.join(`
|
|
3
|
+
`)}var x=new Set(["username","access_key","oauth","profile","project_id","folder_id"]),y=new Set(["model","env"]),d=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=g(this.opts.cwd,".testmuai","tests");try{b(t,{recursive:!0})}catch(u){process.stderr.write(`
|
|
4
|
+
\u26A0 Failed to create ${I(this.opts.cwd,t)}/
|
|
5
|
+
${u.message}
|
|
5
6
|
Your test recording was NOT saved.
|
|
6
7
|
|
|
7
|
-
`);return}let s=
|
|
8
|
-
`),"utf8")}catch(l){process.stderr.write(`
|
|
8
|
+
`);return}let s=g(t,`${e}_test.md`),r=2,n=!1;for(;w(s);)s=g(t,`${e}-${r}_test.md`),r++,n=!0;let o=L(this.opts.getResolvedGlobal()),l=m({frontmatter:o,heading:`Session: ${e}`,steps:this.objectives});try{S(s,l,"utf8")}catch(u){process.stderr.write(`
|
|
9
9
|
\u26A0 Failed to save your test recording.
|
|
10
|
-
${
|
|
10
|
+
${u.message}
|
|
11
11
|
Path: ${s}
|
|
12
12
|
|
|
13
|
-
`);return}this.lastWrittenPath=s,this.lastCollisionSuffixed=n}};function
|
|
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{
|
|
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}})}}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,r){if(t===void 0){this._log(e);let
|
|
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},r=t.run_dirs?.length??1;for(let n=0;n<r;n++)e.push(s)}return e}setUploadStatus(e,t){this._uploadStatus=e,this._uploadAttempts+=1,this._uploadError=t??null}_log(e){if(!(!this._started||!
|
|
17
|
-
`)}catch{}}};export{
|
|
13
|
+
`);return}this.lastWrittenPath=s,this.lastCollisionSuffixed=n}};function L(i){let e={};for(let[t,s]of Object.entries(i))x.has(t)||y.has(t)||(e[t]=s);return e}var F=a(c,"sessions"),f=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;_startedAt="";_remoteLogger=null;_earlyLogBuffer=[];_recorder=null;_resolvedGlobal={};_sessionName=null;_recordingEnabled=!0;_stepRunRecords=[];constructor(e){this.sessionId=j();let t=e?.baseDir?a(e.baseDir,"sessions"):F;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{$(this.sessionDir,{recursive:!0}),this._recorder=new d({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,objectives:[],runs:[],status:"in_progress"};p(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}})}}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,r){if(t===void 0){this._log(e);let l=e.indexOf(" "),u=l>0?e.slice(0,l):e,v=l>0?e.slice(l+1):"",R=/fail|error/i.test(e)?"error":"info";this._remoteLogger?.log(R,u,v||e);return}let n=e,o=s;this._log(`${t} ${o}`),this._remoteLogger?.log(n,t,o,r)}logStep(e,t,s){this._log(`${e} ${t}`);let r=this._nextIndex>0?this._nextIndex-1:0;this._remoteLogger?.logStep(r,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,r){let n=(s??0).toFixed(1),o=(r??"").slice(0,100);this._log(`RUN ${e} END status=${t} duration=${n}s summary="${o}"`),this._remoteLogger?.log("info","RUN_END",`Run ${e} ended`,{run_index:e,status:t,duration:s??0,summary:r??""}),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,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}))};_(this.sessionDir)&&p(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},r=t.run_dirs?.length??1;for(let n=0;n<r;n++)e.push(s)}return e}setUploadStatus(e,t){this._uploadStatus=e,this._uploadAttempts+=1,this._uploadError=t??null}_log(e){if(!(!this._started||!_(this.sessionDir)))try{let t=new Date().toISOString().slice(0,19).replace("T"," "),s=a(this.sessionDir,"tui.log");E(s,`[${t}] ${e}
|
|
17
|
+
`)}catch{}}};export{m as a,f as b};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as R}from"./chunk-AT2Y5UNP.js";import{a as Y}from"./chunk-HCBYKLMW.js";import{t as r}from"./chunk-3Z4EHIOW.js";import{a,b as i,i as X}from"./chunk-C44QQJR4.js";import{a as G}from"./chunk-6YGTRKDT.js";import{e as P}from"./chunk-UR6MHSHU.js";var u=P(G(),1);var e=P(Y(),1),f=5;function K(t,I){if(!I)return t;let c=I.toLowerCase();return t.filter(B=>B.label.toLowerCase().includes(c))}function J(t){let{title:I,items:c,loading:B=!1,loadingText:F,error:L=null,itemNoun:T="items",onSelect:H,onCancel:E,defaultActiveId:w,onTab:y,extraHint:N}=t,[x,d]=(0,u.useState)(0),[S,g]=(0,u.useState)(0),[s,A]=(0,u.useState)(""),[C,h]=(0,u.useState)(null);(0,u.useEffect)(()=>{if(c.length===0)return;if(t.preserveSelectionById&&C!==null){let n=c.findIndex(o=>o.id===C);if(n>=0){g(Math.floor(n/f)),d(n%f);return}}let l=w?c.findIndex(n=>n.id===w):c.findIndex(n=>n.isActive);l>=0?(g(Math.floor(l/f)),d(l%f),t.preserveSelectionById&&h(c[l].id)):t.preserveSelectionById&&(g(0),d(0),h(c[0]?.id??null))},[c,w,t.preserveSelectionById,C]),(0,u.useEffect)(()=>{if(!t.onSearch)return;let l=setTimeout(()=>t.onSearch(s),t.searchDebounceMs??250);return()=>clearTimeout(l)},[s,t.onSearch,t.searchDebounceMs]);let m=t.onSearch?c:K(c,s),M=S*f,p=Math.min(M+f,m.length),D=Math.ceil(m.length/f),O=p-M,v=m.slice(M,p);return X((l,n)=>{if(L){n.escape&&E();return}if(n.escape){s?(A(""),d(0),g(0)):E();return}if(n.tab&&y){y();return}if(n.upArrow){if(x>0){let o=x-1;d(o),t.preserveSelectionById&&h(v[o]?.id??null)}else if(S>0){let o=S-1,b=f-1;g(o),d(b),t.preserveSelectionById&&h(m[o*f+b]?.id??null)}return}if(n.downArrow){if(x<O-1){let o=x+1;d(o),t.preserveSelectionById&&h(v[o]?.id??null)}else if(S<D-1){let o=S+1,b=0;g(o),d(b),t.preserveSelectionById&&h(m[o*f+b]?.id??null)}return}if(n.return&&v[x]){H(v[x]);return}if(n.backspace||n.delete){A(o=>o.slice(0,-1)),d(0),g(0);return}l&&!n.ctrl&&!n.meta&&(A(o=>o+l),d(0),g(0))},{isActive:!B}),B?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.orange,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:r.orange,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(i,{color:r.secondary,children:F??`Loading ${T}\u2026`})})]}):L?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.red,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:r.red,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(i,{color:r.red,children:L})}),(0,e.jsx)(R,{bindings:[]})]}):(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.orange,paddingX:2,paddingY:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(i,{color:r.orange,bold:!0,children:I}),(0,e.jsxs)(i,{color:r.dim,children:[" (",m.length,!t.onSearch&&s?`/${c.length}`:""," ",T,t.loadingMore?" \xB7 loading more":"",")"]})]}),(0,e.jsxs)(a,{marginTop:1,children:[(0,e.jsx)(i,{color:r.secondary,children:s?"filter: ":""}),s?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(i,{children:s}),(0,e.jsx)(i,{inverse:!0,children:" "})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)(i,{color:r.dim,children:["Search ",T,"\u2026"]}),(0,e.jsx)(i,{inverse:!0,children:" "})]})]}),(0,e.jsx)(a,{flexDirection:"column",marginTop:1,children:t.searching?(0,e.jsxs)(i,{color:r.secondary,children:["Searching ",T,"\u2026"]}):m.length===0?(0,e.jsxs)(i,{color:r.dim,children:["No ",T,' match "',s,'"']}):v.map((l,n)=>{let o=n===x,b=o?"\u276F ":" ",$=l.isActive?r.green:o?r.orange:void 0;return(0,e.jsxs)(i,{color:$,children:[b,l.label,l.isActive?" \u25CF selected":""]},l.id)})}),!t.searching&&D>1&&(0,e.jsx)(a,{marginTop:1,children:(0,e.jsxs)(i,{color:r.dim,children:["Page ",S+1,"/",D]})}),t.footer&&(0,e.jsx)(a,{marginTop:1,flexDirection:"column",children:t.footer}),(0,e.jsx)(R,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"type",label:"to search"},{keys:"\u21B5",label:"select"},...y&&N?[{keys:"tab",label:N}]:[]],escBackLabel:s?"clear":"back to chat"})]})}export{J as a};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{d as s,h as l}from"./chunk-3Z4EHIOW.js";import{readFileSync as d,writeFileSync as i,mkdirSync as o,existsSync as p}from"fs";import{dirname as a}from"path";var n={window_size:{width:1920,height:1080},chrome_profile_path:"",default_url:l,model:"v16-alpha",project_id:null,project_name:null,folder_id:null,folder_name:null,mode:"testing",code_export:{enabled:!0,language:"python",skip_validation:!0},generate:{scenario_limit:2,per_scenario_limit:3,memory_enabled:!1},last_seen_version:""},c=class{constructor(t=s){this.path=t}exists(){return p(this.path)}load(){try{let t=d(this.path,"utf-8"),e=JSON.parse(t);return{...n,...e,code_export:{...n.code_export,...e.code_export??{}},generate:{...n.generate,...e.generate??{}}}}catch{return{...n,code_export:{...n.code_export},generate:{...n.generate}}}}set(t,e){try{let r=this.load();r[t]=e,o(a(this.path),{recursive:!0}),i(this.path,JSON.stringify(r,null,2)+`
|
|
3
|
+
`)}catch(r){let g=r instanceof Error?r.message:String(r);process.stderr.write(`[config] Failed to save config: ${g}
|
|
4
|
+
`)}}save(t){try{let r={...this.load(),...t};o(a(this.path),{recursive:!0}),i(this.path,JSON.stringify(r,null,2)+`
|
|
5
|
+
`)}catch(e){let r=e instanceof Error?e.message:String(e);process.stderr.write(`[config] Failed to save config: ${r}
|
|
6
|
+
`)}}writeRaw(t){try{o(a(this.path),{recursive:!0}),i(this.path,JSON.stringify(t,null,2)+`
|
|
7
|
+
`)}catch(e){let r=e instanceof Error?e.message:String(e);process.stderr.write(`[config] Failed to save config: ${r}
|
|
8
|
+
`)}}};export{c as a};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{b as m}from"./chunk-VE3SUJMA.js";import{a as g}from"./chunk-J37YPPCD.js";import{a as f}from"./chunk-7CLUJYMW.js";var _="KaneAI Generated",N="Untitled";async function u(e){let d=e.config.load(),c=new f(g(e.env).tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key),l=e.projectName??_,i=e.folderName??N,r=d.project_id??null,s=d.project_name??null;if(!r){let n=(await c.listProjects()).find(o=>o.name===l);if(n)r=n.project_id,s=n.name,e.log("info","ENSURE_PROJECT_FOUND","Found default project",{project_id:r,name:s});else{let o=await c.createProject(l);r=o.id,s=o.name,e.log("info","ENSURE_PROJECT_CREATED","Created default project",{project_id:r,name:s})}m(e.creds,e.config,e.profile,e.env,{projectId:r,projectName:s})}let t=d.folder_id??null,a=d.folder_name??null,j=!d.project_id;if(!t||j){let n=(await c.listFolders(r)).find(o=>o.name===i);if(n)t=n.id,a=n.name,e.log("info","ENSURE_FOLDER_FOUND","Found default folder",{folder_id:t,name:a});else{let o=await c.createFolder(r,i);t=o.id,a=o.name,e.log("info","ENSURE_FOLDER_CREATED","Created default folder",{folder_id:t,name:a})}m(e.creds,e.config,e.profile,e.env,{folderId:t,folderName:a})}return{projectId:r,projectName:s??l,folderId:t,folderName:a??i}}export{u as a};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as c}from"./chunk-HCBYKLMW.js";import{t as a}from"./chunk-3Z4EHIOW.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,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as m}from"./chunk-HCBYKLMW.js";import{t as e}from"./chunk-3Z4EHIOW.js";import{a as r,b as i}from"./chunk-C44QQJR4.js";import{e as d}from"./chunk-UR6MHSHU.js";var o=d(m(),1),s={default:e.muted,error:e.red,success:e.green,info:e.orange,warning:e.orange};function T({title:t,titleColor:a,borderColor:l,variant:n="default",children:c,width:u,paddingX:g=2,paddingY:x=0,marginBottom:f=0}){let p=l??s[n],B=a??(n==="default"?e.orange:s[n]);return(0,o.jsxs)(r,{flexDirection:"column",marginBottom:f,children:[t&&(0,o.jsx)(r,{marginBottom:0,children:(0,o.jsxs)(i,{color:B,bold:!0,children:[" ",t]})}),(0,o.jsx)(r,{borderStyle:"round",borderColor:p,flexDirection:"column",paddingX:g,paddingY:x,width:u,children:c})]})}function h({label:t,value:a,labelColor:l=e.dim,valueColor:n,labelWidth:c=14}){return(0,o.jsxs)(r,{children:[(0,o.jsx)(r,{width:c,children:(0,o.jsx)(i,{color:l,children:t})}),(0,o.jsx)(i,{color:n,children:a})]})}function C({label:t}){return(0,o.jsx)(r,{marginTop:1,marginBottom:0,children:(0,o.jsx)(i,{bold:!0,children:t})})}export{T as a,h as b,C as c};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as x}from"./chunk-HCBYKLMW.js";import{t as m}from"./chunk-3Z4EHIOW.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};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as D,f as E,g as H,h as x,j as A,k as G,l as M,m as w,n as T,o as $,p as B}from"./chunk-H4XV224I.js";import{a as j}from"./chunk-UVBDUDSL.js";import{c as b}from"./chunk-3C7ATCDM.js";import{d as L}from"./chunk-7RPMUEEN.js";import"./chunk-PN7LNQ7G.js";import{b as C}from"./chunk-SJ7VGRQU.js";import"./chunk-L5LI2JF4.js";import{a as _}from"./chunk-UJZCMEEH.js";import{d as R,e as q}from"./chunk-LRF6UP42.js";import"./chunk-VE3SUJMA.js";import{a as k}from"./chunk-7G7ZLAJH.js";import"./chunk-BPF7TDRU.js";import"./chunk-WAOCHXJ5.js";import{a as I}from"./chunk-J37YPPCD.js";import"./chunk-3Z4EHIOW.js";import"./chunk-7CLUJYMW.js";import"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-UR6MHSHU.js";import{join as Q}from"path";async function P(t){let e=t.projectId,n=t.folderId;if(!e&&t.autoResolve){let r=await t.resolver.resolve();if(!r)throw new H("unauthorized; run `kane-cli login`");let c=await j({creds:t.autoResolve.creds,config:t.autoResolve.config,profile:t.autoResolve.profile,env:t.autoResolve.envName,tmsCreds:{username:r.username,access_key:r.access_key},log:t.log});e=c.projectId,n=n??c.folderId}return{baseUrl:`${t.env.testGeneratorBaseUrl}/test-generator/api/v2`,authResolver:t.resolver,projectId:e,folderId:n,suiteName:t.suiteName,log:t.log}}function K(t){return t.reduce((e,n)=>e+(n.test_cases?.length??0),0)}var h=class{constructor(e=n=>process.stdout.write(n)){this.write=e}emit(e){this.write(JSON.stringify(e)+`
|
|
3
|
+
`)}onStart(e){this.emit({type:"generate_start",request_id:e.requestId,objective_chars:e.objectiveChars,scenario_limit:e.scenarioLimit,per_scenario_limit:e.perScenarioLimit,is_refine:e.isRefine})}onThinking(e){this.emit({type:"generate_thinking",took_ms:e.tookMs})}onProgress(e){this.emit({type:"generate_progress",pct:e})}onSnapshot(e){this.emit({type:"generate_snapshot",scenario_count:e.scenarios.length,case_count:K(e.scenarios),scenarios:e.scenarios})}onClarification(e){this.emit({type:"generate_clarification",text:e})}onChat(e){this.emit({type:"generate_chat",text:e})}onError(e){this.emit({type:"error",message:e})}onSaveResult(e){this.emit({type:"generate_save_result",suite_dir:e.suiteDir,saved:e.saved,fell_back:e.fellBack,...e.warning?{warning:e.warning}:{}})}onDone(e){this.emit({type:"generate_done",request_id:e.requestId,status:e.status,scenario_count:e.scenarioCount,case_count:e.caseCount,refine_hint:e.refineHint,save_hint:e.saveHint,...e.suiteDir?{suite_dir:e.suiteDir}:{}})}onUpdateAvailable(e){this.emit({type:"update_available",current:e.current,latest:e.latest,severity:e.severity})}},y=class{constructor(e=n=>process.stdout.write(n)){this.write=e}onStart(e){let n=e.isRefine?"Refining":"Generating";this.write(`${n} (request ${e.requestId})\u2026
|
|
4
|
+
`)}onThinking(e){let n=e.tookMs?` (${Math.round(e.tookMs/1e3)}s)`:"";this.write(` thinking${n}
|
|
5
|
+
`)}onProgress(e){this.write(` progress ${e}%
|
|
6
|
+
`)}onSnapshot(e){for(let n of e.scenarios){this.write(` \u2022 ${n.title??n.sid??"scenario"}
|
|
7
|
+
`);for(let r of n.test_cases??[])this.write(` - ${r.title??`case ${r.id}`}
|
|
8
|
+
`)}}onClarification(e){this.write(`? ${e}
|
|
9
|
+
`)}onChat(e){this.write(`${e}
|
|
10
|
+
`)}onError(e){this.write(`error: ${e}
|
|
11
|
+
`)}onSaveResult(e){this.write(` saved ${e.saved} test(s) to ${e.suiteDir}${e.fellBack?` (${e.fellBack} prose fallback)`:""}
|
|
12
|
+
`),e.warning&&this.write(` warning: ${e.warning}
|
|
13
|
+
`)}onDone(e){this.write(`\u2713 Generated ${e.scenarioCount} scenarios \xB7 ${e.caseCount} cases (request ${e.requestId})
|
|
14
|
+
`),this.write(` Refine: ${e.refineHint}
|
|
15
|
+
`),this.write(` Save: ${e.saveHint}
|
|
16
|
+
`),e.suiteDir&&this.write(` Saved: ${e.suiteDir}
|
|
17
|
+
`)}onUpdateAvailable(e){this.write(`(update available: ${e.current} \u2192 ${e.latest})
|
|
18
|
+
`)}};import{createHash as J}from"crypto";function Y(t){return J("sha1").update(JSON.stringify({t:t.title,p:t.preconditions,m:t.manual_steps})).digest("hex")}function V(t){let e=[];for(let n of t.scenarios)for(let r of n.test_cases??[])w(r)&&r.manual_steps!=null&&e.push(r);return e}async function X(t,e,n){let r=new Array(t.length),c=0,m=Array.from({length:Math.min(e,t.length)},async()=>{for(;;){let a=c++;if(a>=t.length)return;try{r[a]={ok:!0,value:await n(t[a])}}catch{r[a]={ok:!1}}}});return await Promise.all(m),r}async function N(t,e,n){let r=V(t),c=n.run??(async(o,l)=>{let p=await n.resolveAuth(),U=$({objective:o,model:n.model,sessionId:n.sessionId,auth:p});return B(U,n.spawnOpts,l)}),m=r.map(Y),a=[...new Set(m)],g=new Map;a.forEach(o=>{g.set(o,r[m.indexOf(o)])});let i=a.map(o=>g.get(o)),d=await X(i,n.concurrency??3,o=>c(T(o))),u=new Map;a.forEach((o,l)=>{let p=d[l];p.ok&&u.set(o,p.value)});let f=new Map;r.forEach((o,l)=>{f.set(o.id,u.get(m[l]))});let s=0;for(let o of t.scenarios)for(let l of o.test_cases??[])w(l)&&!f.get(l.id)&&s++;let S=o=>{let l=f.get(o.id);return l?A(l,o):G(o)};return{...await M(t,e,{suiteName:n.suiteName,redirectBareCwd:!1},S),fellBack:s}}function Ce(t,e){let n=!!t.agent||!!t.refine||!!t.save||!e,r=t.agent?"agent":"plain";return{headless:n,mode:r}}function _e(t){return t.refine&&t.save?{error:"use --refine or --save, not both"}:t.save?t.objective?{error:"--save takes no objective; use --refine to add to a request"}:t.req?{op:"save"}:{error:"--save requires --req <id>"}:t.refine?t.req?t.objective?t.out?{error:"--out is only valid with --save"}:{op:"refine"}:{error:"--refine needs a refinement objective"}:{error:"--refine requires --req <id>"}:t.req?{error:"--req requires --refine or --save"}:t.out?{error:"--out is only valid with --save"}:t.objective?{op:"new"}:{error:"provide an objective, or use --refine/--save with --req"}}function W(){return Q(process.cwd(),".testmuai","tests")}var z="tcg-generate-headless";function F(t){return{refineHint:`kane-cli generate "<refinement>" --refine --req ${t}`,saveHint:`kane-cli generate --save --req ${t}`}}function O(t){return t.scenarios.reduce((e,n)=>e+(n.test_cases?.length??0),0)}function Z(t){return t==="completed"?0:t==="stopped"?3:1}async function Re(t,e){let n=e.write??(a=>process.stdout.write(a)),r=e.sink??(e.mode==="agent"?new h(n):new y(n)),c;try{c=await e.makeClient()}catch(a){return r.onError(a.message),2}try{let a=await(e.checkUpdate??L)();a&&r.onUpdateAvailable(a)}catch{}let m=t.reqId??null;R(z,()=>{m&&c.cancel(m).catch(()=>{})});try{if(t.op==="save"){let s;try{s=(await c.attach(t.reqId)).state}catch(l){return r.onError(l.message),2}m=s.requestId,r.onSnapshot(s);let S=t.outDir??W(),v=await e.materialize(s,S,t.suiteName);r.onSaveResult({suiteDir:v.suiteDir,saved:v.paths.length,fellBack:v.fellBack,warning:v.warning});let o=F(s.requestId);return r.onDone({requestId:s.requestId,status:"completed",scenarioCount:s.scenarios.length,caseCount:O(s),refineHint:o.refineHint,saveHint:o.saveHint,suiteDir:v.suiteDir}),0}let a=t.op==="refine",g,i;try{if(a){let s=await c.attach(t.reqId);if(i=s.state,m=i.requestId,i.error)return r.onError(i.error),2;r.onStart({requestId:i.requestId,objectiveChars:(t.objective??"").length,scenarioLimit:t.scenarioLimit,perScenarioLimit:t.perScenarioLimit,isRefine:!0}),await c.chat(t.reqId,t.objective,void 0),g=s.events}else{let s=await c.start({prompt:t.objective,scenarioLimit:t.scenarioLimit,perScenarioLimit:t.perScenarioLimit,memoryEnhancement:t.memory});i=s.state,m=i.requestId,r.onStart({requestId:i.requestId,objectiveChars:t.objective.length,scenarioLimit:t.scenarioLimit,perScenarioLimit:t.perScenarioLimit,isRefine:!1}),g=s.events}}catch(s){return r.onError(s.message),2}let d="";for await(let s of g){switch(i=E(i,s),s.type){case"thinking_done":r.onThinking({tookMs:s.tookMs});break;case"progress":r.onProgress(s.pct);break;case"clarification":r.onClarification(s.text);break;case"chat":r.onChat(s.text);break;case"error":r.onError(s.message);break;case"done":d=s.status;break;default:break}if(s.type==="done"||s.type!=="thinking"&&i.status&&D(i.status))break}r.onSnapshot(i);let u=d||i.status||"completed",f=F(i.requestId);return r.onDone({requestId:i.requestId,status:u,scenarioCount:i.scenarios.length,caseCount:O(i),refineHint:f.refineHint,saveHint:f.saveHint,suiteDir:void 0}),Z(u)}finally{q(z)}}var ee=()=>{};async function qe(t){let e=new k,n=new _,r=e.getActiveProfile()??"default",c=t.env??e.getDefaultEnv()??"prod",m=I(c),a=new C;t.name&&a.setSessionName(t.name);let g=n.load().model,i=async()=>{let u=await b({creds:e,env:c,usernameFlag:t.username,accessKeyFlag:t.accessKey,log:()=>{}}),f=await P({resolver:u.resolver,env:m,log:ee,projectId:t.projectId,folderId:t.folderId,autoResolve:t.projectId?void 0:{creds:e,config:n,profile:r,envName:c}});return x(f)},d=async()=>{let u=await b({creds:e,env:c,usernameFlag:t.username,accessKeyFlag:t.accessKey,log:()=>{}});return u.basicAuth?{username:u.basicAuth.username,access_key:u.basicAuth.access_key}:u.token?{auth:{type:"bearer",token:u.token}}:{}};return{mode:t.mode,makeClient:i,materialize:(u,f,s)=>N(u,f,{model:g,sessionId:a.sessionId,resolveAuth:d,spawnOpts:{environment:c},suiteName:s})}}export{qe as buildHeadlessDeps,Ce as decideGenerateMode,W as defaultOutDir,_e as resolveGenerateOp,Re as runGenerateHeadless};
|