@testmuai/kane-cli 0.4.9 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ChromeProfilePicker-BOTCHMXH.js → ChromeProfilePicker-PIWZY4WH.js} +1 -1
- package/dist/{CliFeedbackPrompt-BV4VVYOY.js → CliFeedbackPrompt-URXCHBZ5.js} +1 -1
- package/dist/{CliUploadProgress-Y4H43W5T.js → CliUploadProgress-DMH3C3UZ.js} +1 -1
- package/dist/{ConfigView-JPBD47MS.js → ConfigView-NWNDNTKW.js} +1 -1
- package/dist/EvidenceViewOffer-HEBQ7C4H.js +2 -0
- package/dist/FolderPicker-5S23OTSY.js +2 -0
- package/dist/HelpView-YYKTP4JH.js +2 -0
- package/dist/{InfoBox-3ZLQZGUE.js → InfoBox-FPAWQZGQ.js} +1 -1
- package/dist/{LinksBox-UYMOQGSW.js → LinksBox-O5ZFYSK2.js} +1 -1
- package/dist/{ProfilesView-YUMYSOZ4.js → ProfilesView-SPECXHZE.js} +1 -1
- package/dist/{ProjectPicker-CJVGBY42.js → ProjectPicker-ANJ6NGNY.js} +1 -1
- package/dist/{SaveSessionPrompt-DFVUWTOK.js → SaveSessionPrompt-W2GWELOP.js} +1 -1
- package/dist/SingleShotApp-5TYM356H.js +2 -0
- package/dist/{SummaryBox-3VIRYWQA.js → SummaryBox-DJUDYML7.js} +1 -1
- package/dist/TestMdRunView-BIVXQE54.js +2 -0
- package/dist/{WhoamiView-GMM4V7ZV.js → WhoamiView-DH25ZD4C.js} +1 -1
- package/dist/{changelog-FNJ4P2IF.js → changelog-RCKUVBFL.js} +1 -1
- package/dist/{chunk-LPUQ4HWQ.js → chunk-2WVKOZ6W.js} +1 -1
- package/dist/chunk-2YQ6TW77.js +82 -0
- package/dist/chunk-3FN66LTP.js +3 -0
- package/dist/{chunk-FN6ZRV4C.js → chunk-4IOOBSNB.js} +1 -1
- package/dist/chunk-54TKNWXF.js +5 -0
- package/dist/{chunk-JBOXYLDH.js → chunk-5MTRNUAK.js} +1 -1
- package/dist/{chunk-WEPNJVBA.js → chunk-6E5UYAEB.js} +1 -1
- package/dist/{chunk-JQXARCVE.js → chunk-7AEC572G.js} +1 -1
- package/dist/{chunk-UJDIXFEE.js → chunk-7IBNOVML.js} +1 -1
- package/dist/chunk-7KDNH6JP.js +10 -0
- package/dist/{chunk-DKGNV3VP.js → chunk-7YRNLGUT.js} +1 -1
- package/dist/chunk-AFCEFOIK.js +4 -0
- package/dist/{chunk-2J3VB6DW.js → chunk-AM5WZPPY.js} +1 -1
- package/dist/{chunk-6PBX7QI7.js → chunk-C4LYBQT3.js} +2 -2
- package/dist/chunk-DJL47DYJ.js +8 -0
- package/dist/chunk-DTM4ZMMJ.js +102 -0
- package/dist/chunk-ELBPBHTE.js +26 -0
- package/dist/{chunk-RJFHOZG6.js → chunk-GEAWRRR7.js} +1 -1
- package/dist/{chunk-CY4HAOSP.js → chunk-H6QJ4YU7.js} +1 -1
- package/dist/chunk-HFXQU7UZ.js +2 -0
- package/dist/{chunk-WKJY6TRR.js → chunk-HZ46P2GR.js} +1 -1
- package/dist/chunk-I4B2KY4X.js +3 -0
- package/dist/{chunk-LZUTY7XS.js → chunk-IECUFWIZ.js} +1 -1
- package/dist/{chunk-7NTOV5DV.js → chunk-IU53F4ZV.js} +1 -1
- package/dist/chunk-J75KVNX5.js +18 -0
- package/dist/{chunk-AH36DUIX.js → chunk-LOQV5GME.js} +1 -1
- package/dist/chunk-MUPHP5W6.js +27 -0
- package/dist/chunk-NAYAVVTP.js +6 -0
- package/dist/chunk-NFOBDHZK.js +147 -0
- package/dist/{chunk-CLRWPXDJ.js → chunk-NLIOFVMP.js} +1 -1
- package/dist/chunk-P5XBCJYQ.js +7 -0
- package/dist/chunk-PISZLYS5.js +4 -0
- package/dist/{chunk-IO3PBDKN.js → chunk-PTP3WS3N.js} +1 -1
- package/dist/chunk-Q2I65L2W.js +6 -0
- package/dist/chunk-QCEWUUE6.js +55 -0
- package/dist/chunk-QO6PAA7Q.js +17 -0
- package/dist/{chunk-42WWGBRK.js → chunk-R5RHRG65.js} +1 -1
- package/dist/chunk-T4PKTWZ6.js +17 -0
- package/dist/{chunk-HYOST7EA.js → chunk-THEZSXZM.js} +1 -1
- package/dist/{chunk-VSJAOEBB.js → chunk-TJWU7DOO.js} +1 -1
- package/dist/{chunk-FTMJTGT4.js → chunk-TPG2T5GH.js} +1 -1
- package/dist/{chunk-HPJP7NES.js → chunk-UOGJUJCF.js} +1 -1
- package/dist/{chunk-MUZCEGJD.js → chunk-V2GYBVSM.js} +1 -1
- package/dist/{chunk-KLVCLGHX.js → chunk-XDERMCAU.js} +1 -1
- package/dist/chunk-Y44AETOW.js +2 -0
- package/dist/{chunk-QMAHNXS6.js → chunk-YCNCW4O4.js} +1 -1
- package/dist/{chunk-GBTPZGJB.js → chunk-YSIYPC4R.js} +1 -1
- package/dist/{chunk-JHSSBES2.js → chunk-ZWAZ4QU4.js} +1 -1
- package/dist/credentials-52QRPGET.js +2 -0
- package/dist/evidence-O4AON5FU.js +2 -0
- package/dist/exit-manager-IUHAXFJ6.js +2 -0
- package/dist/{generate-headless-ZRRQT56R.js → generate-headless-WG6ZPINI.js} +2 -2
- package/dist/index.js +75 -39
- package/dist/list-commands-VJAL4J3O.js +2 -0
- package/dist/login-flow-VZ2MITFA.js +2 -0
- package/dist/persist-recorded-session-XKPZX7HW.js +3 -0
- package/dist/pipeline-CADTHPDV.js +2 -0
- package/dist/{recording-banner-P6EKDS2Y.js → recording-banner-2TNKQHP2.js} +1 -1
- package/dist/require-project-folder-SJG5FQY6.js +2 -0
- package/dist/run-test-md-INJKPE2I.js +13 -0
- package/dist/{skill-installer-SU52XOIT.js → skill-installer-M6AREQQW.js} +1 -1
- package/dist/tcg-generate-VKFXR5JT.js +2 -0
- package/dist/testmd-actions-4QLHD74A.js +2 -0
- package/dist/{tms-client-NNYXLXZK.js → tms-client-VD3B3SMU.js} +1 -1
- package/dist/token-refresh-2HKIYD4Y.js +2 -0
- package/dist/{validate-basic-EKSOPOMF.js → validate-basic-FO7C2URG.js} +1 -1
- package/dist/{version-check-4K4JHG7B.js → version-check-PHZX5WS7.js} +1 -1
- package/package.json +8 -6
- package/dist/FolderPicker-M4RFRBYV.js +0 -2
- package/dist/HelpView-ZZYE2TKZ.js +0 -2
- package/dist/SingleShotApp-IOEEYVGJ.js +0 -2
- package/dist/TestMdRunView-MRSDDMSF.js +0 -2
- package/dist/chunk-3UCNDPTN.js +0 -2
- package/dist/chunk-7N5H4KTV.js +0 -5
- package/dist/chunk-AH4AXJML.js +0 -2
- package/dist/chunk-BH6EP2LD.js +0 -85
- package/dist/chunk-DXJ5FL25.js +0 -17
- package/dist/chunk-JO3QZB6D.js +0 -6
- package/dist/chunk-LJDFBQFR.js +0 -17
- package/dist/chunk-LOIRZFV3.js +0 -10
- package/dist/chunk-MDBXYXSC.js +0 -2
- package/dist/chunk-PUU7A26K.js +0 -11
- package/dist/chunk-QW5G7TX3.js +0 -60
- package/dist/chunk-SEU6OXMD.js +0 -6
- package/dist/chunk-UVBE3JJV.js +0 -103
- package/dist/chunk-XA7UFTB7.js +0 -27
- package/dist/chunk-YK63DTUC.js +0 -20
- package/dist/exit-manager-V2NW7A7U.js +0 -2
- package/dist/list-commands-M3JL6XBB.js +0 -2
- package/dist/login-flow-DOAIDKIV.js +0 -2
- package/dist/persist-recorded-session-3I4KMEXA.js +0 -3
- package/dist/pipeline-34CX3UBO.js +0 -2
- package/dist/require-project-folder-SEMMD3EG.js +0 -2
- package/dist/run-test-md-PXG4RFDI.js +0 -14
- package/dist/tcg-generate-5T6S2E7L.js +0 -2
- package/dist/testmd-actions-N7VS4FS6.js +0 -2
- package/dist/token-refresh-LSHPT46T.js +0 -2
package/dist/chunk-DXJ5FL25.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as m}from"./chunk-L5LI2JF4.js";import{c as h}from"./chunk-3UCNDPTN.js";import{randomUUID as N}from"crypto";import{mkdirSync as F,writeFileSync as f,appendFileSync as A,existsSync as v}from"fs";import{join as a}from"path";import{writeFileSync as w,mkdirSync as x,existsSync as I}from"fs";import{join as p,relative as j}from"path";function _(n){let t=Object.keys(n.frontmatter).length>0?m(n.frontmatter).trimEnd():"",s=["---"];return t&&s.push(t),s.push("---",""),s.push(`# ${n.heading}`,""),n.steps.forEach((i,r)=>{s.push(`## Step ${r+1}`,i,"")}),s.join(`
|
|
3
|
-
`)}function k(n,e){let t={},s={},i=e;for(let[r,l]of Object.entries(n)){if(r.startsWith("global.")||r.startsWith("secrets.user.")||r.startsWith("environment.")){let o=r.startsWith("secrets.user.");t[r]={value:l.value,secret:o,syntax:`{{${r}}}`,type:o?"secret":r.startsWith("environment.")?"environment":"global"},s[r]=r;continue}if(l.secret){let o=`secrets.user.${r}`;t[o]={value:l.value,secret:!0,syntax:`{{secrets.user.${r}}}`,type:"secret"},s[r]=o,i=i.replaceAll(`{{${r}}}`,`{{secrets.user.${r}}}`)}else{let o=`global.${r}`;t[o]={value:l.value,secret:!1,syntax:`{{global.${r}}}`,type:"global"},s[r]=o,i=i.replaceAll(`{{${r}}}`,`{{global.${r}}}`)}}return{variables:t,objective:i,keyMap:s}}var y=/\{\{\s*(?:global|secrets\.user|environment)\.([^{}]+?)\s*\}\}/g;function c(n){return typeof n!="string"||!n.includes("{{")?n:n.replace(y,"{{$1}}")}function d(n){if(typeof n=="string")return c(n);if(Array.isArray(n))return n.map(e=>d(e));if(n&&typeof n=="object"){let e={};for(let[t,s]of Object.entries(n))e[t]=d(s);return e}return n}var L=new Set(["username","access_key","oauth","profile","project_id","folder_id"]),$=new Set(["model","env"]),g=class{constructor(e){this.opts=e}objectives=[];flushed=!1;lastWrittenPath=null;lastCollisionSuffixed=!1;appendObjective(e){this.objectives.push(e)}flush(){if(this.flushed||(this.flushed=!0,this.objectives.length===0))return;let e=this.opts.getName();if(!e)return;let t=p(this.opts.cwd,".testmuai","tests");try{x(t,{recursive:!0})}catch(u){process.stderr.write(`
|
|
4
|
-
\u26A0 Failed to create ${j(this.opts.cwd,t)}/
|
|
5
|
-
${u.message}
|
|
6
|
-
Your test recording was NOT saved.
|
|
7
|
-
|
|
8
|
-
`);return}let s=p(t,`${e}_test.md`),i=2,r=!1;for(;I(s);)s=p(t,`${e}-${i}_test.md`),i++,r=!0;let l=d(E(this.opts.getResolvedGlobal())),o=_({frontmatter:l,heading:`Session: ${e}`,steps:this.objectives.map(c)});try{w(s,o,"utf8")}catch(u){process.stderr.write(`
|
|
9
|
-
\u26A0 Failed to save your test recording.
|
|
10
|
-
${u.message}
|
|
11
|
-
Path: ${s}
|
|
12
|
-
|
|
13
|
-
`);return}this.lastWrittenPath=s,this.lastCollisionSuffixed=r}};function E(n){let e={};for(let[t,s]of Object.entries(n))L.has(t)||$.has(t)||(e[t]=s);return e}var D=a(h,"sessions"),b=class{sessionId;sessionDir;runs=[];_flows=[];_nextIndex=0;_started=!1;_testId=null;_testcaseId=null;_projectId=null;_orgId=null;_uploadStatus="pending";_uploadAttempts=0;_uploadError=null;_firstObjective=null;_firstUrl=null;_auteurVariables={};_screenshotSas=null;_model="";_environment="";_profile=null;_plan=null;_startedAt="";_remoteLogger=null;_earlyLogBuffer=[];_recorder=null;_resolvedGlobal={};_sessionName=null;_recordingEnabled=!0;_stepRunRecords=[];constructor(e){this.sessionId=N();let t=e?.baseDir?a(e.baseDir,"sessions"):D;this.sessionDir=a(t,this.sessionId)}setResolvedGlobal(e){this._resolvedGlobal={...this._resolvedGlobal,...e}}setSessionName(e){this._sessionName=e}get sessionName(){return this._sessionName}setRecordingEnabled(e){this._recordingEnabled=e}get recorder(){return this._recorder}flushRecorder(){try{this._recorder?.flush()}catch(e){process.stderr.write(`[recorder] flush failed: ${e.message}
|
|
14
|
-
`)}}start(e){if(!this._started){this._started=!0,this._model=e.model,this._environment=e.environment,this._profile=e.profile,this._startedAt=new Date().toISOString();try{F(this.sessionDir,{recursive:!0}),this._recorder=new g({cwd:process.cwd(),getResolvedGlobal:()=>this._resolvedGlobal,getName:()=>this._sessionName});let t={session_id:this.sessionId,started_at:this._startedAt,model:e.model,environment:e.environment,profile:e.profile,plan:this._plan,objectives:[],runs:[],status:"in_progress"};f(a(this.sessionDir,"session.json"),JSON.stringify(t,null,2)+`
|
|
15
|
-
`)}catch{}this._log(`SESSION START session_id=${this.sessionId}`),this._log(`CONFIG model=${e.model} env=${e.environment} profile=${e.profile}`),this._earlyLogBuffer.push({level:"info",event:"SESSION_START",message:"Session started",context:{session_id:this.sessionId}},{level:"info",event:"CONFIG",message:"Session config",context:{model:e.model,environment:e.environment,profile:e.profile}})}}setPlan(e){this._plan=e;let t={level:"info",event:"SESSION_INFO",message:"Session info",context:{session_id:this.sessionId,plan:e??null}};this._remoteLogger?this._remoteLogger.log(t.level,t.event,t.message,t.context):this._earlyLogBuffer.push(t)}get plan(){return this._plan}setRemoteLogger(e){this._remoteLogger=e;for(let t of this._earlyLogBuffer)e.log(t.level,t.event,t.message,t.context);this._earlyLogBuffer=[]}get hasRemoteLogger(){return this._remoteLogger!==null}setAuteurVariables(e){Object.assign(this._auteurVariables,e)}get auteurVariables(){return this._auteurVariables}setScreenshotSas(e){this._screenshotSas=e}get screenshotSas(){return this._screenshotSas}get screenshotBaseUrl(){return this._screenshotSas?`${this._screenshotSas.base_url}/${this._screenshotSas.container}`:""}get startedAt(){return this._startedAt||new Date().toISOString()}log(e,t,s,i){if(t===void 0){this._log(e);let o=e.indexOf(" "),u=o>0?e.slice(0,o):e,R=o>0?e.slice(o+1):"",S=/fail|error/i.test(e)?"error":"info";this._remoteLogger?.log(S,u,R||e);return}let r=e,l=s;this._log(`${t} ${l}`),this._remoteLogger?.log(r,t,l,i)}logStep(e,t,s){this._log(`${e} ${t}`);let i=this._nextIndex>0?this._nextIndex-1:0;this._remoteLogger?.logStep(i,e,t,s)}logCommand(e){this._log(`COMMAND ${e}`)}logRunStart(e,t,s){this._log(`RUN ${e} START objective="${t.slice(0,100)}" url=${s}`),this._remoteLogger?.setRunIndex(e),this._remoteLogger?.log("info","RUN_START",`Run ${e} started`,{run_index:e,objective:t,url:s})}logRunEnd(e,t,s,i){let r=(s??0).toFixed(1),l=(i??"").slice(0,100);this._log(`RUN ${e} END status=${t} duration=${r}s summary="${l}"`),this._remoteLogger?.log("info","RUN_END",`Run ${e} ended`,{run_index:e,status:t,duration:s??0,summary:i??""}),t!=="failed"&&t!=="error"&&this._remoteLogger?.discardSteps(e)}escalateRun(e){this._remoteLogger?.escalate(e)}logChromeLaunch(e,t){this._log(`CHROME LAUNCH port=${e} endpoint=${t}`),this._remoteLogger?.log("info","CHROME_LAUNCH","Chrome launched",{port:e,cdp_endpoint:t})}async finish(e="complete"){this._log(`SESSION END status=${e} total_runs=${this.runs.length}`),this._remoteLogger?.log("info","SESSION_END","Session ended",{status:e,total_runs:this.runs.length}),await this._remoteLogger?.shutdown();let t={session_id:this.sessionId,started_at:this._startedAt,ended_at:new Date().toISOString(),model:this._model,environment:this._environment,profile:this._profile,plan:this._plan,status:e,total_runs:this.runs.length,test_id:this._testId,testcase_id:this._testcaseId,commit_id:this.sessionId,project_id:this._projectId,upload_status:this._uploadStatus,upload_attempts:this._uploadAttempts,last_upload_attempt:this._uploadAttempts>0?new Date().toISOString():null,upload_error:this._uploadError,runs:this.runs.map(s=>({index:s.index,objective:s.objective,status:s.status,summary:s.summary,run_dir:s.run_dir}))};v(this.sessionDir)&&f(a(this.sessionDir,"session.json"),JSON.stringify(t,null,2)+`
|
|
16
|
-
`),this.flushRecorder(),this._recorder=null}nextRunIndex(){return this._nextIndex}addRunResult(e,t){this.runs.push(e),this._nextIndex+=t??1,this._recordingEnabled&&this._recorder?.appendObjective(e.objective)}getContext(){return{prior_runs:this.runs.map(e=>({index:e.index,objective:e.objective,summary:e.summary,status:e.status,memory:e.context.memory,variables:e.context.variables,pointer:e.context.pointer}))}}addFlow(e){let t={...e,index:this._flows.length+1};return this._flows.push(t),t}getFlows(){return[...this._flows]}getFlow(e){return this._flows.find(t=>t.index===e)}clearFlows(){this._flows=[]}recordStepRun(e){this._stepRunRecords.push(e)}getStepRunRecords(){return[...this._stepRunRecords]}getRunsAsStepRecords(){return this.runs.map((e,t)=>({testmdStepIndex:t+1,runIndex:e.index,totalRunDirs:e.run_dirs?.length??1}))}snapshot(){return{runsLen:this.runs.length,nextRunIndex:this._nextIndex,stepRunRecordsLen:this._stepRunRecords.length}}rollback(e){this.runs.length=e.runsLen,this._nextIndex=e.nextRunIndex,this._stepRunRecords.length=e.stepRunRecordsLen}setTestId(e){this._testId=e}get testId(){return this._testId}setTestcaseId(e){this._testcaseId=e}get testcaseId(){return this._testcaseId}setProjectId(e){this._projectId=e}setOrgId(e){this._orgId=e}get orgId(){return this._orgId}setFirstRun(e,t){this._firstObjective||(this._firstObjective=e,this._firstUrl=t)}get firstObjective(){return this._firstObjective}get firstUrl(){return this._firstUrl}getRunDirs(){let e=[];for(let t of this.runs)t.run_dirs&&t.run_dirs.length>0?e.push(...t.run_dirs):t.run_dir&&e.push(t.run_dir);return e}getRunObjectives(){let e=[];for(let t of this.runs)t.flow_objectives&&t.flow_objectives.length>0?e.push(...t.flow_objectives):e.push(t.objective);return e}getRunMetadata(){let e=[];for(let t of this.runs)if(t.perFlowMetadata&&t.perFlowMetadata.length>0)e.push(...t.perFlowMetadata);else{let s={resultCode:t.resultCode,reasonCode:t.reasonCode,errorMessage:t.status==="failed"?t.summary??null:null,summary:t.summary,oneLiner:t.oneLiner},i=t.run_dirs?.length??1;for(let r=0;r<i;r++)e.push(s)}return e}setUploadStatus(e,t){this._uploadStatus=e,this._uploadAttempts+=1,this._uploadError=t??null}_log(e){if(!(!this._started||!v(this.sessionDir)))try{let t=new Date().toISOString().slice(0,19).replace("T"," "),s=a(this.sessionDir,"tui.log");A(s,`[${t}] ${e}
|
|
17
|
-
`)}catch{}}};export{_ as a,k as b,b as c};
|
package/dist/chunk-JO3QZB6D.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as l,d,e as m,f as g,g as S,k as y}from"./chunk-AH4AXJML.js";import{a as u}from"./chunk-QMAHNXS6.js";import{g as p,h as f}from"./chunk-LOIRZFV3.js";import{existsSync as s,mkdirSync as h,readFileSync as C,renameSync as w,writeFileSync as R}from"fs";import{join as x}from"path";function G(e){y(l(e));let r=l(e);if(!s(r))return;let n=x(r,"meta.json"),o=m(e);if(s(n)&&!s(o))try{h(d(e),{recursive:!0}),w(n,o)}catch(t){process.stderr.write(`warn: meta.json migration failed: ${t.message}
|
|
3
|
-
`)}let a=S(e);if(s(a)){let t="python";try{let i=new u().load();i.code_export?.language&&(t=i.code_export.language)}catch{}let c=g(e,"playwright",t);if(!s(c))try{w(a,c)}catch(i){process.stderr.write(`warn: generated-code migration failed: ${i.message}
|
|
4
|
-
`)}}if(s(o))try{let t=JSON.parse(C(o,"utf8"));"md5sum"in t&&(delete t.md5sum,R(o,JSON.stringify(t,null,2)+`
|
|
5
|
-
`,"utf8"))}catch(t){process.stderr.write(`warn: meta.json md5sum strip failed: ${t.message}
|
|
6
|
-
`)}}async function O(e){if(!e.isInteractive)return{recovered:!1};if(E(e.creds))return{recovered:!1};let{SingleShotApp:r}=await import("./SingleShotApp-IOEEYVGJ.js"),{ScrollbackProvider:n}=await import("./scrollback-6GINSTL2.js"),{render:o}=await import("./build-JIKYOZUH.js"),a=await import("./react-QWOAB3TB.js"),t={current:null},c={current:!1},{waitUntilExit:i,unmount:v}=o(a.default.createElement(n,null,a.default.createElement(r,{resultRef:t,mode:"login",loginCompleteRef:c})),{exitOnCtrlC:!1});f(()=>v()),await i();try{process.stdin.setRawMode?.(!1)}catch{}return process.stdout.write("\x1B[?25h"),c.current?{recovered:!0}:(p(0,"Startup gate cancelled"),{recovered:!1})}function E(e){let r=e.getActiveProfile(),n=e.getDefaultEnv();if(!r||!!!(e.loadBasicAuth(r,n)||e.loadCredentials(r,n)))return!1;let a=e.loadProfileConfig(r,n)??{};return!!a.project_id&&!!a.folder_id}export{G as a,O as b};
|
package/dist/chunk-LJDFBQFR.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as m}from"./chunk-LPUQ4HWQ.js";import{b as f,c as j}from"./chunk-VE3SUJMA.js";import{a as g}from"./chunk-HPJP7NES.js";var _="KaneAI Generated",E="Untitled";async function p(e){let r=e.config.load(),d=new m(g(e.env).tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key),l=e.projectName??_,o=e.folderName??E,t=r.project_id??null,s=r.project_name??null;if(!t){let a=(await d.listProjects()).find(n=>n.name===l);if(a)t=a.project_id,s=a.name,e.log("info","ENSURE_PROJECT_FOUND","Found default project",{project_id:t,name:s});else{let n=await d.createProject(l);t=n.id,s=n.name,e.log("info","ENSURE_PROJECT_CREATED","Created default project",{project_id:t,name:s})}f(e.creds,e.config,e.profile,e.env,{projectId:t,projectName:s})}let c=r.folder_id??null,i=r.folder_name??null,u=!r.project_id;if(!c||u){let a=(await d.listFolders(t)).find(n=>n.name===o);if(a)c=a.id,i=a.name,e.log("info","ENSURE_FOLDER_FOUND","Found default folder",{folder_id:c,name:i});else{let n=await d.createFolder(t,o);c=n.id,i=n.name,e.log("info","ENSURE_FOLDER_CREATED","Created default folder",{folder_id:c,name:i})}f(e.creds,e.config,e.profile,e.env,{folderId:c,folderName:i})}return{projectId:t,projectName:s??l,folderId:c,folderName:i??o}}function N(e,r,d){let l=e.loadProfileConfig(r,d)??{};return{projectId:l.project_id??null,folderId:l.folder_id??null}}function A(e,r){return e.projectId===null||e.folderId===null||r===null?"needs-picker":r.project==="ok"&&r.folder==="ok"?"ok":r.project==="error"&&r.folder==="error"?"ok-tms-degraded":"needs-picker"}var k=(e,r)=>`error: profile "${e}" (${r}) has no project/folder configured AND no TMS credentials were available to auto-configure one.
|
|
3
|
-
|
|
4
|
-
discover IDs:
|
|
5
|
-
kane-cli projects list --search "<keyword>" --limit 10
|
|
6
|
-
kane-cli folders list --project <project-id> --search "<keyword>" --limit 10
|
|
7
|
-
|
|
8
|
-
create one:
|
|
9
|
-
kane-cli projects create "<project-name>"
|
|
10
|
-
kane-cli folders create "<folder-name>" --project <project-id>
|
|
11
|
-
|
|
12
|
-
set them:
|
|
13
|
-
kane-cli config project <project-id>
|
|
14
|
-
kane-cli config folder <folder-id>
|
|
15
|
-
`;function C(e,r){return k(e,r)}function D(e){return`info: auto-configured project "${e.projectName}" (${e.projectId}) and folder "${e.folderName}" (${e.folderId}). Change with: kane-cli config project <id> / kane-cli config folder <id>.`}function L(e){return`${JSON.stringify({type:"project_folder_auto_defaulted",project_id:e.projectId,project_name:e.projectName,folder_id:e.folderId,folder_name:e.folderName})}
|
|
16
|
-
`}async function S(e){if(e.isLocal)return e.log("info","GATE_SKIP_LOCAL","Gate skipped (--local)",{}),{status:"skip",reason:"local"};j(e.creds,e.config,e.profile,e.env,e.log);let r=N(e.creds,e.profile,e.env),d=null;if(r.projectId!==null){let o=g(e.env);d=await new m(o.tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key).validateProjectFolder(r.projectId,r.folderId??""),e.log("info","GATE_VALIDATE","TMS project/folder validation",{project:d.project,folder:d.folder,folder_was_cached:r.folderId!==null})}else r.folderId!==null&&(f(e.creds,e.config,e.profile,e.env,{folderId:null,folderName:null}),e.log("warn","GATE_CLEARED_ORPHAN_FOLDER","Cleared orphan folder (no project cached)",{folder_id:r.folderId}),r.folderId=null);let l=A(r,d);if(l==="ok")return{status:"ok",projectId:r.projectId,folderId:r.folderId};if(l==="ok-tms-degraded")return e.log("warn","GATE_TMS_DEGRADED","TMS validation failed; using cached IDs",{project_id:r.projectId,folder_id:r.folderId}),{status:"ok",projectId:r.projectId,folderId:r.folderId};if(d){let o={};d.project==="missing"?(o.projectId=null,o.projectName=null,o.folderId=null,o.folderName=null):d.folder==="missing"&&(o.folderId=null,o.folderName=null),Object.keys(o).length>0&&(f(e.creds,e.config,e.profile,e.env,o),e.log("info","GATE_CLEARED_STALE","Cleared stale cached IDs before re-resolve",{project_cleared:d.project==="missing",folder_cleared:d.folder==="missing"||d.project==="missing"}))}try{let o=await p({creds:e.creds,config:e.config,profile:e.profile,env:e.env,tmsCreds:e.tmsCreds,log:e.log}),t={projectId:o.projectId,projectName:o.projectName,folderId:o.folderId,folderName:o.folderName};return e.log("info","GATE_AUTO_DEFAULTED","Auto-configured project/folder",{project_id:t.projectId,project_name:t.projectName,folder_id:t.folderId,folder_name:t.folderName}),e.onAnnounce?e.onAnnounce(t):process.stderr.write(`${D(t)}
|
|
17
|
-
`),{status:"ok",projectId:t.projectId,folderId:t.folderId,autoDefaulted:t}}catch(o){let t=C(e.profile,e.env);if(e.log("error","GATE_FATAL","Auto-default failed",{profile:e.profile,env:e.env,cached_project_id:r.projectId,cached_folder_id:r.folderId,validation:d,error:o instanceof Error?o.message:String(o)}),e.onFatalExit)e.onFatalExit(t);else{process.stderr.write(t);let{shutdown:s}=await import("./exit-manager-V2NW7A7U.js");s(2,"Project/folder gate failed")}return{status:"cancelled"}}}export{p as a,N as b,A as c,C as d,D as e,L as f,S as g};
|
package/dist/chunk-LOIRZFV3.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
var v=()=>!!process.env.KANE_DEV_MODE,t=[],u=!1,f=null,c=null,a=null,i=null;function x(e){i=e}function m(){return i}function h(){return u}function y(e,r){t=t.filter(o=>o.name!==e),t.push({name:e,fn:r})}function R(e){t=t.filter(r=>r.name!==e)}function w(e,r){let o=t.find(n=>n.name===e);if(!o)return;t=t.filter(n=>n.name!==e);let s=!0;try{o.fn()}catch(n){s=!1,process.stderr.write(`[exit-manager] cleanup(${e}) failed: ${n instanceof Error?n.message:String(n)}
|
|
3
|
-
`)}r&&s&&v()&&process.stderr.write(`[exit-manager] cleanup(${e}): ${r}
|
|
4
|
-
`)}function l(e,r,o=!1){if(u){process.exit(f??e);return}if(u=!0,f=e,o&&i)try{i.log("error","CRASH",r),i.shutdownSync()}catch{}let s=[...t].reverse(),n=[];for(let g of s)try{g.fn(),n.push(g.name)}catch(d){process.stderr.write(`[exit-manager] cleanup(${g.name}) failed: ${d instanceof Error?d.message:String(d)}
|
|
5
|
-
`)}if(t=[],v()&&(process.stderr.write(`[exit-manager] shutdown(${e}): ${r}
|
|
6
|
-
`),n.length>0&&process.stderr.write(`[exit-manager] cleaned up: ${n.join(", ")}
|
|
7
|
-
`)),o&&a){try{a()}catch{}process.stderr.write(`
|
|
8
|
-
Kane CLI crashed unexpectedly: ${r}
|
|
9
|
-
`+(n.length>0?`Resources cleaned up (${n.join(", ")}).
|
|
10
|
-
`:"")),process.exit(e);return}if(c&&!o){c();return}process.exit(e)}function E(e){c=e}function $(e){a=e}var p=!1;function S(){p||(p=!0,process.on("SIGINT",()=>{l(130,"Received SIGINT",!0)}),process.on("SIGTERM",()=>{l(143,"Received SIGTERM",!0)}),process.on("uncaughtException",e=>{l(1,`Uncaught exception: ${e.message}`,!0)}),process.on("unhandledRejection",e=>{l(1,`Unhandled rejection: ${String(e)}`,!0)}))}function L(){t=[],u=!1,f=null,c=null,a=null,i=null,p=!1}export{x as a,m as b,h as c,y as d,R as e,w as f,l as g,E as h,$ as i,S as j,L as k};
|
package/dist/chunk-MDBXYXSC.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
function r(e){return{url:`${e.tmsBaseUrl}/kane-cli/v1/test-case/${e.testcaseId}/code`,body:{code_name:"kane-cli-trigger",language:e.codeExport.language,framework:"playwright",folder_name:"",accessibility:"false",skipCodeValidation:e.codeExport.skipValidation}}}function o(e){return`${e.tmsBaseUrl}/kane-cli/v1/test-case/${e.testcaseId}/codes?page=1&per_page=10`}export{r as a,o as b};
|
package/dist/chunk-PUU7A26K.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{c as O,h as F}from"./chunk-AH4AXJML.js";import{a as k}from"./chunk-L5LI2JF4.js";import{readFileSync as se,existsSync as ne}from"fs";import{basename as C,dirname as oe,isAbsolute as re,resolve as L}from"path";var u=class extends Error{constructor(s,o,n){super(`[${o}${n!=null?`:${n}`:""}] ${s}`);this.file=o;this.line=n;this.name="TestMdParseError"}},U=new Set(["username","access_key","oauth","profile","project_id","folder_id"]),D=new Set(["mode","max_steps","timeout","global_context","local_context","variables","session_context","code_export","code_language","url","target","chrome_profile","cdp_endpoint","ws_endpoint","headless","on_lock_conflict"]),$=new Set(["optional"]),V=new Set(["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"]),Q=new Set(["mode","on_lock_conflict"]);function R(e,t){let s=t.split(`
|
|
3
|
-
`),{global:o,bodyStartLine:n}=X(e,s),{title:r,steps:i}=Z(e,s,n);return{path:e,title:r,global:o,steps:i}}function X(e,t){if(t[0]?.trim()!=="---")return{global:{},bodyStartLine:0};let s=-1;for(let r=1;r<t.length;r++)if(t[r].trim()==="---"){s=r;break}if(s===-1)throw new u("frontmatter is missing closing '---'",e,1);let o=t.slice(1,s).join(`
|
|
4
|
-
`),n;try{n=k(o)??{}}catch(r){throw new u(`invalid YAML in frontmatter: ${r.message}`,e,1)}if(M(e,n,"frontmatter",1),n.on_lock_conflict!==void 0){let r=n.on_lock_conflict;if(r!=="readonly"&&r!=="fail"&&r!=="wait")throw new u(`on_lock_conflict must be 'readonly' | 'fail' | 'wait', got: ${JSON.stringify(r)}`,e,1)}return E(e,n,1),{global:n,bodyStartLine:s+1}}function Z(e,t,s){let o,n=s;for(;n<t.length&&t[n].trim()==="";)n++;let r=n<t.length?/^#\s+(.+?)\s*$/.exec(t[n]):null;r&&(o=r[1],n++);let i=[];for(let d=n;d<t.length;d++)/^##\s/.test(t[d])&&i.push(d);let a=[];for(let d=0;d<i.length;d++){let c=i[d],p=i[d+1]??t.length,m=t[c].replace(/^##\s+/,"").trim(),g=t.slice(c+1,p),{config:l,body:f,optional:h}=ee(e,c+1,g);a.push({index:d+1,heading:m,config:l,body:f,headingLine:c+1,optional:h})}return{title:o,steps:a}}function ee(e,t,s){let o=0;for(;o<s.length&&s[o].trim()==="";)o++;let n,r=t;if(o<s.length&&/^```yaml\s*$/.test(s[o])){let l=o;r=t+l,o++;let f=-1;for(;o<s.length;){if(/^```\s*$/.test(s[o])){f=o;break}o++}if(f===-1)throw new u("step-config fenced ```yaml block is not closed",e,r);let h=s.slice(l+1,f).join(`
|
|
5
|
-
`);try{n=k(h)??{}}catch(I){throw new u(`invalid YAML in step config: ${I.message}`,e,r)}o=f+1}let i=te(s.slice(o)),a=i.filter(l=>l.trim()!=="");if(a.length>0&&/^@session\s+/.test(a[0].trim()))throw new u("@session is no longer supported (iteration 3); use @import instead",e,t);let d=/^@import\s+(\S.*)$/,p=i.filter(l=>d.test(l.trim())).length>0;if(p&&a.length!==1)throw new u("step body must be exactly one of prose / @import",e,t);let m=!1,g;if(n){if(M(e,n,p?"step config (ref)":"step config (objective)",r),p||E(e,n,r),typeof n.optional=="boolean")m=n.optional;else if(n.optional!==void 0)throw new u(`step config 'optional' must be boolean: got ${typeof n.optional}`,e,r);let l={...n};delete l.optional,Object.keys(l).length>0&&(g=l)}return p?{body:{kind:"import_ref",path:d.exec(a[0].trim())[1].trim()},optional:m}:{body:{kind:"objective",text:i.join(`
|
|
6
|
-
`).trim()},config:g,optional:m}}function te(e){let t=0,s=e.length;for(;t<s&&e[t].trim()==="";)t++;for(;s>t&&e[s-1].trim()==="";)s--;return e.slice(t,s)}function E(e,t,s){let o=t.variables;if(o==null)return;if(typeof o!="object"||Array.isArray(o))throw new u("variables must be an object map",e,s);let n={};for(let[r,i]of Object.entries(o))if(typeof i=="string")n[r]={value:i};else if(i&&typeof i=="object"&&!Array.isArray(i)&&typeof i.value=="string")n[r]=i;else throw new u(`variable '${r}' must be a string or { value: ... } object`,e,s);t.variables=n}function M(e,t,s,o){for(let n of Object.keys(t)){if(U.has(n))throw new u(`auth/identity keys are CLI-only: ${n}`,e,o);if(s==="frontmatter"){if($.has(n))throw new u(`step-only key in frontmatter: ${n}`,e,o);if(!D.has(n))throw new u(`unknown config key: ${n}`,e,o)}else if(s==="step config (objective)"){if(!D.has(n)&&!$.has(n))throw new u(`unknown config key: ${n}`,e,o);if(V.has(n))throw new u(`chrome config is global-only: ${n}`,e,o);if(Q.has(n))throw new u(`'${n}' is run-level and cannot be set per-step`,e,o)}else if(!$.has(n))throw new u(`step config on @import may only contain 'optional': got ${n}`,e,o)}}var T=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"],b=class extends Error{constructor(t){super(t),this.name="TestMdResolveError"}};function Be(e){let t=L(e),s=A(t),o=ie(s.global),n=[];return B(s,[],n,[],t),n.forEach((i,a)=>i.flatIndex=a+1),{rootPath:t,rootTitle:s.title,rootGlobal:s.global,rootSteps:s.steps,chrome:o,steps:n}}function A(e){if(!ne(e))throw new b(`@import path not found: ${e}`);let t=se(e,"utf8");return R(e,t)}function B(e,t,s,o,n){if(t.includes(e.path)){let i=[...t,e.path].map(a=>C(a)).join(" \u2192 ");throw new b(`cyclic reference: ${i}`)}t.push(e.path);let r=o.length===0;for(let i of e.steps){let a=i.body.kind!=="objective";if(i.optional&&a&&!r)throw new b(`intermediate-ref 'optional' is not supported in v1: ${e.path}:${i.headingLine}`);let d={file:e.path,stepIndex:i.index,heading:i.heading,optional:i.optional??!1};if(i.body.kind==="objective"){let g=ae(e.global,i.config);s.push({flatIndex:0,objective:i.body.text,sourceFile:e.path,trace:[...o,d],config:g,parsedConfig:i.config,optional:i.optional??!1});continue}let c=oe(e.path),p=re(i.body.path)?i.body.path:L(c,i.body.path);if(C(p).endsWith("_test.md"))throw new b(`cannot @import a test file: only helpers may be imported (got ${p})`);let m=A(p);B(m,t,s,[...o,d],n)}t.pop()}function ie(e){let t={};for(let s of T)e[s]!==void 0&&(t[s]=e[s]);return t}function ae(e,t){let s={};for(let[o,n]of Object.entries(e))T.includes(o)||(s[o]=n);return{...s,...t??{}}}import{mkdirSync as _,writeFileSync as Ee}from"fs";import{join as S}from"path";import{createHash as le}from"crypto";function j(e){if(e==null)return null;if(Array.isArray(e))return e.map(j);if(typeof e=="object"){let t={};for(let s of Object.keys(e).sort()){let o=e[s];o!==void 0&&(t[s]=j(o))}return t}return e}function de(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},s=JSON.stringify(j(t));return le("md5").update(e.body.text).update(`
|
|
7
|
-
`).update(s).digest("hex")}function x(e){return de({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 pe,mkdirSync as ce,readFileSync as fe}from"fs";import{dirname as ue,basename as K}from"path";function w(e){let t=e.outPath??O(e.sourcePath);ce(ue(t),{recursive:!0});let s=[];s.push("---"),s.push(`test: ../${K(e.sourcePath)}`),s.push(`status: ${e.overallStatus}`),s.push(`started: ${e.startedISO}`),s.push(`duration_s: ${e.durationS}`),s.push(`session_id: ${e.sessionId}`),s.push("---",""),s.push(`# ${e.title??K(e.sourcePath)} \u2014 Result`,"");for(let o=0;o<e.rootSteps.length;o++){let n=e.rootSteps[o],r=e.outcomes.find(i=>i.rootStepIndex===o+1);if(s.push(ge(n,r)),n.body.kind==="objective"&&r?.stepMd5&&s.push(`md5: ${r.stepMd5}`),r?.status==="failed"&&r.reason&&s.push(`Reason: ${r.reason}`),r?.softFailures?.length)for(let i of r.softFailures){let a=i.reason?`: ${i.reason}`:"";s.push(`\u26A0 optional sub-step ${i.subStepIndex} failed${a}`)}n.body.kind==="objective"&&r?.status!=="skipped"&&s.push(n.body.text),s.push("")}return pe(t,s.join(`
|
|
8
|
-
`),"utf8"),t}function ge(e,t){if(!t)return`## ${e.heading} (no outcome)`;let s=t.duration_s!=null?`${t.duration_s}s`:"\u2014";if(t.status==="skipped")return`## ${e.heading} \u23ED skipped`;let o=t.softFailed?" (optional)":"";if(t.refKind&&t.status==="passed"){let n=t.helperResultRelPath?` \u2192 ${t.helperResultRelPath}`:"";return`## ${e.heading} \u2713 passed (via @${t.refKind} ${t.refLabel} \u2014 ${t.inlinedCount} inlined steps, ${s}${n})`}if(t.refKind&&t.status==="failed"){let n=t.failedSubStepIndex&&t.failedSubStepIndex.length>0?` \u2014 at sub-step ${t.failedSubStepIndex.join(" \u2192 sub-step ")}`:"",r=t.helperResultRelPath?` \u2192 ${t.helperResultRelPath}`:"";return`## ${e.heading} \u2717 failed${o} (via @${t.refKind} ${t.refLabel}${n}, ${s}${r})`}return t.status==="passed"?`## ${e.heading} \u2713 passed (${s})`:`## ${e.heading} \u2717 failed${o} (${s})`}var me=/^##\s+(.+?)\s+(✓ passed|✗ failed(?:\s+\(optional\))?|⏭ skipped)(?:\s+\((.*)\))?\s*$/,he=/via\s+@\w+\s+(\S+).*?(?:→\s+(\S+))?\s*$/,Se=/^md5:\s+([a-f0-9]{32})\s*$/;function Je(e){let s=fe(e,"utf8").split(`
|
|
9
|
-
`),o="passed";if(s[0]?.trim()==="---")for(let r=1;r<s.length&&s[r].trim()!=="---";r++){let i=/^status:\s+(passed|failed|interrupted)\s*$/.exec(s[r]);i&&(o=i[1])}let n=[];for(let r=0;r<s.length;r++){let i=me.exec(s[r]);if(!i)continue;let a=i[1],d=i[2],c=i[3]??"",p=d.startsWith("\u2713")?"passed":d.startsWith("\u23ED")?"skipped":"failed";if(/via\s+@/.test(c)){let g=he.exec(c),l=g?.[1]??"",f=g?.[2]??null;n.push({kind:"import",heading:a,status:p,md5:null,importPath:l,helperResultRelPath:f})}else{let g=null;for(let l=r+1;l<s.length&&!/^##\s/.test(s[l]);l++){if(s[l].trim()==="")continue;let f=Se.exec(s[l]);if(f){g=f[1];break}break}n.push({kind:"objective",heading:a,status:p,md5:g})}}return{overallStatus:o,steps:n}}import{copyFileSync as be,existsSync as ye,mkdirSync as ve,writeFileSync as Re}from"fs";import{join as y}from"path";function H(e){for(let t=0;t<e.totalRunDirs;t++){let s=e.runIndex+t,o=y(e.sessionDir,"runs",String(s)),n=y(e.stagingStepDir,"flows",String(t));ve(n,{recursive:!0});let r=[y(o,"run-test","actions.ndjson"),y(o,"actions.ndjson")],i=y(n,"actions.ndjson"),a=!1;for(let d of r)if(ye(d)){be(d,i),a=!0;break}a||Re(i,"")}}import{basename as xe,dirname as we,join as Ie}from"path";function G(e){let t=xe(e);return t.endsWith("_test.md")?t.slice(0,-8):t.endsWith(".md")?t.slice(0,-3):t}function ke(e){if(e.length<2)throw new Error("helperOutputDirName requires trace length >= 2 (root + at least one helper)");let t=G(e[0].file),s=G(e[e.length-1].file),o=e.slice(0,-1).map(n=>String(n.stepIndex));return`helper-output-${s}-${t}-${o.join("-")}`}function v(e){if(e.length<2)throw new Error("helperOutputDirPath requires trace length >= 2");let t=e[e.length-1].file;return Ie(we(t),ke(e))}import{existsSync as N,mkdirSync as $e,rmSync as je,cpSync as _e}from"fs";function W(e,t){N(e)&&(N(t)&&je(t,{recursive:!0,force:!0}),$e(t,{recursive:!0}),_e(e,t,{recursive:!0}))}import{readFileSync as Pe}from"fs";import{join as Oe,relative as Fe}from"path";function J(e){let t=De(e.resolvedTest,e.runByStep),s=new Map;for(let o of t.values()){let n=s.get(o.helperFile);n||(n=R(o.helperFile,Pe(o.helperFile,"utf8")),s.set(o.helperFile,n));let r=[],i=!1;for(let d of n.steps){let c=d.index,p=o.resolvedSteps.filter(l=>l.trace[o.helperDepth].stepIndex===c);if(p.length===0){r.push({rootStepIndex:c,status:"skipped"});continue}let m=p[0].trace[0].stepIndex,g=e.outcomes.find(l=>l.rootStepIndex===m);if(!g){r.push({rootStepIndex:c,status:"skipped"});continue}if(d.body.kind==="objective"){let l=p[0],f=Y(l,g);f==="failed"&&(i=!0);let h={rootStepIndex:c,status:f};f==="passed"&&(h.stepMd5=x(l)),r.push(h)}else{let l=!1,f=!1;for(let z of p){let P=Y(z,g);P!=="skipped"&&(f=!0),P==="failed"&&(l=!0)}let h=l?"failed":f?"passed":"skipped";h==="failed"&&(i=!0);let I=v(p[0].trace.slice(0,o.helperDepth+2)),q=Fe(o.finalDir,I);r.push({rootStepIndex:c,status:h,refKind:"import",refLabel:d.body.path,inlinedCount:p.length,helperResultRelPath:`${q}/Result.md`})}}let a=i?"failed":"passed";w({sourcePath:o.helperFile,title:n.title,rootSteps:n.steps,outcomes:r,overallStatus:a,startedISO:e.startedISO,durationS:0,sessionId:e.sessionId,outPath:Oe(o.stagingDir,"Result.md")})}}function De(e,t){let s=new Map;for(let o of e.steps)if(t.has(o.flatIndex))for(let n=1;n<o.trace.length;n++){let r=o.trace.slice(0,n+1),i=v(r),a=s.get(i);a||(a={stagingDir:`${i}.staging`,finalDir:i,helperFile:r[n].file,helperDepth:n,resolvedSteps:[]},s.set(i,a)),a.resolvedSteps.push(o)}return s}function Y(e,t){if(t.status==="passed")return"passed";if(t.status==="skipped")return"skipped";let s=e.trace.slice(1).map(r=>r.stepIndex),o=t.failedSubStepIndex??[],n=Math.min(s.length,o.length);for(let r=0;r<n;r++)if(s[r]!==o[r])return s[r]<o[r]?"passed":"skipped";return s.length===o.length?"failed":s.length<o.length?"passed":"skipped"}function St(e){let t=F(e.resolvedTest.rootPath);_(S(t,".internal"),{recursive:!0});let s=new Map;for(let n of e.stepRunRecords)s.set(n.testmdStepIndex,n);for(let n of e.resolvedTest.steps){let r=s.get(n.flatIndex);if(!r)continue;let i=n.trace[n.trace.length-1].stepIndex,a=x(n),d=a.slice(0,8),c;if(n.trace.length===1)c=S(t,".internal","steps",`${i}-${d}`);else{let p=`${v(n.trace)}.staging`;_(S(p,".internal"),{recursive:!0}),c=S(p,".internal","steps",`${i}-${d}`)}if(_(c,{recursive:!0}),H({sessionDir:e.sessionDir,runIndex:r.runIndex,totalRunDirs:r.totalRunDirs,stagingStepDir:c}),n.trace.length===1){let p=n.trace[0].stepIndex,m=e.outcomes.find(g=>g.rootStepIndex===p);m&&m.stepMd5==null&&(m.stepMd5=a)}}J({resolvedTest:e.resolvedTest,outcomes:e.outcomes,startedISO:e.startedISO,sessionId:e.sessionId,runByStep:s}),w({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 o={};if(e.commitId&&(o.commit_id=e.commitId),e.tmsIds.testId&&(o.test_id=e.tmsIds.testId),e.tmsIds.testcaseId&&(o.testcase_id=e.tmsIds.testcaseId),e.tmsIds.projectId&&(o.project_id=e.tmsIds.projectId),e.tmsIds.folderId&&(o.folder_id=e.tmsIds.folderId),e.tmsIds.orgId&&(o.org_id=e.tmsIds.orgId),e.tmsIds.sessionName&&(o.session_name=e.tmsIds.sessionName),Ee(S(t,".internal","meta.json"),JSON.stringify(o,null,2)+`
|
|
10
|
-
`,"utf8"),e.codeExportDir){let n=e.codeExportLanguage??"python",r=S(t,`playwright-${n}-code`);try{W(e.codeExportDir,r)}catch(i){process.stderr.write(`warn: codegen copy failed: ${i.message}
|
|
11
|
-
`)}}}export{Be as a,x as b,w as c,Je as d,v as e,W as f,St as g};
|
package/dist/chunk-QW5G7TX3.js
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as Se,b as nr}from"./chunk-C5UNZ6ZY.js";import{a as ar}from"./chunk-BH6EP2LD.js";import{c as or}from"./chunk-S3DAAAE5.js";import{b as sr,c as ut,d as dt,e as ve,f as mt,g as ir}from"./chunk-PUU7A26K.js";import{a as Ue,b as se,c as tr,e as le,f as lt,i as rr,j as ct}from"./chunk-AH4AXJML.js";import{b as ue}from"./chunk-DXJ5FL25.js";import{a as Xt}from"./chunk-WAOCHXJ5.js";import{a as er,b as at}from"./chunk-7N5H4KTV.js";import{a as Wt,b as ot,c as it,d as je,e as Jt,f as Qt}from"./chunk-LOIRZFV3.js";import{f as Yt,g as Zt}from"./chunk-LJDFBQFR.js";import{a as zt}from"./chunk-LPUQ4HWQ.js";import{a as De,b as Gt}from"./chunk-NLCCBXXV.js";import{a as W}from"./chunk-HPJP7NES.js";import{a as D}from"./chunk-RZ4F3BHX.js";import{a as Ht}from"./chunk-E47GFYXA.js";import{a as Kt,c as rt,i as qt,j as Le,k as st,l as nt}from"./chunk-3UCNDPTN.js";import{join as qe,basename as En}from"path";import{existsSync as ds,readFileSync as An}from"fs";import{existsSync as ft}from"fs";import{join as Fe,basename as lr}from"path";function cr(e,t){if(!t||!ft(t))return e.steps.map(()=>({kind:"author",reason:"no-result-md"}));let r=dt(t),s=[],n=new Set,o=new Map;function a(i){let l=ve(i),h=Fe(l,"Result.md");if(o.has(h))return o.get(h);let f=ft(h)?dt(h):null;return o.set(h,f),f}function u(i){for(let l=1;l<i.trace.length;l++){let f=i.trace[l-1].file===e.rootPath?r:a(i.trace.slice(0,l));if(!f)return{kind:"author",reason:"no-result-md"};let w=i.trace[l-1].stepIndex,g=f.steps[w-1];if(!g)return{kind:"author",reason:"no-result-md"};if(g.kind!=="import")return{kind:"author",reason:"structure-mismatch"};let I=lr(g.importPath),S=lr(i.trace[l].file);if(I!==S)return{kind:"author",reason:"structure-mismatch"};if(g.status!=="passed")return{kind:"author",reason:"recorded-failed"}}return null}for(let i of e.steps){let l=i.trace[i.trace.length-1].file,h=i.trace[i.trace.length-1].stepIndex,f=n.has(l);for(let S=0;S<i.trace.length-1&&!f;S++)n.has(i.trace[S].file)&&(f=!0);if(f){s.push({kind:"author",reason:"downstream-of-divergence"});continue}let w=u(i);if(w){s.push(w);for(let S=0;S<i.trace.length;S++)n.add(i.trace[S].file);continue}let g=l===e.rootPath?r:a(i.trace),I=Es(i,g,h);if(s.push(I),I.kind==="author"){n.add(l);for(let S=0;S<i.trace.length-1;S++)n.add(i.trace[S].file)}}return s}function Es(e,t,r){if(!t)return{kind:"author",reason:"no-result-md"};let s=t.steps[r-1];if(!s)return{kind:"author",reason:"no-result-md"};if(s.kind!=="objective")return{kind:"author",reason:"structure-mismatch"};if(s.status!=="passed")return{kind:"author",reason:"recorded-failed"};let n=sr(e);if(n!==s.md5)return{kind:"author",reason:"md5-mismatch"};let o=e.trace.length===1?rr(e.trace[0].file,r,n.slice(0,8)):Fe(ve(e.trace),".internal","steps",`${r}-${n.slice(0,8)}`),a=Fe(o,"flows","0","actions.ndjson");return ft(a)?{kind:"replay",recordingDir:o}:{kind:"author",reason:"missing-recording"}}function ur(e){return e.some(t=>t.kind==="author")}function Me(e){for(let t=0;t<e.length;t++)if(e[t].kind==="author")return t;return e.length}function dr(e){return Fe(e.recordingDir,"flows","0","actions.ndjson")}function mr(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let s=e.steps[r],n=t[r],o=" ".repeat(s.trace.length-1),a=`step ${s.flatIndex}`;n.kind==="replay"?process.stderr.write(`[replay-trace] ${o}${a}: REPLAY (would skip; v1 always authors)
|
|
3
|
-
`):process.stderr.write(`[replay-trace] ${o}${a}: AUTHOR (${n.reason})
|
|
4
|
-
`)}}function de(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function fr(e,t){let r=e===0?"(none)":`0..${e-1}`,s=e>=t?"(none)":`${e}..${t-1}`;de(`[replay-trace] phase: replay ${r}, author ${s}
|
|
5
|
-
`)}function pr(e,t){de(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
|
|
6
|
-
`)}function hr(e,t,r){de(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
|
|
7
|
-
`)}function gr(e,t){de(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
|
|
8
|
-
`)}function pt(){de(`[replay-trace] force-author (--author) \u2014 walker bypassed
|
|
9
|
-
`)}function br(e){de(`[replay-trace] cancelled at step ${e}
|
|
10
|
-
`)}import{join as As}from"path";function ht(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:dr(e.decision),step_label:e.step.objective},screenshot_dir:As(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 yr(e){let t=e.forceAuthor?0:Me(e.decisions),r=0,s=!1;for(;;){let n=e.session.snapshot(),o=e.accumulator.snapshot(),a=await e.runReplayPhase(t);if(a.cancelled)return s=!0,br(a.failedAt??0),{authorBoundary:t,cancelledInPhase:s,shrinkCount:r};if(a.failedAt===null)return{authorBoundary:t,cancelledInPhase:s,shrinkCount:r};let u=nr({failedAt:a.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(u.kind==="fail")return{authorBoundary:-1,cancelledInPhase:s,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:s,shrinkCount:r};if(e.session.rollback(n),e.accumulator.rollback(o),u.kind==="complete-reauthor")return gr(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:s,shrinkCount:r};r++,hr(r,Se.maxShrinks,u.newAuthorBoundary),t=u.newAuthorBoundary}}var xs=15e3,gt=3,vr=[500,1e3];async function bt(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 Ne(t,{from_commit_id:e.fromCommitId,new_commit_id:e.newCommitId},e.auth);return r.ok?{ok:!0,sessionExpiresAt:j(r.body,"session_expires_at")??""}:{ok:!1,...Ps(r)}}function Ps(e){let t=j(e.body,"error")??j(e.body,"code")??"",r=j(e.body,"message")??j(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 Rr(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await Ne(t,void 0,e.auth);return r.ok?{ok:!0,sessionExpiresAt:j(r.body,"session_expires_at")??""}:{ok:!1,expired:r.status===404,httpStatus:r.status,message:j(r.body,"message")??j(r.body,"detail")??r.text??`HTTP ${r.status}`}}async function wr(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 Ne(t,r,e.auth);return s.ok?{ok:!0,testId:j(s.body,"test_id")??e.testId,testcaseId:j(s.body,"testcase_id")??"",projectId:j(s.body,"project_id"),isTestCaseDeleted:typeof s.body?.is_test_case_deleted=="boolean"?s.body.is_test_case_deleted:void 0}:{ok:!1,...Ts(s)}}function Ts(e){let t=j(e.body,"error")??j(e.body,"code")??"",r=j(e.body,"message")??j(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 _r(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 Ne(t,r,e.auth);return s.ok?{ok:!0}:{ok:!1,reason:j(s.body,"error")??"other",httpStatus:s.status,message:j(s.body,"message")??j(s.body,"detail")??s.text??`HTTP ${s.status}`}}async function Ne(e,t,r){let s=null;for(let n=1;n<=gt;n++){let o=new AbortController,a=setTimeout(()=>o.abort(),xs);try{let u=await D(e,{method:"POST",headers:{Authorization:De(r.username,r.accessKey),"Content-Type":"application/json",Accept:"application/json"},...t!==void 0?{body:JSON.stringify(t)}:{},signal:o.signal});clearTimeout(a);let i=await u.text(),l=null;if(i)try{l=JSON.parse(i)}catch{}let h=u.status>=500||u.status===408||u.status===429;if(u.ok||!h)return{ok:u.ok,status:u.status,body:l,text:i};if(n<gt){await Sr(vr[n-1]??1e3);continue}return{ok:!1,status:u.status,body:l,text:i}}catch(u){if(clearTimeout(a),s=u,n<gt){await Sr(vr[n-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:s?.message??"exhausted retries"}}function Sr(e){return new Promise(t=>setTimeout(t,e))}function j(e,t){if(typeof e!="object"||e===null)return;let r=e[t];return typeof r=="string"?r:void 0}var Os=60*1e3,Ir="lock-heartbeat",me=null,yt=null,Cr={register:(e,t)=>je(e,t),deregister:e=>Jt(e),cleanup:(e,t)=>Qt(e,t),remoteLogger:null};function kr(){me!==null&&(clearInterval(me),me=null)}function vt(e){if(me!==null)return;let t=e.lifecycle??Cr;yt=t,me=setInterval(async()=>{let r=await Rr({baseUrl:e.baseUrl,testId:e.testId,auth:e.auth});if(!r.ok){let s=r.expired?"session expired":r.message;process.stderr.write(`[lock] heartbeat failed: ${s}; continuing run
|
|
11
|
-
`)}},Os),t.register(Ir,()=>kr())}function St(){me!==null&&(kr(),(yt??Cr).deregister(Ir),yt=null)}import{readFileSync as Er,readdirSync as Ar,existsSync as ce}from"fs";import{join as ee}from"path";function xr(e,t,r,s,n,o){try{let a=ee(e,"runs",String(t),"run-test");if(!ce(a)){n("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:a});return}let u=a;if(o){let S=ee(a,`child-${o}`);if(!ce(S)){n("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:o,reason:"child_dir_not_found",path:S});return}let k=Ar(S).filter(c=>ce(ee(S,c,"screenshots")));if(k.length===0){n("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:o,reason:"no_child_screenshots_dir"});return}u=ee(S,k[0])}else if(!ce(ee(a,"screenshots"))){let S=Ar(a).filter(k=>ce(ee(a,k,"screenshots")));if(S.length===0){n("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}u=ee(a,S[0])}let i=ee(u,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!ce(i)){n("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:o,reason:"screenshot_not_found",path:i});return}let l=ee(a,"actions.ndjson");if(!ce(l)){n("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let h=Er(l,"utf-8").trim().split(`
|
|
12
|
-
`),f=h[h.length-1];if(!f){n("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let g=JSON.parse(f).action_id;if(!g){n("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let I=Er(i);s.enqueue(g,I),n("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:o,action_id:g,size:I.length})}catch(a){n("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{step_index:r,error:a instanceof Error?a.message:String(a)})}}import{dirname as Ls,join as Ds}from"path";function Pr(e,t,r){let s=e.total_runs??1,n=e.run_dir,o,a;if(s>1&&n){let u=Ls(n);o=Array.from({length:s},(i,l)=>Ds(u,String(t+l))),r&&r.length===s&&(a=r)}return{allRunDirs:o,flowObjectives:a}}function Tr(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}}var $e=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 s=t.trace[0].stepIndex,n=this.outcomes.find(i=>i.rootStepIndex===s),o=this.resolved.rootSteps.find(i=>i.index===s),a=o.body.kind!=="objective";return a&&(n.refKind="import",n.refLabel=o.body.path,n.inlinedCount=(n.inlinedCount??0)+1,n.duration_s=(n.duration_s??0)+r.duration_s),r.status==="passed"?(a?n.status!=="failed"&&(n.status="passed"):(n.status="passed",n.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(n.softFailures=n.softFailures??[],n.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(n.status="failed",n.duration_s=a?n.duration_s:r.duration_s,n.failedSubStepIndex=a?t.trace.slice(1).map(i=>i.stepIndex):void 0,n.reason=r.reason,this.skipRoot=s,o.optional??!1?(n.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(s=>s.status==="failed"&&!s.softFailed)?"failed":"passed",r=this.outcomes.reduce((s,n)=>s+(n.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};function Rt(e){if(!e)return null;let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function Or(e){return Rt(e.flag)??Rt(e.frontmatter)??(e.configDefault&&e.configDefault!==Le?Rt(e.configDefault):null)}function Lr(e){return e.resolvedUrl!==null?!1:!((!!e.local||!!e.allowMissingUrl)&&!e.isTTY)}import{spawn as js}from"child_process";async function Dr(e,t,r=100){let s=`${e.replace(/\/+$/,"")}/json/version`,n=await D(s);if(!n.ok)throw new Error(`CDP /json/version returned ${n.status}`);let o=await n.json();if(!o.webSocketDebuggerUrl)throw new Error("CDP /json/version missing webSocketDebuggerUrl");let a=new Ht(o.webSocketDebuggerUrl);await new Promise((p,_)=>{a.once("open",p),a.once("error",_)});let u=1,i=new Map;a.on("message",p=>{let _;try{_=JSON.parse(p.toString())}catch{return}if(_.id==null)return;let L=i.get(_.id);L&&(i.delete(_.id),_.error?L.reject(new Error(_.error.message)):L.resolve(_.result))});function l(p,_){let L=u++;return new Promise((V,N)=>{i.set(L,{resolve:ke=>V(ke),reject:N});let ne={id:L,method:p};_&&(ne.params=_),a.send(JSON.stringify(ne))})}let f=(await l("Target.getTargets")).targetInfos.find(p=>p.type==="page");if(!f)throw a.close(),new Error("CDP: no page target found");let g=(await l("Browser.getWindowForTarget",{targetId:f.targetId})).windowId,I="",S=!1,k=null,c=!1;a.on("close",()=>{c=!0}),a.on("error",()=>{c=!0});async function P(){if(!S){if(c){S=!0;return}try{let _=(await l("Browser.getWindowBounds",{windowId:g})).bounds,L=`${_.left}:${_.top}:${_.width}:${_.height}`;L!==I&&(I=L,t({left:_.left,top:_.top,width:_.width,height:_.height}))}catch{}S||(k=setTimeout(P,r))}}return P(),{stop(){if(!S){S=!0,k&&clearTimeout(k);try{a.close()}catch{}}}}}var Us=new Set(["1","true","yes"]);function jr(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&Us.has(t.toLowerCase()))return null;let r=er();if(!r)return null;let s=[...r.args,"overlay"];e?.text&&s.push(e.text);let n;try{n=js(r.cmd,s,{cwd:r.cwd,stdio:["pipe","ignore","ignore"],detached:!1,windowsHide:!0})}catch{return null}function o(i){if(!(!n.stdin||n.stdin.destroyed))try{n.stdin.write(JSON.stringify(i)+`
|
|
13
|
-
`)}catch{}}e?.chromePid&&e.chromePid>0&&o({type:"chrome_pid",pid:e.chromePid});let a=null;e?.cdpEndpoint&&Dr(e.cdpEndpoint,i=>o({type:"bounds",...i})).then(i=>{a=i.stop}).catch(()=>{});let u=!1;return{setRunActive(i){u||o({type:"run_active",active:i})},setStepText(i){if(u)return;let l=i.trim();l&&o({type:"step_text",text:l})},setStepComplete(){u||o({type:"step_complete"})},kill(){if(!u){u=!0,a?.();try{n.stdin?.end()}catch{}try{n.kill("SIGTERM")}catch{}}}}}function Ur(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function wt(e,t,r,s){return`${Ur(e,t,r)}/dashboard/share/${s}?type=summary&agentView=true&fqdn=summary-page`}function Fr(e,t,r){return`${Ur(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as Qs,rmSync as Ys}from"fs";import{join as Zs}from"path";import{tmpdir as Xs}from"os";import{spawn as $r,spawnSync as Fs}from"child_process";import{existsSync as _t}from"fs";import{createConnection as Ms}from"net";import{homedir as Re,platform as Ie}from"os";import{join as we}from"path";var Ns=new Set(["1","true","yes"]),Be=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function Po(e){return e instanceof Be?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var Ve={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",we(Re(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",we(Re(),"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",we(Re(),"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",we(Re(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",we(Re(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe")]};function $s(){if(process.env.KANE_CLI_CHROME_PATH)return process.env.KANE_CLI_CHROME_PATH;let e=Ie(),t=Ve[e]??Ve.linux;for(let r of t)if(_t(r))return r;return e==="win32"?"chrome.exe":"google-chrome"}function Bs(){if(process.env.KANE_CLI_CHROME_PATH)return _t(process.env.KANE_CLI_CHROME_PATH);let e=Ie();if((Ve[e]??Ve.linux).some(n=>_t(n)))return!0;let r=e==="win32"?"chrome.exe":"google-chrome",s=e==="win32"?"where":"which";try{return Fs(s,[r],{stdio:"ignore"}).status===0}catch{return!1}}function Vs(){let e=Ie();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(`
|
|
14
|
-
`):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(`
|
|
15
|
-
`):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(`
|
|
16
|
-
`):["Google Chrome is required.","Install from https://www.google.com/chrome/","(Note: no official Chrome builds for BSD or Alpine/musl Linux.)"].join(`
|
|
17
|
-
`)}function Hs(e){let t=Ie(),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 Ks(e){return new Promise(t=>{let r=Ms({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 qs(){for(let e=st;e<=nt;e++)if(!await Ks(e))return e;throw new Error(`All CDP ports ${st}-${nt} are in use. Close other Chrome instances.`)}var _e=class extends Error{constructor(t){super(t),this.name="CdpReadinessError"}};async function Gs(e,t){let r=Date.now(),s=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await D(s)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(n=>setTimeout(n,200))}throw new _e(`Chrome CDP not ready after ${t}ms on port ${e}`)}var zs=3e4,Ws=2;function Mr(e,t,r){let s=process.env[e];if(s==null||s.trim()==="")return t;let n=Number(s);return!Number.isInteger(n)||n<r?t:n}function Js(e){return Math.min(500*e,3e3)}function Nr(e,t){try{if(e.pid)if(t==="win32")$r("taskkill",["/pid",String(e.pid),"/T","/F"],{stdio:"ignore"});else try{process.kill(-e.pid,"SIGKILL")}catch{e.kill("SIGKILL")}else e.kill("SIGKILL")}catch{}}async function Br(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&Ns.has(t.toLowerCase()))&&!Bs())throw ot()?.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 Be(Vs());let s=Ie(),n=$s(),o=Mr("KANE_CLI_CDP_TIMEOUT_MS",zs,1),u=Mr("KANE_CLI_CDP_RETRIES",Ws,0)+1,i;for(let l=1;l<=u;l++){let h=await qs(),f=Hs({port:h,...e});e.startUrl&&f.push(e.startUrl);let w=$r(n,f,{stdio:"ignore",detached:!0});w.unref();try{let g=await new Promise((I,S)=>{w.on("error",k=>{S(new Error(`Failed to launch Chrome: ${k.message}. Is Chrome installed at ${n}?`))}),w.on("close",k=>{k!==null&&k!==0&&S(new _e(`Chrome exited during startup with code ${k}`))}),Gs(h,o).then(I,S)});return{process:w,port:h,cdpEndpoint:g,kill(){Nr(w,s)}}}catch(g){if(i=g,!(g instanceof _e))throw g;Nr(w,s),ot()?.log("warn","CHROME_CDP_LAUNCH_RETRY",`Chrome CDP launch attempt ${l}/${u} failed`,{attempt:l,max_attempts:u,port:h,timeout_ms:o,headless:e.headless??!1,error:g.message}),l<u&&await new Promise(I=>setTimeout(I,Js(l)))}}throw i??new Error("Chrome launch failed after retries")}async function Vr(e){if(e.cft)return{instance:null,tempDir:null};if(e.wsEndpoint)return{wsEndpoint:e.wsEndpoint,instance:null,tempDir:null};if(e.cdpEndpoint){let n=await D(`${e.cdpEndpoint}/json/version`);if(!n.ok)throw new Error(`CDP endpoint not reachable: ${e.cdpEndpoint} (${n.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=Qs(Zs(Xs(),"kane-clean-")),t=r;let n=r;je("tempDir",()=>{try{Ys(n,{recursive:!0,force:!0})}catch{}})}let s=await Br({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}}function Hr(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.requireStartUrl&&(t.require_start_url=!0),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.networkWs&&(t.network_ws=!0),e.networkSse&&(t.network_sse=!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}import{readdirSync as en,readFileSync as qr,existsSync as Gr}from"fs";import{join as tn}from"path";function Kr(e,t){if(!Gr(e))return{};let r={},s;try{s=en(e).filter(n=>n.endsWith(".json")).sort()}catch{return{}}for(let n of s)try{let o=qr(tn(e,n),"utf-8"),a=JSON.parse(o);if(a&&typeof a=="object"){for(let[u,i]of Object.entries(a))if(i&&typeof i=="object"&&"value"in i){let l=i;r[u]={value:l.value,secret:l.secret??!1,syntax:l.syntax??`{{${u}}}`}}}}catch{t?t("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:n}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${n}
|
|
18
|
-
`)}return r}function zr(e){if(!Gr(e))throw new Error(`Variables file not found: ${e}`);let t=qr(e,"utf-8"),r=JSON.parse(t),s={};if(r&&typeof r=="object"){for(let[n,o]of Object.entries(r))if(o&&typeof o=="object"&&"value"in o){let a=o;s[n]={value:a.value,secret:a.secret??!1,syntax:a.syntax??`{{${n}}}`}}}return s}function Wr(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,n]of Object.entries(t))if(n&&typeof n=="object"&&"value"in n){let o=n;r[s]={value:o.value,secret:o.secret??!1,syntax:o.syntax??`{{${s}}}`}}}return r}function Jr(e,t,r){let s=Kr(e,r),n=Kr(t,r);return{...s,...n}}var fe=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=De(t.username,t.accessKey),s=await D(`${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 n of r)s.add(n[1]);return[...s]}};var pe=class extends Gt{constructor(t,r,s){super(t,{username:r,accessKey:s})}async upsertVariable(t){let r=t.environmentId??0,s=await D(`${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 D(`${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 o=await D(`${this.baseUrl}/v1/variables/${encodeURIComponent(t.name)}?environment_id=${r}`,{method:"GET",headers:this.headers()});return o.ok?{id:(await o.json()).data?.id??0}:{id:0}}};function Qr(e,t){if(Object.keys(e).length===0)return{};let r={};for(let[s,n]of Object.entries(e)){let o=n.syntax??`{{${s}}}`;t.includes(o)&&(r[s]=n)}return r}function Yr(e){let t=Jr(e.globalDir,e.localDir,e.onLoadError),r=e.file?zr(e.file):{},s=e.inline?Wr(e.inline):{},n={...t,...r,...s},o=Object.keys(n).length>0,{variables:a,objective:u}=o?ue(n,e.objective):{variables:{},objective:e.objective},i=Object.entries(n).filter(([,h])=>h.secret),l=Object.entries(n).filter(([,h])=>!h.secret);return{raw:n,auteur:a,auteurObjective:u,secretEntries:i,nonSecretEntries:l}}async function Zr(e){if(e.localMode)return{};let t=W(e.env);if(e.variables.secretEntries.length>0){let s=new fe(t.secretsBaseUrl);for(let[n,o]of e.variables.secretEntries)s.pushSecret({secretKey:n,secretValue:o.value,username:e.auth.username,accessKey:e.auth.access_key,orgId:e.orgId}).then(()=>e.log("info","SECRET_PUSH_OK","Secret pushed",{key:n})).catch(a=>e.log("error","SECRET_PUSH_FAILED","Secret push failed",{key:n,error:String(a)}))}let r={};if(e.variables.nonSecretEntries.length>0){let s=new pe(t.tmsBaseUrl,e.auth.username,e.auth.access_key);for(let[n,o]of e.variables.nonSecretEntries)try{let a=await s.upsertVariable({name:n,value:o.value});r[n]=a.id,e.log("info","VAR_PUSH_OK","Variable pushed",{name:n,id:a.id})}catch(a){e.log("error","VAR_PUSH_FAILED","Variable push failed",{name:n,error:String(a)})}}return r}import{readFileSync as rn,existsSync as sn}from"fs";function It(e){if(!sn(e))return null;try{return rn(e,"utf-8").trim()||null}catch{return null}}import{writeFileSync as nn,mkdirSync as on}from"fs";import{dirname as Xr}from"path";function Ct(e){let t=le(e.sourcePath);try{on(Xr(t),{recursive:!0})}catch(s){return process.stderr.write(`
|
|
19
|
-
\u26A0 Failed to create output directory.
|
|
20
|
-
${s.message}
|
|
21
|
-
Path: ${Xr(t)}
|
|
22
|
-
|
|
23
|
-
`),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),e.plan!==void 0&&(r.plan=e.plan);try{nn(t,JSON.stringify(r,null,2)+`
|
|
24
|
-
`,"utf8")}catch(s){process.stderr.write(`
|
|
25
|
-
\u26A0 Failed to write meta.json.
|
|
26
|
-
${s.message}
|
|
27
|
-
Path: ${t}
|
|
28
|
-
|
|
29
|
-
`)}return t}var an=()=>{};async function es(e,t,r){let s=t.log??an,n=e.session.testId??null,o=null,a=null,u=null;if(!r.localMode&&t.performUpload)try{o=await t.performUpload(),o?.success&&(o.testId&&(n=o.testId),o.testcaseId&&e.session.setTestcaseId(o.testcaseId))}catch(i){s("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(i)})}if(t.renderFeedbackPrompt)try{a=await t.renderFeedbackPrompt(),a&&n&&t.submitFeedback&&t.submitFeedback(n,a).catch(i=>{s("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(i)})})}catch(i){s("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(i)})}if(e.session.flushRecorder(),r.skipLocalWrites)s("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{u=ut({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(i){s("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(i)})}try{Ct({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:n??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??Ue(r.sourcePath),plan:e.session.plan??void 0})}catch(i){s("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(i)})}if(o?.codeExportDir)try{let i=e.tuiConfig.code_export?.language??"python";mt(o.codeExportDir,lt(r.sourcePath,"playwright",i))}catch(i){s("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(i)})}}else if(e.session.recorder?.lastWrittenPath){let i=e.session.recorder.lastWrittenPath,l=e.session.getFlows(),h=l.map((g,I)=>({index:I+1,heading:`Step ${I+1}`,headingLine:0,body:{kind:"objective",text:g.objective}})),f=l.map((g,I)=>({rootStepIndex:I+1,status:g.status==="passed"?"passed":g.status==="failed"?"failed":"skipped",duration_s:g.duration,reason:g.reason})),w=f.some(g=>g.status==="failed")?"failed":"passed";try{u=ut({sourcePath:i,title:e.session.sessionName??"Session",rootSteps:h,outcomes:f,overallStatus:w,startedISO:e.session.startedAt,durationS:f.reduce((g,I)=>g+(I.duration_s??0),0),sessionId:e.session.sessionId})}catch(g){s("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(g)})}try{Ct({sourcePath:i,commitId:e.session.sessionId,testId:n??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,plan:e.session.plan??void 0})}catch(g){s("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(g)})}if(o?.codeExportDir)try{let g=e.tuiConfig.code_export?.language??"python";mt(o.codeExportDir,lt(i,"playwright",g))}catch(g){s("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(g)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${i} (renamed: ${e.session.sessionName}_test.md already existed)
|
|
30
|
-
`)}try{t.runCleanup?.()}catch(i){s("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(i)})}try{await e.session.finish("complete")}catch(i){s("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(i)})}return{uploadResult:o,feedbackChoice:a,resultMdPath:u}}import{readFileSync as rs,writeFileSync as ss,existsSync as ns}from"fs";function ts(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(a=>a.kind==="author"&&a.reason==="no-result-md"))return"initial recording";if(t.length>0&&t.every(a=>a.kind==="replay"))return r.wantsPush?"re-recorded (no source changes)":"no changes";let s=[];for(let a=0;a<t.length;a++){let u=t[a];if(!u||u.kind!=="author"||u.reason==="downstream-of-divergence"||u.reason==="no-result-md")continue;let i=ln(e,e.steps[a]);switch(u.reason){case"structure-mismatch":s.push(`added/removed: ${i}`);break;case"md5-mismatch":s.push(`modified: ${i}`);break;case"missing-recording":s.push(`re-recorded: ${i}`);break;case"recorded-failed":s.push(`re-authored after failure: ${i}`);break}}if(s.length===0)return"automated commit";let n=s.filter((a,u)=>u===0||s[u-1]!==a),o=n.slice(0,3).join("; ");return n.length>3?`${o}; +${n.length-3} more`:o}function ln(e,t){if(!t)return"unknown step";let r=t.trace[0]?.stepIndex;if(r==null)return"unknown step";let n=e.rootSteps[r-1]?.heading?.trim()??"";return t.trace.length>1?n?`imported step in "${n}"`:`imported step ${r}`:n||`step ${r}`}function cn(e){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{ir({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}),ct(se(e.sourcePath));let t=new Set;for(let r of e.resolvedTest.steps)if(r.trace.length>1){let s=ve(r.trace);if(t.has(s))continue;t.add(s),ns(`${s}.staging`)&&ct(s)}}}function un(e){if(!(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions))return async()=>{let t=ts(e.resolvedTest,e.decisions,{wantsPush:e.wantsPush??!1,retryTriggered:e.retryTriggered??!1,forceAuthor:e.forceAuthor??!1}),r=e.resolvedTest.steps.map(n=>n.objective).filter(n=>typeof n=="string"&&n.length>0).slice(0,50),s=await wr({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 n=le(e.sourcePath);try{let o=JSON.parse(rs(n,"utf8"));o.commit_id=e.newCommitId,ss(n,JSON.stringify(o,null,2)+`
|
|
31
|
-
`,"utf8")}catch(o){process.stderr.write(`warn: failed to update meta.json commit_id: ${o.message}
|
|
32
|
-
`)}}return s}}function dn(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=le(e.sourcePath);try{let s=ns(r)?JSON.parse(rs(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),ss(r,JSON.stringify(s,null,2)+`
|
|
33
|
-
`,"utf8")}catch(s){process.stderr.write(`warn: failed to update meta.json after endTest: ${s.message}
|
|
34
|
-
`)}}}function os(e){let t=W(e.env),{session:r,auth:s}=e,n=s.basicAuth?{username:s.basicAuth.username,accessKey:s.basicAuth.access_key}:s.token,o=s.resolvedCreds?.username??s.basicAuth?.username??"",a=s.resolvedCreds?.access_key??s.basicAuth?.access_key??"",u=s.resolvedCreds?.org_id??0,i=s.resolvedCreds?.user_id??0,l=[];for(let I of Object.keys(r.auteurVariables))I.startsWith("secrets.user.")&&l.push({key_name:I.replace("secrets.user.",""),scope:"user"});let f=r.getContext().prior_runs.map(I=>I.status),w=r.auteurVariables,g=Object.keys(w).length>0;return{controllerBaseUrl:t.controllerBaseUrl,tmsBaseUrl:t.tmsBaseUrl,auth:n,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:f,orgId:u,userId:i,tmsUsername:o,tmsAccessKey:a,screenshotBaseUrl:r.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:t.shareApiBaseUrl,variables:g?w: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:cn(e),onCommitLock:un(e),onFinalizeSuccess:dn(e)}}var is=["python","javascript"];function mn(e){if(e!==void 0){if(!is.includes(e))throw new Error(`--code-language must be one of: ${is.join(", ")} (got "${e}")`);return e}}function as(e,t){let r=mn(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}async function ls(e){try{let r=await new zt(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}}var fn=null,pn=()=>fn??=import("sharp").then(e=>e.default??e).catch(()=>null),He=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",n=await pn();if(n)try{let i=await n(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(i)}catch(i){r=new Uint8Array(t.buffer),s="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:i instanceof Error?i.message:String(i)})}else r=new Uint8Array(t.buffer),s="image/png";let o=s==="image/webp"?"webp":"png",a=`test_screenshots/untagged_screenshot/${t.operationId}.${o}`,u=`${this.sas.base_url}/${this.sas.container}/${a}?${this.sas.sas_token}`;for(let i=0;i<=this.maxRetries;i++)try{let l=await D(u,{method:"PUT",headers:{"Content-Type":s,"x-ms-blob-type":"BlockBlob"},body:r});if(l.ok){this.uploadedExt.set(t.operationId,o);return}if(i<this.maxRetries){await this.backoff(i);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(i<this.maxRetries){await this.backoff(i);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 Ce=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,n={}){if(this.stopped)return;let o=this.buildEntry(t,r,s,n);this.buffer.push(o)}logStep(t,r,s,n={}){if(this.stopped)return;let o=this.buildEntry("debug",r,s,n);o.run_index=t,this.stepBuffer.has(t)||this.stepBuffer.set(t,[]),this.stepBuffer.get(t).push(o)}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 n=JSON.stringify(t);for(let o=0;o<3;o++){try{let a=new AbortController,u=setTimeout(()=>a.abort(),1e4),i=await D(this.config.proxyUrl,{method:"POST",headers:s,body:n,signal:a.signal});if(clearTimeout(u),i.ok)return}catch{}o<2&&await new Promise(a=>setTimeout(a,1e3*Math.pow(2,o)))}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,n){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:r.startsWith("tcg_")?null:this.currentRunIndex,identity:this.config.identity,device:this.config.device,context:n,timestamp:new Date().toISOString()}}};import{platform as gn,arch as bn}from"os";function kt(e=process.env){try{let t=e.KANE_CLI_USER_AGENT;return t&&t.trim()?hn(t):e.CLAUDECODE==="1"||e.CLAUDE_CODE_ENTRYPOINT?"claude-code":e.CURSOR_TRACE_ID||e.TERM_PROGRAM==="cursor"?"cursor":e.TERM_PROGRAM==="vscode"||e.VSCODE_PID?"vscode":e.CI==="true"||e.GITHUB_ACTIONS==="true"||e.GITLAB_CI==="true"||e.CIRCLECI==="true"||e.BUILDKITE==="true"?"ci":"unknown"}catch{return"unknown"}}function hn(e){return e.toLowerCase().replace(/[^a-z0-9_-]/g,"-").slice(0,40)}function cs(e){let t={proxyUrl:qt,sessionId:e.sessionId,identity:e.identity,device:{cli_version:Kt,platform:gn(),arch:bn(),host_agent:kt(),invocation_mode:e.invocationMode},getToken:e.getToken};return new Ce(t)}import{execSync as yn}from"child_process";import{readFileSync as vn}from"fs";import{createHash as Sn}from"crypto";import{hostname as Rn,platform as wn,arch as _n}from"os";var Ke=null;function us(){return Ke||(Ke=In(),Ke)}function In(){let e=wn();if(e==="darwin")try{let s=yn("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=vn("/etc/machine-id","utf-8").trim();if(r)return r}catch{}let t=`${Rn()}:${e}:${_n()}`;return Sn("sha256").update(t).digest("hex").slice(0,32)}async function Cn(e){try{let t=W(e.env),s=await new Xt(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 He(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 kn(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=cs({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:us(),email:t.email??null,email_domain:t.email_domain??"unknown",user_type:t.user_type??"unknown",env:e.env,plan:t.plan??"unknown"},invocationMode:e.invocationMode,getToken:e.getToken});return e.session.setRemoteLogger(r),r.start(),r}async function Pt(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):Cn({env:e.env,auth:e.auth,session:e.session,log:e.log}),kn({env:e.env,tmsCreds:e.tmsCreds,getToken:e.getToken,session:e.session,invocationMode:e.invocationMode})]);return{resolver:e.resolver,screenshotQueue:t.status==="fulfilled"?t.value:null,remoteLogger:r.status==="fulfilled"?r.value:null}}async function Et(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function zi(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 At(e.env,e.tmsCreds,r,t);return xt(s,t),s}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await Et(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),n=await s.resolve(!0).catch(()=>null);if(!n)return t.log("warn","IDENTITY_VALIDATE_FAILED","Identity validation failed",{kind:e.kind,env:e.env}),null;t.state.setTmsCredsCache(n);let o=await At(e.env,n,s,t);return xt(o,t),o}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await Et(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 Et(r),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null;let s=t.state.getTmsCredsCache(),n=t.auth.getResolver(),o=n??t.auth.initResolver(e.env);!n&&s&&o.prime(s);let a=await At(e.env,s,o,t);return xt(a,t),a}}}async function At(e,t,r,s){let n=s.auth.getBasicAuth(),o=n?null:await s.auth.getToken(),a=n?{username:n.username,accessKey:n.access_key}:o??null;return a===null?{resolver:r,screenshotQueue:null,remoteLogger:null}:Pt({env:e,tmsCreds:t,resolver:r,auth:a,getToken:()=>s.auth.getToken(),session:s.getSession(),log:s.log,skipScreenshotQueue:s.options?.skipScreenshotQueue,invocationMode:"tui"})}function xt(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))}var Ge=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function Pa(e,t,r){let{path:s,cwd:n,opts:o,isAgent:a,disableAskUser:u,resolved:i,resolvedAuth:l,cliOverrides:h,environment:f,envConfig:w,profile:g,model:I,creds:S,configStore:k,session:c}=e,P=!1,p=await On(s,i,o,{resolvedAuth:l,tmsBaseUrl:w.tmsBaseUrl},c.sessionId,r);if(p.abort)return{overallStatus:"failed",exitCode:p.abort.exitCode,outputDir:se(s),durationS:0,uploadResult:null};let _=p.lockAcquired,L=!1,V=!1,N=!1;_&&t.onLockState({phase:"acquired",scope:"preemptive"}),c.start({model:I,environment:f,profile:g}),c.setRecordingEnabled(!1);let ne=0,ke=l.basicAuth?{username:l.basicAuth.username,accessKey:l.basicAuth.access_key}:l.token??null,Ee=null;if(ke!==null){let d=await Pt({env:f,tmsCreds:l.resolvedCreds??null,resolver:l.resolver,auth:ke,getToken:async()=>l.token??null,session:c,log:(m,v,y,b)=>c.log(m,v,y,b),skipScreenshotQueue:!!o.local||!l.basicAuth,invocationMode:a?"agent":"cli"});Ee=d.screenshotQueue,d.remoteLogger&&(r.register("remote-logger",()=>d.remoteLogger.shutdownSync()),r.remoteLogger=d.remoteLogger,e.skipGlobalRemoteLogger||Wt(d.remoteLogger))}if(o.name){try{or(o.name)}catch(d){return process.stderr.write(`error: ${d.message}
|
|
35
|
-
`),{overallStatus:"failed",exitCode:2,outputDir:se(s),durationS:0,uploadResult:null}}c.setSessionName(o.name)}let Je={};for(let[d,m]of Object.entries(i.rootGlobal))Ge.includes(d)||(Je[d]=m);for(let[d,m]of Object.entries(h))Ge.includes(d)||m!==void 0&&(Je[d]=m);let q={...i.chrome};for(let d of Ge){let m=h[d];m!==void 0&&(q[d]=m)}let ps={...Je,...q};c.setResolvedGlobal(ps);let Tt=S.getActiveProfile()??"default",Ot=S.getDefaultEnv(),{rehydrateIfStale:hs}=await import("./profile-sync-DTTRRIVP.js");hs(S,k,Tt,Ot);let $=k.load(),Lt=(h.assertion_mode??$.assertion_mode)==="dom"?"dom":"visual",G=$.project_id??null,Ae=$.folder_id??null;if(l.basicAuth){let d=await Zt({creds:S,config:k,profile:Tt,env:Ot,tmsCreds:l.basicAuth,isLocal:!!o.local,log:(m,v,y,b)=>c.log(m,v,y,b),onAnnounce:e.onAnnounce});if(d.status==="ok")G=d.projectId,Ae=d.folderId,$=k.load(),a&&d.autoDefaulted&&process.stdout.write(Yt(d.autoDefaulted));else if(d.status==="cancelled"){process.stderr.write(`error: project/folder configuration failed. See remediation above, or use --local.
|
|
36
|
-
`);let{shutdown:m}=await import("./exit-manager-V2NW7A7U.js");return m(2,"project/folder gate failed"),{}}}let Q;try{Q=await Vr({config:{chrome_profile_path:q.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:Le,headless:q.headless??!1,wsEndpoint:q.ws_endpoint,cdpEndpoint:q.cdp_endpoint})}catch(d){return process.stderr.write(`error: Chrome launch failed: ${d.message}
|
|
37
|
-
`),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:se(s),durationS:0,uploadResult:null}}let xe=Q.instance;xe&&r.register("chrome",()=>{try{xe.kill()}catch{}});let F=null,Dt=Q.cdpEndpoint??q.cdp_endpoint;if(Dt&&!q.ws_endpoint&&!q.headless)try{F=jr({headless:q.headless??!1,cdpEndpoint:Dt,chromePid:xe?.process.pid}),F&&r.register("marker-overlay",()=>F.kill())}catch(d){c.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(d)})}l.resolvedCreds?.org_id!==void 0&&c.setOrgId(String(l.resolvedCreds.org_id));let oe=Yr({objective:"",globalDir:qe(rt,"variables"),localDir:qe(n,".testmuai","variables"),file:o.variablesFile,inline:o.variables}),gs=i.rootGlobal.variables??{},H=xn(oe.raw,gs);c.setAuteurVariables(H.auteur);let jt=It(qe(rt,"global-memory.md"))??void 0,Ut=It(qe(n,".testmuai","context.md"))??void 0;o.local?process.stderr.write(`info: --local \u2014 KaneAI upload skipped
|
|
38
|
-
`):l.basicAuth?G||process.stderr.write(`warn: KaneAI upload skipped \u2014 no project configured.
|
|
39
|
-
`):process.stderr.write(`warn: KaneAI upload skipped \u2014 TMS credentials could not be resolved.
|
|
40
|
-
Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
|
|
41
|
-
`);let ge=!o.local&&!!l.basicAuth&&G!=null;if(c.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:ge,lockHeld:_,isFirstRun:p.isFirstRun,hasAuth:p.hasAuth}),ge&&p.testId==null){let d=W(f);try{let m=await ls({tmsBaseUrl:d.tmsBaseUrl,auth:l.basicAuth,objective:i.steps[0].objective,url:"",projectId:G,folderId:Ae??"",hasCustomProfile:!!q.chrome_profile,log:(v,y,b,R)=>c.log(v,y,b,R)});m&&c.setTestId(m)}catch(m){process.stderr.write(`warn: ATM test creation failed: ${m.message}
|
|
42
|
-
`)}}else p.testId&&c.setTestId(p.testId);let Pe={};if(l.basicAuth&&!o.local&&(H.secretEntries.length>0||H.nonSecretEntries.length>0))try{Pe=await Zr({variables:H,auth:l.basicAuth,orgId:String(l.resolvedCreds?.org_id??""),env:f,localMode:!!o.local,log:(d,m,v,y)=>c.log(d,m,v,y)})}catch(d){process.stderr.write(`warn: variable/secret push failed: ${d.message}
|
|
43
|
-
`)}let Qe=new Map;for(let[d,m]of H.nonSecretEntries)Qe.set(d,m.value);let Ye=new Map;for(let[d,m]of H.secretEntries)Ye.set(d,m.value);async function Ze(d){if(!l.basicAuth||o.local)return;let m=[],v=[];for(let[b,R]of Object.entries(d))if(R.secret){if(Ye.get(b)===R.value)continue;v.push([b,R])}else{if(Qe.get(b)===R.value)continue;m.push([b,R])}if(m.length===0&&v.length===0)return;let y=W(f);if(m.length>0){let b=new pe(y.tmsBaseUrl,l.basicAuth.username,l.basicAuth.access_key);for(let[R,C]of m)try{let A=await b.upsertVariable({name:R,value:C.value});Pe[R]=A.id,Qe.set(R,C.value),c.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:R})}catch(A){c.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:R,error:String(A)})}}if(v.length>0){let b=new fe(y.secretsBaseUrl);for(let[R,C]of v)try{await b.pushSecret({secretKey:R,secretValue:C.value,username:l.basicAuth.username,accessKey:l.basicAuth.access_key,orgId:String(l.resolvedCreds?.org_id??"")}),Ye.set(R,C.value),c.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:R})}catch(A){c.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:R,error:String(A)})}}}let be=Ee?(d,m,v)=>{if(!(_||p.isFirstRun))return;let y=ne+m;xr(c.sessionDir,y,d,Ee,(b,R,C,A)=>c.log(b,R,C,A),v)}:void 0,Ft=i.rootTitle??i.rootSteps[0]?.heading??En(s),bs=Object.keys(H.raw).length>0?ue(H.raw,Ft).objective:Ft,ye=Or({flag:o.url,frontmatter:i.rootGlobal?.url,configDefault:k.load().default_url}),ys=Lr({resolvedUrl:ye,local:!!o.local,allowMissingUrl:!!o.allowMissingUrl,isTTY:!!process.stdin.isTTY});c.setFirstRun(bs,ye??"");let te=new $e(i),Xe=new Date().toISOString(),vs=Date.now(),Ss=typeof o.maxSteps=="string"&&o.maxSteps!==""?parseInt(o.maxSteps,10):void 0;function Mt(d,m){let v=i.steps[d],y=ms(v.config,h),b=he(oe.raw,y.variables,v.objective);return Hr({objective:b.objective,url:d===0?ye??void 0:void 0,requireStartUrl:d===0&&ys,model:I,chrome:Q,auth:l,sessionId:c.sessionId,runIndex:m,windowSize:{width:1920,height:1080},maxSteps:y.max_steps??Ss??30,headless:q.headless??!1,disableAskUser:u,variables:Object.keys(b.variables).length>0?b.variables:void 0,globalContext:y.global_context??jt,localContext:y.local_context??Ut,sessionContext:c.getContext()})}function Nt(d){let v=i.steps[d].trace[0].stepIndex,y=i.rootSteps.find(R=>R.index===v);i.steps.slice(0,d).some(R=>R.trace[0].stepIndex===v)||t.onAgentEvent({type:"test_md_step_start",step_index:v,heading:y.heading,ref:y.body.kind==="import_ref"?{kind:"import",label:y.body.path}:null})}function et(d,m,v,y,b,R){let C=i.steps[d],A=C.trace[0].stepIndex,J=!i.steps.slice(d+1).some(O=>O.trace[0].stepIndex===A),z=v?.status==="passed"?"passed":"failed",U=v?.reason??b??void 0,K=v?.duration??R,{continueOverall:B}=te.recordStep(C,{status:z,duration_s:K,reason:U}),Y=ms(C.config,h),Z=he(oe.raw,Y.variables,C.objective).objective;if(v){let O=Pr(v,m,y);c.addRunResult(Tr(v,Z,m,O),v.total_runs)}else c.addRunResult({index:m,objective:Z,status:z,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(J||!B){let O=te.snapshotOutcomes().find(E=>E.rootStepIndex===A);t.onAgentEvent({type:"test_md_step_end",step_index:A,status:O.status,duration_s:O.duration_s??0,ref_kind:O.refKind??null,inlined_count:O.inlinedCount??null,failed_sub_step_index:O.failedSubStepIndex??null})}return B}async function Rs(d){fr(d,i.steps.length);for(let m=0;m<d;m++){if(P)return{failedAt:m,cancelled:!0};let v=i.steps[m],y=p.decisions[m];if(y.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${m}
|
|
44
|
-
`),{failedAt:m,cancelled:!1};let b=c.nextRunIndex();ne=b;let R=m===0?ye??void 0:void 0,C={width:$.window_size.width,height:$.window_size.height},A=he(oe.raw,v.config.variables,v.objective),J=ht({step:v,decision:y,chrome:Q,auth:l,sessionId:c.sessionId,runIndex:b,sessionDir:c.sessionDir,windowSize:C,forceNavigateUrl:R,sessionContext:c.getContext(),variables:Object.keys(A.variables).length>0?A.variables:void 0});await Ze(A.raw),Nt(m);let z=Date.now(),U=null,K=null;try{let O=at(J,{environment:f});r.register("runner",()=>{it()&&(P=!0);try{O.cancel()}catch{}}),F?.setRunActive(!0);try{for await(let E of O.events){if(t.onAgentEvent(E),E.type==="step_event"&&E.event==="reasoning"?F?.setStepText(E.detail):E.type==="step_end"&&(E.status==="passed"&&F?.setStepComplete(),be&&be(E.index,0,E.child_id)),E.type==="run_end"){U=E;break}if(E.type==="error"){K=E.message??"runner error";break}}try{O.cancel()}catch{}if(!U&&!K){let{code:E}=await O.exited;E!==0&&(K=`runner exited with code ${E}`)}}finally{F?.setRunActive(!1),r.cleanup("runner","Replay step complete")}}catch(O){K=O.message}if(P)return{failedAt:m,cancelled:!0};let B=Math.round((Date.now()-z)/1e3),Y=et(m,b,U,null,K,B);c.recordStepRun({testmdStepIndex:i.steps[m].flatIndex,runIndex:b,totalRunDirs:1});let Z=!!K||U?.status==="failed";if(pr(m,Z?"failed":"ok"),Z||!Y)return{failedAt:m,cancelled:!1}}return{failedAt:null,cancelled:!1}}let $t=async()=>{if(_)return!0;let d=l.basicAuth;if(!d){let b=await l.resolver.resolve(!0);b?.username&&b?.access_key&&(d={username:b.username,access_key:b.access_key},l.basicAuth=d)}if(!p.testId||!p.fromCommitId||!d)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
|
|
45
|
-
`),!1;let m=c.sessionId,v=o.onLockConflict??i.rootGlobal.on_lock_conflict??"readonly",y=await fs({tmsBaseUrl:w.tmsBaseUrl,testId:p.testId,fromCommitId:p.fromCommitId,newCommitId:m,basicAuth:d,onLockConflict:v});return y==="ok"?(_=!0,p.newCommitId=m,c.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:p.testId}),a&&t.onLockState({phase:"acquired",scope:"mid_run"}),vt({baseUrl:ze(w.tmsBaseUrl),testId:p.testId,auth:We(d),lifecycle:r}),!0):(c.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:y}),a&&t.onLockState({phase:"conflict",scope:"mid_run",reason:y}),process.stderr.write(`error: mid-run lock acquisition failed (${y})
|
|
46
|
-
`),!1)};if(a){let d=o.author===!0;d&&(pt(),c.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let{authorBoundary:m,cancelledInPhase:v,shrinkCount:y}=await yr({decisions:p.decisions,forceAuthor:d,hasRetry:o.retry===!0||o.retryCount!==void 0,maxShrinks:o.retryCount!==void 0?parseInt(o.retryCount,10):Se.maxShrinks,runReplayPhase:Rs,session:c,accumulator:te,acquireLockIfNeeded:$t});if(N=y>0,y>0&&(c.log("info","RETRY_TRIGGERED","Retry loop triggered",{shrink_count:y,final_author_boundary:m}),t.onRetryAttempt({shrink_count:y,final_author_boundary:m,complete_reauthor:m===0})),m===0&&y>0&&c.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:y}),!v&&m>=0)for(let b=m;b<i.steps.length;b++){let R=i.steps[b];if(!te.shouldRunFlatStep(R))continue;Nt(b),L=!0;let C=c.nextRunIndex();ne=C,await Ze(he(oe.raw,R.config.variables,R.objective).raw);let A=Mt(b,C),J=Date.now(),z=null,U=null,K=null,B=!1,Y=0;try{let E=at(A,{environment:f,assertionMode:Lt});r.register("runner",()=>{it()&&(P=!0);try{E.cancel()}catch{}}),F?.setRunActive(!0);try{for await(let T of E.events){if(t.onAgentEvent(T),T.type==="bifurcation"){let x=T.count??T.flows?.length??0;(T.is_single_flow??x<=1)||(K=T.flows??null,B=!0,Y=0)}else if(T.type==="run_start"&&B)Y++;else if(T.type==="step_event"&&T.event==="reasoning")F?.setStepText(T.detail);else if(T.type==="step_end"&&(T.status==="passed"&&F?.setStepComplete(),be)){let x=B?Math.max(0,Y-1):0;be(T.index,x,T.child_id)}if(T.type==="run_end"){z=T;break}if(T.type==="error"){U=T.message??"runner error";break}}try{E.cancel()}catch{}}finally{F?.setRunActive(!1),r.cleanup("runner","Step complete")}}catch(E){U=E.message}let Z=Math.round((Date.now()-J)/1e3),O=et(b,C,z,K,U,Z);if(c.recordStepRun({testmdStepIndex:i.steps[b].flatIndex,runIndex:C,totalRunDirs:z?.total_runs??1}),!O||P)break}}else{let{effectiveDecisions:d}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:m}=await import("./replay-policy-6USQBT3E.js"),v=o.retry===!0||o.retryCount!==void 0,y=o.retryCount!==void 0?parseInt(o.retryCount,10):Se.maxShrinks,b=o.author===!0;b&&(pt(),c.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let R=b?0:Me(p.decisions),C=0,A=null,J=p.decisions.filter(B=>B.kind==="replay").length,z=p.decisions.length-J,U=[];o.push&&U.push("--push"),v&&U.push("--retry"),o.retryCount!==void 0&&U.push(`--retry-count=${o.retryCount}`),b&&U.push("--author");let K={source:s,steps:{total:p.decisions.length,replay:J,author:z},model:I,viewport:{width:$.window_size.width,height:$.window_size.height},chrome:Q.cdpEndpoint??Q.wsEndpoint??"managed",session:c.sessionName??"ephemeral",variables:{count:Object.keys(H.raw).length,secrets:Object.values(H.raw).filter(B=>B.secret).length,names:Object.keys(H.raw)},flags:U,mode:h.mode??"testing"};for(;;){let B=c.snapshot(),Y=te.snapshot(),Z=d(p.decisions,R,b);if(C>=1){let x=R===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${C}/${y})`:`\u21BB Retry ${C}/${y} \u2014 replay 0..${R-1}, author ${R}..${p.decisions.length-1}
|
|
47
|
-
reason: replay miss at step ${(A??0)+1}`;process.stderr.write(x+`
|
|
48
|
-
`)}let O=C>=1&&R>0&&A!==null?{startIdx:0,endIdx:A,count:A}:void 0;F?.setRunActive(!0);let E=await jn({decisions:Z,resolved:i,session:c,accumulator:te,tuiConfig:$,globalConfig:K,buildStepConfigAt:Mt,buildReplayConfig:x=>{let X=p.decisions[x];if(X.kind!=="replay")throw new Error("expected replay decision at index "+x);let re=i.steps[x];return ht({step:re,decision:X,chrome:Q,auth:l,sessionId:c.sessionId,runIndex:c.nextRunIndex(),sessionDir:c.sessionDir,windowSize:{width:$.window_size.width,height:$.window_size.height},forceNavigateUrl:x===0?ye??void 0:void 0,sessionContext:c.getContext(),variables:Pn(oe.raw,re.config.variables,re.objective)})},onAnyAuthorStep:()=>{L=!0},onCancel:()=>{V=!0},topBannerModel:I,topBannerAuth:`${S.getActiveProfile()??"no profile"}/${f}`,spawnOpts:{environment:f,mode:h.mode??"testing",assertionMode:Lt,log:(x,X,re,tt)=>c.log(x,X,re,tt)},priorAttemptRollup:O,pushStepLevelDelta:(x,X)=>Ze(he(oe.raw,x,X).raw),onSequencerStepEnd:(x,X,re,tt)=>{let Is=Math.round((Date.now()-tt)/1e3),Cs=x.hadError?x.reason??"runner error":null,ks=et(X,re,x.runEnd,x.bifurcationFlows??null,Cs,Is);return c.recordStepRun({testmdStepIndex:i.steps[X].flatIndex,runIndex:re,totalRunDirs:x.runEnd?.total_runs??x.bifurcationFlows?.length??1}),ks},screenshotDispatcher:be,onReasoning:x=>F?.setStepText(x),onStepComplete:()=>F?.setStepComplete(),onSpawnStart:x=>{ne=x},host:t});if(F?.setRunActive(!1),E.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(E.failedAt===null)break;let T=m({failedAt:E.failedAt,shrinkCount:C,hasRetry:v,maxShrinks:y});if(T.kind==="fail"||!_&&!await $t())break;c.rollback(B),te.rollback(Y),T.kind==="complete-reauthor"?R=0:R=T.newAuthorBoundary,C++,N=!0,c.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:C,failed_at:A}),R===0&&c.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:C}),A=E.failedAt}}let M=te.finalize(),ie=Math.round((Date.now()-vs)/1e3),ws={session:c,resolvedAuth:l,chromeResult:Q,chromeInstance:xe??null,testId:c.testId??null,preparedVariables:H,variableIds:Pe,globalContext:jt,localContext:Ut,tuiConfig:$,env:f,localMode:!!o.local},ae=await es(ws,{performUpload:async()=>{if(!l.basicAuth)return null;let d=W(f),m=(L||o.push===!0)&&!V,v=(_||p.isFirstRun)&&!V&&M.overallStatus==="passed",y=ge&&(_||p.isFirstRun);c.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:ge,shouldUploadPipeline:y,shouldReplaceLocalOutput:m,shouldCommit:v,lockHeld:_,anyAuthorStepRan:L,cancelled:V,overallStatus:M.overallStatus});let b=os({session:c,env:f,auth:l,variables:H,variableIds:Pe,projectId:G,folderId:Ae,totalSteps:M.outcomes.length,totalDuration:ie,screenshotExtMap:Ee?.getExtMap(),codeExport:as({codeExport:o.codeExport,codeLanguage:o.codeLanguage,skipCodeValidation:o.skipCodeValidation},$.code_export),onProgress:()=>{},log:(C,A,J,z)=>c.log(C,A,J,z),shouldUploadArtifacts:y,shouldReplaceLocalOutput:m,shouldCommit:v,isFirstRun:p.isFirstRun,resolvedTest:i,sourcePath:s,stepRunRecords:c.getStepRunRecords(),outcomes:M.outcomes,overallStatus:M.overallStatus,fromCommitId:p.fromCommitId,startedISO:Xe,durationS:ie,tmsIds:{testId:p.testId??c.testId??void 0,testcaseId:p.testcaseId??c.testcaseId??void 0,projectId:G??void 0,folderId:Ae??void 0,orgId:c.orgId??void 0,sessionName:c.sessionName??Ue(s)},tmsBaseUrl:w.tmsBaseUrl,testId:p.testId??void 0,newCommitId:p.newCommitId??void 0,basicAuth:l.basicAuth??void 0,decisions:p.decisions,wantsPush:o.push===!0,retryTriggered:N,forceAuthor:o.author===!0});p.newCommitId!=null&&(b.skipTmsFinalize=!0);let R=new ar(b);return a?await R.execute():await t.runUpload(R,C=>{if(C.testcaseId&&C.shareId&&G)return wt(d.testManagerUiUrl,G,C.testcaseId,C.shareId)})},runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(d,m,v,y)=>c.log(d,m,v,y)},{overallStatus:M.overallStatus,outcomes:M.outcomes,sourcePath:s,title:i.rootTitle,rootSteps:i.rootSteps,startedISO:Xe,durationS:ie,localMode:!!o.local,skipLocalWrites:!0});await Ln(s,p,c,M.outcomes,M.overallStatus,Xe,ie,ae.uploadResult,$,o,{resolvedAuth:l,tmsBaseUrl:w.tmsBaseUrl},_,V);let Bt=W(f),Te=ae.uploadResult?.testcaseId,Oe=Te&&ae.uploadResult?.shareId&&G?wt(Bt.testManagerUiUrl,G,Te,ae.uploadResult.shareId):void 0,Vt={overallStatus:M.overallStatus,durationS:ie,decisions:p.decisions,outcomes:M.outcomes,cancelled:V,retryTriggered:N,lockHeld:_,anyAuthorStepRan:L,isFirstRun:p.isFirstRun,wantsPush:o.push===!0,uploadResult:ae.uploadResult,shouldUploadArtifacts:ge,shouldReplaceLocalOutput:L&&!V,shouldCommit:(_||p.isFirstRun)&&!V&&M.overallStatus==="passed",shareUrl:Oe},{buildSummaryEvent:_s}=await import("./SummaryBox-3VIRYWQA.js");if(a?t.onAgentEvent(_s(Vt)):await t.onSummary(Vt),!a){let d=Te&&G?Fr(Bt.testManagerUiUrl,G,Te):void 0;await t.onLinks({recordedTestPath:s,outputDir:se(s),shareableLink:Oe,testCaseLink:d,codeExportDir:ae.uploadResult?.codeExportDir})}return t.onAgentEvent({type:"test_md_done",overall_status:M.overallStatus,duration_s:ie,session_id:c.sessionId,...Oe?{share_url:Oe}:{}}),{overallStatus:M.overallStatus,exitCode:M.overallStatus==="passed"?0:1,outputDir:se(s),durationS:ie,uploadResult:ae.uploadResult}}function xn(e,t){let r={...e,...t},s=Object.keys(r).length>0?ue(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:s.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,n])=>n.secret),nonSecretEntries:Object.entries(r).filter(([,n])=>!n.secret)}}function he(e,t,r){let s={...e,...t??{}};if(Object.keys(s).length===0)return{raw:s,variables:{},objective:r};let n=ue(s,r);return{raw:s,variables:Qr(n.variables,n.objective),objective:n.objective}}function Pn(e,t,r){let s=he(e,t,r).variables;return Object.keys(s).length>0?s:void 0}function ms(e,t){let r=new Set(Ge),s={...e};for(let[n,o]of Object.entries(t))r.has(n)||n!=="variables"&&o!==void 0&&e[n]===void 0&&(s[n]=o);return s}function Tn(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function On(e,t,r,s,n,o){let a=tr(e),u=cr(t,ds(a)?a:null);mr(t,u);let i=le(e),l=ds(i)?JSON.parse(An(i,"utf8")):null,h=l?.testcase_id,f=l?.test_id,w=l?.commit_id,g=r.push===!0,I=r.retry===!0||r.retryCount!==void 0,S=r.author===!0;g&&!h&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
|
|
49
|
-
`),S&&(h=void 0,f=void 0,w=void 0);let k=s.resolvedAuth.basicAuth;if(!k){let N=await s.resolvedAuth.resolver.resolve(!0);N?.username&&N?.access_key&&(k={username:N.username,access_key:N.access_key},s.resolvedAuth.basicAuth=k)}let c=!!k,P=!r.local&&c&&f!=null&&w!=null&&h!=null,p=P&&(ur(u)||g);if(g&&!P)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
50
|
-
`),{resolved:t,decisions:u,testId:f,testcaseId:h,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:c,canLock:P,lockAcquired:!1,abort:{exitCode:2}};if(I&&!P)return process.stderr.write(`error: --retry requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
51
|
-
`),{resolved:t,decisions:u,testId:f,testcaseId:h,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:c,canLock:P,lockAcquired:!1,abort:{exitCode:2}};if(S&&!c)return process.stderr.write(`error: --author requires authenticated credentials for the TMS API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
52
|
-
`),{resolved:t,decisions:u,testId:f,testcaseId:h,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:c,canLock:P,lockAcquired:!1,abort:{exitCode:2}};let _=null,L=!1;if(p){_=n;let V=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",N=await fs({tmsBaseUrl:s.tmsBaseUrl,testId:f,fromCommitId:w,newCommitId:_,basicAuth:k,onLockConflict:V});if(N==="ok")L=!0,vt({baseUrl:ze(s.tmsBaseUrl),testId:f,auth:We(k),lifecycle:o});else{if(N==="abort")return{resolved:t,decisions:u,testId:f,testcaseId:h,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:c,canLock:P,lockAcquired:!1,abort:{exitCode:2}};_=null}}return{resolved:t,decisions:u,testId:f,testcaseId:h,fromCommitId:w,newCommitId:_,isFirstRun:h==null,hasAuth:c,canLock:P,lockAcquired:L}}function ze(e){return`${e}/kane-cli/v1`}function We(e){return{username:e.username,accessKey:e.access_key}}async function fs(e){let t=ze(e.tmsBaseUrl),r=We(e.basicAuth),s={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},n=await bt(s);if(n.ok)return"ok";if(!(n.reason==="concurrent"||n.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${n.reason} (HTTP ${n.httpStatus}): ${n.message}
|
|
53
|
-
`),"abort";let a=n.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${a}; aborting (--on-lock-conflict fail)
|
|
54
|
-
`),"abort";if(e.onLockConflict==="wait"){if(n.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
|
|
55
|
-
`),"abort";for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
|
|
56
|
-
`),await new Promise(i=>setTimeout(i,3e4));let u=await bt(s);if(u.ok)return"ok";if(u.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${u.reason} (HTTP ${u.httpStatus}): ${u.message}; aborting
|
|
57
|
-
`),"abort"}}return process.stderr.write(`[lock] ${a} \u2014 running in readonly mode (no commit)
|
|
58
|
-
`),"readonly"}async function Ln(e,t,r,s,n,o,a,u,i,l,h,f,w){let{decisions:g,testId:I,testcaseId:S,fromCommitId:k,newCommitId:c}=t;if((!(n==="passed")||w)&&f&&I&&k&&c){let p=w?"cancelled":n;process.stderr.write(`[lock] run not committed (${p}); discarding playground lock
|
|
59
|
-
`),await Dn(h,I,k,c),St();return}St()}async function Dn(e,t,r,s){let n=e.resolvedAuth.basicAuth;if(!n){let a=await e.resolvedAuth.resolver.resolve(!0);a?.username&&a?.access_key&&(n={username:a.username,access_key:a.access_key},e.resolvedAuth.basicAuth=n)}if(!n)return;let o=await _r({baseUrl:ze(e.tmsBaseUrl),testId:t,body:{commitId:s,fromCommitId:r},auth:We(n)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
|
|
60
|
-
`)}async function jn(e){let t=null,r=!1,s=0,n=-1,o=-1,a=0,u=async i=>{if(i&&i.status==="failed")return s>0&&e.decisions[s-1].kind==="replay"&&(t=s-1),null;for(;s<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[s]);)s++;if(s>=e.decisions.length)return null;let l=e.decisions[s],h=e.resolved.steps[s],f=s;s++;let w=e.session.nextRunIndex();n=f,o=w,a=Date.now(),e.onSpawnStart?.(w),l.kind==="author"&&e.onAnyAuthorStep(),await e.pushStepLevelDelta(h.config.variables,h.objective);let g=l.kind==="replay"?e.buildReplayConfig(f):e.buildStepConfigAt(f,w),I=l.kind==="replay"?"md5-match":l.reason,S=h.config??{},k={};for(let[c,P]of Object.entries(S))P!=null&&c!=="variables"&&(k[c]=P);return{config:g,banner:{stepLabel:`Step ${f+1}/${e.decisions.length}`,objective:Tn(h.objective,100)},mode:l.kind,modeReason:I,perStepOverrides:Object.keys(k).length>0?k:void 0}};return await e.host.runSteps({topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:u,onStepEnd:i=>(i.status==="failed"&&n>=0&&e.decisions[n]?.kind==="replay"&&(t=n),e.onSequencerStepEnd(i,n,o,a)),onAllComplete:()=>{},onCancel:()=>{r=!0,e.onCancel()},spawnOpts:e.spawnOpts,priorAttemptRollup:e.priorAttemptRollup,screenshotDispatcher:e.screenshotDispatcher,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete}),{failedAt:t,cancelled:r}}export{Pr as a,Tr as b,Be as c,Po as d,Br as e,jr as f,Rt as g,Or as h,Lr as i,xr as j,wt as k,Fr as l,Vr as m,Hr as n,Qr as o,Yr as p,Zr as q,It as r,os as s,as as t,ls as u,Pt as v,zi as w,Pa as x,xn as y,he as z,Pn as A,ms as B};
|
package/dist/chunk-SEU6OXMD.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as We}from"./chunk-7N5H4KTV.js";import{a as ue,b as Te}from"./chunk-MUZCEGJD.js";import{d as Ke,f as xe}from"./chunk-LOIRZFV3.js";import{a as Ue}from"./chunk-JHSSBES2.js";import{a as qe}from"./chunk-UJDIXFEE.js";import{b as Ge}from"./chunk-C6S4IEBC.js";import{x as l}from"./chunk-3UCNDPTN.js";import{a as D}from"./chunk-HCBYKLMW.js";import{a as u,b as s,i as Me,j as Ne,k as ye}from"./chunk-C44QQJR4.js";import{a as ce}from"./chunk-6YGTRKDT.js";import{e as k}from"./chunk-UR6MHSHU.js";var ee=k(ce(),1);var U=k(ce(),1);var A=k(ce(),1);function be(e,t){let r=null,a=(d,p)=>{for(let i=0;i<d.length;i++){let T=d[i],f=[...p,i];t(T)&&(r===null||f.length>r.length)&&(r=f),T.children&&T.children.length>0&&a(T.children,f)}};return a(e,[]),r}function Se(e,t,r){if(t.length===0)return[...e];let a=t[0],d=[...e],p=d[a];if(t.length===1)d[a]=r(p);else{let i=t.slice(1),T=Se(p.children??[],i,r);d[a]={...p,children:T}}return d}function _e(e){let t=e.indexOf(": ");return t>0&&t<15?e.slice(t+2):e}function Le(e){return e.map(t=>{let r=t.children?Le(t.children):t.children;return t.status==="running"?{...t,status:"stopped",phase:void 0,children:r}:r!==t.children?{...t,children:r}:t})}function He(e,t,r,a,d){let[p,i]=(0,A.useState)(!1),[T,f]=(0,A.useState)([]),[$,h]=(0,A.useState)(null),[M,N]=(0,A.useState)(null),[C,v]=(0,A.useState)(null),[I,E]=(0,A.useState)(null),[V,Q]=(0,A.useState)([]),[se,ie]=(0,A.useState)(null),[ne,ae]=(0,A.useState)(void 0),G=(0,A.useRef)(null),W=(0,A.useRef)(null),Y=(0,A.useRef)(0),me=(0,A.useRef)(!1),Re=(0,A.useCallback)(async(Z,b)=>{let y=G.current;if(y){try{await y.exited}catch{}G.current=null}f([]),h(null),N(null),v(null),E(null),Q([]),ie(null),ae(Z.max_steps),i(!0),W.current=null,Y.current=0;let x;try{x=We(Z,b)}catch(g){v(g instanceof Error?g.message:String(g)),i(!1);return}G.current=x,Ke("runner",()=>x.cancel()),(async()=>{me.current=!1;let g=!1;for await(let n of x.events){if(me.current)break;switch(n.type){case"run_start":if(n.child_id)break;if(W.current&&!W.current.isSingleFlow){let B=Y.current;Y.current++,f(O=>O.map((R,w)=>w===B?{...R,status:"running"}:R.status==="running"&&!R.children?.some(c=>c.status==="running")?{...R,status:R.children?.some(c=>c.status==="failed")?"failed":"passed"}:R))}break;case"bifurcation":{let B=n.flows??[],O=n.count??B.length,R={flows:B,isSingleFlow:n.is_single_flow??O<=1};E(R),W.current=R,Y.current=0,f(B.map((w,c)=>({index:c+1,objective:w??`Flow ${c+1}`,status:"pending"})));break}case"step_start":{t?.("STEP_START",`Step ${n.index} started`,{index:n.index,objective:n.objective,child_id:n.child_id});let B=n.index,O=n.objective??`Step ${B}`,R=n.child_id,w=W.current&&!W.current.isSingleFlow;if(R)f(c=>{let m=be(c,L=>L.branchChildId===R)??be(c,L=>L.status==="running");return m?Se(c,m,L=>{let F=(L.children??[]).map(H=>H.status==="running"&&H.childId===R?{...H,status:"stopped",phase:void 0}:H);return F.push({index:B,objective:O,status:"running",childId:R}),{...L,children:F}}):c});else if(w){let c=Math.max(0,Y.current-1);f(m=>{let L=[...m];if(c>=L.length)return m;let F={...L[c]},ge=[...F.children??[]].map(ve=>ve.status==="running"&&ve.childId===void 0?{...ve,status:"stopped",phase:void 0}:ve);return ge.push({index:B,objective:O,status:"running"}),F.children=ge,F.status="running",L[c]=F,L})}else f(c=>{let m=Le(c);return m.some(F=>F.index===B)?m.map(F=>F.index===B?{...F,status:"running",objective:O}:F):[...m,{index:B,objective:O,status:"running"}]});break}case"step_event":{t?.("STEP_EVENT",`Step ${n.index} ${n.event}`,{index:n.index,phase:n.event,action_type:n.action_type,detail:n.detail,child_id:n.child_id});let B=n.child_id,O=W.current&&!W.current.isSingleFlow;if(n.event==="cm_init"&&n.checkpoint_count!=null){Q(R=>[...R,n.checkpoint_count]);break}if(n.event==="replay_started"){ie({recordingLength:n.recording_length??0});break}if(n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&r?.(n.detail),B){let R=c=>{if(c.index!==n.index||c.childId!==B)return c;let m={phase:n.event};return n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(m.objective=n.detail),n.action_type&&(m.actionType=n.action_type),{...c,...m}},w=c=>c.map(m=>{let L=R(m);return L!==m?L:m.children&&m.children.length>0?{...m,children:w(m.children)}:m});f(c=>c.map(m=>m.children?{...m,children:w(m.children)}:m))}else if(O){let R=Math.max(0,Y.current-1);f(w=>{let c=[...w];if(R>=c.length)return w;let m={...c[R]},L=[...m.children??[]];if(!L.some(H=>H.index===n.index&&H.childId===void 0))L.push({index:n.index,objective:`Step ${n.index}`,status:"running",phase:n.event,actionType:n.action_type});else for(let H=0;H<L.length;H++){if(L[H].index!==n.index||L[H].childId!==void 0)continue;let ge={phase:n.event};n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(ge.objective=n.detail),n.action_type&&(ge.actionType=n.action_type),L[H]={...L[H],...ge}}return m.children=L,c[R]=m,c})}else f(R=>R.some(c=>c.index===n.index)?R.map(c=>{if(c.index!==n.index)return c;let m={phase:n.event};return n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(m.objective=n.detail),n.action_type&&(m.actionType=n.action_type),{...c,...m}}):[...Le(R),{index:n.index,objective:`Step ${n.index}`,status:"running",phase:n.event,actionType:n.action_type}]);break}case"step_end":{t?.("STEP_END",`Step ${n.index} ${n.status}`,{index:n.index,status:n.status,duration:n.duration,summary:n.summary,child_id:n.child_id}),a?.();let B=n.child_id,O=W.current&&!W.current.isSingleFlow;if(B){let R=c=>c.index===n.index&&c.childId===B?{...c,status:n.status,duration:n.duration,phase:void 0,objective:c.objective.startsWith("Step ")?_e(n.summary||c.objective):c.objective}:c,w=c=>c.map(m=>{let L=R(m);return L!==m?L:m.children&&m.children.length>0?{...m,children:w(m.children)}:m});f(c=>c.map(m=>m.children?{...m,children:w(m.children)}:m))}else if(O){let R=Math.max(0,Y.current-1);f(w=>{let c=[...w];if(R>=c.length)return w;let m={...c[R]},L=(m.children??[]).map(F=>F.index===n.index&&F.childId===void 0?{...F,status:n.status,duration:n.duration,phase:void 0,objective:F.objective.startsWith("Step ")?_e(n.summary||F.objective):F.objective}:F);return m.children=L,c[R]=m,c})}else f(R=>R.map(w=>w.index===n.index?{...w,status:n.status,duration:n.duration,phase:void 0,objective:w.objective.startsWith("Step ")?_e(n.summary||w.objective):w.objective}:w));{let w=W.current&&!W.current.isSingleFlow?Math.max(0,Y.current-1):0;e?.(n.index,w,n.child_id)}break}case"child_agent_start":{let B=n.objective??"",O=n.child_id;f(R=>{let w=be(R,c=>c.status==="running");return w?Se(R,w,c=>({...c,objective:`${B} (branch)`,phase:`child: ${B.slice(0,50)}`,branchObjective:B,branchChildId:O})):R});break}case"child_agent_end":{let B=n.child_id,O=`child ${n.success?"done":"failed"}`;f(R=>{let w=be(R,c=>c.branchChildId===B);return w?Se(R,w,c=>({...c,phase:O})):R.map(c=>c.phase?.startsWith("child:")?{...c,phase:O}:c)});break}case"describe_trigger":d?.(n);break;case"ask_user":h(n.question??"");break;case"run_end":f(B=>B.map(O=>O.status==="running"?{...O,status:n.status,phase:void 0}:O)),i(!1),N(n),g=!0;break;case"error":i(!1),v(n.message??"Runner error"),f(B=>B.map(O=>O.status==="running"?{...O,status:"failed",phase:void 0}:O));break}}let{code:S,signal:P}=await x.exited,_=x.stderr,le=S===0&&!P,oe=[];S!==null&&S!==0&&oe.push(`Runner exited with code ${S}`),P&&oe.push(`Runner killed by signal ${P}`),_&&(!le||!g?oe.push(_):b?.log?.("debug","RUNNER_STDERR_BENIGN","Runner stderr on clean exit",{stderr:_})),G.current===x&&(oe.length>0&&v(oe.join(`
|
|
3
|
-
`)),i(!1),xe("runner","Event stream ended"),G.current=null)})().catch(g=>{let S=[`Runner event loop error: ${g}`];x.exitCode!==null&&x.exitCode!==0&&S.push(`Exit code: ${x.exitCode}`),x.exitSignal&&S.push(`Signal: ${x.exitSignal}`),x.stderr&&S.push(x.stderr),G.current===x&&(v(S.join(`
|
|
4
|
-
`)),i(!1),xe("runner","Event loop error"),G.current=null)})},[e,t,r,a,d]),re=(0,A.useCallback)(Z=>{G.current?.sendUserResponse(Z),h(null)},[]),Ce=(0,A.useCallback)(()=>{let Z=G.current;Z&&(Z.sendCancel("user"),i(!1),h(null),setTimeout(()=>{G.current===Z&&(xe("runner","User cancelled run"),G.current=null)},5e3))},[]),Pe=(0,A.useCallback)(()=>{f([]),N(null),v(null)},[]);return(0,A.useEffect)(()=>()=>{me.current=!0,xe("runner","Component unmounted"),G.current=null},[]),{isRunning:p,steps:T,askingUser:$,lastRunEnd:M,runError:C,bifurcationInfo:I,cmInitCounts:V,replayInfo:se,maxSteps:ne,startRun:Re,sendAnswer:re,cancelRun:Ce,clearLastRun:Pe}}function Oe(e){let t=e.flatMap(p=>[p,...p.children??[]]),r=t.filter(p=>p.status==="passed").length,a=t.filter(p=>p.status==="failed").length,d=t.filter(p=>p.status==="passed"||p.status==="failed").length;return{passed:r,failed:a,total:d}}function Ve(e){let t=He(e.screenshotDispatcher,e.stepLogger,e.onReasoning,e.onStepComplete),[r,a]=(0,U.useState)(0),[d,p]=(0,U.useState)("idle"),i=(0,U.useRef)("idle"),T=(0,U.useRef)(0),f=(0,U.useRef)(!1),$=(0,U.useRef)(null),h=(0,U.useRef)(null),M=(0,U.useCallback)(v=>{i.current=v,p(v)},[]),N=(0,U.useCallback)(async v=>{let I=await e.getNextConfig(v);if(!I){M("done"),e.onAllComplete?.();return}let E=v?T.current+1:0;T.current=E,a(E),e.onStepStart?.(I,E),$.current=null,h.current=null,M("running"),await t.startRun(I,e.spawnOpts)},[t,e,M]);(0,U.useEffect)(()=>{f.current||(f.current=!0,N(null))},[]),(0,U.useEffect)(()=>{if(!t.lastRunEnd||t.lastRunEnd===$.current||i.current!=="running")return;$.current=t.lastRunEnd,i.current="transitioning",p("transitioning");let v=t.lastRunEnd,I=Oe(t.steps),E=t.bifurcationInfo,V={status:v.status==="passed"?"passed":"failed",duration_s:v.duration??0,reason:v.reason,runEnd:v,hadError:!1,stepsPassed:I.passed,stepsFailed:I.failed,stepsTotal:I.total,bifurcationFlows:E&&!E.isSingleFlow?E.flows:null};if(!(e.onStepEnd?.(V,T.current)??!0)){M("done"),e.onAllComplete?.();return}N(V)},[t.lastRunEnd]),(0,U.useEffect)(()=>{if(!t.runError||t.runError===h.current||t.lastRunEnd||i.current!=="running")return;h.current=t.runError,i.current="transitioning",p("transitioning");let v=Oe(t.steps),I={status:"failed",duration_s:0,reason:t.runError,runEnd:null,hadError:!0,stepsPassed:v.passed,stepsFailed:v.failed,stepsTotal:v.total,bifurcationFlows:null};if(!(e.onStepEnd?.(I,T.current)??!0)){M("done"),e.onAllComplete?.();return}N(I)},[t.runError,t.lastRunEnd]);let C=(0,U.useCallback)(()=>{t.cancelRun()},[t]);return{runner:t,currentStepIndex:r,phase:d,cancel:C}}var je=k(ce(),1);var Be=k(D(),1),ze=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function Xe({label:e,hasBifurcation:t=!1}){let[r,a]=(0,je.useState)(0),[d,p]=(0,je.useState)(0);ue(()=>{a(T=>(T+1)%ze.length)},80),ue(()=>{p(T=>(T+1)%4)},400);let i=e??(t?"Planning approach":"Analyzing objective");return(0,Be.jsxs)(u,{marginLeft:1,children:[(0,Be.jsxs)(s,{color:l.orange,children:[ze[r]," "]}),(0,Be.jsxs)(s,{color:l.dim,children:[i,".".repeat(d+1)]})]})}function Ye(e){if(!e.isRunning||e.replayInfo)return null;let t=e.bifurcationInfo;if(t&&!t.isSingleFlow){let r=e.steps.findIndex(d=>d.status==="running");return(r===-1?e.cmInitCounts.length===0:r>=e.cmInitCounts.length)?{label:r>0?`Planning flow ${r+1}`:void 0,hasBifurcation:!0}:null}return e.cmInitCounts.length>0||e.steps.some(r=>r.children?.length)?null:{hasBifurcation:!!t}}var q=k(ce(),1);var Qe=k(ce(),1);var we=k(D(),1),lt="#ffc580",ct="#ffd9a8",Je="#ffffff";function Ie({text:e,active:t=!0}){let[r,a]=(0,Qe.useState)(0),d=4;if(ue(()=>{a(i=>(i+1)%(e.length+d*2))},t?80:null),!t)return(0,we.jsx)(s,{color:Je,children:e});let p=e.split("").map((i,T)=>{let f=r-d,$=Math.abs(T-f-d/2),h;return $<=d/2?h=lt:$<=d?h=ct:h=Je,(0,we.jsx)(s,{color:h,children:i},T)});return(0,we.jsx)(s,{children:p})}var J=k(D(),1),ut={starting:l.orange,running:l.orange,passed:l.green,failed:l.red,cancelled:l.dim,timed_out:l.orange};function $e({currentStep:e,maxSteps:t,elapsed:r,status:a}){let d=ut[a]??l.orange,p=r<60?`${r.toFixed(1)}s`:`${Math.floor(r/60)}m ${Math.round(r%60)}s`;return(0,J.jsxs)(u,{marginLeft:3,children:[(0,J.jsx)(s,{color:l.dim,children:"Steps "}),(0,J.jsx)(s,{bold:!0,children:e}),(0,J.jsxs)(s,{color:l.dim,children:["/",t]}),(0,J.jsx)(s,{children:" "}),(0,J.jsx)(s,{color:l.dim,children:"Elapsed "}),(0,J.jsx)(s,{bold:!0,children:p}),(0,J.jsx)(s,{children:" "}),(0,J.jsx)(s,{color:l.dim,children:"Status "}),(0,J.jsx)(s,{bold:!0,color:d,children:a})]})}var dt={click:"\u25CF",type:"\u229E",scroll:"\u2195",navigate:"\u2192",analyze:"\u25CE",assert:"\u25C8","if-else":"\u2442",select:"\u25BC",press_key:"\u21B5",wait:"\u2026",tool_call:"\u2299"};function Ze(e){return dt[e]??"\u25CF"}var te=k(D(),1);function De({steps:e,flows:t,cmInitCounts:r,renderStep:a}){return(0,te.jsxs)(u,{flexDirection:"column",marginLeft:2,paddingLeft:1,children:[(0,te.jsxs)(s,{color:l.dim,children:["\u2501\u2501 Bifurcated into ",t?.length??e.length," flows \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501"]}),e.map((d,p)=>(0,te.jsxs)(u,{flexDirection:"column",marginTop:p>0?1:0,children:[(0,te.jsxs)(s,{color:l.orange,children:["Flow ",p+1,": ",t?.[p]??d.objective]}),r&&r[p]!=null&&(0,te.jsxs)(s,{color:l.dim,children:[" \u25AA Generated task with ",r[p]," checkpoints"]}),d.children&&d.children.length>0?d.children.map(i=>{let T=!!i.branchObjective,f=`f${p}-${i.childId??"p"}-${i.index}`;return T?(0,te.jsxs)(u,{flexDirection:"column",children:[a({...i,children:void 0},f),(i.children??[]).map($=>(0,te.jsx)(u,{marginLeft:2,children:a($,`${f}-${$.childId??"p"}-${$.index}`)},`${f}-${$.childId??"p"}-${$.index}`))]},`${f}-host`):a(i,f)}):d.status==="pending"&&(0,te.jsx)(s,{color:l.dim,children:" \u25CB Waiting..."})]},p))]})}var de=k(D(),1);function et({label:e,shimmer:t=!1}){return(0,de.jsxs)(u,{marginLeft:6,children:[(0,de.jsx)(Te,{}),(0,de.jsx)(s,{children:" "}),t?(0,de.jsx)(Ie,{text:e,active:!0}):(0,de.jsx)(s,{color:l.dim,children:e})]})}var tt=k(ce(),1);var Fe=k(D(),1);function pt(e,t){let r=[];for(let a of e.split(`
|
|
5
|
-
`)){if(a===""){r.push("");continue}let d="";for(let p of a.split(" ")){let i=p;for(;i.length>t;)d&&(r.push(d),d=""),r.push(i.slice(0,t)),i=i.slice(t);d===""?d=i:d.length+1+i.length<=t?d+=" "+i:(r.push(d),d=i)}r.push(d)}return r}function nt({text:e,maxLines:t=3}){let{stdout:r}=ye(),a=Math.max(20,(r?.columns??80)-7),d=!e.trim(),[p,i]=(0,tt.useState)(!0);ue(()=>i($=>!$),500);let T=(d?"Thinking\u2026":e)+(p?"\u258C":" "),f=pt(T,a).slice(-t);for(;f.length<t;)f.push("");return(0,Fe.jsx)(u,{borderStyle:"round",borderColor:l.muted,paddingX:1,marginLeft:3,flexDirection:"column",children:f.map(($,h)=>(0,Fe.jsx)(s,{color:d?l.dim:l.secondary,wrap:"truncate-end",children:$.length?$:" "},h))})}var pe=k(D(),1);function Ee({activity:e,describe:t,describeVisible:r}){return(0,pe.jsxs)(pe.Fragment,{children:[e?(0,pe.jsx)(et,{label:e.label,shimmer:e.shimmer}):null,r?(0,pe.jsx)(nt,{text:t??""}):null]})}var o=k(D(),1);function ke(e){for(let t of e){if(t.children&&t.children.length>0){let r=ke(t.children);if(r)return r}if(t.status==="running")return t}}function he(e){return e.status==="running"&&!e.branchObjective&&(!e.children||e.children.length===0)}function rt(e){let t=[];for(let r of e)he(r)||(r.children&&r.children.length>0?t.push({...r,children:rt(r.children)}):t.push(r));return t}function Ae(e,t){if(!e)return null;let r=e.objective??"";return r.length>0&&!/^Step \d+$/.test(r)?{label:r+"\u2026",shimmer:!1}:{label:t?"Looking at the screen\u2026":"Deciding next action\u2026",shimmer:!0}}function K({step:e,indent:t=2}){let r=e.actionType?Ze(e.actionType):null,a=e.status==="running",d=e.status==="passed",p=e.status==="failed",i=e.status==="pending"||e.status==="stopped",{stdout:T}=ye(),f=T?.columns??80,$=Math.max(20,f-t-21),h=e.objective??"",M=h.length>$?h.slice(0,$-1)+"\u2026":h,N=(e.duration??0)*1e3,C=e.duration!=null?N<1e3?`${Math.round(N)}ms`:`${(N/1e3).toFixed(1)}s`:"";return(0,o.jsxs)(u,{flexDirection:"column",children:[(0,o.jsxs)(u,{marginLeft:t,children:[(0,o.jsx)(u,{width:4,children:(0,o.jsxs)(s,{color:l.muted,children:[String(e.index).padStart(2," ")," "]})}),(0,o.jsx)(u,{width:3,children:a?(0,o.jsx)(Te,{}):d?(0,o.jsx)(s,{color:l.green,bold:!0,children:"\u2713"}):p?(0,o.jsx)(s,{color:l.red,bold:!0,children:"\u2717"}):(0,o.jsx)(s,{color:l.muted,children:"\u25CB"})}),(0,o.jsx)(u,{flexGrow:1,children:a?(0,o.jsx)(Ie,{text:M,active:!0}):p?(0,o.jsx)(s,{color:l.red,children:M}):i?(0,o.jsx)(s,{color:l.dim,children:M}):(0,o.jsx)(s,{color:l.dim,children:M})}),(d||p)&&r?(0,o.jsx)(u,{width:3,marginLeft:1,children:(0,o.jsx)(s,{color:l.muted,children:r})}):(0,o.jsx)(u,{width:3,marginLeft:1}),(0,o.jsx)(u,{width:7,justifyContent:"flex-end",children:(0,o.jsx)(s,{color:l.dim,children:C})})]}),e.children&&e.children.length>0&&(0,o.jsx)(u,{flexDirection:"column",children:e.children.map((v,I)=>(0,o.jsx)(K,{step:v,indent:t+2},`child-${I}`))})]})}function ft(e){return e.type==="cm_init"?(0,o.jsx)(u,{marginLeft:2,paddingLeft:1,children:(0,o.jsxs)(s,{color:l.dim,children:["\u25AA Generated task with ",e.count," checkpoints"]})}):(0,o.jsx)(u,{marginLeft:2,paddingLeft:1,children:(0,o.jsx)(K,{step:e.step})})}function ot({steps:e,bifurcated:t,flows:r,cmInitCounts:a,maxSteps:d=50,staticSteps:p=!1,onStepCommit:i,describe:T,describeVisible:f,describeRevealing:$}){let h=(0,q.useRef)(new Set),M=(0,q.useRef)(!1),N=(0,q.useRef)(new Set),C=(0,q.useRef)(!1),v=(0,q.useRef)(new Set),I=(0,q.useRef)(0);(0,q.useEffect)(()=>{e.length===0&&I.current>0&&(h.current.clear(),M.current=!1,N.current.clear(),C.current=!1,v.current.clear()),I.current=e.length},[e.length]);let E=e.flatMap(b=>[b,...b.children??[]]),V=E.some(b=>b.status==="running"),Q=E.some(b=>b.status==="failed"),se=E.length===0||E.every(b=>b.status==="pending"),ie=E.filter(b=>b.status==="passed"||b.status==="failed").length,ne;se?ne="starting":V?ne="running":Q?ne="failed":ne="passed";let ae=(0,q.useRef)(null),[G,W]=(0,q.useState)(0);(0,q.useEffect)(()=>{E.length===0||se?(ae.current=null,W(0)):V&&ae.current==null&&(ae.current=Date.now())},[V,se,E.length]),(0,q.useEffect)(()=>{if(!V)return;let b=setInterval(()=>{ae.current!=null&&W((Date.now()-ae.current)/1e3)},500);return()=>clearInterval(b)},[V]);let Y=(0,q.useRef)(new Set),[,me]=(0,q.useState)(0),Re=(0,q.useRef)(!1);(0,q.useEffect)(()=>{if(!i||!p||t)return;let b=[];!Re.current&&a&&a[0]!=null&&(Re.current=!0,a[0]>0&&b.push({key:"cm_init_0",type:"cm_init",count:a[0]}));for(let y of e)(y.status==="passed"||y.status==="failed")&&!Y.current.has(y.index)&&(Y.current.add(y.index),b.push({key:`step_${y.index}`,type:"step",step:{...y,children:y.children?[...y.children]:void 0}}));if(b.length>0){for(let y of b)i(ft(y));me(y=>y+1)}},[e,t,a,p,i]),(0,q.useEffect)(()=>{if(!i||p)return;let b=h.current.size;if(!t&&!C.current&&a&&a[0]!=null&&(C.current=!0,a[0]>0&&i((0,o.jsx)(u,{marginLeft:2,children:(0,o.jsxs)(s,{color:l.dim,children:["\u25A0 Generated task with ",a[0]," checkpoints"]})}))),t&&r&&!M.current&&(M.current=!0,i((0,o.jsx)(s,{color:l.purple,children:"\u2501\u2501 Bifurcated into "+r.length+" flows \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501"}))),t){let y=e.flatMap((x,g)=>{let S=x.children??[];return!N.current.has(g)&&S.length>0&&(N.current.add(g),i((0,o.jsx)(s,{color:l.purple,children:" Flow "+(g+1)+": "+(r?.[g]??"")})),a?.[g]!=null&&a[g]>0&&!v.current.has(g)&&(v.current.add(g),i((0,o.jsx)(u,{marginLeft:2,children:(0,o.jsxs)(s,{color:l.dim,children:[" \u25AA Generated task with ",a[g]," checkpoints"]})})))),a?.[g]!=null&&a[g]>0&&N.current.has(g)&&!v.current.has(g)&&(v.current.add(g),i((0,o.jsx)(u,{marginLeft:2,children:(0,o.jsxs)(s,{color:l.dim,children:[" \u25AA Generated task with ",a[g]," checkpoints"]})}))),S});for(let x of y){let g=`${x.childId??"p"}-${x.index}-${x.objective}`;if(!!x.branchObjective){h.current.has(g)||(h.current.add(g),i((0,o.jsx)(u,{marginLeft:2,children:(0,o.jsx)(K,{step:{...x,children:void 0}})})));for(let P of x.children??[]){let _=`child-${x.childId??"p"}-${x.index}-${P.childId??"p"}-${P.index}-${P.objective}`;h.current.has(_)||(P.status==="passed"||P.status==="failed"||P.status==="stopped")&&(h.current.add(_),i((0,o.jsx)(u,{marginLeft:4,children:(0,o.jsx)(K,{step:P})})))}continue}h.current.has(g)||(x.status==="passed"||x.status==="failed"||x.status==="stopped")&&(h.current.add(g),i((0,o.jsx)(u,{marginLeft:2,children:(0,o.jsx)(K,{step:x})})))}}else for(let y of e){let x=`${y.index}-${y.objective}`,g=!!y.branchObjective;g&&!h.current.has(x)&&(h.current.add(x),i((0,o.jsx)(u,{marginLeft:2,children:(0,o.jsx)(K,{step:{...y,children:void 0}})})));for(let S of y.children??[]){let P=`child-${y.index}-${S.childId??"p"}-${S.index}-${S.objective}`;h.current.has(P)||(S.status==="passed"||S.status==="failed"||S.status==="stopped")&&(h.current.add(P),i((0,o.jsx)(u,{marginLeft:4,children:(0,o.jsx)(K,{step:S})})))}!g&&!h.current.has(x)&&(y.status==="passed"||y.status==="failed"||y.status==="stopped")&&(h.current.add(x),i((0,o.jsx)(u,{marginLeft:2,children:(0,o.jsx)(K,{step:{...y,children:void 0}})})))}h.current.size>b&&me(y=>y+1)},[e,i,t,r,a]);let re=[];if(p&&!t)for(let b of e)Y.current.has(b.index)||re.push(b);else if(i&&!p)if(t)for(let b of e){let y=b.children??[],x=[];for(let g of y){let S=`${g.childId??"p"}-${g.index}-${g.objective}`,P=h.current.has(S);if(g.branchObjective){let _=(g.children??[]).filter(le=>{let oe=`child-${g.childId??"p"}-${g.index}-${le.childId??"p"}-${le.index}-${le.objective}`;return!h.current.has(oe)});(!P||_.length>0)&&x.push({...g,children:_})}else P||x.push(g)}x.length>0&&re.push({...b,children:x})}else for(let b of e){let y=`${b.index}-${b.objective}`,x=h.current.has(y),g=(b.children??[]).filter(S=>{let P=`child-${b.index}-${S.childId??"p"}-${S.index}-${S.objective}`;return!h.current.has(P)});x?g.length>0&&re.push({...b,children:g}):re.push({...b,children:g})}if(!p){let b=i?re:e,y=ke(b),x=Ae(y,$);return(0,o.jsxs)(u,{flexDirection:"column",children:[t?i?b.length>0?(0,o.jsx)(u,{flexDirection:"column",marginLeft:2,paddingLeft:1,children:b.map((S,P)=>(0,o.jsx)(u,{flexDirection:"column",marginTop:P>0?1:0,children:S.children&&S.children.length>0?S.children.map(_=>{if(he(_))return null;let le=!!_.branchObjective,oe=`${_.childId??"p"}-${_.index}-${_.objective}`,n=h.current.has(oe);return le?(0,o.jsxs)(u,{flexDirection:"column",children:[!n&&(0,o.jsx)(K,{step:{..._,children:void 0}}),(_.children??[]).filter(B=>!he(B)).map(B=>(0,o.jsx)(u,{marginLeft:2,children:(0,o.jsx)(K,{step:B})},`f${P}-${_.index}-${B.childId??"p"}-${B.index}`))]},`f${P}-host-${_.childId??"p"}-${_.index}`):(0,o.jsx)(K,{step:_},`f${P}-${_.childId??"p"}-${_.index}`)}):S.status==="pending"&&(0,o.jsx)(s,{color:l.dim,children:" \u25CB Waiting..."})},P))}):null:(0,o.jsx)(De,{steps:e,flows:r,cmInitCounts:a,renderStep:(S,P)=>he(S)?null:(0,o.jsx)(K,{step:S},P)}):(0,o.jsxs)(u,{flexDirection:"column",marginLeft:2,paddingLeft:1,children:[!i&&a&&a[0]!=null&&(0,o.jsxs)(s,{color:l.dim,children:["\u25AA Generated task with ",a[0]," checkpoints"]}),b.filter(S=>!(S.status==="running"&&(!S.children||S.children.length===0))).map(S=>{let P=`${S.index}-${S.objective}`;return i&&h.current.has(P)?(0,o.jsx)(u,{flexDirection:"column",children:(S.children??[]).filter(_=>!he(_)).map(_=>(0,o.jsx)(u,{marginLeft:2,children:(0,o.jsx)(K,{step:_})},`${_.childId??"p"}-${_.index}`))},`branch-children-${S.index}`):(0,o.jsx)(K,{step:S},S.index)})]}),(0,o.jsx)(Ee,{activity:x,describe:T,describeVisible:f}),E.length>0&&(0,o.jsx)($e,{currentStep:ie,maxSteps:d,elapsed:G,status:ne})]})}if(t){let b=ke(e),y=Ae(b,$);return(0,o.jsxs)(u,{flexDirection:"column",children:[(0,o.jsx)(De,{steps:e,flows:r,cmInitCounts:a,renderStep:(x,g)=>he(x)?null:(0,o.jsx)(K,{step:x},g)}),(0,o.jsx)(Ee,{activity:y,describe:T,describeVisible:f}),E.length>0&&(0,o.jsx)($e,{currentStep:ie,maxSteps:d,elapsed:G,status:ne})]})}let Ce=ke(re),Pe=Ae(Ce,$),Z=rt(re);return(0,o.jsxs)(u,{flexDirection:"column",children:[Z.length>0&&(0,o.jsx)(u,{flexDirection:"column",marginLeft:2,paddingLeft:1,children:Z.map(b=>(0,o.jsx)(K,{step:b},b.index))}),(0,o.jsx)(Ee,{activity:Pe,describe:T,describeVisible:f}),E.length>0&&(0,o.jsx)($e,{currentStep:ie,maxSteps:d,elapsed:G,status:ne})]})}var fe=k(D(),1);function it({runner:e,runKey:t,onStepCommit:r}){let a=Ye({isRunning:e.isRunning,bifurcationInfo:e.bifurcationInfo,steps:e.steps,cmInitCounts:e.cmInitCounts,replayInfo:e.replayInfo});return(0,fe.jsxs)(fe.Fragment,{children:[a&&(0,fe.jsx)(Xe,{label:a.label,hasBifurcation:a.hasBifurcation}),e.isRunning&&e.steps.length>0&&(0,fe.jsx)(ot,{steps:e.steps,bifurcated:!!e.bifurcationInfo&&!e.bifurcationInfo.isSingleFlow,flows:e.bifurcationInfo?.flows,cmInitCounts:e.cmInitCounts,maxSteps:e.maxSteps,onStepCommit:r},`run-${t}`)]})}var z=k(D(),1),mt=64;function gt(e){return e.split(`
|
|
6
|
-
`).map(t=>t.replace(/^[-–•]\s*/,"").trim()).filter(t=>t.length>0)}function st({status:e,summary:t,duration:r,steps:a,stepsPassed:d,stepsFailed:p,reason:i,creditsConsumed:T}){let f=e==="passed",$=f?l.green:l.red,h=f?"\u2713":"\u2717",M=e.toUpperCase(),N=d??(f?a:Math.max(0,a-1)),C=p??(f?0:1),v=C>0?`${a} steps (${N} passed, ${C} failed)`:`${a} steps`,I=r<60?`${r.toFixed(1)}s`:`${Math.floor(r/60)}m ${Math.round(r%60)}s`,E=gt(t);return(0,z.jsx)(u,{flexDirection:"column",marginTop:1,children:(0,z.jsxs)(u,{borderStyle:"round",borderColor:$,flexDirection:"column",paddingX:2,paddingY:1,width:mt+6,children:[(0,z.jsxs)(u,{flexDirection:"column",children:[(0,z.jsxs)(s,{bold:!0,color:$,children:[h," ",M]}),(0,z.jsxs)(s,{color:l.dim,wrap:"wrap",children:[v," \xB7 ",I,typeof T=="number"&&T>0?` \xB7 ${parseFloat(T.toFixed(4))} credits`:""]})]}),E.length>0&&(0,z.jsx)(u,{flexDirection:"column",marginTop:1,marginLeft:1,children:E.map((V,Q)=>(0,z.jsxs)(u,{marginBottom:Q<E.length-1?1:0,children:[(0,z.jsx)(s,{color:l.orange,children:"\u25CF "}),(0,z.jsx)(u,{flexShrink:1,children:(0,z.jsx)(s,{wrap:"wrap",children:V})})]},Q))}),i&&!f&&(0,z.jsx)(u,{marginTop:1,children:(0,z.jsxs)(s,{color:l.red,wrap:"wrap",children:["Reason: ",i]})})]})})}var X=k(D(),1);function at({message:e,code:t,remediation:r,docsUrl:a}){return(0,X.jsx)(qe,{title:"Error",variant:"error",children:(0,X.jsxs)(u,{flexDirection:"column",paddingY:1,children:[(0,X.jsxs)(s,{color:l.red,bold:!0,children:[" \u2717 ",e]}),t&&(0,X.jsxs)(u,{marginTop:0,marginLeft:5,children:[(0,X.jsx)(s,{color:l.muted,children:"Code: "}),(0,X.jsx)(s,{color:l.dim,children:t})]}),r&&(0,X.jsxs)(u,{flexDirection:"column",marginTop:1,marginLeft:5,children:[(0,X.jsx)(s,{color:l.green,bold:!0,children:"Fix:"}),(0,X.jsxs)(s,{color:l.orange,children:["$ ",r]})]}),a&&(0,X.jsxs)(u,{marginTop:1,marginLeft:5,children:[(0,X.jsx)(s,{color:l.muted,children:"Docs: "}),(0,X.jsx)(s,{color:l.orange,underline:!0,children:a})]})]})})}var j=k(D(),1);function Ln(e){let{exit:t}=Ne(),{append:r}=Ge(),a=(0,ee.useRef)(!1);(0,ee.useEffect)(()=>{a.current||(a.current=!0,r((0,j.jsx)(u,{flexDirection:"column",marginBottom:1,children:(0,j.jsxs)(u,{borderStyle:"round",borderColor:"#dc4e08",paddingX:2,children:[(0,j.jsx)(s,{color:"#ff9500",bold:!0,children:"KaneAI CLI"}),(0,j.jsx)(s,{color:l.dim,children:" \u2502 "}),(0,j.jsx)(s,{color:l.orange,children:e.topBanner.model}),(0,j.jsx)(s,{color:l.dim,children:" \u2502 "}),(0,j.jsx)(s,{color:l.dim,children:e.topBanner.auth})]})})),r((0,j.jsx)(ht,{data:e.globalConfig})),e.priorAttemptRollup&&r((0,j.jsx)(s,{color:l.dim,children:` \u21B3 replayed ${e.priorAttemptRollup.startIdx}..${e.priorAttemptRollup.endIdx-1} (${e.priorAttemptRollup.count} steps, from prior attempt)`})))},[]);let d=(0,ee.useRef)(null),p=(0,ee.useCallback)(async C=>{let v=await e.getNextStep(C);return v?(d.current=v,v.config):(d.current=null,null)},[e]),i=(0,ee.useCallback)((C,v)=>{let I=d.current;if(!I)return;let E=I.mode==="replay"?"cyan":"#dc4e08",V=I.modeReason?` (${I.modeReason})`:"",Q=I.perStepOverrides?Object.entries(I.perStepOverrides):[];r((0,j.jsxs)(u,{flexDirection:"column",marginBottom:0,children:[(0,j.jsxs)(s,{children:[(0,j.jsxs)(s,{color:l.dim,children:[I.banner.stepLabel," "]}),(0,j.jsxs)(s,{color:E,children:["[",I.mode,"]"]}),(0,j.jsx)(s,{color:l.dim,children:V})]}),(0,j.jsx)(s,{color:l.dim,children:I.banner.objective}),Q.length>0&&(0,j.jsxs)(s,{color:l.dim,children:["overrides: ",Q.map(([se,ie])=>`${se}=${ie}`).join(", ")]})]}))},[r]),T=(0,ee.useRef)(0),f=(0,ee.useRef)(!1),$=(0,ee.useCallback)((C,v)=>(C.hadError?r((0,j.jsx)(at,{message:C.reason??"Runner error",code:"RUNNER_ERROR"})):r((0,j.jsx)(u,{flexDirection:"column",marginBottom:1,children:(0,j.jsx)(st,{status:C.status,summary:C.runEnd?.summary??"",duration:C.runEnd?.duration??0,steps:C.stepsTotal,stepsPassed:C.stepsPassed,stepsFailed:C.stepsFailed,reason:C.runEnd?.reason,creditsConsumed:C.runEnd?.credits_consumed})})),e.onStepEnd?.(C,v)??!0),[r,e]),h=Ve({getNextConfig:p,onStepStart:i,onStepEnd:$,onAllComplete:()=>{e.onAllComplete(),e.exitOnComplete!==!1&&setImmediate(()=>t())},screenshotDispatcher:e.screenshotDispatcher,stepLogger:e.stepLogger,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete,spawnOpts:e.spawnOpts}),M=250,N=5e3;return Me((C,v)=>{if(v.ctrl&&C==="c"){let I=Date.now(),E=I-T.current;if(E<M)return;f.current&&E<N?(h.cancel(),e.onCancel?.(),e.exitOnComplete!==!1&&setImmediate(()=>t())):(f.current=!0,r((0,j.jsx)(s,{color:"yellow",children:"press Ctrl+C again to cancel run"}))),T.current=I}}),(0,j.jsx)(u,{flexDirection:"column",children:h.phase!=="done"&&(0,j.jsx)(it,{runner:h.runner,runKey:h.currentStepIndex,onStepCommit:r})})}function ht({data:e}){return(0,j.jsx)(Ue,{title:"test.md run",titleColor:"#ff9500",borderColor:l.dim,rows:[{label:"source",value:e.source},{label:"steps",value:`${e.steps.total} (${e.steps.replay} replay, ${e.steps.author} author per walker)`},{label:"model",value:e.model},{label:"viewport",value:`${e.viewport.width} x ${e.viewport.height}`},{label:"chrome",value:e.chrome},{label:"session",value:e.session},{label:"variables",value:`${e.variables.count} (${e.variables.secrets} secret)`},{label:"flags",value:e.flags.length>0?e.flags.join(" "):"(none)"}]})}export{ot as a,Xe as b,Ye as c,He as d,Oe as e,st as f,at as g,Ln as h};
|