@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
package/dist/chunk-U4XV5KUD.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as m}from"./chunk-HCBYKLMW.js";import{t as o}from"./chunk-5XTLIGWL.js";import{a as r,b as i}from"./chunk-C44QQJR4.js";import{e as a}from"./chunk-UR6MHSHU.js";var e=a(m(),1),u={default:o.muted,error:o.red,success:o.green,info:o.purple,warning:o.yellow};function T({title:t,titleColor:l,borderColor:d,variant:n="default",children:c,width:s,paddingX:x=2,paddingY:g=0,marginBottom:p=0}){let f=d??u[n],B=l??(n==="default"?o.purple:u[n]);return(0,e.jsxs)(r,{flexDirection:"column",marginBottom:p,children:[t&&(0,e.jsx)(r,{marginBottom:0,children:(0,e.jsxs)(i,{color:B,bold:!0,children:[" ",t]})}),(0,e.jsx)(r,{borderStyle:"round",borderColor:f,flexDirection:"column",paddingX:x,paddingY:g,width:s,children:c})]})}function h({label:t,value:l,labelColor:d=o.dimmed,valueColor:n,labelWidth:c=14}){return(0,e.jsxs)(r,{children:[(0,e.jsx)(r,{width:c,children:(0,e.jsx)(i,{color:d,children:t})}),(0,e.jsx)(i,{color:n,children:l})]})}function C({label:t}){return(0,e.jsx)(r,{marginTop:1,marginBottom:0,children:(0,e.jsx)(i,{bold:!0,children:t})})}export{T as a,h as b,C as c};
|
package/dist/chunk-VS5FTXRZ.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{d as ie,g as ae}from"./chunk-X7VI7KK3.js";import{b as ne,e as V,j as K}from"./chunk-AH4AXJML.js";import{a as oe}from"./chunk-74MJWDIW.js";import{b as re,d as se}from"./chunk-G7VF5SDK.js";import{b as F}from"./chunk-VE3SUJMA.js";import{a as _}from"./chunk-JHNEE2MB.js";import{a as te}from"./chunk-WAOCHXJ5.js";import{a as Y}from"./chunk-E47GFYXA.js";import{a as X,g as Z,i as B,j as M}from"./chunk-5XTLIGWL.js";import{a as P}from"./chunk-7CLUJYMW.js";import{a as A,b as ee}from"./chunk-NLCCBXXV.js";import{a as m}from"./chunk-RZ4F3BHX.js";import{dirname as Oe,join as De}from"path";function kt(e,t,r){let s=e.total_runs??1,o=e.run_dir,n,i;if(s>1&&o){let a=Oe(o);n=Array.from({length:s},(c,l)=>De(a,String(t+l))),r&&r.length===s&&(i=r)}return{allRunDirs:n,flowObjectives:i}}function xt(e,t,r,s){return{index:r,objective:t,summary:e.summary,oneLiner:e.one_liner,status:e.status,resultCode:e.result_code,reasonCode:e.reason_code,perFlowMetadata:e.per_flow_metadata,context:e.context??{memory:{},variables:{},pointer:""},run_dir:e.run_dir,run_dirs:s.allRunDirs,flow_objectives:s.flowObjectives}}import{spawn as Ne}from"child_process";async function ce(e,t,r=100){let s=`${e.replace(/\/+$/,"")}/json/version`,o=await m(s);if(!o.ok)throw new Error(`CDP /json/version returned ${o.status}`);let n=await o.json();if(!n.webSocketDebuggerUrl)throw new Error("CDP /json/version missing webSocketDebuggerUrl");let i=new Y(n.webSocketDebuggerUrl);await new Promise((S,u)=>{i.once("open",S),i.once("error",u)});let a=1,c=new Map;i.on("message",S=>{let u;try{u=JSON.parse(S.toString())}catch{return}if(u.id==null)return;let b=c.get(u.id);b&&(c.delete(u.id),u.error?b.reject(new Error(u.error.message)):b.resolve(u.result))});function l(S,u){let b=a++;return new Promise((Pe,Le)=>{c.set(b,{resolve:je=>Pe(je),reject:Le});let z={id:b,method:S};u&&(z.params=u),i.send(JSON.stringify(z))})}let d=(await l("Target.getTargets")).targetInfos.find(S=>S.type==="page");if(!d)throw i.close(),new Error("CDP: no page target found");let C=(await l("Browser.getWindowForTarget",{targetId:d.targetId})).windowId,y="",h=!1,w=null,E=!1;i.on("close",()=>{E=!0}),i.on("error",()=>{E=!0});async function W(){if(!h){if(E){h=!0;return}try{let u=(await l("Browser.getWindowBounds",{windowId:C})).bounds,b=`${u.left}:${u.top}:${u.width}:${u.height}`;b!==y&&(y=b,t({left:u.left,top:u.top,width:u.width,height:u.height}))}catch{}h||(w=setTimeout(W,r))}}return W(),{stop(){if(!h){h=!0,w&&clearTimeout(w);try{i.close()}catch{}}}}}var Ue=new Set(["1","true","yes"]);function Nt(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&Ue.has(t.toLowerCase()))return null;let r=oe();if(!r)return null;let s=[...r.args,"overlay"];e?.text&&s.push(e.text);let o;try{o=Ne(r.cmd,s,{cwd:r.cwd,stdio:["pipe","ignore","ignore"],detached:!1,windowsHide:!0})}catch{return null}function n(c){if(!(!o.stdin||o.stdin.destroyed))try{o.stdin.write(JSON.stringify(c)+`
|
|
3
|
-
`)}catch{}}e?.chromePid&&e.chromePid>0&&n({type:"chrome_pid",pid:e.chromePid});let i=null;e?.cdpEndpoint&&ce(e.cdpEndpoint,c=>n({type:"bounds",...c})).then(c=>{i=c.stop}).catch(()=>{});let a=!1;return{setRunActive(c){a||n({type:"run_active",active:c})},setStepText(c){if(a)return;let l=c.trim();l&&n({type:"step_text",text:l})},setStepComplete(){a||n({type:"step_complete"})},kill(){if(!a){a=!0,i?.();try{o.stdin?.end()}catch{}try{o.kill("SIGTERM")}catch{}}}}}import{readFileSync as $e,existsSync as Be}from"fs";function Bt(e){if(!Be(e))return null;try{return $e(e,"utf-8").trim()||null}catch{return null}}function le(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function Ft(e,t,r,s){return`${le(e,t,r)}/dashboard/share/${s}?type=summary&agentView=true&fqdn=summary-page`}function Vt(e,t,r){return`${le(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{readFileSync as de,readdirSync as ue,existsSync as R}from"fs";import{join as v}from"path";function Gt(e,t,r,s,o,n){try{let i=v(e,"runs",String(t),"run-test");if(!R(i)){o("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:i});return}let a=i;if(n){let h=v(i,`child-${n}`);if(!R(h)){o("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:n,reason:"child_dir_not_found",path:h});return}let w=ue(h).filter(E=>R(v(h,E,"screenshots")));if(w.length===0){o("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:n,reason:"no_child_screenshots_dir"});return}a=v(h,w[0])}else if(!R(v(i,"screenshots"))){let h=ue(i).filter(w=>R(v(i,w,"screenshots")));if(h.length===0){o("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}a=v(i,h[0])}let c=v(a,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!R(c)){o("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:n,reason:"screenshot_not_found",path:c});return}let l=v(i,"actions.ndjson");if(!R(l)){o("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let g=de(l,"utf-8").trim().split(`
|
|
4
|
-
`),d=g[g.length-1];if(!d){o("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let C=JSON.parse(d).action_id;if(!C){o("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let y=de(c);s.enqueue(C,y),o("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:n,action_id:C,size:y.length})}catch(i){o("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{step_index:r,error:i instanceof Error?i.message:String(i)})}}var Me=null,Fe=()=>Me??=import("sharp").then(e=>e.default??e).catch(()=>null),L=class{maxWorkers;maxRetries=2;queue=[];activeCount=0;drainResolvers=[];sas;log;uploadedExt=new Map;constructor(t,r=3,s){this.sas=t,this.maxWorkers=r,this.log=s}updateSas(t){this.sas=t}enqueue(t,r){this.queue.push({operationId:t,buffer:r}),this.pump()}async drain(t=3e4){if(!(this.queue.length===0&&this.activeCount===0))return new Promise(r=>{this.drainResolvers.push(r),setTimeout(()=>{r()},t)})}pump(){for(;this.activeCount<this.maxWorkers&&this.queue.length>0;){let t=this.queue.shift();this.activeCount++,this.processJob(t).finally(()=>{if(this.activeCount--,this.pump(),this.queue.length===0&&this.activeCount===0){for(let r of this.drainResolvers)r();this.drainResolvers=[]}})}}async processJob(t){let r,s="image/webp",o=await Fe();if(o)try{let c=await o(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(c)}catch(c){r=new Uint8Array(t.buffer),s="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:c instanceof Error?c.message:String(c)})}else r=new Uint8Array(t.buffer),s="image/png";let n=s==="image/webp"?"webp":"png",i=`test_screenshots/untagged_screenshot/${t.operationId}.${n}`,a=`${this.sas.base_url}/${this.sas.container}/${i}?${this.sas.sas_token}`;for(let c=0;c<=this.maxRetries;c++)try{let l=await m(a,{method:"PUT",headers:{"Content-Type":s,"x-ms-blob-type":"BlockBlob"},body:r});if(l.ok){this.uploadedExt.set(t.operationId,n);return}if(c<this.maxRetries){await this.backoff(c);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed after retries",{operation_id:t.operationId,status:l.status,attempts:this.maxRetries+1})}catch{if(c<this.maxRetries){await this.backoff(c);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed (network error)",{operation_id:t.operationId,error:"network",attempts:this.maxRetries+1})}}backoff(t){let r=t===0?1e3:3e3;return new Promise(s=>setTimeout(s,r))}getExt(t){return this.uploadedExt.get(t)??"png"}getExtMap(){return this.uploadedExt}isNearExpiry(){if(!this.sas.expiry)return!1;let t=new Date(this.sas.expiry).getTime();return Date.now()>t-5*6e4}};var I=class{config;buffer=[];stepBuffer=new Map;flushTimer=null;currentRunIndex=null;stopped=!1;_droppedBatches=0;_droppedEntries=0;constructor(t){this.config=t}start(){if(this.flushTimer)return;let t=this.config.flushIntervalMs??5e3;this.flushTimer=setInterval(()=>{this.flush().catch(()=>{})},t),this.flushTimer.unref&&this.flushTimer.unref()}setRunIndex(t){this.currentRunIndex=t}log(t,r,s,o={}){if(this.stopped)return;let n=this.buildEntry(t,r,s,o);this.buffer.push(n)}logStep(t,r,s,o={}){if(this.stopped)return;let n=this.buildEntry("debug",r,s,o);n.run_index=t,this.stepBuffer.has(t)||this.stepBuffer.set(t,[]),this.stepBuffer.get(t).push(n)}escalate(t){let r=this.stepBuffer.get(t);r&&r.length>0&&this.buffer.push(...r),this.stepBuffer.delete(t)}discardSteps(t){this.stepBuffer.delete(t)}async flush(){if(this.buffer.length===0)return;let t=this.buffer.splice(0),r=null;try{r=await this.config.getToken()}catch{this.buffer.unshift(...t);return}let s={"Content-Type":"application/json"};r&&(s.Authorization=`Bearer ${r}`);let o=JSON.stringify(t);for(let n=0;n<3;n++){try{let i=new AbortController,a=setTimeout(()=>i.abort(),1e4),c=await m(this.config.proxyUrl,{method:"POST",headers:s,body:o,signal:i.signal});if(clearTimeout(a),c.ok)return}catch{}n<2&&await new Promise(i=>setTimeout(i,1e3*Math.pow(2,n)))}this._droppedBatches++,this._droppedEntries+=t.length}get droppedBatches(){return this._droppedBatches}get droppedEntries(){return this._droppedEntries}async shutdown(){this._droppedBatches>0&&this.log("warn","LOG_DROPS",`Dropped ${this._droppedEntries} entries in ${this._droppedBatches} batches`,{dropped_batches:this._droppedBatches,dropped_entries:this._droppedEntries}),this.stopped=!0,this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),await this.flush()}shutdownSync(){this.stopped=!0,this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null)}get bufferSize(){return this.buffer.length}stepBufferSize(t){return this.stepBuffer.get(t)?.length??0}buildEntry(t,r,s,o){return{hostname:"kane-cli",service:"kane-cli",ddsource:"kane-cli",ddtags:`version:${this.config.device.cli_version}`,level:t,event:r,message:s,session_id:this.config.sessionId,run_index:this.currentRunIndex,identity:this.config.identity,device:this.config.device,context:o,timestamp:new Date().toISOString()}}};import{platform as Ve,arch as Ke}from"os";function me(e){let t={proxyUrl:Z,sessionId:e.sessionId,identity:e.identity,device:{cli_version:X,platform:Ve(),arch:Ke()},getToken:e.getToken};return new I(t)}import{execSync as He}from"child_process";import{readFileSync as qe}from"fs";import{createHash as Ge}from"crypto";import{hostname as Je,platform as Qe,arch as We}from"os";var j=null;function fe(){return j||(j=ze(),j)}function ze(){let e=Qe();if(e==="darwin")try{let s=He("ioreg -rd1 -c IOPlatformExpertDevice",{encoding:"utf-8",timeout:5e3}).match(/"IOPlatformUUID"\s*=\s*"([^"]+)"/);if(s?.[1])return s[1]}catch{}if(e==="linux")try{let r=qe("/etc/machine-id","utf-8").trim();if(r)return r}catch{}let t=`${Je()}:${e}:${We()}`;return Ge("sha256").update(t).digest("hex").slice(0,32)}async function Ye(e){try{let t=_(e.env),s=await new te(t.controllerBaseUrl,e.auth).getScreenshotSas();return e.session.setScreenshotSas(s),e.log("info","SCREENSHOT_SAS_OK","Screenshot SAS fetched",{base_url:s.base_url,container:s.container,expiry:s.expiry}),new L(s,3,e.log)}catch(t){return e.log("warn","SCREENSHOT_SAS_FAIL","Screenshot SAS fetch failed",{error:t instanceof Error?t.message:String(t)}),null}}async function Xe(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=me({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:fe(),email:t.email??null,email_domain:t.email_domain??"unknown",user_type:t.user_type??"unknown",env:e.env},getToken:e.getToken});return e.session.setRemoteLogger(r),r.start(),r}async function Ze(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):Ye({env:e.env,auth:e.auth,session:e.session,log:e.log}),Xe({env:e.env,tmsCreds:e.tmsCreds,getToken:e.getToken,session:e.session})]);return{resolver:e.resolver,screenshotQueue:t.status==="fulfilled"?t.value:null,remoteLogger:r.status==="fulfilled"?r.value:null}}async function H(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function fr(e,t){switch(e.kind){case"boot":{if(t.state.identityServicesRef.current)return t.state.identityServicesRef.current;let r=t.auth.initResolver(e.env);r.prime(e.tmsCreds),t.state.setTmsCredsCache(e.tmsCreds);let s=await q(e.env,e.tmsCreds,r,t);return G(s,t),s}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await H(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null);let s=t.auth.initResolver(e.env),o=await s.resolve(!0).catch(()=>null);if(!o)return t.log("warn","IDENTITY_VALIDATE_FAILED","Identity validation failed",{kind:e.kind,env:e.env}),null;t.state.setTmsCredsCache(o);let n=await q(e.env,o,s,t);return G(n,t),n}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await H(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null),null}case"resessionize":{let r=t.state.identityServicesRef.current;r&&await H(r),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null;let s=t.state.getTmsCredsCache(),o=t.auth.getResolver(),n=o??t.auth.initResolver(e.env);!o&&s&&n.prime(s);let i=await q(e.env,s,n,t);return G(i,t),i}}}async function q(e,t,r,s){let o=s.auth.getBasicAuth(),n=o?null:await s.auth.getToken(),i=o?{username:o.username,accessKey:o.access_key}:n??null;return i===null?{resolver:r,screenshotQueue:null,remoteLogger:null}:Ze({env:e,tmsCreds:t,resolver:r,auth:i,getToken:()=>s.auth.getToken(),session:s.getSession(),log:s.log,skipScreenshotQueue:s.options?.skipScreenshotQueue})}function G(e,t){t.state.identityServicesRef.current=e,t.state.screenshotQueueRef.current=e.screenshotQueue,e.remoteLogger&&(t.exit.registerCleanup("remote-logger",()=>e.remoteLogger.shutdownSync()),t.exit.setExitRemoteLogger(e.remoteLogger))}function ge(e,t){let r={},s={},o=t;for(let[n,i]of Object.entries(e))if(i.secret){let a=`secrets.user.${n}`;r[a]={value:i.value,secret:!0,syntax:`{{secrets.user.${n}}}`,type:"secret"},s[n]=a,o=o.replaceAll(`{{${n}}}`,`{{secrets.user.${n}}}`)}else{let a=`global.${n}`;r[a]={value:i.value,secret:!1,syntax:`{{global.${n}}}`,type:"global"},s[n]=a,o=o.replaceAll(`{{${n}}}`,`{{global.${n}}}`)}return{variables:r,objective:o,keyMap:s}}var O=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=A(t.username,t.accessKey),s=await m(`${this.baseUrl}/logistics/v1.0/secrets/create`,{method:"PUT",headers:{Authorization:r,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({secretKey:t.secretKey,secretValue:t.secretValue,orgId:t.orgId,username:t.username,scope:"user",type:"user",accessKey:t.accessKey})});if(!s.ok)throw new Error(`Push secret failed: ${s.status} ${await s.text()}`)}static extractVariableKeys(t){let r=t.matchAll(/\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g),s=new Set;for(let o of r)s.add(o[1]);return[...s]}};var D=class extends ee{constructor(t,r,s){super(t,{username:r,accessKey:s})}async upsertVariable(t){let r=t.environmentId??0,s=await m(`${this.baseUrl}/v1/variables`,{method:"POST",headers:this.headers(),body:JSON.stringify({name:t.name,value:String(t.value),type:"variable",value_type:"string",is_persist:t.isPersist??!1,environment_id:r})});if(s.ok)return{id:(await s.json()).id??0};if(s.status!==409&&s.status!==422)return{id:0};if(!(await m(`${this.baseUrl}/v1/variables/name/${encodeURIComponent(t.name)}`,{method:"PUT",headers:this.headers(),body:JSON.stringify({value:String(t.value),value_type:"string",type:"variable",environment_id:r})})).ok)return{id:0};let n=await m(`${this.baseUrl}/v1/variables/${encodeURIComponent(t.name)}?environment_id=${r}`,{method:"GET",headers:this.headers()});return n.ok?{id:(await n.json()).data?.id??0}:{id:0}}};import{readdirSync as et,readFileSync as he,existsSync as ye}from"fs";import{join as tt}from"path";function pe(e,t){if(!ye(e))return{};let r={},s;try{s=et(e).filter(o=>o.endsWith(".json")).sort()}catch{return{}}for(let o of s)try{let n=he(tt(e,o),"utf-8"),i=JSON.parse(n);if(i&&typeof i=="object"){for(let[a,c]of Object.entries(i))if(c&&typeof c=="object"&&"value"in c){let l=c;r[a]={value:l.value,secret:l.secret??!1,syntax:l.syntax??`{{${a}}}`}}}}catch{t?t("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:o}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${o}
|
|
5
|
-
`)}return r}function be(e){if(!ye(e))throw new Error(`Variables file not found: ${e}`);let t=he(e,"utf-8"),r=JSON.parse(t),s={};if(r&&typeof r=="object"){for(let[o,n]of Object.entries(r))if(n&&typeof n=="object"&&"value"in n){let i=n;s[o]={value:i.value,secret:i.secret??!1,syntax:i.syntax??`{{${o}}}`}}}return s}function ve(e){let t;try{t=JSON.parse(e)}catch{throw new Error("Invalid --variables JSON")}let r={};if(t&&typeof t=="object"){for(let[s,o]of Object.entries(t))if(o&&typeof o=="object"&&"value"in o){let n=o;r[s]={value:n.value,secret:n.secret??!1,syntax:n.syntax??`{{${s}}}`}}}return r}function we(e,t,r){let s=pe(e,r),o=pe(t,r);return{...s,...o}}function Ar(e,t){if(Object.keys(e).length===0)return{};let r={};for(let[s,o]of Object.entries(e)){let n=o.syntax??`{{${s}}}`;t.includes(n)&&(r[s]=o)}return r}function Pr(e){let t=we(e.globalDir,e.localDir,e.onLoadError),r=e.file?be(e.file):{},s=e.inline?ve(e.inline):{},o={...t,...r,...s},n=Object.keys(o).length>0,{variables:i,objective:a}=n?ge(o,e.objective):{variables:{},objective:e.objective},c=Object.entries(o).filter(([,g])=>g.secret),l=Object.entries(o).filter(([,g])=>!g.secret);return{raw:o,auteur:i,auteurObjective:a,secretEntries:c,nonSecretEntries:l}}async function Lr(e){if(e.localMode)return{};let t=_(e.env);if(e.variables.secretEntries.length>0){let s=new O(t.secretsBaseUrl);for(let[o,n]of e.variables.secretEntries)s.pushSecret({secretKey:o,secretValue:n.value,username:e.auth.username,accessKey:e.auth.access_key,orgId:e.orgId}).then(()=>e.log("info","SECRET_PUSH_OK","Secret pushed",{key:o})).catch(i=>e.log("error","SECRET_PUSH_FAILED","Secret push failed",{key:o,error:String(i)}))}let r={};if(e.variables.nonSecretEntries.length>0){let s=new D(t.tmsBaseUrl,e.auth.username,e.auth.access_key);for(let[o,n]of e.variables.nonSecretEntries)try{let i=await s.upsertVariable({name:o,value:n.value});r[o]=i.id,e.log("info","VAR_PUSH_OK","Variable pushed",{name:o,id:i.id})}catch(i){e.log("error","VAR_PUSH_FAILED","Variable push failed",{name:o,error:String(i)})}}return r}function Or(e){let t={objective:e.objective,model:e.model,width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,stream:!0,max_steps:e.maxSteps??30,headless:e.headless??!1};return e.url&&(t.url=e.url),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.disableAskUser&&(t.disable_ask_user=!0),e.enableTaskSkills&&(t.enable_task_skills=!0),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.globalContext&&(t.global_context=e.globalContext),e.localContext&&(t.local_context=e.localContext),e.sessionContext&&(t.session_context=e.sessionContext),t}var rt=15e3,J=3,Se=[500,1e3];async function $r(e){if(process.env.KANE_LOCK_CONFLICT_SIMULATE==="1")return{ok:!1,reason:"concurrent",httpStatus:409,message:"simulated contention (KANE_LOCK_CONFLICT_SIMULATE=1)"};let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground`,r=await N(t,{from_commit_id:e.fromCommitId,new_commit_id:e.newCommitId},e.auth);return r.ok?{ok:!0,sessionExpiresAt:f(r.body,"session_expires_at")??""}:{ok:!1,...st(r)}}function st(e){let t=f(e.body,"error")??f(e.body,"code")??"",r=f(e.body,"message")??f(e.body,"detail")??e.text??`HTTP ${e.status}`,s;return e.status===0?s="network":e.status===401||e.status===403?s="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?s="base_mismatch":e.status===409?s="concurrent":e.status===422?s="disabled":e.status===400&&/no committed/i.test(r)?s="no_commits":e.status===400?s="missing_field":e.status>=500||e.status===408||e.status===429?s="network":s="other",{reason:s,httpStatus:e.status,message:r}}async function Br(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await N(t,void 0,e.auth);return r.ok?{ok:!0,sessionExpiresAt:f(r.body,"session_expires_at")??""}:{ok:!1,expired:r.status===404,httpStatus:r.status,message:f(r.body,"message")??f(r.body,"detail")??r.text??`HTTP ${r.status}`}}async function Ce(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:e.body.commitMessage,total_steps:e.body.totalSteps};e.body.timeTaken!==void 0&&(r.time_taken=e.body.timeTaken),e.body.objectives!==void 0&&(r.objectives=e.body.objectives);let s=await N(t,r,e.auth);return s.ok?{ok:!0,testId:f(s.body,"test_id")??e.testId,testcaseId:f(s.body,"testcase_id")??"",projectId:f(s.body,"project_id"),isTestCaseDeleted:typeof s.body?.is_test_case_deleted=="boolean"?s.body.is_test_case_deleted:void 0}:{ok:!1,...ot(s)}}function ot(e){let t=f(e.body,"error")??f(e.body,"code")??"",r=f(e.body,"message")??f(e.body,"detail")??e.text??`HTTP ${e.status}`,s;return e.status===0?s="network":e.status===401||e.status===403?s="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?s="base_mismatch":e.status===409&&t==="PlaygroundCommitLockMismatch"?s="lock_mismatch":e.status===409?s="expired":e.status===422?s="not_found":e.status>=500||e.status===408||e.status===429?s="network":s="other",{reason:s,httpStatus:e.status,message:r}}async function Mr(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={discard:!0,commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:"(discarded)",total_steps:1},s=await N(t,r,e.auth);return s.ok?{ok:!0}:{ok:!1,reason:f(s.body,"error")??"other",httpStatus:s.status,message:f(s.body,"message")??f(s.body,"detail")??s.text??`HTTP ${s.status}`}}async function N(e,t,r){let s=null;for(let o=1;o<=J;o++){let n=new AbortController,i=setTimeout(()=>n.abort(),rt);try{let a=await m(e,{method:"POST",headers:{Authorization:A(r.username,r.accessKey),"Content-Type":"application/json",Accept:"application/json"},...t!==void 0?{body:JSON.stringify(t)}:{},signal:n.signal});clearTimeout(i);let c=await a.text(),l=null;if(c)try{l=JSON.parse(c)}catch{}let g=a.status>=500||a.status===408||a.status===429;if(a.ok||!g)return{ok:a.ok,status:a.status,body:l,text:c};if(o<J){await _e(Se[o-1]??1e3);continue}return{ok:!1,status:a.status,body:l,text:c}}catch(a){if(clearTimeout(i),s=a,o<J){await _e(Se[o-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:s?.message??"exhausted retries"}}function _e(e){return new Promise(t=>setTimeout(t,e))}function f(e,t){if(typeof e!="object"||e===null)return;let r=e[t];return typeof r=="string"?r:void 0}import{readFileSync as Ee,writeFileSync as Ie,existsSync as ke}from"fs";function Re(e,t,r){if(r.forceAuthor)return"re-recorded from scratch";if(r.retryTriggered)return"re-recorded after retry";if(t.length>0&&t.every(i=>i.kind==="author"&&i.reason==="no-result-md"))return"initial recording";if(t.length>0&&t.every(i=>i.kind==="replay"))return r.wantsPush?"re-recorded (no source changes)":"no changes";let s=[];for(let i=0;i<t.length;i++){let a=t[i];if(!a||a.kind!=="author"||a.reason==="downstream-of-divergence"||a.reason==="no-result-md")continue;let c=nt(e,e.steps[i]);switch(a.reason){case"structure-mismatch":s.push(`added/removed: ${c}`);break;case"md5-mismatch":s.push(`modified: ${c}`);break;case"missing-recording":s.push(`re-recorded: ${c}`);break;case"recorded-failed":s.push(`re-authored after failure: ${c}`);break}}if(s.length===0)return"automated commit";let o=s.filter((i,a)=>a===0||s[a-1]!==i),n=o.slice(0,3).join("; ");return o.length>3?`${n}; +${o.length-3} more`:n}function nt(e,t){if(!t)return"unknown step";let r=t.trace[0]?.stepIndex;if(r==null)return"unknown step";let o=e.rootSteps[r-1]?.heading?.trim()??"";return t.trace.length>1?o?`imported step in "${o}"`:`imported step ${r}`:o||`step ${r}`}function it(e){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{ae({resolvedTest:e.resolvedTest,sessionDir:e.session.sessionDir,stepRunRecords:e.stepRunRecords,outcomes:e.outcomes,overallStatus:e.overallStatus,startedISO:e.startedISO??new Date().toISOString(),durationS:e.durationS??0,sessionId:e.session.sessionId,commitId:e.fromCommitId??"",tmsIds:e.tmsIds??{},codeExportDir:e.codeExportDir}),K(ne(e.sourcePath));let t=new Set;for(let r of e.resolvedTest.steps)if(r.trace.length>1){let s=ie(r.trace);if(t.has(s))continue;t.add(s),ke(`${s}.staging`)&&K(s)}}}function at(e){if(!(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions))return async()=>{let t=Re(e.resolvedTest,e.decisions,{wantsPush:e.wantsPush??!1,retryTriggered:e.retryTriggered??!1,forceAuthor:e.forceAuthor??!1}),r=e.resolvedTest.steps.map(o=>o.objective).filter(o=>typeof o=="string"&&o.length>0).slice(0,50),s=await Ce({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:e.testId,body:{commitId:e.newCommitId,fromCommitId:e.fromCommitId,commitMessage:t,totalSteps:e.resolvedTest.steps.length,timeTaken:Math.round(e.durationS??0),objectives:r},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(s.ok&&e.sourcePath){let o=V(e.sourcePath);try{let n=JSON.parse(Ee(o,"utf8"));n.commit_id=e.newCommitId,Ie(o,JSON.stringify(n,null,2)+`
|
|
6
|
-
`,"utf8")}catch(n){process.stderr.write(`warn: failed to update meta.json commit_id: ${n.message}
|
|
7
|
-
`)}}return s}}function ct(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=V(e.sourcePath);try{let s=ke(r)?JSON.parse(Ee(r,"utf8")):{};e.session.sessionId&&(s.commit_id=e.session.sessionId),t&&(s.testcase_id=t),e.tmsIds?.testId&&(s.test_id=e.tmsIds.testId),e.tmsIds?.projectId&&(s.project_id=e.tmsIds.projectId),e.tmsIds?.folderId&&(s.folder_id=e.tmsIds.folderId),e.tmsIds?.orgId&&(s.org_id=e.tmsIds.orgId),e.tmsIds?.sessionName&&(s.session_name=e.tmsIds.sessionName),Ie(r,JSON.stringify(s,null,2)+`
|
|
8
|
-
`,"utf8")}catch(s){process.stderr.write(`warn: failed to update meta.json after endTest: ${s.message}
|
|
9
|
-
`)}}}function Yr(e){let t=_(e.env),{session:r,auth:s}=e,o=s.basicAuth?{username:s.basicAuth.username,accessKey:s.basicAuth.access_key}:s.token,n=s.resolvedCreds?.username??s.basicAuth?.username??"",i=s.resolvedCreds?.access_key??s.basicAuth?.access_key??"",a=s.resolvedCreds?.org_id??0,c=s.resolvedCreds?.user_id??0,l=[];for(let y of Object.keys(r.auteurVariables))y.startsWith("secrets.user.")&&l.push({key_name:y.replace("secrets.user.",""),scope:"user"});let d=r.getContext().prior_runs.map(y=>y.status),p=r.auteurVariables,C=Object.keys(p).length>0;return{controllerBaseUrl:t.controllerBaseUrl,tmsBaseUrl:t.tmsBaseUrl,auth:o,authResolver:s.resolver,sessionId:r.sessionId,sessionDir:r.sessionDir,testId:r.testId,commitId:r.sessionId,projectId:e.projectId,folderId:e.folderId,firstObjective:r.firstObjective??"KaneAI Test",firstUrl:r.firstUrl??"",runDirs:r.getRunDirs(),runObjectives:r.getRunObjectives(),runMetadata:r.getRunMetadata(),startedAt:r.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:d,orgId:a,userId:c,tmsUsername:n,tmsAccessKey:i,screenshotBaseUrl:r.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:t.shareApiBaseUrl,variables:C?p:void 0,variableIds:e.variableIds,secrets:l,codeExport:e.codeExport,onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:it(e),onCommitLock:at(e),onFinalizeSuccess:ct(e)}}var xe=["python","javascript"];function lt(e){if(e!==void 0){if(!xe.includes(e))throw new Error(`--code-language must be one of: ${xe.join(", ")} (got "${e}")`);return e}}function Zr(e,t){let r=lt(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}async function rs(e){try{let r=await new P(e.tmsBaseUrl,e.auth.username,e.auth.access_key).createAtmTest({objective:e.objective.slice(0,100),creation_mode:"KANECLI",playground_disabled:e.hasCustomProfile,testURL:e.url,project_id:e.projectId,folder_id:e.folderId,authoring_version:4});return e.log("info","ATM_CREATE_OK","Test created",{test_id:r}),r}catch(t){return e.log("error","ATM_CREATE_FAILED","Test creation failed",{error:t instanceof Error?t.message:String(t)}),null}}import{mkdtempSync as wt,rmSync as St}from"fs";import{join as _t}from"path";import{tmpdir as Ct}from"os";import{spawn as Te,spawnSync as dt}from"child_process";import{existsSync as Q}from"fs";import{createConnection as ut}from"net";import{homedir as k,platform as T}from"os";import{join as x}from"path";var mt=new Set(["1","true","yes"]),U=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function ms(e){return e instanceof U?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var $={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",x(k(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",x(k(),"Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing"),"/Applications/Chromium.app/Contents/MacOS/Chromium"],linux:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/google-chrome-for-testing","/usr/local/bin/google-chrome-for-testing",x(k(),"chrome-for-testing/chrome-linux64/chrome"),"/usr/bin/chromium","/usr/bin/chromium-browser","/snap/bin/chromium"],win32:["C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",x(k(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",x(k(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe")]};function ft(){if(process.env.KANE_CLI_CHROME_PATH)return process.env.KANE_CLI_CHROME_PATH;let e=T(),t=$[e]??$.linux;for(let r of t)if(Q(r))return r;return e==="win32"?"chrome.exe":"google-chrome"}function gt(){if(process.env.KANE_CLI_CHROME_PATH)return Q(process.env.KANE_CLI_CHROME_PATH);let e=T();if(($[e]??$.linux).some(o=>Q(o)))return!0;let r=e==="win32"?"chrome.exe":"google-chrome",s=e==="win32"?"where":"which";try{return dt(s,[r],{stdio:"ignore"}).status===0}catch{return!1}}function pt(){let e=T();return e==="darwin"?["Google Chrome is required but was not found at any standard path.","","Install via Homebrew (recommended):"," brew install --cask google-chrome","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
|
|
10
|
-
`):e==="linux"?["Google Chrome is required but was not found at /usr/bin/google-chrome.","(amd64 / x86_64 only \u2014 Google does not ship Chrome for Linux ARM.)","","Debian / Ubuntu (any version):"," wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb"," sudo apt install -y ./google-chrome-stable_current_amd64.deb","","Fedora / RHEL / AlmaLinux / Rocky:"," sudo dnf install -y https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
|
|
11
|
-
`):e==="win32"?["Google Chrome is required but was not found in Program Files or AppData.","","Install via winget (Windows 10 1809+):"," winget install --id Google.Chrome -e --silent","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=C:\\path\\to\\chrome.exe","to point at a non-standard install."].join(`
|
|
12
|
-
`):["Google Chrome is required.","Install from https://www.google.com/chrome/","(Note: no official Chrome builds for BSD or Alpine/musl Linux.)"].join(`
|
|
13
|
-
`)}function ht(e){let t=T(),r=[`--remote-debugging-port=${e.port}`,`--user-data-dir=${e.userDataDir}`,`--window-size=${e.width},${e.height}`,"--no-first-run","--no-default-browser-check","--disable-blink-features=AutomationControlled","--disable-features=DownloadBubble,DownloadBubbleV2","--safebrowsing-disable-download-protection","--disable-popup-blocking","--disable-notifications","--disable-infobars","--disable-translate","--disable-prompt-on-repost","--disable-background-networking","--disable-client-side-phishing-detection","--disable-default-apps","--disable-hang-monitor","--disable-sync","--metrics-recording-only","--safebrowsing-disable-auto-update","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--test-type=webdriver","--allow-pre-commit-input","--enable-logging","--v=1"];return t==="linux"&&(r.push("--no-sandbox"),r.push("--disable-dev-shm-usage"),r.push("--password-store=basic")),t==="darwin"&&r.push("--use-mock-keychain"),e.headless&&r.push("--headless=new"),r}function yt(e){return new Promise(t=>{let r=ut({port:e,host:"127.0.0.1"});r.setTimeout(1e3),r.on("connect",()=>{r.destroy(),t(!0)}),r.on("timeout",()=>{r.destroy(),t(!1)}),r.on("error",()=>{r.destroy(),t(!1)})})}async function bt(){for(let e=B;e<=M;e++)if(!await yt(e))return e;throw new Error(`All CDP ports ${B}-${M} are in use. Close other Chrome instances.`)}async function vt(e,t=15e3){let r=Date.now(),s=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await m(s)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(o=>setTimeout(o,200))}throw new Error(`Chrome CDP not ready after ${t}ms on port ${e}`)}async function Ae(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&mt.has(t.toLowerCase()))&&!gt())throw re()?.log("error","CHROME_NOT_FOUND","Startup gate: Chrome unavailable at standard system paths",{platform:process.platform,kane_cli_chrome_path:process.env.KANE_CLI_CHROME_PATH??null,skip_browser_download:process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD??null}),new U(pt());let s=T(),o=await bt(),n=ft(),i=ht({port:o,...e});e.startUrl&&i.push(e.startUrl);let a=Te(n,i,{stdio:"ignore",detached:!0});a.unref();let c=await new Promise((l,g)=>{a.on("error",d=>{g(new Error(`Failed to launch Chrome: ${d.message}. Is Chrome installed at ${n}?`))}),a.on("close",d=>{d!==null&&d!==0&&g(new Error(`Chrome exited during startup with code ${d}`))}),vt(o).then(l,g)});return{process:a,port:o,cdpEndpoint:c,kill(){try{if(a.pid)if(s==="win32")Te("taskkill",["/pid",String(a.pid),"/T","/F"],{stdio:"ignore"});else try{process.kill(-a.pid,"SIGKILL")}catch{a.kill("SIGKILL")}else a.kill("SIGKILL")}catch{}}}}async function ws(e){if(e.cft)return{instance:null,tempDir:null};if(e.wsEndpoint)return{wsEndpoint:e.wsEndpoint,instance:null,tempDir:null};if(e.cdpEndpoint){let o=await m(`${e.cdpEndpoint}/json/version`);if(!o.ok)throw new Error(`CDP endpoint not reachable: ${e.cdpEndpoint} (${o.status})`);return{cdpEndpoint:e.cdpEndpoint,instance:null,tempDir:null}}let t,r=null;if(e.config.chrome_profile_path)t=e.config.chrome_profile_path.replace("~",process.env.HOME??"~");else{r=wt(_t(Ct(),"kane-clean-")),t=r;let o=r;se("tempDir",()=>{try{St(o,{recursive:!0,force:!0})}catch{}})}let s=await Ae({userDataDir:t,width:e.config.window_size.width,height:e.config.window_size.height,startUrl:e.startUrl,headless:e.headless});return{cdpEndpoint:s.cdpEndpoint,instance:s,tempDir:r}}var Rt="KaneAI Generated",Et="Untitled";async function Es(e){let t=e.config.load(),r=new P(_(e.env).tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key),s=e.projectName??Rt,o=e.folderName??Et,n=t.project_id??null,i=t.project_name??null;if(!n){let d=(await r.listProjects()).find(p=>p.name===s);if(d)n=d.project_id,i=d.name,e.log("info","ENSURE_PROJECT_FOUND","Found default project",{project_id:n,name:i});else{let p=await r.createProject(s);n=p.id,i=p.name,e.log("info","ENSURE_PROJECT_CREATED","Created default project",{project_id:n,name:i})}F(e.creds,e.config,e.profile,e.env,{projectId:n,projectName:i})}let a=t.folder_id??null,c=t.folder_name??null,l=!t.project_id;if(!a||l){let d=(await r.listFolders(n)).find(p=>p.name===o);if(d)a=d.id,c=d.name,e.log("info","ENSURE_FOLDER_FOUND","Found default folder",{folder_id:a,name:c});else{let p=await r.createFolder(n,o);a=p.id,c=p.name,e.log("info","ENSURE_FOLDER_CREATED","Created default folder",{folder_id:a,name:c})}F(e.creds,e.config,e.profile,e.env,{folderId:a,folderName:c})}return{projectId:n,projectName:i??s,folderId:a,folderName:c??o}}export{kt as a,xt as b,U as c,ms as d,Ae as e,Nt as f,Bt as g,Ft as h,Vt as i,Gt as j,Ze as k,fr as l,ge as m,O as n,D as o,Ar as p,Pr as q,Lr as r,Or as s,$r as t,Br as u,Mr as v,Yr as w,Zr as x,rs as y,ws as z,Es as A};
|
package/dist/chunk-WZCGEQ6M.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as P}from"./chunk-PQGNWC33.js";import{a as X}from"./chunk-HCBYKLMW.js";import{t as r}from"./chunk-5XTLIGWL.js";import{a,b as i,i as N}from"./chunk-C44QQJR4.js";import{a as G}from"./chunk-6YGTRKDT.js";import{e as D}from"./chunk-UR6MHSHU.js";var g=D(G(),1);var e=D(X(),1),f=5;function K(t,I){if(!I)return t;let c=I.toLowerCase();return t.filter(B=>B.label.toLowerCase().includes(c))}function J(t){let{title:I,items:c,loading:B=!1,loadingText:Y,error:y=null,itemNoun:T="items",onSelect:H,onCancel:R,defaultActiveId:L,onTab:w,extraHint:E}=t,[x,s]=(0,g.useState)(0),[S,u]=(0,g.useState)(0),[d,A]=(0,g.useState)(""),[p,h]=(0,g.useState)(null);(0,g.useEffect)(()=>{if(c.length===0)return;if(t.preserveSelectionById&&p!==null){let n=c.findIndex(o=>o.id===p);if(n>=0){u(Math.floor(n/f)),s(n%f);return}}let l=L?c.findIndex(n=>n.id===L):c.findIndex(n=>n.isActive);l>=0?(u(Math.floor(l/f)),s(l%f),t.preserveSelectionById&&h(c[l].id)):t.preserveSelectionById&&(u(0),s(0),h(c[0]?.id??null))},[c,L,t.preserveSelectionById,p]),(0,g.useEffect)(()=>{if(!t.onSearch)return;let l=setTimeout(()=>t.onSearch(d),t.searchDebounceMs??250);return()=>clearTimeout(l)},[d,t.onSearch,t.searchDebounceMs]);let m=t.onSearch?c:K(c,d),C=S*f,F=Math.min(C+f,m.length),M=Math.ceil(m.length/f),O=F-C,v=m.slice(C,F);return N((l,n)=>{if(y){n.escape&&R();return}if(n.escape){d?(A(""),s(0),u(0)):R();return}if(n.tab&&w){w();return}if(n.upArrow){if(x>0){let o=x-1;s(o),t.preserveSelectionById&&h(v[o]?.id??null)}else if(S>0){let o=S-1,b=f-1;u(o),s(b),t.preserveSelectionById&&h(m[o*f+b]?.id??null)}return}if(n.downArrow){if(x<O-1){let o=x+1;s(o),t.preserveSelectionById&&h(v[o]?.id??null)}else if(S<M-1){let o=S+1,b=0;u(o),s(b),t.preserveSelectionById&&h(m[o*f+b]?.id??null)}return}if(n.return&&v[x]){H(v[x]);return}if(n.backspace||n.delete){A(o=>o.slice(0,-1)),s(0),u(0);return}l&&!n.ctrl&&!n.meta&&(A(o=>o+l),s(0),u(0))},{isActive:!B}),B?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.primary,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:r.primary,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(i,{color:r.secondary,children:Y??`Loading ${T}\u2026`})})]}):y?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.statusFail,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:r.statusFail,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(i,{color:r.statusFail,children:y})}),(0,e.jsx)(P,{bindings:[]})]}):(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.primary,paddingX:2,paddingY:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(i,{color:r.primary,bold:!0,children:I}),(0,e.jsxs)(i,{color:r.dim,children:[" (",m.length,!t.onSearch&&d?`/${c.length}`:""," ",T,t.loadingMore?" \xB7 loading more":"",")"]})]}),(0,e.jsxs)(a,{marginTop:1,children:[(0,e.jsx)(i,{color:r.secondary,children:d?"filter: ":""}),d?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(i,{children:d}),(0,e.jsx)(i,{inverse:!0,children:" "})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)(i,{color:r.dim,children:["Search ",T,"\u2026"]}),(0,e.jsx)(i,{inverse:!0,children:" "})]})]}),(0,e.jsx)(a,{flexDirection:"column",marginTop:1,children:t.searching?(0,e.jsxs)(i,{color:r.secondary,children:["Searching ",T,"\u2026"]}):m.length===0?(0,e.jsxs)(i,{color:r.dim,children:["No ",T,' match "',d,'"']}):v.map((l,n)=>{let o=n===x,b=o?"\u276F ":" ",$=l.isActive?r.statusPass:o?r.primary:void 0;return(0,e.jsxs)(i,{color:$,children:[b,l.label,l.isActive?" \u25CF selected":""]},l.id)})}),!t.searching&&M>1&&(0,e.jsx)(a,{marginTop:1,children:(0,e.jsxs)(i,{color:r.dim,children:["Page ",S+1,"/",M]})}),t.footer&&(0,e.jsx)(a,{marginTop:1,flexDirection:"column",children:t.footer}),(0,e.jsx)(P,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"type",label:"to search"},{keys:"\u21B5",label:"select"},...w&&E?[{keys:"tab",label:E}]:[]],escBackLabel:d?"clear":"back to chat"})]})}export{J as a};
|
package/dist/chunk-X7VI7KK3.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{c as j,h as _}from"./chunk-AH4AXJML.js";import{a as x}from"./chunk-L5LI2JF4.js";import{mkdirSync as $,writeFileSync as ve}from"fs";import{join as S}from"path";import{createHash as W}from"crypto";function w(e){if(e==null)return null;if(Array.isArray(e))return e.map(w);if(typeof e=="object"){let t={};for(let n of Object.keys(e).sort()){let r=e[n];r!==void 0&&(t[n]=w(r))}return t}return e}function Y(e){if(e.body.kind!=="objective")throw new Error("stepMd5: only objective steps have an md5; @import rows do not");let t={...e.config??{},optional:e.optional??!1},n=JSON.stringify(w(t));return W("md5").update(e.body.text).update(`
|
|
3
|
-
`).update(n).digest("hex")}function R(e){return Y({index:e.trace[e.trace.length-1].stepIndex,heading:e.trace[e.trace.length-1].heading,body:{kind:"objective",text:e.objective},config:e.parsedConfig,headingLine:1,optional:e.optional})}import{writeFileSync as G,mkdirSync as J,readFileSync as q}from"fs";import{dirname as z,basename as O}from"path";function v(e){let t=e.outPath??j(e.sourcePath);J(z(t),{recursive:!0});let n=[];n.push("---"),n.push(`test: ../${O(e.sourcePath)}`),n.push(`status: ${e.overallStatus}`),n.push(`started: ${e.startedISO}`),n.push(`duration_s: ${e.durationS}`),n.push(`session_id: ${e.sessionId}`),n.push("---",""),n.push(`# ${e.title??O(e.sourcePath)} \u2014 Result`,"");for(let r=0;r<e.rootSteps.length;r++){let s=e.rootSteps[r],o=e.outcomes.find(i=>i.rootStepIndex===r+1);if(n.push(U(s,o)),s.body.kind==="objective"&&o?.stepMd5&&n.push(`md5: ${o.stepMd5}`),o?.status==="failed"&&o.reason&&n.push(`Reason: ${o.reason}`),o?.softFailures?.length)for(let i of o.softFailures){let d=i.reason?`: ${i.reason}`:"";n.push(`\u26A0 optional sub-step ${i.subStepIndex} failed${d}`)}s.body.kind==="objective"&&o?.status!=="skipped"&&n.push(s.body.text),n.push("")}return G(t,n.join(`
|
|
4
|
-
`),"utf8"),t}function U(e,t){if(!t)return`## ${e.heading} (no outcome)`;let n=t.duration_s!=null?`${t.duration_s}s`:"\u2014";if(t.status==="skipped")return`## ${e.heading} \u23ED skipped`;let r=t.softFailed?" (optional)":"";if(t.refKind&&t.status==="passed"){let s=t.helperResultRelPath?` \u2192 ${t.helperResultRelPath}`:"";return`## ${e.heading} \u2713 passed (via @${t.refKind} ${t.refLabel} \u2014 ${t.inlinedCount} inlined steps, ${n}${s})`}if(t.refKind&&t.status==="failed"){let s=t.failedSubStepIndex&&t.failedSubStepIndex.length>0?` \u2014 at sub-step ${t.failedSubStepIndex.join(" \u2192 sub-step ")}`:"",o=t.helperResultRelPath?` \u2192 ${t.helperResultRelPath}`:"";return`## ${e.heading} \u2717 failed${r} (via @${t.refKind} ${t.refLabel}${s}, ${n}${o})`}return t.status==="passed"?`## ${e.heading} \u2713 passed (${n})`:`## ${e.heading} \u2717 failed${r} (${n})`}var V=/^##\s+(.+?)\s+(✓ passed|✗ failed(?:\s+\(optional\))?|⏭ skipped)(?:\s+\((.*)\))?\s*$/,Q=/via\s+@\w+\s+(\S+).*?(?:→\s+(\S+))?\s*$/,X=/^md5:\s+([a-f0-9]{32})\s*$/;function Pe(e){let n=q(e,"utf8").split(`
|
|
5
|
-
`),r="passed";if(n[0]?.trim()==="---")for(let o=1;o<n.length&&n[o].trim()!=="---";o++){let i=/^status:\s+(passed|failed|interrupted)\s*$/.exec(n[o]);i&&(r=i[1])}let s=[];for(let o=0;o<n.length;o++){let i=V.exec(n[o]);if(!i)continue;let d=i[1],l=i[2],c=i[3]??"",p=l.startsWith("\u2713")?"passed":l.startsWith("\u23ED")?"skipped":"failed";if(/via\s+@/.test(c)){let g=Q.exec(c),a=g?.[1]??"",u=g?.[2]??null;s.push({kind:"import",heading:d,status:p,md5:null,importPath:a,helperResultRelPath:u})}else{let g=null;for(let a=o+1;a<n.length&&!/^##\s/.test(n[a]);a++){if(n[a].trim()==="")continue;let u=X.exec(n[a]);if(u){g=u[1];break}break}s.push({kind:"objective",heading:d,status:p,md5:g})}}return{overallStatus:r,steps:s}}import{copyFileSync as Z,existsSync as ee,mkdirSync as te,writeFileSync as se}from"fs";import{join as y}from"path";function D(e){for(let t=0;t<e.totalRunDirs;t++){let n=e.runIndex+t,r=y(e.sessionDir,"runs",String(n)),s=y(e.stagingStepDir,"flows",String(t));te(s,{recursive:!0});let o=[y(r,"run-test","actions.ndjson"),y(r,"actions.ndjson")],i=y(s,"actions.ndjson"),d=!1;for(let l of o)if(ee(l)){Z(l,i),d=!0;break}d||se(i,"")}}import{basename as ne,dirname as re,join as oe}from"path";function F(e){let t=ne(e);return t.endsWith("_test.md")?t.slice(0,-8):t.endsWith(".md")?t.slice(0,-3):t}function ie(e){if(e.length<2)throw new Error("helperOutputDirName requires trace length >= 2 (root + at least one helper)");let t=F(e[0].file),n=F(e[e.length-1].file),r=e.slice(0,-1).map(s=>String(s.stepIndex));return`helper-output-${n}-${t}-${r.join("-")}`}function b(e){if(e.length<2)throw new Error("helperOutputDirPath requires trace length >= 2");let t=e[e.length-1].file;return oe(re(t),ie(e))}import{existsSync as M,mkdirSync as ae,rmSync as le,cpSync as de}from"fs";function E(e,t){M(e)&&(M(t)&&le(t,{recursive:!0,force:!0}),ae(t,{recursive:!0}),de(e,t,{recursive:!0}))}import{readFileSync as Se}from"fs";import{join as ye,relative as be}from"path";var f=class extends Error{constructor(n,r,s){super(`[${r}${s!=null?`:${s}`:""}] ${n}`);this.file=r;this.line=s;this.name="TestMdParseError"}},pe=new Set(["username","access_key","oauth","profile","project_id","folder_id"]),L=new Set(["mode","max_steps","timeout","global_context","local_context","variables","session_context","code_export","code_language","target","chrome_profile","cdp_endpoint","ws_endpoint","headless","on_lock_conflict"]),k=new Set(["optional"]),ce=new Set(["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"]),ue=new Set(["mode","on_lock_conflict"]);function T(e,t){let n=t.split(`
|
|
6
|
-
`),{global:r,bodyStartLine:s}=fe(e,n),{title:o,steps:i}=ge(e,n,s);return{path:e,title:o,global:r,steps:i}}function fe(e,t){if(t[0]?.trim()!=="---")return{global:{},bodyStartLine:0};let n=-1;for(let o=1;o<t.length;o++)if(t[o].trim()==="---"){n=o;break}if(n===-1)throw new f("frontmatter is missing closing '---'",e,1);let r=t.slice(1,n).join(`
|
|
7
|
-
`),s;try{s=x(r)??{}}catch(o){throw new f(`invalid YAML in frontmatter: ${o.message}`,e,1)}if(C(e,s,"frontmatter",1),s.on_lock_conflict!==void 0){let o=s.on_lock_conflict;if(o!=="readonly"&&o!=="fail"&&o!=="wait")throw new f(`on_lock_conflict must be 'readonly' | 'fail' | 'wait', got: ${JSON.stringify(o)}`,e,1)}return B(e,s,1),{global:s,bodyStartLine:n+1}}function ge(e,t,n){let r,s=n;for(;s<t.length&&t[s].trim()==="";)s++;let o=s<t.length?/^#\s+(.+?)\s*$/.exec(t[s]):null;o&&(r=o[1],s++);let i=[];for(let l=s;l<t.length;l++)/^##\s/.test(t[l])&&i.push(l);let d=[];for(let l=0;l<i.length;l++){let c=i[l],p=i[l+1]??t.length,m=t[c].replace(/^##\s+/,"").trim(),g=t.slice(c+1,p),{config:a,body:u,optional:h}=me(e,c+1,g);d.push({index:l+1,heading:m,config:a,body:u,headingLine:c+1,optional:h})}return{title:r,steps:d}}function me(e,t,n){let r=0;for(;r<n.length&&n[r].trim()==="";)r++;let s,o=t;if(r<n.length&&/^```yaml\s*$/.test(n[r])){let a=r;o=t+a,r++;let u=-1;for(;r<n.length;){if(/^```\s*$/.test(n[r])){u=r;break}r++}if(u===-1)throw new f("step-config fenced ```yaml block is not closed",e,o);let h=n.slice(a+1,u).join(`
|
|
8
|
-
`);try{s=x(h)??{}}catch(I){throw new f(`invalid YAML in step config: ${I.message}`,e,o)}r=u+1}let i=he(n.slice(r)),d=i.filter(a=>a.trim()!=="");if(d.length>0&&/^@session\s+/.test(d[0].trim()))throw new f("@session is no longer supported (iteration 3); use @import instead",e,t);let l=/^@import\s+(\S.*)$/,p=i.filter(a=>l.test(a.trim())).length>0;if(p&&d.length!==1)throw new f("step body must be exactly one of prose / @import",e,t);let m=!1,g;if(s){if(C(e,s,p?"step config (ref)":"step config (objective)",o),p||B(e,s,o),typeof s.optional=="boolean")m=s.optional;else if(s.optional!==void 0)throw new f(`step config 'optional' must be boolean: got ${typeof s.optional}`,e,o);let a={...s};delete a.optional,Object.keys(a).length>0&&(g=a)}return p?{body:{kind:"import_ref",path:l.exec(d[0].trim())[1].trim()},optional:m}:{body:{kind:"objective",text:i.join(`
|
|
9
|
-
`).trim()},config:g,optional:m}}function he(e){let t=0,n=e.length;for(;t<n&&e[t].trim()==="";)t++;for(;n>t&&e[n-1].trim()==="";)n--;return e.slice(t,n)}function B(e,t,n){let r=t.variables;if(r==null)return;if(typeof r!="object"||Array.isArray(r))throw new f("variables must be an object map",e,n);let s={};for(let[o,i]of Object.entries(r))if(typeof i=="string")s[o]={value:i};else if(i&&typeof i=="object"&&!Array.isArray(i)&&typeof i.value=="string")s[o]=i;else throw new f(`variable '${o}' must be a string or { value: ... } object`,e,n);t.variables=s}function C(e,t,n,r){for(let s of Object.keys(t)){if(pe.has(s))throw new f(`auth/identity keys are CLI-only: ${s}`,e,r);if(n==="frontmatter"){if(k.has(s))throw new f(`step-only key in frontmatter: ${s}`,e,r);if(!L.has(s))throw new f(`unknown config key: ${s}`,e,r)}else if(n==="step config (objective)"){if(!L.has(s)&&!k.has(s))throw new f(`unknown config key: ${s}`,e,r);if(ce.has(s))throw new f(`chrome config is global-only: ${s}`,e,r);if(ue.has(s))throw new f(`'${s}' is run-level and cannot be set per-step`,e,r)}else if(!k.has(s))throw new f(`step config on @import may only contain 'optional': got ${s}`,e,r)}}function A(e){let t=Re(e.resolvedTest,e.runByStep),n=new Map;for(let r of t.values()){let s=n.get(r.helperFile);s||(s=T(r.helperFile,Se(r.helperFile,"utf8")),n.set(r.helperFile,s));let o=[],i=!1;for(let l of s.steps){let c=l.index,p=r.resolvedSteps.filter(a=>a.trace[r.helperDepth].stepIndex===c);if(p.length===0){o.push({rootStepIndex:c,status:"skipped"});continue}let m=p[0].trace[0].stepIndex,g=e.outcomes.find(a=>a.rootStepIndex===m);if(!g){o.push({rootStepIndex:c,status:"skipped"});continue}if(l.body.kind==="objective"){let a=p[0],u=K(a,g);u==="failed"&&(i=!0);let h={rootStepIndex:c,status:u};u==="passed"&&(h.stepMd5=R(a)),o.push(h)}else{let a=!1,u=!1;for(let N of p){let P=K(N,g);P!=="skipped"&&(u=!0),P==="failed"&&(a=!0)}let h=a?"failed":u?"passed":"skipped";h==="failed"&&(i=!0);let I=b(p[0].trace.slice(0,r.helperDepth+2)),H=be(r.finalDir,I);o.push({rootStepIndex:c,status:h,refKind:"import",refLabel:l.body.path,inlinedCount:p.length,helperResultRelPath:`${H}/Result.md`})}}let d=i?"failed":"passed";v({sourcePath:r.helperFile,title:s.title,rootSteps:s.steps,outcomes:o,overallStatus:d,startedISO:e.startedISO,durationS:0,sessionId:e.sessionId,outPath:ye(r.stagingDir,"Result.md")})}}function Re(e,t){let n=new Map;for(let r of e.steps)if(t.has(r.flatIndex))for(let s=1;s<r.trace.length;s++){let o=r.trace.slice(0,s+1),i=b(o),d=n.get(i);d||(d={stagingDir:`${i}.staging`,finalDir:i,helperFile:o[s].file,helperDepth:s,resolvedSteps:[]},n.set(i,d)),d.resolvedSteps.push(r)}return n}function K(e,t){if(t.status==="passed")return"passed";if(t.status==="skipped")return"skipped";let n=e.trace.slice(1).map(o=>o.stepIndex),r=t.failedSubStepIndex??[],s=Math.min(n.length,r.length);for(let o=0;o<s;o++)if(n[o]!==r[o])return n[o]<r[o]?"passed":"skipped";return n.length===r.length?"failed":n.length<r.length?"passed":"skipped"}function et(e){let t=_(e.resolvedTest.rootPath);$(S(t,".internal"),{recursive:!0});let n=new Map;for(let s of e.stepRunRecords)n.set(s.testmdStepIndex,s);for(let s of e.resolvedTest.steps){let o=n.get(s.flatIndex);if(!o)continue;let i=s.trace[s.trace.length-1].stepIndex,d=R(s),l=d.slice(0,8),c;if(s.trace.length===1)c=S(t,".internal","steps",`${i}-${l}`);else{let p=`${b(s.trace)}.staging`;$(S(p,".internal"),{recursive:!0}),c=S(p,".internal","steps",`${i}-${l}`)}if($(c,{recursive:!0}),D({sessionDir:e.sessionDir,runIndex:o.runIndex,totalRunDirs:o.totalRunDirs,stagingStepDir:c}),s.trace.length===1){let p=s.trace[0].stepIndex,m=e.outcomes.find(g=>g.rootStepIndex===p);m&&m.stepMd5==null&&(m.stepMd5=d)}}A({resolvedTest:e.resolvedTest,outcomes:e.outcomes,startedISO:e.startedISO,sessionId:e.sessionId,runByStep:n}),v({sourcePath:e.resolvedTest.rootPath,title:e.resolvedTest.rootTitle,rootSteps:e.resolvedTest.rootSteps,outcomes:e.outcomes,overallStatus:e.overallStatus,startedISO:e.startedISO,durationS:e.durationS,sessionId:e.sessionId,outPath:S(t,"Result.md")});let r={};if(e.commitId&&(r.commit_id=e.commitId),e.tmsIds.testId&&(r.test_id=e.tmsIds.testId),e.tmsIds.testcaseId&&(r.testcase_id=e.tmsIds.testcaseId),e.tmsIds.projectId&&(r.project_id=e.tmsIds.projectId),e.tmsIds.folderId&&(r.folder_id=e.tmsIds.folderId),e.tmsIds.orgId&&(r.org_id=e.tmsIds.orgId),e.tmsIds.sessionName&&(r.session_name=e.tmsIds.sessionName),ve(S(t,".internal","meta.json"),JSON.stringify(r,null,2)+`
|
|
10
|
-
`,"utf8"),e.codeExportDir){let s=e.codeExportLanguage??"python",o=S(t,`playwright-${s}-code`);try{E(e.codeExportDir,o)}catch(i){process.stderr.write(`warn: codegen copy failed: ${i.message}
|
|
11
|
-
`)}}}export{R as a,v as b,Pe as c,b as d,E as e,T as f,et as g};
|
package/dist/chunk-YX3YFXT5.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as A}from"./chunk-YCCUBQY4.js";import{a as _}from"./chunk-WZCGEQ6M.js";import{a as B}from"./chunk-JHNEE2MB.js";import{a as R}from"./chunk-PQGNWC33.js";import{a as P}from"./chunk-HCBYKLMW.js";import{t as c}from"./chunk-5XTLIGWL.js";import{a as u,b as l}from"./chunk-C44QQJR4.js";import{a as J}from"./chunk-6YGTRKDT.js";import{a as k}from"./chunk-7CLUJYMW.js";import{e as L}from"./chunk-UR6MHSHU.js";var t=L(J(),1);var e=L(P(),1);function X(n,s,y,m){return{id:n,label:`${s} (${n}) \xB7 ${y} tests`,isActive:n===m}}function W({resolver:n,projectId:s,currentFolderId:y,env:m,onSelect:x,onCancel:w}){let[I,M]=(0,t.useState)([]),[$,d]=(0,t.useState)(!0),[O,g]=(0,t.useState)(!1),[U,N]=(0,t.useState)(null),[p,b]=(0,t.useState)("list"),[S,v]=(0,t.useState)(""),[E,f]=(0,t.useState)(null),h=(0,t.useRef)(!1);(0,t.useEffect)(()=>{if(!n){N("Login first to browse folders"),d(!1);return}let o=new AbortController;return d(!0),g(!0),(async()=>{try{let r=n.cached??await n.resolve();if(!r){N("Login first to browse folders"),d(!1),g(!1);return}let a=B(m),T=new k(a.tmsBaseUrl,r.username,r.access_key),F=(async function*(){if(o.signal.aborted)return;let i=await T.listFolders(s);yield{page:1,folders:i,totalLoaded:i.length,done:!0}})();for await(let i of F){if(d(!1),i.totalLoaded===0){h.current=!0,b("naming"),g(!1);return}M(i.folders.map(C=>X(C.id,C.name,C.test_cases_count,y))),i.done&&g(!1)}}catch(r){if(r?.name==="AbortError")return;N(r instanceof Error?r.message:String(r)),d(!1),g(!1)}})(),()=>o.abort()},[n,s,y,m]);let D=(0,t.useCallback)(o=>{let r=o.trim();if(!r){f("Name cannot be empty");return}if(!s){f("No project selected \u2014 pick a project first");return}f(null),b("creating"),(async()=>{try{if(!n)throw new Error("Not authenticated");let a=n.cached??await n.resolve();if(!a)throw new Error("Not authenticated");let T=B(m),i=await new k(T.tmsBaseUrl,a.username,a.access_key).createFolder(s,r);x(i.id,i.name)}catch(a){f(a instanceof Error?a.message:String(a)),b("naming")}})()},[n,s,m,x]),H=(0,t.useCallback)(()=>{v(""),f(null),h.current?w():b("list")},[w]);return p==="naming"||p==="creating"?(0,e.jsxs)(u,{flexDirection:"column",borderStyle:"round",borderColor:c.primary,paddingX:2,paddingY:1,children:[(0,e.jsx)(l,{color:c.primary,bold:!0,children:"Create new folder"}),h.current&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.dim,children:"No folders yet \u2014 let's create one."})}),(0,e.jsxs)(u,{marginTop:1,children:[(0,e.jsx)(l,{color:c.dim,children:"Name: "}),p==="naming"?(0,e.jsx)(A,{value:S,onChange:o=>{v(o),E&&f(null)},onSubmit:D,onCancel:H}):(0,e.jsx)(l,{children:S})]}),E&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.red,children:E})}),p==="creating"&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.dim,children:"Creating..."})}),p==="naming"&&(0,e.jsx)(R,{bindings:[{keys:"\u21B5",label:"create"}],escBackLabel:h.current?"cancel":"back"})]}):(0,e.jsx)(_,{title:"Folders",items:I,loading:$,loadingMore:O,preserveSelectionById:!0,error:U,itemNoun:"folders",onTab:()=>{h.current=!1,b("naming")},extraHint:"tab to create new",onSelect:o=>{let r=o.label.split(" (")[0];x(o.id,r)},onCancel:w})}export{X as a,W as b};
|
package/dist/chunk-ZAUHYR76.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
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-5XTLIGWL.js";import{a as u,b as a,j as g}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as f}from"./chunk-UR6MHSHU.js";var T=f(b(),1);function k(n,t){if(!t)return n;let l=n.trim()||t;return`\x1B]8;;${t}\x07${l}\x1B]8;;\x07`}var r=f(x(),1);function $({shareableLink:n,testCaseLink:t,codeExportDir:l,recordedTestPath:s,outputDir:o,autoExit:p=!0}){let{exit:c}=g();(0,T.useEffect)(()=>{if(!p)return;let i=setTimeout(()=>c(),100);return()=>clearTimeout(i)},[c,p]);let e=[];return s&&e.push({label:"Test",url:s,linkUrl:`file://${s}`}),o&&e.push({label:"Output",url:o,linkUrl:`file://${o}`}),n&&e.push({label:"ShareLink",url:n}),t&&e.push({label:"TestCase",url:t}),l&&!o&&e.push({label:"CodeExport",url:l,linkUrl:`file://${l}`}),e.length===0?(0,r.jsx)(r.Fragment,{}):(0,r.jsx)(u,{flexDirection:"column",marginTop:1,marginLeft:1,children:e.map(i=>(0,r.jsxs)(u,{flexDirection:"column",marginBottom:1,children:[(0,r.jsxs)(a,{color:m.primary,children:[i.label,":"]}),(0,r.jsx)(a,{color:m.dim,children:k(i.url,i.linkUrl??i.url)})]},i.label))})}export{$ as a};
|
package/dist/chunk-ZY4BZQHD.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as B}from"./chunk-S3DAAAE5.js";import{a as h}from"./chunk-MJQ2EHSC.js";import{a as w}from"./chunk-HCBYKLMW.js";import{t as s}from"./chunk-5XTLIGWL.js";import{a as x,b as t,c as g,i as P,j as S}from"./chunk-C44QQJR4.js";import{a as C}from"./chunk-6YGTRKDT.js";import{e as T}from"./chunk-UR6MHSHU.js";var o=T(C(),1);var e=T(w(),1);function D({defaultName:i,onSubmit:c}){let[d,p]=(0,o.useState)("confirm"),[m,a]=(0,o.useState)(""),[f,u]=(0,o.useState)(null),l=(0,o.useMemo)(()=>m.trim()||i,[m,i]);return P((n,r)=>{if(d==="confirm"){if(n==="y"||n==="Y"){a(i),p("name");return}if(n==="n"||n==="N"||r.escape||r.ctrl&&n==="c"){c(null);return}if(r.return){c(i);return}return}if(r.return){if(!B(l)){u(`name "${l}" is invalid; allowed: letters, digits, underscore, hyphen`);return}c(l);return}if(r.escape||r.ctrl&&n==="c"){c(null);return}if(r.backspace||r.delete){a(v=>v.slice(0,-1)),u(null);return}n&&!r.ctrl&&!r.meta&&(a(v=>v+n),u(null))}),d==="confirm"?(0,e.jsx)(h,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsx)(t,{color:s.cyan,children:i})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[(0,e.jsx)(t,{color:s.dimmed,children:"enter \u2014 save with this name"}),(0,e.jsx)(t,{color:s.dimmed,children:"Y \u2014 edit name"}),(0,e.jsx)(t,{color:s.dimmed,children:"N/esc \u2014 discard session"})]})}):(0,e.jsx)(h,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsxs)(x,{children:[(0,e.jsx)(t,{color:s.cyan,children:m}),(0,e.jsx)(t,{inverse:!0,children:" "})]})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[f&&(0,e.jsx)(t,{color:s.red,children:f}),(0,e.jsx)(t,{color:s.dimmed,children:"enter \u2014 save \xB7 esc \u2014 discard"})]})})}function V(){return new Date().toISOString().slice(0,19).replace(/:/g,"-")}async function Y(i){return new Promise(c=>{function d(){let{exit:a}=S(),[f,u]=(0,o.useState)(!1);return(0,o.useEffect)(()=>{if(f){let l=setTimeout(()=>a(),50);return()=>clearTimeout(l)}},[f,a]),(0,e.jsx)(D,{defaultName:i,onSubmit:l=>{c(l),u(!0)}})}let{waitUntilExit:p,unmount:m}=g((0,e.jsx)(d,{}),{stdout:process.stderr,exitOnCtrlC:!1});p().then(()=>{try{m()}catch{}})})}export{D as a,V as b,Y as c};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a}from"./chunk-QKM3RHSQ.js";import"./chunk-KX7K3Y7R.js";import"./chunk-JHNEE2MB.js";import"./chunk-5XTLIGWL.js";import"./chunk-RZ4F3BHX.js";import"./chunk-UR6MHSHU.js";export{a as LoginFlow};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as h}from"./chunk-OQZG3V6B.js";import{g as S}from"./chunk-X7VI7KK3.js";import{a as m,b as I,j as _}from"./chunk-AH4AXJML.js";import"./chunk-L5LI2JF4.js";import{a as f}from"./chunk-KMTNMUVS.js";import"./chunk-5XTLIGWL.js";import"./chunk-UR6MHSHU.js";function y(e,d={}){e.flushRecorder();let o=e.recorder?.lastWrittenPath??null;if(!o)return e.log("info","PERSIST_SKIPPED","No recorded path \u2014 recorder.flush no-op",{reason:e.sessionName?"recorder_flush_failed":"no_session_name",session_name:e.sessionName}),null;let p;try{p=h(o)}catch(t){throw e.log("error","PERSIST_RESOLVE_FAILED","resolveTestMd threw",{error:t.message,recorded_path:o}),t}let i=e.getRunsAsStepRecords(),u=e.getFlows(),a=[],c=0;for(let t=0;t<i.length;t++){let r=i[t],l=u.slice(c,c+r.totalRunDirs);c+=r.totalRunDirs;let g=l.find(n=>n.status==="failed"||n.status==="error"),R=g?"failed":l.length===0?"skipped":"passed";a.push({rootStepIndex:t+1,status:R,duration_s:l.reduce((n,D)=>n+(D.duration??0),0),reason:g?.reason})}let P=a.some(t=>t.status==="failed")?"failed":"passed",E=new f().load().code_export?.language==="javascript"?"javascript":"python",s=I(o);e.log("info","PERSIST_START","Building staging dir",{recorded_path:o,output_dir:s,session_dir:e.sessionDir,step_count:i.length,flow_count:u.length});try{S({resolvedTest:p,sessionDir:e.sessionDir,stepRunRecords:i,outcomes:a,overallStatus:P,startedISO:e.startedAt,durationS:a.reduce((t,r)=>t+(r.duration_s??0),0),sessionId:e.sessionId,commitId:e.sessionId,tmsIds:{testId:e.testId??void 0,testcaseId:d.testcaseId,projectId:d.projectId,folderId:d.folderId,orgId:d.orgId??e.orgId??void 0,sessionName:e.sessionName??m(o)},codeExportDir:d.codeExportDir,codeExportLanguage:E}),e.log("info","PERSIST_STAGING_OK","Staging dir built",{output_dir:s}),_(s),e.log("info","PERSIST_OK","Persist complete",{output_dir:s})}catch(t){let r=t;e.log("error","PERSIST_FAILED","staging build / atomic replace failed",{error:r.message,stack:r.stack,output_dir:s}),process.stderr.write(`[persist] staging build / atomic replace failed: ${r.message}
|
|
3
|
-
`)}return{recordedTestPath:o,outputDir:s}}export{y as persistRecordedSession};
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as qt}from"./chunk-LYSEA5FB.js";import{a as Nt}from"./chunk-OQZG3V6B.js";import{a as de,b as zt}from"./chunk-C5UNZ6ZY.js";import{A as Bt,a as ft,b as mt,f as bt,g as Me,h as $e,i as yt,j as St,k as vt,m as Re,n as It,o as kt,p as _t,q as Ct,r as At,s as Et,t as Ke,u as Tt,v as jt,w as Dt,x as Lt,y as Ut,z as $t}from"./chunk-VS5FTXRZ.js";import{b as Ge,c as Mt,d as Vt}from"./chunk-2SXNPFGD.js";import{c as wt}from"./chunk-S3DAAAE5.js";import{a as Ft,b as Be,c as qe,d as ze,e as He}from"./chunk-X7VI7KK3.js";import{a as ye,b as xt,c as Pt,e as Se,f as Ve,i as Ot}from"./chunk-AH4AXJML.js";import{a as pt}from"./chunk-BDC7IOXP.js";import"./chunk-L5LI2JF4.js";import{a as ht}from"./chunk-KMTNMUVS.js";import{b as Ne}from"./chunk-74MJWDIW.js";import{a as gt,c as Ue,d as Q,e as J}from"./chunk-G7VF5SDK.js";import"./chunk-VE3SUJMA.js";import{a as ut}from"./chunk-KX7K3Y7R.js";import{a as ne}from"./chunk-JHNEE2MB.js";import"./chunk-BPF7TDRU.js";import{a as Rt}from"./chunk-VUIXILBR.js";import"./chunk-MDBXYXSC.js";import"./chunk-WAOCHXJ5.js";import"./chunk-E47GFYXA.js";import{c as Le,h as re}from"./chunk-5XTLIGWL.js";import"./chunk-7CLUJYMW.js";import"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-UR6MHSHU.js";import{resolve as Ar,join as ke,basename as Er}from"path";import{existsSync as Xe,readFileSync as xr}from"fs";import{existsSync as Ye}from"fs";import{join as we,basename as Ht}from"path";function Kt(e,t){if(!t||!Ye(t))return e.steps.map(()=>({kind:"author",reason:"no-result-md"}));let r=qe(t),o=[],s=new Set,d=new Map;function i(a){let S=ze(a),_=we(S,"Result.md");if(d.has(_))return d.get(_);let I=Ye(_)?qe(_):null;return d.set(_,I),I}function R(a){for(let S=1;S<a.trace.length;S++){let I=a.trace[S-1].file===e.rootPath?r:i(a.trace.slice(0,S));if(!I)return{kind:"author",reason:"no-result-md"};let F=a.trace[S-1].stepIndex,f=I.steps[F-1];if(!f)return{kind:"author",reason:"no-result-md"};if(f.kind!=="import")return{kind:"author",reason:"structure-mismatch"};let C=Ht(f.importPath),w=Ht(a.trace[S].file);if(C!==w)return{kind:"author",reason:"structure-mismatch"};if(f.status!=="passed")return{kind:"author",reason:"recorded-failed"}}return null}for(let a of e.steps){let S=a.trace[a.trace.length-1].file,_=a.trace[a.trace.length-1].stepIndex,I=s.has(S);for(let w=0;w<a.trace.length-1&&!I;w++)s.has(a.trace[w].file)&&(I=!0);if(I){o.push({kind:"author",reason:"downstream-of-divergence"});continue}let F=R(a);if(F){o.push(F);for(let w=0;w<a.trace.length;w++)s.add(a.trace[w].file);continue}let f=S===e.rootPath?r:i(a.trace),C=wr(a,f,_);if(o.push(C),C.kind==="author"){s.add(S);for(let w=0;w<a.trace.length-1;w++)s.add(a.trace[w].file)}}return o}function wr(e,t,r){if(!t)return{kind:"author",reason:"no-result-md"};let o=t.steps[r-1];if(!o)return{kind:"author",reason:"no-result-md"};if(o.kind!=="objective")return{kind:"author",reason:"structure-mismatch"};if(o.status!=="passed")return{kind:"author",reason:"recorded-failed"};let s=Ft(e);if(s!==o.md5)return{kind:"author",reason:"md5-mismatch"};let d=e.trace.length===1?Ot(e.trace[0].file,r,s.slice(0,8)):we(ze(e.trace),".internal","steps",`${r}-${s.slice(0,8)}`),i=we(d,"flows","0","actions.ndjson");return Ye(i)?{kind:"replay",recordingDir:d}:{kind:"author",reason:"missing-recording"}}function Gt(e){return e.some(t=>t.kind==="author")}function ve(e){for(let t=0;t<e.length;t++)if(e[t].kind==="author")return t;return e.length}function Yt(e){return we(e.recordingDir,"flows","0","actions.ndjson")}function Wt(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let o=e.steps[r],s=t[r],d=" ".repeat(o.trace.length-1),i=`step ${o.flatIndex}`;s.kind==="replay"?process.stderr.write(`[replay-trace] ${d}${i}: REPLAY (would skip; v1 always authors)
|
|
3
|
-
`):process.stderr.write(`[replay-trace] ${d}${i}: AUTHOR (${s.reason})
|
|
4
|
-
`)}}function se(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function Zt(e,t){let r=e===0?"(none)":`0..${e-1}`,o=e>=t?"(none)":`${e}..${t-1}`;se(`[replay-trace] phase: replay ${r}, author ${o}
|
|
5
|
-
`)}function Qt(e,t){se(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
|
|
6
|
-
`)}function Jt(e,t,r){se(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
|
|
7
|
-
`)}function Xt(e,t){se(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
|
|
8
|
-
`)}function er(){se(`[replay-trace] force-author (--author) \u2014 walker bypassed
|
|
9
|
-
`)}function tr(e){se(`[replay-trace] cancelled at step ${e}
|
|
10
|
-
`)}import{join as vr}from"path";function We(e){let t={objective:e.step.objective,model:"v16-alpha",width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,stream:!0,mode:"replay",replay:{recording_path:Yt(e.decision),step_label:e.step.objective},screenshot_dir:vr(e.sessionDir,"runs",String(e.runIndex)),run_id:"run",test_id:"test"};return e.forceNavigateUrl&&(t.url=e.forceNavigateUrl),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.sessionContext&&(t.session_context=e.sessionContext),t}async function rr(e){let t=ve(e.decisions),r=0,o=!1;for(;;){let s=e.session.snapshot(),d=e.accumulator.snapshot(),i=await e.runReplayPhase(t);if(i.cancelled)return o=!0,tr(i.failedAt??0),{authorBoundary:t,cancelledInPhase:o,shrinkCount:r};if(i.failedAt===null)return{authorBoundary:t,cancelledInPhase:o,shrinkCount:r};let R=zt({failedAt:i.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(R.kind==="fail")return{authorBoundary:-1,cancelledInPhase:o,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:o,shrinkCount:r};if(e.session.rollback(s),e.accumulator.rollback(d),R.kind==="complete-reauthor")return Xt(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:o,shrinkCount:r};r++,Jt(r,de.maxShrinks,R.newAuthorBoundary),t=R.newAuthorBoundary}}var Ir=60*1e3,nr="lock-heartbeat",oe=null;function Ze(e){oe===null&&(oe=setInterval(async()=>{let t=await Tt({baseUrl:e.baseUrl,testId:e.testId,auth:e.auth});if(!t.ok){let r=t.expired?"session expired":t.message;process.stderr.write(`[lock] heartbeat failed: ${r}; continuing run
|
|
11
|
-
`)}},Ir),Q(nr,()=>{oe!==null&&(clearInterval(oe),oe=null)}))}function Qe(){oe!==null&&J(nr,"stopped")}var Ie=class{constructor(t){this.resolved=t;this.outcomes=t.rootSteps.map(r=>({rootStepIndex:r.index,status:"skipped"}))}outcomes;skipRoot=null;overallHalted=!1;shouldRunFlatStep(t){if(this.overallHalted)return!1;let r=t.trace[0].stepIndex;return!(this.skipRoot!==null&&r===this.skipRoot)}recordStep(t,r){let o=t.trace[0].stepIndex,s=this.outcomes.find(a=>a.rootStepIndex===o),d=this.resolved.rootSteps.find(a=>a.index===o),i=d.body.kind!=="objective";return i&&(s.refKind="import",s.refLabel=d.body.path,s.inlinedCount=(s.inlinedCount??0)+1,s.duration_s=(s.duration_s??0)+r.duration_s),r.status==="passed"?(i?s.status!=="failed"&&(s.status="passed"):(s.status="passed",s.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(s.softFailures=s.softFailures??[],s.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(s.status="failed",s.duration_s=i?s.duration_s:r.duration_s,s.failedSubStepIndex=i?t.trace.slice(1).map(a=>a.stepIndex):void 0,s.reason=r.reason,this.skipRoot=o,d.optional??!1?(s.softFailed=!0,{continueOverall:!0}):(this.overallHalted=!0,{continueOverall:!1}))}snapshotOutcomes(){return[...this.outcomes]}snapshot(){return{outcomes:this.outcomes.map(t=>({...t,softFailures:t.softFailures?[...t.softFailures]:void 0})),skipRoot:this.skipRoot,overallHalted:this.overallHalted}}rollback(t){this.outcomes=t.outcomes.map(r=>({...r,softFailures:r.softFailures?[...r.softFailures]:void 0})),this.skipRoot=t.skipRoot,this.overallHalted=t.overallHalted}finalize(){let t=this.outcomes.some(o=>o.status==="failed"&&!o.softFailed)?"failed":"passed",r=this.outcomes.reduce((o,s)=>o+(s.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};import{writeFileSync as kr,mkdirSync as _r}from"fs";import{dirname as sr}from"path";function Je(e){let t=Se(e.sourcePath);try{_r(sr(t),{recursive:!0})}catch(o){return process.stderr.write(`
|
|
12
|
-
\u26A0 Failed to create output directory.
|
|
13
|
-
${o.message}
|
|
14
|
-
Path: ${sr(t)}
|
|
15
|
-
|
|
16
|
-
`),t}let r={commit_id:e.commitId};e.testId!==void 0&&(r.test_id=e.testId),e.testcaseId!==void 0&&(r.testcase_id=e.testcaseId),e.projectId!==void 0&&(r.project_id=e.projectId),e.folderId!==void 0&&(r.folder_id=e.folderId),e.orgId!==void 0&&(r.org_id=e.orgId),e.sessionName!==void 0&&(r.session_name=e.sessionName);try{kr(t,JSON.stringify(r,null,2)+`
|
|
17
|
-
`,"utf8")}catch(o){process.stderr.write(`
|
|
18
|
-
\u26A0 Failed to write meta.json.
|
|
19
|
-
${o.message}
|
|
20
|
-
Path: ${t}
|
|
21
|
-
|
|
22
|
-
`)}return t}var Cr=()=>{};async function or(e,t,r){let o=t.log??Cr,s=e.session.testId??null,d=null,i=null,R=null;if(!r.localMode&&t.performUpload)try{d=await t.performUpload(),d?.success&&(d.testId&&(s=d.testId),d.testcaseId&&e.session.setTestcaseId(d.testcaseId))}catch(a){o("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(a)})}if(t.renderFeedbackPrompt)try{i=await t.renderFeedbackPrompt(),i&&s&&t.submitFeedback&&t.submitFeedback(s,i).catch(a=>{o("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(a)})})}catch(a){o("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(a)})}if(e.session.flushRecorder(),r.skipLocalWrites)o("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{R=Be({sourcePath:r.sourcePath,title:r.title,rootSteps:r.rootSteps,outcomes:r.outcomes,overallStatus:r.overallStatus,startedISO:r.startedISO,durationS:r.durationS,sessionId:e.session.sessionId})}catch(a){o("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(a)})}try{Je({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,orgId:e.session.orgId??void 0,sessionName:e.session.sessionName??ye(r.sourcePath)})}catch(a){o("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(a)})}if(d?.codeExportDir)try{let a=e.tuiConfig.code_export?.language??"python";He(d.codeExportDir,Ve(r.sourcePath,"playwright",a))}catch(a){o("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(a)})}}else if(e.session.recorder?.lastWrittenPath){let a=e.session.recorder.lastWrittenPath,S=e.session.getFlows(),_=S.map((f,C)=>({index:C+1,heading:`Step ${C+1}`,headingLine:0,body:{kind:"objective",text:f.objective}})),I=S.map((f,C)=>({rootStepIndex:C+1,status:f.status==="passed"?"passed":f.status==="failed"?"failed":"skipped",duration_s:f.duration,reason:f.reason})),F=I.some(f=>f.status==="failed")?"failed":"passed";try{R=Be({sourcePath:a,title:e.session.sessionName??"Session",rootSteps:_,outcomes:I,overallStatus:F,startedISO:e.session.startedAt,durationS:I.reduce((f,C)=>f+(C.duration_s??0),0),sessionId:e.session.sessionId})}catch(f){o("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(f)})}try{Je({sourcePath:a,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0})}catch(f){o("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(f)})}if(d?.codeExportDir)try{let f=e.tuiConfig.code_export?.language??"python";He(d.codeExportDir,Ve(a,"playwright",f))}catch(f){o("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(f)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${a} (renamed: ${e.session.sessionName}_test.md already existed)
|
|
23
|
-
`)}try{t.runCleanup?.()}catch(a){o("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(a)})}try{await e.session.finish("complete")}catch(a){o("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(a)})}return{uploadResult:d,feedbackChoice:i,resultMdPath:R}}var _e=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function ns(e,t){let r=Ar(e);if(!Xe(r))return process.stderr.write(`error: file not found: ${r}
|
|
24
|
-
`),2;qt(r);let o=!process.stdin.isTTY||!!t.agent,s=!1,d=o?n=>process.stdout.write(JSON.stringify(n)+`
|
|
25
|
-
`):n=>{},i;try{i=Nt(r)}catch(n){return process.stderr.write(`error: ${n.message}
|
|
26
|
-
`),2}if(i.steps.length===0)return process.stderr.write(`info: no steps in ${r}; nothing to run.
|
|
27
|
-
`),0;let R=Pr(t),a=new ut,S=new ht,_=!!(t.username&&t.accessKey);await Vt({isInteractive:!!process.stdin.isTTY&&!t.agent&&!_,creds:a,config:S});let I=a.getActiveProfile()??"default",f=t.env??void 0??a.getDefaultEnv()??"prod",C=ne(f),w="v16-alpha",p;try{p=await Mt({creds:a,env:f,usernameFlag:t.username,accessKeyFlag:t.accessKey,log:()=>{}})}catch(n){return n instanceof Ge&&n.code==="not_authenticated"?process.stderr.write(`error: Not authenticated. Choose one:
|
|
28
|
-
\u2022 Pass credentials inline: --username <user> --access-key <key>
|
|
29
|
-
\u2022 Run 'kane-cli login --oauth' (browser-based)
|
|
30
|
-
\u2022 Run 'kane-cli login --username <user> --access-key <key>'
|
|
31
|
-
`):n instanceof Ge&&n.code==="refresh_failed"?process.stderr.write(`error: Token refresh failed. Run 'kane-cli login' to re-authenticate.
|
|
32
|
-
`):process.stderr.write(`error: auth resolution failed: ${n.message}
|
|
33
|
-
`),2}let U=String(p.resolvedCreds?.org_id??"");if(!U)return process.stderr.write("error: TMS did not return an org_id. Run `kane-cli login` again.\n"),2;{let{readMetaIfExists:n,assertOrgMatchOrExit:c}=await import("./testmd-actions-O4NTH2OR.js"),u=c(n(r),U);if(u!==null)return u}let l=new pt,g=await jr(r,i,t,{resolvedAuth:p,tmsBaseUrl:C.tmsBaseUrl},l.sessionId);if(g.abort)return g.abort.exitCode;let x=g.lockAcquired,B=!1,P=!1,ue=!1;x&&d({type:"test_md_lock_state",phase:"acquired",scope:"preemptive"}),l.start({model:w,environment:f,profile:I}),l.setRecordingEnabled(!1);let pe=0,et=p.basicAuth?{username:p.basicAuth.username,accessKey:p.basicAuth.access_key}:p.token??null,fe=null;if(et!==null){let n=await vt({env:f,tmsCreds:p.resolvedCreds??null,resolver:p.resolver,auth:et,getToken:async()=>p.token??null,session:l,log:(c,u,m,h)=>l.log(c,u,m,h),skipScreenshotQueue:!!t.local||!p.basicAuth});fe=n.screenshotQueue,n.remoteLogger&&(Q("remote-logger",()=>n.remoteLogger.shutdownSync()),gt(n.remoteLogger))}if(t.name){try{wt(t.name)}catch(n){return process.stderr.write(`error: ${n.message}
|
|
34
|
-
`),2}l.setSessionName(t.name)}let Ee={};for(let[n,c]of Object.entries(i.rootGlobal))_e.includes(n)||(Ee[n]=c);for(let[n,c]of Object.entries(R))_e.includes(n)||c!==void 0&&(Ee[n]=c);let q={...i.chrome};for(let n of _e){let c=R[n];c!==void 0&&(q[n]=c)}let lr={...Ee,...q};l.setResolvedGlobal(lr);let K;try{K=await $t({config:{chrome_profile_path:q.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:re,headless:q.headless??!1,wsEndpoint:q.ws_endpoint,cdpEndpoint:q.cdp_endpoint})}catch(n){return process.stderr.write(`error: Chrome launch failed: ${n.message}
|
|
35
|
-
`),await l.finish("complete"),2}let me=K.instance;me&&Q("chrome",()=>{try{me.kill()}catch{}});let D=null,tt=K.cdpEndpoint??q.cdp_endpoint;if(tt&&!q.ws_endpoint&&!q.headless)try{D=bt({headless:q.headless??!1,cdpEndpoint:tt,chromePid:me?.process.pid}),D&&Q("marker-overlay",()=>D.kill())}catch(n){l.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(n)})}p.resolvedCreds?.org_id!==void 0&&l.setOrgId(String(p.resolvedCreds.org_id));let X=Ct({objective:"",globalDir:ke(Le,"variables"),localDir:ke(process.cwd(),".testmuai","variables"),file:t.variablesFile,inline:t.variables}),cr=i.rootGlobal.variables??{},M=Or(X.raw,cr);l.setAuteurVariables(M.auteur);let rt=Me(ke(Le,"global-memory.md"))??void 0,nt=Me(ke(process.cwd(),".testmuai","context.md"))??void 0,st=a.getActiveProfile()??"default",ot=a.getDefaultEnv(),{rehydrateIfStale:dr}=await import("./profile-sync-DTTRRIVP.js");dr(a,S,st,ot);let $=S.load(),V=$.project_id??null,he=$.folder_id??null;if(!t.local&&!V&&p.basicAuth)try{let n=await Bt({creds:a,config:S,profile:st,env:ot,tmsCreds:p.basicAuth,log:(c,u,m,h)=>l.log(c,u,m,h)});V=n.projectId,he=n.folderId,$=S.load(),process.stderr.write(`info: using project '${n.projectName}' / folder '${n.folderName}' (auto-configured)
|
|
36
|
-
`)}catch(n){process.stderr.write(`warn: could not auto-configure project/folder: ${n.message}
|
|
37
|
-
KaneAI upload will be skipped for this run.
|
|
38
|
-
`)}t.local?process.stderr.write(`info: --local \u2014 KaneAI upload skipped
|
|
39
|
-
`):p.basicAuth?V||process.stderr.write(`warn: KaneAI upload skipped \u2014 no project configured.
|
|
40
|
-
`):process.stderr.write(`warn: KaneAI upload skipped \u2014 TMS credentials could not be resolved.
|
|
41
|
-
Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
|
|
42
|
-
`);let ae=!t.local&&!!p.basicAuth&&V!=null;if(l.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:ae,lockHeld:x,isFirstRun:g.isFirstRun,hasAuth:g.hasAuth}),ae&&g.testId==null){let n=ne(f);try{let c=await Ut({tmsBaseUrl:n.tmsBaseUrl,auth:p.basicAuth,objective:i.steps[0].objective,url:"",projectId:V,folderId:he??"",hasCustomProfile:!!q.chrome_profile,log:(u,m,h,b)=>l.log(u,m,h,b)});c&&l.setTestId(c)}catch(c){process.stderr.write(`warn: ATM test creation failed: ${c.message}
|
|
43
|
-
`)}}else g.testId&&l.setTestId(g.testId);let ge={};if(p.basicAuth&&!t.local&&(M.secretEntries.length>0||M.nonSecretEntries.length>0))try{ge=await At({variables:M,auth:p.basicAuth,orgId:String(p.resolvedCreds?.org_id??""),env:f,localMode:!!t.local,log:(n,c,u,m)=>l.log(n,c,u,m)})}catch(n){process.stderr.write(`warn: variable/secret push failed: ${n.message}
|
|
44
|
-
`)}let xe=new Map;for(let[n,c]of M.nonSecretEntries)xe.set(n,c.value);let Pe=new Map;for(let[n,c]of M.secretEntries)Pe.set(n,c.value);async function Oe(n){if(!p.basicAuth||t.local)return;let c=[],u=[];for(let[h,b]of Object.entries(n))if(b.secret){if(Pe.get(h)===b.value)continue;u.push([h,b])}else{if(xe.get(h)===b.value)continue;c.push([h,b])}if(c.length===0&&u.length===0)return;let m=ne(f);if(c.length>0){let h=new kt(m.tmsBaseUrl,p.basicAuth.username,p.basicAuth.access_key);for(let[b,A]of c)try{let v=await h.upsertVariable({name:b,value:A.value});ge[b]=v.id,xe.set(b,A.value),l.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:b})}catch(v){l.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:b,error:String(v)})}}if(u.length>0){let h=new It(m.secretsBaseUrl);for(let[b,A]of u)try{await h.pushSecret({secretKey:b,secretValue:A.value,username:p.basicAuth.username,accessKey:p.basicAuth.access_key,orgId:String(p.resolvedCreds?.org_id??"")}),Pe.set(b,A.value),l.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:b})}catch(v){l.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:b,error:String(v)})}}}let le=fe?(n,c,u)=>{if(!(x||g.isFirstRun))return;let m=pe+c;St(l.sessionDir,m,n,fe,(h,b,A,v)=>l.log(h,b,A,v),u)}:void 0,it=i.rootTitle??i.rootSteps[0]?.heading??Er(r),ur=Object.keys(M.raw).length>0?Re(M.raw,it).objective:it;l.setFirstRun(ur,re);let W=new Ie(i),Fe=new Date().toISOString(),pr=Date.now(),fr=typeof t.maxSteps=="string"&&t.maxSteps!==""?parseInt(t.maxSteps,10):void 0;function at(n,c){let u=i.steps[n],m=ir(u.config,R),h=ie(X.raw,m.variables,u.objective);return Et({objective:h.objective,url:n===0?re:void 0,model:w,chrome:K,auth:p,sessionId:l.sessionId,runIndex:c,windowSize:{width:1920,height:1080},maxSteps:m.max_steps??fr??30,headless:q.headless??!1,variables:Object.keys(h.variables).length>0?h.variables:void 0,globalContext:m.global_context??rt,localContext:m.local_context??nt,sessionContext:l.getContext()})}function lt(n){let u=i.steps[n].trace[0].stepIndex,m=i.rootSteps.find(b=>b.index===u);i.steps.slice(0,n).some(b=>b.trace[0].stepIndex===u)||d({type:"test_md_step_start",step_index:u,heading:m.heading,ref:m.body.kind==="import_ref"?{kind:"import",label:m.body.path}:null})}function Te(n,c,u,m,h,b){let A=i.steps[n],v=A.trace[0].stepIndex,T=!i.steps.slice(n+1).some(k=>k.trace[0].stepIndex===v),O=u?.status==="passed"?"passed":"failed",j=u?.reason??h??void 0,L=u?.duration??b,{continueOverall:H}=W.recordStep(A,{status:O,duration_s:L,reason:j}),z=ir(A.config,R),G=ie(X.raw,z.variables,A.objective).objective;if(u){let k=ft(u,c,m);l.addRunResult(mt(u,G,c,k),u.total_runs)}else l.addRunResult({index:c,objective:G,status:O,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(T||!H){let k=W.snapshotOutcomes().find(y=>y.rootStepIndex===v);d({type:"test_md_step_end",step_index:v,status:k.status,duration_s:k.duration_s??0,ref_kind:k.refKind??null,inlined_count:k.inlinedCount??null,failed_sub_step_index:k.failedSubStepIndex??null})}return H}async function mr(n){Zt(n,i.steps.length);for(let c=0;c<n;c++){if(s)return{failedAt:c,cancelled:!0};let u=i.steps[c],m=g.decisions[c];if(m.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${c}
|
|
45
|
-
`),{failedAt:c,cancelled:!1};let h=l.nextRunIndex();pe=h;let b=c===0?re:void 0,A={width:$.window_size.width,height:$.window_size.height},v=ie(X.raw,u.config.variables,u.objective),T=We({step:u,decision:m,chrome:K,auth:p,sessionId:l.sessionId,runIndex:h,sessionDir:l.sessionDir,windowSize:A,forceNavigateUrl:b,sessionContext:l.getContext(),variables:Object.keys(v.variables).length>0?v.variables:void 0});await Oe(v.raw),lt(c);let O=Date.now(),j=null,L=null;try{let k=Ne(T,{environment:f});Q("runner",()=>{Ue()&&(s=!0);try{k.cancel()}catch{}}),D?.setRunActive(!0);try{for await(let y of k.events){if(o&&process.stdout.write(JSON.stringify(y)+`
|
|
46
|
-
`),y.type==="step_event"&&y.event==="reasoning"?D?.setStepText(y.detail):y.type==="step_end"&&(y.status==="passed"&&D?.setStepComplete(),le&&le(y.index,0,y.child_id)),y.type==="run_end"){j=y;break}if(y.type==="error"){L=y.message??"runner error";break}}try{k.cancel()}catch{}if(!j&&!L){let{code:y}=await k.exited;y!==0&&(L=`runner exited with code ${y}`)}}finally{D?.setRunActive(!1),J("runner","Replay step complete")}}catch(k){L=k.message}if(s)return{failedAt:c,cancelled:!0};let H=Math.round((Date.now()-O)/1e3),z=Te(c,h,j,null,L,H);l.recordStepRun({testmdStepIndex:i.steps[c].flatIndex,runIndex:h,totalRunDirs:1});let G=!!L||j?.status==="failed";if(Qt(c,G?"failed":"ok"),G||!z)return{failedAt:c,cancelled:!1}}return{failedAt:null,cancelled:!1}}let ct=async()=>{if(x)return!0;let n=p.basicAuth;if(!n){let h=await p.resolver.resolve(!0);h?.username&&h?.access_key&&(n={username:h.username,access_key:h.access_key},p.basicAuth=n)}if(!g.testId||!g.fromCommitId||!n)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
|
|
47
|
-
`),!1;let c=l.sessionId,u=t.onLockConflict??i.rootGlobal.on_lock_conflict??"readonly",m=await ar({tmsBaseUrl:C.tmsBaseUrl,testId:g.testId,fromCommitId:g.fromCommitId,newCommitId:c,basicAuth:n,onLockConflict:u});return m==="ok"?(x=!0,g.newCommitId=c,l.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:g.testId}),o&&d({type:"test_md_lock_state",phase:"acquired",scope:"mid_run"}),Ze({baseUrl:Ce(C.tmsBaseUrl),testId:g.testId,auth:Ae(n)}),!0):(l.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:m}),o&&d({type:"test_md_lock_state",phase:"conflict",scope:"mid_run",reason:m}),process.stderr.write(`error: mid-run lock acquisition failed (${m})
|
|
48
|
-
`),!1)};if(o){let{authorBoundary:n,cancelledInPhase:c,shrinkCount:u}=await rr({decisions:g.decisions,hasRetry:t.retry===!0||t.retryCount!==void 0,maxShrinks:t.retryCount!==void 0?parseInt(t.retryCount,10):de.maxShrinks,runReplayPhase:mr,session:l,accumulator:W,acquireLockIfNeeded:ct});if(ue=u>0,u>0&&(l.log("info","RETRY_TRIGGERED","Retry loop triggered",{shrink_count:u,final_author_boundary:n}),d({type:"test_md_retry_attempt",shrink_count:u,final_author_boundary:n,complete_reauthor:n===0})),n===0&&u>0&&l.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:u}),!c&&n>=0)for(let m=n;m<i.steps.length;m++){let h=i.steps[m];if(!W.shouldRunFlatStep(h))continue;lt(m),B=!0;let b=l.nextRunIndex();pe=b,await Oe(ie(X.raw,h.config.variables,h.objective).raw);let A=at(m,b),v=Date.now(),T=null,O=null,j=null,L=!1,H=0;try{let k=Ne(A,{environment:f});Q("runner",()=>{Ue()&&(s=!0);try{k.cancel()}catch{}}),D?.setRunActive(!0);try{for await(let y of k.events){if(process.stdout.write(JSON.stringify(y)+`
|
|
49
|
-
`),y.type==="bifurcation"){let ce=y.count??y.flows?.length??0;(y.is_single_flow??ce<=1)||(j=y.flows??null,L=!0,H=0)}else if(y.type==="run_start"&&L)H++;else if(y.type==="step_event"&&y.event==="reasoning")D?.setStepText(y.detail);else if(y.type==="step_end"&&(y.status==="passed"&&D?.setStepComplete(),le)){let ce=L?Math.max(0,H-1):0;le(y.index,ce,y.child_id)}if(y.type==="run_end"){T=y;break}if(y.type==="error"){O=y.message??"runner error";break}}try{k.cancel()}catch{}}finally{D?.setRunActive(!1),J("runner","Step complete")}}catch(k){O=k.message}let z=Math.round((Date.now()-v)/1e3),G=Te(m,b,T,j,O,z);if(l.recordStepRun({testmdStepIndex:i.steps[m].flatIndex,runIndex:b,totalRunDirs:T?.total_runs??1}),!G||s)break}}else{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{TestMdRunView:u}=await import("./TestMdRunView-E4UDWIGT.js"),{effectiveDecisions:m}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:h}=await import("./replay-policy-6USQBT3E.js"),b=t.retry===!0||t.retryCount!==void 0,A=t.retryCount!==void 0?parseInt(t.retryCount,10):de.maxShrinks,v=t.author===!0;v&&(er(),l.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let T=v?0:ve(g.decisions),O=0,j=null,L=g.decisions.filter(k=>k.kind==="replay").length,H=g.decisions.length-L,z=[];t.push&&z.push("--push"),b&&z.push("--retry"),t.retryCount!==void 0&&z.push(`--retry-count=${t.retryCount}`),v&&z.push("--author");let G={source:r,steps:{total:g.decisions.length,replay:L,author:H},model:w,viewport:{width:$.window_size.width,height:$.window_size.height},chrome:K.cdpEndpoint??K.wsEndpoint??"managed",session:l.sessionName??"ephemeral",variables:{count:Object.keys(M.raw).length,secrets:Object.values(M.raw).filter(k=>k.secret).length,names:Object.keys(M.raw)},flags:z,mode:R.mode??"testing"};for(;;){let k=l.snapshot(),y=W.snapshot(),ce=m(g.decisions,T,v);if(O>=1){let E=T===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${O}/${A})`:`\u21BB Retry ${O}/${A} \u2014 replay 0..${T-1}, author ${T}..${g.decisions.length-1}
|
|
50
|
-
reason: replay miss at step ${(j??0)+1}`;process.stderr.write(E+`
|
|
51
|
-
`)}let br=O>=1&&T>0&&j!==null?{startIdx:0,endIdx:j,count:j}:void 0;D?.setRunActive(!0);let be=await Ur({decisions:ce,resolved:i,session:l,accumulator:W,tuiConfig:$,globalConfig:G,buildStepConfigAt:at,buildReplayConfig:E=>{let Y=g.decisions[E];if(Y.kind!=="replay")throw new Error("expected replay decision at index "+E);let Z=i.steps[E];return We({step:Z,decision:Y,chrome:K,auth:p,sessionId:l.sessionId,runIndex:l.nextRunIndex(),sessionDir:l.sessionDir,windowSize:{width:$.window_size.width,height:$.window_size.height},forceNavigateUrl:E===0?re:void 0,sessionContext:l.getContext(),variables:Fr(X.raw,Z.config.variables,Z.objective)})},onAnyAuthorStep:()=>{B=!0},onCancel:()=>{P=!0},topBannerModel:w,topBannerAuth:`${a.getActiveProfile()??"no profile"}/${f}`,spawnOpts:{environment:f,mode:R.mode??"testing",log:(E,Y,Z,De)=>l.log(E,Y,Z,De)},priorAttemptRollup:br,pushStepLevelDelta:(E,Y)=>Oe(ie(X.raw,E,Y).raw),onSequencerStepEnd:(E,Y,Z,De)=>{let Rr=Math.round((Date.now()-De)/1e3),yr=E.hadError?E.reason??"runner error":null,Sr=Te(Y,Z,E.runEnd,E.bifurcationFlows??null,yr,Rr);return l.recordStepRun({testmdStepIndex:i.steps[Y].flatIndex,runIndex:Z,totalRunDirs:E.runEnd?.total_runs??E.bifurcationFlows?.length??1}),Sr},screenshotDispatcher:le,onReasoning:E=>D?.setStepText(E),onStepComplete:()=>D?.setStepComplete(),onSpawnStart:E=>{pe=E}});if(D?.setRunActive(!1),be.cancelled){J("marker-overlay","user cancelled run"),J("chrome","user cancelled run");break}if(be.failedAt===null)break;let je=h({failedAt:be.failedAt,shrinkCount:O,hasRetry:b,maxShrinks:A});if(je.kind==="fail"||!x&&!await ct())break;l.rollback(k),W.rollback(y),je.kind==="complete-reauthor"?T=0:T=je.newAuthorBoundary,O++,ue=!0,l.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:O,failed_at:j}),T===0&&l.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:O}),j=be.failedAt}}let N=W.finalize(),ee=Math.round((Date.now()-pr)/1e3),hr={session:l,resolvedAuth:p,chromeResult:K,chromeInstance:me??null,testId:l.testId??null,preparedVariables:M,variableIds:ge,globalContext:rt,localContext:nt,tuiConfig:$,env:f,localMode:!!t.local},te=await or(hr,{performUpload:async()=>{if(!p.basicAuth)return null;let n=ne(f),c=(B||t.push===!0)&&!P,u=(x||g.isFirstRun)&&!P&&N.overallStatus==="passed",m=ae&&(x||g.isFirstRun);l.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:ae,shouldUploadPipeline:m,shouldReplaceLocalOutput:c,shouldCommit:u,lockHeld:x,anyAuthorStepRan:B,cancelled:P,overallStatus:N.overallStatus});let h=Dt({session:l,env:f,auth:p,variables:M,variableIds:ge,projectId:V,folderId:he,totalSteps:N.outcomes.length,totalDuration:ee,screenshotExtMap:fe?.getExtMap(),codeExport:Lt({codeExport:t.codeExport,codeLanguage:t.codeLanguage,skipCodeValidation:t.skipCodeValidation},$.code_export),onProgress:()=>{},log:(v,T,O,j)=>l.log(v,T,O,j),shouldUploadArtifacts:m,shouldReplaceLocalOutput:c,shouldCommit:u,isFirstRun:g.isFirstRun,resolvedTest:i,sourcePath:r,stepRunRecords:l.getStepRunRecords(),outcomes:N.outcomes,overallStatus:N.overallStatus,fromCommitId:g.fromCommitId,startedISO:Fe,durationS:ee,tmsIds:{testId:g.testId??l.testId??void 0,testcaseId:g.testcaseId??l.testcaseId??void 0,projectId:V??void 0,folderId:he??void 0,orgId:l.orgId??void 0,sessionName:l.sessionName??ye(r)},tmsBaseUrl:C.tmsBaseUrl,testId:g.testId??void 0,newCommitId:g.newCommitId??void 0,basicAuth:p.basicAuth??void 0,decisions:g.decisions,wantsPush:t.push===!0,retryTriggered:ue,forceAuthor:t.author===!0});g.newCommitId!=null&&(h.skipTmsFinalize=!0);let b=new Rt(h);if(o)return await b.execute();let{renderUploadProgress:A}=await import("./CliUploadProgress-B4CVWX62.js");return await A(b,v=>{if(v.testcaseId&&v.shareId&&V)return $e(n.testManagerUiUrl,V,v.testcaseId,v.shareId)})},runCleanup:()=>{J("chrome","test.md run complete")},log:(n,c,u,m)=>l.log(n,c,u,m)},{overallStatus:N.overallStatus,outcomes:N.outcomes,sourcePath:r,title:i.rootTitle,rootSteps:i.rootSteps,startedISO:Fe,durationS:ee,localMode:!!t.local,skipLocalWrites:!0});await Dr(r,g,l,N.outcomes,N.overallStatus,Fe,ee,te.uploadResult,$,t,{resolvedAuth:p,tmsBaseUrl:C.tmsBaseUrl},x);let dt={overallStatus:N.overallStatus,durationS:ee,decisions:g.decisions,outcomes:N.outcomes,cancelled:P,retryTriggered:ue,lockHeld:x,anyAuthorStepRan:B,isFirstRun:g.isFirstRun,wantsPush:t.push===!0,uploadResult:te.uploadResult,shouldUploadArtifacts:ae,shouldReplaceLocalOutput:B&&!P,shouldCommit:(x||g.isFirstRun)&&!P&&N.overallStatus==="passed"},{buildSummaryEvent:gr}=await import("./SummaryBox-FDNFQYSC.js");if(o)d(gr(dt));else try{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{AutoExitSummaryBox:u}=await import("./SummaryBox-FDNFQYSC.js"),{waitUntilExit:m}=c(n.createElement(u,{data:dt}),{stdout:process.stderr});await m()}catch(n){l.log("warn","TEST_MD_SUMMARY_RENDER_FAILED","Summary box render failed",{error:String(n)})}if(!o)try{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{LinksBox:u}=await import("./LinksBox-R3VLKMYS.js"),m=ne(f),h=te.uploadResult?.testcaseId,b=h&&te.uploadResult?.shareId&&V?$e(m.testManagerUiUrl,V,h,te.uploadResult.shareId):void 0,A=h&&V?yt(m.testManagerUiUrl,V,h):void 0,{waitUntilExit:v}=c(n.createElement(u,{recordedTestPath:r,outputDir:xt(r),shareableLink:b,testCaseLink:A,codeExportDir:te.uploadResult?.codeExportDir}),{stdout:process.stderr});await v()}catch(n){l.log("warn","TEST_MD_LINKS_RENDER_FAILED","LinksBox render failed",{error:String(n)})}return d({type:"test_md_done",overall_status:N.overallStatus,duration_s:ee,session_id:l.sessionId}),N.overallStatus==="passed"?0:1}function Pr(e){let t={mode:"mode",maxSteps:"max_steps",timeout:"timeout",globalContext:"global_context",localContext:"local_context",codeExport:"code_export",codeLanguage:"code_language",headless:"headless",cdpEndpoint:"cdp_endpoint",wsEndpoint:"ws_endpoint"},r=new Set(["max_steps","timeout"]),o={};for(let[s,d]of Object.entries(t)){let i=e[s];if(i===void 0||i==="")continue;let R=i;if(r.has(d)&&(R=Number(i),Number.isNaN(R))){let a="--"+s.replace(/[A-Z]/g,S=>"-"+S.toLowerCase());process.stderr.write(`error: ${a} must be a number
|
|
52
|
-
`),process.exit(2)}o[d]=R}return o}function Or(e,t){let r={...e,...t},o=Object.keys(r).length>0?Re(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:o.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,s])=>s.secret),nonSecretEntries:Object.entries(r).filter(([,s])=>!s.secret)}}function ie(e,t,r){let o={...e,...t??{}};if(Object.keys(o).length===0)return{raw:o,variables:{},objective:r};let s=Re(o,r);return{raw:o,variables:_t(s.variables,s.objective),objective:s.objective}}function Fr(e,t,r){let o=ie(e,t,r).variables;return Object.keys(o).length>0?o:void 0}function ir(e,t){let r=new Set(_e),o={...e};for(let[s,d]of Object.entries(t))r.has(s)||s!=="variables"&&d!==void 0&&e[s]===void 0&&(o[s]=d);return o}function Tr(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function jr(e,t,r,o,s){let d=Pt(e),i=Kt(t,Xe(d)?d:null);Wt(t,i);let R=Se(e),a=Xe(R)?JSON.parse(xr(R,"utf8")):null,S=a?.testcase_id,_=a?.test_id,I=a?.commit_id,F=r.push===!0,f=r.retry===!0||r.retryCount!==void 0,C=r.author===!0;F&&!S&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
|
|
53
|
-
`),C&&(S=void 0,_=void 0,I=void 0);let w=o.resolvedAuth.basicAuth;if(!w){let P=await o.resolvedAuth.resolver.resolve(!0);P?.username&&P?.access_key&&(w={username:P.username,access_key:P.access_key},o.resolvedAuth.basicAuth=w)}let p=!!w,U=!r.local&&p&&_!=null&&I!=null&&S!=null,l=U&&(Gt(i)||F);if(F&&!U)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
54
|
-
`),{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:null,isFirstRun:!1,hasAuth:p,canLock:U,lockAcquired:!1,abort:{exitCode:2}};if(f&&!U)return process.stderr.write(`error: --retry requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
55
|
-
`),{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:null,isFirstRun:!1,hasAuth:p,canLock:U,lockAcquired:!1,abort:{exitCode:2}};if(C&&!p)return process.stderr.write(`error: --author requires authenticated credentials for the TMS API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
56
|
-
`),{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:null,isFirstRun:!1,hasAuth:p,canLock:U,lockAcquired:!1,abort:{exitCode:2}};let g=null,x=!1;if(l){g=s;let B=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",P=await ar({tmsBaseUrl:o.tmsBaseUrl,testId:_,fromCommitId:I,newCommitId:g,basicAuth:w,onLockConflict:B});if(P==="ok")x=!0,Ze({baseUrl:Ce(o.tmsBaseUrl),testId:_,auth:Ae(w)});else{if(P==="abort")return{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:null,isFirstRun:!1,hasAuth:p,canLock:U,lockAcquired:!1,abort:{exitCode:2}};g=null}}return{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:g,isFirstRun:S==null,hasAuth:p,canLock:U,lockAcquired:x}}function Ce(e){return`${e}/kane-cli/v1`}function Ae(e){return{username:e.username,accessKey:e.access_key}}async function ar(e){let t=Ce(e.tmsBaseUrl),r=Ae(e.basicAuth),o={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},s=await Ke(o);if(s.ok)return"ok";if(!(s.reason==="concurrent"||s.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${s.reason} (HTTP ${s.httpStatus}): ${s.message}
|
|
57
|
-
`),"abort";let i=s.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${i}; aborting (--on-lock-conflict fail)
|
|
58
|
-
`),"abort";if(e.onLockConflict==="wait"){if(s.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
|
|
59
|
-
`),"abort";for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
|
|
60
|
-
`),await new Promise(a=>setTimeout(a,3e4));let R=await Ke(o);if(R.ok)return"ok";if(R.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${R.reason} (HTTP ${R.httpStatus}): ${R.message}; aborting
|
|
61
|
-
`),"abort"}}return process.stderr.write(`[lock] ${i} \u2014 running in readonly mode (no commit)
|
|
62
|
-
`),"readonly"}async function Dr(e,t,r,o,s,d,i,R,a,S,_,I){let{decisions:F,testId:f,testcaseId:C,fromCommitId:w,newCommitId:p}=t;if(!(s==="passed")&&I&&f&&w&&p){process.stderr.write(`[lock] run failed (${s}); discarding new commit
|
|
63
|
-
`),await Lr(_,f,w,p),Qe();return}Qe()}async function Lr(e,t,r,o){let s=e.resolvedAuth.basicAuth;if(!s){let i=await e.resolvedAuth.resolver.resolve(!0);i?.username&&i?.access_key&&(s={username:i.username,access_key:i.access_key},e.resolvedAuth.basicAuth=s)}if(!s)return;let d=await jt({baseUrl:Ce(e.tmsBaseUrl),testId:t,body:{commitId:o,fromCommitId:r},auth:Ae(s)});d.ok||process.stderr.write(`warn: discardLock failed: ${d.reason} (HTTP ${d.httpStatus}): ${d.message}
|
|
64
|
-
`)}async function Ur(e){let{default:t}=await import("./react-QWOAB3TB.js"),{render:r}=await import("./build-JIKYOZUH.js"),{TestMdRunView:o}=await import("./TestMdRunView-E4UDWIGT.js"),s=null,d=!1,i=0,R=-1,a=-1,S=0,_=async F=>{if(F&&F.status==="failed")return i>0&&e.decisions[i-1].kind==="replay"&&(s=i-1),null;for(;i<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[i]);)i++;if(i>=e.decisions.length)return null;let f=e.decisions[i],C=e.resolved.steps[i],w=i;i++;let p=e.session.nextRunIndex();R=w,a=p,S=Date.now(),e.onSpawnStart?.(p),f.kind==="author"&&e.onAnyAuthorStep(),await e.pushStepLevelDelta(C.config.variables,C.objective);let U=f.kind==="replay"?e.buildReplayConfig(w):e.buildStepConfigAt(w,p),l=f.kind==="replay"?"md5-match":f.reason,g=C.config??{},x={};for(let[B,P]of Object.entries(g))P!=null&&B!=="variables"&&(x[B]=P);return{config:U,banner:{stepLabel:`Step ${w+1}/${e.decisions.length}`,objective:Tr(C.objective,100)},mode:f.kind,modeReason:l,perStepOverrides:Object.keys(x).length>0?x:void 0}},{waitUntilExit:I}=r(t.createElement(o,{topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:_,onStepEnd:F=>(F.status==="failed"&&R>=0&&e.decisions[R]?.kind==="replay"&&(s=R),e.onSequencerStepEnd(F,R,a,S)),onAllComplete:()=>{},onCancel:()=>{d=!0,e.onCancel()},spawnOpts:e.spawnOpts,priorAttemptRollup:e.priorAttemptRollup,screenshotDispatcher:e.screenshotDispatcher,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete}),{stdout:process.stderr,exitOnCtrlC:!1});return await I(),{failedAt:s,cancelled:d}}export{ir as applyCliStepConfig,ie as buildStepRunVariables,Or as buildTestLevelVariables,Fr as replayVariablesForStep,ns as runTestMdFile};
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as $}from"./chunk-LYSEA5FB.js";import{b as J,c as U,d as tt}from"./chunk-2SXNPFGD.js";import{a as C,b as W,e as S,f as Z}from"./chunk-AH4AXJML.js";import{a as N}from"./chunk-KMTNMUVS.js";import"./chunk-G7VF5SDK.js";import{a as z}from"./chunk-WZCGEQ6M.js";import{a as B}from"./chunk-KX7K3Y7R.js";import{a as G}from"./chunk-JHNEE2MB.js";import"./chunk-BPF7TDRU.js";import{a as K,b as Q}from"./chunk-MDBXYXSC.js";import"./chunk-WAOCHXJ5.js";import"./chunk-PQGNWC33.js";import{a as F}from"./chunk-HCBYKLMW.js";import{t as _}from"./chunk-5XTLIGWL.js";import{a as y,b as g,i as H}from"./chunk-C44QQJR4.js";import{a as A}from"./chunk-6YGTRKDT.js";import"./chunk-NLCCBXXV.js";import{a as O}from"./chunk-RZ4F3BHX.js";import{e as T}from"./chunk-UR6MHSHU.js";var P=T(A(),1);import{existsSync as v,readFileSync as Lt,rmSync as lt,unlinkSync as jt}from"fs";import{resolve as Y}from"path";import{promises as et,realpathSync as gt}from"fs";import{homedir as pt}from"os";import{join as V,parse as ht,relative as rt,resolve as nt}from"path";var _t=new Set(["node_modules",".git","dist","build",".next",".venv","venv","target","__pycache__"]),R=class extends Error{constructor(i){super(`refusing to scan '${i}'. Run from your project root, or pass --root <dir>.`);this.cwd=i;this.name="HomeRefusedError"}};function ot(t){try{return gt(nt(t))}catch{return nt(t)}}function xt(t){let r=ot(t),i=ot(pt()),n=ht(r).root;if(process.platform==="win32"){let e=o=>o.toLowerCase();return e(r)===e(i)||e(r)===e(n)}return r===i||r===n}async function I(t){if(xt(t.root))throw new R(t.root);let r=t.maxEntries??5e4,i=t.maxResults??5e3,n=new Set(t.ignore??[]),e=[],o=0,c=0,a=!1,l,s=[t.root];for(;s.length>0&&!a;){let u=s.shift(),w;try{w=await et.readdir(u,{withFileTypes:!0})}catch{continue}c++;for(let h of w){if(o++,o>r){a=!0,l="max_entries";break}let f=h.name,b=V(u,f);if(h.isDirectory()){if(_t.has(f)||f.startsWith(".")||f.startsWith("output-")||n.has(f))continue;s.push(b)}else if(h.isFile()&&f.endsWith("_test.md")&&(e.push({path:b,relPath:rt(t.root,b),source:"cwd"}),e.length>=i)){a=!0,l="max_results";break}}t.onProgress?.(c,e.length)}if(!a){let u=V(t.root,".testmuai","tests");try{let w=await et.readdir(u,{withFileTypes:!0});c++;for(let h of w){if(!h.isFile()||!h.name.endsWith("_test.md"))continue;let f=V(u,h.name);if(e.push({path:f,relPath:rt(t.root,f),source:"tests-dir"}),e.length>=i){a=!0,l="max_results";break}}}catch{}}return{results:e,aborted:a,abortReason:l,dirsScanned:c}}import{mkdirSync as wt,writeFileSync as yt}from"fs";import{join as kt}from"path";function it(t,r){return`Basic ${Buffer.from(`${t}:${r}`).toString("base64")}`}async function bt(t){let r=K({tmsBaseUrl:t.tmsBaseUrl,testcaseId:t.testcaseId,codeExport:{enabled:!0,language:t.language,skipValidation:t.skipValidation}}),i=await O(r.url,{method:"POST",headers:{"content-type":"application/json",authorization:it(t.auth.username,t.auth.access_key)},body:JSON.stringify(r.body)});if(!i.ok)throw new Error(`code-export trigger failed: ${i.status} ${await i.text()}`);t.log("info","CODE_EXPORT_TRIGGERED","Code export triggered",{testcase_id:t.testcaseId})}async function Et(t){let r=Q({tmsBaseUrl:t.tmsBaseUrl,testcaseId:t.testcaseId}),i=t.pollIntervalMs??5e3,n=t.timeoutMs??3e5,e=Date.now()+n;for(;Date.now()<e;){let o=await O(r,{headers:{authorization:it(t.auth.username,t.auth.access_key),accept:"application/json"}});if(!o.ok){await new Promise(s=>setTimeout(s,i));continue}let a=(await o.json()).data?.find(s=>s.code_name==="kane-cli-trigger");if(!a){await new Promise(s=>setTimeout(s,i));continue}let l=(a.status??"").toLowerCase();if(l==="in progress"||l==="in_progress"||l==="pending"){await new Promise(s=>setTimeout(s,i));continue}if(!a.url||a.url.length===0)throw new Error(`code-export status=${a.status} but no files returned`);wt(t.outDir,{recursive:!0});for(let s of a.url){let u=kt(t.outDir,s.file_name),w=await O(s.file_url);if(!w.ok){t.log("warn","CODE_EXPORT_FILE_FAILED","Failed to download file",{file_name:s.file_name,status:w.status});continue}let h=await w.text();yt(u,h,"utf-8")}return t.log("info","CODE_EXPORT_DOWNLOADED","Code export saved",{out_dir:t.outDir,file_count:a.url.length}),t.outDir}throw new Error("code-export polling timed out")}async function st(t){return await bt(t),await Et(t)}var k=T(A(),1);import{existsSync as Tt,readFileSync as Rt}from"fs";var p=T(F(),1);function St(t){$(t);let r=S(t);if(!Tt(r))return null;try{return JSON.parse(Rt(r,"utf8"))}catch{return{}}}function Pt(t){return t===null?"never_run":t.testcase_id?"synced":"local_only"}function vt(t){return t==="synced"?"\u2601":t==="local_only"?"\u25A3":"\u25CB"}function Mt(t){return t==="tests-dir"?"\u2726":" "}function Ct(t,r){return r==="all"?!0:r==="synced"?t.status==="synced":r==="local"?t.status==="local_only":r==="never_run"?t.status==="never_run":r==="cli"?t.source==="tests-dir":r==="hand"?t.source==="cwd":!0}var X=["all","synced","local","never_run","cli","hand"];function Dt(t){let r=X.indexOf(t);return X[(r+1)%X.length]}function at({root:t,currentOrgId:r,onSelect:i,onCancel:n}){let[e,o]=(0,k.useState)([]),[c,a]=(0,k.useState)(null),[l,s]=(0,k.useState)(!0),[u,w]=(0,k.useState)("all");(0,k.useEffect)(()=>{(async()=>{try{let m=await I({root:t}),M=[];for(let E of m.results){let j=St(E.path);j?.org_id!==void 0&&j.org_id!==r||M.push({path:E.path,relPath:E.relPath,name:C(E.path),status:Pt(j),source:E.source})}o(M),s(!1)}catch(m){m instanceof R,a(m.message),s(!1)}})()},[t,r]);let h=(0,k.useMemo)(()=>e.filter(m=>Ct(m,u)).map(m=>({id:m.path,label:`${vt(m.status)} ${Mt(m.source)} ${m.relPath}`})),[e,u]),f=(0,k.useMemo)(()=>Ot(u,e),[u,e]);if(c)return(0,p.jsxs)(y,{flexDirection:"column",borderStyle:"round",borderColor:_.statusFail,paddingX:2,paddingY:1,children:[(0,p.jsx)(g,{color:_.statusFail,bold:!0,children:"testmd"}),(0,p.jsx)(y,{marginTop:1,children:(0,p.jsx)(g,{color:_.statusFail,children:c})})]});let b=u==="all"?"all":Ft(u);return(0,p.jsx)(z,{title:`testmd \xB7 filter: ${b}`,items:h,loading:l,itemNoun:"tests",onSelect:m=>{let M=e.find(E=>E.path===m.id);M&&i(M)},onCancel:n,onTab:()=>w(m=>Dt(m)),extraHint:"cycle filter",footer:f})}function Ft(t){return t==="synced"?"synced (\u2601)":t==="local"?"local (\u25A3)":t==="never_run"?"never run (\u25CB)":t==="cli"?"cli-generated (\u2726)":t==="hand"?"hand-written":"all"}function Ot(t,r){let i={synced:r.filter(e=>e.status==="synced").length,local:r.filter(e=>e.status==="local_only").length,never:r.filter(e=>e.status==="never_run").length,cli:r.filter(e=>e.source==="tests-dir").length,hand:r.filter(e=>e.source==="cwd").length},n=e=>e?_.primary:_.dim;return(0,p.jsxs)(y,{flexDirection:"column",children:[(0,p.jsx)(g,{color:_.dim,children:"legend:"}),(0,p.jsxs)(y,{children:[(0,p.jsx)(g,{color:n(t==="synced"),children:` \u2601 synced (${i.synced}) `}),(0,p.jsx)(g,{color:n(t==="local"),children:`\u25A3 local (${i.local}) `}),(0,p.jsx)(g,{color:n(t==="never_run"),children:`\u25CB never run (${i.never})`})]}),(0,p.jsxs)(y,{children:[(0,p.jsx)(g,{color:n(t==="cli"),children:` \u2726 cli-generated (${i.cli}) `}),(0,p.jsx)(g,{color:n(t==="hand"),children:` hand-written (${i.hand})`})]})]})}var D=T(A(),1);import{existsSync as $t,readFileSync as It}from"fs";var d=T(F(),1);function ct({path:t,relPath:r,onAction:i,onBack:n}){let[e,o]=(0,D.useState)(null),[c,a]=(0,D.useState)(!1);(0,D.useEffect)(()=>{let s=S(t);if($t(s))try{o(JSON.parse(It(s,"utf8")))}catch{o(null)}},[t]),H((s,u)=>{if(u.escape){if(c){a(!1);return}n();return}if(c){s==="y"||s==="Y"?(a(!1),i("delete")):(s==="n"||s==="N")&&a(!1);return}s==="r"&&i("run"),s==="e"&&e?.testcase_id&&i("export"),s==="d"&&a(!0)});let l=({k:s,v:u})=>u?(0,d.jsxs)(g,{children:[(0,d.jsx)(g,{color:_.dim,children:s.padEnd(14)}),u]}):null;return(0,d.jsxs)(y,{flexDirection:"column",borderStyle:"round",borderColor:_.primary,paddingX:2,paddingY:1,children:[(0,d.jsx)(g,{color:_.primary,bold:!0,children:r}),(0,d.jsx)(y,{marginTop:1,flexDirection:"column",children:e?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(l,{k:"test_id",v:e.test_id}),(0,d.jsx)(l,{k:"testcase_id",v:e.testcase_id}),(0,d.jsx)(l,{k:"project_id",v:e.project_id}),(0,d.jsx)(l,{k:"folder_id",v:e.folder_id}),(0,d.jsx)(l,{k:"org_id",v:e.org_id}),(0,d.jsx)(l,{k:"session_name",v:e.session_name}),(0,d.jsx)(l,{k:"commit_id",v:e.commit_id})]}):(0,d.jsx)(g,{color:_.dim,children:"(never run \u2014 no meta.json)"})}),c?(0,d.jsx)(y,{marginTop:1,children:(0,d.jsxs)(g,{color:_.statusFail,bold:!0,children:["Delete ",r," and its output dir? [y/n]"]})}):(0,d.jsx)(y,{marginTop:1,children:(0,d.jsxs)(g,{color:_.dim,children:["[r] run [e] export",e?.testcase_id?"":" (need testcase_id)"," [d] delete [Esc] back"]})})]})}function L(t){$(t);let r=S(t);if(!v(r))return null;try{return JSON.parse(Lt(r,"utf8"))}catch{return null}}function ut(t,r){return!t||t.org_id===void 0?!0:t.org_id===r}function q(t,r){return ut(t,r)?null:(process.stderr.write(`error: this test belongs to org ${t.org_id}; you are logged in as org ${r}.
|
|
3
|
-
Switch profiles with \`kane-cli profiles switch\` to act on it.
|
|
4
|
-
`),2)}async function Pe(t={}){let r=!!process.stdin.isTTY&&!t.json,i=new B,n=new N;await tt({isInteractive:r,creds:i,config:n});let e=i.getDefaultEnv()??"prod";try{let o=await U({creds:i,env:e,log:()=>{}});return o.resolvedCreds?.org_id===void 0?(process.stderr.write("error: TMS did not return an org_id. Run `kane-cli login` again.\n"),{ok:!1,code:2}):{ok:!0,orgId:String(o.resolvedCreds.org_id)}}catch(o){if(o instanceof J)return process.stderr.write("error: not authenticated. Run `kane-cli login` first.\n"),{ok:!1,code:2};throw o}}async function ve(t,r){if(process.stdin.isTTY&&!t.json)return await Nt(r,t.root);let i=t.root??process.cwd(),n;try{n=await I({root:i,ignore:t.ignore})}catch(e){if(e instanceof R)return process.stderr.write(`error: ${e.message}
|
|
5
|
-
`),2;throw e}for(let e of n.results){let o=L(e.path);if(!ut(o,r))continue;let c={path:e.relPath.startsWith(".")?e.relPath:`./${e.relPath}`,name:C(e.path),has_meta:o!==null,source:e.source,synced:!!o?.testcase_id};o&&(o.test_id&&(c.test_id=o.test_id),o.testcase_id&&(c.testcase_id=o.testcase_id),o.org_id&&(c.org_id=o.org_id),o.project_id&&(c.project_id=o.project_id),o.folder_id&&(c.folder_id=o.folder_id)),process.stdout.write(JSON.stringify(c)+`
|
|
6
|
-
`)}return n.aborted&&process.stderr.write(`warn: walk aborted (${n.abortReason}). Pass --root or --ignore to narrow.
|
|
7
|
-
`),0}var dt=-1001,ft=-1002,mt=-1003,x={action:null,path:null};function At(t,r){return x.action=t,x.path=r,t==="run"?dt:t==="export"?ft:mt}function Bt({root:t,currentOrgId:r,onComplete:i}){let[n,e]=P.default.useState({kind:"list"});return P.default.useEffect(()=>{n.kind==="exiting"&&i(n.code)},[n,i]),n.kind==="list"?P.default.createElement(at,{root:t,currentOrgId:r,onSelect:o=>e({kind:"inspect",path:o.path,relPath:o.relPath}),onCancel:()=>e({kind:"exiting",code:0})}):n.kind==="inspect"?P.default.createElement(ct,{path:n.path,relPath:n.relPath,onAction:async o=>{e({kind:"exiting",code:At(o,n.path)})},onBack:()=>e({kind:"list"})}):null}async function Nt(t,r){let i=r??process.cwd(),{render:n}=await import("./build-JIKYOZUH.js"),e=await new Promise(o=>{let{unmount:c,waitUntilExit:a}=n(P.default.createElement(Bt,{root:i,currentOrgId:t,onComplete:l=>{c(),o(l)}}),{stdout:process.stderr,exitOnCtrlC:!0});a().then(()=>o(0)).catch(()=>o(0))});if(e===dt&&x.path){let{runTestMdFile:o}=await import("./run-test-md-5TNUTTEA.js"),c=await o(x.path,{});return x.action=null,x.path=null,c}if(e===ft&&x.path){let o=await Jt(x.path,{},t);return x.action=null,x.path=null,o}if(e===mt&&x.path){let o=await Wt(x.path,!0,t);return x.action=null,x.path=null,o}return e}async function Me(t,r){let i=Y(t);if(!v(i))return process.stderr.write(`error: file not found: ${i}
|
|
8
|
-
`),2;let n=L(i),e=q(n,r);if(e!==null)return e;let o={path:i,name:C(i),has_meta:n!==null};return n&&(n.commit_id&&(o.commit_id=n.commit_id),n.test_id&&(o.test_id=n.test_id),n.testcase_id&&(o.testcase_id=n.testcase_id),n.project_id&&(o.project_id=n.project_id),n.folder_id&&(o.folder_id=n.folder_id),n.org_id&&(o.org_id=n.org_id),n.session_name&&(o.session_name=n.session_name)),process.stdout.write(JSON.stringify(o)+`
|
|
9
|
-
`),0}async function Wt(t,r,i){let n=Y(t);if(!v(n))return process.stderr.write(`error: file not found: ${n}
|
|
10
|
-
`),2;let e=L(n),o=q(e,i);if(o!==null)return o;if(!r)return process.stderr.write(`error: refusing to delete without --yes.
|
|
11
|
-
This will remove '${n}' and '${W(n)}/'.
|
|
12
|
-
`),2;let c=W(n);if(v(c))try{lt(c,{recursive:!0,force:!0})}catch(a){return process.stderr.write(`error: failed to remove ${c}: ${a.message}
|
|
13
|
-
`),2}try{jt(n)}catch(a){return process.stderr.write(`error: failed to remove ${n}: ${a.message}
|
|
14
|
-
`),2}return process.stderr.write(`removed ${n} and ${c}/
|
|
15
|
-
`),0}async function Jt(t,r,i){let n=Y(t);if(!v(n))return process.stderr.write(`error: file not found: ${n}
|
|
16
|
-
`),2;let e=L(n),o=q(e,i);if(o!==null)return o;if(!e?.testcase_id)return process.stderr.write("error: this test has not been synced to TMS \u2014 run `kane-cli testmd run` first.\n"),2;let c=new N().load(),a=r.language??c.code_export?.language;if(!a)return process.stderr.write(`error: --language not provided and no default in tui-config.
|
|
17
|
-
`),2;let l=r.output??Z(n,"playwright",a),s=v(l);if(s&&!r.force){let f=!1;try{let{readdirSync:b}=await import("fs");f=b(l).length>0}catch{}if(f)return process.stderr.write(`reusing existing export at ${l}
|
|
18
|
-
`),0}s&&r.force&<(l,{recursive:!0,force:!0});let u=new B,w=u.getDefaultEnv()??"prod",h;try{h=await U({creds:u,env:w,log:()=>{}})}catch(f){if(f instanceof J)return process.stderr.write("error: not authenticated. Run `kane-cli login` first.\n"),2;throw f}if(!h.basicAuth)return process.stderr.write("error: TMS basic auth could not be resolved. Run `kane-cli login` again.\n"),2;try{let f=G(w);await st({tmsBaseUrl:f.tmsBaseUrl,testcaseId:e.testcase_id,auth:h.basicAuth,language:a,framework:"playwright",skipValidation:c.code_export?.skip_validation??!0,outDir:l,log:()=>{}})}catch(f){return process.stderr.write(`error: code export failed: ${f.message}
|
|
19
|
-
`),2}return process.stderr.write(`exported to ${l}
|
|
20
|
-
`),0}export{q as assertOrgMatchOrExit,ut as metaMatchesOrg,L as readMetaIfExists,Pe as resolveCurrentOrgId,Wt as runDeleteAction,Jt as runExportAction,ve as runListAction,Nt as runListTui,Me as runStatusAction};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as t}from"./chunk-JHNEE2MB.js";import"./chunk-5XTLIGWL.js";import"./chunk-UR6MHSHU.js";async function a(n,e,o){let{TmsClient:r}=await import("./tms-client-R5ZIAOBH.js"),i=new r(t(n).tmsBaseUrl,e,o);for await(let m of i.listProjectsStream({perPage:1,maxPages:1}))return}export{a as validateBasicAuth};
|