@testmuai/kane-cli 0.6.9 → 0.6.10
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-PLXUGRBV.js +8 -0
- package/dist/{ChromeProfilePicker-FSZB4SZR.js → ChromeProfilePicker-IDKFTIHW.js} +1 -1
- package/dist/{CliFeedbackPrompt-WNMDCIHZ.js → CliFeedbackPrompt-SZOU5FGZ.js} +1 -1
- package/dist/{CliUploadProgress-H4265KXU.js → CliUploadProgress-W2FC33Q4.js} +1 -1
- package/dist/{ConfigView-XCUZ44SP.js → ConfigView-JB2NSZ2N.js} +1 -1
- package/dist/EvidenceViewOffer-5YST67KY.js +2 -0
- package/dist/{FolderPicker-S2XVCPYN.js → FolderPicker-SPNZESAR.js} +1 -1
- package/dist/{HelpView-OPKRGNNM.js → HelpView-XBDXXHFB.js} +1 -1
- package/dist/{InfoBox-TW2PGJK5.js → InfoBox-2T7GYSFT.js} +1 -1
- package/dist/{LinksBox-66M7XP5Y.js → LinksBox-2NNZZDQT.js} +1 -1
- package/dist/{ProfilesView-T2CFQPR5.js → ProfilesView-KJZVGU5B.js} +1 -1
- package/dist/{ProjectPicker-7ALN52CY.js → ProjectPicker-AUTZNEPE.js} +1 -1
- package/dist/{SaveSessionPrompt-HM3F6QML.js → SaveSessionPrompt-LHLSJQSQ.js} +1 -1
- package/dist/SingleShotApp-Z2HGSZXG.js +2 -0
- package/dist/{SummaryBox-BQZEGOIV.js → SummaryBox-5G7WULUN.js} +1 -1
- package/dist/TestMdRunView-B4IZHRDT.js +2 -0
- package/dist/{WhoamiView-722MBPSG.js → WhoamiView-XNWBDMQR.js} +1 -1
- package/dist/bind-FEOGBJ2O.js +6 -0
- package/dist/bootstrap-T6DSUI34.js +2 -0
- package/dist/{bridge-V4FF5QPK.js → bridge-WMGH3O3B.js} +1 -1
- package/dist/{changelog-KMYZW5MI.js → changelog-AGFDNTTW.js} +1 -1
- package/dist/{chat-committer-MWZ4JQMM.js → chat-committer-4ENYH3RC.js} +1 -1
- package/dist/{chat-controller-YX5A7R52.js → chat-controller-M4QYRH7Y.js} +1 -1
- package/dist/chunk-26H3PDVN.js +4 -0
- package/dist/{chunk-MXLXKHW4.js → chunk-2H3XNXL3.js} +1 -1
- package/dist/chunk-2KS2YRIS.js +2 -0
- package/dist/{chunk-4BAL4OGF.js → chunk-2OQLMW3F.js} +1 -1
- package/dist/chunk-2XMJ6YAE.js +2 -0
- package/dist/{chunk-NIKA2V6B.js → chunk-3KN2UW37.js} +1 -1
- package/dist/{chunk-CLYG26XV.js → chunk-4OSW2WEN.js} +35 -35
- package/dist/chunk-5EOX4MEY.js +2 -0
- package/dist/{chunk-U5QTE3WX.js → chunk-5F7PU5AJ.js} +1 -1
- package/dist/{chunk-T2ULEJK7.js → chunk-5LTUYXMP.js} +2 -2
- package/dist/{chunk-T4WZWKIU.js → chunk-5Z7GAIPP.js} +2 -2
- package/dist/{chunk-ZA4GR5R7.js → chunk-6CGNLFSN.js} +1 -1
- package/dist/{chunk-FVM7TWKT.js → chunk-6JTEWZ75.js} +1 -1
- package/dist/{chunk-QZNUTCSD.js → chunk-6MTVGARW.js} +1 -1
- package/dist/{chunk-3YI4QRXF.js → chunk-6NWPK2MS.js} +1 -1
- package/dist/{chunk-4FH2KFRT.js → chunk-6ZJ7ZFEX.js} +1 -1
- package/dist/{chunk-345PY4SZ.js → chunk-76I6NJBX.js} +1 -1
- package/dist/{chunk-R65HNFRB.js → chunk-7APDXIKI.js} +1 -1
- package/dist/{chunk-TFVMSEIA.js → chunk-7C6G4V43.js} +1 -1
- package/dist/{chunk-QB4IOM3X.js → chunk-7LWXIRI3.js} +1 -1
- package/dist/{chunk-L3HG5ONB.js → chunk-A46NBRAP.js} +1 -1
- package/dist/{chunk-JHAGEBKE.js → chunk-AYDUHTPA.js} +1 -1
- package/dist/chunk-BKM2LWU2.js +3 -0
- package/dist/{chunk-OAEZKYYQ.js → chunk-C3OGWCII.js} +2 -2
- package/dist/{chunk-LMMOR7CR.js → chunk-DHF3VO2R.js} +1 -1
- package/dist/{chunk-IWBPV3VS.js → chunk-ECFOND7B.js} +1 -1
- package/dist/chunk-EV3EHXEI.js +4 -0
- package/dist/{chunk-OV2W7KBC.js → chunk-FEF75YKV.js} +1 -1
- package/dist/chunk-FHKDTM5L.js +6 -0
- package/dist/{chunk-LRA3V5GY.js → chunk-FYDBD7Q4.js} +1 -1
- package/dist/{chunk-TACPTX64.js → chunk-GWJ76BLF.js} +2 -2
- package/dist/chunk-J44RN3FB.js +2 -0
- package/dist/{chunk-GNNMHYWE.js → chunk-J4WS2SXT.js} +1 -1
- package/dist/chunk-JHHMXU76.js +2 -0
- package/dist/chunk-JHPZXF77.js +14 -0
- package/dist/chunk-JTCW76YG.js +12 -0
- package/dist/{chunk-K5JGCJ2K.js → chunk-K7USHLVZ.js} +4 -4
- package/dist/{chunk-EASTDHNW.js → chunk-KA7Q5IIC.js} +1 -1
- package/dist/chunk-KFUZYEHX.js +2 -0
- package/dist/chunk-KK7DYHK6.js +347 -0
- package/dist/{chunk-GBYH35H5.js → chunk-LPBAQQ7E.js} +1 -1
- package/dist/{chunk-AU7WQ2O5.js → chunk-MJF3USZF.js} +1 -1
- package/dist/{chunk-FFHBQK5N.js → chunk-MSK7AC4E.js} +2 -2
- package/dist/{chunk-O4HWPV67.js → chunk-OESHJ4J2.js} +2 -2
- package/dist/chunk-OIYGGEUL.js +6 -0
- package/dist/chunk-Q2F5QB2W.js +2 -0
- package/dist/{chunk-EWLLPUP4.js → chunk-QGBLC4ZJ.js} +1 -1
- package/dist/chunk-QPT4ERGK.js +47 -0
- package/dist/{chunk-QZJID3OZ.js → chunk-RH4GCEFX.js} +1 -1
- package/dist/{chunk-U6TLLYRG.js → chunk-RLZA4VJT.js} +1 -1
- package/dist/{chunk-FT4G3QGO.js → chunk-SACSQY3Q.js} +1 -1
- package/dist/{chunk-LEA6IHXC.js → chunk-SDRFTIRU.js} +1 -1
- package/dist/{chunk-SHAA6FOD.js → chunk-SKRZN25J.js} +1 -1
- package/dist/chunk-TLL7KFLY.js +6 -0
- package/dist/{chunk-QTHITA73.js → chunk-TW3K2DKB.js} +1 -1
- package/dist/chunk-VOHQA2SP.js +2 -0
- package/dist/{chunk-QM3XF5TW.js → chunk-VYQMCLKG.js} +1 -1
- package/dist/{chunk-DKERZJYF.js → chunk-W54W762O.js} +1 -1
- package/dist/{chunk-YY6WPFMT.js → chunk-WSZ7IENQ.js} +3 -3
- package/dist/{chunk-7BCZLDNX.js → chunk-WV42KKEU.js} +1 -1
- package/dist/chunk-XY5KWIRF.js +3 -0
- package/dist/{chunk-RLICAFFQ.js → chunk-XZW3TBOV.js} +1 -1
- package/dist/chunk-Y5RNCJAN.js +19 -0
- package/dist/{chunk-DPOES6G3.js → chunk-YJIESLN6.js} +1 -1
- package/dist/{chunk-G6F2BOFT.js → chunk-YOFKDRY4.js} +1 -1
- package/dist/{chunk-F42YVALT.js → chunk-YVXC46DY.js} +1 -1
- package/dist/{chunk-P4SE6YON.js → chunk-Z25FKS3Y.js} +1 -1
- package/dist/{chunk-RQM3DUSB.js → chunk-ZFFRHV5U.js} +1 -1
- package/dist/chunk-ZPENY2Q3.js +4 -0
- package/dist/{config-Z4OS3HEE.js → config-7WI6TBDV.js} +1 -1
- package/dist/{cover-cmd-L2HSVDLH.js → cover-cmd-J2ZJUL6P.js} +1 -1
- package/dist/{credentials-TNEVAUHI.js → credentials-MX5ABDPF.js} +1 -1
- package/dist/docx-convert-IAX54REO.js +2 -0
- package/dist/{dossier-ZHSHATVU.js → dossier-UVTGCL7T.js} +1 -1
- package/dist/{evidence-MA3LDBWG.js → evidence-TZYIOSPG.js} +1 -1
- package/dist/{evolve-cmd-DTW4EOXM.js → evolve-cmd-IDS5ZIUY.js} +1 -1
- package/dist/exit-manager-MXUD7GQ7.js +2 -0
- package/dist/{explain-cmd-E366QTAD.js → explain-cmd-NPKN63XL.js} +1 -1
- package/dist/{explain-cmd-327F6ESA.js → explain-cmd-R3WCNR2A.js} +1 -1
- package/dist/extract-bind-CISTQFI3.js +8 -0
- package/dist/{extract-cmd-LFVMG6UE.js → extract-cmd-HG3DHHSL.js} +1 -1
- package/dist/{gaps-cmd-IAEXXESW.js → gaps-cmd-XLVUFSTY.js} +1 -1
- package/dist/{generate-headless-TYQRYQKJ.js → generate-headless-4VJMAHCU.js} +2 -2
- package/dist/index.js +67 -65
- package/dist/ingest-UAIKHOB4.js +2 -0
- package/dist/ingest-cmd-7HJLRLMG.js +4 -0
- package/dist/interactive-bind-IXFRXBBL.js +10 -0
- package/dist/{lifecycle-cmd-KZOC4WDW.js → lifecycle-cmd-VTFZ3TF2.js} +1 -1
- package/dist/{list-cmd-6X5U46RD.js → list-cmd-KXL4WQII.js} +1 -1
- package/dist/list-commands-BJYJ34HT.js +2 -0
- package/dist/{logical-ids-RFGWBVML.js → logical-ids-LMBNMENR.js} +1 -1
- package/dist/login-flow-KW5T7WRJ.js +2 -0
- package/dist/pdf-convert-S7VYE6AV.js +2 -0
- package/dist/{persist-recorded-session-RAL7UCQT.js → persist-recorded-session-QR7RVAXR.js} +1 -1
- package/dist/{pipeline-PLI5WQKX.js → pipeline-L6V24KGN.js} +1 -1
- package/dist/{readmodel-V3DVL6NP.js → readmodel-AGAPK2AI.js} +1 -1
- package/dist/reconcile-cmd-E2MMQM7Z.js +2 -0
- package/dist/{recording-banner-MBR3Q7VD.js → recording-banner-QAIKLV6E.js} +1 -1
- package/dist/{require-project-folder-KE7XOOFN.js → require-project-folder-OANMHOVE.js} +1 -1
- package/dist/{review-cmd-XVWPSWU2.js → review-cmd-2FCGP55U.js} +1 -1
- package/dist/run-FYJZCWYS.js +2 -0
- package/dist/run-IOBBB7GN.js +2 -0
- package/dist/{run-test-md-ZCAWNP35.js → run-test-md-5E53A5DT.js} +2 -2
- package/dist/{sessions-cmd-STHKGDX4.js → sessions-cmd-DTQYDZNT.js} +1 -1
- package/dist/{skill-installer-H5DPJJFW.js → skill-installer-LGEIIQ4Q.js} +1 -1
- package/dist/{spawner-C6B5J73J.js → spawner-6FHAXNOA.js} +1 -1
- package/dist/store-id-EOSGEKVK.js +2 -0
- package/dist/tcg-generate-CEDA6DZJ.js +2 -0
- package/dist/testmd-actions-2OFH5GRJ.js +2 -0
- package/dist/token-refresh-R75DGT4X.js +2 -0
- package/dist/{validate-basic-VBPGGHES.js → validate-basic-Z46MAH2G.js} +1 -1
- package/dist/{version-check-YPRCQJ7E.js → version-check-64M5JQQ7.js} +1 -1
- package/dist/{view-cmd-G4PGJRQH.js → view-cmd-PG66UQK7.js} +1 -1
- package/dist/walk-session-7PM2RXEF.js +2 -0
- package/package.json +10 -6
- package/dist/ChatSurface-B2QJYKV4.js +0 -8
- package/dist/EvidenceViewOffer-5TJCRM2T.js +0 -2
- package/dist/SingleShotApp-YQYS6HTB.js +0 -2
- package/dist/TestMdRunView-7CL3PM3J.js +0 -2
- package/dist/bind-HNI5LCNK.js +0 -6
- package/dist/chunk-2Z5MSC23.js +0 -12
- package/dist/chunk-4CKZAGBD.js +0 -2
- package/dist/chunk-4GXOBABK.js +0 -4
- package/dist/chunk-E4EHWO3J.js +0 -4
- package/dist/chunk-FXPPQL4D.js +0 -6
- package/dist/chunk-M5JQXOCE.js +0 -12
- package/dist/chunk-RHNKYNNZ.js +0 -6
- package/dist/chunk-SORKKW7B.js +0 -6
- package/dist/chunk-VCYVSKPM.js +0 -2
- package/dist/chunk-VXLOEM2U.js +0 -347
- package/dist/chunk-XTO236AL.js +0 -14
- package/dist/chunk-XWIN3S7O.js +0 -4
- package/dist/exit-manager-VCSIUYBR.js +0 -2
- package/dist/extract-bind-DZLG4GUE.js +0 -5
- package/dist/ingest-CBQAXVH6.js +0 -2
- package/dist/ingest-cmd-JN6PLDE3.js +0 -3
- package/dist/interactive-bind-QEBWUJCN.js +0 -7
- package/dist/list-commands-BU2MSYRH.js +0 -2
- package/dist/login-flow-4L62GWLT.js +0 -2
- package/dist/pdf-convert-KYXI4FU4.js +0 -2
- package/dist/reconcile-cmd-UXY36ROJ.js +0 -2
- package/dist/run-5DQSL5KH.js +0 -2
- package/dist/run-B7BRNC3X.js +0 -2
- package/dist/tcg-generate-DIMZXAV3.js +0 -2
- package/dist/testmd-actions-X6XCV53D.js +0 -2
- package/dist/token-refresh-7PAPCMQK.js +0 -2
- package/dist/walk-session-GWOP27TX.js +0 -2
|
@@ -1,61 +1,61 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{c as sn}from"./chunk-GLS46X7N.js";import{c as
|
|
2
|
+
import{a as Dt,b as Ot,c as sn}from"./chunk-2XMJ6YAE.js";import{c as nn}from"./chunk-GLS46X7N.js";import{c as Pt,d as Qr}from"./chunk-GWJ76BLF.js";import{d as Yr}from"./chunk-2YQ6TW77.js";import{a as Tt,b as Jr,c as Xe,d as et,e as Zr,f as Lt,g as tn,h as rn}from"./chunk-OIYGGEUL.js";import{a as Te,b as ne,e as _e,f as At,k as zr,p as he,q as xt,t as Wr}from"./chunk-RKWJG3WW.js";import{b as Se}from"./chunk-7APDXIKI.js";import{a as Je,b as Et}from"./chunk-RLZA4VJT.js";import{a as Dr,b as Ct}from"./chunk-2OQLMW3F.js";import{a as Le,b as Xr}from"./chunk-C5UNZ6ZY.js";import{c as en}from"./chunk-S3DAAAE5.js";import{a as we}from"./chunk-WAOCHXJ5.js";import{B as Ur,C as jr,D as Fr,F as Nr,G as $r,I as Br,J as Vr,K as Kr,X as Hr,aa as qr,ba as Gr,j as Ze,x as Or}from"./chunk-OESHJ4J2.js";import{a as Mr}from"./chunk-BC7UVJJB.js";import{i as Ar,k as Rt,l as kt,m as Qe,n as xr,o as Pr}from"./chunk-Y5RNCJAN.js";import{g as Tr,h as Lr}from"./chunk-5LTUYXMP.js";import{a as We}from"./chunk-2WVKOZ6W.js";import{a as Ye,b as Er}from"./chunk-NLCCBXXV.js";import{a as q}from"./chunk-RZ4F3BHX.js";import{a as re}from"./chunk-RH4GCEFX.js";import{a as kr}from"./chunk-E47GFYXA.js";import{a as Ge,c as wt,j as Cr,k as ze,l as _t,m as It}from"./chunk-2KS2YRIS.js";import{join as le,basename as is}from"path";import{existsSync as go,readFileSync as ls}from"fs";function on(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
3
|
`):process.stderr.write(`[replay-trace] ${o}${i}: AUTHOR (${s.reason})
|
|
4
4
|
`)}}function Ie(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function an(e,t){let r=e===0?"(none)":`0..${e-1}`,n=e>=t?"(none)":`${e}..${t-1}`;Ie(`[replay-trace] phase: replay ${r}, author ${n}
|
|
5
5
|
`)}function ln(e,t){Ie(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
|
|
6
6
|
`)}function cn(e,t,r){Ie(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
|
|
7
7
|
`)}function dn(e,t){Ie(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
|
|
8
|
-
`)}function
|
|
8
|
+
`)}function Ut(){Ie(`[replay-trace] force-author (--author) \u2014 walker bypassed
|
|
9
9
|
`)}function un(e){Ie(`[replay-trace] cancelled at step ${e}
|
|
10
|
-
`)}import{join as mn}from"path";function
|
|
11
|
-
`)}},
|
|
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=vn(a);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
|
|
13
|
-
`)}catch{}}e?.chromePid&&e.chromePid>0&&i({type:"chrome_pid",pid:e.chromePid});let f=null;e?.cdpEndpoint&&An(e.cdpEndpoint,c=>i({type:"bounds",...c})).then(c=>{f=c.stop}).catch(()=>{});let a=!1;return{setRunActive(c){a||i({type:"run_active",active:c})},setStepText(c){if(a)return;let y=c.trim();y&&i({type:"step_text",text:y})},setStepComplete(){a||i({type:"step_complete"})},kill(){if(!a){a=!0,f?.();try{s.stdin?.end()}catch{}try{s.kill("SIGTERM")}catch{}}}}}function Pn(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function
|
|
10
|
+
`)}import{join as mn}from"path";function jt(e){let t=Zr(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,stream:!0,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?mn(e.sessionDir,"scratch",String(e.runIndex)):mn(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=Ze(e.evidence.packTestDir,e.evidence.ordinalOffset)),r}async function fn(e){let t=e.forceAuthor?0:et(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,un(i.failedAt??0),{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};if(i.failedAt===null)return{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};let f=Xr({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 dn(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:n,shrinkCount:r};r++,cn(r,Le.maxShrinks,f.newAuthorBoundary),t=f.newAuthorBoundary}}var Rs=15e3,Ft=3,pn=[500,1e3];async function Nt(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 tt(t,{from_commit_id:e.fromCommitId,new_commit_id:e.newCommitId},e.auth);return r.ok?{ok:!0,sessionExpiresAt:M(r.body,"session_expires_at")??""}:{ok:!1,...ks(r)}}function ks(e){let t=M(e.body,"error")??M(e.body,"code")??"",r=M(e.body,"message")??M(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 hn(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await tt(t,void 0,e.auth);return r.ok?{ok:!0,sessionExpiresAt:M(r.body,"session_expires_at")??""}:{ok:!1,expired:r.status===404,httpStatus:r.status,message:M(r.body,"message")??M(r.body,"detail")??r.text??`HTTP ${r.status}`}}async function $t(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 tt(t,r,e.auth);return n.ok?{ok:!0,testId:M(n.body,"test_id")??e.testId,testcaseId:M(n.body,"testcase_id")??"",projectId:M(n.body,"project_id"),isTestCaseDeleted:typeof n.body?.is_test_case_deleted=="boolean"?n.body.is_test_case_deleted:void 0}:{ok:!1,...Cs(n)}}function Cs(e){let t=M(e.body,"error")??M(e.body,"code")??"",r=M(e.body,"message")??M(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 De(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 tt(t,r,e.auth);return n.ok?{ok:!0}:{ok:!1,reason:M(n.body,"error")??"other",httpStatus:n.status,message:M(n.body,"message")??M(n.body,"detail")??n.text??`HTTP ${n.status}`}}async function tt(e,t,r){let n=null;for(let s=1;s<=Ft;s++){let o=new AbortController,i=setTimeout(()=>o.abort(),Rs);try{let f=await q(e,{method:"POST",headers:{Authorization:Ye(r.username,r.accessKey),"Content-Type":"application/json",Accept:"application/json"},...t!==void 0?{body:JSON.stringify(t)}:{},signal:o.signal});clearTimeout(i);let a=await f.text(),c=null;if(a)try{c=JSON.parse(a)}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:a};if(s<Ft){await gn(pn[s-1]??1e3);continue}return{ok:!1,status:f.status,body:c,text:a}}catch(f){if(clearTimeout(i),n=f,s<Ft){await gn(pn[s-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:n?.message??"exhausted retries"}}function gn(e){return new Promise(t=>setTimeout(t,e))}function M(e,t){if(typeof e!="object"||e===null)return;let r=e[t];return typeof r=="string"?r:void 0}var Es=60*1e3,bn="lock-heartbeat",me=new Map,Oe=null,As={register:(e,t)=>Qe(e,t),deregister:e=>xr(e),cleanup:(e,t)=>Pr(e,t),remoteLogger:null};function yn(e){if(e!==void 0){let t=me.get(e);t!==void 0&&(clearInterval(t),me.delete(e));return}for(let t of me.values())clearInterval(t);me.clear()}function rt(e){if(me.has(e.testId))return;let t=e.lifecycle??As,r=setInterval(async()=>{let n=await hn({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
|
+
`)}},Es);me.set(e.testId,r),Oe===null&&(Oe=t,t.register(bn,()=>yn()))}function be(e){me.size!==0&&(yn(e),me.size===0&&Oe!==null&&(Oe.deregister(bn),Oe=null))}import{readFileSync as vn,readdirSync as Sn,existsSync as ye,promises as wn}from"fs";import{join as se}from"path";async function xs(e,t){let r=se(e,"steps",`${t.ordinal}-${t.id}`),n;try{n=await wn.readFile(se(r,"screenshot.png"))}catch{return null}let s=null;try{s=JSON.parse(await wn.readFile(se(r,"step.json"),"utf8")).action_id??null}catch{}return{png:n,actionId:s}}function Ko(){let e=[];return{track:t=>{e.push(t.catch(()=>{}))},settle:async()=>{await Promise.all(e)}}}async function _n(e,t,r,n){try{let s=await xs(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}if(!s.actionId){n("warn","SCREENSHOT_SKIP","No action_id in step.json",{ordinal:t.ordinal,id:t.id,reason:"no_action_id"});return}r.enqueue(s.actionId,s.png),n("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{ordinal:t.ordinal,id:t.id,action_id:s.actionId,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 In(e,t,r,n,s,o){try{let i=se(e,"runs",String(t),"run-test");if(!ye(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=se(i,`child-${o}`);if(!ye(k)){s("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:o,reason:"child_dir_not_found",path:k});return}let C=Sn(k).filter(l=>ye(se(k,l,"screenshots")));if(C.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:o,reason:"no_child_screenshots_dir"});return}f=se(k,C[0])}else if(!ye(se(i,"screenshots"))){let k=Sn(i).filter(C=>ye(se(i,C,"screenshots")));if(k.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}f=se(i,k[0])}let a=se(f,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!ye(a)){s("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:o,reason:"screenshot_not_found",path:a});return}let c=se(i,"actions.ndjson");if(!ye(c)){s("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let y=vn(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=vn(a);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 Ps,join as Ts}from"path";function Rn(e,t,r){let n=e.total_runs??1,s=e.run_dir,o,i;if(n>1&&s){let f=Ps(s);o=Array.from({length:n},(a,c)=>Ts(f,String(t+c))),r&&r.length===n&&(i=r)}return{allRunDirs:o,flowObjectives:i}}function kn(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 nt=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(a=>a.rootStepIndex===n),o=this.resolved.rootSteps.find(a=>a.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(a=>a.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 Mt(e){if(!e)return null;let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function Cn(e){return Mt(e.flag)??Mt(e.frontmatter)??(e.configDefault&&e.configDefault!==ze?Mt(e.configDefault):null)}function En(e){return e.resolvedUrl!==null?!1:!((!!e.local||!!e.allowMissingUrl)&&!e.isTTY)}import{spawn as Ls}from"child_process";async function An(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 kr(o.webSocketDebuggerUrl);await new Promise((m,_)=>{i.once("open",m),i.once("error",_)});let f=1,a=new Map;i.on("message",m=>{let _;try{_=JSON.parse(m.toString())}catch{return}if(_.id==null)return;let D=a.get(_.id);D&&(a.delete(_.id),_.error?D.reject(new Error(_.error.message)):D.resolve(_.result))});function c(m,_){let D=f++;return new Promise((ce,Q)=>{a.set(D,{resolve:N=>ce(N),reject:Q});let X={id:D,method:m};_&&(X.params=_),i.send(JSON.stringify(X))})}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,C=null,l=!1;i.on("close",()=>{l=!0}),i.on("error",()=>{l=!0});async function K(){if(!k){if(l){k=!0;return}try{let _=(await c("Browser.getWindowBounds",{windowId:R})).bounds,D=`${_.left}:${_.top}:${_.width}:${_.height}`;D!==x&&(x=D,t({left:_.left,top:_.top,width:_.width,height:_.height}))}catch{}k||(C=setTimeout(K,r))}}return K(),{stop(){if(!k){k=!0,C&&clearTimeout(C);try{i.close()}catch{}}}}}var Ds=new Set(["1","true","yes"]);function xn(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&Ds.has(t.toLowerCase()))return null;let r=Dr();if(!r)return null;let n=[...r.args,"overlay"];e?.text&&n.push(e.text);let s;try{s=Ls(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&&An(e.cdpEndpoint,c=>i({type:"bounds",...c})).then(c=>{f=c.stop}).catch(()=>{});let a=!1;return{setRunActive(c){a||i({type:"run_active",active:c})},setStepText(c){if(a)return;let y=c.trim();y&&i({type:"step_text",text:y})},setStepComplete(){a||i({type:"step_complete"})},kill(){if(!a){a=!0,f?.();try{s.stdin?.end()}catch{}try{s.kill("SIGTERM")}catch{}}}}}function Pn(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function st(e,t,r,n){return`${Pn(e,t,r)}/dashboard/share/${n}?type=summary&agentView=true&fqdn=summary-page`}function Tn(e,t,r,n){if(!(!t||!r||!n))return st(e,t,r,n)}function Ln(e,t,r){return`${Pn(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as zs,rmSync as Ys}from"fs";import{join as Ws}from"path";import{tmpdir as Qs}from"os";import{spawn as Un,spawnSync as Os}from"child_process";import{existsSync as Bt}from"fs";import{createConnection as Us}from"net";import{homedir as Ue,platform as Ne}from"os";import{join as je}from"path";var js=new Set(["1","true","yes"]),ot=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function mi(e){return e instanceof ot?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var it={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",je(Ue(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",je(Ue(),"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",je(Ue(),"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",je(Ue(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",je(Ue(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe")]};function Fs(){if(process.env.KANE_CLI_CHROME_PATH)return process.env.KANE_CLI_CHROME_PATH;let e=Ne(),t=it[e]??it.linux;for(let r of t)if(Bt(r))return r;return e==="win32"?"chrome.exe":"google-chrome"}function Ns(){if(process.env.KANE_CLI_CHROME_PATH)return Bt(process.env.KANE_CLI_CHROME_PATH);let e=Ne();if((it[e]??it.linux).some(s=>Bt(s)))return!0;let r=e==="win32"?"chrome.exe":"google-chrome",n=e==="win32"?"where":"which";try{return Os(n,[r],{stdio:"ignore"}).status===0}catch{return!1}}function $s(){let e=Ne();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
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
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
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
|
|
18
|
-
`)}return r}function Vn(e){if(!Bn(e))throw new Error(`Variables file not found: ${e}`);let t=Mn(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 Kn(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 Hn(e,t,r){let n=$n(e,r),s=$n(t,r);return{...n,...s}}var Re=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=
|
|
19
|
-
`)}try{t.runCleanup?.()}catch(a){n("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(a)})}try{await e.session.finish("complete")}catch(a){n("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(a)})}return{uploadResult:o,feedbackChoice:i,resultMdPath:f}}import{readFileSync as
|
|
17
|
+
`)}function Ms(e){let t=Ne(),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 Bs(e){return new Promise(t=>{let r=Us({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 Vs(){for(let e=_t;e<=It;e++)if(!await Bs(e))return e;throw new Error(`All CDP ports ${_t}-${It} are in use. Close other Chrome instances.`)}var Fe=class extends Error{constructor(t){super(t),this.name="CdpReadinessError"}};async function Ks(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 Fe(`Chrome CDP not ready after ${t}ms on port ${e}`)}var Hs=3e4,qs=2;function Dn(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 Gs(e){return Math.min(500*e,3e3)}function On(e,t){try{if(e.pid)if(t==="win32")Un("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 jn(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&js.has(t.toLowerCase()))&&!Ns())throw Rt()?.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 ot($s());let n=Ne(),s=Fs(),o=Dn("KANE_CLI_CDP_TIMEOUT_MS",Hs,1),f=Dn("KANE_CLI_CDP_RETRIES",qs,0)+1,a;for(let c=1;c<=f;c++){let y=await Vs(),w=Ms({port:y,...e});e.startUrl&&w.push(e.startUrl);let A=Un(s,w,{stdio:"ignore",detached:!0});A.unref();try{let R=await new Promise((x,k)=>{A.on("error",C=>{k(new Error(`Failed to launch Chrome: ${C.message}. Is Chrome installed at ${s}?`))}),A.on("close",C=>{C!==null&&C!==0&&k(new Fe(`Chrome exited during startup with code ${C}`))}),Ks(y,o).then(x,k)});return{process:A,port:y,cdpEndpoint:R,kill(){On(A,n)}}}catch(R){if(a=R,!(R instanceof Fe))throw R;On(A,n),Rt()?.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,Gs(c)))}}throw a??new Error("Chrome launch failed after retries")}async function Fn(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(Ws(Qs(),"kane-clean-")),t=r;let s=r;Qe("tempDir",()=>{try{Ys(s,{recursive:!0,force:!0})}catch{}})}let n=await jn({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 Nn(e){let t={objective:e.objective,model:e.model,width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,stream:!0,max_steps:e.maxSteps??30,headless:e.headless??!1};return e.url&&(t.url=e.url),e.requireStartUrl&&(t.require_start_url=!0),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.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=Ze(e.evidence.packTestDir,e.evidence.ordinalOffset)),t}import{readdirSync as Js,readFileSync as Mn,existsSync as Bn}from"fs";import{join as Zs}from"path";function $n(e,t){if(!Bn(e))return{};let r={},n;try{n=Js(e).filter(s=>s.endsWith(".json")).sort()}catch{return{}}for(let s of n)try{let o=Mn(Zs(e,s),"utf-8"),i=JSON.parse(o);if(i&&typeof i=="object"){for(let[f,a]of Object.entries(i))if(a&&typeof a=="object"&&"value"in a){let c=a;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 Vn(e){if(!Bn(e))throw new Error(`Variables file not found: ${e}`);let t=Mn(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 Kn(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 Hn(e,t,r){let n=$n(e,r),s=$n(t,r);return{...n,...s}}var Re=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=Ye(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 ke=class extends Er{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 a=await n.json().catch(()=>({}));if(a.type==="Success"&&a.id!=null)return{id:Number(a.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 qn(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 Gn(e){let t=Hn(e.globalDir,e.localDir,e.onLoadError),r=e.file?Vn(e.file):{},n=e.inline?Kn(e.inline):{},s={...t,...r,...n},o=Object.keys(s).length>0,{variables:i,objective:f}=o?Se(s,e.objective):{variables:{},objective:e.objective},a=Object.entries(s).filter(([,y])=>y.secret),c=Object.entries(s).filter(([,y])=>!y.secret);return{raw:s,auteur:i,auteurObjective:f,secretEntries:a,nonSecretEntries:c}}async function zn(e){if(e.localMode)return{};let t=re(e.env);if(e.variables.secretEntries.length>0){let n=new Re(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 ke(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 Xs,existsSync as eo}from"fs";function Vt(e){if(!eo(e))return null;try{return Xs(e,"utf-8").trim()||null}catch{return null}}var to=()=>{};async function Yn(e,t,r){let n=t.log??to,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(a){n("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(a)})}if(t.renderFeedbackPrompt)try{i=await t.renderFeedbackPrompt(),i&&s&&t.submitFeedback&&t.submitFeedback(s,i).catch(a=>{n("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(a)})})}catch(a){n("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(a)})}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=Tt({sourcePath:r.sourcePath,title:r.title,rootSteps:r.rootSteps,outcomes:r.outcomes,overallStatus:r.overallStatus,startedISO:r.startedISO,durationS:r.durationS,sessionId:e.session.sessionId})}catch(a){n("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(a)})}try{xt({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??Te(r.sourcePath),plan:e.session.plan??void 0})}catch(a){n("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(a)})}if(o?.codeExportDir)try{let a=e.tuiConfig.code_export?.language??"python";Lt(o.codeExportDir,At(r.sourcePath,"playwright",a))}catch(a){n("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(a)})}}else if(e.session.recorder?.lastWrittenPath){let a=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=Tt({sourcePath:a,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{xt({sourcePath:a,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,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";Lt(o.codeExportDir,At(a,"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 ${a} (renamed: ${e.session.sessionName}_test.md already existed)
|
|
19
|
+
`)}try{t.runCleanup?.()}catch(a){n("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(a)})}try{await e.session.finish("complete")}catch(a){n("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(a)})}return{uploadResult:o,feedbackChoice:i,resultMdPath:f}}import{readFileSync as Kt,writeFileSync as Ht,existsSync as Qn}from"fs";function Wn(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 a=ro(e,e.steps[i]);switch(f.reason){case"structure-mismatch":n.push(`added/removed: ${a}`);break;case"md5-mismatch":n.push(`modified: ${a}`);break;case"missing-recording":n.push(`re-recorded: ${a}`);break;case"recorded-failed":n.push(`re-authored after failure: ${a}`);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 ro(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 no(e,t){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{let{changedUnitFiles:r,legacySweep:n}=await tn({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(Qn(`${o}.staging`)){zr(o);let i=n.find(f=>f.unitFile===s);i&&rn(i.dirs)}}}}function so(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=Wn(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 $t({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=_e(e.sourcePath);try{let i=JSON.parse(Kt(o,"utf8"));i.commit_id=e.newCommitId,Ht(o,JSON.stringify(i,null,2)+`
|
|
20
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 De({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}}),be(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),a=await
|
|
21
|
+
`)}}if(s.ok)for(let o of e.unitLocks??[]){if(!t.files.includes(o.file)){await De({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}}),be(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),a=await $t({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(a.ok){let c=_e(o.file);try{let y=JSON.parse(Kt(c,"utf8"));y.commit_id=e.newCommitId,Ht(c,JSON.stringify(y,null,2)+`
|
|
22
22
|
`,"utf8")}catch(y){process.stderr.write(`warn: failed to update unit meta commit_id (${o.file}): ${y.message}
|
|
23
23
|
`)}}else process.stderr.write(`warn: unit self-commit failed (${o.file}): ${a.reason??""} ${a.message??""}
|
|
24
|
-
`)}return s}}function
|
|
24
|
+
`)}return s}}function oo(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=_e(e.sourcePath);try{let n=Qn(r)?JSON.parse(Kt(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),Ht(r,JSON.stringify(n,null,2)+`
|
|
25
25
|
`,"utf8")}catch(n){process.stderr.write(`warn: failed to update meta.json after endTest: ${n.message}
|
|
26
|
-
`)}}}function Qn(e){let t=re(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??"",a=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,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:a,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:so(e,r),onCommitLock:oo(e,r),onFinalizeSuccess:io(e),evidence:e.evidence,evidenceRead:e.evidenceRead,authoredExecutionPath:e.authoredExecutionPath}}var Zn=["python","javascript"];function ao(e){if(e!==void 0){if(!Zn.includes(e))throw new Error(`--code-language must be one of: ${Zn.join(", ")} (got "${e}")`);return e}}function Xn(e,t){let r=ao(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}async function es(e){try{let r=await new Je(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 lo=null,co=()=>lo??=import("sharp").then(e=>e.default??e).catch(()=>null),lt=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 co();if(s)try{let a=await s(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(a)}catch(a){r=new Uint8Array(t.buffer),n="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:a instanceof Error?a.message:String(a)})}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 a=0;a<=this.maxRetries;a++)try{let c=await M(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(a<this.maxRetries){await this.backoff(a);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(a<this.maxRetries){await this.backoff(a);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}};var $e=class{config;buffer=[];stepBuffer=new Map;flushTimer=null;currentRunIndex=null;stopped=!1;_droppedBatches=0;_droppedEntries=0;constructor(t){this.config=t}start(){if(this.flushTimer)return;let t=this.config.flushIntervalMs??5e3;this.flushTimer=setInterval(()=>{this.flush().catch(()=>{})},t),this.flushTimer.unref&&this.flushTimer.unref()}setRunIndex(t){this.currentRunIndex=t}log(t,r,n,s={}){if(this.stopped)return;let o=this.buildEntry(t,r,n,s);this.buffer.push(o)}logStep(t,r,n,s={}){if(this.stopped)return;let o=this.buildEntry("debug",r,n,s);o.run_index=t,this.stepBuffer.has(t)||this.stepBuffer.set(t,[]),this.stepBuffer.get(t).push(o)}escalate(t){let r=this.stepBuffer.get(t);r&&r.length>0&&this.buffer.push(...r),this.stepBuffer.delete(t)}discardSteps(t){this.stepBuffer.delete(t)}async flush(){if(this.buffer.length===0)return;let t=this.buffer.splice(0),r=null;try{r=await this.config.getToken()}catch{this.buffer.unshift(...t);return}let n={"Content-Type":"application/json"};r&&(n.Authorization=`Bearer ${r}`);let s=JSON.stringify(t);for(let o=0;o<3;o++){try{let i=new AbortController,f=setTimeout(()=>i.abort(),1e4),a=await M(this.config.proxyUrl,{method:"POST",headers:n,body:s,signal:i.signal});if(clearTimeout(f),a.ok)return}catch{}o<2&&await new Promise(i=>setTimeout(i,1e3*Math.pow(2,o)))}this._droppedBatches++,this._droppedEntries+=t.length}get droppedBatches(){return this._droppedBatches}get droppedEntries(){return this._droppedEntries}async shutdown(){this._droppedBatches>0&&this.log("warn","LOG_DROPS",`Dropped ${this._droppedEntries} entries in ${this._droppedBatches} batches`,{dropped_batches:this._droppedBatches,dropped_entries:this._droppedEntries}),this.stopped=!0,this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),await this.flush()}shutdownSync(){this.stopped=!0,this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null)}get bufferSize(){return this.buffer.length}stepBufferSize(t){return this.stepBuffer.get(t)?.length??0}buildEntry(t,r,n,s){return{hostname:"kane-cli",service:"kane-cli",ddsource:"kane-cli",ddtags:`version:${this.config.device.cli_version}`,level:t,event:r,message:n,session_id:this.config.sessionId,run_index:r.startsWith("tcg_")?null:this.currentRunIndex,identity:this.config.identity,device:this.config.device,context:s,timestamp:new Date().toISOString()}}};import{platform as mo,arch as fo}from"os";function Ht(e=process.env){try{let t=e.KANE_CLI_USER_AGENT;return t&&t.trim()?uo(t):e.CLAUDECODE==="1"||e.CLAUDE_CODE_ENTRYPOINT?"claude-code":e.CURSOR_TRACE_ID||e.TERM_PROGRAM==="cursor"?"cursor":e.TERM_PROGRAM==="vscode"||e.VSCODE_PID?"vscode":e.CI==="true"||e.GITHUB_ACTIONS==="true"||e.GITLAB_CI==="true"||e.CIRCLECI==="true"||e.BUILDKITE==="true"?"ci":"unknown"}catch{return"unknown"}}function uo(e){return e.toLowerCase().replace(/[^a-z0-9_-]/g,"-").slice(0,40)}function ts(e){let t={proxyUrl:Er,sessionId:e.sessionId,identity:e.identity,device:{cli_version:ze,platform:mo(),arch:fo(),host_agent:Ht(),invocation_mode:e.invocationMode},getToken:e.getToken};return new $e(t)}import{execSync as po}from"child_process";import{readFileSync as go}from"fs";import{createHash as ho}from"crypto";import{hostname as bo,platform as yo,arch as vo}from"os";var ct=null;function rs(){return ct||(ct=So(),ct)}function So(){let e=yo();if(e==="darwin")try{let n=po("ioreg -rd1 -c IOPlatformExpertDevice",{encoding:"utf-8",timeout:5e3}).match(/"IOPlatformUUID"\s*=\s*"([^"]+)"/);if(n?.[1])return n[1]}catch{}if(e==="linux")try{let r=go("/etc/machine-id","utf-8").trim();if(r)return r}catch{}let t=`${bo()}:${e}:${vo()}`;return ho("sha256").update(t).digest("hex").slice(0,32)}async function wo(e){try{let t=re(e.env),n=await new we(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 lt(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 _o(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=ts({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:rs(),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 Yt(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):wo({env:e.env,auth:e.auth,session:e.session,log:e.log}),_o({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 qt(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function Ua(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 Gt(e.env,e.tmsCreds,r,t);return zt(n,t),n}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await qt(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 Gt(e.env,s,n,t);return zt(o,t),o}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await qt(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 qt(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 Gt(e.env,n,o,t);return zt(i,t),i}}}async function Gt(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}:Yt({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 zt(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 ko}from"path";import{readFile as Io}from"fs/promises";function ns(e){return e.shouldUploadArtifacts&&!e.lockHeld&&!e.isFirstRun&&e.sealed&&!!e.testId}var Wt=e=>e instanceof Error?e.message:String(e);async function ss(e){let{controller:t,tms:r,testId:n,sessionId:s,executionId:o,sealedPackPath:i,projectId:f}=e,a;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"};a=w}catch(c){return{ok:!1,stage:"presign",error:Wt(c)}}try{let c=await Io(i);await Wr(a,c,"application/zip")}catch(c){return{ok:!1,stage:"upload",error:Wt(c)}}try{await r.ingestEvidence(o,f)}catch(c){return{ok:!1,stage:"ingest",error:Wt(c)}}return{ok:!0}}function os(e){return e.isFirstRun||et(e.decisions)||e.push===!0||e.author===!0}function is(e,t){return{projectId:e?.project_id??t.project_id??null,folderId:e?.folder_id??t.folder_id??null}}function Jt(e){return e?"author":"replay"}function Co(e,t){return e?{session:e,ownsLifecycle:!1}:{session:t,ownsLifecycle:!0}}function Qt(e,t){return e?.total_runs??t?.length??1}function Eo(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 dt=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function $l(e,t,r){let{path:n,cwd:s,opts:o,isAgent:i,disableAskUser:f,resolved:a,resolvedAuth:c,cliOverrides:y,environment:w,envConfig:A,profile:R,model:x,creds:k,configStore:C,session:l}=e,H=!1,m=await To(n,a,o,{resolvedAuth:c,tmsBaseUrl:A.tmsBaseUrl},l.sessionId,r);if(m.abort)return{overallStatus:"failed",exitCode:m.abort.exitCode,outputDir:ne(n),durationS:0,uploadResult:null};let _=m.lockAcquired,D=!1,ce=new Set,J=!1,X=!1;_&&t.onLockState({phase:"acquired",scope:"preemptive"}),l.start({model:x,environment:w,profile:R}),l.setRecordingEnabled(!1);let N=0,er=c.basicAuth?{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}:c.token??null,xe=null;if(er!==null){let d=await Yt({env:w,tmsCreds:c.resolvedCreds??null,resolver:c.resolver,auth:er,getToken:async()=>c.token??null,session:l,log:(u,p,b,h)=>l.log(u,p,b,h),skipScreenshotQueue:!!o.local||!c.basicAuth,invocationMode:i?"agent":"cli"});xe=d.screenshotQueue,d.remoteLogger&&(r.register("remote-logger",()=>d.remoteLogger.shutdownSync()),r.remoteLogger=d.remoteLogger,e.skipGlobalRemoteLogger||xr(d.remoteLogger))}if(o.name){try{tn(o.name)}catch(d){return process.stderr.write(`error: ${d.message}
|
|
27
|
-
`),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}l.setSessionName(o.name)}let
|
|
28
|
-
`);let{shutdown:u}=await import("./exit-manager-
|
|
29
|
-
`),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}}let ie;try{ie=await Fn({config:{chrome_profile_path:ee.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:
|
|
30
|
-
`),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}let
|
|
31
|
-
`):c.basicAuth?F||(
|
|
26
|
+
`)}}}function Jn(e){let t=re(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??"",a=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,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:a,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:no(e,r),onCommitLock:so(e,r),onFinalizeSuccess:oo(e),evidence:e.evidence,evidenceRead:e.evidenceRead,authoredExecutionPath:e.authoredExecutionPath}}var Zn=["python","javascript"];function io(e){if(e!==void 0){if(!Zn.includes(e))throw new Error(`--code-language must be one of: ${Zn.join(", ")} (got "${e}")`);return e}}function Xn(e,t){let r=io(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}async function es(e){try{let r=await new We(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 ao=null,lo=()=>ao??=import("sharp").then(e=>e.default??e).catch(()=>null),at=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 lo();if(s)try{let a=await s(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(a)}catch(a){r=new Uint8Array(t.buffer),n="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:a instanceof Error?a.message:String(a)})}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 a=0;a<=this.maxRetries;a++)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(a<this.maxRetries){await this.backoff(a);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(a<this.maxRetries){await this.backoff(a);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 co,arch as uo}from"os";function ts(e){let t={proxyUrl:Cr,sessionId:e.sessionId,identity:e.identity,device:{cli_version:Ge,platform:co(),arch:uo(),host_agent:Ot(),invocation_mode:e.invocationMode},getToken:e.getToken};return new Dt(t)}async function mo(e){try{let t=re(e.env),n=await new we(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 at(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 fo(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=ts({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:sn(),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 Yt(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):mo({env:e.env,auth:e.auth,session:e.session,log:e.log}),fo({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 qt(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function ya(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 Gt(e.env,e.tmsCreds,r,t);return zt(n,t),n}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await qt(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 Gt(e.env,s,n,t);return zt(o,t),o}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await qt(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 qt(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 Gt(e.env,n,o,t);return zt(i,t),i}}}async function Gt(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}:Yt({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 zt(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 ho}from"path";import{readFile as po}from"fs/promises";function rs(e){return e.shouldUploadArtifacts&&!e.lockHeld&&!e.isFirstRun&&e.sealed&&!!e.testId}var Wt=e=>e instanceof Error?e.message:String(e);async function ns(e){let{controller:t,tms:r,testId:n,sessionId:s,executionId:o,sealedPackPath:i,projectId:f}=e,a;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"};a=w}catch(c){return{ok:!1,stage:"presign",error:Wt(c)}}try{let c=await po(i);await Yr(a,c,"application/zip")}catch(c){return{ok:!1,stage:"upload",error:Wt(c)}}try{await r.ingestEvidence(o,f)}catch(c){return{ok:!1,stage:"ingest",error:Wt(c)}}return{ok:!0}}function ss(e){return e.isFirstRun||Xe(e.decisions)||e.push===!0||e.author===!0}function os(e,t){return{projectId:e?.project_id??t.project_id??null,folderId:e?.folder_id??t.folder_id??null}}function Qt(e){return e?"author":"replay"}function bo(e,t){return e?{session:e,ownsLifecycle:!1}:{session:t,ownsLifecycle:!0}}function lt(e,t){return e?.total_runs??t?.length??1}function yo(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 ct=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function _l(e,t,r){let{path:n,cwd:s,opts:o,isAgent:i,disableAskUser:f,resolved:a,resolvedAuth:c,cliOverrides:y,environment:w,envConfig:A,profile:R,model:x,creds:k,configStore:C,session:l}=e,K=!1,m=await _o(n,a,o,{resolvedAuth:c,tmsBaseUrl:A.tmsBaseUrl},l.sessionId,r);if(m.abort)return{overallStatus:"failed",exitCode:m.abort.exitCode,outputDir:ne(n),durationS:0,uploadResult:null};let _=m.lockAcquired,D=!1,ce=new Set,Q=!1,X=!1;_&&t.onLockState({phase:"acquired",scope:"preemptive"}),l.start({model:x,environment:w,profile:R}),l.setRecordingEnabled(!1);let N=0,Xt=c.basicAuth?{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}:c.token??null,xe=null;if(Xt!==null){let d=await Yt({env:w,tmsCreds:c.resolvedCreds??null,resolver:c.resolver,auth:Xt,getToken:async()=>c.token??null,session:l,log:(u,p,b,h)=>l.log(u,p,b,h),skipScreenshotQueue:!!o.local||!c.basicAuth,invocationMode:i?"agent":"cli"});xe=d.screenshotQueue,d.remoteLogger&&(r.register("remote-logger",()=>d.remoteLogger.shutdownSync()),r.remoteLogger=d.remoteLogger,e.skipGlobalRemoteLogger||Ar(d.remoteLogger))}if(o.name){try{en(o.name)}catch(d){return process.stderr.write(`error: ${d.message}
|
|
27
|
+
`),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}l.setSessionName(o.name)}let dt={};for(let[d,u]of Object.entries(a.rootGlobal))ct.includes(d)||(dt[d]=u);for(let[d,u]of Object.entries(y))ct.includes(d)||u!==void 0&&(dt[d]=u);let ee={...a.chrome};for(let d of ct){let u=y[d];u!==void 0&&(ee[d]=u)}let ds={...dt,...ee};l.setResolvedGlobal(ds);let er=k.getActiveProfile()??"default",tr=k.getDefaultEnv(),{rehydrateIfStale:us}=await import("./profile-sync-DTTRRIVP.js");us(k,C,er,tr);let j=C.load(),rr=(y.assertion_mode??j.assertion_mode)==="dom"?"dom":"visual",nr=y.final_validation,sr=nr===void 0?void 0:nr==="on",F=j.project_id??null,de=j.folder_id??null,or=ss({isFirstRun:m.isFirstRun,decisions:m.decisions,push:o.push===!0,author:o.author===!0});if(or){if(c.basicAuth){let d=await Lr({creds:k,config:C,profile:er,env:tr,tmsCreds:c.basicAuth,isLocal:!!o.local,log:(u,p,b,h)=>l.log(u,p,b,h),onAnnounce:e.onAnnounce,onFatalExit:e.onFatalExit});if(d.status==="ok"){F=d.projectId,de=d.folderId,j=C.load();let u=he(n);u?.project_id&&(F=u.project_id,de=u.folder_id??de),i&&d.autoDefaulted&&t.onAgentEvent(Tr(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=he(n);({projectId:F,folderId:de}=os(d,{project_id:j.project_id??null,folder_id:j.folder_id??null})),l.log("info","GATE_SKIP_REPLAY","Project/folder gate skipped (planned pure replay)",{meta_project:!!d?.project_id,config_project:!!j.project_id})}{let d=Wr(a),u=c.resolvedCreds?.org_id!=null?String(c.resolvedCreds.org_id):void 0,p=d.find(g=>g.project_id&&F&&g.project_id!==String(F)||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 l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}}let ie;try{ie=await Fn({config:{chrome_profile_path:ee.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:ze,headless:ee.headless??!1,wsEndpoint:ee.ws_endpoint,cdpEndpoint:ee.cdp_endpoint})}catch(d){return process.stderr.write(`error: Chrome launch failed: ${d.message}
|
|
30
|
+
`),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}let $e=ie.instance;$e&&r.register("chrome",()=>{try{$e.kill()}catch{}});let ir=Nr(ie.cdpEndpoint),G=null,ar=ie.cdpEndpoint??ee.cdp_endpoint;if(ar&&!ee.ws_endpoint&&!ee.headless&&!e.isAgent)try{G=xn({headless:ee.headless??!1,cdpEndpoint:ar,chromePid:$e?.process.pid}),G&&r.register("marker-overlay",()=>G.kill())}catch(d){l.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(d)})}c.resolvedCreds?.org_id!==void 0&&l.setOrgId(String(c.resolvedCreds.org_id)),l.setUserIdentity(c.resolvedCreds?.username??null,c.resolvedCreds?.email??null);let fe=Gn({objective:"",globalDir:le(wt,"variables"),localDir:le(s,".testmuai","variables"),file:o.variablesFile,inline:o.variables}),ms=a.rootGlobal.variables??{},J=vo(fe.raw,ms);l.setAuteurVariables(J.auteur);let lr=Vt(le(wt,"global-memory.md"))??void 0,cr=Vt(le(s,".testmuai","context.md"))??void 0;o.local?process.stderr.write(`info: --local \u2014 KaneAI upload skipped
|
|
31
|
+
`):c.basicAuth?F||(or?process.stderr.write(`warn: KaneAI upload skipped \u2014 no project configured.
|
|
32
32
|
`):process.stderr.write(`warn: evidence publish will be skipped \u2014 no project_id in meta.json or config.
|
|
33
33
|
`)):process.stderr.write(`warn: KaneAI upload skipped \u2014 TMS credentials could not be resolved.
|
|
34
34
|
Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
|
|
35
35
|
`);let ve=!o.local&&!!c.basicAuth&&F!=null;if(l.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:ve,lockHeld:_,isFirstRun:m.isFirstRun,hasAuth:m.hasAuth}),ve&&m.testId==null&&!m.degradedReadonly){let d=re(w);try{let u=await es({tmsBaseUrl:d.tmsBaseUrl,auth:c.basicAuth,objective:a.steps[0].objective,url:"",projectId:F,folderId:de??"",hasCustomProfile:!!ee.chrome_profile,log:(p,b,h,g)=>l.log(p,b,h,g)});u&&l.setTestId(u)}catch(u){process.stderr.write(`warn: ATM test creation failed: ${u.message}
|
|
36
|
-
`)}}else m.testId&&l.setTestId(m.testId);let
|
|
37
|
-
`)}let
|
|
38
|
-
`),{failedAt:u,cancelled:!1};let h=l.nextRunIndex();N=h;let g=u===0?pe??void 0:a.steps[u].unitEntryUrl,I={width:j.window_size.width,height:j.window_size.height},P=Ce(fe.raw,p.config.variables,p.objective),
|
|
39
|
-
`),!1;let u=l.sessionId,p=o.onLockConflict??a.rootGlobal.on_lock_conflict??"readonly",b=await
|
|
36
|
+
`)}}else m.testId&&l.setTestId(m.testId);let Me={};if(c.basicAuth&&!o.local&&(J.secretEntries.length>0||J.nonSecretEntries.length>0))try{Me=await zn({variables:J,auth:c.basicAuth,orgId:String(c.resolvedCreds?.org_id??""),env:w,localMode:!!o.local,log:(d,u,p,b)=>l.log(d,u,p,b)})}catch(d){process.stderr.write(`warn: variable/secret push failed: ${d.message}
|
|
37
|
+
`)}let ut=new Map;for(let[d,u]of J.nonSecretEntries)ut.set(d,u.value);let mt=new Map;for(let[d,u]of J.secretEntries)mt.set(d,u.value);async function ft(d){if(!c.basicAuth||o.local)return;let u=[],p=[];for(let[h,g]of Object.entries(d))if(g.secret){if(mt.get(h)===g.value)continue;p.push([h,g])}else{if(ut.get(h)===g.value)continue;u.push([h,g])}if(u.length===0&&p.length===0)return;let b=re(w);if(u.length>0){let h=new ke(b.tmsBaseUrl,c.basicAuth.username,c.basicAuth.access_key);for(let[g,I]of u)try{let P=await h.upsertVariable({name:g,value:I.value});Me[g]=P.id,ut.set(g,I.value),l.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:g})}catch(P){l.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:g,error:String(P)})}}if(p.length>0){let h=new Re(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??"")}),mt.set(g,I.value),l.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:g})}catch(P){l.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:g,error:String(P)})}}}let Pe=xe?(d,u,p,b)=>{if(!(_||m.isFirstRun))return;if(L&&b){_n(L.packTestDir,b,xe,(g,I,P,H)=>l.log(g,I,P,H));return}let h=N+u;In(l.sessionDir,h,d,xe,(g,I,P,H)=>l.log(g,I,P,H),p)}:void 0,dr=a.rootTitle??a.rootSteps[0]?.heading??is(n),fs=Object.keys(J.raw).length>0?Se(J.raw,dr).objective:dr,pe=Cn({flag:o.url,frontmatter:a.rootGlobal?.url,configDefault:C.load().default_url}),ps=En({resolvedUrl:pe,local:!!o.local,allowMissingUrl:!!o.allowMissingUrl,isTTY:!!process.stdin.isTTY});l.setFirstRun(fs,pe??"");let ue=new nt(a),Be=new Date().toISOString(),ur=Date.now(),pt=e.evidenceAttach?null:new $r({origin:"testmd",runKind:"author",pid:process.pid,title:a.rootTitle??is(n),started:Be,producerVersion:Ge,surfaces:pe?[pe]:void 0,testmdRelPath:ho(s,n),definition:{path:"test.md",content:ls(n,"utf8")},cwd:s,packRootDir:le(l.sessionDir,"evidence")}),ae=bo(e.evidenceAttach,pt),Z=ae.session,L=null;if(e.evidenceAttach)L={executionId:e.evidenceAttach.id,testId:e.evidenceAttach.test,packTestDir:e.evidenceAttach.packTestDir};else if(pt)try{L=await pt.start()}catch(d){l.log("warn","EVIDENCE_START_FAILED","Evidence pack creation failed",{error:String(d)})}let Ve=[],gt=[],mr,ht=(d,u,p,b,h)=>{if(!L)return;Z.noteSpawn(h?.length?{...d,steps:d.steps.map(I=>({...I,verifies:h}))}:d),d.resolution&&(mr=d.resolution),Ve.push(yo(u));let g=lt(u,b);for(let I=0;I<g;I++)gt.push(p+I)},bt=()=>L?{packTestDir:L.packTestDir,ordinalOffset:Z.nextOrdinalOffset()}:void 0,gs=typeof o.maxSteps=="string"&&o.maxSteps!==""?parseInt(o.maxSteps,10):void 0;function fr(d,u){let p=a.steps[d],b=as(p.config,y),h=Ce(fe.raw,b.variables,p.objective);return Nn({objective:h.objective,url:d===0?pe??void 0:p.unitEntryUrl,requireStartUrl:d===0&&ps,model:x,chrome:ie,auth:c,sessionId:l.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:b.max_steps??gs??30,headless:ee.headless??!1,disableAskUser:!0,variables:Object.keys(h.variables).length>0?h.variables:void 0,globalContext:b.global_context??lr,localContext:b.local_context??cr,sessionContext:l.getContext(),bugDetection:o.bugDetection??j.bug_detection,evidence:bt()})}function pr(d){let p=a.steps[d].trace[0].stepIndex,b=a.rootSteps.find(g=>g.index===p);a.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 yt(d,u,p,b,h,g){let I=a.steps[d],P=I.trace[0].stepIndex,H=!a.steps.slice(d+1).some(T=>T.trace[0].stepIndex===P),B=p?.status==="passed"?"passed":"failed",O=p?.reason??h??void 0,U=p?.duration??g,S=p?.verdict;if(S&&typeof S=="object"){let T=typeof S.one_liner=="string"?S.one_liner:"",E=typeof S.bug_title=="string"&&S.bug_title?S.bug_title:T;if(E&&B==="failed"){let V=[S.family,S.category].filter(Boolean).join("/"),te=typeof S.confidence=="number"?`, confidence ${S.confidence.toFixed(2)}`:"";O=`${O??"failed"} \u2014 bug verdict: ${E}${V?` [${V}${te}]`:""}`}let v=typeof S.category_proposal=="string"?S.category_proposal:"";v&&B==="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:E||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:T||null})}let{continueOverall:$}=ue.recordStep(I,{status:B,duration_s:U,reason:O}),Y=as(I.config,y),W=Ce(fe.raw,Y.variables,I.objective).objective;if(p){let T=Rn(p,u,b);l.addRunResult(kn(p,W,u,T),p.total_runs)}else l.addRunResult({index:u,objective:W,status:B,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(H||!$){let T=ue.snapshotOutcomes().find(E=>E.rootStepIndex===P);t.onAgentEvent({type:"test_md_step_end",step_index:P,status:T.status,duration_s:T.duration_s??0,ref_kind:T.refKind??null,unit_kind:T.refKind==="import"?(T.refLabel??"").endsWith("_test.md")?"test":"helper":null,inlined_count:T.inlinedCount??null,failed_sub_step_index:T.failedSubStepIndex??null})}return $}let vt=[];async function hs(d){an(d,a.steps.length);for(let u=0;u<d;u++){if(K||e.signal?.aborted)return{failedAt:u,cancelled:!0};let p=a.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}
|
|
38
|
+
`),{failedAt:u,cancelled:!1};let h=l.nextRunIndex();N=h;let g=u===0?pe??void 0:a.steps[u].unitEntryUrl,I={width:j.window_size.width,height:j.window_size.height},P=Ce(fe.raw,p.config.variables,p.objective),H=jt({step:p,decision:b,chrome:ie,auth:c,sessionId:l.sessionId,runIndex:h,sessionDir:l.sessionDir,windowSize:I,forceNavigateUrl:g,sessionContext:l.getContext(),variables:Object.keys(P.variables).length>0?P.variables:void 0,evidence:bt(),investigationAsync:!ae.ownsLifecycle});await ft(P.raw),pr(u);let B=Date.now(),O=null,U=null,S=Je();try{let T=Ct(H,{environment:w});r.register("runner",()=>{(kt()||e.signal?.aborted)&&(K=!0);try{T.cancel()}catch{}}),G?.setRunActive(!0);try{for await(let E of T.events){if(t.onAgentEvent(E),S=Et(S,E),E.type==="step_event"&&E.event==="reasoning"?G?.setStepText(E.detail):E.type==="step_end"&&(E.status==="passed"&&G?.setStepComplete(),Pe&&Pe(E.index,0,E.child_id,typeof E.ordinal=="number"&&E.id?{ordinal:E.ordinal,id:E.id}:void 0)),E.type==="run_end"){O=E;break}if(E.type==="error"){U=E.message??"runner error";break}}if(!ae.ownsLifecycle&&O?.status==="failed")r.deregister("runner"),vt.push({exited:T.exited.then(()=>{}).catch(()=>{}),cancel:()=>{try{T.cancel()}catch{}}});else try{T.cancel()}catch{}if(!O&&!U){let{code:E}=await T.exited;E!==0&&(U=`runner exited with code ${E}`)}}finally{G?.setRunActive(!1),r.cleanup("runner","Replay step complete")}}catch(T){U=T.message}if(K)return{failedAt:u,cancelled:!0};let $=Math.round((Date.now()-B)/1e3),Y=yt(u,h,O,null,U,$);l.recordStepRun({testmdStepIndex:a.steps[u].flatIndex,runIndex:h,totalRunDirs:lt(O,null)}),ht(S,O,h,null,a.steps[u].verifies);let W=!!U||O?.status==="failed";if(ln(u,W?"failed":"ok"),W||!Y)return{failedAt:u,cancelled:!1}}return{failedAt:null,cancelled:!1}}let gr=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
|
|
39
|
+
`),!1;let u=l.sessionId,p=o.onLockConflict??a.rootGlobal.on_lock_conflict??"readonly",b=await Zt({tmsBaseUrl:A.tmsBaseUrl,testId:m.testId,fromCommitId:m.fromCommitId,newCommitId:u,basicAuth:d,onLockConflict:p});if(b==="ok"){_=!0,m.newCommitId=u,l.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:m.testId}),i&&t.onLockState({phase:"acquired",scope:"mid_run"}),rt({baseUrl:Ee(A.tmsBaseUrl),testId:m.testId,auth:Ae(d),lifecycle:r});let h=await cs({resolved:a,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
|
|
40
40
|
`),!0}return l.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})
|
|
41
|
-
`),!1};if(i){let d=o.author===!0;d&&(
|
|
41
|
+
`),!1};if(i){let d=o.author===!0;d&&(Ut(),l.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let{authorBoundary:u,cancelledInPhase:p,shrinkCount:b}=await fn({decisions:m.decisions,forceAuthor:d,hasRetry:o.retry===!0||o.retryCount!==void 0,maxShrinks:o.retryCount!==void 0?parseInt(o.retryCount,10):Le.maxShrinks,runReplayPhase:hs,session:l,accumulator:ue,acquireLockIfNeeded:gr});if(X=b>0,b>0&&(l.log("info","RETRY_TRIGGERED","Retry loop triggered",{shrink_count:b,final_author_boundary:u}),t.onRetryAttempt({shrink_count:b,final_author_boundary:u,complete_reauthor:u===0})),u===0&&b>0&&l.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:b}),!p&&u>=0)for(let h=u;h<a.steps.length&&!e.signal?.aborted;h++){let g=a.steps[h];if(!ue.shouldRunFlatStep(g))continue;pr(h),D=!0,ce.add(a.steps[h].flatIndex);let I=l.nextRunIndex();N=I,await ft(Ce(fe.raw,g.config.variables,g.objective).raw);let P=fr(h,I),H=Date.now(),B=null,O=null,U=null,S=!1,$=0,Y=Je();try{let E=Ct(P,{environment:w,assertionMode:rr,finalValidation:sr});r.register("runner",()=>{(kt()||e.signal?.aborted)&&(K=!0);try{E.cancel()}catch{}}),G?.setRunActive(!0);try{for await(let v of E.events){if(t.onAgentEvent(v),Y=Et(Y,v),v.type==="bifurcation"){let V=v.count??v.flows?.length??0;(v.is_single_flow??V<=1)||(U=v.flows??null,S=!0,$=0)}else if(v.type==="run_start"&&S)$++;else if(v.type==="step_event"&&v.event==="reasoning")G?.setStepText(v.detail);else if(v.type==="step_end"&&(v.status==="passed"&&G?.setStepComplete(),Pe)){let V=S?Math.max(0,$-1):0;Pe(v.index,V,v.child_id,typeof v.ordinal=="number"&&v.id?{ordinal:v.ordinal,id:v.id}:void 0)}if(v.type==="run_end"){B=v;break}if(v.type==="error"){O=v.message??"runner error";break}}try{E.cancel()}catch{}}finally{G?.setRunActive(!1),r.cleanup("runner","Step complete")}}catch(E){O=E.message}let W=Math.round((Date.now()-H)/1e3),T=yt(h,I,B,U,O,W);if(l.recordStepRun({testmdStepIndex:a.steps[h].flatIndex,runIndex:I,totalRunDirs:lt(B,U)}),ht(Y,B,I,U,a.steps[h].verifies),!T||K||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):Le.maxShrinks,h=o.author===!0;h&&(Ut(),l.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let g=h?0:et(m.decisions),I=0,P=null,H=m.decisions.filter(S=>S.kind==="replay").length,B=m.decisions.length-H,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 U={source:n,steps:{total:m.decisions.length,replay:H,author:B},model:x,viewport:{width:j.window_size.width,height:j.window_size.height},chrome:ie.cdpEndpoint??ie.wsEndpoint??"managed",session:l.sessionName??"ephemeral",variables:{count:Object.keys(J.raw).length,secrets:Object.values(J.raw).filter(S=>S.secret).length,names:Object.keys(J.raw)},flags:O,mode:y.mode??"testing"};for(;;){let S=l.snapshot(),$=ue.snapshot(),Y=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}
|
|
42
42
|
reason: replay miss at step ${(P??0)+1}`;process.stderr.write(v+`
|
|
43
|
-
`)}let W=I>=1&&g>0&&P!==null?{startIdx:0,endIdx:P,count:P}:void 0;G?.setRunActive(!0);let T=await
|
|
44
|
-
`);else if(
|
|
45
|
-
`);else if(
|
|
46
|
-
`)),t.onAgentEvent({type:"test_md_evidence_ingest",status:b.ok?"ok":"failed",evidence_id:u.executionId,...b.ok?{}:{stage:b.stage}})}await
|
|
47
|
-
`)),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){l.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:d instanceof Error?d.message:String(d)})}if(
|
|
48
|
-
`)})}return t.onAgentEvent({type:"test_md_done",overall_status:z.overallStatus,duration_s:ge,session_id:l.sessionId,...
|
|
49
|
-
`),x&&(c=void 0,y=void 0,w=void 0);let k=n.resolvedAuth.basicAuth;if(!k){let N=await n.resolvedAuth.resolver.resolve(!0);N?.username&&N?.access_key&&(k={username:N.username,access_key:N.access_key},n.resolvedAuth.basicAuth=k)}let C=!!k,l=!r.local&&C&&y!=null&&w!=null&&c!=null,
|
|
43
|
+
`)}let W=I>=1&&g>0&&P!==null?{startIdx:0,endIdx:P,count:P}:void 0;G?.setRunActive(!0);let T=await Ro({decisions:Y,resolved:a,session:l,accumulator:ue,tuiConfig:j,globalConfig:U,buildStepConfigAt:fr,buildReplayConfig:v=>{let V=m.decisions[v];if(V.kind!=="replay")throw new Error("expected replay decision at index "+v);let te=a.steps[v];return jt({step:te,decision:V,chrome:ie,auth:c,sessionId:l.sessionId,runIndex:l.nextRunIndex(),sessionDir:l.sessionDir,windowSize:{width:j.window_size.width,height:j.window_size.height},forceNavigateUrl:v===0?pe??void 0:te.unitEntryUrl,sessionContext:l.getContext(),variables:So(fe.raw,te.config.variables,te.objective),evidence:bt()})},onAnyAuthorStep:v=>{D=!0,ce.add(a.steps[v].flatIndex)},onCancel:()=>{Q=!0},topBannerModel:x,topBannerAuth:`${k.getActiveProfile()??"no profile"}/${w}`,spawnOpts:{environment:w,mode:y.mode??"testing",assertionMode:rr,finalValidation:sr,log:(v,V,te,St)=>l.log(v,V,te,St)},priorAttemptRollup:W,pushStepLevelDelta:(v,V)=>ft(Ce(fe.raw,v,V).raw),onSequencerStepEnd:(v,V,te,St)=>{let ws=Math.round((Date.now()-St)/1e3),_s=v.hadError?v.reason??"runner error":null,Is=yt(V,te,v.runEnd,v.bifurcationFlows??null,_s,ws);return l.recordStepRun({testmdStepIndex:a.steps[V].flatIndex,runIndex:te,totalRunDirs:lt(v.runEnd,v.bifurcationFlows)}),ht(v.evidence??Je(),v.runEnd,te,v.bifurcationFlows,a.steps[V].verifies),Is},screenshotDispatcher:Pe,onReasoning:v=>G?.setStepText(v),onStepComplete:()=>G?.setStepComplete(),onSpawnStart:v=>{N=v},host:t});if(G?.setRunActive(!1),T.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(T.failedAt===null)break;let E=u({failedAt:T.failedAt,shrinkCount:I,hasRetry:p,maxShrinks:b});if(E.kind==="fail"||!_&&!await gr())break;l.rollback(S),ue.rollback($),E.kind==="complete-reauthor"?g=0:g=E.newAuthorBoundary,I++,X=!0,l.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:I,failed_at:P}),g===0&&l.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:I}),P=T.failedAt}}let z=ue.finalize(),ge=Math.round((Date.now()-ur)/1e3),bs={session:l,resolvedAuth:c,chromeResult:ie,chromeInstance:$e??null,testId:l.testId??null,preparedVariables:J,variableIds:Me,globalContext:lr,localContext:cr,tuiConfig:j,env:w,localMode:!!o.local},hr=!1,br=!1,yr=!1,vr=async(d={})=>{if(!L)return!1;if(ae.ownsLifecycle?hr:yr)return!0;try{let u=await ir(),p=Qt(D)==="replay",b=le(ne(n),".internal","execution.json"),h=le(l.sessionDir,"execution.json"),g=Hr(L.packTestDir,p?[b,h]:[h,b],(S,$,Y,W)=>l.log(S,$,Y,W)),{ids:I,linear:P}=g?Gr(L.packTestDir):{ids:[],linear:!0},{steps:H,tail:B,unjoined:O}=qr(Z.steps,I,p,P);g?O?l.log("warn","SKIPPED_TAIL_UNJOINED","Executed records don't align with the authored blob \u2014 skipped tail withheld",{executed:Z.steps.length,leaves:I.length}):B.length>0&&l.log("info","SKIPPED_TAIL_APPENDED","Unexecuted authored actions recorded as skipped",{count:B.length}):l.log("warn","SKIPPED_TAIL_NO_BLOB","No auteur blob in pack \u2014 unexecuted actions cannot be recorded as skipped",{});let U=await Z.writeResult({steps:[...H,...B],spawns:Ve.length?Ve:[{resultCode:null}],tags:a.rootGlobal.tags,externalIdInput:{execution_id:L.executionId,session_id:l.sessionId,commit_id:p?m.fromCommitId??l.sessionId:l.sessionId,test_id:m.testId??l.testId??void 0,testcase_id:d.testcaseId??m.testcaseId??l.testcaseId??void 0,project_id:F??void 0,folder_id:de??void 0,org_id:l.orgId!=null?String(l.orgId):void 0,session_name:l.sessionName??Te(n),user_name:l.userName??void 0,user_email:l.userEmail??void 0,sharable_link:Tn(re(w).testManagerUiUrl,F,d.testcaseId??m.testcaseId??l.testcaseId,d.shareId)},runnerEnv:Fr({cdpBrowser:u,resolution:mr}),intentEnv:{model:x,platform:"Desktop",platform_type:"web",...ae.ownsLifecycle?{}:{run_kind:Qt(D)}},durationMs:Date.now()-ur,log:(S,$,Y,W)=>l.log(S,$,Y,W)});if(!ae.ownsLifecycle)return await Ur(Z.pack,L.testId,le(l.sessionDir,"tui.log")),yr=!0,l.log("info","EVIDENCE_RESULT_WRITTEN","Member result.yaml written",{execution_id:L.executionId,verdict:U}),!0;if(!br)try{let S=Vr({cwd:process.cwd(),members:[{path:n,verdict:U,executionId:L.executionId,startedAt:new Date().toISOString(),acs:Br(Z.steps),mode:"testmd",local:!!o.local}]});br=!0;for(let $ of S.warnings)l.log("warn","EXEC_SYNC",$,{});S.synced>0&&l.log("info","EXEC_SYNC",`context sync: ${S.synced} fact(s), ${S.superseded} supersession(s)`,{})}catch(S){l.log("warn","EXEC_SYNC",`exec-sync failed: ${S instanceof Error?S.message:String(S)}`,{})}try{let S=Kr(Z.pack,Mr(process.cwd()));S.status==="skipped"&&l.log("warn","EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${S.reason}`,{})}catch(S){l.log("warn","EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(S)})}return await jr({executionId:L.executionId,testId:L.testId,saved:!0,runKind:Qt(D),verdict:U,outputStemDir:ne(n),cwd:s,packDir:Z.pack,tuiLogPath:le(l.sessionDir,"tui.log"),expectStatusDisagrees:(o.bugDetection??j.bug_detection)==="continue",log:(S,$,Y,W)=>l.log(S,$,Y,W),surface:"testmd"}),hr=!0,l.log("info","EVIDENCE_SEALED","Evidence pack sealed",{execution_id:L.executionId,verdict:U}),!0}catch(u){return l.log("warn","EVIDENCE_SEAL_FAILED","Evidence pack seal failed",{error:String(u)}),!1}},Ke=ve&&(_||m.isFirstRun)&&!m.degradedReadonly,ys=async()=>{if(!c.basicAuth)return null;let d=re(w),u=(D||o.push===!0)&&!Q,p=(_||m.isFirstRun)&&!Q&&z.overallStatus==="passed"&&!m.degradedReadonly;l.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:ve,shouldUploadPipeline:Ke,shouldReplaceLocalOutput:u,shouldCommit:p,lockHeld:_,anyAuthorStepRan:D,cancelled:Q,overallStatus:z.overallStatus});let b=Jn({session:l,env:w,auth:c,variables:J,variableIds:Me,projectId:F,folderId:de,totalSteps:z.outcomes.length,totalDuration:ge,screenshotExtMap:xe?.getExtMap(),codeExport:Xn({codeExport:o.codeExport,codeLanguage:o.codeLanguage,skipCodeValidation:o.skipCodeValidation},j.code_export),onProgress:()=>{},log:(g,I,P,H)=>l.log(g,I,P,H),shouldUploadArtifacts:Ke,shouldReplaceLocalOutput:u,shouldCommit:p,isFirstRun:m.isFirstRun,resolvedTest:a,sourcePath:n,stepRunRecords:l.getStepRunRecords(),authoredFlatIdx:[...ce],unitLocks:m.unitLocks,outcomes:z.outcomes,overallStatus:z.overallStatus,fromCommitId:m.fromCommitId,startedISO:Be,durationS:ge,tmsIds:{testId:m.testId??l.testId??void 0,testcaseId:m.testcaseId??l.testcaseId??void 0,projectId:F??void 0,folderId:de??void 0,orgId:l.orgId??void 0,sessionName:l.sessionName??Te(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:X,forceAuthor:o.author===!0,evidence:L&&ae.ownsLifecycle?{executionId:L.executionId,packTestDir:L.packTestDir,sealedPackPath:Z.pack,cwd:s,runIndices:gt,sealFn:vr}:void 0,evidenceRead:L&&!ae.ownsLifecycle?{packTestDir:L.packTestDir,runIndices:gt}:void 0,authoredExecutionPath:D?void 0:le(ne(n),".internal","execution.json")});m.newCommitId!=null&&(b.skipTmsFinalize=!0);let h=new nn(b);return i?await h.execute():await t.runUpload(h,g=>{if(g.testcaseId&&g.shareId&&F)return st(d.testManagerUiUrl,F,g.testcaseId,g.shareId)})};L&&await ir();let oe=await Yn(bs,{performUpload:ys,runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(d,u,p,b)=>l.log(d,u,p,b)},{overallStatus:z.overallStatus,outcomes:z.outcomes,sourcePath:n,title:a.rootTitle,rootSteps:a.rootSteps,startedISO:Be,durationS:ge,localMode:!!o.local,skipLocalWrites:!0}),Sr=await vr({testcaseId:oe.uploadResult?.testcaseId,shareId:oe.uploadResult?.shareId}),wr=o.evidencePublish===!1,_r=ae.ownsLifecycle&&!!L&&!!c.basicAuth&&rs({shouldUploadArtifacts:ve,lockHeld:_,isFirstRun:m.isFirstRun,sealed:Sr,testId:m.testId});if(_r&&wr)l.log("info","EVIDENCE_PUBLISH_SKIPPED","Replay evidence publish skipped (--no-evidence-publish)",{execution_id:L.executionId}),process.stderr.write(`info: evidence publish skipped (--no-evidence-publish)
|
|
44
|
+
`);else if(wr&&(_||m.isFirstRun))process.stderr.write(`note: --no-evidence-publish has no effect on author/commit runs
|
|
45
|
+
`);else if(_r){let d=c.basicAuth,u=L,p=F,b=await ns({controller:new we(A.controllerBaseUrl,{username:d.username,accessKey:d.access_key}),tms:new We(A.tmsBaseUrl,c.resolvedCreds?.username??d.username,c.resolvedCreds?.access_key??d.access_key),testId:m.testId,sessionId:l.sessionId,executionId:u.executionId,sealedPackPath:Z.pack,projectId:p});b.ok?l.log("info","EVIDENCE_INGESTED","Replay evidence uploaded and ingested",{execution_id:u.executionId,project_id:p}):(l.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}
|
|
46
|
+
`)),t.onAgentEvent({type:"test_md_evidence_ingest",status:b.ok?"ok":"failed",evidence_id:u.executionId,...b.ok?{}:{stage:b.stage}})}await Io(n,m,l,z.outcomes,z.overallStatus,Be,ge,oe.uploadResult,j,o,{resolvedAuth:c,tmsBaseUrl:A.tmsBaseUrl},_,Q);try{let d=he(n);if(Qr({shouldUploadPipeline:Ke,uploadSucceeded:!!oe.uploadResult?.success,metaCommitId:d?.commit_id,metaTestId:d?.test_id})){let u=await Pt({sourcePath:n,testId:d.test_id,sessionId:l.sessionId,commitId:d.commit_id,controller:new we(A.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});u.ok?l.log("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:d.commit_id,bytes:u.bytes}):(l.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}
|
|
47
|
+
`)),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){l.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:d instanceof Error?d.message:String(d)})}if(Ke&&oe.uploadResult?.success)for(let d of m.unitLocks)try{let u=he(d.file);if(u?.commit_id!==l.sessionId||!u?.test_id)continue;let p=await Pt({sourcePath:d.file,testId:String(u.test_id),sessionId:l.sessionId,commitId:String(u.commit_id),controller:new we(A.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});p.ok?l.log("info","BUNDLE_SYNC_OK","unit bundle pushed",{commit_id:u.commit_id,path:d.file,bytes:p.bytes}):l.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){l.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync threw",{path:d.file,error:u instanceof Error?u.message:String(u)})}let Ir=re(w),He=oe.uploadResult?.testcaseId,qe=He&&oe.uploadResult?.shareId&&F?st(Ir.testManagerUiUrl,F,He,oe.uploadResult.shareId):void 0,vs=a.unitFiles.filter(d=>d.file!==a.rootPath).map(d=>{let u=a.steps.filter(g=>g.owningFile===d.file),p=u.filter(g=>ce.has(g.flatIndex)).length,h=(d.kind==="test"?he(d.file):null)?.commit_id===l.sessionId;return{path:d.file,kind:d.kind,replayed:u.length-p,authored:p,committed:h,...h?{commit_id:l.sessionId}:{}}}),Rr={overallStatus:z.overallStatus,durationS:ge,decisions:m.decisions,outcomes:z.outcomes,cancelled:Q,retryTriggered:X,lockHeld:_,anyAuthorStepRan:D,isFirstRun:m.isFirstRun,wantsPush:o.push===!0,uploadResult:oe.uploadResult,shouldUploadArtifacts:ve,shouldReplaceLocalOutput:D&&!Q,shouldCommit:(_||m.isFirstRun)&&!Q&&z.overallStatus==="passed"&&!m.degradedReadonly,shareUrl:qe,imports:vs},{buildSummaryEvent:Ss}=await import("./SummaryBox-5G7WULUN.js");if(i?t.onAgentEvent(Ss(Rr)):await t.onSummary(Rr),!i){let d=He&&F?Ln(Ir.testManagerUiUrl,F,He):void 0;await t.onLinks({recordedTestPath:n,outputDir:ne(n),shareableLink:qe,testCaseLink:d,codeExportDir:oe.uploadResult?.codeExportDir})}if(ae.ownsLifecycle&&Z&&Sr){let{offerEvidenceView:d}=await import("./evidence-TZYIOSPG.js");await d({packPath:Z.pack,env:w,isTTY:!i&&!Q&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:u=>process.stderr.write(u+`
|
|
48
|
+
`)})}return t.onAgentEvent({type:"test_md_done",overall_status:z.overallStatus,duration_s:ge,session_id:l.sessionId,...qe?{share_url:qe}:{}}),{overallStatus:z.overallStatus,exitCode:z.overallStatus==="passed"?0:1,outputDir:ne(n),durationS:ge,uploadResult:oe.uploadResult,anyAuthorStepRan:D,resultCode:Or(Ve),...vt.length?{pendingInvestigations:vt}:{}}}function vo(e,t){let r={...e,...t},n=Object.keys(r).length>0?Se(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 Ce(e,t,r){let n={...e,...t??{}};if(Object.keys(n).length===0)return{raw:n,variables:{},objective:r};let s=Se(n,r);return{raw:n,variables:qn(s.variables,s.objective),objective:s.objective}}function So(e,t,r){let n=Ce(e,t,r).variables;return Object.keys(n).length>0?n:void 0}function as(e,t){let r=new Set(ct),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 wo(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function _o(e,t,r,n,s,o){let i=Jr(t);on(t,i);let f=_e(e),a=go(f)?JSON.parse(ls(f,"utf8")):null,c=a?.testcase_id,y=a?.test_id,w=a?.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
|
|
49
|
+
`),x&&(c=void 0,y=void 0,w=void 0);let k=n.resolvedAuth.basicAuth;if(!k){let N=await n.resolvedAuth.resolver.resolve(!0);N?.username&&N?.access_key&&(k={username:N.username,access_key:N.access_key},n.resolvedAuth.basicAuth=k)}let C=!!k,l=!r.local&&C&&y!=null&&w!=null&&c!=null,K=l&&(Xe(i)||A);if(A&&!l)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
50
50
|
`),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:C,canLock:l,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(R&&!l)return process.stderr.write(`error: --retry requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
51
51
|
`),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:C,canLock:l,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(x&&!C)return process.stderr.write(`error: --author requires authenticated credentials for the TMS API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
52
|
-
`),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:C,canLock:l,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};let m=null,_=!1,D=!1;if(
|
|
53
|
-
`),m=null,_=!1,D=!0}}return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:m,isFirstRun:c==null,hasAuth:C,canLock:l,lockAcquired:_,unitLocks:ce,degradedReadonly:D}}async function
|
|
52
|
+
`),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:C,canLock:l,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};let m=null,_=!1,D=!1;if(K){m=s;let X=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",N=await Zt({tmsBaseUrl:n.tmsBaseUrl,testId:y,fromCommitId:w,newCommitId:m,basicAuth:k,onLockConflict:X});if(N==="ok")_=!0,rt({baseUrl:Ee(n.tmsBaseUrl),testId:y,auth:Ae(k),lifecycle:o});else{if(N==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:C,canLock:l,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};m=null,D=!0}}let ce=[],Q=K&&!_;if(!r.local&&C&&!Q){let X=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",N=await cs({resolved:t,decisions:i,tmsBaseUrl:n.tmsBaseUrl,newCommitId:m??s,basicAuth:k,mode:X,lifecycle:o});if(N.outcome==="ok")ce=N.locks;else{if(_&&y&&w&&m&&await Jt(n,y,w,m),be(),N.outcome==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:c==null,hasAuth:C,canLock:l,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)
|
|
53
|
+
`),m=null,_=!1,D=!0}}return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:m,isFirstRun:c==null,hasAuth:C,canLock:l,lockAcquired:_,unitLocks:ce,degradedReadonly:D}}async function cs(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=he(n.file);if(!s?.test_id||!s?.commit_id)continue;let o=await Zt({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)}),rt({baseUrl:Ee(e.tmsBaseUrl),testId:String(s.test_id),auth:Ae(e.basicAuth),lifecycle:e.lifecycle});continue}for(let i of r)await De({baseUrl:Ee(e.tmsBaseUrl),testId:i.testId,body:{commitId:e.newCommitId,fromCommitId:i.fromCommitId},auth:Ae(e.basicAuth)}),be(i.testId);return{outcome:o,locks:[]}}return{outcome:"ok",locks:r}}function Ee(e){return`${e}/kane-cli/v1`}function Ae(e){return{username:e.username,accessKey:e.access_key}}async function Zt(e){let t=Ee(e.tmsBaseUrl),r=Ae(e.basicAuth),n={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},s=await Nt(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}
|
|
54
54
|
`),"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)
|
|
55
55
|
`),"abort";if(e.onLockConflict==="wait"){if(s.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
|
|
56
56
|
`),"abort";for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
|
|
57
|
-
`),await new Promise(a=>setTimeout(a,3e4));let f=await
|
|
57
|
+
`),await new Promise(a=>setTimeout(a,3e4));let f=await Nt(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
|
|
58
58
|
`),"abort"}}return process.stderr.write(`[lock] ${i} \u2014 running in readonly mode (no commit)
|
|
59
|
-
`),"readonly"}async function
|
|
60
|
-
`),await
|
|
61
|
-
`)}async function
|
|
59
|
+
`),"readonly"}async function Io(e,t,r,n,s,o,i,f,a,c,y,w,A){let{decisions:R,testId:x,testcaseId:k,fromCommitId:C,newCommitId:l}=t;if(!(s==="passed")||A){let m=A?"cancelled":s;w&&x&&C&&l&&(process.stderr.write(`[lock] run not committed (${m}); discarding playground lock
|
|
60
|
+
`),await Jt(y,x,C,l));for(let _ of t.unitLocks)await Jt(y,_.testId,_.fromCommitId,l??r.sessionId);be();return}be()}async function Jt(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 De({baseUrl:Ee(e.tmsBaseUrl),testId:t,body:{commitId:n,fromCommitId:r},auth:Ae(s)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
|
|
61
|
+
`)}async function Ro(e){let t=null,r=!1,n=0,s=-1,o=-1,i=0,f=async a=>{if(a&&a.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??{},C={};for(let[l,K]of Object.entries(k))K!=null&&l!=="variables"&&l!=="assurance"&&(C[l]=K);return{config:R,banner:{stepLabel:`Step ${w+1}/${e.decisions.length}`,objective:wo(y.objective,100)},mode:c.kind,modeReason:x,perStepOverrides:Object.keys(C).length>0?C:void 0}};return await e.host.runSteps({topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:f,onStepEnd:a=>(a.status==="failed"&&s>=0&&e.decisions[s]?.kind==="replay"&&(t=s),e.onSequencerStepEnd(a,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{Rn as a,kn as b,ot as c,mi as d,jn as e,xn as f,Ko as g,_n as h,In as i,Mt as j,Cn as k,En as l,st as m,Tn as n,Ln as o,Fn as p,Nn as q,qn as r,Gn as s,zn as t,Vt as u,Jn as v,Xn as w,es as x,ts as y,Yt as z,ya as A,ns as B,Qt as C,_l as D,vo as E,Ce as F,So as G,as as H};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import s from"os";import t from"path";function r(){return t.join(s.homedir(),".testmuai","kaneai","assurance")}function i(n){return t.join(r(),n??"no-context")}function g(n,o,e){return t.join(i(n),"logs",`${o}-${e}.log`)}function c(n){return t.join(i(n),"manifest.ndjson")}function d(){return t.join(r(),"telemetry-deadletter.ndjson")}function f(n){return t.join(r(),`identity-${n}.json`)}function j(){return t.join(r(),"bindings.json")}export{g as a,c as b,d as c,f as d,j as e};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as n}from"./chunk-RZ4F3BHX.js";import{a as c}from"./chunk-
|
|
2
|
+
import{a as n}from"./chunk-RZ4F3BHX.js";import{a as c}from"./chunk-RH4GCEFX.js";import{v as s,w as a}from"./chunk-2KS2YRIS.js";import{createHash as h,randomBytes as g}from"crypto";var l=class{authBaseUrl;consentUrl;constructor(t="prod"){let e=c(t);this.authBaseUrl=e.authBaseUrl,this.consentUrl=e.consentUrl}static generatePkce(){let t=g(96).toString("base64url").slice(0,128),e=h("sha256").update(t).digest("base64url");return[t,e]}buildAuthorizationUrl(t,e,r,o){let i=new URLSearchParams({response_type:"code",client_id:t,redirect_uri:o,scope:a,code_challenge:e,code_challenge_method:"S256",state:r});return`${this.consentUrl}/oauth2?${i.toString()}`}async registerClient(t){let e=await n(`${this.authBaseUrl}/oauth2/register`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_name:s,redirect_uris:[t],grant_types:["authorization_code"],response_types:["code"],client_type:"public",application_type:"native"})});if(!e.ok)throw new Error(`DCR failed: ${e.status} ${await e.text()}`);return e.json()}async exchangeCode(t,e,r,o){let i=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"authorization_code",code:t,redirect_uri:o,client_id:e,code_verifier:r})});if(!i.ok)throw new Error(`Token exchange failed: ${i.status}`);return i.json()}async refreshToken(t,e){let r=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:t,client_id:e})});if(!r.ok)throw new Error(`Token refresh failed: ${r.status}`);return r.json()}async revokeToken(t,e,r="access_token"){await n(`${this.authBaseUrl}/oauth2/revoke`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:t,token_type_hint:r,client_id:e})})}async validateToken(t){let e=new AbortController,r=setTimeout(()=>e.abort(),1e4);try{let o=await n(`${this.authBaseUrl}/api/user`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/json","Content-Type":"application/json"},signal:e.signal});return clearTimeout(r),o.ok}catch{return clearTimeout(r),!1}}};export{l as a};
|