@testmuai/kane-cli 0.6.11 → 0.7.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/{ChatSurface-TZ554O4U.js → ChatSurface-PMEOJBZG.js} +1 -1
- package/dist/{ChromeProfilePicker-54CAJDUF.js → ChromeProfilePicker-DK2A3NYY.js} +1 -1
- package/dist/{CliFeedbackPrompt-TCAH4AHL.js → CliFeedbackPrompt-D5QDOBE2.js} +1 -1
- package/dist/{CliUploadProgress-UURZ63VQ.js → CliUploadProgress-AIZL7N6Z.js} +1 -1
- package/dist/{ConfigView-5QGB7MUS.js → ConfigView-SDBCTYUU.js} +1 -1
- package/dist/{EvidenceViewOffer-SSAM4RRP.js → EvidenceViewOffer-EOKJE2B6.js} +1 -1
- package/dist/{FolderPicker-Y5MAYFIJ.js → FolderPicker-IVBHPPMW.js} +1 -1
- package/dist/{HelpView-S3GJGSCE.js → HelpView-YYYX4RKI.js} +1 -1
- package/dist/{InfoBox-LYTNNMVJ.js → InfoBox-MQV3XBT4.js} +1 -1
- package/dist/{LinksBox-5MSEKNSV.js → LinksBox-NCFNBUMW.js} +1 -1
- package/dist/{ProfilesView-LTHE5UIO.js → ProfilesView-6GXF6CP2.js} +1 -1
- package/dist/{ProjectPicker-XMXIGHSE.js → ProjectPicker-W6XDGNDJ.js} +1 -1
- package/dist/{SaveSessionPrompt-VQDEA4WA.js → SaveSessionPrompt-QF3P7ERS.js} +1 -1
- package/dist/SingleShotApp-T673X7BS.js +2 -0
- package/dist/{SummaryBox-WWF3G263.js → SummaryBox-4SZI4XSO.js} +1 -1
- package/dist/TestMdRunView-SNYEO6CS.js +2 -0
- package/dist/{WhoamiView-PDURYP7E.js → WhoamiView-N3HAJ3TN.js} +1 -1
- package/dist/{auth-I4RB4KO3.js → auth-RXNBQZI2.js} +1 -1
- package/dist/{bind-QJT726NE.js → bind-NSGW5BBZ.js} +2 -2
- package/dist/{bootstrap-566PPFCC.js → bootstrap-RPT3JOGD.js} +1 -1
- package/dist/{bridge-QCMEOQDD.js → bridge-BTSWCJ3B.js} +1 -1
- package/dist/{changelog-OKYH4F7I.js → changelog-MI3IPBJS.js} +1 -1
- package/dist/{chunk-54VQ46U2.js → chunk-3CJIMPQK.js} +2 -2
- package/dist/{chunk-RFJAYURU.js → chunk-44IWSV6L.js} +1 -1
- package/dist/{chunk-SURF5Z7Y.js → chunk-4BAMZSFU.js} +1 -1
- package/dist/{chunk-KXUSG5ZI.js → chunk-4GLYNAK7.js} +1 -1
- package/dist/{chunk-ZNHXIRCM.js → chunk-4SJC64KQ.js} +2 -2
- package/dist/{chunk-54IB6CXK.js → chunk-4XSW6WZD.js} +1 -1
- package/dist/{chunk-QJIJC3KC.js → chunk-5WE4DHXL.js} +1 -1
- package/dist/chunk-5YHVK2EO.js +6 -0
- package/dist/{chunk-H2W2UNTN.js → chunk-67SSEGDO.js} +1 -1
- package/dist/{chunk-MFOH7EYR.js → chunk-77WMTCUQ.js} +1 -1
- package/dist/{chunk-KHJXOFDM.js → chunk-A2IQRVPR.js} +1 -1
- package/dist/{chunk-XXMNUJX4.js → chunk-AIMINJVP.js} +1 -1
- package/dist/{chunk-XWSAKVEY.js → chunk-AV6E6WLY.js} +2 -2
- package/dist/{chunk-POYZ6SAI.js → chunk-AYY7RYMK.js} +1 -1
- package/dist/chunk-B4LLKQTK.js +2 -0
- package/dist/{chunk-2WKX3RMA.js → chunk-BCH3JCND.js} +1 -1
- package/dist/{chunk-GLA6QL3T.js → chunk-CH3VWCRZ.js} +1 -1
- package/dist/{chunk-DSOA6L73.js → chunk-CSGQIY7X.js} +3 -3
- package/dist/{chunk-MJBCBQC2.js → chunk-DFDDUMG5.js} +1 -1
- package/dist/{chunk-MTNUZEO7.js → chunk-DGIPQINV.js} +1 -1
- package/dist/chunk-E5PWL3BG.js +7 -0
- package/dist/{chunk-XZRIQ3GF.js → chunk-EN7NW7DU.js} +1 -1
- package/dist/{chunk-NUQ423YE.js → chunk-GQ3NCBYR.js} +1 -1
- package/dist/{chunk-NJAHRITS.js → chunk-HOOXUO3X.js} +1 -1
- package/dist/{chunk-7MRBMDZ5.js → chunk-J3EMJ7US.js} +1 -1
- package/dist/{chunk-MR7CX5VT.js → chunk-JSF5JYZC.js} +1 -1
- package/dist/{chunk-XSKLH2MC.js → chunk-K4VIM4RM.js} +2 -2
- package/dist/{chunk-ICGHBZFZ.js → chunk-KCBS57IF.js} +1 -1
- package/dist/{chunk-NTNAHN25.js → chunk-LGVHW4ZA.js} +1 -1
- package/dist/{chunk-55Y65VPA.js → chunk-MAO5BAQI.js} +1 -1
- package/dist/{chunk-EAUUULJQ.js → chunk-MTHCUBDF.js} +1 -1
- package/dist/{chunk-ZPCU6546.js → chunk-MV4UYTZT.js} +1 -1
- package/dist/{chunk-M5PJQ5Y3.js → chunk-N4LMQR7C.js} +1 -1
- package/dist/{chunk-4CJ55EUY.js → chunk-NR23HZU4.js} +1 -1
- package/dist/chunk-QBCS57EO.js +62 -0
- package/dist/{chunk-MRP54NCJ.js → chunk-QQUZF2DZ.js} +1 -1
- package/dist/{chunk-HLRLP6TQ.js → chunk-RCTM7NGT.js} +1 -1
- package/dist/{chunk-7NLQ3QQD.js → chunk-RODHDQU3.js} +1 -1
- package/dist/{chunk-GIMTSDNC.js → chunk-RQYS3KGU.js} +1 -1
- package/dist/{chunk-ZP4S5WGW.js → chunk-SBZWFULF.js} +2 -2
- package/dist/{chunk-3AZTXJY4.js → chunk-T7ZPMTGS.js} +1 -1
- package/dist/{chunk-JXKRO2ZJ.js → chunk-UXPQRALY.js} +2 -2
- package/dist/{chunk-RGJIRS3B.js → chunk-VJFFMOUA.js} +1 -1
- package/dist/{chunk-HOQEMPMQ.js → chunk-VYMCE7UR.js} +2 -2
- package/dist/{chunk-LHDNJJGE.js → chunk-WREVEATJ.js} +1 -1
- package/dist/{chunk-73OQDAXF.js → chunk-WTXHOWUP.js} +1 -1
- package/dist/{chunk-FSB3FTIQ.js → chunk-X5P2T7MA.js} +1 -1
- package/dist/{chunk-HMM5FJJO.js → chunk-XIXR63FI.js} +1 -1
- package/dist/{chunk-KSZ72BSC.js → chunk-XLKRV2JH.js} +1 -1
- package/dist/{chunk-NTGYFYBP.js → chunk-YHQFYZJ5.js} +1 -1
- package/dist/{config-QISRENF5.js → config-5GOFF5F4.js} +1 -1
- package/dist/{credentials-OGLK7MPV.js → credentials-GXDXVMXW.js} +1 -1
- package/dist/{evidence-HDD7T7DX.js → evidence-VDNZ3K23.js} +1 -1
- package/dist/{evolve-cmd-UE2BIMXK.js → evolve-cmd-BLSVVW4I.js} +1 -1
- package/dist/{extract-bind-6MQYKN3G.js → extract-bind-3SWPBZX6.js} +2 -2
- package/dist/{extract-cmd-2RUIWFZG.js → extract-cmd-HEX7F4IS.js} +1 -1
- package/dist/{generate-headless-TUA3HGRX.js → generate-headless-LZ4HRSQ4.js} +2 -2
- package/dist/index.js +52 -52
- package/dist/{ingest-cmd-CRMY46YC.js → ingest-cmd-KRPZVB7W.js} +2 -2
- package/dist/{interactive-bind-53FCRK34.js → interactive-bind-PTAZVCE7.js} +2 -2
- package/dist/{list-commands-F53ZNYOZ.js → list-commands-WIVODSEL.js} +1 -1
- package/dist/login-flow-GX7CTVWN.js +2 -0
- package/dist/{persist-recorded-session-5ZFS5SMZ.js → persist-recorded-session-J6Z2SCTT.js} +1 -1
- package/dist/{pipeline-MX3ZR5B3.js → pipeline-HT7FCEXA.js} +1 -1
- package/dist/{reconcile-cmd-4377PWF5.js → reconcile-cmd-2VHBKFA5.js} +1 -1
- package/dist/{recording-banner-ZZUF2MGT.js → recording-banner-IRFMIZSJ.js} +1 -1
- package/dist/{require-project-folder-NQBZFUPF.js → require-project-folder-XSBJGIVF.js} +1 -1
- package/dist/{run-2AIQUJ55.js → run-4LTYFTF2.js} +1 -1
- package/dist/{run-YH5SCBYD.js → run-YGJZ2SXX.js} +1 -1
- package/dist/{run-test-md-XOSCYVSS.js → run-test-md-QCERS7FQ.js} +2 -2
- package/dist/{skill-installer-VYIIWAK7.js → skill-installer-WAVEVCSG.js} +1 -1
- package/dist/{spawner-7KXVKAD5.js → spawner-YNYB4Z7K.js} +1 -1
- package/dist/tcg-generate-D35EMRMQ.js +2 -0
- package/dist/{testmd-actions-RPALXRZK.js → testmd-actions-NB5Z6QJ3.js} +1 -1
- package/dist/token-refresh-OY3WLAKD.js +2 -0
- package/dist/{validate-basic-LP3S5PK7.js → validate-basic-IJKKRQRU.js} +1 -1
- package/dist/{version-check-XP62HWLJ.js → version-check-O5GYZYTP.js} +1 -1
- package/dist/{walk-session-YIKHE6PT.js → walk-session-OPAEV4WR.js} +1 -1
- package/package.json +6 -6
- package/dist/SingleShotApp-A6PCNPLM.js +0 -2
- package/dist/TestMdRunView-MQ7ZPFN2.js +0 -2
- package/dist/chunk-MMPFU2YC.js +0 -2
- package/dist/chunk-OGWC3J3C.js +0 -4
- package/dist/chunk-RZJVQUBA.js +0 -61
- package/dist/chunk-YSSTGJ7O.js +0 -7
- package/dist/login-flow-D7KBR7XR.js +0 -2
- package/dist/tcg-generate-U6OCCS2E.js +0 -2
- package/dist/token-refresh-S7CYBZTE.js +0 -2
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as Ft,b as Nt,c as mn}from"./chunk-2XMJ6YAE.js";import{c as un}from"./chunk-KHQHVSZ6.js";import{c as Ot,d as nn}from"./chunk-VYMCE7UR.js";import{d as tn}from"./chunk-2YQ6TW77.js";import{a as Ut,b as sn,c as ot,d as it,e as on,f as jt,g as cn,h as dn}from"./chunk-OIYGGEUL.js";import{a as Ue,b as ne,e as Re,f as Lt,k as en,p as ye,q as Dt,t as rn}from"./chunk-RKWJG3WW.js";import{b as _e}from"./chunk-4SJC64KQ.js";import{a as Mr,b as nt,c as Tt}from"./chunk-5YHVK2EO.js";import{a as rt,c as $r,d as Pt}from"./chunk-E5PWL3BG.js";import{a as je,b as an}from"./chunk-C5UNZ6ZY.js";import{c as ln}from"./chunk-S3DAAAE5.js";import{a as Ie}from"./chunk-WAOCHXJ5.js";import{B as Vr,C as Kr,D as Hr,F as qr,G as zr,I as Yr,J as Wr,K as Qr,X as Jr,aa as Zr,ba as Xr,j as st,x as Br}from"./chunk-UXPQRALY.js";import{a as Gr}from"./chunk-BC7UVJJB.js";import{i as Dr,k as xt,l as Or,m as tt,n as Ur,o as jr}from"./chunk-Y5RNCJAN.js";import{g as Fr,h as Nr}from"./chunk-AYY7RYMK.js";import{a as et}from"./chunk-2WVKOZ6W.js";import{a as Xe,b as Lr}from"./chunk-NLCCBXXV.js";import{a as q}from"./chunk-RZ4F3BHX.js";import{a as ie}from"./chunk-A2IQRVPR.js";import{a as Pr}from"./chunk-E47GFYXA.js";import{a as Je,c as Ct,j as Tr,k as Ze,l as Et,m as At}from"./chunk-B4LLKQTK.js";import{join as de,basename as fs}from"path";import{existsSync as So,readFileSync as gs}from"fs";function fn(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let n=e.steps[r],s=t[r],o=" ".repeat(n.trace.length-1),i=`step ${n.flatIndex}`;s.kind==="replay"?process.stderr.write(`[replay-trace] ${o}${i}: REPLAY (would skip; v1 always authors)
|
|
3
|
+
`):process.stderr.write(`[replay-trace] ${o}${i}: AUTHOR (${s.reason})
|
|
4
|
+
`)}}function ke(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function pn(e,t){let r=e===0?"(none)":`0..${e-1}`,n=e>=t?"(none)":`${e}..${t-1}`;ke(`[replay-trace] phase: replay ${r}, author ${n}
|
|
5
|
+
`)}function gn(e,t){ke(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
|
|
6
|
+
`)}function hn(e,t,r){ke(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
|
|
7
|
+
`)}function bn(e,t){ke(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
|
|
8
|
+
`)}function $t(){ke(`[replay-trace] force-author (--author) \u2014 walker bypassed
|
|
9
|
+
`)}function yn(e){ke(`[replay-trace] cancelled at step ${e}
|
|
10
|
+
`)}import{join as vn}from"path";function Mt(e){let t=on(e.decision),r={objective:e.step.objective,model:"v16-alpha",width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,mode:"replay",replay:{recording_path:t[0],...t.length>1?{recording_paths:t}:{},step_label:e.step.objective,...e.investigationAsync?{investigation:"async"}:{}},screenshot_dir:e.evidence?vn(e.sessionDir,"scratch",String(e.runIndex)):vn(e.sessionDir,"runs",String(e.runIndex)),run_id:"run",test_id:"test"};return e.forceNavigateUrl&&(r.url=e.forceNavigateUrl),e.chrome.wsEndpoint?r.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(r.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(r.username=e.auth.basicAuth.username,r.access_key=e.auth.basicAuth.access_key):e.auth.token&&(r.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(r.org_id=String(e.auth.resolvedCreds.org_id)),e.variables&&Object.keys(e.variables).length>0&&(r.variables=e.variables),e.sessionContext&&(r.session_context=e.sessionContext),e.evidence&&(r.evidence=st(e.evidence.packTestDir,e.evidence.ordinalOffset)),r}async function Sn(e){let t=e.forceAuthor?0:it(e.decisions),r=0,n=!1;for(;;){let s=e.session.snapshot(),o=e.accumulator.snapshot(),i=await e.runReplayPhase(t);if(i.cancelled)return n=!0,yn(i.failedAt??0),{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};if(i.failedAt===null)return{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};let f=an({failedAt:i.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(f.kind==="fail")return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.session.rollback(s),e.accumulator.rollback(o),f.kind==="complete-reauthor")return bn(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:n,shrinkCount:r};r++,hn(r,je.maxShrinks,f.newAuthorBoundary),t=f.newAuthorBoundary}}var xs=15e3,Bt=3,wn=[500,1e3];async function Vt(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 at(t,{from_commit_id:e.fromCommitId,new_commit_id:e.newCommitId},e.auth);return r.ok?{ok:!0,sessionExpiresAt:B(r.body,"session_expires_at")??""}:{ok:!1,...Ps(r)}}function Ps(e){let t=B(e.body,"error")??B(e.body,"code")??"",r=B(e.body,"message")??B(e.body,"detail")??e.text??`HTTP ${e.status}`,n;return e.status===0?n="network":e.status===401||e.status===403?n="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?n="base_mismatch":e.status===409?n="concurrent":e.status===422?n="disabled":e.status===400&&/no committed/i.test(r)?n="no_commits":e.status===400?n="missing_field":e.status>=500||e.status===408||e.status===429?n="network":n="other",{reason:n,httpStatus:e.status,message:r}}async function In(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await at(t,void 0,e.auth);return r.ok?{ok:!0,sessionExpiresAt:B(r.body,"session_expires_at")??""}:{ok:!1,expired:r.status===404,httpStatus:r.status,message:B(r.body,"message")??B(r.body,"detail")??r.text??`HTTP ${r.status}`}}async function Kt(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 n=await at(t,r,e.auth);return n.ok?{ok:!0,testId:B(n.body,"test_id")??e.testId,testcaseId:B(n.body,"testcase_id")??"",projectId:B(n.body,"project_id"),isTestCaseDeleted:typeof n.body?.is_test_case_deleted=="boolean"?n.body.is_test_case_deleted:void 0}:{ok:!1,...Ts(n)}}function Ts(e){let t=B(e.body,"error")??B(e.body,"code")??"",r=B(e.body,"message")??B(e.body,"detail")??e.text??`HTTP ${e.status}`,n;return e.status===0?n="network":e.status===401||e.status===403?n="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?n="base_mismatch":e.status===409&&t==="PlaygroundCommitLockMismatch"?n="lock_mismatch":e.status===409?n="expired":e.status===422?n="not_found":e.status>=500||e.status===408||e.status===429?n="network":n="other",{reason:n,httpStatus:e.status,message:r}}async function Fe(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},n=await at(t,r,e.auth);return n.ok?{ok:!0}:{ok:!1,reason:B(n.body,"error")??"other",httpStatus:n.status,message:B(n.body,"message")??B(n.body,"detail")??n.text??`HTTP ${n.status}`}}async function at(e,t,r){let n=null;for(let s=1;s<=Bt;s++){let o=new AbortController,i=setTimeout(()=>o.abort(),xs);try{let f=await q(e,{method:"POST",headers:{Authorization:Xe(r.username,r.accessKey),"Content-Type":"application/json",Accept:"application/json"},...t!==void 0?{body:JSON.stringify(t)}:{},signal:o.signal});clearTimeout(i);let l=await f.text(),c=null;if(l)try{c=JSON.parse(l)}catch{}let y=f.status>=500||f.status===408||f.status===429;if(f.ok||!y)return{ok:f.ok,status:f.status,body:c,text:l};if(s<Bt){await _n(wn[s-1]??1e3);continue}return{ok:!1,status:f.status,body:c,text:l}}catch(f){if(clearTimeout(i),n=f,s<Bt){await _n(wn[s-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:n?.message??"exhausted retries"}}function _n(e){return new Promise(t=>setTimeout(t,e))}function B(e,t){if(typeof e!="object"||e===null)return;let r=e[t];return typeof r=="string"?r:void 0}var Ls=60*1e3,Rn="lock-heartbeat",pe=new Map,Ne=null,Ds={register:(e,t)=>tt(e,t),deregister:e=>Ur(e),cleanup:(e,t)=>jr(e,t),remoteLogger:null};function kn(e){if(e!==void 0){let t=pe.get(e);t!==void 0&&(clearInterval(t),pe.delete(e));return}for(let t of pe.values())clearInterval(t);pe.clear()}function lt(e){if(pe.has(e.testId))return;let t=e.lifecycle??Ds,r=setInterval(async()=>{let n=await In({baseUrl:e.baseUrl,testId:e.testId,auth:e.auth});if(!n.ok){let s=n.expired?"session expired":n.message;process.stderr.write(`[lock] heartbeat failed (${e.testId}): ${s}; continuing run
|
|
11
|
+
`)}},Ls);pe.set(e.testId,r),Ne===null&&(Ne=t,t.register(Rn,()=>kn()))}function ve(e){pe.size!==0&&(kn(e),pe.size===0&&Ne!==null&&(Ne.deregister(Rn),Ne=null))}import{readFileSync as Cn,readdirSync as En,existsSync as Se,promises as An}from"fs";import{join as ae}from"path";async function Os(e,t){let r=ae(e,"steps",`${t.ordinal}-${t.id}`),n;try{n=await An.readFile(ae(r,"screenshot.png"))}catch{return null}let s=null,o=[];try{let i=JSON.parse(await An.readFile(ae(r,"step.json"),"utf8"));s=i.action_id??null,Array.isArray(i.analyze_action_ids)&&(o=i.analyze_action_ids.filter(f=>typeof f=="string"))}catch{}return{png:n,actionId:s,analyzeActionIds:o}}function Yo(){let e=[];return{track:t=>{e.push(t.catch(()=>{}))},settle:async()=>{await Promise.all(e)}}}async function xn(e,t,r,n){try{let s=await Os(e,t);if(!s){n("warn","SCREENSHOT_SKIP","Pack step folder or screenshot not found",{ordinal:t.ordinal,id:t.id,reason:"pack_step_not_found"});return}let o=new Set;s.actionId&&o.add(s.actionId);for(let i of s.analyzeActionIds)o.add(i);if(o.size===0){n("warn","SCREENSHOT_SKIP","No action_id in step.json",{ordinal:t.ordinal,id:t.id,reason:"no_action_id"});return}for(let i of o)r.enqueue(i,s.png);n("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{ordinal:t.ordinal,id:t.id,action_id:s.actionId,action_ids:[...o],size:s.png.length})}catch(s){n("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{ordinal:t.ordinal,id:t.id,error:s instanceof Error?s.message:String(s)})}}function Pn(e,t,r,n,s,o){try{let i=ae(e,"runs",String(t),"run-test");if(!Se(i)){s("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:i});return}let f=i;if(o){let k=ae(i,`child-${o}`);if(!Se(k)){s("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:o,reason:"child_dir_not_found",path:k});return}let E=En(k).filter(a=>Se(ae(k,a,"screenshots")));if(E.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:o,reason:"no_child_screenshots_dir"});return}f=ae(k,E[0])}else if(!Se(ae(i,"screenshots"))){let k=En(i).filter(E=>Se(ae(i,E,"screenshots")));if(k.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}f=ae(i,k[0])}let l=ae(f,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!Se(l)){s("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:o,reason:"screenshot_not_found",path:l});return}let c=ae(i,"actions.ndjson");if(!Se(c)){s("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let y=Cn(c,"utf-8").trim().split(`
|
|
12
|
+
`),w=y[y.length-1];if(!w){s("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let R=JSON.parse(w).action_id;if(!R){s("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let x=Cn(l);n.enqueue(R,x),s("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:o,action_id:R,size:x.length})}catch(i){s("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{step_index:r,error:i instanceof Error?i.message:String(i)})}}import{dirname as Us,join as js}from"path";function Tn(e,t,r){let n=e.total_runs??1,s=e.run_dir,o,i;if(n>1&&s){let f=Us(s);o=Array.from({length:n},(l,c)=>js(f,String(t+c))),r&&r.length===n&&(i=r)}return{allRunDirs:o,flowObjectives:i}}function Ln(e,t,r,n){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:n.allRunDirs,flow_objectives:n.flowObjectives}}var ct=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 n=t.trace[0].stepIndex,s=this.outcomes.find(l=>l.rootStepIndex===n),o=this.resolved.rootSteps.find(l=>l.index===n),i=o.body.kind!=="objective";return i&&(s.refKind="import",s.refLabel=o.body.path,s.inlinedCount=(s.inlinedCount??0)+1,s.duration_s=(s.duration_s??0)+r.duration_s),r.status==="passed"?(i?s.status!=="failed"&&(s.status="passed"):(s.status="passed",s.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(s.softFailures=s.softFailures??[],s.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(s.status="failed",s.duration_s=i?s.duration_s:r.duration_s,s.failedSubStepIndex=i?t.trace.slice(1).map(l=>l.stepIndex):void 0,s.reason=r.reason,this.skipRoot=n,o.optional??!1?(s.softFailed=!0,{continueOverall:!0}):(this.overallHalted=!0,{continueOverall:!1}))}snapshotOutcomes(){return[...this.outcomes]}snapshot(){return{outcomes:this.outcomes.map(t=>({...t,softFailures:t.softFailures?[...t.softFailures]:void 0})),skipRoot:this.skipRoot,overallHalted:this.overallHalted}}rollback(t){this.outcomes=t.outcomes.map(r=>({...r,softFailures:r.softFailures?[...r.softFailures]:void 0})),this.skipRoot=t.skipRoot,this.overallHalted=t.overallHalted}finalize(){let t=this.outcomes.some(n=>n.status==="failed"&&!n.softFailed)?"failed":"passed",r=this.outcomes.reduce((n,s)=>n+(s.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};function Ht(e){if(!e)return null;let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function Dn(e){return Ht(e.flag)??Ht(e.frontmatter)??(e.configDefault&&e.configDefault!==Ze?Ht(e.configDefault):null)}function On(e){return e.resolvedUrl!==null?!1:!((!!e.local||!!e.allowMissingUrl)&&!e.isTTY)}import{spawn as Fs}from"child_process";async function Un(e,t,r=100){let n=`${e.replace(/\/+$/,"")}/json/version`,s=await q(n);if(!s.ok)throw new Error(`CDP /json/version returned ${s.status}`);let o=await s.json();if(!o.webSocketDebuggerUrl)throw new Error("CDP /json/version missing webSocketDebuggerUrl");let i=new Pr(o.webSocketDebuggerUrl);await new Promise((m,_)=>{i.once("open",m),i.once("error",_)});let f=1,l=new Map;i.on("message",m=>{let _;try{_=JSON.parse(m.toString())}catch{return}if(_.id==null)return;let L=l.get(_.id);L&&(l.delete(_.id),_.error?L.reject(new Error(_.error.message)):L.resolve(_.result))});function c(m,_){let L=f++;return new Promise((ue,Z)=>{l.set(L,{resolve:M=>ue(M),reject:Z});let se={id:L,method:m};_&&(se.params=_),i.send(JSON.stringify(se))})}let w=(await c("Target.getTargets")).targetInfos.find(m=>m.type==="page");if(!w)throw i.close(),new Error("CDP: no page target found");let R=(await c("Browser.getWindowForTarget",{targetId:w.targetId})).windowId,x="",k=!1,E=null,a=!1;i.on("close",()=>{a=!0}),i.on("error",()=>{a=!0});async function z(){if(!k){if(a){k=!0;return}try{let _=(await c("Browser.getWindowBounds",{windowId:R})).bounds,L=`${_.left}:${_.top}:${_.width}:${_.height}`;L!==x&&(x=L,t({left:_.left,top:_.top,width:_.width,height:_.height}))}catch{}k||(E=setTimeout(z,r))}}return z(),{stop(){if(!k){k=!0,E&&clearTimeout(E);try{i.close()}catch{}}}}}var Ns=new Set(["1","true","yes"]);function jn(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&Ns.has(t.toLowerCase()))return null;let r=rt();if(!r)return null;let n=[...r.args,"overlay"];e?.text&&n.push(e.text);let s;try{s=Fs(r.cmd,n,{cwd:r.cwd,stdio:["pipe","ignore","ignore"],detached:!1,windowsHide:!0})}catch{return null}s.stdin?.on("error",()=>{});let o=!1;s.on("exit",()=>{o=!0}),s.on("error",()=>{o=!0});function i(c){if(!(o||!s.stdin||s.stdin.destroyed))try{s.stdin.write(JSON.stringify(c)+`
|
|
13
|
+
`)}catch{}}e?.chromePid&&e.chromePid>0&&i({type:"chrome_pid",pid:e.chromePid});let f=null;e?.cdpEndpoint&&Un(e.cdpEndpoint,c=>i({type:"bounds",...c})).then(c=>{f=c.stop}).catch(()=>{});let l=!1;return{setRunActive(c){l||i({type:"run_active",active:c})},setStepText(c){if(l)return;let y=c.trim();y&&i({type:"step_text",text:y})},setStepComplete(){l||i({type:"step_complete"})},kill(){if(!l){l=!0,f?.();try{s.stdin?.end()}catch{}try{s.kill("SIGTERM")}catch{}}}}}function Fn(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function dt(e,t,r,n){return`${Fn(e,t,r)}/dashboard/share/${n}?type=summary&agentView=true&fqdn=summary-page`}function Nn(e,t,r,n){if(!(!t||!r||!n))return dt(e,t,r,n)}function $n(e,t,r){return`${Fn(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as Zs,rmSync as Xs}from"fs";import{join as eo}from"path";import{tmpdir as to}from"os";import{spawn as Vn,spawnSync as $s}from"child_process";import{existsSync as qt}from"fs";import{createConnection as Ms}from"net";import{homedir as $e,platform as Ve}from"os";import{join as Me}from"path";var Bs=new Set(["1","true","yes"]),ut=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function bi(e){return e instanceof ut?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var mt={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",Me($e(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",Me($e(),"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",Me($e(),"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",Me($e(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",Me($e(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe")]};function Vs(){if(process.env.KANE_CLI_CHROME_PATH)return process.env.KANE_CLI_CHROME_PATH;let e=Ve(),t=mt[e]??mt.linux;for(let r of t)if(qt(r))return r;return e==="win32"?"chrome.exe":"google-chrome"}function Ks(){if(process.env.KANE_CLI_CHROME_PATH)return qt(process.env.KANE_CLI_CHROME_PATH);let e=Ve();if((mt[e]??mt.linux).some(s=>qt(s)))return!0;let r=e==="win32"?"chrome.exe":"google-chrome",n=e==="win32"?"where":"which";try{return $s(n,[r],{stdio:"ignore"}).status===0}catch{return!1}}function Hs(){let e=Ve();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 qs(e){let t=Ve(),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 zs(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 Gs(){for(let e=Et;e<=At;e++)if(!await zs(e))return e;throw new Error(`All CDP ports ${Et}-${At} are in use. Close other Chrome instances.`)}var Be=class extends Error{constructor(t){super(t),this.name="CdpReadinessError"}};async function Ys(e,t){let r=Date.now(),n=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await q(n)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(s=>setTimeout(s,200))}throw new Be(`Chrome CDP not ready after ${t}ms on port ${e}`)}var Ws=3e4,Qs=2;function Mn(e,t,r){let n=process.env[e];if(n==null||n.trim()==="")return t;let s=Number(n);return!Number.isInteger(s)||s<r?t:s}function Js(e){return Math.min(500*e,3e3)}function Bn(e,t){try{if(e.pid)if(t==="win32")Vn("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 Kn(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&Bs.has(t.toLowerCase()))&&!Ks())throw xt()?.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 ut(Hs());let n=Ve(),s=Vs(),o=Mn("KANE_CLI_CDP_TIMEOUT_MS",Ws,1),f=Mn("KANE_CLI_CDP_RETRIES",Qs,0)+1,l;for(let c=1;c<=f;c++){let y=await Gs(),w=qs({port:y,...e});e.startUrl&&w.push(e.startUrl);let A=Vn(s,w,{stdio:"ignore",detached:!0});A.unref();try{let R=await new Promise((x,k)=>{A.on("error",E=>{k(new Error(`Failed to launch Chrome: ${E.message}. Is Chrome installed at ${s}?`))}),A.on("close",E=>{E!==null&&E!==0&&k(new Be(`Chrome exited during startup with code ${E}`))}),Ys(y,o).then(x,k)});return{process:A,port:y,cdpEndpoint:R,kill(){Bn(A,n)}}}catch(R){if(l=R,!(R instanceof Be))throw R;Bn(A,n),xt()?.log("warn","CHROME_CDP_LAUNCH_RETRY",`Chrome CDP launch attempt ${c}/${f} failed`,{attempt:c,max_attempts:f,port:y,timeout_ms:o,headless:e.headless??!1,error:R.message}),c<f&&await new Promise(x=>setTimeout(x,Js(c)))}}throw l??new Error("Chrome launch failed after retries")}async function Hn(e){if(e.cft)return{instance:null,tempDir:null};if(e.wsEndpoint)return{wsEndpoint:e.wsEndpoint,instance:null,tempDir:null};if(e.cdpEndpoint){let s=await q(`${e.cdpEndpoint}/json/version`);if(!s.ok)throw new Error(`CDP endpoint not reachable: ${e.cdpEndpoint} (${s.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=Zs(eo(to(),"kane-clean-")),t=r;let s=r;tt("tempDir",()=>{try{Xs(s,{recursive:!0,force:!0})}catch{}})}let n=await Kn({userDataDir:t,width:e.config.window_size.width,height:e.config.window_size.height,startUrl:e.startUrl,headless:e.headless});return{cdpEndpoint:n.cdpEndpoint,instance:n,tempDir:r}}function qn(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,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.auth.resolvedCreds?.org_id&&(t.org_id=String(e.auth.resolvedCreds.org_id)),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.bugDetection==="stop"||e.bugDetection==="continue")&&(t.bug_detection=e.bugDetection),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),e.evidence&&(t.evidence=st(e.evidence.packTestDir,e.evidence.ordinalOffset)),t}import{readdirSync as ro,readFileSync as Gn,existsSync as Yn}from"fs";import{join as no}from"path";function zn(e,t){if(!Yn(e))return{};let r={},n;try{n=ro(e).filter(s=>s.endsWith(".json")).sort()}catch{return{}}for(let s of n)try{let o=Gn(no(e,s),"utf-8"),i=JSON.parse(o);if(i&&typeof i=="object"){for(let[f,l]of Object.entries(i))if(l&&typeof l=="object"&&"value"in l){let c=l;r[f]={value:c.value,secret:c.secret??!1,syntax:c.syntax??`{{${f}}}`}}}}catch{t?t("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:s}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${s}
|
|
18
|
+
`)}return r}function Wn(e){if(!Yn(e))throw new Error(`Variables file not found: ${e}`);let t=Gn(e,"utf-8"),r=JSON.parse(t),n={};if(r&&typeof r=="object"){for(let[s,o]of Object.entries(r))if(o&&typeof o=="object"&&"value"in o){let i=o;n[s]={value:i.value,secret:i.secret??!1,syntax:i.syntax??`{{${s}}}`}}}return n}function Qn(e){let t;try{t=JSON.parse(e)}catch{throw new Error("Invalid --variables JSON")}let r={};if(t&&typeof t=="object"){for(let[n,s]of Object.entries(t))if(s&&typeof s=="object"&&"value"in s){let o=s;r[n]={value:o.value,secret:o.secret??!1,syntax:o.syntax??`{{${n}}}`}}}return r}function Jn(e,t,r){let n=zn(e,r),s=zn(t,r);return{...n,...s}}var Ce=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=Xe(t.username,t.accessKey),n=await q(`${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(!n.ok)throw new Error(`Push secret failed: ${n.status} ${await n.text()}`)}static extractVariableKeys(t){let r=t.matchAll(/\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g),n=new Set;for(let s of r)n.add(s[1]);return[...n]}};var Ee=class extends Lr{constructor(t,r,n){super(t,{username:r,accessKey:n})}async upsertVariable(t){let r=t.environmentId??0,n=await q(`${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(n.ok){let l=await n.json().catch(()=>({}));if(l.type==="Success"&&l.id!=null)return{id:Number(l.id)||0}}let s=await q(`${this.baseUrl}/v1/variables/${encodeURIComponent(t.name)}?environment_id=${r}`,{method:"GET",headers:this.headers()});if(!s.ok)return{id:0};let i=(await s.json().catch(()=>({}))).data?.id;return i==null?{id:0}:(await q(`${this.baseUrl}/v1/variables/${i}`,{method:"PUT",headers:this.headers(),body:JSON.stringify({value:String(t.value),value_type:"string"})})).ok?{id:Number(i)||0}:{id:0}}};function Zn(e,t){if(Object.keys(e).length===0)return{};let r={};for(let[n,s]of Object.entries(e)){let o=s.syntax??`{{${n}}}`;t.includes(o)&&(r[n]=s)}return r}function Xn(e){let t=Jn(e.globalDir,e.localDir,e.onLoadError),r=e.file?Wn(e.file):{},n=e.inline?Qn(e.inline):{},s={...t,...r,...n},o=Object.keys(s).length>0,{variables:i,objective:f}=o?_e(s,e.objective):{variables:{},objective:e.objective},l=Object.entries(s).filter(([,y])=>y.secret),c=Object.entries(s).filter(([,y])=>!y.secret);return{raw:s,auteur:i,auteurObjective:f,secretEntries:l,nonSecretEntries:c}}async function es(e){if(e.localMode)return{};let t=ie(e.env);if(e.variables.secretEntries.length>0){let n=new Ce(t.secretsBaseUrl);for(let[s,o]of e.variables.secretEntries)n.pushSecret({secretKey:s,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:s})).catch(i=>e.log("error","SECRET_PUSH_FAILED","Secret push failed",{key:s,error:String(i)}))}let r={};if(e.variables.nonSecretEntries.length>0){let n=new Ee(t.tmsBaseUrl,e.auth.username,e.auth.access_key);for(let[s,o]of e.variables.nonSecretEntries)try{let i=await n.upsertVariable({name:s,value:o.value});r[s]=i.id,e.log("info","VAR_PUSH_OK","Variable pushed",{name:s,id:i.id})}catch(i){e.log("error","VAR_PUSH_FAILED","Variable push failed",{name:s,error:String(i)})}}return r}import{readFileSync as so,existsSync as oo}from"fs";function zt(e){if(!oo(e))return null;try{return so(e,"utf-8").trim()||null}catch{return null}}var io=()=>{};async function ts(e,t,r){let n=t.log??io,s=e.session.testId??null,o=null,i=null,f=null;if(!r.localMode&&t.performUpload)try{o=await t.performUpload(),o?.success&&(o.testId&&(s=o.testId),o.testcaseId&&e.session.setTestcaseId(o.testcaseId))}catch(l){n("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(l)})}if(t.renderFeedbackPrompt)try{i=await t.renderFeedbackPrompt(),i&&s&&t.submitFeedback&&t.submitFeedback(s,i).catch(l=>{n("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(l)})})}catch(l){n("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(l)})}if(e.session.flushRecorder(),r.skipLocalWrites)n("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{f=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(l){n("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(l)})}try{Dt({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,orgId:e.session.orgId??void 0,sessionName:e.session.sessionName??Ue(r.sourcePath),plan:e.session.plan??void 0})}catch(l){n("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(l)})}if(o?.codeExportDir)try{let l=e.tuiConfig.code_export?.language??"python";jt(o.codeExportDir,Lt(r.sourcePath,"playwright",l))}catch(l){n("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(l)})}}else if(e.session.recorder?.lastWrittenPath){let l=e.session.recorder.lastWrittenPath,c=e.session.getFlows(),y=c.map((R,x)=>({index:x+1,heading:`Step ${x+1}`,verifies:[],headingLine:0,body:{kind:"objective",text:R.objective}})),w=c.map((R,x)=>({rootStepIndex:x+1,status:R.status==="passed"?"passed":R.status==="failed"?"failed":"skipped",duration_s:R.duration,reason:R.reason})),A=w.some(R=>R.status==="failed")?"failed":"passed";try{f=Ut({sourcePath:l,title:e.session.sessionName??"Session",rootSteps:y,outcomes:w,overallStatus:A,startedISO:e.session.startedAt,durationS:w.reduce((R,x)=>R+(x.duration_s??0),0),sessionId:e.session.sessionId})}catch(R){n("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(R)})}try{Dt({sourcePath:l,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,plan:e.session.plan??void 0})}catch(R){n("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(R)})}if(o?.codeExportDir)try{let R=e.tuiConfig.code_export?.language??"python";jt(o.codeExportDir,Lt(l,"playwright",R))}catch(R){n("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(R)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${l} (renamed: ${e.session.sessionName}_test.md already existed)
|
|
19
|
+
`)}try{t.runCleanup?.()}catch(l){n("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(l)})}try{await e.session.finish("complete")}catch(l){n("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(l)})}return{uploadResult:o,feedbackChoice:i,resultMdPath:f}}import{readFileSync as Gt,writeFileSync as Yt,existsSync as ns}from"fs";function rs(e,t,r){if(r.forceAuthor)return"re-recorded from scratch";if(r.retryTriggered)return"re-recorded after retry";if(t.length>0&&t.every(i=>i.kind==="author"&&i.reason==="no-result-md"))return"initial recording";if(t.length>0&&t.every(i=>i.kind==="replay"))return r.wantsPush?"re-recorded (no source changes)":"no changes";let n=[];for(let i=0;i<t.length;i++){let f=t[i];if(!f||f.kind!=="author"||f.reason==="downstream-of-divergence"||f.reason==="no-result-md")continue;let l=ao(e,e.steps[i]);switch(f.reason){case"structure-mismatch":n.push(`added/removed: ${l}`);break;case"md5-mismatch":n.push(`modified: ${l}`);break;case"missing-recording":n.push(`re-recorded: ${l}`);break;case"recorded-failed":n.push(`re-authored after failure: ${l}`);break}}if(n.length===0)return"automated commit";let s=n.filter((i,f)=>f===0||n[f-1]!==i),o=s.slice(0,3).join("; ");return s.length>3?`${o}; +${s.length-3} more`:o}function ao(e,t){if(!t)return"unknown step";let r=t.trace[0]?.stepIndex;if(r==null)return"unknown step";let s=e.rootSteps[r-1]?.heading?.trim()??"";return t.trace.length>1?s?`imported step in "${s}"`:`imported step ${r}`:s||`step ${r}`}function lo(e,t){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{let{changedUnitFiles:r,legacySweep:n}=await cn({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,packTestDir:e.evidence?.packTestDir??e.evidenceRead?.packTestDir,authoredFlatIdx:new Set(e.authoredFlatIdx??[])});t.files=r;for(let s of r){let o=ne(s);if(ns(`${o}.staging`)){en(o);let i=n.find(f=>f.unitFile===s);i&&dn(i.dirs)}}}}function co(e,t){if(!(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions))return async()=>{let r=rs(e.resolvedTest,e.decisions,{wantsPush:e.wantsPush??!1,retryTriggered:e.retryTriggered??!1,forceAuthor:e.forceAuthor??!1}),n=e.resolvedTest.steps.map(o=>o.objective).filter(o=>typeof o=="string"&&o.length>0).slice(0,50),s=await Kt({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:e.testId,body:{commitId:e.newCommitId,fromCommitId:e.fromCommitId,commitMessage:r,totalSteps:e.resolvedTest.steps.length,timeTaken:Math.round(e.durationS??0),objectives:n},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(s.ok&&e.sourcePath){let o=Re(e.sourcePath);try{let i=JSON.parse(Gt(o,"utf8"));i.commit_id=e.newCommitId,Yt(o,JSON.stringify(i,null,2)+`
|
|
20
|
+
`,"utf8")}catch(i){process.stderr.write(`warn: failed to update meta.json commit_id: ${i.message}
|
|
21
|
+
`)}}if(s.ok)for(let o of e.unitLocks??[]){if(!t.files.includes(o.file)){await Fe({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:o.testId,body:{commitId:e.newCommitId,fromCommitId:o.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),ve(o.testId);continue}let i=e.resolvedTest.steps.filter(c=>c.owningFile===o.file),f=i.map(c=>c.objective).filter(c=>typeof c=="string"&&c.length>0).slice(0,50),l=await Kt({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:o.testId,body:{commitId:e.newCommitId,fromCommitId:o.fromCommitId,commitMessage:`healed via importer ${e.sourcePath??""}`,totalSteps:i.length,timeTaken:0,objectives:f},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(l.ok){let c=Re(o.file);try{let y=JSON.parse(Gt(c,"utf8"));y.commit_id=e.newCommitId,Yt(c,JSON.stringify(y,null,2)+`
|
|
22
|
+
`,"utf8")}catch(y){process.stderr.write(`warn: failed to update unit meta commit_id (${o.file}): ${y.message}
|
|
23
|
+
`)}}else process.stderr.write(`warn: unit self-commit failed (${o.file}): ${l.reason??""} ${l.message??""}
|
|
24
|
+
`)}return s}}function uo(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=Re(e.sourcePath);try{let n=ns(r)?JSON.parse(Gt(r,"utf8")):{};e.session.sessionId&&(n.commit_id=e.session.sessionId),t&&(n.testcase_id=t),e.tmsIds?.testId&&(n.test_id=e.tmsIds.testId),e.tmsIds?.projectId&&(n.project_id=e.tmsIds.projectId),e.tmsIds?.folderId&&(n.folder_id=e.tmsIds.folderId),e.tmsIds?.orgId&&(n.org_id=e.tmsIds.orgId),e.tmsIds?.sessionName&&(n.session_name=e.tmsIds.sessionName),Yt(r,JSON.stringify(n,null,2)+`
|
|
25
|
+
`,"utf8")}catch(n){process.stderr.write(`warn: failed to update meta.json after endTest: ${n.message}
|
|
26
|
+
`)}}}function ss(e){let t=ie(e.env),r={files:[]},{session:n,auth:s}=e,o=s.basicAuth?{username:s.basicAuth.username,accessKey:s.basicAuth.access_key}:s.token,i=s.resolvedCreds?.username??s.basicAuth?.username??"",f=s.resolvedCreds?.access_key??s.basicAuth?.access_key??"",l=s.resolvedCreds?.org_id??0,c=s.resolvedCreds?.user_id??0,y=[];for(let k of Object.keys(n.auteurVariables))k.startsWith("secrets.user.")&&y.push({key_name:k.replace("secrets.user.",""),scope:"user"});let A=n.getContext().prior_runs.map(k=>k.status),R=n.auteurVariables,x=Object.keys(R).length>0;return{controllerBaseUrl:t.controllerBaseUrl,tmsBaseUrl:t.tmsBaseUrl,auth:o,authResolver:s.resolver,sessionId:n.sessionId,sessionDir:n.sessionDir,testId:n.testId,commitId:n.sessionId,apMode:n.apMode,projectId:e.projectId,folderId:e.folderId,firstObjective:n.firstObjective??"KaneAI Test",firstUrl:n.firstUrl??"",runDirs:n.getRunDirs(),runObjectives:n.getRunObjectives(),runMetadata:n.getRunMetadata(),startedAt:n.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:A,orgId:l,userId:c,tmsUsername:i,tmsAccessKey:f,screenshotBaseUrl:n.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:t.shareApiBaseUrl,variables:x?R:void 0,variableIds:e.variableIds,secrets:y,codeExport:e.codeExport,onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:lo(e,r),onCommitLock:co(e,r),onFinalizeSuccess:uo(e),evidence:e.evidence,evidenceRead:e.evidenceRead,authoredExecutionPath:e.authoredExecutionPath}}var os=["python","javascript"];function mo(e){if(e!==void 0){if(!os.includes(e))throw new Error(`--code-language must be one of: ${os.join(", ")} (got "${e}")`);return e}}function is(e,t){let r=mo(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}async function as(e){try{let r=await new et(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 fo=null,po=()=>fo??=import("sharp").then(e=>e.default??e).catch(()=>null),ft=class{maxWorkers;maxRetries=2;queue=[];activeCount=0;drainResolvers=[];sas;log;uploadedExt=new Map;constructor(t,r=3,n){this.sas=t,this.maxWorkers=r,this.log=n}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,n="image/webp",s=await po();if(s)try{let l=await s(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(l)}catch(l){r=new Uint8Array(t.buffer),n="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:l instanceof Error?l.message:String(l)})}else r=new Uint8Array(t.buffer),n="image/png";let o=n==="image/webp"?"webp":"png",i=`test_screenshots/untagged_screenshot/${t.operationId}.${o}`,f=`${this.sas.base_url}/${this.sas.container}/${i}?${this.sas.sas_token}`;for(let l=0;l<=this.maxRetries;l++)try{let c=await q(f,{method:"PUT",headers:{"Content-Type":n,"x-ms-blob-type":"BlockBlob"},body:r});if(c.ok){this.uploadedExt.set(t.operationId,o);return}if(l<this.maxRetries){await this.backoff(l);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed after retries",{operation_id:t.operationId,status:c.status,attempts:this.maxRetries+1})}catch{if(l<this.maxRetries){await this.backoff(l);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(n=>setTimeout(n,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}};import{platform as go,arch as ho}from"os";function ls(e){let t={proxyUrl:Tr,sessionId:e.sessionId,identity:e.identity,device:{cli_version:Je,platform:go(),arch:ho(),host_agent:Nt(),invocation_mode:e.invocationMode},getToken:e.getToken};return new Ft(t)}async function bo(e){try{let t=ie(e.env),n=await new Ie(t.controllerBaseUrl,e.auth).getScreenshotSas();return e.session.setScreenshotSas(n),e.log("info","SCREENSHOT_SAS_OK","Screenshot SAS fetched",{base_url:n.base_url,container:n.container,expiry:n.expiry}),new ft(n,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 yo(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=ls({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:mn(),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 Zt(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):bo({env:e.env,auth:e.auth,session:e.session,log:e.log}),yo({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 Wt(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function Ia(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 n=await Qt(e.env,e.tmsCreds,r,t);return Jt(n,t),n}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await Wt(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null);let n=t.auth.initResolver(e.env),s=await n.resolve(!0).catch(()=>null);if(!s)return t.log("warn","IDENTITY_VALIDATE_FAILED","Identity validation failed",{kind:e.kind,env:e.env}),null;t.state.setTmsCredsCache(s);let o=await Qt(e.env,s,n,t);return Jt(o,t),o}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await Wt(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 Wt(r),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null;let n=t.state.getTmsCredsCache(),s=t.auth.getResolver(),o=s??t.auth.initResolver(e.env);!s&&n&&o.prime(n);let i=await Qt(e.env,n,o,t);return Jt(i,t),i}}}async function Qt(e,t,r,n){let s=n.auth.getBasicAuth(),o=s?null:await n.auth.getToken(),i=s?{username:s.username,accessKey:s.access_key}:o??null;return i===null?{resolver:r,screenshotQueue:null,remoteLogger:null}:Zt({env:e,tmsCreds:t,resolver:r,auth:i,getToken:()=>n.auth.getToken(),session:n.getSession(),log:n.log,skipScreenshotQueue:n.options?.skipScreenshotQueue,invocationMode:"tui"})}function Jt(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))}import{relative as wo}from"path";import{readFile as vo}from"fs/promises";function cs(e){return e.shouldUploadArtifacts&&!e.lockHeld&&!e.isFirstRun&&e.sealed&&!!e.testId}var Xt=e=>e instanceof Error?e.message:String(e);async function ds(e){let{controller:t,tms:r,testId:n,sessionId:s,executionId:o,sealedPackPath:i,projectId:f}=e,l;try{let c={key:"evidence",content_type:"application/zip",filename:`${o}.evidence`},w=(await t.getPresignedUrls(n,s,[c])).urls?.evidence?.upload_url;if(!w)return{ok:!1,stage:"presign",error:"presign response missing evidence upload_url"};l=w}catch(c){return{ok:!1,stage:"presign",error:Xt(c)}}try{let c=await vo(i);await tn(l,c,"application/zip")}catch(c){return{ok:!1,stage:"upload",error:Xt(c)}}try{await r.ingestEvidence(o,f)}catch(c){return{ok:!1,stage:"ingest",error:Xt(c)}}return{ok:!0}}function us(e){return e.isFirstRun||ot(e.decisions)||e.push===!0||e.author===!0}function ms(e,t){return{projectId:e?.project_id??t.project_id??null,folderId:e?.folder_id??t.folder_id??null}}function er(e){return e?"author":"replay"}function _o(e,t){return e?{session:e,ownsLifecycle:!1}:{session:t,ownsLifecycle:!0}}function pt(e,t){return e?.total_runs??t?.length??1}function Io(e){let t=(e?.per_flow_metadata??[]).map(r=>({resultCode:r?.result_code!=null?Number(r.result_code):null}));return{resultCode:e?.result_code!=null?Number(e.result_code):null,...t.length?{perFlow:t}:{}}}var gt=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function Al(e,t,r){let{path:n,cwd:s,opts:o,isAgent:i,disableAskUser:f,resolved:l,resolvedAuth:c,cliOverrides:y,environment:w,envConfig:A,profile:R,model:x,creds:k,configStore:E,session:a}=e,z=!1,m=await Eo(n,l,o,{resolvedAuth:c,tmsBaseUrl:A.tmsBaseUrl},a.sessionId,r);if(m.abort)return{overallStatus:"failed",exitCode:m.abort.exitCode,outputDir:ne(n),durationS:0,uploadResult:null};let _=m.lockAcquired,L=!1,ue=new Set,Z=!1,se=!1;_&&t.onLockState({phase:"acquired",scope:"preemptive"}),a.start({model:x,environment:w,profile:R}),a.setRecordingEnabled(!1);let M=0,nr=c.basicAuth?{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}:c.token??null,Te=null;if(nr!==null){let d=await Zt({env:w,tmsCreds:c.resolvedCreds??null,resolver:c.resolver,auth:nr,getToken:async()=>c.token??null,session:a,log:(u,p,b,h)=>a.log(u,p,b,h),skipScreenshotQueue:!!o.local||!c.basicAuth,invocationMode:i?"agent":"cli"});Te=d.screenshotQueue,d.remoteLogger&&(r.register("remote-logger",()=>d.remoteLogger.shutdownSync()),r.remoteLogger=d.remoteLogger,e.skipGlobalRemoteLogger||Dr(d.remoteLogger))}if(o.name){try{ln(o.name)}catch(d){return process.stderr.write(`error: ${d.message}
|
|
27
|
+
`),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}a.setSessionName(o.name)}let ht={};for(let[d,u]of Object.entries(l.rootGlobal))gt.includes(d)||(ht[d]=u);for(let[d,u]of Object.entries(y))gt.includes(d)||u!==void 0&&(ht[d]=u);let X={...l.chrome};for(let d of gt){let u=y[d];u!==void 0&&(X[d]=u)}let bs={...ht,...X};a.setResolvedGlobal(bs);let sr=k.getActiveProfile()??"default",or=k.getDefaultEnv(),{rehydrateIfStale:ys}=await import("./profile-sync-DTTRRIVP.js");ys(k,E,sr,or);let U=E.load(),ir=(y.assertion_mode??U.assertion_mode)==="dom"?"dom":"visual",ar=y.final_validation,lr=ar===void 0?void 0:ar==="on",$=U.project_id??null,fe=U.folder_id??null,cr=us({isFirstRun:m.isFirstRun,decisions:m.decisions,push:o.push===!0,author:o.author===!0});if(cr){if(c.basicAuth){let d=await Nr({creds:k,config:E,profile:sr,env:or,tmsCreds:c.basicAuth,isLocal:!!o.local,log:(u,p,b,h)=>a.log(u,p,b,h),onAnnounce:e.onAnnounce,onFatalExit:e.onFatalExit});if(d.status==="ok"){$=d.projectId,fe=d.folderId,U=E.load();let u=ye(n);u?.project_id&&($=u.project_id,fe=u.folder_id??fe),i&&d.autoDefaulted&&t.onAgentEvent(Fr(d.autoDefaulted))}else if(d.status==="cancelled"){process.stderr.write(`error: project/folder configuration failed. See remediation above, or use --local.
|
|
28
|
+
`);let{shutdown:u}=await import("./exit-manager-MXUD7GQ7.js");return u(2,"project/folder gate failed"),{}}}}else{let d=ye(n);({projectId:$,folderId:fe}=ms(d,{project_id:U.project_id??null,folder_id:U.folder_id??null})),a.log("info","GATE_SKIP_REPLAY","Project/folder gate skipped (planned pure replay)",{meta_project:!!d?.project_id,config_project:!!U.project_id})}{let d=rn(l),u=c.resolvedCreds?.org_id!=null?String(c.resolvedCreds.org_id):void 0,p=d.find(g=>g.project_id&&$&&g.project_id!==String($)||g.org_id&&u&&g.org_id!==u),b=new Set(d.map(g=>g.project_id).filter(Boolean)),h=new Set(d.map(g=>g.org_id).filter(Boolean));if(p||b.size>1||h.size>1){let g=p??d[0];return process.stderr.write(`error: tenant mismatch \u2014 imported test '${g.file}' was authored under project ${g.project_id??"?"} / org ${g.org_id??"?"}, which differs from the run's project/org (or another imported test). Cross-tenant imports are not allowed.
|
|
29
|
+
`),await a.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}}let oe;try{oe=await Hn({config:{chrome_profile_path:X.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:Ze,headless:X.headless??!1,wsEndpoint:X.ws_endpoint,cdpEndpoint:X.cdp_endpoint})}catch(d){return process.stderr.write(`error: Chrome launch failed: ${d.message}
|
|
30
|
+
`),await a.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}let Ke=oe.instance;Ke&&r.register("chrome",()=>{try{Ke.kill()}catch{}});let dr=qr(oe.cdpEndpoint),ee=null,ur=!1,He=()=>{if(!ee?.diedUnexpectedly)return!1;if(!ur){ur=!0;let d=ee.stderr.slice(-500);a.log("error","RUNNER_FATAL_DEATH","v16-runner exited unexpectedly mid-session",{stderr_tail:d}),process.stderr.write(`error: v16-runner exited unexpectedly mid-session \u2014 remaining steps skipped.
|
|
31
|
+
`)}return!0},G=null,mr=oe.cdpEndpoint??X.cdp_endpoint;if(mr&&!X.ws_endpoint&&!X.headless&&!e.isAgent)try{G=jn({headless:X.headless??!1,cdpEndpoint:mr,chromePid:Ke?.process.pid}),G&&r.register("marker-overlay",()=>G.kill())}catch(d){a.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(d)})}c.resolvedCreds?.org_id!==void 0&&a.setOrgId(String(c.resolvedCreds.org_id)),a.setUserIdentity(c.resolvedCreds?.username??null,c.resolvedCreds?.email??null);let ge=Xn({objective:"",globalDir:de(Ct,"variables"),localDir:de(s,".testmuai","variables"),file:o.variablesFile,inline:o.variables}),vs=l.rootGlobal.variables??{},te=Ro(ge.raw,vs);a.setAuteurVariables(te.auteur);let fr=zt(de(Ct,"global-memory.md"))??void 0,pr=zt(de(s,".testmuai","context.md"))??void 0;o.local?process.stderr.write(`info: --local \u2014 KaneAI upload skipped
|
|
32
|
+
`):c.basicAuth?$||(cr?process.stderr.write(`warn: KaneAI upload skipped \u2014 no project configured.
|
|
33
|
+
`):process.stderr.write(`warn: evidence publish will be skipped \u2014 no project_id in meta.json or config.
|
|
34
|
+
`)):process.stderr.write(`warn: KaneAI upload skipped \u2014 TMS credentials could not be resolved.
|
|
35
|
+
Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
|
|
36
|
+
`);let we=!o.local&&!!c.basicAuth&&$!=null;if(a.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:we,lockHeld:_,isFirstRun:m.isFirstRun,hasAuth:m.hasAuth}),we&&m.testId==null&&!m.degradedReadonly){let d=ie(w);try{let u=await as({tmsBaseUrl:d.tmsBaseUrl,auth:c.basicAuth,objective:l.steps[0].objective,url:"",projectId:$,folderId:fe??"",hasCustomProfile:!!X.chrome_profile,log:(p,b,h,g)=>a.log(p,b,h,g)});u&&a.setTestId(u)}catch(u){process.stderr.write(`warn: ATM test creation failed: ${u.message}
|
|
37
|
+
`)}}else m.testId&&a.setTestId(m.testId);let qe={};if(c.basicAuth&&!o.local&&(te.secretEntries.length>0||te.nonSecretEntries.length>0))try{qe=await es({variables:te,auth:c.basicAuth,orgId:String(c.resolvedCreds?.org_id??""),env:w,localMode:!!o.local,log:(d,u,p,b)=>a.log(d,u,p,b)})}catch(d){process.stderr.write(`warn: variable/secret push failed: ${d.message}
|
|
38
|
+
`)}let bt=new Map;for(let[d,u]of te.nonSecretEntries)bt.set(d,u.value);let yt=new Map;for(let[d,u]of te.secretEntries)yt.set(d,u.value);async function vt(d){if(!c.basicAuth||o.local)return;let u=[],p=[];for(let[h,g]of Object.entries(d))if(g.secret){if(yt.get(h)===g.value)continue;p.push([h,g])}else{if(bt.get(h)===g.value)continue;u.push([h,g])}if(u.length===0&&p.length===0)return;let b=ie(w);if(u.length>0){let h=new Ee(b.tmsBaseUrl,c.basicAuth.username,c.basicAuth.access_key);for(let[g,I]of u)try{let C=await h.upsertVariable({name:g,value:I.value});qe[g]=C.id,bt.set(g,I.value),a.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:g})}catch(C){a.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:g,error:String(C)})}}if(p.length>0){let h=new Ce(b.secretsBaseUrl);for(let[g,I]of p)try{await h.pushSecret({secretKey:g,secretValue:I.value,username:c.basicAuth.username,accessKey:c.basicAuth.access_key,orgId:String(c.resolvedCreds?.org_id??"")}),yt.set(g,I.value),a.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:g})}catch(C){a.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:g,error:String(C)})}}}let Le=Te?(d,u,p,b)=>{if(!(_||m.isFirstRun))return;if(T&&b){xn(T.packTestDir,b,Te,(g,I,C,j)=>a.log(g,I,C,j));return}let h=M+u;Pn(a.sessionDir,h,d,Te,(g,I,C,j)=>a.log(g,I,C,j),p)}:void 0,gr=l.rootTitle??l.rootSteps[0]?.heading??fs(n),Ss=Object.keys(te.raw).length>0?_e(te.raw,gr).objective:gr,he=Dn({flag:o.url,frontmatter:l.rootGlobal?.url,configDefault:E.load().default_url}),ws=On({resolvedUrl:he,local:!!o.local,allowMissingUrl:!!o.allowMissingUrl,isTTY:!!process.stdin.isTTY});a.setFirstRun(Ss,he??"");let me=new ct(l),ze=new Date().toISOString(),hr=Date.now(),St=e.evidenceAttach?null:new zr({origin:"testmd",runKind:"author",pid:process.pid,title:l.rootTitle??fs(n),started:ze,producerVersion:Je,surfaces:he?[he]:void 0,testmdRelPath:wo(s,n),definition:{path:"test.md",content:gs(n,"utf8")},cwd:s,packRootDir:de(a.sessionDir,"evidence")}),ce=_o(e.evidenceAttach,St),re=ce.session,T=null;if(e.evidenceAttach)T={executionId:e.evidenceAttach.id,testId:e.evidenceAttach.test,packTestDir:e.evidenceAttach.packTestDir};else if(St)try{T=await St.start()}catch(d){a.log("warn","EVIDENCE_START_FAILED","Evidence pack creation failed",{error:String(d)})}let Ge=[],wt=[],br,_t=(d,u,p,b,h)=>{if(!T)return;re.noteSpawn(h?.length?{...d,steps:d.steps.map(I=>({...I,verifies:h}))}:d),d.resolution&&(br=d.resolution),Ge.push(Io(u));let g=pt(u,b);for(let I=0;I<g;I++)wt.push(p+I)},It=()=>T?{packTestDir:T.packTestDir,ordinalOffset:re.nextOrdinalOffset()}:void 0,_s=typeof o.maxSteps=="string"&&o.maxSteps!==""?parseInt(o.maxSteps,10):void 0;function yr(d,u){let p=l.steps[d],b=ps(p.config,y),h=Ae(ge.raw,b.variables,p.objective);return qn({objective:h.objective,url:d===0?he??void 0:p.unitEntryUrl,requireStartUrl:d===0&&ws,model:x,chrome:oe,auth:c,sessionId:a.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:b.max_steps??_s??30,headless:X.headless??!1,disableAskUser:!0,variables:Object.keys(h.variables).length>0?h.variables:void 0,globalContext:b.global_context??fr,localContext:b.local_context??pr,sessionContext:a.getContext(),bugDetection:o.bugDetection??U.bug_detection,evidence:It()})}function vr(d){let p=l.steps[d].trace[0].stepIndex,b=l.rootSteps.find(g=>g.index===p);l.steps.slice(0,d).some(g=>g.trace[0].stepIndex===p)||t.onAgentEvent({type:"test_md_step_start",step_index:p,heading:b.heading,ref:b.body.kind==="import_ref"?{kind:"import",label:b.body.path,unit_kind:b.body.path.endsWith("_test.md")?"test":"helper"}:null})}function Rt(d,u,p,b,h,g){let I=l.steps[d],C=I.trace[0].stepIndex,j=!l.steps.slice(d+1).some(D=>D.trace[0].stepIndex===C),F=p?.status==="passed"?"passed":"failed",O=p?.reason??h??void 0,W=p?.duration??g,S=p?.verdict;if(S&&typeof S=="object"){let D=typeof S.one_liner=="string"?S.one_liner:"",H=typeof S.bug_title=="string"&&S.bug_title?S.bug_title:D;if(H&&F==="failed"){let Q=[S.family,S.category].filter(Boolean).join("/"),J=typeof S.confidence=="number"?`, confidence ${S.confidence.toFixed(2)}`:"";O=`${O??"failed"} \u2014 bug verdict: ${H}${Q?` [${Q}${J}]`:""}`}let v=typeof S.category_proposal=="string"?S.category_proposal:"";v&&F==="failed"&&(O=`${O??"failed"}; category proposal: ${v} \u2014 consider adding to taxonomy`),t.onAgentEvent({type:"test_md_bug_verdict",step_index:I.trace[0].stepIndex,confirmed:S.confirmed===!0,bug_title:H||null,family:S.family??null,category:S.category??null,category_proposal:v||null,severity:S.severity??null,confidence:typeof S.confidence=="number"?S.confidence:null,one_liner:D||null})}let{continueOverall:N}=me.recordStep(I,{status:F,duration_s:W,reason:O}),V=ps(I.config,y),K=Ae(ge.raw,V.variables,I.objective).objective;if(p){let D=Tn(p,u,b);a.addRunResult(Ln(p,K,u,D),p.total_runs)}else a.addRunResult({index:u,objective:K,status:F,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(j||!N){let D=me.snapshotOutcomes().find(H=>H.rootStepIndex===C);t.onAgentEvent({type:"test_md_step_end",step_index:C,status:D.status,duration_s:D.duration_s??0,ref_kind:D.refKind??null,unit_kind:D.refKind==="import"?(D.refLabel??"").endsWith("_test.md")?"test":"helper":null,inlined_count:D.inlinedCount??null,failed_sub_step_index:D.failedSubStepIndex??null})}return N}let kt=[];async function Is(d){pn(d,l.steps.length);for(let u=0;u<d;u++){if(z||e.signal?.aborted)return{failedAt:u,cancelled:!0};if(He())return{failedAt:u,cancelled:!1};let p=l.steps[u],b=m.decisions[u];if(b.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${u}
|
|
39
|
+
`),{failedAt:u,cancelled:!1};let h=a.nextRunIndex();M=h;let g=u===0?he??void 0:l.steps[u].unitEntryUrl,I={width:U.window_size.width,height:U.window_size.height},C=Ae(ge.raw,p.config.variables,p.objective),j=Mt({step:p,decision:b,chrome:oe,auth:c,sessionId:a.sessionId,runIndex:h,sessionDir:a.sessionDir,windowSize:I,forceNavigateUrl:g,sessionContext:a.getContext(),variables:Object.keys(C.variables).length>0?C.variables:void 0,evidence:It(),investigationAsync:!ce.ownsLifecycle});await vt(C.raw),vr(u);let F=Date.now(),O=null,W=null,S=nt(),N={...j};delete N.run_id,Pt(N,{environment:w});let V=`run-${h}`;try{G?.setRunActive(!0);try{for await(let v of ee.run(V,"replay",N)){if(t.onAgentEvent(v),S=Tt(S,v),v.type==="step_event"&&v.event==="reasoning"?G?.setStepText(v.detail):v.type==="step_end"&&(v.status==="passed"&&G?.setStepComplete(),Le&&Le(v.index,0,v.child_id,typeof v.ordinal=="number"&&v.id?{ordinal:v.ordinal,id:v.id}:void 0)),v.type==="run_end"){O=v;break}if(v.type==="error"){W=v.message??"runner error";break}}!ce.ownsLifecycle&&O?.status==="failed"&&kt.push({exited:ee.exited.then(()=>{}).catch(()=>{}),cancel:()=>{try{ee?.cancel()}catch{}}})}finally{G?.setRunActive(!1)}}catch(v){W=v.message}if(ee.diedUnexpectedly&&He(),z)return{failedAt:u,cancelled:!0};let K=Math.round((Date.now()-F)/1e3),D=Rt(u,h,O,null,W,K);a.recordStepRun({testmdStepIndex:l.steps[u].flatIndex,runIndex:h,totalRunDirs:pt(O,null)}),_t(S,O,h,null,l.steps[u].verifies);let H=!!W||O?.status==="failed";if(gn(u,H?"failed":"ok"),H||!D)return{failedAt:u,cancelled:!1}}return{failedAt:null,cancelled:!1}}let Sr=async()=>{if(_)return!0;let d=c.basicAuth;if(!d){let h=await c.resolver.resolve(!0);h?.username&&h?.access_key&&(d={username:h.username,access_key:h.access_key},c.basicAuth=d)}if(!m.testId||!m.fromCommitId||!d)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
|
|
40
|
+
`),!1;let u=a.sessionId,p=o.onLockConflict??l.rootGlobal.on_lock_conflict??"readonly",b=await rr({tmsBaseUrl:A.tmsBaseUrl,testId:m.testId,fromCommitId:m.fromCommitId,newCommitId:u,basicAuth:d,onLockConflict:p});if(b==="ok"){_=!0,m.newCommitId=u,a.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:m.testId}),i&&t.onLockState({phase:"acquired",scope:"mid_run"}),lt({baseUrl:xe(A.tmsBaseUrl),testId:m.testId,auth:Pe(d),lifecycle:r});let h=await hs({resolved:l,decisions:m.decisions,tmsBaseUrl:A.tmsBaseUrl,newCommitId:u,basicAuth:d,mode:p,lifecycle:r,alreadyLocked:m.unitLocks,allUnits:!0});return h.outcome==="ok"?m.unitLocks.push(...h.locks):process.stderr.write(`warn: mid-run unit lock acquisition degraded (${h.outcome}) \u2014 affected units will not self-commit
|
|
41
|
+
`),!0}return a.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:b}),i&&t.onLockState({phase:"conflict",scope:"mid_run",reason:b}),process.stderr.write(`error: mid-run lock acquisition failed (${b})
|
|
42
|
+
`),!1};if(i){let d=rt();if(!d)return process.stderr.write("error: v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.\n"),r.cleanup("marker-overlay","v16-runner not found"),r.cleanup("chrome","v16-runner not found"),await a.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null};let u=$r({environment:w,mode:y.mode??"testing",assertionMode:ir,finalValidation:lr,username:c.basicAuth?.username,accessKey:c.basicAuth?.access_key,sessionId:a.sessionId});ee=new Mr({env:u,runner:d,log:(C,j,F,O)=>a.log(C,j,F,O),sessionId:a.sessionId}),r.register("runner",()=>{(Or()||e.signal?.aborted)&&(z=!0);try{ee?.kill()}catch{}});let p={cdp_endpoint:oe.cdpEndpoint,ws_endpoint:oe.wsEndpoint,width:U.window_size.width,height:U.window_size.height,headless:X.headless??!1,model:x,session_id:a.sessionId};c.basicAuth?(p.username=c.basicAuth.username,p.access_key=c.basicAuth.access_key):c.token&&(p.auth={type:"bearer",token:c.token}),await ee.start(p);let b=o.author===!0;b&&($t(),a.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let{authorBoundary:h,cancelledInPhase:g,shrinkCount:I}=await Sn({decisions:m.decisions,forceAuthor:b,hasRetry:o.retry===!0||o.retryCount!==void 0,maxShrinks:o.retryCount!==void 0?parseInt(o.retryCount,10):je.maxShrinks,runReplayPhase:Is,session:a,accumulator:me,acquireLockIfNeeded:Sr});if(se=I>0,I>0&&(a.log("info","RETRY_TRIGGERED","Retry loop triggered",{shrink_count:I,final_author_boundary:h}),t.onRetryAttempt({shrink_count:I,final_author_boundary:h,complete_reauthor:h===0})),h===0&&I>0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:I}),!g&&h>=0)for(let C=h;C<l.steps.length&&!e.signal?.aborted;C++){let j=l.steps[C];if(He()){me.recordStep(j,{status:"failed",duration_s:0,reason:"v16-runner exited unexpectedly mid-session"});break}if(!me.shouldRunFlatStep(j))continue;vr(C),L=!0,ue.add(l.steps[C].flatIndex);let F=a.nextRunIndex();M=F,await vt(Ae(ge.raw,j.config.variables,j.objective).raw);let O=yr(C,F),W=Date.now(),S=null,N=null,V=null,K=!1,D=0,H=nt(),v={...O};delete v.run_id,Pt(v,{environment:w});let Q=`run-${F}`;try{G?.setRunActive(!0);try{for await(let P of ee.run(Q,"author",v)){if(t.onAgentEvent(P),H=Tt(H,P),P.type==="bifurcation"){let Oe=P.count??P.flows?.length??0;(P.is_single_flow??Oe<=1)||(V=P.flows??null,K=!0,D=0)}else if(P.type==="run_start"&&K)D++;else if(P.type==="step_event"&&P.event==="reasoning")G?.setStepText(P.detail);else if(P.type==="step_end"&&(P.status==="passed"&&G?.setStepComplete(),Le)){let Oe=K?Math.max(0,D-1):0;Le(P.index,Oe,P.child_id,typeof P.ordinal=="number"&&P.id?{ordinal:P.ordinal,id:P.id}:void 0)}if(P.type==="run_end"){S=P;break}if(P.type==="error"){N=P.message??"runner error";break}}}finally{G?.setRunActive(!1)}}catch(P){N=P.message}ee.diedUnexpectedly&&He();let J=Math.round((Date.now()-W)/1e3),De=Rt(C,F,S,V,N,J);if(a.recordStepRun({testmdStepIndex:l.steps[C].flatIndex,runIndex:F,totalRunDirs:pt(S,V)}),_t(H,S,F,V,l.steps[C].verifies),!De||z||e.signal?.aborted)break}}else{let{effectiveDecisions:d}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:u}=await import("./replay-policy-6USQBT3E.js"),p=o.retry===!0||o.retryCount!==void 0,b=o.retryCount!==void 0?parseInt(o.retryCount,10):je.maxShrinks,h=o.author===!0;h&&($t(),a.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let g=h?0:it(m.decisions),I=0,C=null,j=m.decisions.filter(S=>S.kind==="replay").length,F=m.decisions.length-j,O=[];o.push&&O.push("--push"),p&&O.push("--retry"),o.retryCount!==void 0&&O.push(`--retry-count=${o.retryCount}`),h&&O.push("--author");let W={source:n,steps:{total:m.decisions.length,replay:j,author:F},model:x,viewport:{width:U.window_size.width,height:U.window_size.height},chrome:oe.cdpEndpoint??oe.wsEndpoint??"managed",session:a.sessionName??"ephemeral",variables:{count:Object.keys(te.raw).length,secrets:Object.values(te.raw).filter(S=>S.secret).length,names:Object.keys(te.raw)},flags:O,mode:y.mode??"testing"};for(;;){let S=a.snapshot(),N=me.snapshot(),V=d(m.decisions,g,h);if(I>=1){let v=g===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${I}/${b})`:`\u21BB Retry ${I}/${b} \u2014 replay 0..${g-1}, author ${g}..${m.decisions.length-1}
|
|
43
|
+
reason: replay miss at step ${(C??0)+1}`;process.stderr.write(v+`
|
|
44
|
+
`)}let K=I>=1&&g>0&&C!==null?{startIdx:0,endIdx:C,count:C}:void 0;G?.setRunActive(!0);let D=await xo({decisions:V,resolved:l,session:a,accumulator:me,tuiConfig:U,globalConfig:W,buildStepConfigAt:yr,buildReplayConfig:v=>{let Q=m.decisions[v];if(Q.kind!=="replay")throw new Error("expected replay decision at index "+v);let J=l.steps[v];return Mt({step:J,decision:Q,chrome:oe,auth:c,sessionId:a.sessionId,runIndex:a.nextRunIndex(),sessionDir:a.sessionDir,windowSize:{width:U.window_size.width,height:U.window_size.height},forceNavigateUrl:v===0?he??void 0:J.unitEntryUrl,sessionContext:a.getContext(),variables:ko(ge.raw,J.config.variables,J.objective),evidence:It()})},onAnyAuthorStep:v=>{L=!0,ue.add(l.steps[v].flatIndex)},onCancel:()=>{Z=!0},topBannerModel:x,topBannerAuth:`${k.getActiveProfile()??"no profile"}/${w}`,spawnOpts:{environment:w,mode:y.mode??"testing",assertionMode:ir,finalValidation:lr,log:(v,Q,J,De)=>a.log(v,Q,J,De)},priorAttemptRollup:K,pushStepLevelDelta:(v,Q)=>vt(Ae(ge.raw,v,Q).raw),onSequencerStepEnd:(v,Q,J,De)=>{let P=Math.round((Date.now()-De)/1e3),Oe=v.hadError?v.reason??"runner error":null,As=Rt(Q,J,v.runEnd,v.bifurcationFlows??null,Oe,P);return a.recordStepRun({testmdStepIndex:l.steps[Q].flatIndex,runIndex:J,totalRunDirs:pt(v.runEnd,v.bifurcationFlows)}),_t(v.evidence??nt(),v.runEnd,J,v.bifurcationFlows,l.steps[Q].verifies),As},screenshotDispatcher:Le,onReasoning:v=>G?.setStepText(v),onStepComplete:()=>G?.setStepComplete(),onSpawnStart:v=>{M=v},host:t});if(G?.setRunActive(!1),D.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(D.failedAt===null)break;let H=u({failedAt:D.failedAt,shrinkCount:I,hasRetry:p,maxShrinks:b});if(H.kind==="fail"||!_&&!await Sr())break;a.rollback(S),me.rollback(N),H.kind==="complete-reauthor"?g=0:g=H.newAuthorBoundary,I++,se=!0,a.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:I,failed_at:C}),g===0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:I}),C=D.failedAt}}let Y=me.finalize(),be=Math.round((Date.now()-hr)/1e3),Rs={session:a,resolvedAuth:c,chromeResult:oe,chromeInstance:Ke??null,testId:a.testId??null,preparedVariables:te,variableIds:qe,globalContext:fr,localContext:pr,tuiConfig:U,env:w,localMode:!!o.local},wr=!1,_r=!1,Ir=!1,Rr=async(d={})=>{if(!T)return!1;if(ce.ownsLifecycle?wr:Ir)return!0;try{let u=await dr(),p=er(L)==="replay",b=de(ne(n),".internal","execution.json"),h=de(a.sessionDir,"execution.json"),g=Jr(T.packTestDir,p?[b,h]:[h,b],(S,N,V,K)=>a.log(S,N,V,K)),{ids:I,linear:C}=g?Xr(T.packTestDir):{ids:[],linear:!0},{steps:j,tail:F,unjoined:O}=Zr(re.steps,I,p,C);g?O?a.log("warn","SKIPPED_TAIL_UNJOINED","Executed records don't align with the authored blob \u2014 skipped tail withheld",{executed:re.steps.length,leaves:I.length}):F.length>0&&a.log("info","SKIPPED_TAIL_APPENDED","Unexecuted authored actions recorded as skipped",{count:F.length}):a.log("warn","SKIPPED_TAIL_NO_BLOB","No auteur blob in pack \u2014 unexecuted actions cannot be recorded as skipped",{});let W=await re.writeResult({steps:[...j,...F],spawns:Ge.length?Ge:[{resultCode:null}],tags:l.rootGlobal.tags,externalIdInput:{execution_id:T.executionId,session_id:a.sessionId,commit_id:p?m.fromCommitId??a.sessionId:a.sessionId,test_id:m.testId??a.testId??void 0,testcase_id:d.testcaseId??m.testcaseId??a.testcaseId??void 0,project_id:$??void 0,folder_id:fe??void 0,org_id:a.orgId!=null?String(a.orgId):void 0,session_name:a.sessionName??Ue(n),user_name:a.userName??void 0,user_email:a.userEmail??void 0,sharable_link:Nn(ie(w).testManagerUiUrl,$,d.testcaseId??m.testcaseId??a.testcaseId,d.shareId)},runnerEnv:Hr({cdpBrowser:u,resolution:br}),intentEnv:{model:x,platform:"Desktop",platform_type:"web",...ce.ownsLifecycle?{}:{run_kind:er(L)}},durationMs:Date.now()-hr,log:(S,N,V,K)=>a.log(S,N,V,K)});if(!ce.ownsLifecycle)return await Vr(re.pack,T.testId,de(a.sessionDir,"tui.log")),Ir=!0,a.log("info","EVIDENCE_RESULT_WRITTEN","Member result.yaml written",{execution_id:T.executionId,verdict:W}),!0;if(!_r)try{let S=Wr({cwd:process.cwd(),members:[{path:n,verdict:W,executionId:T.executionId,startedAt:new Date().toISOString(),acs:Yr(re.steps),mode:"testmd",local:!!o.local}]});_r=!0;for(let N of S.warnings)a.log("warn","EXEC_SYNC",N,{});S.synced>0&&a.log("info","EXEC_SYNC",`context sync: ${S.synced} fact(s), ${S.superseded} supersession(s)`,{})}catch(S){a.log("warn","EXEC_SYNC",`exec-sync failed: ${S instanceof Error?S.message:String(S)}`,{})}try{let S=Qr(re.pack,Gr(process.cwd()));S.status==="skipped"&&a.log("warn","EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${S.reason}`,{})}catch(S){a.log("warn","EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(S)})}return await Kr({executionId:T.executionId,testId:T.testId,saved:!0,runKind:er(L),verdict:W,outputStemDir:ne(n),cwd:s,packDir:re.pack,tuiLogPath:de(a.sessionDir,"tui.log"),expectStatusDisagrees:(o.bugDetection??U.bug_detection)==="continue",log:(S,N,V,K)=>a.log(S,N,V,K),surface:"testmd"}),wr=!0,a.log("info","EVIDENCE_SEALED","Evidence pack sealed",{execution_id:T.executionId,verdict:W}),!0}catch(u){return a.log("warn","EVIDENCE_SEAL_FAILED","Evidence pack seal failed",{error:String(u)}),!1}},Ye=we&&(_||m.isFirstRun)&&!m.degradedReadonly,ks=async()=>{if(!c.basicAuth)return null;let d=ie(w),u=(L||o.push===!0)&&!Z,p=(_||m.isFirstRun)&&!Z&&Y.overallStatus==="passed"&&!m.degradedReadonly;a.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:we,shouldUploadPipeline:Ye,shouldReplaceLocalOutput:u,shouldCommit:p,lockHeld:_,anyAuthorStepRan:L,cancelled:Z,overallStatus:Y.overallStatus});let b=ss({session:a,env:w,auth:c,variables:te,variableIds:qe,projectId:$,folderId:fe,totalSteps:Y.outcomes.length,totalDuration:be,screenshotExtMap:Te?.getExtMap(),codeExport:is({codeExport:o.codeExport,codeLanguage:o.codeLanguage,skipCodeValidation:o.skipCodeValidation},U.code_export),onProgress:()=>{},log:(g,I,C,j)=>a.log(g,I,C,j),shouldUploadArtifacts:Ye,shouldReplaceLocalOutput:u,shouldCommit:p,isFirstRun:m.isFirstRun,resolvedTest:l,sourcePath:n,stepRunRecords:a.getStepRunRecords(),authoredFlatIdx:[...ue],unitLocks:m.unitLocks,outcomes:Y.outcomes,overallStatus:Y.overallStatus,fromCommitId:m.fromCommitId,startedISO:ze,durationS:be,tmsIds:{testId:m.testId??a.testId??void 0,testcaseId:m.testcaseId??a.testcaseId??void 0,projectId:$??void 0,folderId:fe??void 0,orgId:a.orgId??void 0,sessionName:a.sessionName??Ue(n)},tmsBaseUrl:A.tmsBaseUrl,testId:m.testId??void 0,newCommitId:m.newCommitId??void 0,basicAuth:c.basicAuth??void 0,decisions:m.decisions,wantsPush:o.push===!0,retryTriggered:se,forceAuthor:o.author===!0,evidence:T&&ce.ownsLifecycle?{executionId:T.executionId,packTestDir:T.packTestDir,sealedPackPath:re.pack,cwd:s,runIndices:wt,sealFn:Rr}:void 0,evidenceRead:T&&!ce.ownsLifecycle?{packTestDir:T.packTestDir,runIndices:wt}:void 0,authoredExecutionPath:L?void 0:de(ne(n),".internal","execution.json")});m.newCommitId!=null&&(b.skipTmsFinalize=!0);let h=new un(b);return i?await h.execute():await t.runUpload(h,g=>{if(g.testcaseId&&g.shareId&&$)return dt(d.testManagerUiUrl,$,g.testcaseId,g.shareId)})};T&&await dr(),ee&&(await ee.shutdown(),r.cleanup("runner","test.md run complete"));let le=await ts(Rs,{performUpload:ks,runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(d,u,p,b)=>a.log(d,u,p,b)},{overallStatus:Y.overallStatus,outcomes:Y.outcomes,sourcePath:n,title:l.rootTitle,rootSteps:l.rootSteps,startedISO:ze,durationS:be,localMode:!!o.local,skipLocalWrites:!0}),kr=await Rr({testcaseId:le.uploadResult?.testcaseId,shareId:le.uploadResult?.shareId}),Cr=o.evidencePublish===!1,Er=ce.ownsLifecycle&&!!T&&!!c.basicAuth&&cs({shouldUploadArtifacts:we,lockHeld:_,isFirstRun:m.isFirstRun,sealed:kr,testId:m.testId});if(Er&&Cr)a.log("info","EVIDENCE_PUBLISH_SKIPPED","Replay evidence publish skipped (--no-evidence-publish)",{execution_id:T.executionId}),process.stderr.write(`info: evidence publish skipped (--no-evidence-publish)
|
|
45
|
+
`);else if(Cr&&(_||m.isFirstRun))process.stderr.write(`note: --no-evidence-publish has no effect on author/commit runs
|
|
46
|
+
`);else if(Er){let d=c.basicAuth,u=T,p=$,b=await ds({controller:new Ie(A.controllerBaseUrl,{username:d.username,accessKey:d.access_key}),tms:new et(A.tmsBaseUrl,c.resolvedCreds?.username??d.username,c.resolvedCreds?.access_key??d.access_key),testId:m.testId,sessionId:a.sessionId,executionId:u.executionId,sealedPackPath:re.pack,projectId:p});b.ok?a.log("info","EVIDENCE_INGESTED","Replay evidence uploaded and ingested",{execution_id:u.executionId,project_id:p}):(a.log("warn","EVIDENCE_PUBLISH_FAILED","Replay evidence publish failed",{execution_id:u.executionId,stage:b.stage,error:b.error}),process.stderr.write(` \u26A0 evidence publish failed (${b.stage}): ${b.error}
|
|
47
|
+
`)),t.onAgentEvent({type:"test_md_evidence_ingest",status:b.ok?"ok":"failed",evidence_id:u.executionId,...b.ok?{}:{stage:b.stage}})}await Ao(n,m,a,Y.outcomes,Y.overallStatus,ze,be,le.uploadResult,U,o,{resolvedAuth:c,tmsBaseUrl:A.tmsBaseUrl},_,Z);try{let d=ye(n);if(nn({shouldUploadPipeline:Ye,uploadSucceeded:!!le.uploadResult?.success,metaCommitId:d?.commit_id,metaTestId:d?.test_id})){let u=await Ot({sourcePath:n,testId:d.test_id,sessionId:a.sessionId,commitId:d.commit_id,controller:new Ie(A.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});u.ok?a.log("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:d.commit_id,bytes:u.bytes}):(a.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:d.commit_id,stage:u.stage,error:u.error}),process.stderr.write(` \u26A0 bundle sync failed (${u.stage}): ${u.error}
|
|
48
|
+
`)),t.onAgentEvent({type:"test_md_bundle_sync",status:u.ok?"ok":"failed",commit_id:d.commit_id,path:n,...u.ok?{bytes:u.bytes}:{stage:u.stage}})}}catch(d){a.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:d instanceof Error?d.message:String(d)})}if(Ye&&le.uploadResult?.success)for(let d of m.unitLocks)try{let u=ye(d.file);if(u?.commit_id!==a.sessionId||!u?.test_id)continue;let p=await Ot({sourcePath:d.file,testId:String(u.test_id),sessionId:a.sessionId,commitId:String(u.commit_id),controller:new Ie(A.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});p.ok?a.log("info","BUNDLE_SYNC_OK","unit bundle pushed",{commit_id:u.commit_id,path:d.file,bytes:p.bytes}):a.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync failed",{commit_id:u.commit_id,path:d.file,stage:p.stage,error:p.error}),t.onAgentEvent({type:"test_md_bundle_sync",status:p.ok?"ok":"failed",commit_id:u.commit_id,path:d.file,...p.ok?{bytes:p.bytes}:{stage:p.stage}})}catch(u){a.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync threw",{path:d.file,error:u instanceof Error?u.message:String(u)})}let Ar=ie(w),We=le.uploadResult?.testcaseId,Qe=We&&le.uploadResult?.shareId&&$?dt(Ar.testManagerUiUrl,$,We,le.uploadResult.shareId):void 0,Cs=l.unitFiles.filter(d=>d.file!==l.rootPath).map(d=>{let u=l.steps.filter(g=>g.owningFile===d.file),p=u.filter(g=>ue.has(g.flatIndex)).length,h=(d.kind==="test"?ye(d.file):null)?.commit_id===a.sessionId;return{path:d.file,kind:d.kind,replayed:u.length-p,authored:p,committed:h,...h?{commit_id:a.sessionId}:{}}}),xr={overallStatus:Y.overallStatus,durationS:be,decisions:m.decisions,outcomes:Y.outcomes,cancelled:Z,retryTriggered:se,lockHeld:_,anyAuthorStepRan:L,isFirstRun:m.isFirstRun,wantsPush:o.push===!0,uploadResult:le.uploadResult,shouldUploadArtifacts:we,shouldReplaceLocalOutput:L&&!Z,shouldCommit:(_||m.isFirstRun)&&!Z&&Y.overallStatus==="passed"&&!m.degradedReadonly,shareUrl:Qe,imports:Cs},{buildSummaryEvent:Es}=await import("./SummaryBox-4SZI4XSO.js");if(i?t.onAgentEvent(Es(xr)):await t.onSummary(xr),!i){let d=We&&$?$n(Ar.testManagerUiUrl,$,We):void 0;await t.onLinks({recordedTestPath:n,outputDir:ne(n),shareableLink:Qe,testCaseLink:d,codeExportDir:le.uploadResult?.codeExportDir})}if(ce.ownsLifecycle&&re&&kr){let{offerEvidenceView:d}=await import("./evidence-VDNZ3K23.js");await d({packPath:re.pack,env:w,isTTY:!i&&!Z&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:u=>process.stderr.write(u+`
|
|
49
|
+
`)})}return t.onAgentEvent({type:"test_md_done",overall_status:Y.overallStatus,duration_s:be,session_id:a.sessionId,...Qe?{share_url:Qe}:{}}),{overallStatus:Y.overallStatus,exitCode:Y.overallStatus==="passed"?0:1,outputDir:ne(n),durationS:be,uploadResult:le.uploadResult,anyAuthorStepRan:L,resultCode:Br(Ge),...kt.length?{pendingInvestigations:kt}:{}}}function Ro(e,t){let r={...e,...t},n=Object.keys(r).length>0?_e(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:n.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,s])=>s.secret),nonSecretEntries:Object.entries(r).filter(([,s])=>!s.secret)}}function Ae(e,t,r){let n={...e,...t??{}};if(Object.keys(n).length===0)return{raw:n,variables:{},objective:r};let s=_e(n,r);return{raw:n,variables:Zn(s.variables,s.objective),objective:s.objective}}function ko(e,t,r){let n=Ae(e,t,r).variables;return Object.keys(n).length>0?n:void 0}function ps(e,t){let r=new Set(gt),n={...e};for(let[s,o]of Object.entries(t))r.has(s)||s!=="variables"&&o!==void 0&&e[s]===void 0&&(n[s]=o);return n}function Co(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function Eo(e,t,r,n,s,o){let i=sn(t);fn(t,i);let f=Re(e),l=So(f)?JSON.parse(gs(f,"utf8")):null,c=l?.testcase_id,y=l?.test_id,w=l?.commit_id,A=r.push===!0,R=r.retry===!0||r.retryCount!==void 0,x=r.author===!0;A&&!c&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
|
|
50
|
+
`),x&&(c=void 0,y=void 0,w=void 0);let k=n.resolvedAuth.basicAuth;if(!k){let M=await n.resolvedAuth.resolver.resolve(!0);M?.username&&M?.access_key&&(k={username:M.username,access_key:M.access_key},n.resolvedAuth.basicAuth=k)}let E=!!k,a=!r.local&&E&&y!=null&&w!=null&&c!=null,z=a&&(ot(i)||A);if(A&&!a)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
51
|
+
`),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(R&&!a)return process.stderr.write(`error: --retry requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
52
|
+
`),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(x&&!E)return process.stderr.write(`error: --author requires authenticated credentials for the TMS API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
53
|
+
`),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};let m=null,_=!1,L=!1;if(z){m=s;let se=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",M=await rr({tmsBaseUrl:n.tmsBaseUrl,testId:y,fromCommitId:w,newCommitId:m,basicAuth:k,onLockConflict:se});if(M==="ok")_=!0,lt({baseUrl:xe(n.tmsBaseUrl),testId:y,auth:Pe(k),lifecycle:o});else{if(M==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};m=null,L=!0}}let ue=[],Z=z&&!_;if(!r.local&&E&&!Z){let se=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",M=await hs({resolved:t,decisions:i,tmsBaseUrl:n.tmsBaseUrl,newCommitId:m??s,basicAuth:k,mode:se,lifecycle:o});if(M.outcome==="ok")ue=M.locks;else{if(_&&y&&w&&m&&await tr(n,y,w,m),ve(),M.outcome==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:c==null,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};process.stderr.write(`[lock] imported-unit conflict \u2014 whole run degrades to readonly (no commits, no uploads)
|
|
54
|
+
`),m=null,_=!1,L=!0}}return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:m,isFirstRun:c==null,hasAuth:E,canLock:a,lockAcquired:_,unitLocks:ue,degradedReadonly:L}}async function hs(e){let t=new Set(e.resolved.steps.filter((n,s)=>e.decisions[s]?.kind==="author").map(n=>n.owningFile)),r=[];for(let n of e.resolved.unitFiles){if(n.kind!=="test"||n.file===e.resolved.rootPath||!e.allUnits&&!t.has(n.file)||e.alreadyLocked?.some(i=>i.file===n.file))continue;let s=ye(n.file);if(!s?.test_id||!s?.commit_id)continue;let o=await rr({tmsBaseUrl:e.tmsBaseUrl,testId:String(s.test_id),fromCommitId:String(s.commit_id),newCommitId:e.newCommitId,basicAuth:e.basicAuth,onLockConflict:e.mode});if(o==="ok"){r.push({file:n.file,testId:String(s.test_id),fromCommitId:String(s.commit_id)}),lt({baseUrl:xe(e.tmsBaseUrl),testId:String(s.test_id),auth:Pe(e.basicAuth),lifecycle:e.lifecycle});continue}for(let i of r)await Fe({baseUrl:xe(e.tmsBaseUrl),testId:i.testId,body:{commitId:e.newCommitId,fromCommitId:i.fromCommitId},auth:Pe(e.basicAuth)}),ve(i.testId);return{outcome:o,locks:[]}}return{outcome:"ok",locks:r}}function xe(e){return`${e}/kane-cli/v1`}function Pe(e){return{username:e.username,accessKey:e.access_key}}async function rr(e){let t=xe(e.tmsBaseUrl),r=Pe(e.basicAuth),n={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},s=await Vt(n);if(s.ok)return"ok";if(!(s.reason==="concurrent"||s.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${s.reason} (HTTP ${s.httpStatus}): ${s.message}
|
|
55
|
+
`),"abort";let i=s.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${i}; aborting (--on-lock-conflict fail)
|
|
56
|
+
`),"abort";if(e.onLockConflict==="wait"){if(s.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
|
|
57
|
+
`),"abort";for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
|
|
58
|
+
`),await new Promise(l=>setTimeout(l,3e4));let f=await Vt(n);if(f.ok)return"ok";if(f.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${f.reason} (HTTP ${f.httpStatus}): ${f.message}; aborting
|
|
59
|
+
`),"abort"}}return process.stderr.write(`[lock] ${i} \u2014 running in readonly mode (no commit)
|
|
60
|
+
`),"readonly"}async function Ao(e,t,r,n,s,o,i,f,l,c,y,w,A){let{decisions:R,testId:x,testcaseId:k,fromCommitId:E,newCommitId:a}=t;if(!(s==="passed")||A){let m=A?"cancelled":s;w&&x&&E&&a&&(process.stderr.write(`[lock] run not committed (${m}); discarding playground lock
|
|
61
|
+
`),await tr(y,x,E,a));for(let _ of t.unitLocks)await tr(y,_.testId,_.fromCommitId,a??r.sessionId);ve();return}ve()}async function tr(e,t,r,n){let s=e.resolvedAuth.basicAuth;if(!s){let i=await e.resolvedAuth.resolver.resolve(!0);i?.username&&i?.access_key&&(s={username:i.username,access_key:i.access_key},e.resolvedAuth.basicAuth=s)}if(!s)return;let o=await Fe({baseUrl:xe(e.tmsBaseUrl),testId:t,body:{commitId:n,fromCommitId:r},auth:Pe(s)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
|
|
62
|
+
`)}async function xo(e){let t=null,r=!1,n=0,s=-1,o=-1,i=0,f=async l=>{if(l&&l.status==="failed")return n>0&&e.decisions[n-1].kind==="replay"&&(t=n-1),null;for(;n<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[n]);)n++;if(n>=e.decisions.length)return null;let c=e.decisions[n],y=e.resolved.steps[n],w=n;n++;let A=e.session.nextRunIndex();s=w,o=A,i=Date.now(),e.onSpawnStart?.(A),c.kind==="author"&&e.onAnyAuthorStep(w),await e.pushStepLevelDelta(y.config.variables,y.objective);let R=c.kind==="replay"?e.buildReplayConfig(w):e.buildStepConfigAt(w,A),x=c.kind==="replay"?"md5-match":c.reason,k=y.config??{},E={};for(let[a,z]of Object.entries(k))z!=null&&a!=="variables"&&a!=="assurance"&&(E[a]=z);return{config:R,banner:{stepLabel:`Step ${w+1}/${e.decisions.length}`,objective:Co(y.objective,100)},mode:c.kind,modeReason:x,perStepOverrides:Object.keys(E).length>0?E:void 0}};return await e.host.runSteps({topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:f,onStepEnd:l=>(l.status==="failed"&&s>=0&&e.decisions[s]?.kind==="replay"&&(t=s),e.onSequencerStepEnd(l,s,o,i)),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{Tn as a,Ln as b,ut as c,bi as d,Kn as e,jn as f,Yo as g,xn as h,Pn as i,Ht as j,Dn as k,On as l,dt as m,Nn as n,$n as o,Hn as p,qn as q,Zn as r,Xn as s,es as t,zt as u,ss as v,is as w,as as x,ls as y,Zt as z,Ia as A,ds as B,er as C,Al as D,Ro as E,Ae as F,ko as G,ps as H};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as f}from"./chunk-
|
|
2
|
+
import{a as f}from"./chunk-AIMINJVP.js";import{y as t}from"./chunk-B4LLKQTK.js";import{a as x}from"./chunk-HCBYKLMW.js";import{a as r,b as n}from"./chunk-C44QQJR4.js";import{a as B}from"./chunk-6YGTRKDT.js";import{e as p}from"./chunk-UR6MHSHU.js";var c=p(B(),1);var e=p(x(),1);function v(){return[{name:"convert",label:"Converting session data",status:"pending"},{name:"zip",label:"Compressing artifacts",status:"pending"},{name:"presign",label:"Requesting upload URLs",status:"pending"},{name:"upload",label:"Uploading to KaneAI",status:"pending"},{name:"atomic_replace",label:"Replacing local output",status:"pending"},{name:"commit_lock",label:"Committing to TMS",status:"pending"},{name:"finalize",label:"Finalizing test case",status:"pending"},{name:"code_export",label:"Downloading test code",status:"pending"}]}function U(s,o,d,a){return s.map(l=>l.name===o?{...l,status:d,detail:a}:l)}function R(s){let o=s/1e3;if(o<60)return`${o.toFixed(1)}s`;let d=Math.floor(o/60),a=Math.round(o%60);return`${d}m ${a}s`}function D(s){let[o,d]=(0,c.useState)(0),a=c.default.useRef(Date.now());return(0,c.useEffect)(()=>{if(!s)return;a.current=Date.now();let l=setInterval(()=>{d(Date.now()-a.current)},100);return()=>clearInterval(l)},[s]),o}function h({steps:s,status:o,testUrl:d,error:a}){let l=D(o==="uploading");return o==="uploading"?(0,e.jsxs)(r,{flexDirection:"column",paddingX:1,paddingY:1,children:[(0,e.jsxs)(r,{children:[(0,e.jsx)(n,{color:t.orange,children:"\u2601 "}),(0,e.jsx)(n,{color:t.orange,bold:!0,children:"Saving to KaneAI"}),(0,e.jsxs)(n,{color:t.dim,children:[" ",R(l)]})]}),(0,e.jsx)(r,{flexDirection:"column",marginTop:1,children:s.filter(i=>i.status!=="skipped").map((i,S,T)=>{let b=S===T.length-1?"\u2514\u2500":"\u251C\u2500",u=i.status==="done",m=i.status==="running",g=i.status==="failed";return(0,e.jsxs)(r,{children:[(0,e.jsxs)(n,{color:t.dim,children:[" ",b," "]}),(0,e.jsx)(r,{width:3,children:m?(0,e.jsx)(f,{}):u?(0,e.jsx)(n,{color:t.green,children:"\u2713"}):g?(0,e.jsx)(n,{color:t.red,children:"\u2717"}):(0,e.jsx)(n,{color:t.muted,children:"\u25CB"})}),(0,e.jsx)(n,{color:u?t.dim:m?void 0:g?t.red:t.muted,children:i.label}),i.detail&&(0,e.jsxs)(n,{color:t.dim,children:[" ",i.detail]})]},i.name)})}),(0,e.jsx)(r,{marginTop:1,children:(0,e.jsx)(n,{color:t.muted,children:" press Ctrl+C twice to force exit"})})]}):o==="success"?(0,e.jsx)(e.Fragment,{}):(0,e.jsxs)(r,{flexDirection:"column",paddingX:1,paddingY:1,children:[(0,e.jsxs)(r,{children:[(0,e.jsx)(n,{color:t.red,children:"\u2601 "}),(0,e.jsx)(n,{color:t.red,bold:!0,children:"Save failed"})]}),a&&(0,e.jsxs)(r,{marginTop:0,children:[(0,e.jsx)(n,{color:t.dim,children:" "}),(0,e.jsx)(n,{color:t.dim,children:a})]})]})}export{v as a,U as b,h as c};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{existsSync as u}from"fs";import{dirname as f,resolve as i}from"path";import{fileURLToPath as d}from"url";var g=f(d(import.meta.url));function p(){return[i(g,".."),i(g,"../../..")]}function A(o){return{"darwin-arm64":"kane-cli-darwin-arm64","darwin-x64":"kane-cli-darwin-x64","linux-x64":"kane-cli-linux-x64","linux-arm64":"kane-cli-linux-arm64","win32-x64":"kane-cli-win-x64"}[o]??null}function h(){let o=A(`${process.platform}-${process.arch}`),n=process.platform==="win32"?"assurance-agent.exe":"assurance-agent";for(let r of p()){for(let s of o?["@testmuai","@lambdatestincprivate"]:[]){let e=i(r,"node_modules",s,o,"bin",n);if(u(e))return{cmd:e,args:[],tier:"platform"}}let a=i(r,"../assurance-agent/dist",n);if(u(a))return{cmd:a,args:[],tier:"sibling"};let t=i(r,"../assurance-agent/main.py");if(u(t)){let s=i(r,"../assurance-agent/.venv/bin/python");return{cmd:u(s)?s:"python3",args:[t],tier:"dev-python"}}}return null}function v(o,n={}){return{...process.env,...n,TESTMUAI_SOURCE:"kane-cli",TESTMUAI_SESSION_ID:o,ASSURANCE_LOG_LEVEL:process.env.ASSURANCE_LOG_LEVEL??"info"}}async function w(){if(process.env.TESTMUAI_API_KEY||process.env.TESTMUAI_BASIC_AUTH)return{};try{let{CredentialsManager:o}=await import("./credentials-
|
|
2
|
+
import{existsSync as u}from"fs";import{dirname as f,resolve as i}from"path";import{fileURLToPath as d}from"url";var g=f(d(import.meta.url));function p(){return[i(g,".."),i(g,"../../..")]}function A(o){return{"darwin-arm64":"kane-cli-darwin-arm64","darwin-x64":"kane-cli-darwin-x64","linux-x64":"kane-cli-linux-x64","linux-arm64":"kane-cli-linux-arm64","win32-x64":"kane-cli-win-x64"}[o]??null}function h(){let o=A(`${process.platform}-${process.arch}`),n=process.platform==="win32"?"assurance-agent.exe":"assurance-agent";for(let r of p()){for(let s of o?["@testmuai","@lambdatestincprivate"]:[]){let e=i(r,"node_modules",s,o,"bin",n);if(u(e))return{cmd:e,args:[],tier:"platform"}}let a=i(r,"../assurance-agent/dist",n);if(u(a))return{cmd:a,args:[],tier:"sibling"};let t=i(r,"../assurance-agent/main.py");if(u(t)){let s=i(r,"../assurance-agent/.venv/bin/python");return{cmd:u(s)?s:"python3",args:[t],tier:"dev-python"}}}return null}function v(o,n={}){return{...process.env,...n,TESTMUAI_SOURCE:"kane-cli",TESTMUAI_SESSION_ID:o,ASSURANCE_LOG_LEVEL:process.env.ASSURANCE_LOG_LEVEL??"info"}}async function w(){if(process.env.TESTMUAI_API_KEY||process.env.TESTMUAI_BASIC_AUTH)return{};try{let{CredentialsManager:o}=await import("./credentials-GXDXVMXW.js"),n=process.env.TESTMUAI_ENV==="stage"?"stage":"prod",r=new o,a=r.getActiveProfile()??"default",t={TESTMUAI_ENV:n},s=r.loadBasicAuth(a,n);if(s)return t.TESTMUAI_BASIC_AUTH=Buffer.from(`${s.username}:${s.access_key}`,"utf8").toString("base64"),t;let e=r.loadCredentials(a,n);if(e){try{let{refreshOAuthToken:l}=await import("./token-refresh-OY3WLAKD.js");await l({creds:r,profile:a,env:n,credentials:e})}catch{}let c=r.loadCredentials(a,n)??e;if(typeof c.access_token=="string"){let l=await E(n,c.access_token);return l?(t.TESTMUAI_BASIC_AUTH=l,t):(t.TESTMUAI_API_KEY=c.access_token,t)}}return{}}catch{return{}}}var _=8e3;function m(){return process.stderr.write("warn: session auth may expire during long runs \u2014 if that happens, run `kane-cli login` and retry\n"),null}async function E(o,n){if(process.env.TESTMUAI_BASE_URL)return null;try{let[{getEnvironment:r},{ControllerClient:a}]=await Promise.all([import("./config-5GOFF5F4.js"),import("./controller-client-RD2YEMAH.js")]),t=new a(r(o).controllerBaseUrl,n),s;try{let e=await Promise.race([t.getTmsCredentials().catch(()=>null),new Promise(c=>{s=setTimeout(()=>c(null),_)})]);return typeof e?.username!="string"||!e.username||typeof e.access_key!="string"||!e.access_key?m():Buffer.from(`${e.username}:${e.access_key}`,"utf8").toString("base64")}finally{clearTimeout(s)}}catch{return m()}}export{A as a,h as b,v as c,w as d};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as B}from"./chunk-S3DAAAE5.js";import{a as g}from"./chunk-
|
|
2
|
+
import{b as B}from"./chunk-S3DAAAE5.js";import{a as g}from"./chunk-J3EMJ7US.js";import{y as s}from"./chunk-B4LLKQTK.js";import{a as w}from"./chunk-HCBYKLMW.js";import{a as x,b as t,c as h,i as P,j as S}from"./chunk-C44QQJR4.js";import{a as C}from"./chunk-6YGTRKDT.js";import{e as T}from"./chunk-UR6MHSHU.js";var o=T(C(),1);var e=T(w(),1);function D({defaultName:i,onSubmit:c}){let[d,p]=(0,o.useState)("confirm"),[f,a]=(0,o.useState)(""),[m,u]=(0,o.useState)(null),l=(0,o.useMemo)(()=>f.trim()||i,[f,i]);return P((n,r)=>{if(d==="confirm"){if(n==="y"||n==="Y"){a(i),p("name");return}if(n==="n"||n==="N"||r.escape||r.ctrl&&n==="c"){c(null);return}if(r.return){c(i);return}return}if(r.return){if(!B(l)){u(`name "${l}" is invalid; allowed: letters, digits, underscore, hyphen`);return}c(l);return}if(r.escape||r.ctrl&&n==="c"){c(null);return}if(r.backspace||r.delete){a(v=>v.slice(0,-1)),u(null);return}n&&!r.ctrl&&!r.meta&&(a(v=>v+n),u(null))}),d==="confirm"?(0,e.jsx)(g,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsx)(t,{color:s.orange,children:i})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[(0,e.jsx)(t,{color:s.dim,children:"enter \u2014 save with this name"}),(0,e.jsx)(t,{color:s.dim,children:"Y \u2014 edit name"}),(0,e.jsx)(t,{color:s.dim,children:"N/esc \u2014 discard session"})]})}):(0,e.jsx)(g,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsxs)(x,{children:[(0,e.jsx)(t,{color:s.orange,children:f}),(0,e.jsx)(t,{inverse:!0,children:" "})]})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[m&&(0,e.jsx)(t,{color:s.red,children:m}),(0,e.jsx)(t,{color:s.dim,children:"enter \u2014 save \xB7 esc \u2014 discard"})]})})}function V(){return new Date().toISOString().slice(0,19).replace(/:/g,"-")}async function Y(i){return new Promise(c=>{function d(){let{exit:a}=S(),[m,u]=(0,o.useState)(!1);return(0,o.useEffect)(()=>{if(m){let l=setTimeout(()=>a(),50);return()=>clearTimeout(l)}},[m,a]),(0,e.jsx)(D,{defaultName:i,onSubmit:l=>{c(l),u(!0)}})}let{waitUntilExit:p,unmount:f}=h((0,e.jsx)(d,{}),{stdout:process.stderr,exitOnCtrlC:!1});p().then(()=>{try{f()}catch{}})})}export{D as a,V as b,Y as c};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as R}from"./chunk-
|
|
2
|
+
import{a as R}from"./chunk-4GLYNAK7.js";import{y as r}from"./chunk-B4LLKQTK.js";import{a as Y}from"./chunk-HCBYKLMW.js";import{a,b as i,i as X}from"./chunk-C44QQJR4.js";import{a as G}from"./chunk-6YGTRKDT.js";import{e as P}from"./chunk-UR6MHSHU.js";var u=P(G(),1);var e=P(Y(),1),f=5;function K(t,I){if(!I)return t;let c=I.toLowerCase();return t.filter(B=>B.label.toLowerCase().includes(c))}function J(t){let{title:I,items:c,loading:B=!1,loadingText:F,error:L=null,itemNoun:T="items",onSelect:H,onCancel:E,defaultActiveId:w,onTab:y,extraHint:N}=t,[x,d]=(0,u.useState)(0),[S,g]=(0,u.useState)(0),[s,A]=(0,u.useState)(""),[C,h]=(0,u.useState)(null);(0,u.useEffect)(()=>{if(c.length===0)return;if(t.preserveSelectionById&&C!==null){let n=c.findIndex(o=>o.id===C);if(n>=0){g(Math.floor(n/f)),d(n%f);return}}let l=w?c.findIndex(n=>n.id===w):c.findIndex(n=>n.isActive);l>=0?(g(Math.floor(l/f)),d(l%f),t.preserveSelectionById&&h(c[l].id)):t.preserveSelectionById&&(g(0),d(0),h(c[0]?.id??null))},[c,w,t.preserveSelectionById,C]),(0,u.useEffect)(()=>{if(!t.onSearch)return;let l=setTimeout(()=>t.onSearch(s),t.searchDebounceMs??250);return()=>clearTimeout(l)},[s,t.onSearch,t.searchDebounceMs]);let m=t.onSearch?c:K(c,s),M=S*f,p=Math.min(M+f,m.length),D=Math.ceil(m.length/f),O=p-M,v=m.slice(M,p);return X((l,n)=>{if(L){n.escape&&E();return}if(n.escape){s?(A(""),d(0),g(0)):E();return}if(n.tab&&y){y();return}if(n.upArrow){if(x>0){let o=x-1;d(o),t.preserveSelectionById&&h(v[o]?.id??null)}else if(S>0){let o=S-1,b=f-1;g(o),d(b),t.preserveSelectionById&&h(m[o*f+b]?.id??null)}return}if(n.downArrow){if(x<O-1){let o=x+1;d(o),t.preserveSelectionById&&h(v[o]?.id??null)}else if(S<D-1){let o=S+1,b=0;g(o),d(b),t.preserveSelectionById&&h(m[o*f+b]?.id??null)}return}if(n.return&&v[x]){H(v[x]);return}if(n.backspace||n.delete){A(o=>o.slice(0,-1)),d(0),g(0);return}l&&!n.ctrl&&!n.meta&&(A(o=>o+l),d(0),g(0))},{isActive:!B}),B?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.orange,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:r.orange,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(i,{color:r.secondary,children:F??`Loading ${T}\u2026`})})]}):L?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.red,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:r.red,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(i,{color:r.red,children:L})}),(0,e.jsx)(R,{bindings:[]})]}):(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.orange,paddingX:2,paddingY:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(i,{color:r.orange,bold:!0,children:I}),(0,e.jsxs)(i,{color:r.dim,children:[" (",m.length,!t.onSearch&&s?`/${c.length}`:""," ",T,t.loadingMore?" \xB7 loading more":"",")"]})]}),(0,e.jsxs)(a,{marginTop:1,children:[(0,e.jsx)(i,{color:r.secondary,children:s?"filter: ":""}),s?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(i,{children:s}),(0,e.jsx)(i,{inverse:!0,children:" "})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)(i,{color:r.dim,children:["Search ",T,"\u2026"]}),(0,e.jsx)(i,{inverse:!0,children:" "})]})]}),(0,e.jsx)(a,{flexDirection:"column",marginTop:1,children:t.searching?(0,e.jsxs)(i,{color:r.secondary,children:["Searching ",T,"\u2026"]}):m.length===0?(0,e.jsxs)(i,{color:r.dim,children:["No ",T,' match "',s,'"']}):v.map((l,n)=>{let o=n===x,b=o?"\u276F ":" ",$=l.isActive?r.green:o?r.orange:void 0;return(0,e.jsxs)(i,{color:$,children:[b,l.label,l.isActive?" \u25CF selected":""]},l.id)})}),!t.searching&&D>1&&(0,e.jsx)(a,{marginTop:1,children:(0,e.jsxs)(i,{color:r.dim,children:["Page ",S+1,"/",D]})}),t.footer&&(0,e.jsx)(a,{marginTop:1,flexDirection:"column",children:t.footer}),(0,e.jsx)(R,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"type",label:"to search"},{keys:"\u21B5",label:"select"},...y&&N?[{keys:"tab",label:N}]:[]],escBackLabel:s?"clear":"back to chat"})]})}export{J as a};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as $}from"./chunk-
|
|
2
|
+
import{a as $}from"./chunk-4SJC64KQ.js";import{e as D}from"./chunk-E5PWL3BG.js";import{a as E}from"./chunk-NLCCBXXV.js";function U(e){return["completed","failed","ended","stopped"].includes(e.trim().toLowerCase())}function je(e){return["ended","stopped"].includes(e.trim().toLowerCase())}function q(e){return{requestId:e.requestId,objective:e.objective,status:"",turnActive:!1,scenarios:[],thinking:"",thinkingLog:[],chatLog:[],progress:0}}function Re(e){return e.pendingClarification===void 0?e:{...e,pendingClarification:void 0}}function Ce(e){return{...e,turnActive:!0,error:void 0,thinking:"",thinkingLog:[]}}function P(e,t){switch(t.type){case"thinking":return{...e,status:"thinking",thinking:e.thinking+t.delta};case"thinking_done":return{...e,thinkingLog:[...e.thinkingLog,{text:e.thinking,tookMs:t.tookMs}],thinking:""};case"progress":return{...e,progress:t.pct};case"snapshot":return{...e,scenarios:t.data.scenarios,status:t.data.status,headline:t.data.headline??e.headline};case"chat":return{...e,turnActive:!1,chatLog:[...e.chatLog,{role:"model",text:t.text}]};case"clarification":return{...e,turnActive:!1,chatLog:[...e.chatLog,{role:"model",text:t.text}],pendingClarification:t.text};case"limit":return{...e,limits:{scenarioLimit:t.scenarioLimit,perScenarioLimit:t.perScenarioLimit}};case"error":return{...e,error:t.message};case"done":return{...e,status:t.status,turnActive:!1,error:t.status==="failed"&&!e.error?"generation failed":e.error}}}function H(e,t){let n=[],i=e.type??"",d=e.status??"";if(i==="ping")return n;switch(i){case"thinking_token":typeof e.data=="string"&&n.push({type:"thinking",delta:e.data});break;case"thinking_stopped":{let r=e.data??{},o=se(r.time_taken);n.push({type:"thinking_done",text:typeof e.data=="string"?e.data:r.message??"",tookMs:o});break}case"progress":{let r=e.data??{};typeof r.progress=="number"&&n.push({type:"progress",pct:r.progress});break}case"clarification":{let r=e.data??{};typeof r.message=="string"&&n.push({type:"clarification",text:r.message});break}case"chatting_stopped":{let r=e.data??{};typeof r.message=="string"&&r.message.length>0&&n.push({type:"chat",text:r.message});break}case"limit_update":{let r=e.data??{},o=r.test_cases_limit??e.test_cases_limit,p=r.per_scenario_test_cases_limit??e.per_scenario_test_cases_limit;n.push({type:"limit",scenarioLimit:o,perScenarioLimit:p});break}case"error":{let r=typeof e.data=="string"?e.data:e.data?.message??"generation error";n.push({type:"error",message:r});break}case"request_cancelled":return n.push({type:"done",status:"stopped"}),n;case"session_ended":return n.push({type:"done",status:"ended"}),n;default:break}if(Array.isArray(e.scenarios)&&n.push({type:"snapshot",data:{requestId:t,status:d,headline:e.headline,scenarios:e.scenarios}}),d&&U(d)){let r=d.trim().toLowerCase();n.push({type:"done",status:r})}return n}function se(e){if(!e)return;let t=/^([\d.]+)(ms|s)?$/.exec(e.trim());if(!t)return;let n=Number(t[1]);if(Number.isFinite(n))return t[2]==="ms"?Math.round(n):Math.round(n*1e3)}var v=class extends Error{constructor(t){super(t),this.name="AuthError"}},M=class extends Error{constructor(t){super(t),this.name="ForbiddenError"}},I=class extends Error{constructor(t){super(t),this.name="InsufficientCreditsError"}},k=class extends Error{constructor(n,i){super(n);this.cause=i;this.name="TransportError"}};function x(e,t){let n=t?.message??t?.error??`HTTP ${e}`;return e===401?new v(n):e===403?t?.key==="insufficient_credits"?new I(n):new M(n):new k(n)}async function*J(e){let t=e.fetchImpl??fetch,n=e.maxRetries??5,i=e.maxBackoffMs??3e4,d=e.connectTimeoutMs??1e4,r=0,o=!1;for(;;){if(e.signal.aborted)return;let p=new AbortController,a=()=>p.abort();e.signal.addEventListener("abort",a,{once:!0});let c=setTimeout(()=>p.abort(),d),g;try{g=await t(e.url,{method:"GET",headers:{Authorization:await e.authHeader(),Accept:"text/event-stream"},signal:p.signal})}catch(w){if(clearTimeout(c),e.signal.removeEventListener("abort",a),e.signal.aborted)return;if(++r>n)throw new k("SSE connect failed",w);await O(F(r,i));continue}if(clearTimeout(c),!g.ok){e.signal.removeEventListener("abort",a);let w=await oe(g);if(g.status===401&&o){if(++r>n)throw x(401,w);await O(F(r,i));continue}throw x(g.status,w)}if(!g.body)throw e.signal.removeEventListener("abort",a),new k("SSE response had no body");o=!0,r=0;let m=g.body.getReader(),h=new TextDecoder("utf-8"),b="";try{for(;;){if(e.signal.aborted){await m.cancel().catch(()=>{});return}let{done:w,value:s}=await m.read();if(w)break;b+=h.decode(s,{stream:!0});let f;for(;(f=b.indexOf(`
|
|
3
3
|
|
|
4
4
|
`))>=0;){let u=b.slice(0,f);b=b.slice(f+2);let l=ie(u);l&&(yield l)}}}catch(w){if(e.signal.aborted)return;if(++r>n)throw new k("SSE stream dropped",w);await O(F(r,i));continue}finally{e.signal.removeEventListener("abort",a)}return}}function ie(e){let t="message",n="";for(let i of e.split(`
|
|
5
5
|
`))i.startsWith("event:")?t=i.slice(6).trim():i.startsWith("data:")&&(n+=i.slice(5).trim());if(t!=="message"||!n)return null;try{let i=Buffer.from(n,"base64").toString("utf-8");return JSON.parse(i)}catch{return null}}function F(e,t){return Math.min(t,1e3*2**(e-1))}function O(e){return new Promise(t=>setTimeout(t,e))}async function oe(e){try{return await e.clone().json()}catch{return}}function W(e,t){t?.length&&(e.append("files",t.map(n=>n.fileKey).join(",")),e.append("gemini_metadata",JSON.stringify(t.map(n=>({fileData:{fileUri:n.geminiUri,mimeType:n.mimeType}})))))}function Ue(e,t={}){let n=t.fetchImpl??fetch,i=new Map,d=!0;async function r(){let s=await e.authResolver.resolve();if(!s)throw new v("unauthorized; run `kane-cli login`");return E(s.username,s.access_key)}function o(s){return`${e.baseUrl}${s}`}async function p(s){if(!s.ok){let f;try{f=await s.clone().json()}catch{f=void 0}throw x(s.status,f)}return s.json()}function a(s){let f=s?.data??s;return{request_id:f.request_id??f.id,status:f.status??""}}function c(s,f,u,l){let y=q({requestId:s,objective:f});l&&(y=P(y,{type:"snapshot",data:l}),l.status==="cleaned_up"&&(y={...y,error:"session was reaped (cleaned_up) \u2014 continuing will destructively regenerate"}));let S=new AbortController;u&&(u.aborted?S.abort():u.addEventListener("abort",()=>S.abort(),{once:!0})),i.set(s,S);let A={requestId:s,state:y,events:void 0};return A.events=(async function*(){try{let C=J({url:o(`/requests/${s}/sse`),authHeader:r,signal:S.signal,log:e.log,fetchImpl:n});for await(let L of C)for(let z of H(L,s))A.state=P(A.state,z),yield z}finally{i.delete(s)}})(),A}async function g(s,f){let u=new FormData;u.append("prompt",s.prompt),d=s.memoryEnhancement??!0,u.append("memory_enhancement",String(d)),s.scenarioLimit!==void 0&&u.append("test_scenario_limit",String(s.scenarioLimit)),s.perScenarioLimit!==void 0&&u.append("per_scenario_test_cases_limit",String(s.perScenarioLimit));let l=s.projectId??e.projectId,y=s.folderId??e.folderId;l&&u.append("project_id",l),y&&u.append("folder_id",y),W(u,s.attachments);let S=await n(o("/requests"),{method:"POST",headers:{Authorization:await r()},body:u}),A=await p(S),{request_id:C}=a(A),L=String(C);return c(L,s.prompt,f)}async function m(s,f){let u=await n(o(`/requests/${s}`),{method:"GET",headers:{Authorization:await r()}}),l=await p(u),y=l?.data??l,S={requestId:s,status:y.status??"",headline:y.headline,scenarios:Array.isArray(y.scenarios)?y.scenarios:[]};return c(s,"",f,S)}async function h(s,f,u){let l=new FormData;l.append("prompt",f),l.append("chat_enabled","true"),l.append("memory_enhancement",String(d)),u?.mappings&&l.append("mappings",JSON.stringify(u.mappings)),W(l,u?.attachments);let y=await n(o(`/requests/${s}`),{method:"PUT",headers:{Authorization:await r()},body:l});if(!y.ok){let S;try{S=await y.clone().json()}catch{}throw x(y.status,S)}}async function b(s){i.get(s)?.abort();let u=await n(o(`/requests/${s}/stop`),{method:"DELETE",headers:{Authorization:await r()}});if(!u.ok&&u.status!==404){let l;try{l=await u.clone().json()}catch{}throw x(u.status,l)}}async function w(s){i.get(s)?.abort();let u=await n(o(`/requests/${s}/end`),{method:"DELETE",headers:{Authorization:await r()}});if(!u.ok&&u.status!==404){let l;try{l=await u.clone().json()}catch{}throw x(u.status,l)}}return{start:g,attach:m,chat:h,cancel:b,end:w}}import{statSync as ae,realpathSync as G,existsSync as ce}from"fs";import{extname as ue,resolve as j,isAbsolute as pe}from"path";import{homedir as V}from"os";var de=new Set([".txt",".md",".json",".xml",".jpg",".jpeg",".png",".gif",".bmp",".webp",".pdf",".docx",".csv",".xlsx",".mp3",".wav",".m4a",".webm",".mpeg",".mpga",".mp4",".mov"]),le=50*1024*1024,X=10;function fe(e){return e==="~"?V():e.startsWith("~/")?j(V(),e.slice(2)):e}function Ge(e,t){let n=[],i=[],d=new Set,r=[],o=(()=>{try{return G(j(t))}catch{return j(t)}})(),p=o.endsWith("/")?o:o+"/";for(let a of e){let c=fe(a),g=pe(c)?c:j(t,c);if(!ce(g)){n.push(`Not found: ${a}`);continue}let m;try{m=G(g)}catch{n.push(`Cannot resolve: ${a}`);continue}if(d.has(m))continue;let h;try{h=ae(m)}catch{n.push(`Cannot read: ${a}`);continue}if(!h.isFile()){n.push(`Not a file: ${a}`);continue}if(h.size===0){n.push(`Empty file: ${a}`);continue}let b=ue(m).toLowerCase();if(!de.has(b)){n.push(`Unsupported type ${b||"(none)"}: ${a}`);continue}if(h.size>le){n.push(`Too large (>50MB): ${a}`);continue}m!==o&&!m.startsWith(p)&&i.push(`Outside working dir: ${a}`),d.add(m),r.push(m)}return r.length>X&&n.push(`Too many files: ${r.length} (max ${X})`),{ok:n.length?[]:r,errors:n,warnings:i}}var B=class extends Error{constructor(n){super(n.join("; "));this.errors=n;this.name="AttachmentValidationError"}};async function Xe(e){let{promptText:t,filePaths:n,cwd:i,scenarios:d,isRefine:r,conn:o,deps:p}=e,{ok:a,errors:c,warnings:g}=p.validate(n,i);if(c.length)throw new B(c);e.onValidated?.();let m=a.length?await p.upload(o,a,p.onUpload):[],h=r?p.buildMappings(t,d):void 0;return{promptText:t,mappings:h,attachments:m,warnings:g}}import{readFile as me}from"fs/promises";import{basename as K}from"path";async function ge(e){let t=await e.authResolver.resolve();if(!t)throw new v("unauthorized; run `kane-cli login`");return E(t.username,t.access_key)}async function he(e,t,n={}){let i=n.fetchImpl??fetch,d=await me(t),r=K(t),o=new FormData;o.append("file",new Blob([d]),r),o.append("source","omniBox"),o.append("geminiFileUpload","true");let p=await i(`${e.tmsBaseUrl}/v1/attachment`,{method:"POST",headers:{Authorization:await ge(e)},body:o,signal:n.signal});if(!p.ok){let h;try{h=await p.clone().json()}catch{}throw x(p.status,h)}let a=await p.json(),c=a?.data??a,g=c?.gemini_response?.uri,m=c?.gemini_response?.mimeType;if(!c?.file_key||!g){let h=c&&typeof c=="object"?Object.keys(c).join(","):typeof c,b=(()=>{try{return JSON.stringify(c).slice(0,500)}catch{return"<unserializable>"}})();throw new Error(`attachment upload for ${r} returned no file_key/gemini uri \u2014 status ${p.status}, body keys: [${h}], raw: ${b}`)}return{fileName:c.file_name??r,fileKey:c.file_key,geminiUri:g,mimeType:m??"application/octet-stream"}}async function tt(e,t,n,i={}){let d=[];for(let r=0;r<t.length;r++){if(i.signal?.aborted)throw Object.assign(new Error("upload aborted"),{name:"AbortError"});let o=K(t[r]);n?.({file:o,index:r+1,total:t.length,status:"uploading"});try{d.push(await he(e,t[r],i)),n?.({file:o,index:r+1,total:t.length,status:"done"})}catch(p){throw n?.({file:o,index:r+1,total:t.length,status:"failed"}),p}}return d}var ye=/@([sS])(\d+)\.([cC])(\d+)/g,be=/@([sS])(\d+)(?!\d)(?!\.[cC]\d)/g;function rt(e,t){let n={},i={};for(let d of e.matchAll(ye)){let r=Number(d[2]),o=Number(d[4]),p=t[r-1];if(!p)continue;n[`s${r}`]=String(p.id);let a=p.test_cases??[];if(a[o-1])for(let c=0;c<o;c++){let g=a[c];g&&(i[`s${r}.c${c+1}`]=String(g.id))}}for(let d of e.matchAll(be)){let r=Number(d[2]),o=t[r-1];o&&(n[`s${r}`]=String(o.id))}if(!(Object.keys(n).length===0&&Object.keys(i).length===0))return{scenario:n,testcase:i}}function R(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(n==null||typeof n!="object")return[];let i=n;if(typeof i.step!="string")return[];let d=typeof i.expected_result=="string"?i.expected_result:typeof i.outcome=="string"?i.outcome:"";t.push({step:i.step,expected:d})}return t}var we=30,Se=300;function Z(){return{mode:"testing",max_steps:we,timeout:Se,variables:{}}}function Q(e){return e.title??`Test case ${e.id}`}function ct(e,t){return $({frontmatter:Z(),heading:Q(t),steps:e.sub_objectives.map(n=>n.objective)})}function Y(e){let t=R(e.manual_steps).map(n=>n.step);return $({frontmatter:Z(),heading:Q(e),steps:t})}import{mkdtempSync as xe,mkdirSync as N,writeFileSync as ee,rmSync as te,renameSync as _e,existsSync as ne,readFileSync as ve}from"fs";import{join as _,resolve as ke}from"path";async function ft(e,t,n,i=Y){(n.redirectBareCwd??!0)&&ke(t)===process.cwd()&&(t=_(t,".testmuai","tests"));let d=T(e.objective)??e.headline,r=T(n.suiteName)??`${T(re(d,4))??"tcg"}-${e.requestId}`,o=r,p=_(t,r);ne(p)&&!Te(p,e.requestId)&&(o=`${r}-${e.requestId}`);let a=_(t,o),c=[],g=new Map;for(let h of e.scenarios){let b=(h.test_cases??[]).filter(Ae);if(b.length===0)continue;let w=T(Ee(h.scode))??T(h.sid)??`s${h.id}`,s=g.get(w)??new Set;g.set(w,s);for(let f of b){let u=T(re(f.title,5))??"case",l=`${u}_test.md`;for(let y=2;s.has(l);y++)l=`${u}-${y}_test.md`;s.add(l),c.push({dir:w,file:l,tc:f})}}if(c.length===0)return{suiteDir:a,paths:[],warning:"no functional test cases generated"};N(t,{recursive:!0});let m=xe(_(t,".tcg-tmp-"));try{N(_(m,"helpers"),{recursive:!0}),ee(_(m,".tcg-suite.json"),JSON.stringify({requestId:e.requestId,suiteName:o}));let h=[],b=new Set;for(let s of c){let f=_(m,s.dir);b.has(f)||(N(f,{recursive:!0}),b.add(f));let u=_(f,s.file);ee(u,i(s.tc)),h.push(u)}ne(a)&&te(a,{recursive:!0,force:!0}),_e(m,a);let w=h.map(s=>s.replace(m,a));return{suiteDir:a,paths:w}}catch(h){try{te(m,{recursive:!0,force:!0})}catch{}throw h}}function Ae(e){return(e.category??"").trim().toLowerCase()==="functional"}function Te(e,t){try{return JSON.parse(ve(_(e,".tcg-suite.json"),"utf-8"))?.requestId===t}catch{return!1}}function T(e){return e&&e.length>0?e:void 0}function re(e,t){return e?e.toLowerCase().replace(/[^a-z0-9]+/g," ").trim().split(/\s+/).filter(Boolean).slice(0,t).join("-"):""}function Ee(e){return e?e.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,""):""}function ht(e){let t=[];e.title&&t.push(e.title),e.description&&t.push("",e.description);let n=R(e.manual_steps);return n.length>0&&(t.push("","Steps:"),n.forEach((i,d)=>{t.push(`${d+1}. ${i.step}`)})),t.join(`
|
|
6
|
-
`).trim()}function wt(e){return{mode:"bifurcate",objective:e.objective,model:e.model,session_id:e.sessionId,run_index:0,width:0,height:0,
|
|
6
|
+
`).trim()}function wt(e){return{mode:"bifurcate",objective:e.objective,model:e.model,session_id:e.sessionId,run_index:0,width:0,height:0,variables:e.variables,...e.auth}}async function St(e,t,n){let i=D(e,t),d=()=>i.cancel();n?.addEventListener("abort",d);let r=null,o=null;try{for await(let p of i.events)if(p.type==="bifurcation_result"){let a=p,c=(a.sub_objectives??[]).map((g,m)=>({...g,sequence_index:m}));r={sub_objectives:c,extracted_variables:a.extracted_variables??{},total_flows:c.length,is_single_flow:c.length<=1,credits_consumed:a.credits_consumed??0}}else p.type==="error"&&(o=p.message??"bifurcation error")}finally{n?.removeEventListener("abort",d),i.cancel()}if(r)return r;throw new Error(o??"bifurcation produced no result")}export{U as a,je as b,q as c,Re as d,Ce as e,P as f,v as g,Ue as h,R as i,ct as j,Y as k,ft as l,Ae as m,ht as n,wt as o,St as p,de as q,Ge as r,B as s,Xe as t,tt as u,rt as v};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{d as s,k as l}from"./chunk-
|
|
2
|
+
import{d as s,k as l}from"./chunk-B4LLKQTK.js";import{readFileSync as g,writeFileSync as o,mkdirSync as i,existsSync as p}from"fs";import{dirname as a}from"path";var n={window_size:{width:1920,height:1080},chrome_profile_path:"",default_url:l,model:"v16-alpha",project_id:null,project_name:null,folder_id:null,folder_name:null,mode:"testing",assertion_mode:"dom",network_ws:!1,network_sse:!1,bug_detection:"off",final_validation:!1,code_export:{enabled:!0,language:"python",skip_validation:!0},generate:{scenario_limit:2,per_scenario_limit:3,memory_enabled:!1},last_seen_version:"",hints_enabled:!0},c=class{constructor(r=s){this.path=r}exists(){return p(this.path)}load(){try{let r=g(this.path,"utf-8"),e=JSON.parse(r);return{...n,...e,code_export:{...n.code_export,...e.code_export??{}},generate:{...n.generate,...e.generate??{}}}}catch{return{...n,code_export:{...n.code_export},generate:{...n.generate}}}}set(r,e){try{let t=this.load();t[r]=e,i(a(this.path),{recursive:!0}),o(this.path,JSON.stringify(t,null,2)+`
|
|
3
3
|
`)}catch(t){let d=t instanceof Error?t.message:String(t);process.stderr.write(`[config] Failed to save config: ${d}
|
|
4
4
|
`)}}save(r){try{let t={...this.load(),...r};i(a(this.path),{recursive:!0}),o(this.path,JSON.stringify(t,null,2)+`
|
|
5
5
|
`)}catch(e){let t=e instanceof Error?e.message:String(e);process.stderr.write(`[config] Failed to save config: ${t}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{d as Qe,g as qe}from"./chunk-FCMLIK7P.js";import{b as w,c as Q,d as Ge,f as q,g as ee}from"./chunk-CJJXT5DO.js";import{a as Ke,e as P,f as j,g as We,h as H,i as D,j as Je}from"./chunk-ZPDM6FO7.js";import{a as G}from"./chunk-BC7UVJJB.js";import{d as et}from"./chunk-NVGBE2DR.js";import{a as F,b as L,d as Ye}from"./chunk-EHN5HTUD.js";import{a as R,b as y}from"./chunk-L5LI2JF4.js";import{a as b}from"./chunk-7E24OCGX.js";import{b as Y}from"./chunk-FRBYGSGJ.js";import{a as Ze}from"./chunk-6HYW5RFX.js";import{c as z,e as U}from"./chunk-J2KSZUOO.js";import{d as te,f as Xe}from"./chunk-5YPBPZUR.js";import{a as Ue}from"./chunk-
|
|
2
|
+
import{d as Qe,g as qe}from"./chunk-FCMLIK7P.js";import{b as w,c as Q,d as Ge,f as q,g as ee}from"./chunk-CJJXT5DO.js";import{a as Ke,e as P,f as j,g as We,h as H,i as D,j as Je}from"./chunk-ZPDM6FO7.js";import{a as G}from"./chunk-BC7UVJJB.js";import{d as et}from"./chunk-NVGBE2DR.js";import{a as F,b as L,d as Ye}from"./chunk-EHN5HTUD.js";import{a as R,b as y}from"./chunk-L5LI2JF4.js";import{a as b}from"./chunk-7E24OCGX.js";import{b as Y}from"./chunk-FRBYGSGJ.js";import{a as Ze}from"./chunk-6HYW5RFX.js";import{c as z,e as U}from"./chunk-J2KSZUOO.js";import{d as te,f as Xe}from"./chunk-5YPBPZUR.js";import{a as Ue}from"./chunk-A2IQRVPR.js";import{a as ze}from"./chunk-B4LLKQTK.js";function $(t){if(t===null)return"broken";let e=Math.floor(t/100);return e===1?"passed":e===7?"failed":e===2?"skipped":"broken"}var C={failed:3,broken:2,passed:1,skipped:0};function re(t){let e="skipped";for(let r of t)C[r]>C[e]&&(e=r);return e}import{createHash as Dt}from"crypto";import{basename as Ot}from"path";function ne(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40);return e.length>0?e:"session"}function ie(t){return Dt("sha256").update(t).digest("hex").slice(0,8)}function oe(t){let e=Ot(t).replace(/_test\.md$/i,"").replace(/\.md$/i,"");return`${ne(e)}-${ie(t)}`}function se(t,e){return`${ne(t)}-${ie(e)}`}function ae(t){let e={};for(let[r,n]of Object.entries(t))typeof n=="string"&&n.length>0&&(e[r]=n);return e}var At={darwin:"macOS",linux:"Linux",win32:"Windows"};function ce(t){return At[t]??t}function de(t,e){let r={},n=(i,o)=>{o!==void 0&&o!==""&&(r[i]=o)};return n("model",e.model),n("os",t.os),n("browser",t.browser),n("browser_version",t.browser_version),n("resolution",t.resolution),n("platform",e.platform),n("platform_type",e.platform_type),n("run_kind",e.run_kind),n("os_version",t.os_version),t.device!==void 0&&t.device!==""?r.device=t.device:e.platform_type&&e.platform_type!=="web"&&(r.device=null),r}function Ft(t,e){return{pack_test_dir:t,ordinal_offset:e}}import{promises as _}from"fs";import{join as I}from"path";function ue(t){let e={evidence:"0.1",run_id:t.execution_id,status:"running",title:t.title,started:t.started,environment:{producer:{name:"kane-cli",version:t.producerVersion},...t.surfaces?{surfaces:t.surfaces}:{},run_kind:t.run_kind,origin:t.origin,pid:t.pid},...t.credits!==void 0?{metrics:{credits:{value:t.credits,type:"count"}}}:{}};return y(e,{lineWidth:-1})}async function le(t,e,r,n=process.cwd(),i){let o=i??w(t.execution_id,n),a=I(o,"tests",e);return await _.mkdir(I(o,"coverage"),{recursive:!0}),await _.writeFile(I(o,"coverage",".keep"),""),await _.mkdir(a,{recursive:!0}),await _.writeFile(I(o,"run.yaml"),ue(t)),r&&await _.writeFile(I(a,r.path),r.content),o}async function Lt(t,e=process.cwd()){let r=w(t.execution_id,e);await _.mkdir(I(r,"coverage"),{recursive:!0}),await _.writeFile(I(r,"coverage",".keep"),"");let n=R(ue(t));return n.environment&&delete n.environment.run_kind,await _.writeFile(I(r,"run.yaml"),y(n,{lineWidth:-1})),r}async function jt(t,e=process.cwd()){return L(w(t,e),new Date().toISOString())}async function pe(t,e=process.cwd()){await _.rm(w(t,e),{recursive:!0,force:!0})}import{promises as fe}from"fs";import{join as me}from"path";function ge(t){let e={evidence:"0.1",test:t.testId,status:t.status,...t.durationMs!==void 0?{duration_ms:t.durationMs}:{},...t.definitionPath?{definition:{path:t.definitionPath}}:{},...t.definitionId?{definition_id:t.definitionId}:{},...t.assuranceId?{assurance_id:t.assuranceId}:{},...Object.keys(t.externalId).length?{external_id:t.externalId}:{},...t.tags&&t.tags.length?{tags:t.tags}:{},...Object.keys(t.environment).length?{environment:t.environment}:{},steps:t.steps};return y(e,{lineWidth:-1})}function ve(t){return y({logs:t},{lineWidth:-1})}async function he(t,e,r){await fe.writeFile(me(t,"tests",e,"result.yaml"),r)}async function we(t,e,r){let n=me(t,"tests",e,"logs");await fe.mkdir(n,{recursive:!0}),await fe.writeFile(me(n,"meta.yaml"),r)}import{promises as K}from"fs";import{join as tt}from"path";function rt(t){return tt(t,".internal","meta.json")}async function nt(t){let e;try{e=await K.readFile(rt(t),"utf8")}catch(n){if(n?.code==="ENOENT")return null;throw n}let r=JSON.parse(e);if(!r||typeof r!="object"||Array.isArray(r))throw new Error("meta.json is not a JSON object");return r}async function ye(t,e){let r;try{r=await nt(t)??{}}catch(a){console.warn(`evidence: meta.json at ${t} unreadable \u2014 skipping execution-pointer append to preserve identity`,a);return}let n=Array.isArray(r.executions)?r.executions:[];n.push(e),r.executions=n,await K.mkdir(tt(t,".internal"),{recursive:!0});let i=rt(t),o=`${i}.tmp-${process.pid}-${Date.now()}`;await K.writeFile(o,JSON.stringify(r,null,2)+`
|
|
3
3
|
`),await K.rename(o,i)}async function Tt(t){try{let e=await nt(t);return e&&Array.isArray(e.executions)?e.executions:[]}catch{return[]}}async function Nt(t,e,r=process.cwd()){let n=await q(t,r);if(!n){let o=`evidence: no pack found for "${t}"`;return e.json?console.log(JSON.stringify({valid:!1,error:"not_found",target:t})):console.error(o),2}let i=await F(n,e.profile??"L1");return e.json?console.log(JSON.stringify({valid:i.valid,status:i.status,diagnostics:i.diagnostics})):console.log(`evidence: ${i.valid?"valid":"INVALID"} (${e.profile??"L1"}, status ${i.status})`),i.valid?0:1}function _e(t){let e=[];for(let r of t){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)e.push($(i))}return re(e)}function Vt(t){let e=null;for(let r of t){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)i!=null&&(e==null||C[$(i)]>C[$(e)]||C[$(i)]===C[$(e)]&&i>e)&&(e=i)}return e}import{promises as Mt}from"fs";import{extname as it,basename as Bt}from"path";var Ht={".ndjson":"ndjson",".log":"log",".json":"json",".har":"har"};async function xe(t){let e;try{e=await Mt.readdir(t)}catch{return[]}return e.filter(r=>r!=="meta.yaml").sort().map(r=>({name:Bt(r,it(r)),file:r,format:Ht[it(r)]??"txt"}))}import{mkdirSync as zt,appendFileSync as Ut}from"fs";import{join as ot}from"path";function ke(t,e){return ot(t,"tests",e,"logs")}function be(t,e,r,n={},i){try{i?.(e,r,r,n)}catch{}if(t)try{zt(t,{recursive:!0});let o=JSON.stringify({ts:new Date().toISOString(),level:e,event:r,...n})+`
|
|
4
4
|
`;Ut(ot(t,"diagnostics.ndjson"),o)}catch{}}import{promises as E}from"fs";import{join as O}from"path";async function Yt(t){try{let e=O(t,"tests"),r=await E.readdir(e).catch(()=>[]);for(let n of r){let i=O(e,n,"steps"),o=await E.readdir(i).catch(()=>[]);for(let a of o){let s=await E.readFile(O(i,a,"failure.yaml"),"utf8").catch(()=>null);if(s!=null)try{let c=R(s);if(c&&typeof c=="object"&&c.triage)return!0}catch{}}}}catch{}return!1}async function st(t,e,r){let n=O(t,"tests",e,"logs");if(r)try{await E.mkdir(n,{recursive:!0}),await E.copyFile(r,O(n,"tui.log"))}catch{}let i=await xe(n);i.length&&await we(t,e,ve(i))}async function Ie(t){let e=t.cwd??process.cwd(),r=t.packDir??w(t.executionId,e);if(!t.saved&&!t.packDir)return await pe(t.executionId,e),{sealed:!1};await st(r,t.testId,t.tuiLogPath);let n=O(r,"run.yaml"),i=R(await E.readFile(n,"utf8"));i.environment={...i.environment??{},saved:t.saved,run_kind:t.runKind},await E.writeFile(n,y(i,{lineWidth:-1}));let o=await E.open(n,"r+");try{await o.sync()}finally{await o.close()}let a=await Yt(r);await L(r,new Date().toISOString());let s;try{let d=await F(r,"L1");s=d.valid;let p=(d.diagnostics??[]).filter(u=>String(u?.code??"").includes("failure.status_disagrees"));if(p.length>0)if(t.expectStatusDisagrees||a){let u=t.expectStatusDisagrees?"expected under --bug-detection continue":"self-explained by triaged failure record(s)";console.warn(`evidence: ${p.length} status_disagrees advisory(ies) \u2014 ${u}`)}else console.warn(`evidence: ${p.length} status_disagrees advisory(ies) \u2014 step verdicts disagree with their failure records`,p);if(!d.valid){console.warn(`evidence: sealed pack ${t.executionId} failed L1 validation`,d.diagnostics);let u=String(d.diagnostics?.[0]?.code??"");be(ke(r,t.testId),"warn","EVIDENCE_INVALID",{execution_id:t.executionId,first_code:u,surface:t.surface??"testmd"},t.log)}}catch(d){console.warn(`evidence: validation error for ${t.executionId}`,d)}let c;if(t.saved&&t.packDir)try{c=await Ge(r,t.executionId,e)}catch(d){console.warn(`evidence: store install failed for ${t.executionId}`,d)}if(t.outputStemDir)try{await ye(t.outputStemDir,{execution_id:t.executionId,run_kind:t.runKind,status:t.verdict,valid:s,at:new Date().toISOString()})}catch(d){console.warn(`evidence: execution-pointer append failed for ${t.executionId} (pack is sealed)`,d)}return{sealed:!0,valid:s,storePath:c}}import{release as at}from"os";import{execFileSync as Gt}from"child_process";var ct=!1,W;function Kt(){if(!ct)if(ct=!0,process.platform==="darwin")try{W=Gt("sw_vers",["-productVersion"],{timeout:2e3}).toString().trim()||void 0}catch{W=at()||void 0}else W=at()||void 0;return W}function Ee(t){let e={os:ce(process.platform)},r=Kt();if(r&&(e.os_version=r),t.cdpBrowser){let n=/^([A-Za-z]+)\/(\d+)/.exec(t.cdpBrowser);n&&(e.browser=n[1].replace(/^Headless/,""),e.browser_version=n[2])}return t.resolution&&(e.resolution=t.resolution),e}async function dt(t){if(t)try{let e=await fetch(`${t}/json/version`,{signal:AbortSignal.timeout(2e3)});if(!e.ok)return;let r=await e.json();return typeof r.Browser=="string"?r.Browser:void 0}catch{return}}function Wt(t){let e;return()=>(e||(e=dt(t)),e)}import{promises as Se,existsSync as Re,readFileSync as Qt}from"fs";import{basename as qt,join as S}from"path";import{readFileSync as Jt}from"fs";import{dirname as Xt,resolve as Zt}from"path";function ut(t,e){let r=Zt(t),n=Jt(r,"utf8");return P(e?j(n,H(Xt(r),e)):n)}var T=class t{constructor(e){this.opts=e}executionId;testId;definitionPath=null;definitionContent=null;accumulatedSteps=[];maxOrdinal=0;_packDirOverride;_attached=!1;get attached(){return this._attached}static async attach(e){let r=qt(e.packDir).replace(/\.evidence$/,""),n=new t({origin:"testrun",runKind:"author",pid:process.pid,title:e.testId,started:new Date().toISOString(),producerVersion:ze,cwd:e.cwd});n.executionId=r,n.testId=e.testId,n._packDirOverride=e.packDir,n._attached=!0;let i=S(e.packDir,"tests",e.testId);return await Se.mkdir(i,{recursive:!0}),e.definition&&(await Se.writeFile(S(i,e.definition.path),e.definition.content),n.definitionPath=e.definition.path,n.definitionContent=e.definition.content),n}async start(){if(this._attached)throw new Error("attach-mode session is already started");this.executionId=Q(),this.testId=this.opts.testmdRelPath?oe(this.opts.testmdRelPath):se(this.opts.objectiveOrName??"session",this.opts.sessionId??this.executionId);let e=this.opts.definition??null;return await le({execution_id:this.executionId,title:this.opts.title,started:this.opts.started,producerVersion:this.opts.producerVersion,surfaces:this.opts.surfaces,run_kind:this.opts.runKind,origin:this.opts.origin,pid:this.opts.pid,...this.opts.credits!==void 0?{credits:this.opts.credits}:{}},this.testId,e,this.opts.cwd,this.opts.packRootDir?this.pack:void 0),e&&(this.definitionPath=e.path,this.definitionContent=e.content),{executionId:this.executionId,testId:this.testId,packTestDir:this.packTestDir}}get pack(){return this._packDirOverride?this._packDirOverride:this.opts.packRootDir?S(this.opts.packRootDir,`${this.executionId}.evidence`):w(this.executionId,this.opts.cwd)}get packTestDir(){return S(this.pack,"tests",this.testId)}async writeDefinition(e,r="test.md"){await Se.writeFile(S(this.packTestDir,r),e),this.definitionPath=r,this.definitionContent=e}computeAssuranceId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let e=S(this.opts.cwd,this.opts.testmdRelPath);if(Re(e))return D(Qt(e,"utf8"))?.id}}catch{}}computeDefinitionId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let e=S(this.opts.cwd,this.opts.testmdRelPath),r=S(this.opts.cwd,".context"),n=Re(r)?b(r):void 0;if(Re(e))return ut(e,n)}if(this.definitionContent!=null)return P(this.definitionContent)}catch{}}noteSpawn(e){this.accumulatedSteps.push(...e.steps),this.maxOrdinal=Math.max(this.maxOrdinal,e.maxOrdinal)}nextOrdinalOffset(){return this.maxOrdinal}get steps(){return this.accumulatedSteps}async writeResult(e){let r=_e(e.spawns),n=this.pack;await he(n,this.testId,ge({testId:this.testId,status:r,durationMs:e.durationMs,definitionPath:this.definitionPath,definitionId:this.computeDefinitionId(),assuranceId:this.computeAssuranceId(),externalId:ae(e.externalIdInput),environment:de(e.runnerEnv,e.intentEnv),steps:e.steps,tags:e.tags}));let i=e.externalIdInput;return e.log&&(i.commit_id||i.test_id||i.testcase_id)&&e.log("info","EVIDENCE_EXTERNAL_ID","Evidence external-id mapping",{execution_id:this.executionId,commit_id:i.commit_id??null,test_id:i.test_id??null,testcase_id:i.testcase_id??null,project_id:i.project_id??null,session_id:i.session_id??null,session_name:i.session_name??null}),r}get id(){return this.executionId}get test(){return this.testId}};async function er(t,e,r=ee){try{let n=await r(t);if(n.aborted.length>0||n.removed.length>0)try{e?.("info","EVIDENCE_RECOVERY","Startup evidence recovery swept incomplete packs",{aborted:n.aborted,removed:n.removed,origin:"startup"})}catch{}return n}catch(n){return console.warn("evidence: startup recovery failed",n),{aborted:[],removed:[]}}}import{promises as _r}from"fs";import{existsSync as $e,mkdirSync as fr,readdirSync as mr,readFileSync as gr,rmSync as vr,statSync as hr,writeFileSync as wr}from"fs";import{join as A}from"path";import{mkdirSync as tr,renameSync as rr,rmSync as nr,writeFileSync as ir}from"fs";import{join as lt}from"path";var or=5e6;function pt(t,e,r){let n=lt(t,"coverage","sources"),i=new Map,o=!1;try{for(let a of r.usecases)for(let s of a.sources){if(i.has(s.id)){s.file=i.get(s.id);continue}if(!s.cid)continue;let c=et(e,s.cid);if(c===null||c.byteLength>or)continue;o||(tr(n,{recursive:!0}),o=!0);let d=lt(n,s.id),l=`${d}.tmp-${process.pid}`;ir(l,c),rr(l,d);let p=`coverage/sources/${s.id}`;i.set(s.id,p),s.file=p}}catch{for(let a of r.usecases)for(let s of a.sources)delete s.file;if(o)try{nr(n,{recursive:!0,force:!0})}catch{}}}import{existsSync as Ce,readFileSync as N,renameSync as cr,writeFileSync as dr}from"fs";import{dirname as ht,isAbsolute as wt,resolve as yt}from"path";var sr=new Set(["inline","testmd","testrun"]),ar=new Set(["inferred","authored","runtime-derived"]),Pe=new Set(["passed","failed","broken","skipped"]);function ft(t,e,r){let n=[];if(r.facts.length===0)return{record:null,errors:[{code:"EMPTY_EXECUTIONS",detail:"a run with no designed units attaches no facts \u2014 skip the call"}]};let i=z(t);if(e.latestHash!==i)return{record:null,errors:[{code:"STALE_BASIS",detail:`graph opened at ${String(e.latestHash)} but chain head is ${String(i)} \u2014 re-open and retry`}]};let o=[];for(let s of r.facts){let c=`executions[${s.ref}]`,d=e.resolve(s.ref),l=d?e.tipOf(d.cid):null;if(!d||!l||e.superseded.has(l)){n.push({code:"UNKNOWN_REF",detail:`${c}: '${s.ref}' is not a live committed node`});continue}if(e.nodeLabel.get(l)!==te.TEST){n.push({code:"ILLEGAL_TARGET",detail:`${c}: execution facts attach to tests \u2014 '${s.ref}' is a ${e.nodeLabel.get(l)}`});continue}if(!sr.has(s.mode)){n.push({code:"BAD_MODE",detail:`${c}: mode '${s.mode}' not in inline|testmd|testrun`});continue}if(!Pe.has(s.verdict)){n.push({code:"BAD_VERDICT",detail:`${c}: verdict '${s.verdict}' not in ${[...Pe].join("|")}`});continue}if(!ar.has(s.oracle_mode)){n.push({code:"BAD_ORACLE_MODE",detail:`${c}: oracle_mode '${s.oracle_mode}' not in inferred|authored|runtime-derived`});continue}if(typeof s.drift_flag!="boolean"||typeof s.stale_at_run!="boolean"){n.push({code:"MISSING_FIELD",detail:`${c}: drift_flag and stale_at_run are required booleans`});continue}if(!s.execution_id||!s.started_at||!s.definition_id_at_run){n.push({code:"MISSING_FIELD",detail:`${c}: execution_id, started_at and definition_id_at_run are required`});continue}let p=[];for(let u of s.per_ac??[]){let m=e.resolve(u.ac_ref),f=m?e.tipOf(m.cid):null;if(!m||!f||e.superseded.has(f)||e.nodeLabel.get(f)!==te.AC){n.push({code:"UNKNOWN_REF",detail:`${c}.per_ac: '${u.ac_ref}' is not a live AC`});continue}if(!Pe.has(u.verdict)){n.push({code:"BAD_VERDICT",detail:`${c}.per_ac['${u.ac_ref}']: verdict '${u.verdict}'`});continue}p.push({ac_ref:e.nameOf.get(f)??f,verdict:u.verdict})}o.push({about:l,definition_id_at_run:s.definition_id_at_run,verdict:s.verdict,...p.length?{per_ac:p}:{},drift_flag:s.drift_flag,oracle_mode:s.oracle_mode,stale_at_run:s.stale_at_run,...s.unresolved_acs?.length?{unresolved_acs:s.unresolved_acs}:{},execution_id:s.execution_id,...s.evidence_id?{evidence_id:s.evidence_id}:{},...s.duration_ms!==void 0?{duration_ms:s.duration_ms}:{},started_at:s.started_at,mode:s.mode,local:s.local,...s.via_parent?{via_parent:s.via_parent}:{}})}if(n.length>0)return{record:null,errors:n};let a=U(t,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[],executions:o,source_head_moves:{}});return Y(t),{record:a.record,errors:null}}function _t(t){let e={failed:3,broken:2,skipped:1,passed:0},r=new Map;for(let n of t)for(let i of n.verifies??[]){let o=r.get(i);(o===void 0||(e[n.status]??0)>(e[o]??0))&&r.set(i,n.status)}return[...r.entries()].map(([n,i])=>({ref:n,verdict:i}))}function xt(t){let e=[],r=G(t.cwd);if(!Ce(r))return{synced:0,superseded:0,skipped:"no-context",warnings:e};let n=t.by??{kind:"ai",id:"exec-sync"},i=b(r),o=[],a=0,s=new Set;for(let d of t.members){let l=wt(d.path)?d.path:yt(t.cwd,d.path);for(let p of ur(l)){if(s.has(p.path))continue;s.add(p.path);let u=p.path===l?void 0:D(N(l,"utf8"))?.id,m=N(p.path,"utf8"),f=D(m);if(!f?.id)continue;let g=i.resolve(f.id),x=g?i.tipOf(g.cid):null;if(!g||!x||i.superseded.has(x)){e.push(`sync: ${f.id} does not resolve to a live test \u2014 skipped (foreign store?)`);continue}let k=P(j(m,H(ht(p.path),i))),v=String(i.getNode(x)?.content.test_md_blob??""),M=P(j(v,We(i))),B=!1,Z=x;if(k===M)f.base!==M&&vt(p.path,m,M,e);else if(f.base===M){let h=lr(r,i,x,m,k,n);h.error?(e.push(`sync: could not supersede ${f.id}: ${h.error}`),B=!0):(a++,Z=h.newCid,B=h.oracleTier,vt(p.path,N(p.path,"utf8"),k,e),i=b(r))}else B=!0,e.push(f.base?`sync: ${f.id} was edited from an older version \u2014 graph kept; reconcile via a redesign or maintain`:`sync: ${f.id} carries no base pin (hand-copied file?) \u2014 fact attached with drift flag`);let Ve=i.getNode(Z)?.content.check,Me=p.path===l?d.acs??[]:[],Be=Me.filter(h=>mt(i,h.ref)),He=Me.filter(h=>!mt(i,h.ref)).map(h=>h.ref);o.push({ref:f.id,definition_id_at_run:k,verdict:d.verdict,...Be.length?{per_ac:Be.map(h=>({ac_ref:h.ref,verdict:h.verdict}))}:{},drift_flag:B,oracle_mode:Ve?.expected_mode??(Ke(Ve?.operand)?"runtime-derived":"inferred"),stale_at_run:i.stale(Z)!=="fresh",...He.length?{unresolved_acs:He}:{},execution_id:d.executionId,...d.evidenceId?{evidence_id:d.evidenceId}:{},...d.durationMs!==void 0?{duration_ms:d.durationMs}:{},started_at:d.startedAt,mode:d.mode,local:d.local,...u?{via_parent:u}:{}})}}if(o.length===0)return{synced:0,superseded:a,warnings:e};let c=ft(r,b(r),{facts:o,by:n});return c.errors?(e.push(...c.errors.map(d=>`sync facts: ${d.code}: ${d.detail}`)),{synced:0,superseded:a,warnings:e}):{synced:o.length,superseded:a,warnings:e}}function ur(t){let e=[],r=new Set,n=i=>{if(r.has(i)||!Ce(i))return;r.add(i);let o=N(i,"utf8");for(let a of o.split(`
|
|
5
5
|
`)){let s=/^@import\s+(\S+)\s*$/.exec(a.trim());if(!s)continue;let c=wt(s[1])?s[1]:yt(ht(i),s[1]);Ce(c)&&D(N(c,"utf8"))?.id&&n(c)}e.push({path:i})};return n(t),e}function mt(t,e){let r=t.resolve(e),n=r?t.tipOf(r.cid):null;return!!(r&&n&&!t.superseded.has(n)&&t.nodeLabel.get(n)==="ac")}function lr(t,e,r,n,i,o){let a=e.getNode(r);if(!a)return{oracleTier:!1,error:"tip unreadable"};let s=Je(n),c=String(a.content.test_md_blob??""),d=/^#\s+(.+?)\s*$/m.exec(s)?.[1]??String(a.content.title??""),l={...a.content,test_md_blob:s,definitionId:i,title:d},p=Xe("test",l);if(p.length>0)return{oracleTier:!1,error:p.map(g=>g.detail).join("; ")};let u=Ze("test",l);if(u===r)return{newCid:r,oracleTier:!1};let m=gt(c)!==gt(s),f=z(t);if(e.latestHash!==f)return{oracleTier:m,error:`store advanced under the sync (basis ${String(e.latestHash)} vs head ${String(f)}) \u2014 re-run to retry`};try{U(t,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:u,label:"test",content:l}],edges:[],review:[{id:u,kind:"review-item",resolution:"edited",edit:null,reason:"edited on disk (run sync)",by:o}],supersessions:[{kind:"node",old:r,new:u,reason:"edited on disk (run sync)",by:o}],source_head_moves:{}},{expectPrev:f})}catch(g){return{oracleTier:m,error:g instanceof Error?g.message:String(g)}}return Y(t),{newCid:u,oracleTier:m}}var pr=/\s@verifies\s+(ac-[\w.:\/-]+(?:\s*,\s*ac-[\w.:\/-]+)*)\s*$/;function gt(t){let e=[],r=t.split(`
|
|
@@ -8,6 +8,6 @@ import{d as Qe,g as qe}from"./chunk-FCMLIK7P.js";import{b as w,c as Q,d as Ge,f
|
|
|
8
8
|
`),o=-1;if(i[0]?.trim()==="---"){for(let c=1;c<i.length;c++)if(i[c].trim()==="---"){o=c;break}}if(o<0)return;let a=!1;for(let c=1;c<o;c++){if(/^\s+base:\s*sha256:[0-9a-f]+\s*$/.test(i[c])){i[c]=i[c].replace(/sha256:[0-9a-f]+/,r),a=!0;break}if(/^assurance:\s*$/.test(i[c])&&!i.slice(c,Math.min(c+3,o)).some(d=>/^\s+base:/.test(d))){i.splice(c+2,0,` base: ${r}`),a=!0;break}}if(!a)return;let s=`${t}.tmp-sync`;dr(s,i.join(`
|
|
9
9
|
`)),cr(s,t)}catch(i){n.push(`sync: pin refresh failed for ${t} (${i instanceof Error?i.message:String(i)}) \u2014 next run self-heals`)}}var yr={passed:"passed",failed:"failed",broken:"blocked",skipped:"not-run"},kt=(t,e)=>{try{if(!$e(e))return{status:"skipped",reason:"no context store at the project root"};let r=A(t,"tests");if(!$e(r))return{status:"skipped",reason:"pack has no tests/"};let n=new Map;for(let s of mr(r)){let c=A(r,s,"result.yaml");if(!$e(c)||!hr(A(r,s)).isDirectory())continue;let d=R(gr(c,"utf8"));if(!d?.definition_id&&!d?.assurance_id)continue;let l=_t(d.steps??[]),p={testShortId:String(d.test??s),execution:yr[String(d.status)]??"not-run",...l.length?{acs:l}:{}};d.assurance_id&&n.set(`id:${d.assurance_id}`,p),d.definition_id&&n.set(`def:${d.definition_id}`,p)}let i=qe(b(e),n,{scope:"run"}),o=Qe(i);pt(t,e,i);let a=y({...i,rollup:o},{lineWidth:-1});return fr(A(t,"coverage"),{recursive:!0}),wr(A(t,"coverage","usecases.yaml"),a),{status:"written"}}catch(r){try{vr(A(t,"coverage","sources"),{recursive:!0,force:!0})}catch{}return{status:"skipped",reason:r instanceof Error?r.message:String(r)}}};async function xr(t){try{let e=new T({origin:"inline",runKind:"author",pid:t.pid,title:t.title,started:new Date().toISOString(),producerVersion:t.producerVersion,surfaces:t.surfaces,objectiveOrName:t.objectiveOrName,sessionId:t.sessionId,cwd:t.cwd,packRootDir:t.packRootDir}),r=await e.start();return{session:e,...r,packDir:e.pack,spawns:[],startedAtMs:Date.now(),cwd:t.cwd}}catch(e){return console.warn("evidence: inline pack creation failed",e),null}}function kr(t,e,r){if(!t)return;t.session.noteSpawn(e),e.resolution&&(t.resolution=e.resolution);let n=(r?.per_flow_metadata??[]).map(i=>({resultCode:i?.result_code!=null?Number(i.result_code):null}));t.spawns.push({resultCode:r?.result_code!=null?Number(r.result_code):null,...n.length?{perFlow:n}:{}})}function br(t){if(t)return{packTestDir:t.packTestDir,ordinalOffset:t.session.nextOrdinalOffset()}}async function Ir(t,e){if(!t)return null;if(t.finalized)return t.finalized;let r=(n,i,o)=>e.log?e.log("warn",n,i,o):console.warn(`evidence: ${i}`,o??"");try{if(e.recordedTestPath)try{await t.session.writeDefinition(await _r.readFile(e.recordedTestPath,"utf8"))}catch(a){r("EVIDENCE_DEFINITION_FAILED","could not attach synthesized test.md",{error:String(a)})}let n=e.cdpBrowserCapture?await e.cdpBrowserCapture():void 0,i=await t.session.writeResult({steps:t.session.steps,spawns:t.spawns.length?t.spawns:[{resultCode:null}],externalIdInput:{...e.externalIdInput,execution_id:t.executionId},runnerEnv:Ee({cdpBrowser:n,resolution:t.resolution}),intentEnv:{model:e.model,platform:"Desktop",platform_type:"web"},durationMs:e.durationMs??Date.now()-t.startedAtMs,log:e.log});try{if(e.recordedTestPath){let a=xt({cwd:e.cwd??t.cwd??process.cwd(),members:[{path:e.recordedTestPath,verdict:i,executionId:t.executionId,startedAt:new Date(t.startedAtMs).toISOString(),mode:"inline",local:e.local??!1}]});for(let s of a.warnings)r("EXEC_SYNC",s)}}catch(a){r("EXEC_SYNC","exec-sync failed",{error:String(a)})}try{let a=(e.coverageWriter??kt)(t.packDir,G(e.cwd??t.cwd??process.cwd()));a.status==="skipped"&&r("EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${a.reason}`)}catch(a){r("EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(a)})}let o=await Ie({executionId:t.executionId,testId:t.testId,saved:e.saved,runKind:"author",verdict:i,cwd:e.cwd??t.cwd,packDir:t.packDir,tuiLogPath:e.tuiLogPath,log:e.log,surface:"inline"});return t.finalized=o,e.log?.("info","EVIDENCE_SEALED","Inline pack sealed",{execution_id:t.executionId,verdict:i,valid:o.valid,pack:t.packDir,store_copy:o.storePath??null}),o}catch(n){return r("EVIDENCE_SEAL_FAILED","inline pack finalize failed",{error:String(n)}),null}}import{statSync as $r,openSync as Dr,readSync as Or,closeSync as Ar}from"fs";import{basename as Fr,resolve as Lr}from"path";import{createServer as Er}from"http";import{createReadStream as Sr,promises as Rr}from"fs";import{randomBytes as Pr}from"crypto";var J="127.0.0.1";function bt(t,e){if(!t)return null;let r=/^bytes=(\d*)-(\d*)$/.exec(t.trim());if(!r)return null;let[,n,i]=r;if(n===""&&i==="")return null;if(n===""){let s=Number(i);return s===0||e===0?"unsatisfiable":{start:Math.max(0,e-s),end:e-1}}let o=Number(n);if(o>=e)return"unsatisfiable";let a=i===""?e-1:Math.min(Number(i),e-1);return a<o?null:{start:o,end:a}}async function De(t){let e=Pr(16).toString("hex"),r=Er((i,o)=>{Cr(i,o,t,e).catch(()=>o.destroy())});await new Promise((i,o)=>{r.once("error",o),r.listen(t.port??0,J,()=>{r.removeListener("error",o),i()})});let n=r.address().port;return{port:n,urlFor:i=>`http://${J}:${n}/${e}/${encodeURIComponent(i)}`,close:()=>new Promise(i=>{r.close(()=>i()),r.closeAllConnections()})}}async function Cr(t,e,r,n){let i=t.url??"/",o=v=>{try{r.log?.("warn","EVIDENCE_SERVE_DENIED",{reason:v,path:i})}catch{}};if(t.headers.host!==`${J}:${t.socket.localPort}`){o("host_mismatch"),e.writeHead(403).end();return}let a=t.headers.origin;if(a!==void 0&&!r.allowedOrigins.includes(a)){o("origin_denied"),e.writeHead(403).end();return}let s=a?{"Access-Control-Allow-Origin":a,Vary:"Origin","Access-Control-Expose-Headers":"Content-Range, Content-Length"}:{};if(t.method==="OPTIONS"){let v={...s,"Access-Control-Allow-Methods":"GET, HEAD, OPTIONS","Access-Control-Allow-Headers":"range","Access-Control-Max-Age":"86400"};t.headers["access-control-request-private-network"]==="true"&&(v["Access-Control-Allow-Private-Network"]="true"),e.writeHead(204,v).end();return}if(t.method!=="GET"&&t.method!=="HEAD"){e.writeHead(405,s).end();return}let c;try{let v=new URL(t.url??"/",`http://${J}`).pathname.split("/");if(v.length!==3||v[1]!==n){o("bad_token"),e.writeHead(404,s).end();return}c=decodeURIComponent(v[2])}catch{o("not_found"),e.writeHead(404,s).end();return}let d=r.packs.get(c);if(!d){o("not_found"),e.writeHead(404,s).end();return}let l;try{let v=await Rr.stat(d);if(!v.isFile())throw new Error("not a file");l=v.size}catch{o("not_found"),e.writeHead(404,s).end();return}let p={...s,"Accept-Ranges":"bytes","Content-Type":"application/zip","Cache-Control":"no-store"};if(t.method==="HEAD"){e.writeHead(200,{...p,"Content-Length":String(l)}).end();return}let u=bt(t.headers.range,l);if(u==="unsatisfiable"){o("unsatisfiable"),e.writeHead(416,{...s,"Content-Range":`bytes */${l}`}).end();return}let[m,f,g]=u===null?[0,l-1,200]:[u.start,u.end,206],x={...p,"Content-Length":String(f-m+1)};if(g===206&&(x["Content-Range"]=`bytes ${m}-${f}/${l}`),e.writeHead(g,x),l===0){e.end();return}let k=Sr(d,{start:m,end:f});k.on("error",()=>e.destroy()),e.on("close",()=>k.destroy()),k.pipe(e)}function V(t,e){return(e??Ue(t).evidenceViewerUrl).replace(/\/+$/,"")}function Oe(t,e){return`${e}/?pack=${encodeURIComponent(t)}`}function Ae(t){return`evidence: view locally with \`kane-cli evidence serve ${t}\``}async function jr(t,e,r={}){let n=r.out??(l=>process.stdout.write(l+`
|
|
10
10
|
`)),i=l=>(n(`error: ${l}`),2);if(e.env!=="prod"&&e.env!=="stage")return i(`invalid --env: ${String(e.env)}`);if(e.port!==void 0&&(!Number.isInteger(e.port)||e.port<1||e.port>65535))return i("invalid --port: expected an integer 1-65535");let o;try{o=V(e.env,e.viewerUrl),new URL(o)}catch{return i(`invalid --viewer-url: ${e.viewerUrl}`)}if(t.length===0)return i("no pack paths given");let a=new Map;for(let l of t){let p=Lr(l),u;try{u=$r(p)}catch{return i(`${l}: not found`)}if(u.isDirectory())return i(`${l}: is a directory \u2014 packs must be sealed .evidence files (run the execution to completion, or seal it, first)`);if(!u.isFile())return i(`${l}: not a regular file`);let m=Buffer.alloc(2),f=Dr(p,"r");try{Or(f,m,0,2,0)}finally{Ar(f)}if(m.toString("latin1")!=="PK")return i(`${l}: not a sealed evidence pack (zip magic missing)`);let g=Fr(p);if(a.has(g))return i(`duplicate pack basename: ${g} (URL names collide \u2014 rename one)`);a.set(g,p)}let s=r.log??((l,p,u)=>process.stderr.write(`warn: ${p} reason=${u.reason} path=${u.path}
|
|
11
|
-
`)),c;try{c=await De({packs:a,allowedOrigins:[new URL(o).origin],port:e.port,log:s})}catch(l){return i(`could not bind 127.0.0.1${e.port?`:${e.port}`:""} \u2014 ${l.message}`)}n(`serving ${a.size} pack${a.size===1?"":"s"} on http://127.0.0.1:${c.port}`);for(let l of a.keys()){let p=c.urlFor(l);n(l),n(` pack ${p}`),n(` viewer ${Oe(p,o)}`)}return n("press Ctrl-C to stop"),await(r.hold??Tr)(),await c.close(),0}function Tr(){return new Promise(t=>{let e=process.listeners("SIGINT");process.removeAllListeners("SIGINT"),process.once("SIGINT",()=>{for(let r of e)process.on("SIGINT",r);t()})})}import{promises as X}from"fs";import{tmpdir as Br}from"os";import{join as St,resolve as Le}from"path";var Nr=["error","prefer_first","prefer_latest","discard"],Vr=["external_id.commit_id","external_id.test_id"];function It(t){let e=t.replace(/-/g,"_");return Nr.includes(e)?e:null}function Et(t){let e=t==="discard"?{on_collision:"discard"}:{on_collision:"error",identity:{keys:[...Vr],on_same:t??"nest",on_different:t?"error":"split"}};return y({packs:{require_status:"finalized",require_valid:"L1",on_ineligible:"abort"},tests:e,rules:[{file:"run.yaml",key:"run_id",must:"different",on_violation:"skip"},{file:"result.yaml",key:"external_id.project_id",must:"same",on_violation:"error"},{file:"result.yaml",key:"external_id.org_id",must:"same",on_violation:"error"}]},{lineWidth:-1})}async function Fe(t){try{if(!t.isTTY){t.log(Ae(t.packPath));return}let e=V(t.env);await(t.renderPrompt??Mr)(t.packPath,e)}catch(e){try{t.log(`evidence view failed \u2014 ${e.message}`)}catch{}}}async function Mr(t,e){let r=await import("./react-QWOAB3TB.js"),{render:n}=await import("./build-JIKYOZUH.js"),{EvidenceViewOffer:i}=await import("./EvidenceViewOffer-
|
|
11
|
+
`)),c;try{c=await De({packs:a,allowedOrigins:[new URL(o).origin],port:e.port,log:s})}catch(l){return i(`could not bind 127.0.0.1${e.port?`:${e.port}`:""} \u2014 ${l.message}`)}n(`serving ${a.size} pack${a.size===1?"":"s"} on http://127.0.0.1:${c.port}`);for(let l of a.keys()){let p=c.urlFor(l);n(l),n(` pack ${p}`),n(` viewer ${Oe(p,o)}`)}return n("press Ctrl-C to stop"),await(r.hold??Tr)(),await c.close(),0}function Tr(){return new Promise(t=>{let e=process.listeners("SIGINT");process.removeAllListeners("SIGINT"),process.once("SIGINT",()=>{for(let r of e)process.on("SIGINT",r);t()})})}import{promises as X}from"fs";import{tmpdir as Br}from"os";import{join as St,resolve as Le}from"path";var Nr=["error","prefer_first","prefer_latest","discard"],Vr=["external_id.commit_id","external_id.test_id"];function It(t){let e=t.replace(/-/g,"_");return Nr.includes(e)?e:null}function Et(t){let e=t==="discard"?{on_collision:"discard"}:{on_collision:"error",identity:{keys:[...Vr],on_same:t??"nest",on_different:t?"error":"split"}};return y({packs:{require_status:"finalized",require_valid:"L1",on_ineligible:"abort"},tests:e,rules:[{file:"run.yaml",key:"run_id",must:"different",on_violation:"skip"},{file:"result.yaml",key:"external_id.project_id",must:"same",on_violation:"error"},{file:"result.yaml",key:"external_id.org_id",must:"same",on_violation:"error"}]},{lineWidth:-1})}async function Fe(t){try{if(!t.isTTY){t.log(Ae(t.packPath));return}let e=V(t.env);await(t.renderPrompt??Mr)(t.packPath,e)}catch(e){try{t.log(`evidence view failed \u2014 ${e.message}`)}catch{}}}async function Mr(t,e){let r=await import("./react-QWOAB3TB.js"),{render:n}=await import("./build-JIKYOZUH.js"),{EvidenceViewOffer:i}=await import("./EvidenceViewOffer-EOKJE2B6.js");await new Promise(o=>{let a=n(r.default.createElement(i,{packPath:t,viewerBase:e,onDone:()=>{a.unmount(),o()}}),{stdout:process.stderr,exitOnCtrlC:!1})})}async function Hr(t,e,r=process.cwd(),n={}){let i=n.out??(u=>process.stdout.write(u+`
|
|
12
12
|
`)),o=n.err??(u=>process.stderr.write(u+`
|
|
13
13
|
`)),a=u=>(o(`evidence merge: ${u}`),2);if(!e.runId)return a("--run-id is required (merged identity is the caller's fact)");if(e.rules&&e.onCollision)return a("--rules and --on-collision are mutually exclusive");let s;if(e.onCollision!==void 0){let u=It(e.onCollision);if(!u)return a(`invalid --on-collision: ${e.onCollision} (expected error | prefer-first | prefer-latest | discard)`);s=u}let c=[];for(let u of t){let m=await zr(u,r);if(!m)return a(`no pack found for "${u}"`);c.push(m)}let d=e.out?Le(r,e.out):w(e.runId,r),l=null,p;e.rules?p=Le(r,e.rules):(l=await X.mkdtemp(St(Br(),"kane-merge-rules-")),p=St(l,"merge-rules.yaml"),await X.writeFile(p,Et(s)));try{let u=await(n.mergeFn??Ye)(c,{runId:e.runId,out:d,rulesPath:p,title:e.title,finalize:e.finalize});return e.json?i(JSON.stringify(u)):Ur(i,u),u.output.finalized&&!e.json&&await(n.offer??Fe)({packPath:d,env:e.env,isTTY:n.isTTY??(!!process.stdin.isTTY&&!!process.stderr.isTTY),log:o}),0}catch(u){let m=u instanceof Error?u.message:String(u);return u?.code==="ABORT"?(o(`evidence merge: aborted \u2014 ${m}`),1):a(m)}finally{l&&await X.rm(l,{recursive:!0,force:!0}).catch(()=>{})}}async function zr(t,e){let r=Le(e,t);if(await Rt(r))return r;let n=w(t,e);return await Rt(n)?n:null}async function Rt(t){try{return await X.stat(t),!0}catch{return!1}}function Ur(t,e){let{packs:r,tests:n,output:i}=e;t(`evidence: merged ${n.merged} tests from ${r.eligible.length} packs -> ${i.path} (${i.finalized?"sealed":"live"})`);for(let o of r.skipped)t(` skipped ${o.runId}: ${o.rule} \u2014 ${o.reason}`);for(let o of n.collisions){let a;o.action==="nest"?a=`nested into ${o.folder}, latest ${o.winner}`:o.action==="split"?a=`split into ${o.folder}`:a=`winner ${o.winner}`,t(` collision ${o.test}: ${a} (${o.rule})`)}for(let o of n.discarded)t(` discarded ${o}`)}import{copyFileSync as Yr,existsSync as je,mkdirSync as Gr}from"fs";import{join as Pt}from"path";function Kr(t,e,r){try{let n=Pt(t,"auteur","execution.json");if(je(n))return!0;for(let i of e)if(!(!i||!je(i)))return Gr(Pt(t,"auteur"),{recursive:!0}),Yr(i,n),!0}catch(n){try{r?.("debug","EVIDENCE_BLOB_COPY_FAILED","auteur execution blob copy failed",{operation:"ensureAuteurExecution",source:e.find(i=>i&&je(i))??null,error:n instanceof Error?n.message:String(n)})}catch{}}return!1}import{readFileSync as Wr}from"fs";import{join as Jr}from"path";function Ne(t){let e=[],r=!0,n=o=>{if(o===null||typeof o!="object")return;let a=o;if(Array.isArray(a.operations))for(let s of a.operations){let c=s?.operation_id;typeof c=="string"&&c&&e.push(c)}if(Array.isArray(a.children)){a.content_type!=="generative_block"&&(r=!1);for(let s of a.children)n(s)}if(Array.isArray(a.branches)){r=!1;for(let s of a.branches){let c=s?.children;if(Array.isArray(c))for(let d of c)n(d)}}},i=t?.instructions;if(Array.isArray(i))for(let o of i)n(o);return{ids:e,linear:r}}function Xr(t){return Ne(t).ids}function Te(t,e){let r=new Set(e.map(s=>s.action_id).filter(Boolean)),n=-1;for(let s of r){let c=t.indexOf(s);c>n&&(n=c)}let i=e.reduce((s,c)=>Math.max(s,c.ordinal),0),o=new Set,a=[];for(let s of t.slice(n+1))r.has(s)||o.has(s)||(o.add(s),a.push({id:s,ordinal:++i,status:"skipped",action_id:s}));return a}function Ct(t,e){let r=new Set(e),n=t.filter(o=>o.action_id);if(n.some(o=>r.has(o.action_id))||n.length>e.length)return null;let i=0;return t.map(o=>o.action_id?{...o,action_id:e[i++]}:o)}function Zr(t,e){if(t.length>e.length)return!1;for(let r=0;r<t.length;r++)if(e[r]!==t[r].action_id)return!1;return!0}function Qr(t,e,r,n=!0){if(e.length===0)return{steps:t,tail:[]};let i=(r&&n?Ct(t,e):null)??t,o=i.filter(s=>s.action_id),a=new Set(e);return o.length>0&&o.every(s=>a.has(s.action_id))?{steps:i,tail:Te(e,i)}:o.length>0&&!Zr(o,e)?{steps:i,tail:[],unjoined:!0}:{steps:i,tail:Te(e,i)}}function $t(t){try{let e=Wr(Jr(t,"auteur","execution.json"),"utf8");return Ne(JSON.parse(e))}catch{return{ids:[],linear:!0}}}function qr(t){return $t(t).ids}export{$ as a,re as b,ne as c,ie as d,oe as e,se as f,ae as g,ce as h,de as i,Ft as j,ue as k,le as l,Lt as m,jt as n,pe as o,ge as p,ve as q,he as r,we as s,ye as t,Tt as u,Nt as v,_e as w,Vt as x,xe as y,ke as z,be as A,st as B,Ie as C,Ee as D,dt as E,Wt as F,T as G,er as H,_t as I,xt as J,kt as K,xr as L,kr as M,br as N,Ir as O,bt as P,De as Q,V as R,Oe as S,Ae as T,jr as U,Fe as V,Hr as W,Kr as X,Ne as Y,Xr as Z,Te as _,Ct as $,Qr as aa,$t as ba,qr as ca};
|