@testmuai/kane-cli 0.7.2 → 0.8.2
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-B3ULYDYC.js +8 -0
- package/dist/{ChromeProfilePicker-DGDWGCZD.js → ChromeProfilePicker-T77E7ZSC.js} +1 -1
- package/dist/{CliFeedbackPrompt-SYCZXSME.js → CliFeedbackPrompt-FQ2XV5DZ.js} +1 -1
- package/dist/{CliUploadProgress-VDEAKXJY.js → CliUploadProgress-TZ55LONO.js} +1 -1
- package/dist/ConfigView-WWQMH36G.js +2 -0
- package/dist/EvidenceViewOffer-L5FVBQNK.js +2 -0
- package/dist/FolderPicker-6Z3CYSHF.js +2 -0
- package/dist/{HelpView-ON6BFGJM.js → HelpView-XXPCPJNF.js} +1 -1
- package/dist/{InfoBox-B23NZ6IG.js → InfoBox-SHBRHQX5.js} +1 -1
- package/dist/{LinksBox-TI26VFFH.js → LinksBox-ENNF7TDJ.js} +1 -1
- package/dist/{ProfilesView-CRO5AH3H.js → ProfilesView-CNF2FXF3.js} +1 -1
- package/dist/{ProjectPicker-3N7LJOXU.js → ProjectPicker-PVPLS642.js} +1 -1
- package/dist/{SaveSessionPrompt-UTOEC5AW.js → SaveSessionPrompt-4QP4GNGO.js} +1 -1
- package/dist/SingleShotApp-M3HNSUMZ.js +2 -0
- package/dist/{SummaryBox-JK64EKC2.js → SummaryBox-HYNINDNN.js} +1 -1
- package/dist/TestMdRunView-ISOVQ7YP.js +2 -0
- package/dist/{WhoamiView-6QSLPNF6.js → WhoamiView-NN2HOK6H.js} +1 -1
- package/dist/adbkit-apkreader-ORZBGCJQ.js +184 -0
- package/dist/app-client-ZCCNE3RV.js +2 -0
- package/dist/app-download-5UJMXPF3.js +2 -0
- package/dist/{auth-IKFVW3NX.js → auth-QKBTOWQX.js} +1 -1
- package/dist/{bind-KCUSVJXG.js → bind-LVGP5KHO.js} +3 -3
- package/dist/{bootstrap-NFYYRGGR.js → bootstrap-RUJBMB2P.js} +1 -1
- package/dist/bridge-QDPBIIOW.js +2 -0
- package/dist/{changelog-AAH2ZBYO.js → changelog-HBPBPR2O.js} +1 -1
- package/dist/{chat-committer-UUC6JTRJ.js → chat-committer-ZWWCLJFD.js} +1 -1
- package/dist/{chat-controller-T2FAI55V.js → chat-controller-R4THYYPU.js} +1 -1
- package/dist/chunk-2E3ZWGIK.js +12 -0
- package/dist/chunk-2KH2JUGL.js +13 -0
- package/dist/{chunk-VWKVUOXU.js → chunk-2TYCUPCN.js} +1 -1
- package/dist/{chunk-GYNTNKNB.js → chunk-2ZZDNPFN.js} +1 -1
- package/dist/chunk-3654GK6O.js +66 -0
- package/dist/{chunk-M6FKJKC6.js → chunk-3NHO5R4P.js} +3 -3
- package/dist/{chunk-SFII7HPP.js → chunk-4II6VDXG.js} +1 -1
- package/dist/chunk-4J6DQFPC.js +4 -0
- package/dist/chunk-4JOD47QI.js +2 -0
- package/dist/{chunk-5FJJJNJK.js → chunk-4U4OSOA4.js} +1 -1
- package/dist/{chunk-QIGPXYMF.js → chunk-56PAQAX5.js} +6 -6
- package/dist/chunk-5NIYYD7O.js +2 -0
- package/dist/chunk-5SNT2MK5.js +2 -0
- package/dist/chunk-6IA6QMPH.js +2 -0
- package/dist/chunk-6J5T5FEY.js +2 -0
- package/dist/chunk-6N726QLP.js +349 -0
- package/dist/chunk-7F2ZV46B.js +2 -0
- package/dist/{chunk-7OYZR6JA.js → chunk-7S3JZ6FQ.js} +1 -1
- package/dist/chunk-A2SQD2AY.js +4 -0
- package/dist/chunk-AJQT4IWZ.js +2 -0
- package/dist/chunk-AN2ZPHCE.js +2 -0
- package/dist/{chunk-7QJ75SYR.js → chunk-ATGRRKEV.js} +2 -2
- package/dist/chunk-AXTPNZPX.js +2 -0
- package/dist/{chunk-ZRASQ63J.js → chunk-BKVDAZEJ.js} +1 -1
- package/dist/{chunk-2WVKOZ6W.js → chunk-BPMSNGXQ.js} +1 -1
- package/dist/chunk-BRIEBB2U.js +2 -0
- package/dist/chunk-BSYX225I.js +2 -0
- package/dist/{chunk-B5RS2XZU.js → chunk-CAMO26QU.js} +3 -3
- package/dist/chunk-DPUV6OSP.js +2 -0
- package/dist/chunk-ECZMYPLJ.js +19 -0
- package/dist/chunk-EYOCNMUM.js +2 -0
- package/dist/{chunk-DZPGG4S6.js → chunk-FNS2EAA5.js} +2 -2
- package/dist/{chunk-VMM4LC4V.js → chunk-GNIFMQNK.js} +3 -3
- package/dist/chunk-GUVM6SZF.js +2 -0
- package/dist/{chunk-ZBOWFJB2.js → chunk-HFFPPCZO.js} +2 -2
- package/dist/chunk-HRZOFTV7.js +4 -0
- package/dist/chunk-HWH3UYD6.js +4 -0
- package/dist/{chunk-JKM2PUHI.js → chunk-I7RQS65W.js} +1 -1
- package/dist/chunk-IUEEFGEW.js +11 -0
- package/dist/{chunk-KWIK22R6.js → chunk-IV76ZXCY.js} +1 -1
- package/dist/{chunk-HYSFJSIG.js → chunk-IZ2FJYHG.js} +1 -1
- package/dist/{chunk-4NFCAGRK.js → chunk-J7KT44IC.js} +1 -1
- package/dist/{chunk-VOOPWFHW.js → chunk-JEDLXUO5.js} +1 -1
- package/dist/chunk-JGOZUAMC.js +2 -0
- package/dist/{chunk-4LTXE3IX.js → chunk-JHKM7W5X.js} +1 -1
- package/dist/chunk-JJN76EXE.js +2 -0
- package/dist/{chunk-EOLFTMWF.js → chunk-JUVQQP42.js} +1 -1
- package/dist/chunk-KKRNTSLL.js +6 -0
- package/dist/chunk-KRKGZ2ZW.js +47 -0
- package/dist/{chunk-YTHQNN2L.js → chunk-LDCLZR2U.js} +1 -1
- package/dist/chunk-LQQXPY5B.js +4 -0
- package/dist/{chunk-UC7MNPIN.js → chunk-LVCY5IYI.js} +1 -1
- package/dist/{chunk-O75ZHGJG.js → chunk-LVN6VHFN.js} +1 -1
- package/dist/chunk-MMBBQ4OZ.js +2 -0
- package/dist/chunk-MSGW4JDG.js +2 -0
- package/dist/{chunk-VLWMMOMF.js → chunk-MTIC65NK.js} +1 -1
- package/dist/chunk-NHBYZCSX.js +4 -0
- package/dist/chunk-NRUD56FY.js +7 -0
- package/dist/chunk-NXFAEDHV.js +26 -0
- package/dist/{chunk-OIYGGEUL.js → chunk-NXXJ56QA.js} +1 -1
- package/dist/{chunk-AXTGYOMK.js → chunk-O3AHFP3K.js} +1 -1
- package/dist/chunk-OAVPM6YJ.js +2 -0
- package/dist/{chunk-FBHRBFHP.js → chunk-OJTCIZDK.js} +1 -1
- package/dist/{chunk-JPWLGHPM.js → chunk-OOEPLMKA.js} +1 -1
- package/dist/{chunk-VT54ARGE.js → chunk-PXCMEI73.js} +1 -1
- package/dist/{chunk-APPYQZFK.js → chunk-R4UCBA5R.js} +1 -1
- package/dist/chunk-RKXHVP2Z.js +2 -0
- package/dist/{chunk-AJ56AMT6.js → chunk-RN4PKQFR.js} +1 -1
- package/dist/chunk-RUCSRS4C.js +5 -0
- package/dist/chunk-TAOHYWEO.js +2 -0
- package/dist/chunk-TZXXJWHA.js +2 -0
- package/dist/{chunk-VRLUNZAK.js → chunk-U5GHOGLM.js} +1 -1
- package/dist/chunk-UJZZDPDY.js +2 -0
- package/dist/{chunk-VHZ4S57N.js → chunk-UODLRQQ4.js} +1 -1
- package/dist/chunk-VK3NU742.js +21 -0
- package/dist/{chunk-FDIPQRX4.js → chunk-VPRNGWIY.js} +1 -1
- package/dist/{chunk-RDNFVZEB.js → chunk-WOEQDUJ6.js} +1 -1
- package/dist/chunk-WQPQNL4S.js +2 -0
- package/dist/{chunk-SL6PCVM2.js → chunk-WV27D55O.js} +1 -1
- package/dist/{chunk-2WFZIQ62.js → chunk-WVCH66YH.js} +1 -1
- package/dist/{chunk-PLOWZLG5.js → chunk-YCLG3T5E.js} +2 -2
- package/dist/chunk-YGMC3FGJ.js +26 -0
- package/dist/{chunk-5SXMV66P.js → chunk-YHYTCENI.js} +1 -1
- package/dist/{chunk-KQZA2QSC.js → chunk-YSSYT5F5.js} +1 -1
- package/dist/{chunk-OR6MCL6Z.js → chunk-YTDSQAYN.js} +1 -1
- package/dist/{chunk-XUS4WKDS.js → chunk-ZEDAPY7M.js} +1 -1
- package/dist/{chunk-F7ISS545.js → chunk-ZGBSGZZM.js} +1 -1
- package/dist/chunk-ZI6UIJUN.js +11 -0
- package/dist/{config-CWZV6XPT.js → config-RLDXM5ZH.js} +1 -1
- package/dist/{controller-client-RD2YEMAH.js → controller-client-OB4WD2C4.js} +1 -1
- package/dist/{cover-cmd-NWIRJY5Z.js → cover-cmd-HDZZWJXG.js} +1 -1
- package/dist/{credentials-YHTJGKEO.js → credentials-CALNKQMN.js} +1 -1
- package/dist/deps-bundle-GVHIMZ5E.js +2 -0
- package/dist/deps-resolve-T6P4EACP.js +2 -0
- package/dist/{dispatch-WVNXB7AD.js → dispatch-ECUEAMXS.js} +1 -1
- package/dist/doctor-SIBHJVGC.js +2 -0
- package/dist/docx-convert-JMUMT5C4.js +2 -0
- package/dist/evidence-ZVQHPELX.js +2 -0
- package/dist/evolve-cmd-JGCFTXWA.js +2 -0
- package/dist/exec-P2IKJRRR.js +2 -0
- package/dist/exit-manager-3FVBTNYR.js +2 -0
- package/dist/{explain-cmd-IZEHWZV5.js → explain-cmd-3GEKR7O5.js} +1 -1
- package/dist/{explain-cmd-75MCF2ZV.js → explain-cmd-EX24XKD6.js} +1 -1
- package/dist/extract-bind-EXW32RUY.js +10 -0
- package/dist/{extract-cmd-ZRYMJ6IC.js → extract-cmd-7IOLJJCL.js} +2 -2
- package/dist/gaps-cmd-WPCJPLGB.js +3 -0
- package/dist/{generate-headless-D6BISWDC.js → generate-headless-U4GTG234.js} +3 -3
- package/dist/host-7GZPBA74.js +2 -0
- package/dist/index.js +84 -67
- package/dist/ingest-cmd-YYNAKI2U.js +2 -0
- package/dist/interactive-bind-Y65XV4Y5.js +25 -0
- package/dist/{lifecycle-cmd-EQSFAZG6.js → lifecycle-cmd-HO5VL7AM.js} +1 -1
- package/dist/{list-cmd-IRJSUCM5.js → list-cmd-N4KMA34H.js} +1 -1
- package/dist/list-commands-3EROWJWV.js +2 -0
- package/dist/login-flow-TRINUSBB.js +2 -0
- package/dist/{maintenance-cmd-MVFA6H74.js → maintenance-cmd-6XSVO6FO.js} +1 -1
- package/dist/mobile-prompts-TP3ODM5M.js +2 -0
- package/dist/persist-recorded-session-EHYT3PVN.js +3 -0
- package/dist/pipeline-5GOS2KV2.js +2 -0
- package/dist/prepare-target-BUEOZVJV.js +2 -0
- package/dist/reconcile-cmd-TY3MWZL3.js +2 -0
- package/dist/reconcile-deps-6KTJHBMJ.js +4 -0
- package/dist/reconcile-engine-O7QEZVX6.js +2 -0
- package/dist/{recording-banner-76GCIPUN.js → recording-banner-BWWFOJCR.js} +1 -1
- package/dist/registry-KXEDLM6X.js +2 -0
- package/dist/{require-project-folder-ACRDP5ZB.js → require-project-folder-CXDRRWEQ.js} +1 -1
- package/dist/resolve-run-intent-PZXEQTHC.js +7 -0
- package/dist/{resolver-SRPCFW7P.js → resolver-FTU5KO7H.js} +1 -1
- package/dist/{review-cmd-L3V5UP5T.js → review-cmd-DQRKQUMG.js} +1 -1
- package/dist/run-CMFBSYWF.js +2 -0
- package/dist/run-WKHPVWUN.js +2 -0
- package/dist/{run-test-md-KEHSRMCM.js → run-test-md-7HGOZJSU.js} +3 -3
- package/dist/session-items-2ATN7VXG.js +2 -0
- package/dist/session-target-UWROGOCY.js +2 -0
- package/dist/{sessions-cmd-ZVYGSRJ3.js → sessions-cmd-ZZIZN2VB.js} +1 -1
- package/dist/{skill-installer-HBN3A35K.js → skill-installer-QNUDLGPD.js} +1 -1
- package/dist/spawner-DQZRJIE6.js +2 -0
- package/dist/{structured-answers-A43Q25CZ.js → structured-answers-5EY2AZN7.js} +1 -1
- package/dist/tcg-generate-XKSTMCOG.js +2 -0
- package/dist/testmd-actions-IFRW7NGG.js +2 -0
- package/dist/{tms-client-VD3B3SMU.js → tms-client-V3TR4QW3.js} +1 -1
- package/dist/token-refresh-FP6JFLXB.js +2 -0
- package/dist/types-6E2HTDKJ.js +2 -0
- package/dist/{validate-basic-ZGWPBYB6.js → validate-basic-3CNUDDH7.js} +1 -1
- package/dist/{verdicts-SCETLY5J.js → verdicts-NYCSBWUC.js} +1 -1
- package/dist/{version-check-CJWKDAXV.js → version-check-7TSAVA6V.js} +1 -1
- package/dist/{view-cmd-SOVM64L2.js → view-cmd-KPJTP4DI.js} +1 -1
- package/dist/walk-session-AINBHZKB.js +2 -0
- package/dist/{with-telemetry-E7QWPGL6.js → with-telemetry-3DL7ZEZL.js} +1 -1
- package/package.json +12 -6
- package/dist/ChatSurface-E7QKI4LA.js +0 -8
- package/dist/ConfigView-HPKRQXMC.js +0 -2
- package/dist/EvidenceViewOffer-F5YG54OC.js +0 -2
- package/dist/FolderPicker-4NSDXQY5.js +0 -2
- package/dist/SingleShotApp-Y3YDFQSD.js +0 -2
- package/dist/TestMdRunView-O6JTHV5W.js +0 -2
- package/dist/bridge-JSKEO4N3.js +0 -2
- package/dist/chunk-23VPUWBD.js +0 -23
- package/dist/chunk-2WRBTLFN.js +0 -13
- package/dist/chunk-53IBTIL3.js +0 -12
- package/dist/chunk-5WXGMXGA.js +0 -26
- package/dist/chunk-5ZQZOVWY.js +0 -4
- package/dist/chunk-74HTO7K3.js +0 -11
- package/dist/chunk-AECMF3T2.js +0 -8
- package/dist/chunk-AFBKGZFG.js +0 -2
- package/dist/chunk-BXYWX4J3.js +0 -2
- package/dist/chunk-C3T7TKAC.js +0 -349
- package/dist/chunk-DBKNJRJG.js +0 -2
- package/dist/chunk-H32GM5G4.js +0 -2
- package/dist/chunk-J5FBU425.js +0 -62
- package/dist/chunk-KCCSWEGA.js +0 -4
- package/dist/chunk-MK7JUOYV.js +0 -6
- package/dist/chunk-ORQNKZ2Z.js +0 -5
- package/dist/chunk-OUJQVBUT.js +0 -7
- package/dist/chunk-QOFZSHSC.js +0 -47
- package/dist/chunk-RKWJG3WW.js +0 -19
- package/dist/chunk-STVP2XHO.js +0 -2
- package/dist/chunk-VFII6C46.js +0 -2
- package/dist/chunk-VGFTNLQQ.js +0 -2
- package/dist/chunk-WAOCHXJ5.js +0 -2
- package/dist/chunk-ZUGCHQFC.js +0 -2
- package/dist/docx-convert-CHLJUTFH.js +0 -2
- package/dist/evidence-IVDNXWPL.js +0 -2
- package/dist/evolve-cmd-XBX4SX5H.js +0 -2
- package/dist/exit-manager-XZL4KIJU.js +0 -2
- package/dist/extract-bind-5OWELRME.js +0 -10
- package/dist/gaps-cmd-XBRXKXDL.js +0 -3
- package/dist/ingest-cmd-YTGOICTC.js +0 -2
- package/dist/interactive-bind-XSRD36MO.js +0 -25
- package/dist/list-commands-RCYHJ5Y3.js +0 -2
- package/dist/login-flow-PYAPYCPY.js +0 -2
- package/dist/persist-recorded-session-DTYCLXTQ.js +0 -3
- package/dist/pipeline-MXFOD6ES.js +0 -2
- package/dist/reconcile-cmd-EG6BOU3A.js +0 -2
- package/dist/reconcile-deps-HTT6IPHT.js +0 -4
- package/dist/reconcile-engine-JQNXALNY.js +0 -2
- package/dist/run-GMZCDRDD.js +0 -2
- package/dist/run-TFRWPGXP.js +0 -2
- package/dist/spawner-GC5CFAJ7.js +0 -2
- package/dist/tcg-generate-V7YFNC5O.js +0 -2
- package/dist/testmd-actions-MNDOO76O.js +0 -2
- package/dist/token-refresh-3UYMCYG3.js +0 -2
- package/dist/walk-session-YUYRULPY.js +0 -2
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{c as $t,d as vn}from"./chunk-3NHO5R4P.js";import{a as Bt,b as wn,c as ct,d as ut,e as Sn,f as Vt,g as In,h as kn}from"./chunk-NXXJ56QA.js";import{a as Me,b as oe,e as Ae,f as Ft,k as gn,n as hn,q as we,r as Mt,u as yn}from"./chunk-VK3NU742.js";import{a as $e,b as _n}from"./chunk-C5UNZ6ZY.js";import{c as Rn}from"./chunk-S3DAAAE5.js";import{c as Cn}from"./chunk-RUCSRS4C.js";import{d as bn}from"./chunk-2YQ6TW77.js";import{c as En}from"./chunk-5DT7PIGB.js";import{$ as pn,A as nn,B as sn,D as on,E as an,G as dn,H as cn,I as un,V as mn,_ as fn,h as dt,u as en,v as tn,z as rn}from"./chunk-2KH2JUGL.js";import{a as ln}from"./chunk-CH273NAE.js";import{b as Ee}from"./chunk-WV27D55O.js";import{a as Qr,c as lt,d as Nt}from"./chunk-KKRNTSLL.js";import{a as at,c as Wr,d as Jr,e as jt}from"./chunk-NRUD56FY.js";import{c as Zr,e as Xr}from"./chunk-6IA6QMPH.js";import{a as Ot,b as Ut}from"./chunk-R5T4RLF5.js";import{a as Yr}from"./chunk-2YEHV2CX.js";import{d as Hr,h as qr}from"./chunk-GUVM6SZF.js";import{g as Gr,h as zr}from"./chunk-CAMO26QU.js";import{a as it}from"./chunk-BPMSNGXQ.js";import{i as $r,k as Dt,l as Br,m as ot,n as Vr,o as Kr}from"./chunk-56PAQAX5.js";import{a as ee}from"./chunk-LVN6VHFN.js";import{a as Ce}from"./chunk-DPUV6OSP.js";import{a as st,b as Mr}from"./chunk-NLCCBXXV.js";import{a as z}from"./chunk-RZ4F3BHX.js";import{a as Nr}from"./chunk-E47GFYXA.js";import{a as rt,c as Pt,j as Fr,k as nt,l as Tt,m as Lt}from"./chunk-7F2ZV46B.js";import{join as ue,basename as Ps}from"path";import{existsSync as jo,readFileSync as Ls}from"fs";function An(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let n=e.steps[r],s=t[r],o=" ".repeat(n.trace.length-1),i=`step ${n.flatIndex}`;s.kind==="replay"?process.stderr.write(`[replay-trace] ${o}${i}: REPLAY (would skip; v1 always authors)
|
|
3
|
+
`):process.stderr.write(`[replay-trace] ${o}${i}: AUTHOR (${s.reason})
|
|
4
|
+
`)}}function xe(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function xn(e,t){let r=e===0?"(none)":`0..${e-1}`,n=e>=t?"(none)":`${e}..${t-1}`;xe(`[replay-trace] phase: replay ${r}, author ${n}
|
|
5
|
+
`)}function Pn(e,t){xe(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
|
|
6
|
+
`)}function Tn(e,t,r){xe(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
|
|
7
|
+
`)}function Ln(e,t){xe(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
|
|
8
|
+
`)}function Kt(){xe(`[replay-trace] force-author (--author) \u2014 walker bypassed
|
|
9
|
+
`)}function Dn(e){xe(`[replay-trace] cancelled at step ${e}
|
|
10
|
+
`)}import{join as On}from"path";function Ht(e){let t=Sn(e.decision),r={objective:e.step.objective,model:"v16-alpha",width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,mode:"replay",replay:{recording_path:t[0],...t.length>1?{recording_paths:t}:{},step_label:e.step.objective,...e.investigationAsync?{investigation:"async"}:{}},screenshot_dir:e.evidence?On(e.sessionDir,"scratch",String(e.runIndex)):On(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.device&&(r.device=e.device),e.evidence&&(r.evidence=dt(e.evidence.packTestDir,e.evidence.ordinalOffset)),r}async function Un(e){let t=e.forceAuthor?0:ut(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,Dn(i.failedAt??0),{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};if(i.failedAt===null)return{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};let p=_n({failedAt:i.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(p.kind==="fail")return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.archiveAttempt&&await e.archiveAttempt(),e.session.rollback(s),e.accumulator.rollback(o),p.kind==="complete-reauthor")return Ln(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:n,shrinkCount:r};r++,Tn(r,$e.maxShrinks,p.newAuthorBoundary),t=p.newAuthorBoundary}}var qs=15e3,qt=3,jn=[500,1e3];async function Gt(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 mt(t,{from_commit_id:e.fromCommitId,new_commit_id:e.newCommitId},e.auth);return r.ok?{ok:!0,sessionExpiresAt:V(r.body,"session_expires_at")??""}:{ok:!1,...Gs(r)}}function Gs(e){let t=V(e.body,"error")??V(e.body,"code")??"",r=V(e.body,"message")??V(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 Fn(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await mt(t,void 0,e.auth);return r.ok?{ok:!0,sessionExpiresAt:V(r.body,"session_expires_at")??""}:{ok:!1,expired:r.status===404,httpStatus:r.status,message:V(r.body,"message")??V(r.body,"detail")??r.text??`HTTP ${r.status}`}}async function zt(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 mt(t,r,e.auth);return n.ok?{ok:!0,testId:V(n.body,"test_id")??e.testId,testcaseId:V(n.body,"testcase_id")??"",projectId:V(n.body,"project_id"),isTestCaseDeleted:typeof n.body?.is_test_case_deleted=="boolean"?n.body.is_test_case_deleted:void 0}:{ok:!1,...zs(n)}}function zs(e){let t=V(e.body,"error")??V(e.body,"code")??"",r=V(e.body,"message")??V(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 Be(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 mt(t,r,e.auth);return n.ok?{ok:!0}:{ok:!1,reason:V(n.body,"error")??"other",httpStatus:n.status,message:V(n.body,"message")??V(n.body,"detail")??n.text??`HTTP ${n.status}`}}async function mt(e,t,r){let n=null;for(let s=1;s<=qt;s++){let o=new AbortController,i=setTimeout(()=>o.abort(),qs);try{let p=await z(e,{method:"POST",headers:{Authorization:st(r.username,r.accessKey),"Content-Type":"application/json",Accept:"application/json"},...t!==void 0?{body:JSON.stringify(t)}:{},signal:o.signal});clearTimeout(i);let l=await p.text(),c=null;if(l)try{c=JSON.parse(l)}catch{}let y=p.status>=500||p.status===408||p.status===429;if(p.ok||!y)return{ok:p.ok,status:p.status,body:c,text:l};if(s<qt){await Nn(jn[s-1]??1e3);continue}return{ok:!1,status:p.status,body:c,text:l}}catch(p){if(clearTimeout(i),n=p,s<qt){await Nn(jn[s-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:n?.message??"exhausted retries"}}function Nn(e){return new Promise(t=>setTimeout(t,e))}function V(e,t){if(typeof e!="object"||e===null)return;let r=e[t];return typeof r=="string"?r:void 0}var Ys=60*1e3,Mn="lock-heartbeat",ge=new Map,Ve=null,Ws={register:(e,t)=>ot(e,t),deregister:e=>Vr(e),cleanup:(e,t)=>Kr(e,t),remoteLogger:null};function $n(e){if(e!==void 0){let t=ge.get(e);t!==void 0&&(clearInterval(t),ge.delete(e));return}for(let t of ge.values())clearInterval(t);ge.clear()}function ft(e){if(ge.has(e.testId))return;let t=e.lifecycle??Ws,r=setInterval(async()=>{let n=await Fn({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
|
+
`)}},Ys);ge.set(e.testId,r),Ve===null&&(Ve=t,t.register(Mn,()=>$n()))}function Se(e){ge.size!==0&&($n(e),ge.size===0&&Ve!==null&&(Ve.deregister(Mn),Ve=null))}import{readFileSync as Bn,readdirSync as Vn,existsSync as _e,promises as Yt}from"fs";import{join as ie}from"path";async function Js(e,t){let r=ie(e,"steps",`${t.ordinal}-${t.id}`),n,s=null,o=[];try{n=JSON.parse(await Yt.readFile(ie(r,"step.json"),"utf8")),s=n.action_id??null,Array.isArray(n.analyze_action_ids)&&(o=n.analyze_action_ids.filter(i=>typeof i=="string"))}catch{}if(typeof n?.screenshot=="string"&&/^screenshot\.(?:png|jpg)$/i.test(n.screenshot)){let i=n.screenshot;try{return{png:await Yt.readFile(ie(r,i)),filename:i,actionId:s,analyzeActionIds:o}}catch{}}for(let i of["screenshot.png","screenshot.jpg"])try{return{png:await Yt.readFile(ie(r,i)),filename:i,actionId:s,analyzeActionIds:o}}catch{}return null}function ci(){let e=[];return{track:t=>{e.push(t.catch(()=>{}))},settle:async()=>{await Promise.all(e)}}}async function Kn(e,t,r,n){try{let s=await Js(e,t);if(!s){n("warn","SCREENSHOT_SKIP","Pack step folder or screenshot not found",{ordinal:t.ordinal,id:t.id,reason:"pack_step_not_found"});return}let o=new Set;s.actionId&&o.add(s.actionId);for(let i of s.analyzeActionIds)o.add(i);if(o.size===0){n("warn","SCREENSHOT_SKIP","No action_id in step.json",{ordinal:t.ordinal,id:t.id,reason:"no_action_id"});return}for(let i of o)r.enqueue(i,s.png);n("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{ordinal:t.ordinal,id:t.id,action_id:s.actionId,action_ids:[...o],screenshot:s.filename,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 Hn(e,t,r,n,s,o){try{let i=ie(e,"runs",String(t),"run-test");if(!_e(i)){s("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:i});return}let p=i;if(o){let k=ie(i,`child-${o}`);if(!_e(k)){s("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:o,reason:"child_dir_not_found",path:k});return}let E=Vn(k).filter(a=>_e(ie(k,a,"screenshots")));if(E.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:o,reason:"no_child_screenshots_dir"});return}p=ie(k,E[0])}else if(!_e(ie(i,"screenshots"))){let k=Vn(i).filter(E=>_e(ie(i,E,"screenshots")));if(k.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}p=ie(i,k[0])}let l=ie(p,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!_e(l)){s("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:o,reason:"screenshot_not_found",path:l});return}let c=ie(i,"actions.ndjson");if(!_e(c)){s("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let y=Bn(c,"utf-8").trim().split(`
|
|
12
|
+
`),v=y[y.length-1];if(!v){s("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let I=JSON.parse(v).action_id;if(!I){s("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let x=Bn(l);n.enqueue(I,x),s("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:o,action_id:I,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 Qs,join as Zs}from"path";function qn(e,t,r){let n=e.total_runs??1,s=e.run_dir,o,i;if(n>1&&s){let p=Qs(s);o=Array.from({length:n},(l,c)=>Zs(p,String(t+c))),r&&r.length===n&&(i=r)}return{allRunDirs:o,flowObjectives:i}}function Gn(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 pt=class{constructor(t){this.resolved=t;this.outcomes=t.rootSteps.map(r=>({rootStepIndex:r.index,status:"skipped"}))}outcomes;skipRoot=null;overallHalted=!1;shouldRunFlatStep(t){if(this.overallHalted)return!1;let r=t.trace[0].stepIndex;return!(this.skipRoot!==null&&r===this.skipRoot)}recordStep(t,r){let n=t.trace[0].stepIndex,s=this.outcomes.find(l=>l.rootStepIndex===n),o=this.resolved.rootSteps.find(l=>l.index===n),i=o.body.kind!=="objective";return i&&(s.refKind="import",s.refLabel=o.body.path,s.inlinedCount=(s.inlinedCount??0)+1,s.duration_s=(s.duration_s??0)+r.duration_s),r.status==="passed"?(i?s.status!=="failed"&&(s.status="passed"):(s.status="passed",s.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(s.softFailures=s.softFailures??[],s.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(s.status="failed",s.duration_s=i?s.duration_s:r.duration_s,s.failedSubStepIndex=i?t.trace.slice(1).map(l=>l.stepIndex):void 0,s.reason=r.reason,this.skipRoot=n,o.optional??!1?(s.softFailed=!0,{continueOverall:!0}):(this.overallHalted=!0,{continueOverall:!1}))}snapshotOutcomes(){return[...this.outcomes]}snapshot(){return{outcomes:this.outcomes.map(t=>({...t,softFailures:t.softFailures?[...t.softFailures]:void 0})),skipRoot:this.skipRoot,overallHalted:this.overallHalted}}rollback(t){this.outcomes=t.outcomes.map(r=>({...r,softFailures:r.softFailures?[...r.softFailures]:void 0})),this.skipRoot=t.skipRoot,this.overallHalted=t.overallHalted}finalize(){let t=this.outcomes.some(n=>n.status==="failed"&&!n.softFailed)?"failed":"passed",r=this.outcomes.reduce((n,s)=>n+(s.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};function Wt(e){if(!e)return null;let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function zn(e){return Wt(e.flag)??Wt(e.frontmatter)??(e.configDefault&&e.configDefault!==nt?Wt(e.configDefault):null)}function Yn(e){return e.resolvedUrl!==null?!1:!((!!e.local||!!e.allowMissingUrl)&&!e.isTTY)}import{spawn as Xs}from"child_process";async function Wn(e,t,r=100){let n=`${e.replace(/\/+$/,"")}/json/version`,s=await z(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 Nr(o.webSocketDebuggerUrl);await new Promise((m,_)=>{i.once("open",m),i.once("error",_)});let p=1,l=new Map;i.on("message",m=>{let _;try{_=JSON.parse(m.toString())}catch{return}if(_.id==null)return;let L=l.get(_.id);L&&(l.delete(_.id),_.error?L.reject(new Error(_.error.message)):L.resolve(_.result))});function c(m,_){let L=p++;return new Promise((me,te)=>{l.set(L,{resolve:B=>me(B),reject:te});let ae={id:L,method:m};_&&(ae.params=_),i.send(JSON.stringify(ae))})}let v=(await c("Target.getTargets")).targetInfos.find(m=>m.type==="page");if(!v)throw i.close(),new Error("CDP: no page target found");let I=(await c("Browser.getWindowForTarget",{targetId:v.targetId})).windowId,x="",k=!1,E=null,a=!1;i.on("close",()=>{a=!0}),i.on("error",()=>{a=!0});async function Y(){if(!k){if(a){k=!0;return}try{let _=(await c("Browser.getWindowBounds",{windowId:I})).bounds,L=`${_.left}:${_.top}:${_.width}:${_.height}`;L!==x&&(x=L,t({left:_.left,top:_.top,width:_.width,height:_.height}))}catch{}k||(E=setTimeout(Y,r))}}return Y(),{stop(){if(!k){k=!0,E&&clearTimeout(E);try{i.close()}catch{}}}}}var eo=new Set(["1","true","yes"]);function Jn(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&eo.has(t.toLowerCase()))return null;let r=at();if(!r)return null;let n=[...r.args,"overlay"];e?.text&&n.push(e.text);let s;try{s=Xs(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 p=null;e?.cdpEndpoint&&Wn(e.cdpEndpoint,c=>i({type:"bounds",...c})).then(c=>{p=c.stop}).catch(()=>{});let l=!1;return{setRunActive(c){l||i({type:"run_active",active:c})},setStepText(c){if(l)return;let y=c.trim();y&&i({type:"step_text",text:y})},setStepComplete(){l||i({type:"step_complete"})},kill(){if(!l){l=!0,p?.();try{s.stdin?.end()}catch{}try{s.kill("SIGTERM")}catch{}}}}}function Qn(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function gt(e,t,r,n){return`${Qn(e,t,r)}/dashboard/share/${n}?type=summary&agentView=true&fqdn=summary-page`}function Zn(e,t,r,n){if(!(!t||!r||!n))return gt(e,t,r,n)}function Xn(e,t,r){return`${Qn(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as go,rmSync as ho}from"fs";import{join as bo}from"path";import{tmpdir as yo}from"os";import{spawn as rs,spawnSync as to}from"child_process";import{existsSync as Jt}from"fs";import{createConnection as ro}from"net";import{homedir as Ke,platform as Ge}from"os";import{join as He}from"path";var no=new Set(["1","true","yes"]),ht=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function Di(e){return e instanceof ht?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var bt={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",He(Ke(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",He(Ke(),"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",He(Ke(),"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",He(Ke(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",He(Ke(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe")]};function so(){if(process.env.KANE_CLI_CHROME_PATH)return process.env.KANE_CLI_CHROME_PATH;let e=Ge(),t=bt[e]??bt.linux;for(let r of t)if(Jt(r))return r;return e==="win32"?"chrome.exe":"google-chrome"}function oo(){if(process.env.KANE_CLI_CHROME_PATH)return Jt(process.env.KANE_CLI_CHROME_PATH);let e=Ge();if((bt[e]??bt.linux).some(s=>Jt(s)))return!0;let r=e==="win32"?"chrome.exe":"google-chrome",n=e==="win32"?"where":"which";try{return to(n,[r],{stdio:"ignore"}).status===0}catch{return!1}}function io(){let e=Ge();return e==="darwin"?["Google Chrome is required but was not found at any standard path.","","Install via Homebrew (recommended):"," brew install --cask google-chrome","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
|
|
14
|
+
`):e==="linux"?["Google Chrome is required but was not found at /usr/bin/google-chrome.","(amd64 / x86_64 only \u2014 Google does not ship Chrome for Linux ARM.)","","Debian / Ubuntu (any version):"," wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb"," sudo apt install -y ./google-chrome-stable_current_amd64.deb","","Fedora / RHEL / AlmaLinux / Rocky:"," sudo dnf install -y https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
|
|
15
|
+
`):e==="win32"?["Google Chrome is required but was not found in Program Files or AppData.","","Install via winget (Windows 10 1809+):"," winget install --id Google.Chrome -e --silent","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=C:\\path\\to\\chrome.exe","to point at a non-standard install."].join(`
|
|
16
|
+
`):["Google Chrome is required.","Install from https://www.google.com/chrome/","(Note: no official Chrome builds for BSD or Alpine/musl Linux.)"].join(`
|
|
17
|
+
`)}function ao(e){let t=Ge(),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 lo(e){return new Promise(t=>{let r=ro({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 co(){for(let e=Tt;e<=Lt;e++)if(!await lo(e))return e;throw new Error(`All CDP ports ${Tt}-${Lt} are in use. Close other Chrome instances.`)}var qe=class extends Error{constructor(t){super(t),this.name="CdpReadinessError"}};async function uo(e,t){let r=Date.now(),n=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await z(n)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(s=>setTimeout(s,200))}throw new qe(`Chrome CDP not ready after ${t}ms on port ${e}`)}var mo=3e4,fo=2;function es(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 po(e){return Math.min(500*e,3e3)}function ts(e,t){try{if(e.pid)if(t==="win32")rs("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 ns(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&no.has(t.toLowerCase()))&&!oo())throw Dt()?.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 ht(io());let n=Ge(),s=so(),o=es("KANE_CLI_CDP_TIMEOUT_MS",mo,1),p=es("KANE_CLI_CDP_RETRIES",fo,0)+1,l;for(let c=1;c<=p;c++){let y=await co(),v=ao({port:y,...e});e.startUrl&&v.push(e.startUrl);let A=rs(s,v,{stdio:"ignore",detached:!0});A.unref();try{let I=await new Promise((x,k)=>{A.on("error",E=>{k(new Error(`Failed to launch Chrome: ${E.message}. Is Chrome installed at ${s}?`))}),A.on("close",E=>{E!==null&&E!==0&&k(new qe(`Chrome exited during startup with code ${E}`))}),uo(y,o).then(x,k)});return{process:A,port:y,cdpEndpoint:I,kill(){ts(A,n)}}}catch(I){if(l=I,!(I instanceof qe))throw I;ts(A,n),Dt()?.log("warn","CHROME_CDP_LAUNCH_RETRY",`Chrome CDP launch attempt ${c}/${p} failed`,{attempt:c,max_attempts:p,port:y,timeout_ms:o,headless:e.headless??!1,error:I.message}),c<p&&await new Promise(x=>setTimeout(x,po(c)))}}throw l??new Error("Chrome launch failed after retries")}async function ss(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 z(`${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=go(bo(yo(),"kane-clean-")),t=r;let s=r;ot("tempDir",()=>{try{ho(s,{recursive:!0,force:!0})}catch{}})}let n=await ns({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}}async function os(e,t){if(e==="device"){let{device:r,appRef:n,appId:s}=await t.prepareDevice();return{kind:"device",device:r,...n?{appRef:n}:{},...s?{appId:s}:{}}}return{kind:"web",chrome:await t.prepareWeb()}}function Vi(e,t={}){if(e.kind==="device"){let r=e.device.target_kind;return r==="emulator"||r==="simulator"?r:void 0}if(e.chrome.instance)return"chrome";if(t.cdpEndpoint)return"cdp";if(t.wsEndpoint)return"ws"}function Ki(e){if(e.kind!=="device")return;let t=e.device.target_kind;if(!(t!=="emulator"&&t!=="simulator"))return e.appRef??""}function is(e){let t={objective:e.objective,model:e.model,width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,max_steps:e.maxSteps??30,headless:e.headless??!1};return e.url&&(t.url=e.url),e.requireStartUrl&&(t.require_start_url=!0),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(t.org_id=String(e.auth.resolvedCreds.org_id)),e.disableAskUser&&(t.disable_ask_user=!0),e.enableTaskSkills&&(t.enable_task_skills=!0),e.networkWs&&(t.network_ws=!0),e.networkSse&&(t.network_sse=!0),(e.bugDetection==="stop"||e.bugDetection==="continue")&&(t.bug_detection=e.bugDetection),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.globalContext&&(t.global_context=e.globalContext),e.localContext&&(t.local_context=e.localContext),e.sessionContext&&(t.session_context=e.sessionContext),e.device&&(t.device=e.device),e.evidence&&(t.evidence=dt(e.evidence.packTestDir,e.evidence.ordinalOffset)),t}import{readdirSync as vo,readFileSync as ls,existsSync as ds}from"fs";import{join as wo}from"path";function as(e,t){if(!ds(e))return{};let r={},n;try{n=vo(e).filter(s=>s.endsWith(".json")).sort()}catch{return{}}for(let s of n)try{let o=ls(wo(e,s),"utf-8"),i=JSON.parse(o);if(i&&typeof i=="object"){for(let[p,l]of Object.entries(i))if(l&&typeof l=="object"&&"value"in l){let c=l;r[p]={value:c.value,secret:c.secret??!1,syntax:c.syntax??`{{${p}}}`}}}}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 cs(e){if(!ds(e))throw new Error(`Variables file not found: ${e}`);let t=ls(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 us(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 ms(e,t,r){let n=as(e,r),s=as(t,r);return{...n,...s}}var Pe=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=st(t.username,t.accessKey),n=await z(`${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 Te=class extends Mr{constructor(t,r,n){super(t,{username:r,accessKey:n})}async upsertVariable(t){let r=t.environmentId??0,n=await z(`${this.baseUrl}/v1/variables`,{method:"POST",headers:this.headers(),body:JSON.stringify({name:t.name,value:String(t.value),type:"variable",value_type:"string",is_persist:t.isPersist??!1,environment_id:r})});if(n.ok){let l=await n.json().catch(()=>({}));if(l.type==="Success"&&l.id!=null)return{id:Number(l.id)||0}}let s=await z(`${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 z(`${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 fs(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 ps(e){let t=ms(e.globalDir,e.localDir,e.onLoadError),r=e.file?cs(e.file):{},n=e.inline?us(e.inline):{},s={...t,...r,...n},o=Object.keys(s).length>0,{variables:i,objective:p}=o?Ee(s,e.objective):{variables:{},objective:e.objective},l=Object.entries(s).filter(([,y])=>y.secret),c=Object.entries(s).filter(([,y])=>!y.secret);return{raw:s,auteur:i,auteurObjective:p,secretEntries:l,nonSecretEntries:c}}async function gs(e){if(e.localMode)return{};let t=ee(e.env);if(e.variables.secretEntries.length>0){let n=new Pe(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 Te(t.tmsBaseUrl,e.auth.username,e.auth.access_key);for(let[s,o]of e.variables.nonSecretEntries)try{let i=await n.upsertVariable({name:s,value:o.value});r[s]=i.id,e.log("info","VAR_PUSH_OK","Variable pushed",{name:s,id:i.id})}catch(i){e.log("error","VAR_PUSH_FAILED","Variable push failed",{name:s,error:String(i)})}}return r}import{readFileSync as So,existsSync as _o}from"fs";function Qt(e){if(!_o(e))return null;try{return So(e,"utf-8").trim()||null}catch{return null}}var Ro=()=>{};async function hs(e,t,r){let n=t.log??Ro,s=e.session.testId??null,o=null,i=null,p=null;if(!r.localMode&&t.performUpload)try{o=await t.performUpload(),o?.success&&(o.testId&&(s=o.testId),o.testcaseId&&e.session.setTestcaseId(o.testcaseId))}catch(l){n("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(l)})}if(t.renderFeedbackPrompt)try{i=await t.renderFeedbackPrompt(),i&&s&&t.submitFeedback&&t.submitFeedback(s,i).catch(l=>{n("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(l)})})}catch(l){n("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(l)})}if(e.session.flushRecorder(),r.skipLocalWrites)n("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{p=Bt({sourcePath:r.sourcePath,title:r.title,rootSteps:r.rootSteps,outcomes:r.outcomes,overallStatus:r.overallStatus,startedISO:r.startedISO,durationS:r.durationS,sessionId:e.session.sessionId})}catch(l){n("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(l)})}try{Mt({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??Me(r.sourcePath),plan:e.session.plan??void 0})}catch(l){n("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(l)})}if(o?.codeExportDir)try{let l=e.tuiConfig.code_export?.language??"python";Vt(o.codeExportDir,Ft(r.sourcePath,"playwright",l))}catch(l){n("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(l)})}}else if(e.session.recorder?.lastWrittenPath){let l=e.session.recorder.lastWrittenPath,c=e.session.getFlows(),y=c.map((I,x)=>({index:x+1,heading:`Step ${x+1}`,verifies:[],headingLine:0,body:{kind:"objective",text:I.objective}})),v=c.map((I,x)=>({rootStepIndex:x+1,status:I.status==="passed"?"passed":I.status==="failed"?"failed":"skipped",duration_s:I.duration,reason:I.reason})),A=v.some(I=>I.status==="failed")?"failed":"passed";try{p=Bt({sourcePath:l,title:e.session.sessionName??"Session",rootSteps:y,outcomes:v,overallStatus:A,startedISO:e.session.startedAt,durationS:v.reduce((I,x)=>I+(x.duration_s??0),0),sessionId:e.session.sessionId})}catch(I){n("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(I)})}try{Mt({sourcePath:l,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,plan:e.session.plan??void 0})}catch(I){n("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(I)})}if(o?.codeExportDir)try{let I=e.tuiConfig.code_export?.language??"python";Vt(o.codeExportDir,Ft(l,"playwright",I))}catch(I){n("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(I)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${l} (renamed: ${e.session.sessionName}_test.md already existed)
|
|
19
|
+
`)}try{t.runCleanup?.()}catch(l){n("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(l)})}try{await e.session.finish("complete")}catch(l){n("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(l)})}return{uploadResult:o,feedbackChoice:i,resultMdPath:p}}import{readFileSync as Zt,writeFileSync as Xt,existsSync as ys}from"fs";function bs(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 p=t[i];if(!p||p.kind!=="author"||p.reason==="downstream-of-divergence"||p.reason==="no-result-md")continue;let l=Io(e,e.steps[i]);switch(p.reason){case"structure-mismatch":n.push(`added/removed: ${l}`);break;case"md5-mismatch":n.push(`modified: ${l}`);break;case"missing-recording":n.push(`re-recorded: ${l}`);break;case"recorded-failed":n.push(`re-authored after failure: ${l}`);break}}if(n.length===0)return"automated commit";let s=n.filter((i,p)=>p===0||n[p-1]!==i),o=s.slice(0,3).join("; ");return s.length>3?`${o}; +${s.length-3} more`:o}function Io(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 ko(e,t){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{let{changedUnitFiles:r,legacySweep:n}=await In({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=oe(s);if(ys(`${o}.staging`)){gn(o);let i=n.find(p=>p.unitFile===s);i&&kn(i.dirs)}}}}function Co(e,t){if(!(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions))return async()=>{let r=bs(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 zt({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=Ae(e.sourcePath);try{let i=JSON.parse(Zt(o,"utf8"));i.commit_id=e.newCommitId,Xt(o,JSON.stringify(i,null,2)+`
|
|
20
|
+
`,"utf8")}catch(i){process.stderr.write(`warn: failed to update meta.json commit_id: ${i.message}
|
|
21
|
+
`)}}if(s.ok)for(let o of e.unitLocks??[]){if(!t.files.includes(o.file)){await Be({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}}),Se(o.testId);continue}let i=e.resolvedTest.steps.filter(c=>c.owningFile===o.file),p=i.map(c=>c.objective).filter(c=>typeof c=="string"&&c.length>0).slice(0,50),l=await zt({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:p},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(l.ok){let c=Ae(o.file);try{let y=JSON.parse(Zt(c,"utf8"));y.commit_id=e.newCommitId,Xt(c,JSON.stringify(y,null,2)+`
|
|
22
|
+
`,"utf8")}catch(y){process.stderr.write(`warn: failed to update unit meta commit_id (${o.file}): ${y.message}
|
|
23
|
+
`)}}else process.stderr.write(`warn: unit self-commit failed (${o.file}): ${l.reason??""} ${l.message??""}
|
|
24
|
+
`)}return s}}function Eo(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=Ae(e.sourcePath);try{let n=ys(r)?JSON.parse(Zt(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),Xt(r,JSON.stringify(n,null,2)+`
|
|
25
|
+
`,"utf8")}catch(n){process.stderr.write(`warn: failed to update meta.json after endTest: ${n.message}
|
|
26
|
+
`)}}}function vs(e){let t=ee(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??"",p=s.resolvedCreds?.access_key??s.basicAuth?.access_key??"",l=s.resolvedCreds?.org_id??0,c=s.resolvedCreds?.user_id??0,y=[];for(let k of Object.keys(n.auteurVariables))k.startsWith("secrets.user.")&&y.push({key_name:k.replace("secrets.user.",""),scope:"user"});let A=n.getContext().prior_runs.map(k=>k.status),I=n.auteurVariables,x=Object.keys(I).length>0;return{controllerBaseUrl:t.controllerBaseUrl,tmsBaseUrl:t.tmsBaseUrl,auth:o,authResolver:s.resolver,sessionId:n.sessionId,sessionDir:n.sessionDir,testId:n.testId,commitId:n.sessionId,apMode:n.apMode,projectId:e.projectId,folderId:e.folderId,firstObjective:n.firstObjective??"KaneAI Test",firstUrl:n.firstUrl??"",runDirs:n.getRunDirs(),runObjectives:n.getRunObjectives(),runMetadata:n.getRunMetadata(),startedAt:n.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:A,orgId:l,userId:c,tmsUsername:i,tmsAccessKey:p,screenshotBaseUrl:n.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:t.shareApiBaseUrl,variables:x?I:void 0,variableIds:e.variableIds,secrets:y,codeExport:e.codeExport,...e.mobile?{mobile:!0}:{},onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:ko(e,r),onCommitLock:Co(e,r),onFinalizeSuccess:Eo(e),evidence:e.evidence,evidenceRead:e.evidenceRead,authoredExecutionPath:e.authoredExecutionPath}}function ws(e,t=process.env){return t.KANE_MOBILE_APP_BASE_URL||ee(e).mobileAppBaseUrl}var Ss=["python","javascript"];function Ao(e){if(e!==void 0){if(!Ss.includes(e))throw new Error(`--code-language must be one of: ${Ss.join(", ")} (got "${e}")`);return e}}function _s(e,t){let r=Ao(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}function Rs(e){return{platform:e.platform??"",...e.appId?{appId:e.appId}:{},...e.deviceName?{deviceName:e.deviceName}:{},...e.osVersion?{osVersion:e.osVersion}:{},...e.udid?{udid:e.udid}:{}}}async function Is(e){try{let t=new it(e.tmsBaseUrl,e.auth.username,e.auth.access_key);if(e.mobile){if(!e.mobile.appId)return e.log("warn","ATM_CREATE_SKIPPED","Mobile test not registered in TMS",{reason:"no cloud app id for the build under test"}),null;let n=await t.createMobileAtmTest({objective:e.objective.slice(0,100),creation_mode:"KANECLI",playground_disabled:e.hasCustomProfile,mobile_browser:!1,os:e.mobile.platform.toLowerCase(),app_id:e.mobile.appId,project_id:e.projectId,folder_id:e.folderId,authoring_version:4,...e.mobile.deviceName?{deviceName:e.mobile.deviceName}:{},...e.mobile.osVersion?{osVersion:e.mobile.osVersion}:{},...e.mobile.udid?{udid:e.mobile.udid}:{}});return e.log("info","ATM_CREATE_OK","Mobile test created",{test_id:n}),n}let r=await t.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 xo=null,Po=()=>xo??=import("sharp").then(e=>e.default??e).catch(()=>null),yt=class{maxWorkers;maxRetries=2;queue=[];activeCount=0;drainResolvers=[];sas;log;uploadedExt=new Map;constructor(t,r=3,n){this.sas=t,this.maxWorkers=r,this.log=n}updateSas(t){this.sas=t}enqueue(t,r){this.queue.push({operationId:t,buffer:r}),this.pump()}async drain(t=3e4){if(!(this.queue.length===0&&this.activeCount===0))return new Promise(r=>{this.drainResolvers.push(r),setTimeout(()=>{r()},t)})}pump(){for(;this.activeCount<this.maxWorkers&&this.queue.length>0;){let t=this.queue.shift();this.activeCount++,this.processJob(t).finally(()=>{if(this.activeCount--,this.pump(),this.queue.length===0&&this.activeCount===0){for(let r of this.drainResolvers)r();this.drainResolvers=[]}})}}async processJob(t){let r,n="image/webp",s=await Po();if(s)try{let l=await s(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(l)}catch(l){r=new Uint8Array(t.buffer),n="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:l instanceof Error?l.message:String(l)})}else r=new Uint8Array(t.buffer),n="image/png";let o=n==="image/webp"?"webp":"png",i=`test_screenshots/untagged_screenshot/${t.operationId}.${o}`,p=`${this.sas.base_url}/${this.sas.container}/${i}?${this.sas.sas_token}`;for(let l=0;l<=this.maxRetries;l++)try{let c=await z(p,{method:"PUT",headers:{"Content-Type":n,"x-ms-blob-type":"BlockBlob"},body:r});if(c.ok){this.uploadedExt.set(t.operationId,o);return}if(l<this.maxRetries){await this.backoff(l);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed after retries",{operation_id:t.operationId,status:c.status,attempts:this.maxRetries+1})}catch{if(l<this.maxRetries){await this.backoff(l);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed (network error)",{operation_id:t.operationId,error:"network",attempts:this.maxRetries+1})}}backoff(t){let r=t===0?1e3:3e3;return new Promise(n=>setTimeout(n,r))}getExt(t){return this.uploadedExt.get(t)??"png"}getExtMap(){return this.uploadedExt}isNearExpiry(){if(!this.sas.expiry)return!1;let t=new Date(this.sas.expiry).getTime();return Date.now()>t-5*6e4}};import{platform as To,arch as Lo}from"os";function ks(e){let t={proxyUrl:Fr,sessionId:e.sessionId,identity:e.identity,device:{cli_version:rt,platform:To(),arch:Lo(),host_agent:Ut(),invocation_mode:e.invocationMode},getToken:e.getToken};return new Ot(t)}async function Do(e){try{let t=ee(e.env),n=await new Ce(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 yt(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 Oo(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=ks({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:Yr(),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 nr(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):Do({env:e.env,auth:e.auth,session:e.session,log:e.log}),Oo({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 er(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function Ha(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 tr(e.env,e.tmsCreds,r,t);return rr(n,t),n}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await er(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 tr(e.env,s,n,t);return rr(o,t),o}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await er(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 er(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 tr(e.env,n,o,t);return rr(i,t),i}}}async function tr(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}:nr({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 rr(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 No}from"path";import{readFile as Uo}from"fs/promises";function Cs(e){return!e.mobile&&e.shouldUploadArtifacts&&!e.lockHeld&&!e.isFirstRun&&e.sealed&&!!e.testId}var sr=e=>e instanceof Error?e.message:String(e);async function Es(e){let{controller:t,tms:r,testId:n,sessionId:s,executionId:o,sealedPackPath:i,projectId:p}=e,l;try{let c={key:"evidence",content_type:"application/zip",filename:`${o}.evidence`},v=(await t.getPresignedUrls(n,s,[c])).urls?.evidence?.upload_url;if(!v)return{ok:!1,stage:"presign",error:"presign response missing evidence upload_url"};l=v}catch(c){return{ok:!1,stage:"presign",error:sr(c)}}try{let c=await Uo(i);await bn(l,c,"application/zip")}catch(c){return{ok:!1,stage:"upload",error:sr(c)}}try{await r.ingestEvidence(o,p)}catch(c){return{ok:!1,stage:"ingest",error:sr(c)}}return{ok:!0}}function As(e){return e.isFirstRun||ct(e.decisions)||e.push===!0||e.author===!0}function xs(e,t){return{projectId:e?.project_id??t.project_id??null,folderId:e?.folder_id??t.folder_id??null}}function or(e){return e?"author":"replay"}function Fo(e,t){return e?{session:e,ownsLifecycle:!1}:{session:t,ownsLifecycle:!0}}function vt(e,t){return e?.total_runs??t?.length??1}function Mo(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 wt=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function td(e,t,r){let{path:n,cwd:s,opts:o,isAgent:i,disableAskUser:p,resolved:l,resolvedAuth:c,cliOverrides:y,environment:v,envConfig:A,profile:I,model:x,creds:k,configStore:E,session:a}=e,Y=!1,m=await Ko(n,l,o,{resolvedAuth:c,tmsBaseUrl:A.tmsBaseUrl},a.sessionId,r);if(m.abort)return{overallStatus:"failed",exitCode:m.abort.exitCode,outputDir:oe(n),durationS:0,uploadResult:null};let _=m.lockAcquired,L=!1,me=new Set,te=!1,ae=!1;_&&t.onLockState({phase:"acquired",scope:"preemptive"}),a.start({model:x,environment:v,profile:I}),a.setRecordingEnabled(!1);let B=0,lr=c.basicAuth?{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}:c.token??null,Ue=null;if(lr!==null){let d=await nr({env:v,tmsCreds:c.resolvedCreds??null,resolver:c.resolver,auth:lr,getToken:async()=>c.token??null,session:a,log:(u,f,b,h)=>a.log(u,f,b,h),skipScreenshotQueue:!!o.local||!c.basicAuth,invocationMode:i?"agent":"cli"});Ue=d.screenshotQueue,d.remoteLogger&&(r.register("remote-logger",()=>d.remoteLogger.shutdownSync()),r.remoteLogger=d.remoteLogger,e.skipGlobalRemoteLogger||$r(d.remoteLogger))}if(o.name){try{Rn(o.name)}catch(d){return process.stderr.write(`error: ${d.message}
|
|
27
|
+
`),{overallStatus:"failed",exitCode:2,outputDir:oe(n),durationS:0,uploadResult:null}}a.setSessionName(o.name)}let St={};for(let[d,u]of Object.entries(l.rootGlobal))wt.includes(d)||(St[d]=u);for(let[d,u]of Object.entries(y))wt.includes(d)||u!==void 0&&(St[d]=u);let re={...l.chrome};for(let d of wt){let u=y[d];u!==void 0&&(re[d]=u)}let dr={...St,...re},Re=hn(l.rootGlobal);Re&&(dr.target=l.rootGlobal.target),a.setResolvedGlobal(dr);let cr=k.getActiveProfile()??"default",ur=k.getDefaultEnv(),{rehydrateIfStale:Os}=await import("./profile-sync-DTTRRIVP.js");Os(k,E,cr,ur);let j=E.load(),mr=(y.assertion_mode??j.assertion_mode)==="dom"?"dom":"visual",fr=y.final_validation,pr=fr===void 0?void 0:fr==="on",$=j.project_id??null,pe=j.folder_id??null,gr=As({isFirstRun:m.isFirstRun,decisions:m.decisions,push:o.push===!0,author:o.author===!0});if(gr){if(c.basicAuth){let d=await zr({creds:k,config:E,profile:cr,env:ur,tmsCreds:c.basicAuth,isLocal:!!o.local,log:(u,f,b,h)=>a.log(u,f,b,h),onAnnounce:e.onAnnounce,onFatalExit:e.onFatalExit});if(d.status==="ok"){$=d.projectId,pe=d.folderId,j=E.load();let u=we(n);u?.project_id&&($=u.project_id,pe=u.folder_id??pe),i&&d.autoDefaulted&&t.onAgentEvent(Gr(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-3FVBTNYR.js");return u(2,"project/folder gate failed"),{}}}}else{let d=we(n);({projectId:$,folderId:pe}=xs(d,{project_id:j.project_id??null,folder_id:j.folder_id??null})),a.log("info","GATE_SKIP_REPLAY","Project/folder gate skipped (planned pure replay)",{meta_project:!!d?.project_id,config_project:!!j.project_id})}{let d=yn(l),u=c.resolvedCreds?.org_id!=null?String(c.resolvedCreds.org_id):void 0,f=d.find(g=>g.project_id&&$&&g.project_id!==String($)||g.org_id&&u&&g.org_id!==u),b=new Set(d.map(g=>g.project_id).filter(Boolean)),h=new Set(d.map(g=>g.org_id).filter(Boolean));if(f||b.size>1||h.size>1){let g=f??d[0];return process.stderr.write(`error: tenant mismatch \u2014 imported test '${g.file}' was authored under project ${g.project_id??"?"} / org ${g.org_id??"?"}, which differs from the run's project/org (or another imported test). Cross-tenant imports are not allowed.
|
|
29
|
+
`),await a.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:oe(n),durationS:0,uploadResult:null}}}let ze={},O;try{O=await os(Re?"device":"web",{prepareDevice:async()=>{let d=await qr({platform:Re.platform,app:Re.app,noReset:Re.no_reset,defaults:j.mobile,interactive:En()&&!i,agent:i,...!o.local&&c.basicAuth&&c.resolvedCreds?.org_id?{cloudUpload:{env:v,orgId:String(c.resolvedCreds.org_id),userId:String(c.resolvedCreds.user_id??""),baseUrl:ws(v),auth:{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}}}:{},onProgress:u=>process.stderr.write(`${u}
|
|
30
|
+
`)});return ze.deviceName=d.target.displayName,d.target.osVersion&&(ze.osVersion=d.target.osVersion),{device:d.device,...d.appRef?{appRef:d.appRef}:{},...d.appId?{appId:d.appId}:{}}},prepareWeb:()=>ss({config:{chrome_profile_path:re.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:nt,headless:re.headless??!1,wsEndpoint:re.ws_endpoint,cdpEndpoint:re.cdp_endpoint})})}catch(d){if(Re){let u=d instanceof Hr?`${d.doctorText}
|
|
31
|
+
${d.message}`:d.message;process.stderr.write(`error: mobile target preparation failed: ${u}
|
|
32
|
+
`)}else process.stderr.write(`error: Chrome launch failed: ${d.message}
|
|
33
|
+
`);return await a.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:oe(n),durationS:0,uploadResult:null}}let le=O.kind==="web"?O.chrome:{instance:null,tempDir:null},Ye=le.instance;Ye&&r.register("chrome",()=>{try{Ye.kill()}catch{}});let hr=on(le.cdpEndpoint),ne=null,br=!1,We=()=>{if(!ne?.diedUnexpectedly)return!1;if(!br){br=!0;let d=ne.stderr.slice(-500);a.log("error","RUNNER_FATAL_DEATH","v16-runner exited unexpectedly mid-session",{stderr_tail:d}),process.stderr.write(`error: v16-runner exited unexpectedly mid-session \u2014 remaining steps skipped.
|
|
34
|
+
`)}return!0},W=null,yr=le.cdpEndpoint??re.cdp_endpoint;if(yr&&!re.ws_endpoint&&!re.headless&&!e.isAgent)try{W=Jn({headless:re.headless??!1,cdpEndpoint:yr,chromePid:Ye?.process.pid}),W&&r.register("marker-overlay",()=>W.kill())}catch(d){a.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(d)})}c.resolvedCreds?.org_id!==void 0&&a.setOrgId(String(c.resolvedCreds.org_id)),a.setUserIdentity(c.resolvedCreds?.username??null,c.resolvedCreds?.email??null);let he=ps({objective:"",globalDir:ue(Pt,"variables"),localDir:ue(s,".testmuai","variables"),file:o.variablesFile,inline:o.variables}),Us=l.rootGlobal.variables??{},se=$o(he.raw,Us);a.setAuteurVariables(se.auteur);let vr=Qt(ue(Pt,"global-memory.md"))??void 0,wr=Qt(ue(s,".testmuai","context.md"))??void 0;o.local?process.stderr.write(`info: --local \u2014 cloud upload skipped
|
|
35
|
+
`):c.basicAuth?$||(gr?process.stderr.write(`warn: cloud upload skipped \u2014 no project configured.
|
|
36
|
+
`):process.stderr.write(`warn: evidence publish will be skipped \u2014 no project_id in meta.json or config.
|
|
37
|
+
`)):process.stderr.write(`warn: cloud upload skipped \u2014 TMS credentials could not be resolved.
|
|
38
|
+
Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
|
|
39
|
+
`);let Ie=!o.local&&!!c.basicAuth&&$!=null;if(a.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:Ie,lockHeld:_,isFirstRun:m.isFirstRun,hasAuth:m.hasAuth}),Ie&&m.testId==null&&!m.degradedReadonly){let d=ee(v);try{let u=await Is({tmsBaseUrl:d.tmsBaseUrl,auth:c.basicAuth,objective:l.steps[0].objective,url:"",projectId:$,folderId:pe??"",hasCustomProfile:!!re.chrome_profile,...O.kind==="device"?{mobile:Rs({platform:O.device.platform,appId:O.appId,deviceName:ze.deviceName,osVersion:ze.osVersion,udid:O.device.udid})}:{},log:(f,b,h,g)=>a.log(f,b,h,g)});u&&a.setTestId(u)}catch(u){process.stderr.write(`warn: ATM test creation failed: ${u.message}
|
|
40
|
+
`)}}else m.testId&&a.setTestId(m.testId);let Je={};if(c.basicAuth&&!o.local&&(se.secretEntries.length>0||se.nonSecretEntries.length>0))try{Je=await gs({variables:se,auth:c.basicAuth,orgId:String(c.resolvedCreds?.org_id??""),env:v,localMode:!!o.local,log:(d,u,f,b)=>a.log(d,u,f,b)})}catch(d){process.stderr.write(`warn: variable/secret push failed: ${d.message}
|
|
41
|
+
`)}let _t=new Map;for(let[d,u]of se.nonSecretEntries)_t.set(d,u.value);let Rt=new Map;for(let[d,u]of se.secretEntries)Rt.set(d,u.value);async function It(d){if(!c.basicAuth||o.local)return;let u=[],f=[];for(let[h,g]of Object.entries(d))if(g.secret){if(Rt.get(h)===g.value)continue;f.push([h,g])}else{if(_t.get(h)===g.value)continue;u.push([h,g])}if(u.length===0&&f.length===0)return;let b=ee(v);if(u.length>0){let h=new Te(b.tmsBaseUrl,c.basicAuth.username,c.basicAuth.access_key);for(let[g,R]of u)try{let C=await h.upsertVariable({name:g,value:R.value});Je[g]=C.id,_t.set(g,R.value),a.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:g})}catch(C){a.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:g,error:String(C)})}}if(f.length>0){let h=new Pe(b.secretsBaseUrl);for(let[g,R]of f)try{await h.pushSecret({secretKey:g,secretValue:R.value,username:c.basicAuth.username,accessKey:c.basicAuth.access_key,orgId:String(c.resolvedCreds?.org_id??"")}),Rt.set(g,R.value),a.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:g})}catch(C){a.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:g,error:String(C)})}}}let je=Ue?(d,u,f,b)=>{if(!(_||m.isFirstRun))return;if(P&&b){Kn(P.packTestDir,b,Ue,(g,R,C,N)=>a.log(g,R,C,N));return}let h=B+u;Hn(a.sessionDir,h,d,Ue,(g,R,C,N)=>a.log(g,R,C,N),f)}:void 0,Sr=l.rootTitle??l.rootSteps[0]?.heading??Ps(n),js=Object.keys(se.raw).length>0?Ee(se.raw,Sr).objective:Sr,be=zn({flag:o.url,frontmatter:l.rootGlobal?.url,configDefault:E.load().default_url}),Ns=Yn({resolvedUrl:be,local:!!o.local,allowMissingUrl:!!o.allowMissingUrl,isTTY:!!process.stdin.isTTY});a.setFirstRun(js,be??"");let fe=new pt(l),Qe=new Date().toISOString(),_r=Date.now(),kt=e.evidenceAttach?null:new an({origin:"testmd",runKind:"author",pid:process.pid,title:l.rootTitle??Ps(n),started:Qe,producerVersion:rt,surfaces:be?[be]:void 0,testmdRelPath:No(s,n),definition:{path:"test.md",content:Ls(n,"utf8")},cwd:s,packRootDir:ue(a.sessionDir,"evidence")}),de=Fo(e.evidenceAttach,kt),K=de.session,P=null;if(e.evidenceAttach)P={executionId:e.evidenceAttach.id,testId:e.evidenceAttach.test,packTestDir:e.evidenceAttach.packTestDir};else if(kt)try{P=await kt.start()}catch(d){a.log("warn","EVIDENCE_START_FAILED","Evidence pack creation failed",{error:String(d)})}let ye=[],Ze=[],Rr,ke,Ct=(d,u,f,b,h)=>{if(!P)return;K.noteSpawn(h?.length?{...d,steps:d.steps.map(R=>({...R,verifies:h}))}:d),d.resolution&&(Rr=d.resolution),ke=Zr(ke,d.runnerEnvironment),ye.push(Mo(u));let g=vt(u,b);for(let R=0;R<g;R++)Ze.push(f+R)},Et=()=>P?{packTestDir:P.packTestDir,ordinalOffset:K.nextOrdinalOffset()}:void 0,Ir=async()=>{if(!P||!K)return;let d=en(ye.length?ye:[{resultCode:null}]);await K.archiveAttempt(d),ye.length=0,Ze.length=0},Fs=typeof o.maxSteps=="string"&&o.maxSteps!==""?parseInt(o.maxSteps,10):void 0;function kr(d,u){let f=l.steps[d],b=Ts(f.config,y),h=Le(he.raw,b.variables,f.objective);return is({objective:h.objective,url:O.kind==="device"?void 0:d===0?be??void 0:f.unitEntryUrl,requireStartUrl:O.kind==="web"&&d===0&&Ns,model:x,chrome:le,device:O.kind==="device"?O.device:void 0,auth:c,sessionId:a.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:b.max_steps??Fs??30,headless:re.headless??!1,disableAskUser:!0,variables:Object.keys(h.variables).length>0?h.variables:void 0,globalContext:b.global_context??vr,localContext:b.local_context??wr,sessionContext:a.getContext(),bugDetection:o.bugDetection??j.bug_detection,evidence:Et()})}function Cr(d){let f=l.steps[d].trace[0].stepIndex,b=l.rootSteps.find(g=>g.index===f);l.steps.slice(0,d).some(g=>g.trace[0].stepIndex===f)||t.onAgentEvent({type:"test_md_step_start",step_index:f,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 At(d,u,f,b,h,g){let R=l.steps[d],C=R.trace[0].stepIndex,N=!l.steps.slice(d+1).some(D=>D.trace[0].stepIndex===C),F=f?.status==="passed"?"passed":"failed",U=f?.reason??h??void 0,Q=f?.duration??g,S=f?.verdict;if(S&&typeof S=="object"){let D=typeof S.one_liner=="string"?S.one_liner:"",G=typeof S.bug_title=="string"&&S.bug_title?S.bug_title:D;if(G&&F==="failed"){let Z=[S.family,S.category].filter(Boolean).join("/"),X=typeof S.confidence=="number"?`, confidence ${S.confidence.toFixed(2)}`:"";U=`${U??"failed"} \u2014 bug verdict: ${G}${Z?` [${Z}${X}]`:""}`}let w=typeof S.category_proposal=="string"?S.category_proposal:"";w&&F==="failed"&&(U=`${U??"failed"}; category proposal: ${w} \u2014 consider adding to taxonomy`),t.onAgentEvent({type:"test_md_bug_verdict",step_index:R.trace[0].stepIndex,confirmed:S.confirmed===!0,bug_title:G||null,family:S.family??null,category:S.category??null,category_proposal:w||null,severity:S.severity??null,confidence:typeof S.confidence=="number"?S.confidence:null,one_liner:D||null})}let{continueOverall:M}=fe.recordStep(R,{status:F,duration_s:Q,reason:U}),H=Ts(R.config,y),q=Le(he.raw,H.variables,R.objective).objective;if(f){let D=qn(f,u,b);a.addRunResult(Gn(f,q,u,D),f.total_runs)}else a.addRunResult({index:u,objective:q,status:F,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(N||!M){let D=fe.snapshotOutcomes().find(G=>G.rootStepIndex===C);t.onAgentEvent({type:"test_md_step_end",step_index:C,status:D.status,duration_s:D.duration_s??0,ref_kind:D.refKind??null,unit_kind:D.refKind==="import"?(D.refLabel??"").endsWith("_test.md")?"test":"helper":null,inlined_count:D.inlinedCount??null,failed_sub_step_index:D.failedSubStepIndex??null})}return M}let xt=[];async function Ms(d){xn(d,l.steps.length);for(let u=0;u<d;u++){if(Y||e.signal?.aborted)return{failedAt:u,cancelled:!0};if(We())return{failedAt:u,cancelled:!1};let f=l.steps[u],b=m.decisions[u];if(b.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${u}
|
|
42
|
+
`),{failedAt:u,cancelled:!1};let h=a.nextRunIndex();B=h;let g=u===0?be??void 0:l.steps[u].unitEntryUrl,R={width:j.window_size.width,height:j.window_size.height},C=Le(he.raw,f.config.variables,f.objective),N=Ht({step:f,decision:b,chrome:le,device:O.kind==="device"?O.device:void 0,auth:c,sessionId:a.sessionId,runIndex:h,sessionDir:a.sessionDir,windowSize:R,forceNavigateUrl:O.kind==="device"?void 0:g,sessionContext:a.getContext(),variables:Object.keys(C.variables).length>0?C.variables:void 0,evidence:Et(),investigationAsync:!de.ownsLifecycle});await It(C.raw),Cr(u);let F=Date.now(),U=null,Q=null,S=lt(),M={...N};delete M.run_id,jt(M,{environment:v});let H=`run-${h}`;try{W?.setRunActive(!0);try{for await(let w of ne.run(H,"replay",M)){if(t.onAgentEvent(w),S=Nt(S,w),w.type==="step_event"&&w.event==="reasoning"?W?.setStepText(w.detail):w.type==="step_end"&&(w.status==="passed"&&W?.setStepComplete(),je&&je(w.index,0,w.child_id,typeof w.ordinal=="number"&&w.id?{ordinal:w.ordinal,id:w.id}:void 0)),w.type==="run_end"){U=w;break}if(w.type==="error"){Q=w.message??"runner error";break}}!de.ownsLifecycle&&U?.status==="failed"&&xt.push({exited:ne.exited.then(()=>{}).catch(()=>{}),cancel:()=>{try{ne?.cancel()}catch{}}})}finally{W?.setRunActive(!1)}}catch(w){Q=w.message}if(ne.diedUnexpectedly&&We(),Y)return{failedAt:u,cancelled:!0};let q=Math.round((Date.now()-F)/1e3),D=At(u,h,U,null,Q,q);a.recordStepRun({testmdStepIndex:l.steps[u].flatIndex,runIndex:h,totalRunDirs:vt(U,null)}),Ct(S,U,h,null,l.steps[u].verifies);let G=!!Q||U?.status==="failed";if(Pn(u,G?"failed":"ok"),G||!D)return{failedAt:u,cancelled:!1}}return{failedAt:null,cancelled:!1}}let Er=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
|
|
43
|
+
`),!1;let u=a.sessionId,f=o.onLockConflict??l.rootGlobal.on_lock_conflict??"readonly",b=await ar({tmsBaseUrl:A.tmsBaseUrl,testId:m.testId,fromCommitId:m.fromCommitId,newCommitId:u,basicAuth:d,onLockConflict:f});if(b==="ok"){_=!0,m.newCommitId=u,a.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:m.testId}),i&&t.onLockState({phase:"acquired",scope:"mid_run"}),ft({baseUrl:De(A.tmsBaseUrl),testId:m.testId,auth:Oe(d),lifecycle:r});let h=await Ds({resolved:l,decisions:m.decisions,tmsBaseUrl:A.tmsBaseUrl,newCommitId:u,basicAuth:d,mode:f,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
|
|
44
|
+
`),!0}return a.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:b}),i&&t.onLockState({phase:"conflict",scope:"mid_run",reason:b}),process.stderr.write(`error: mid-run lock acquisition failed (${b})
|
|
45
|
+
`),!1};if(i){let d=at();if(!d)return process.stderr.write("error: v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.\n"),r.cleanup("marker-overlay","v16-runner not found"),r.cleanup("chrome","v16-runner not found"),await a.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:oe(n),durationS:0,uploadResult:null};let u=Jr({environment:v,mode:y.mode??"testing",assertionMode:mr,finalValidation:pr,username:c.basicAuth?.username,accessKey:c.basicAuth?.access_key,sessionId:a.sessionId});O.kind==="device"&&await Wr(u,O.device),ne=new Qr({env:u,runner:d,log:(C,N,F,U)=>a.log(C,N,F,U),sessionId:a.sessionId}),r.register("runner",()=>{(Br()||e.signal?.aborted)&&(Y=!0);try{ne?.kill()}catch{}});let f={...O.kind==="device"?{device:O.device}:{},cdp_endpoint:le.cdpEndpoint,ws_endpoint:le.wsEndpoint,width:j.window_size.width,height:j.window_size.height,headless:re.headless??!1,model:x,session_id:a.sessionId};c.basicAuth?(f.username=c.basicAuth.username,f.access_key=c.basicAuth.access_key):c.token&&(f.auth={type:"bearer",token:c.token}),await ne.start(f);let b=o.author===!0;b&&(Kt(),a.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let{authorBoundary:h,cancelledInPhase:g,shrinkCount:R}=await Un({decisions:m.decisions,forceAuthor:b,hasRetry:o.retry===!0||o.retryCount!==void 0,maxShrinks:o.retryCount!==void 0?parseInt(o.retryCount,10):$e.maxShrinks,runReplayPhase:Ms,session:a,accumulator:fe,acquireLockIfNeeded:Er,archiveAttempt:Ir});if(ae=R>0,R>0&&(a.log("info","RETRY_TRIGGERED","Retry loop triggered",{shrink_count:R,final_author_boundary:h}),t.onRetryAttempt({shrink_count:R,final_author_boundary:h,complete_reauthor:h===0})),h===0&&R>0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:R}),!g&&h>=0)for(let C=h;C<l.steps.length&&!e.signal?.aborted;C++){let N=l.steps[C];if(We()){fe.recordStep(N,{status:"failed",duration_s:0,reason:"v16-runner exited unexpectedly mid-session"});break}if(!fe.shouldRunFlatStep(N))continue;Cr(C),L=!0,me.add(l.steps[C].flatIndex);let F=a.nextRunIndex();B=F,await It(Le(he.raw,N.config.variables,N.objective).raw);let U=kr(C,F),Q=Date.now(),S=null,M=null,H=null,q=!1,D=0,G=lt(),w={...U};delete w.run_id,jt(w,{environment:v});let Z=`run-${F}`;try{W?.setRunActive(!0);try{for await(let T of ne.run(Z,"author",w)){if(t.onAgentEvent(T),G=Nt(G,T),T.type==="bifurcation"){let Fe=T.count??T.flows?.length??0;(T.is_single_flow??Fe<=1)||(H=T.flows??null,q=!0,D=0)}else if(T.type==="run_start"&&q)D++;else if(T.type==="step_event"&&T.event==="reasoning")W?.setStepText(T.detail);else if(T.type==="step_end"&&(T.status==="passed"&&W?.setStepComplete(),je)){let Fe=q?Math.max(0,D-1):0;je(T.index,Fe,T.child_id,typeof T.ordinal=="number"&&T.id?{ordinal:T.ordinal,id:T.id}:void 0)}if(T.type==="run_end"){S=T;break}if(T.type==="error"){M=T.message??"runner error";break}}}finally{W?.setRunActive(!1)}}catch(T){M=T.message}ne.diedUnexpectedly&&We();let X=Math.round((Date.now()-Q)/1e3),Ne=At(C,F,S,H,M,X);if(a.recordStepRun({testmdStepIndex:l.steps[C].flatIndex,runIndex:F,totalRunDirs:vt(S,H)}),Ct(G,S,F,H,l.steps[C].verifies),!Ne||Y||e.signal?.aborted)break}}else{let{effectiveDecisions:d}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:u}=await import("./replay-policy-6USQBT3E.js"),f=o.retry===!0||o.retryCount!==void 0,b=o.retryCount!==void 0?parseInt(o.retryCount,10):$e.maxShrinks,h=o.author===!0;h&&(Kt(),a.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let g=h?0:ut(m.decisions),R=0,C=null,N=m.decisions.filter(S=>S.kind==="replay").length,F=m.decisions.length-N,U=[];o.push&&U.push("--push"),f&&U.push("--retry"),o.retryCount!==void 0&&U.push(`--retry-count=${o.retryCount}`),h&&U.push("--author");let Q={source:n,steps:{total:m.decisions.length,replay:N,author:F},model:x,viewport:{width:j.window_size.width,height:j.window_size.height},chrome:le.cdpEndpoint??le.wsEndpoint??"managed",session:a.sessionName??"ephemeral",variables:{count:Object.keys(se.raw).length,secrets:Object.values(se.raw).filter(S=>S.secret).length,names:Object.keys(se.raw)},flags:U,mode:y.mode??"testing"};for(;;){let S=a.snapshot(),M=fe.snapshot(),H=d(m.decisions,g,h);if(R>=1){let w=g===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${R}/${b})`:`\u21BB Retry ${R}/${b} \u2014 replay 0..${g-1}, author ${g}..${m.decisions.length-1}
|
|
46
|
+
reason: replay miss at step ${(C??0)+1}`;process.stderr.write(w+`
|
|
47
|
+
`)}let q=R>=1&&g>0&&C!==null?{startIdx:0,endIdx:C,count:C}:void 0;W?.setRunActive(!0);let D=await qo({decisions:H,resolved:l,session:a,accumulator:fe,tuiConfig:j,globalConfig:Q,buildStepConfigAt:kr,buildReplayConfig:w=>{let Z=m.decisions[w];if(Z.kind!=="replay")throw new Error("expected replay decision at index "+w);let X=l.steps[w];return Ht({step:X,decision:Z,chrome:le,device:O.kind==="device"?O.device:void 0,auth:c,sessionId:a.sessionId,runIndex:a.nextRunIndex(),sessionDir:a.sessionDir,windowSize:{width:j.window_size.width,height:j.window_size.height},forceNavigateUrl:O.kind==="device"?void 0:w===0?be??void 0:X.unitEntryUrl,sessionContext:a.getContext(),variables:Bo(he.raw,X.config.variables,X.objective),evidence:Et()})},onAnyAuthorStep:w=>{L=!0,me.add(l.steps[w].flatIndex)},onCancel:()=>{te=!0},topBannerModel:x,topBannerAuth:`${k.getActiveProfile()??"no profile"}/${v}`,spawnOpts:{environment:v,mode:y.mode??"testing",assertionMode:mr,finalValidation:pr,log:(w,Z,X,Ne)=>a.log(w,Z,X,Ne)},priorAttemptRollup:q,pushStepLevelDelta:(w,Z)=>It(Le(he.raw,w,Z).raw),onSequencerStepEnd:(w,Z,X,Ne)=>{let T=Math.round((Date.now()-Ne)/1e3),Fe=w.hadError?w.reason??"runner error":null,Hs=At(Z,X,w.runEnd,w.bifurcationFlows??null,Fe,T);return a.recordStepRun({testmdStepIndex:l.steps[Z].flatIndex,runIndex:X,totalRunDirs:vt(w.runEnd,w.bifurcationFlows)}),Ct(w.evidence??lt(),w.runEnd,X,w.bifurcationFlows,l.steps[Z].verifies),Hs},screenshotDispatcher:je,onReasoning:w=>W?.setStepText(w),onStepComplete:()=>W?.setStepComplete(),onSpawnStart:w=>{B=w},host:t});if(W?.setRunActive(!1),D.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(D.failedAt===null)break;let G=u({failedAt:D.failedAt,shrinkCount:R,hasRetry:f,maxShrinks:b});if(G.kind==="fail"||!_&&!await Er())break;await Ir(),a.rollback(S),fe.rollback(M),G.kind==="complete-reauthor"?g=0:g=G.newAuthorBoundary,R++,ae=!0,a.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:R,failed_at:C}),g===0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:R}),C=D.failedAt}}let J=fe.finalize(),ve=Math.round((Date.now()-_r)/1e3),$s={session:a,resolvedAuth:c,chromeResult:le,chromeInstance:Ye??null,testId:a.testId??null,preparedVariables:se,variableIds:Je,globalContext:vr,localContext:wr,tuiConfig:j,env:v,localMode:!!o.local},Ar=!1,xr=!1,Pr=!1,Tr=async(d={})=>{if(!P)return!1;if(de.ownsLifecycle?Ar:Pr)return!0;try{let u=await hr(),f=or(L)==="replay",b=ue(oe(n),".internal","execution.json"),h=ue(a.sessionDir,"execution.json"),g=mn(P.packTestDir,f?[b,h]:[h,b],(S,M,H,q)=>a.log(S,M,H,q)),{ids:R,linear:C}=g?pn(P.packTestDir):{ids:[],linear:!0},{steps:N,tail:F,unjoined:U}=fn(K.steps,R,f,C);g?U?a.log("warn","SKIPPED_TAIL_UNJOINED","Executed records don't align with the authored blob \u2014 skipped tail withheld",{executed:K.steps.length,leaves:R.length}):F.length>0&&a.log("info","SKIPPED_TAIL_APPENDED","Unexecuted authored actions recorded as skipped",{count:F.length}):a.log("warn","SKIPPED_TAIL_NO_BLOB","No auteur blob in pack \u2014 unexecuted actions cannot be recorded as skipped",{});let Q=await K.writeResult({steps:[...N,...F],spawns:ye.length?ye:[{resultCode:null}],tags:l.rootGlobal.tags,externalIdInput:{execution_id:P.executionId,session_id:a.sessionId,commit_id:f?m.fromCommitId??a.sessionId:a.sessionId,test_id:m.testId??a.testId??void 0,testcase_id:d.testcaseId??m.testcaseId??a.testcaseId??void 0,project_id:$??void 0,folder_id:pe??void 0,org_id:a.orgId!=null?String(a.orgId):void 0,session_name:a.sessionName??Me(n),user_name:a.userName??void 0,user_email:a.userEmail??void 0,sharable_link:Zn(ee(v).testManagerUiUrl,$,d.testcaseId??m.testcaseId??a.testcaseId,d.shareId)},runnerEnv:sn({cdpBrowser:u,resolution:Rr,runnerEnvironment:ke}),intentEnv:Xr(x,ke,de.ownsLifecycle?void 0:or(L)),durationMs:Date.now()-_r,log:(S,M,H,q)=>a.log(S,M,H,q)});if(!de.ownsLifecycle)return await rn(K.pack,P.testId,ue(a.sessionDir,"tui.log"),{requireRealLog:!!ke?.native_platform,appiumMarks:K.appiumMarks}),Pr=!0,a.log("info","EVIDENCE_RESULT_WRITTEN","Member result.yaml written",{execution_id:P.executionId,verdict:Q}),!0;if(!xr)try{let S=cn({cwd:process.cwd(),members:[{path:n,verdict:Q,executionId:P.executionId,startedAt:new Date().toISOString(),acs:dn(K.steps),mode:"testmd",local:!!o.local}]});xr=!0;for(let M of S.warnings)a.log("warn","EXEC_SYNC",M,{});S.synced>0&&a.log("info","EXEC_SYNC",`context sync: ${S.synced} fact(s), ${S.superseded} supersession(s)`,{})}catch(S){a.log("warn","EXEC_SYNC",`exec-sync failed: ${S instanceof Error?S.message:String(S)}`,{})}try{let S=un(K.pack,ln(process.cwd()));S.status==="skipped"&&a.log("warn","EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${S.reason}`,{})}catch(S){a.log("warn","EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(S)})}return await nn({executionId:P.executionId,testId:P.testId,saved:!0,runKind:or(L),verdict:Q,outputStemDir:oe(n),cwd:s,packDir:K.pack,tuiLogPath:ue(a.sessionDir,"tui.log"),expectStatusDisagrees:(o.bugDetection??j.bug_detection)==="continue",log:(S,M,H,q)=>a.log(S,M,H,q),surface:"testmd",requireRealLog:!!ke?.native_platform,appiumMarks:K.appiumMarks}),Ar=!0,a.log("info","EVIDENCE_SEALED","Evidence pack sealed",{execution_id:P.executionId,verdict:Q}),!0}catch(u){return a.log("warn","EVIDENCE_SEAL_FAILED","Evidence pack seal failed",{error:String(u)}),!1}},Xe=Ie&&(_||m.isFirstRun)&&!m.degradedReadonly,Bs=async()=>{if(!c.basicAuth)return null;let d=ee(v),u=(L||o.push===!0)&&!te,f=(_||m.isFirstRun)&&!te&&J.overallStatus==="passed"&&!m.degradedReadonly;a.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:Ie,shouldUploadPipeline:Xe,shouldReplaceLocalOutput:u,shouldCommit:f,lockHeld:_,anyAuthorStepRan:L,cancelled:te,overallStatus:J.overallStatus});let b=vs({mobile:O.kind==="device",session:a,env:v,auth:c,variables:se,variableIds:Je,projectId:$,folderId:pe,totalSteps:J.outcomes.length,totalDuration:ve,screenshotExtMap:Ue?.getExtMap(),codeExport:_s({codeExport:o.codeExport,codeLanguage:o.codeLanguage,skipCodeValidation:o.skipCodeValidation},j.code_export),onProgress:()=>{},log:(g,R,C,N)=>a.log(g,R,C,N),shouldUploadArtifacts:Xe,shouldReplaceLocalOutput:u,shouldCommit:f,isFirstRun:m.isFirstRun,resolvedTest:l,sourcePath:n,stepRunRecords:a.getStepRunRecords(),authoredFlatIdx:[...me],unitLocks:m.unitLocks,outcomes:J.outcomes,overallStatus:J.overallStatus,fromCommitId:m.fromCommitId,startedISO:Qe,durationS:ve,tmsIds:{testId:m.testId??a.testId??void 0,testcaseId:m.testcaseId??a.testcaseId??void 0,projectId:$??void 0,folderId:pe??void 0,orgId:a.orgId??void 0,sessionName:a.sessionName??Me(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:ae,forceAuthor:o.author===!0,evidence:P&&de.ownsLifecycle?{executionId:P.executionId,packTestDir:P.packTestDir,sealedPackPath:K.pack,cwd:s,runIndices:Ze,sealFn:Tr}:void 0,evidenceRead:P&&!de.ownsLifecycle?{packTestDir:P.packTestDir,runIndices:Ze}:void 0,authoredExecutionPath:L?void 0:ue(oe(n),".internal","execution.json")});m.newCommitId!=null&&(b.skipTmsFinalize=!0);let h=new Cn(b);return i?await h.execute():await t.runUpload(h,g=>{if(g.testcaseId&&g.shareId&&$)return gt(d.testManagerUiUrl,$,g.testcaseId,g.shareId)})};P&&await hr(),ne&&(await ne.shutdown(),r.cleanup("runner","test.md run complete"));let ce=await hs($s,{performUpload:Bs,runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(d,u,f,b)=>a.log(d,u,f,b)},{overallStatus:J.overallStatus,outcomes:J.outcomes,sourcePath:n,title:l.rootTitle,rootSteps:l.rootSteps,startedISO:Qe,durationS:ve,localMode:!!o.local,skipLocalWrites:!0}),Lr=await Tr({testcaseId:ce.uploadResult?.testcaseId,shareId:ce.uploadResult?.shareId}),Dr=o.evidencePublish===!1,Or=de.ownsLifecycle&&!!P&&!!c.basicAuth&&Cs({shouldUploadArtifacts:Ie,lockHeld:_,isFirstRun:m.isFirstRun,sealed:Lr,testId:m.testId,mobile:O.kind==="device"});if(Or&&Dr)a.log("info","EVIDENCE_PUBLISH_SKIPPED","Replay evidence publish skipped (--no-evidence-publish)",{execution_id:P.executionId}),process.stderr.write(`info: evidence publish skipped (--no-evidence-publish)
|
|
48
|
+
`);else if(O.kind==="device"&&de.ownsLifecycle&&P)a.log("info","EVIDENCE_PUBLISH_SKIPPED","Evidence publish skipped for a device run"),process.stderr.write(`note: evidence publish skipped \u2014 not supported for device runs yet
|
|
49
|
+
`);else if(Dr&&(_||m.isFirstRun))process.stderr.write(`note: --no-evidence-publish has no effect on author/commit runs
|
|
50
|
+
`);else if(Or){let d=c.basicAuth,u=P,f=$,b=await Es({controller:new Ce(A.controllerBaseUrl,{username:d.username,accessKey:d.access_key}),tms:new it(A.tmsBaseUrl,c.resolvedCreds?.username??d.username,c.resolvedCreds?.access_key??d.access_key),testId:m.testId,sessionId:a.sessionId,executionId:u.executionId,sealedPackPath:K.pack,projectId:f});b.ok?a.log("info","EVIDENCE_INGESTED","Replay evidence uploaded and ingested",{execution_id:u.executionId,project_id:f}):(a.log("warn","EVIDENCE_PUBLISH_FAILED","Replay evidence publish failed",{execution_id:u.executionId,stage:b.stage,error:b.error}),process.stderr.write(` \u26A0 evidence publish failed (${b.stage}): ${b.error}
|
|
51
|
+
`)),t.onAgentEvent({type:"test_md_evidence_ingest",status:b.ok?"ok":"failed",evidence_id:u.executionId,...b.ok?{}:{stage:b.stage}})}await Ho(n,m,a,J.outcomes,J.overallStatus,Qe,ve,ce.uploadResult,j,o,{resolvedAuth:c,tmsBaseUrl:A.tmsBaseUrl},_,te);try{let d=we(n);if(vn({shouldUploadPipeline:Xe,uploadSucceeded:!!ce.uploadResult?.success,metaCommitId:d?.commit_id,metaTestId:d?.test_id})){let u=await $t({sourcePath:n,testId:d.test_id,sessionId:a.sessionId,commitId:d.commit_id,controller:new Ce(A.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});u.ok?a.log("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:d.commit_id,bytes:u.bytes}):(a.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:d.commit_id,stage:u.stage,error:u.error}),process.stderr.write(` \u26A0 bundle sync failed (${u.stage}): ${u.error}
|
|
52
|
+
`)),t.onAgentEvent({type:"test_md_bundle_sync",status:u.ok?"ok":"failed",commit_id:d.commit_id,path:n,...u.ok?{bytes:u.bytes}:{stage:u.stage}})}}catch(d){a.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:d instanceof Error?d.message:String(d)})}if(Xe&&ce.uploadResult?.success)for(let d of m.unitLocks)try{let u=we(d.file);if(u?.commit_id!==a.sessionId||!u?.test_id)continue;let f=await $t({sourcePath:d.file,testId:String(u.test_id),sessionId:a.sessionId,commitId:String(u.commit_id),controller:new Ce(A.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});f.ok?a.log("info","BUNDLE_SYNC_OK","unit bundle pushed",{commit_id:u.commit_id,path:d.file,bytes:f.bytes}):a.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync failed",{commit_id:u.commit_id,path:d.file,stage:f.stage,error:f.error}),t.onAgentEvent({type:"test_md_bundle_sync",status:f.ok?"ok":"failed",commit_id:u.commit_id,path:d.file,...f.ok?{bytes:f.bytes}:{stage:f.stage}})}catch(u){a.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync threw",{path:d.file,error:u instanceof Error?u.message:String(u)})}let Ur=ee(v),et=ce.uploadResult?.testcaseId,tt=et&&ce.uploadResult?.shareId&&$?gt(Ur.testManagerUiUrl,$,et,ce.uploadResult.shareId):void 0,Vs=l.unitFiles.filter(d=>d.file!==l.rootPath).map(d=>{let u=l.steps.filter(g=>g.owningFile===d.file),f=u.filter(g=>me.has(g.flatIndex)).length,h=(d.kind==="test"?we(d.file):null)?.commit_id===a.sessionId;return{path:d.file,kind:d.kind,replayed:u.length-f,authored:f,committed:h,...h?{commit_id:a.sessionId}:{}}}),jr={overallStatus:J.overallStatus,durationS:ve,decisions:m.decisions,outcomes:J.outcomes,cancelled:te,retryTriggered:ae,lockHeld:_,anyAuthorStepRan:L,isFirstRun:m.isFirstRun,wantsPush:o.push===!0,uploadResult:ce.uploadResult,shouldUploadArtifacts:Ie,shouldReplaceLocalOutput:L&&!te,shouldCommit:(_||m.isFirstRun)&&!te&&J.overallStatus==="passed"&&!m.degradedReadonly,shareUrl:tt,imports:Vs},{buildSummaryEvent:Ks}=await import("./SummaryBox-HYNINDNN.js");if(i?t.onAgentEvent(Ks(jr)):await t.onSummary(jr),!i){let d=et&&$?Xn(Ur.testManagerUiUrl,$,et):void 0;await t.onLinks({recordedTestPath:n,outputDir:oe(n),shareableLink:tt,testCaseLink:d,codeExportDir:ce.uploadResult?.codeExportDir})}if(de.ownsLifecycle&&K&&Lr){let{offerEvidenceView:d}=await import("./evidence-ZVQHPELX.js");await d({packPath:K.pack,env:v,isTTY:!i&&!te&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:u=>process.stderr.write(u+`
|
|
53
|
+
`)})}return t.onAgentEvent({type:"test_md_done",overall_status:J.overallStatus,duration_s:ve,session_id:a.sessionId,...tt?{share_url:tt}:{}}),{overallStatus:J.overallStatus,exitCode:J.overallStatus==="passed"?0:1,outputDir:oe(n),durationS:ve,uploadResult:ce.uploadResult,anyAuthorStepRan:L,resultCode:tn(ye),...xt.length?{pendingInvestigations:xt}:{}}}function $o(e,t){let r={...e,...t},n=Object.keys(r).length>0?Ee(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 Le(e,t,r){let n={...e,...t??{}};if(Object.keys(n).length===0)return{raw:n,variables:{},objective:r};let s=Ee(n,r);return{raw:n,variables:fs(s.variables,s.objective),objective:s.objective}}function Bo(e,t,r){let n=Le(e,t,r).variables;return Object.keys(n).length>0?n:void 0}function Ts(e,t){let r=new Set(wt),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 Vo(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function Ko(e,t,r,n,s,o){let i=wn(t);An(t,i);let p=Ae(e),l=jo(p)?JSON.parse(Ls(p,"utf8")):null,c=l?.testcase_id,y=l?.test_id,v=l?.commit_id,A=r.push===!0,I=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
|
|
54
|
+
`),x&&(c=void 0,y=void 0,v=void 0);let k=n.resolvedAuth.basicAuth;if(!k){let B=await n.resolvedAuth.resolver.resolve(!0);B?.username&&B?.access_key&&(k={username:B.username,access_key:B.access_key},n.resolvedAuth.basicAuth=k)}let E=!!k,a=!r.local&&E&&y!=null&&v!=null&&c!=null,Y=a&&(ct(i)||A);if(A&&!a)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
55
|
+
`),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(I&&!a)return process.stderr.write(`error: --retry requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
56
|
+
`),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(x&&!E)return process.stderr.write(`error: --author requires authenticated credentials for the TMS API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
57
|
+
`),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};let m=null,_=!1,L=!1;if(Y){m=s;let ae=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",B=await ar({tmsBaseUrl:n.tmsBaseUrl,testId:y,fromCommitId:v,newCommitId:m,basicAuth:k,onLockConflict:ae});if(B==="ok")_=!0,ft({baseUrl:De(n.tmsBaseUrl),testId:y,auth:Oe(k),lifecycle:o});else{if(B==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};m=null,L=!0}}let me=[],te=Y&&!_;if(!r.local&&E&&!te){let ae=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",B=await Ds({resolved:t,decisions:i,tmsBaseUrl:n.tmsBaseUrl,newCommitId:m??s,basicAuth:k,mode:ae,lifecycle:o});if(B.outcome==="ok")me=B.locks;else{if(_&&y&&v&&m&&await ir(n,y,v,m),Se(),B.outcome==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:c==null,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};process.stderr.write(`[lock] imported-unit conflict \u2014 whole run degrades to readonly (no commits, no uploads)
|
|
58
|
+
`),m=null,_=!1,L=!0}}return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:m,isFirstRun:c==null,hasAuth:E,canLock:a,lockAcquired:_,unitLocks:me,degradedReadonly:L}}async function Ds(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=we(n.file);if(!s?.test_id||!s?.commit_id)continue;let o=await ar({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)}),ft({baseUrl:De(e.tmsBaseUrl),testId:String(s.test_id),auth:Oe(e.basicAuth),lifecycle:e.lifecycle});continue}for(let i of r)await Be({baseUrl:De(e.tmsBaseUrl),testId:i.testId,body:{commitId:e.newCommitId,fromCommitId:i.fromCommitId},auth:Oe(e.basicAuth)}),Se(i.testId);return{outcome:o,locks:[]}}return{outcome:"ok",locks:r}}function De(e){return`${e}/kane-cli/v1`}function Oe(e){return{username:e.username,accessKey:e.access_key}}async function ar(e){let t=De(e.tmsBaseUrl),r=Oe(e.basicAuth),n={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},s=await Gt(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}
|
|
59
|
+
`),"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)
|
|
60
|
+
`),"abort";if(e.onLockConflict==="wait"){if(s.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
|
|
61
|
+
`),"abort";for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
|
|
62
|
+
`),await new Promise(l=>setTimeout(l,3e4));let p=await Gt(n);if(p.ok)return"ok";if(p.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${p.reason} (HTTP ${p.httpStatus}): ${p.message}; aborting
|
|
63
|
+
`),"abort"}}return process.stderr.write(`[lock] ${i} \u2014 running in readonly mode (no commit)
|
|
64
|
+
`),"readonly"}async function Ho(e,t,r,n,s,o,i,p,l,c,y,v,A){let{decisions:I,testId:x,testcaseId:k,fromCommitId:E,newCommitId:a}=t;if(!(s==="passed")||A){let m=A?"cancelled":s;v&&x&&E&&a&&(process.stderr.write(`[lock] run not committed (${m}); discarding playground lock
|
|
65
|
+
`),await ir(y,x,E,a));for(let _ of t.unitLocks)await ir(y,_.testId,_.fromCommitId,a??r.sessionId);Se();return}Se()}async function ir(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 Be({baseUrl:De(e.tmsBaseUrl),testId:t,body:{commitId:n,fromCommitId:r},auth:Oe(s)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
|
|
66
|
+
`)}async function qo(e){let t=null,r=!1,n=0,s=-1,o=-1,i=0,p=async l=>{if(l&&l.status==="failed")return n>0&&e.decisions[n-1].kind==="replay"&&(t=n-1),null;for(;n<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[n]);)n++;if(n>=e.decisions.length)return null;let c=e.decisions[n],y=e.resolved.steps[n],v=n;n++;let A=e.session.nextRunIndex();s=v,o=A,i=Date.now(),e.onSpawnStart?.(A),c.kind==="author"&&e.onAnyAuthorStep(v),await e.pushStepLevelDelta(y.config.variables,y.objective);let I=c.kind==="replay"?e.buildReplayConfig(v):e.buildStepConfigAt(v,A),x=c.kind==="replay"?"md5-match":c.reason,k=y.config??{},E={};for(let[a,Y]of Object.entries(k))Y!=null&&a!=="variables"&&a!=="assurance"&&(E[a]=Y);return{config:I,banner:{stepLabel:`Step ${v+1}/${e.decisions.length}`,objective:Vo(y.objective,100)},mode:c.kind,modeReason:x,perStepOverrides:Object.keys(E).length>0?E:void 0}};return await e.host.runSteps({topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:p,onStepEnd:l=>(l.status==="failed"&&s>=0&&e.decisions[s]?.kind==="replay"&&(t=s),e.onSequencerStepEnd(l,s,o,i)),onAllComplete:()=>{},onCancel:()=>{r=!0,e.onCancel()},spawnOpts:e.spawnOpts,priorAttemptRollup:e.priorAttemptRollup,screenshotDispatcher:e.screenshotDispatcher,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete}),{failedAt:t,cancelled:r}}export{ws as a,qn as b,Gn as c,ht as d,Di as e,ns as f,Jn as g,ci as h,Kn as i,Hn as j,Wt as k,zn as l,Yn as m,gt as n,Zn as o,Xn as p,ss as q,os as r,Vi as s,Ki as t,is as u,fs as v,ps as w,gs as x,Qt as y,vs as z,_s as A,Rs as B,Is as C,ks as D,nr as E,Ha as F,Es as G,or as H,td as I,$o as J,Le as K,Bo as L,Ts as M};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{
|
|
3
|
-
`)}let i=C(e);if(f(i)){let o="python";try{let c=new
|
|
2
|
+
import{b as p,c as E,d as j,e as y,f as M,g as C,i as A,l as D,m as F,q as T,s as $,t as O}from"./chunk-VK3NU742.js";import{c as H,d as z}from"./chunk-2YQ6TW77.js";import{a as k}from"./chunk-HRZOFTV7.js";import{p as B,q as R}from"./chunk-56PAQAX5.js";import{a as P}from"./chunk-7F2ZV46B.js";import{e as q}from"./chunk-UR6MHSHU.js";import{existsSync as f,mkdirSync as V,readFileSync as Z,renameSync as N,writeFileSync as K}from"fs";import{join as Q}from"path";function fe(e){D(p(e));let t=p(e);if(!f(t))return;let n=Q(t,"meta.json"),r=y(e);if(f(n)&&!f(r))try{V(j(e),{recursive:!0}),N(n,r)}catch(o){process.stderr.write(`warn: meta.json migration failed: ${o.message}
|
|
3
|
+
`)}let i=C(e);if(f(i)){let o="python";try{let c=new k().load();c.code_export?.language&&(o=c.code_export.language)}catch{}let a=M(e,"playwright",o);if(!f(a))try{N(i,a)}catch(c){process.stderr.write(`warn: generated-code migration failed: ${c.message}
|
|
4
4
|
`)}}if(f(r))try{let o=JSON.parse(Z(r,"utf8"));"md5sum"in o&&(delete o.md5sum,K(r,JSON.stringify(o,null,2)+`
|
|
5
5
|
`,"utf8"))}catch(o){process.stderr.write(`warn: meta.json md5sum strip failed: ${o.message}
|
|
6
|
-
`)}}async function ye(e){if(!e.isInteractive)return{recovered:!1};if(W(e.creds))return{recovered:!1};let{SingleShotApp:t}=await import("./SingleShotApp-
|
|
6
|
+
`)}}async function ye(e){if(!e.isInteractive)return{recovered:!1};if(W(e.creds))return{recovered:!1};let{SingleShotApp:t}=await import("./SingleShotApp-M3HNSUMZ.js"),{ScrollbackProvider:n}=await import("./scrollback-JLPJR25X.js"),{render:r}=await import("./build-JIKYOZUH.js"),i=await import("./react-QWOAB3TB.js"),o={current:null},a={current:!1},{waitUntilExit:c,unmount:l}=r(i.default.createElement(n,null,i.default.createElement(t,{resultRef:o,mode:"login",loginCompleteRef:a})),{exitOnCtrlC:!1});R(()=>l()),await c();try{process.stdin.setRawMode?.(!1)}catch{}return process.stdout.write("\x1B[?25h"),a.current?{recovered:!0}:(B(0,"Startup gate cancelled"),{recovered:!1})}function W(e){let t=e.getActiveProfile(),n=e.getDefaultEnv();if(!t||!!!(e.loadBasicAuth(t,n)||e.loadCredentials(t,n)))return!1;let i=e.loadProfileConfig(t,n)??{};return!!i.project_id&&!!i.folder_id}var J=q(H(),1);import{existsSync as v,readFileSync as U,readdirSync as X,statSync as Y}from"fs";import{dirname as ee,isAbsolute as te,join as g,relative as x,resolve as re,sep as h}from"path";import{createHash as ne}from"crypto";var S="testmd-bundle.json",d=class extends Error{constructor(t){super(t),this.name="BundleUsageError"}},_=e=>e.split(h).join("/");function I(e){if(!v(e))return[];let t=[];for(let n of X(e).sort()){let r=g(e,n);Y(r).isDirectory()?t.push(...I(r)):t.push(r)}return t}function se(e){let t=e.map(r=>ee(r).split(h)),n=t[0];for(let r of t.slice(1)){let i=0;for(;i<n.length&&i<r.length&&n[i]===r[i];)i++;n=n.slice(0,i)}return n.join(h)||h}function ie(e){for(let t of e){let n=F(t,U(t,"utf8"));for(let r of n.steps)if(r.body.kind==="import_ref"&&te(r.body.path))throw new d(`bundle sync: absolute @import is not portable after unzip: ${t} step ${r.index} (@import ${r.body.path})`)}}function G(e){let t=re(e),n=T(t);if(!n?.commit_id||!n?.test_id)throw new d(`bundle sync: ${t} is not authored \u2014 run \`kane-cli testmd run\` first (output-<stem>/.internal/meta.json needs commit_id + test_id)`);let r;try{r=O(t)}catch(s){throw s instanceof $?new d(`bundle sync: ${s.message}`):s}let i=[t];for(let s of r.steps)for(let u of s.trace.slice(1))i.includes(u.file)||i.push(u.file);ie(i);let o=[];for(let s of r.unitFiles){if(s.file===t)continue;let u=p(s.file);o.includes(u)||o.push(u)}let a=[...i],c=s=>{v(s)&&a.push(s)};c(E(t)),a.push(y(t)),c(g(p(t),".internal","execution.json")),a.push(...I(A(t)));for(let s of o)c(g(s,"Result.md")),a.push(...I(g(s,".internal","steps")));let l=se(a);if(v(g(l,S)))throw new d(`bundle sync: a real file named ${S} exists at the zip root (${l}) \u2014 it would collide with the generated manifest`);let b=a.map(s=>{let u=U(s);return{abs:s,rel:_(x(l,s)),sha256:ne("sha256").update(u).digest("hex"),bytes:u.length}}).sort((s,u)=>s.rel<u.rel?-1:1),m=_(x(l,t)),L={schema_version:2,entry:m,commit_id:n.commit_id,test_id:n.test_id,testcase_id:n.testcase_id??null,project_id:n.project_id??null,folder_id:n.folder_id??null,org_id:n.org_id??null,created_at:new Date().toISOString(),producer:{name:"kane-cli",version:P},files:b.map(s=>({path:s.rel,sha256:s.sha256,bytes:s.bytes})),units:r.unitFiles.filter(s=>s.file!==t).map(s=>({path:_(x(l,s.file)),kind:s.kind}))};return{zipRoot:l,entry:m,files:b,manifest:L}}var w=e=>e instanceof Error?e.message:String(e);function oe(e){return new Promise((t,n)=>{let r=(0,J.default)("zip",{zlib:{level:6}}),i=[];r.on("data",o=>i.push(o)),r.on("error",n),r.on("end",()=>t(Buffer.concat(i))),r.append(JSON.stringify(e.manifest,null,2)+`
|
|
7
7
|
`,{name:S});for(let o of e.files)r.file(o.abs,{name:o.rel});r.finalize()})}async function ae(e){let{plan:t,controller:n,testId:r,sessionId:i,commitId:o}=e,a;try{a=await oe(t)}catch(l){return{ok:!1,stage:"zip",error:w(l)}}let c;try{let l={key:"testmd",content_type:"application/zip",filename:`${o}-testmd.zip`},m=(await n.getPresignedUrls(r,i,[l])).urls?.testmd?.upload_url;if(!m)return{ok:!1,stage:"presign",error:"presign response missing testmd upload_url"};c=m}catch(l){return{ok:!1,stage:"presign",error:w(l)}}try{await z(c,a,"application/zip")}catch(l){return{ok:!1,stage:"upload",error:w(l)}}return{ok:!0,bytes:a.length}}async function Ee(e){let t;try{t=G(e.sourcePath)}catch(n){return n instanceof d?{ok:!1,stage:"collect",error:n.message}:{ok:!1,stage:"collect",error:w(n)}}return ae({...e,plan:t})}function je(e){return e.shouldUploadPipeline&&e.uploadSucceeded&&!!e.metaCommitId&&!!e.metaTestId}export{fe as a,ye as b,Ee as c,je as d};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as k}from"./chunk-
|
|
2
|
+
import{a as k}from"./chunk-2ZZDNPFN.js";import{y as u}from"./chunk-7F2ZV46B.js";import{a as f}from"./chunk-HCBYKLMW.js";import{a as m,b as s,k as b}from"./chunk-C44QQJR4.js";import{e as p}from"./chunk-UR6MHSHU.js";function B(t){let e=t;return e=e.replace(/@TS\{([^}]+)\}/g,"@S{$1}"),e=e.replace(/@TS-(\d+)/g,(o,i)=>`@S${parseInt(i,10)}.C1`),e=e.replace(/@TS(\d+)/g,(o,i)=>`@S${parseInt(i,10)}`),e=e.replace(/\\n/g,`
|
|
3
3
|
`),e}var c=p(f(),1),S=t=>t!==void 0&&/[A-Za-z0-9]/.test(t);function x(t){let e=[],o="",i=()=>{o&&(e.push({text:o}),o="")},d=(a,l,r)=>(a===0||!S(t[a-1]))&&(l+r>=t.length||!S(t[l+r])),n=0;for(;n<t.length;){let a=t.slice(n,n+2),l=t[n];if(a==="**"||a==="__"){let r=t.indexOf(a,n+2);if(r!==-1&&r>n+2&&(a==="**"||d(n,r,2))){i(),e.push({text:t.slice(n+2,r),bold:!0}),n=r+2;continue}}if(l==="`"){let r=t.indexOf("`",n+1);if(r!==-1&&r>n+1){i(),e.push({text:t.slice(n+1,r),code:!0}),n=r+1;continue}}if(l==="*"||l==="_"){let r=t.indexOf(l,n+1);if(r!==-1&&r>n+1&&(l==="*"||d(n,r,1))){i(),e.push({text:t.slice(n+1,r),italic:!0}),n=r+1;continue}}o+=l,n+=1}return i(),e.length===0&&e.push({text:""}),e}function h(t){return t.map((e,o)=>(0,c.jsx)(s,{bold:e.bold,italic:e.italic,color:e.code?u.dim:void 0,children:e.text},o))}function T(t){return t.split(`
|
|
4
4
|
`).map(e=>{if(e.trim()==="")return{kind:"blank"};let o=e.match(/^\s*[-*+]\s+(.*)$/);if(o)return{kind:"bullet",segs:x(o[1])};let i=e.match(/^\s*(\d+)\.\s+(.*)$/);if(i)return{kind:"numbered",n:i[1],segs:x(i[2])};let d=e.match(/^#{1,6}\s+(.*)$/);return d?{kind:"heading",segs:x(d[1])}:{kind:"para",segs:x(e)}})}function R(t,e,o=""){switch(t.kind){case"blank":return(0,c.jsx)(s,{children:o||" "},e);case"heading":return(0,c.jsxs)(s,{bold:!0,children:[o,h(t.segs)]},e);case"bullet":return(0,c.jsx)(m,{marginLeft:1,children:(0,c.jsxs)(s,{children:[o,"\u2022 ",h(t.segs)]})},e);case"numbered":return(0,c.jsx)(m,{marginLeft:1,children:(0,c.jsxs)(s,{children:[o,`${t.n}. `,h(t.segs)]})},e);default:return(0,c.jsxs)(s,{children:[o,h(t.segs)]},e)}}function $({text:t,accent:e=u.generateAccent}){let o=T(B(t)),{stdout:i}=b(),d=i?.columns??80;return(0,c.jsxs)(m,{marginBottom:1,children:[(0,c.jsx)(m,{width:2,flexShrink:0,children:(0,c.jsx)(s,{color:e,children:"\u2503"})}),(0,c.jsx)(m,{flexDirection:"column",width:d-2,children:o.map((n,a)=>R(n,a))})]})}var g=p(f(),1),I=5;function C({thinking:t,expanded:e,thinkingDone:o,maxLines:i=I}){if(!e)return(0,g.jsxs)(m,{paddingX:1,children:[(0,g.jsx)(s,{color:u.dim,children:o?"\u2237 thinking complete ":"\u2237 thinking\u2026 "}),(0,g.jsx)(s,{color:u.muted,children:o?"(ctrl+t to view)":"(ctrl+t to show)"})]});let d=t.split(`
|
|
5
5
|
`),n=Math.max(0,d.length-i),a=n>0?d.slice(-i).join(`
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{j as Re,k as oe,l as se,m as _e,n as $e,o as ae}from"./chunk-ATGRRKEV.js";import{a as te,c as re,d as ye,f as ie}from"./chunk-JGOZUAMC.js";import{a as P,b as we,d as ke}from"./chunk-OS4VSIHT.js";import{d as ve}from"./chunk-6J5T5FEY.js";import{a as S}from"./chunk-CLGC7VEO.js";import{a as X,b as N,c as ee,d as W,e as he,g as O,h as ne}from"./chunk-W5TTF7GB.js";import{a as ge}from"./chunk-JFAFKHDX.js";import{b as Z,c as J,d as Q}from"./chunk-GNIFMQNK.js";import{e as me,g as pe}from"./chunk-W4B5LOEX.js";import{A as I}from"./chunk-TH47OOBV.js";import{f as T}from"./chunk-DUAXZYAD.js";import{existsSync as Oe,statSync as Ue}from"fs";import{basename as G,resolve as q}from"path";function Ee(e){if(!e||e.stale_refs.length===0)return"\u2014";let n=e.direct_refs??[];return`${e.stale_refs.length} stale${n.length>0?` \xB7 ${n.length} direct`:""}`}function ce(e,n){let t=[...e.rows.filter(a=>a.kind!=="REMOVE").map(a=>[a.kind,S(a.ref),a.reason,Ee(a.impact)]),...e.archive.map(a=>["ARCHIVE",S(a.ref),a.why,Ee(a.impact)])],r=Math.max(40,n??100),i=[`reconcile ${e.source_id} \u2014 head ${e.head.status} \xB7 ${t.length} decision${t.length===1?"":"s"}`];return t.length>0&&i.push(...ve(["kind","ref","why","impact"],t,r,2)),e.changed&&i.push(e.held?`extract ran in override mode; ${e.defaultsTaken??0} default(s) auto-taken; matched-but-changed and new proposals HELD for your verdict (staged \u2014 nothing committed)`:`extract ran in override mode; ${e.defaultsTaken??0} default(s) auto-taken; matched-but-changed proposals auto-committed as edits`),i.push("each row becomes a card below \u2014 verdicts commit as they land"),e.planPath&&i.push(`plan: ${e.planPath}`),i}var xe=new Set(["interactive","agent","ci","override"]);function Ae(e,n){if(e.mode!==void 0&&!xe.has(e.mode))return{error:`--mode must be interactive | agent | ci | override, got '${e.mode}'`,code:"MODE_USAGE"};let t=e.mode,r="reconcile without a TTY needs an explicit mode \u2014 pass --mode agent|ci|override, or --plan for a preview";return t==="interactive"&&!n?{error:r}:t||(n?"interactive":e.plan?"override":{error:r})}async function Pe(e){let{makeHeadlessIO:n,agentRefusal:t}=await import("./headless-io-66RG5NN5.js");return t(n("ndjson","reconcile"),e,"MODE_USAGE")}function Me(e,n,t,r){if(J(t)){let v=Q(t),s=v?.sourceIdFor(t)??null;if(v===null||s===null)return{error:`--from '${t}' is not a supported remote URL \u2014 supported: ${Z.map(u=>u.hint).join("; ")}`};if(r!==void 0&&r!==s)return{error:`--source-id '${r}' does not match this URL's own identity '${s}' \u2014 re-run without --source-id. A source adopted with --as updates by re-running context ingest with the same --as; reconcile follows only the URL's own id`};let c=I(e);if(!c.heads.has(s))return{error:`unknown source '${s}' \u2014 see \`kane-cli context list --type source\`. If this URL was ingested under a custom id, update it by re-running context ingest with the same --as`};if(c.heads.get(s)==null)return{error:`source '${s}' is retired \u2014 restore it first with \`kane-cli context revert\`, then reconcile`};let _=z(e,s,{remoteUrl:t});return _!==null?{error:_}:{sourceId:s,remoteUrl:t}}if(r===void 0)return{error:"reconcile needs --from <file> AND --source-id <id> \u2014 see `kane-cli context list --type source` for ids"};let i=q(n,t);if(!Oe(i)||!Ue(i).isFile())return{error:`--from '${t}' is not a file \u2014 pass the changed source document`};let a=me(i);if(!a.ok)return{error:`--from '${t}' is not an ingestable document \u2014 allowed: ${a.allowlist.join(", ")}`};let o=I(e);if(!o.heads.has(r))return{error:`unknown source '${r}' \u2014 see \`kane-cli context list --type source\``};if(o.heads.get(r)==null)return{error:`source '${r}' is retired \u2014 restore it first with \`kane-cli context revert\`, then reconcile`};let w=z(e,r,{filePath:i});if(w!==null)return{error:w};let f=null;try{f=pe(i)}catch{}return f!==null&&f!==r&&o.heads.get(f)!=null?{error:`'${G(i)}' already backs live source '${f}' \u2014 did you mean --source-id ${f}? To truly move these bytes under '${r}', retire '${f}' first`}:{sourceId:r,filePath:i}}function C(e){return e==null?"(none)":e.slice(0,19)}function Y(e,n,t,r=!1,i){if(e.out(`reconcile ${n.source_id}: head ${n.head.status} \u2014 ${C(n.head.before)} \u2192 ${C(n.head.after)}`),r||(e.out(`note: ${n.note}`),e.out(`skipped arms: ${n.skipped_arms}`)),n.changed&&(e.out(n.held?`extract ran in override mode; ${t?.defaultsTaken??0} default(s) auto-taken; matched-but-changed and new proposals HELD for your verdict (staged \u2014 nothing committed)`:`extract ran in override mode; ${t?.defaultsTaken??0} default(s) auto-taken; matched-but-changed proposals auto-committed as edits`),i?.({type:"defaults_taken",count:t?.defaultsTaken??0})),r){let a=n.changeset??[],o=(f,v)=>{let s=a.filter(c=>c.kind===f).length;return s>0?`${s} ${v}`:null},w=[o("ADD","add"),o("MODIFY","modify"),o("ARCHIVE","archive")].filter(Boolean);n.changed&&e.out(`changeset: ${a.length} item(s)${w.length?` \u2014 ${w.join(" \xB7 ")}`:""}`),e.out(`plan: ${n.rows.length} row(s) \u2014 each gets a card below`);return}if(n.changed){let a=n.changeset??[];e.out(`changeset: ${a.length} item(s)`);for(let o of a)if(o.kind==="MODIFY")e.out(` [MODIFY] ${S(o.ref)} \u2014 ${o.summary} (${C(o.old_cid)} \u2192 ${o.new_cid===null?"(staged)":C(o.new_cid)})`);else if(o.kind==="ADD")e.out(` [ADD] ${S(o.ref)}`);else{e.out(` [ARCHIVE] ${S(o.ref)} \u2014 ${o.why}`);let w=le(o.impact,"retiring drops");w&&e.out(` ${w}`)}}e.out(`plan: ${n.rows.length} row(s)`);for(let a of n.rows){e.out(` [${a.kind}] ${S(a.ref)} \u2014 ${a.reason}`);let o=le(a.impact,"approving marks");o&&e.out(` ${o}`),e.out(` provenance: ${a.provenance}`),e.out(` action: ${a.action}`)}}function De(e,n){return ce({source_id:e.source_id,head:{status:e.head.status},rows:e.rows,archive:(e.changeset??[]).filter(t=>t.kind==="ARCHIVE"),changed:e.changed,held:!!e.held,defaultsTaken:n?.defaultsTaken},process.stdout.columns)}function le(e,n){if(!e||e.stale_refs.length===0)return null;let t=e.direct_refs??[];return`impact: ${n} ${e.stale_refs.length} item(s) stale`+(t.length>0?` \u2014 ${t.length} directly touched: ${t.join(", ")}`:"")}function D(e){return e==="interactive"?"override":e}async function M(e,n,t,r,i,a,o=[],w="override",f,v,s,c,_,u,E){let m;try{m=ne(e)}catch(d){return P(r,d instanceof Error?d.message:String(d)),1}try{if(!t){let{runWalkSession:d}=await import("./walk-session-AINBHZKB.js"),{telemetryEnvName:R}=await import("./bootstrap-RUJBMB2P.js");return await d({dir:e,rows:n,archive:o,held:f??null,childMode:w,runDesign:c??null,mark:a,markA:s,...v?{archiveState:v}:{},...u?{meta:{verb:"reconcile",sid:u,env:R()}}:{},...E?{resumeCmd:E}:{},signals:b=>U(e,b.ref,b.verdict,b.reason),..._?{script:_}:{}})}return await Te(e,n,t,r,i,a,o,w,f,v)}finally{m()}}var H=(e,n)=>e?`kane-cli maintain reconcile --from ${e} --source-id ${n}`:void 0,He=e=>e===null?void 0:"filePath"in e?e.filePath:e.remoteUrl,V=e=>`${e} high-risk item(s) need a human \u2014 ci mode won't guess. Walk interactively or use --mode agent.`;function F(e,n,t){let r=n.rows;e({type:"reconcile_plan",source_id:n.source_id,plan_path:t,rows:r.map(i=>({kind:i.kind,ref:i.ref,why:i.reason})),archive:n.changeset.filter(i=>i.kind==="ARCHIVE").map(i=>({ref:i.ref,why:i.why}))})}function de(e={}){return{type:"reconcile_summary",applied:0,skipped:0,deferred:0,plan_only:0,failed:0,paused:0,stale_created:0,...e}}var L=de();async function j(e,n,t,r,i,a,o,w,f){F(i,n,t);let v=n.changeset.filter(_=>_.kind==="ARCHIVE"&&f?.[_.ref]===void 0),s=n.rows,c;try{c=ne(e)}catch(_){return i({type:"error",message:_ instanceof Error?_.message:String(_)}),i(de()),2}try{return await Fe(e,n,t,r,i,a,o,s,v,w)}finally{c()}}async function Fe(e,n,t,r,i,a,o,w,f,v){let s=0,c=0,_=0,u=0,E=0,m=0,d=0,R=new Set,b=(h,p)=>{try{v?.(h,p)}catch{}};for(let[h,p]of w.entries()){i({type:"reconcile_row_start",kind:p.kind,ref:p.ref,...p.impact?{stale:p.impact.stale_refs.length,direct:p.impact.direct_refs?.length??0}:{}});let g=(l,$,x)=>i({type:"reconcile_row_end",kind:p.kind,ref:p.ref,outcome:l,...$!==void 0?{exit_code:$}:{},...x?{detail:x}:{}});if(p.applied){c++,g("skipped");continue}if(p.kind==="REMOVE"){E++,g("plan-only");continue}if(p.held_ref&&n.held){let l=new Set;if(p.kind==="MODIFY"&&p.impact){let x=I(e);for(let A of p.impact.stale_refs){let K=x.resolve(A);K&&x.stale(K.tip)==="fresh"&&l.add(A)}}let $=oe(e,n.held,p.held_ref,ue);if(!$.ok){_++,d===0&&(d=1),g("failed",1,$.message);continue}if($.kind==="ADD"){let x=await r($.ref,{yes:!0,mode:o});if(x!==0){x===3?(u++,d===0&&(d=3),g("paused",3)):(_++,d===0&&(d=1),g("failed",x));continue}}s++,$.kind!=="ADD"&&p.impact&&(m+=l.size),b(h,"approved"),U(e,p.ref,$.kind==="ADD"?"gap-resolved-create":"gap-resolved-evolve"),g("applied");continue}let y=te(I(e),p.ref);if(!y.ok){c++,g("skipped");continue}let k=y.target;if(R.has(k.ucTip)){c++,g("skipped");continue}if(p.kind==="ADD"){let l=await r(k.seamRef,{yes:!0,mode:o});if(l===3){u++,d===0&&(d=3),g("paused",3);continue}if(l!==0){_++,d===0&&(d=1),g("failed",l);continue}R.add(k.ucTip),s++,b(h,"approved"),U(e,p.ref,"gap-resolved-create"),g("applied")}else{let l=await re(e,k,{yes:!0,mode:o},a,r,"batch");l.outcome==="evolved"?(R.add(k.ucTip),s++,b(h,"approved"),U(e,p.ref,"gap-resolved-evolve"),g("applied")):l.outcome==="paused"?(u++,d===0&&(d=l.code),g("paused",l.code)):l.outcome==="failed"?(_++,d===0&&(d=1),g("failed",l.code)):(c++,g("skipped"))}}return f.length>0&&(i({type:"reconcile_paused",plan_path:t,pending:f.map(h=>({ref:h.ref,why:h.why}))}),u+=f.length,d===0&&(d=3)),i(de({applied:s,skipped:c,plan_only:E,failed:_,paused:u,stale_created:m})),d}var ue={kind:"human",id:process.env.USER??"operator"};function U(e,n,t,r){ge(e,{ts:new Date().toISOString(),command:"reconcile-walk",id:n,verdict:t,polarity:"preference",by:ue,target:n,...r!==void 0?{reason:r}:{}})}async function Te(e,n,t,r,i,a,o=[],w="override",f,v){let s=0,c=0,_=0,u=0,E=0,m=0,d=0,R=new Set;for(let[b,h]of n.entries()){if(h.applied){r.out(`skipped ${h.ref} \u2014 already applied (${h.applied.outcome} at ${h.applied.at})`),c++;continue}let p=l=>{try{a?.(b,l)}catch($){P(r,`could not record applied state for ${h.ref}: ${$ instanceof Error?$.message:String($)}`)}};if(h.kind==="REMOVE"){r.out(`REMOVE ${h.ref} \u2014 plan-only in this release (not executed)`),u++;continue}if(h.held_ref&&f){let l=oe(e,f,h.held_ref,ue);if(!l.ok){P(r,`held ${h.ref}: ${l.message}`),E++,d===0&&(d=1);continue}if(r.out(`committed ${l.ref} (${h.kind==="ADD"?"minted":"updated \u2014 old\u2192new redirect"})`),l.kind==="ADD"){let $=await i(l.ref,{yes:t,mode:w});if($===3){r.out(`design session for ${l.ref} paused \u2014 resume with the "kane-cli design tests --resume <session>" command printed above`),m++,d===0&&(d=3),p("approved");continue}if($!==0){P(r,`design run for ${l.ref} ended with exit code ${$}`),E++,d===0&&(d=1),p("approved");continue}}s++,p("approved"),U(e,h.ref,h.kind==="ADD"?"gap-resolved-create":"gap-resolved-evolve");continue}let g=I(e),y=te(g,h.ref);if(!y.ok){r.out(`skipped ${h.ref} \u2014 ${y.message}`),c++;continue}let k=y.target;if(R.has(k.ucTip)){r.out(`skipped ${h.ref} \u2014 use-case ${k.display} already handled in this walk`),c++;continue}if(h.kind==="ADD"){let l=await i(k.seamRef,{yes:t,mode:w});if(l===3){r.out(`design session for ${k.display} paused \u2014 resume with the "kane-cli design tests --resume <session>" command printed above; this row lands when that session completes`),m++,d===0&&(d=3);continue}if(l!==0){P(r,`design run for ${k.display} ended with exit code ${l}`),E++,d===0&&(d=1);continue}R.add(k.ucTip),s++,p("approved"),U(e,h.ref,"gap-resolved-create")}else{let l=await re(e,k,{yes:!0,mode:w},r,i,"batch");l.outcome==="evolved"?(R.add(k.ucTip),s++,p("approved"),U(e,h.ref,"gap-resolved-evolve")):l.outcome==="paused"?(m++,d===0&&(d=l.code)):l.outcome==="failed"?(E++,d===0&&(d=l.code)):c++}}for(let b of o)if(b.kind==="ARCHIVE"&&v?.[b.ref]===void 0){r.out(`[ARCHIVE] ${b.ref} \u2014 ${b.why}`);{let h=le(b.impact,"retiring drops");h&&r.out(` ${h}`)}r.out(" plan-only \u2014 retire belongs to the interactive session (never headless)"),u++}return r.out(`reconcile walk: ${s} applied, ${c} skipped, ${_} deferred, ${u} plan-only`+(E>0?`, ${E} failed`:"")+(m>0?`, ${m} paused`:"")),d}var Be=new Set(Z.map(e=>e.name));function z(e,n,t){let r=I(e),i=r.heads.get(n);if(i==null)return null;let a=r.mediaOf(i);if("remoteUrl"in t){let o=Q(t.remoteUrl)?.name??"remote";return a.format!==o?`source '${n}' is backed by ${a.format} content, not a ${o} source \u2014 reconcile it with the --from it was originally ingested from`:null}return Be.has(a.format)?`source '${n}' is a remote ${a.format} source \u2014 pass its URL to --from, not a file`:null}function fe(e,n,t,r){return"remoteUrl"in n?$e(e,n.remoteUrl,{out:t.out,err:t.err},r.remoteFindProvider):_e(e,n.filePath)}function Ie(e){return e.remote_url!==void 0?{remoteUrl:e.remote_url}:e.backing_path!==void 0?{filePath:e.backing_path}:null}async function Se(e,n,t,r,i,a=!1,o=!1){let w=i.seams??{reingest:fe(e,t,r,i),reextract:ae(e,{stage:a,hostOut:c=>r.out(c),hostEmit:c=>{c.type!=="run_start"&&i.emitEvent?.(c)},...i.emitEvent?{}:{hostProgress:c=>process.stderr.write(c+`
|
|
3
|
+
`)}})},f=null,v={reingest:w.reingest,reextract:async c=>f=await w.reextract(c)},s;try{r.out(`reconciling ${n}: re-reading the source and comparing against the graph\u2026`),s=await(i.buildPlan??se)(e,n,v)}catch(c){return P(r,`reconcile failed: ${c instanceof Error?c.message:String(c)}`),null}if(s.changed)if(o)for(let c of De(s,f))r.out(c);else Y(r,s,f,!1,i.emitEvent);return s}async function Ve(e){let[{render:n},t,{ScrollbackProvider:r},{ChatSurface:i},{makeChatController:a},{makeReconcileDeps:o}]=await Promise.all([import("./build-JIKYOZUH.js"),import("./react-QWOAB3TB.js"),import("./scrollback-JLPJR25X.js"),import("./ChatSurface-B3ULYDYC.js"),import("./chat-controller-R4THYYPU.js"),import("./reconcile-deps-6KTJHBMJ.js")]),w=t.default??t,f=a(),v=o({contextDir:e,note:s=>f.note(s)});return new Promise(s=>{let c=n(w.createElement(r,null,w.createElement(i,{controller:f,verb:"extract",reconcile:v,autoReview:!0,onReviewExit:()=>{c.unmount(),s(0)},onCtrlC:()=>{c.unmount(),s(v.pending()?3:0)}})),{exitOnCtrlC:!1})})}async function Le(e,n,t,r,i){let a=N(e,n);if("error"in a)return P(r,a.error),2;let{plan:o,path:w}=a,f=t==="override"||t==="ci";if(n===void 0&&t==="interactive"&&r.isTTY&&!await r.confirm(`apply plan ${G(w)} for ${o.source_id} (created ${o.created})?`))return r.out(`not applying ${G(w)}`),0;let v=i.runDesignForUc??ie,s=i.runDesignForUc??null,c=i.sessionScript,_=(h,p)=>O(w,h,p),u=(h,p)=>W(w,h,p),E=T(e);if(E===o.head_pin){if(t==="agent"){let p=i.emitEvent??(()=>{});return j(e,B(o),w,v,p,r,D(t),_,o.archive_state)}let h=ee(o);if(t==="ci"&&h.length>0)return P(r,V(h.length)),2;if(r.out(`applying stored plan ${G(w)} for ${o.source_id} (${o.rows.length} row(s))`),!f)for(let p of ce({source_id:o.source_id,head:{status:"stored plan"},rows:o.rows,archive:(o.changeset??[]).filter(g=>g.kind==="ARCHIVE"),changed:!1,held:!!o.held},process.stdout.columns))r.out(p);return M(e,o.rows,f,r,v,_,o.changeset??[],D(t),o.held,o.archive_state,u,s,c,o.source_id,H(o.backing_path??o.remote_url,o.source_id))}if(r.out(`graph moved since this plan (${C(o.head_pin)} \u2192 ${C(E)}) \u2014 recomputing`),o.held)return Ce(e,o,r,i,t,v,!1);let m=Ie(o);if(m===null)return P(r,`stored plan for ${o.source_id} names no backing file or URL \u2014 re-run reconcile --from`),2;let d=z(e,o.source_id,m);if(d!==null)return P(r,`stored plan cannot replay: ${d}`),2;let R=await Se(e,o.source_id,m,r,i,!1,t==="interactive");if(!R)return 1;if(!R.changed)return Y(r,R,null,!1,i.emitEvent),0;if(t==="agent"){let h=i.emitEvent??(()=>{});return j(e,R,null,v,h,r,D(t))}let b=R.changeset.filter(h=>h.kind==="ARCHIVE");return t==="ci"&&b.length>0?(P(r,V(b.length)),2):M(e,R.rows,f,r,v,void 0,R.changeset,D(t),R.held,void 0,void 0,s,c,R.source_id,H(He(m),R.source_id))}function B(e,n=!1){return{source_id:e.source_id,changed:!0,head:{status:"unchanged",before:e.head_pin,after:e.head_pin},note:e.note,skipped_arms:e.skipped_arms,changeset:e.changeset??[],rows:n?e.rows.filter(t=>t.applied===void 0):e.rows,...e.held?{held:e.held}:{}}}async function je(e,n,t,r,i,a,o){let w=r.runDesignForUc??null,f=r.sessionScript,v=he(e,n);if(v===null)return null;if("error"in v)return P(t,v.error),2;let{plan:s,path:c}=v,_=s.rows.filter(d=>d.applied===void 0),u=ee(s),E=r.emitEvent??(()=>{});if(_.length===0&&u.length===0){t.out(`already reconciled \u2014 plan ${s.created} applied ${s.rows.length} row(s)`);let d=ye(I(e)).staleCount;return d>0&&(t.out(`${d} item(s) still stale \u2014 kane-cli maintain evolve --from-stale`),E({type:"stale_debt",count:d})),i==="agent"&&(F(E,B(s),c),E({...L})),0}let m=T(e);return m!==s.head_pin?(t.out(`plan ${s.created} superseded \u2014 graph moved (${C(s.head_pin)} \u2192 ${C(m)}); recomputing`),Ce(e,s,t,r,i,a,o)):(t.out(`resuming plan ${s.created} \u2014 ${_.length} pending row(s)${u.length>0?`, ${u.length} undecided archive item(s)`:""}`),o?(Y(t,B(s),null,!1,r.emitEvent),t.out(`plan stored: ${c}`),i==="agent"&&(F(E,B(s),c),E({...L})),0):i==="agent"?j(e,B(s),c,a,E,t,D(i),(d,R)=>O(c,d,R),s.archive_state):i==="ci"&&u.length>0?(P(t,V(u.length)),2):M(e,s.rows,i==="override"||i==="ci",t,a,(d,R)=>O(c,d,R),s.changeset??[],D(i),s.held,s.archive_state,(d,R)=>W(c,d,R),w,f,s.source_id,H(s.backing_path??s.remote_url,s.source_id)))}async function Ce(e,n,t,r,i,a,o){let w=r.runDesignForUc??null,f=r.sessionScript,v;if(n.held){let g=I(e),y=new Set(n.rows.filter(l=>l.held_ref!==void 0&&l.applied!==void 0).map(l=>l.held_ref)),k=[];for(let l of n.held.rows){if(y.has(l.temp_ref))continue;if(!l.matched_cid){k.push(l);continue}let $=g.tipOf(l.matched_cid);if(g.superseded.get($)===null){t.out(`dropped held "${l.title}" \u2014 its use-case was retired meanwhile`),r.emitEvent?.({type:"held_dropped",ref:l.temp_ref,title:l.title,reason:"target_retired"});continue}k.push($===l.matched_cid?l:{...l,matched_cid:$,uc:{...l.uc,matches_existing:{cid:$}}})}v={source_id:n.held.source_id,rows:k}}let s=Ie(n);if(s===null)return P(t,`stored plan for ${n.source_id} names no backing file or URL \u2014 re-run reconcile --from`),2;let c=z(e,n.source_id,s);if(c!==null)return P(t,`stored plan cannot replay: ${c}`),2;let _=r.seams??{reingest:fe(e,s,t,r),reextract:ae(e,{stage:v!==void 0,hostOut:g=>t.out(g),hostEmit:g=>{g.type!=="run_start"&&r.emitEvent?.(g)},...r.emitEvent?{}:{hostProgress:g=>process.stderr.write(g+`
|
|
4
|
+
`)}})},u;try{u=await(r.buildPlan??se)(e,n.source_id,_,{resumeHeld:v})}catch(g){return P(t,`reconcile failed: ${g instanceof Error?g.message:String(g)}`),1}if(i==="interactive"&&!o)for(let g of De(u,null))t.out(g);else Y(t,u,null,!1,r.emitEvent);let E=T(e),m=null;if(E!=null){let g={},y=new Set(u.changeset.filter(k=>k.kind==="ARCHIVE").map(k=>k.ref));for(let[k,l]of Object.entries(n.archive_state??{}))y.has(k)&&(g[k]=l);m=X(e,{version:2,source_id:u.source_id,...n.remote_url!==void 0?{remote_url:n.remote_url}:{backing_path:n.backing_path},head_pin:E,created:new Date().toISOString().replace(/[:.]/g,"-"),skipped_arms:u.skipped_arms,note:u.note,changeset:u.changeset,rows:u.rows,...u.held?{held:u.held}:{},...Object.keys(g).length>0?{archive_state:g}:{}}),t.out(`plan stored: ${m}`)}if(o){if(i==="agent"){let g=r.emitEvent??(()=>{});F(g,u,m),g({...L})}return 0}let d=r.emitEvent??(()=>{}),R=m?N(e,m).plan.archive_state:void 0,b=m?(g,y)=>O(m,g,y):void 0,h=m?(g,y)=>W(m,g,y):void 0;if(i==="agent")return j(e,u,m,a,d,t,D(i),b,R);let p=u.changeset.filter(g=>g.kind==="ARCHIVE"&&R?.[g.ref]===void 0);return i==="ci"&&p.length>0?(P(t,V(p.length)),2):M(e,u.rows,i==="override"||i==="ci",t,a,b,u.changeset,D(i),u.held,R,h,w,f,u.source_id,H(n.backing_path??n.remote_url,u.source_id))}async function be(e,n,t={},r=process.cwd()){let{telemetryBootstrap:i,telemetryEnvName:a}=await import("./bootstrap-RUJBMB2P.js"),o=i({verb:"reconcile",mode:typeof e.mode=="string"?e.mode:"interactive",contextRoot:q(r,".context"),env:a(),applyPlanPath:typeof e.apply=="string"?q(r,e.apply):void 0,write:!0,longSession:!0});e.mode==="agent"&&t.emitEvent?.({type:"run_start",session:o.ids.session_id});let w=await Ye(e,n,t,r);return w===1&&e.mode!=="agent"&&(n.err??n.out)(o.supportFooter()),await o.end({exit_code:w}),w}async function Ye(e,n,t={},r=process.cwd()){let i=e.apply!==void 0&&e.apply!==!1,a=typeof e.apply=="string"?e.apply:void 0;if(e.plan&&i)return P(n,"pass --plan OR --apply, not both"),2;let o=e.from!==void 0||!i,w=e.from!==void 0&&J(e.from);if(o&&(!e.from||!e.sourceId&&!w))return P(n,"reconcile needs --from <file|url> AND --source-id <id> (files only \u2014 a URL derives its own id) \u2014 see `kane-cli context list --type source` for ids"),2;if(e.from&&a!==void 0)return P(n,"pass --from OR --apply <path>, not both \u2014 a stored plan names its own source"),2;let f=we(r,n);if(!f)return 2;if(e.mode!==void 0&&!xe.has(e.mode))return Pe(`--mode must be interactive | agent | ci | override, got '${e.mode}'`);let v=e.mode==="agent"||e.mode==="ci"||e.mode==="override";if(i&&!v&&!n.isTTY)return P(n,"refusing to apply without a TTY to confirm \u2014 pass --mode override|ci"),2;let s=!e.plan,c="override";if(e.from){let y=Ae(e,n.isTTY);if(typeof y=="object")return y.code==="MODE_USAGE"?Pe(y.error):(P(n,y.error),2);c=y}let _=c==="override"||c==="ci";if(i&&!e.from){let{makeReconcileDeps:y}=await import("./reconcile-deps-6KTJHBMJ.js"),k=a===void 0?y({contextDir:f}).pending():null;if(k?.kind==="cards"){let $=e.mode??"interactive";return!n.isTTY||$!=="interactive"?(P(n,`a held changeset for ${k.source} awaits review (${k.count} change(s)) \u2014 resume in a terminal: kane-cli maintain reconcile --apply [HELD_REVIEW]`),2):(t.cardApplyMount??Ve)(f)}let l=e.mode??"interactive";return Le(f,a===void 0?void 0:q(r,a),l,n,t)}let u=Me(f,r,e.from,e.sourceId);if("error"in u)return P(n,u.error),2;if(!i){let{sessionsHoldingSource:y}=await import("./sessions-GIEXOCE4.js"),{holders:k,corrupt:l}=y(f,u.sourceId);if(l>0)return P(n,`cannot verify review holds \u2014 ${l} session file(s) unreadable; inspect with kane-cli context sessions list, clean with kane-cli context sessions clean, then retry [SESSIONS_UNREADABLE]`),2;if(k.length>0)return P(n,`session ${k[0]} holds item(s) for review pinned to ${u.sourceId} \u2014 finish that review first: kane-cli context extract --resume ${k[0]} [SOURCE_HELD]`),2}if(c==="interactive"&&!e.plan&&!i){let y=t.seams?.reingest??fe(f,u,n,t),k;try{k=await y(u.sourceId)}catch($){return P(n,$ instanceof Error?$.message:String($)),1}let l=k.status==="unchanged"?null:Re(f,u.sourceId);if(k.status!=="unchanged"&&!l)return n.out(`${u.sourceId} landed for the first time \u2014 extract it: kane-cli context extract --source ${u.sourceId}`),0;if(l){let x=await(t.chatMount??(async A=>{let{bindExtractInteractive:K}=await import("./extract-bind-EXW32RUY.js");return K(A)}))({mode:"interactive",posture:"reconcile",source:u.sourceId,changeContext:l});if(x===3){let{sessionsHoldingSource:A}=await import("./sessions-GIEXOCE4.js");if(A(f,u.sourceId).holders.length===0)return 0}return x}}let E="remoteUrl"in u?{remoteUrl:u.remoteUrl}:{filePath:u.filePath},m=await Se(f,u.sourceId,E,n,t,!!e.plan||c==="interactive",c==="interactive"&&!e.plan);if(!m)return 1;let d=t.runDesignForUc??ie,R=t.runDesignForUc??null,b=t.sessionScript;if(!m.changed){let y=await je(f,u.sourceId,n,t,c,d,!!e.plan);if(y!==null)return y;if(Y(n,m,null,!1,t.emitEvent),c==="agent"){let k=t.emitEvent??(()=>{});F(k,m,null),k({...L})}return 0}let h=T(f),p=null;if(h!=null?p=X(f,{version:2,source_id:m.source_id,..."remoteUrl"in E?{remote_url:E.remoteUrl}:{backing_path:E.filePath},head_pin:h,created:new Date().toISOString().replace(/[:.]/g,"-"),skipped_arms:m.skipped_arms,note:m.note,changeset:m.changeset,rows:m.rows,...m.held?{held:m.held}:{}}):P(n,"no chain head after extract \u2014 plan not stored"),c==="agent"){let y=t.emitEvent??(()=>{});if(!s)return F(y,m,p),y({...L}),0;let k=p?(l,$)=>O(p,l,$):void 0;return j(f,m,p,d,y,n,D(c),k)}if(!s)return p&&n.out(`plan stored: ${p}`),0;let g=m.changeset.filter(y=>y.kind==="ARCHIVE");if(c==="ci"&&g.length>0)return p&&n.out(`plan stored: ${p}`),P(n,V(g.length)),2;if(p){n.out(`plan stored: ${p}`);let y=p;return M(f,Ke(f,y)??m.rows,_,n,d,(k,l)=>O(y,k,l),m.changeset,D(c),m.held,void 0,void 0,R,b,m.source_id,H(e.from,m.source_id))}return M(f,m.rows,_,n,d,void 0,m.changeset,D(c),m.held,void 0,void 0,R,b,m.source_id,H(e.from,m.source_id))}function Ke(e,n){let t=N(e,n);return"error"in t?null:t.plan.rows}async function dn(e,n={},t,r=process.cwd()){if(e.mode==="agent"){let{makeHeadlessIO:i}=await import("./headless-io-66RG5NN5.js"),a=t?i("ndjson","reconcile",t):i("ndjson","reconcile"),o={out:a.out,err:v=>a.event({type:"error",message:v}),isTTY:!1,confirm:async()=>!1,ask:async()=>""},{runWithChannel:w}=await import("./run-channel-RGH4WIQX.js"),f=2;try{f=await w({event:v=>a.event(v)},()=>be(e,o,{...n,emitEvent:v=>a.event(v)},r))}catch(v){f=1,a.event({type:"error",message:v instanceof Error?v.message:String(v)})}return a.done(f)}return be(e,ke(),n,r)}export{Ae as a,Me as b,D as c,U as d,be as e,dn as f};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{execFile as x}from"child_process";var f=15e3,l=124,g=127,p=8*1024*1024,w=(s,c,e={})=>new Promise(d=>{let E=x(s,c,{timeout:e.timeoutMs??f,maxBuffer:p,windowsHide:!0,...e.env?{env:e.env}:{},...e.cwd?{cwd:e.cwd}:{}},(t,n,u)=>{let m=typeof n=="string"?n:String(n??""),o=typeof u=="string"?u:String(u??"");if(!t){d({stdout:m,stderr:o,code:0});return}let r=t,i;typeof r.code=="number"?i=r.code:r.killed?i=l:i=g,o.trim()===""&&(o=r.message??""),d({stdout:m,stderr:o,code:i})});if(e.onOutput){let t=n=>e.onOutput(String(n));E.stdout?.on("data",t),E.stderr?.on("data",t)}});function O(s){return new Promise(c=>setTimeout(c,s))}export{f as a,l as b,g as c,w as d,O as e};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as n}from"./chunk-
|
|
2
|
+
import{a as n}from"./chunk-7F2ZV46B.js";import{createHash as _}from"crypto";import{existsSync as m,readFileSync as u}from"fs";import{dirname as T,join as f,resolve as o}from"path";import{fileURLToPath as E}from"url";var s=T(E(import.meta.url)),l=2;function p(e,r){let t=_("sha256");return t.update(`kane-assurance-contract
|
|
3
3
|
`),t.update(e),t.update(`
|
|
4
4
|
agent_state_schema=${r}`),"sha256:"+t.digest("hex")}function d(){return[o(s,".."),o(s,"../../..")]}function i(){return"sha256:85dd52f33a9fd9cf22ebb81f04dfd3c05bdbeca2e62e3a7a53e8caaaa4060752"}var a=class extends Error{constructor(t,c){super(`agent/cli contract mismatch (cli ${t||"<unset>"}, agent ${c||"<unset>"}) \u2014 rebuild or reinstall the stale half`);this.expected=t;this.actual=c;this.name="PairMismatchError"}};function I(){return{TESTMUAI_CONTRACT_DIGEST:i(),TESTMUAI_CLIENT_VERSION:process.env.KANE_DEV_FORCE_CLIENT_RELEASE??`kane-cli/${n}`}}export{a,I as b};
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{c as
|
|
2
|
+
import{c as g}from"./chunk-5EOX4MEY.js";var y={ASR_CMD_START:"info",ASR_CMD_END:"info",ASR_AGENT_SPAWN:"info",ASR_WORK_ITEM_START:"info",ASR_WORK_ITEM_END:"info",ASR_PROPOSAL:"info",ASR_VALIDATE_FAILED:"warn",ASR_COMMIT:"info",ASR_SESSION_PAUSED:"info",ASR_SESSION_RESUMED:"info",ASR_SESSION_COMPLETE:"info",ASR_AGENT_EXIT:"warn",ASR_RECONCILE_PLAN:"info",ASR_RECONCILE_ROW_END:"info",ASR_HIGH_RISK_CI:"warn",ASR_INGEST:"info",ASR_EMBED_DEGRADED:"warn",ASR_CONTEXT_CLONED:"warn",ASR_ERROR:"error",ASR_CRASH:"error",ASR_FSCK_REPORT:"warn"},O={ASR_CMD_START:["source_count","resumed","applied_plan"],ASR_CMD_END:["exit_code","duration_ms","credits_total","work_items_total","work_items_failed"],ASR_AGENT_SPAWN:["tier","duration_ms"],ASR_WORK_ITEM_START:["work_item_index","work_item_count","source_kind"],ASR_WORK_ITEM_END:["work_item_index","work_item_count","outcome","duration_ms","error_domain","error_code"],ASR_PROPOSAL:["item_count","turn_index"],ASR_VALIDATE_FAILED:["error_code","count","turn_index"],ASR_COMMIT:["trusted","derived","archived","items","items_dropped","record_seq"],ASR_SESSION_PAUSED:["pending_questions","pending_proposals"],ASR_SESSION_RESUMED:["resume_count","expired_session_id"],ASR_SESSION_COMPLETE:["duration_ms","credits_total"],ASR_AGENT_EXIT:["exit_code","signal"],ASR_RECONCILE_PLAN:["row_count","add_count","modify_count","archive_count"],ASR_RECONCILE_ROW_END:["row_index","kind","outcome","duration_ms"],ASR_HIGH_RISK_CI:["count"],ASR_INGEST:["work_item_index","work_item_count","format","bytes","media_facts"],ASR_EMBED_DEGRADED:["held"],ASR_CONTEXT_CLONED:[],ASR_ERROR:["error_domain","error_code","exit_code","turn_index"],ASR_CRASH:["error_domain","error_code","error_name"],ASR_FSCK_REPORT:["issue_count","records","pending","codes","issues","issues_truncated"]},b=[[/^(auth_expired|401|preflight_auth|AUTH)/i,"auth"],[/^(credit_denied|402|CREDIT)/i,"credit"],[/^(stream_drop|read_timeout|connect_failed|dns|E(CONN|AI_AGAIN|TIMEDOUT)|network)/i,"network"],[/^(frame_parse|post_terminal_data|eof_without_terminal|turn_id_mismatch|binding_mismatch|schema_invalid|frame_too_large|protocol)/i,"protocol"],[/^(provider_error|http_5\d\d|turn_exhausted|adapter_integrity)/i,"provider"],[/^(STALE_BASIS|R\d+|validation|criteria)/i,"validation"],[/^(CHAIN_ERROR|DERIVED_(MISSING|DRIFT)|NODE_FILE_(MISSING|MISMATCH|CORRUPT)|CARDINALITY_VIOLATION|SUPERSEDE_(UNKNOWN_(OLD|NEW|ECID)|CYCLE)|DOUBLE_SUPERSEDE|NAME_UNKNOWN_TARGET|EDGE_CYCLE|UNKNOWN_(LABEL|FIELD|EDGE_TYPE|EDGE_PROP)|BAD_(CHECK|ENUM)|MISSING_(FIELD|SALIENT)|ILLEGAL_EDGE)$/,"graph"],[/^(BLOB_MISSING|SOURCE_UNKNOWN|SESSION_(LOCKED|EXPIRED|MISSING|LOCK_LOST)|NO_STORE|fsck|store)/i,"store"],[/^(usage|EX2|SOURCE_WITH_RESUME|HIGH_RISK_CI|bad_flag|no_tty)/i,"usage"],[/^exit_\d+_unattributed$/,"unattributed"],[/^agent_(crash|exit)/i,"agent_crash"]];function h(e){let t=(e||"unknown").slice(0,64);for(let[n,r]of b)if(n.test(t))return{error_domain:r,error_code:t};return{error_domain:"cli_crash",error_code:t}}import{randomBytes as C}from"crypto";var v=/^(uc|sc|ac|t|gap|sty)-\d+$/,k="0123456789abcdefghijklmnopqrstuvwxyz";function $(e){let t="",n=C(e);for(let r=0;r<e;r++)t+=k[n[r]%36];return t}function J(e=new Date){let t=(r,o)=>String(r).padStart(o,"0");return`as-${`${e.getUTCFullYear()}${t(e.getUTCMonth()+1,2)}${t(e.getUTCDate(),2)}T${t(e.getUTCHours(),2)}${t(e.getUTCMinutes(),2)}`}-${$(8)}`}var L=-1,f=0;function Z(e=new Date){let t=e.getTime(),n=C(10);t===L?f=f+1&4095:(L=t,f=(n[0]<<8|n[1])&4095);let r=Buffer.alloc(16);r.writeUIntBE(t,0,6),r[6]=112|f>>8,r[7]=f&255,r[8]=128|n[2]&63,n.copy(r,9,3,10);let o=r.toString("hex");return`${o.slice(0,8)}-${o.slice(8,12)}-${o.slice(12,16)}-${o.slice(16,20)}-${o.slice(20)}`}var G=64,P=128,U=/^[A-Za-z0-9._:@\/-]+$/,F={codes:512},K={ASR_FSCK_REPORT:["issues"]},W=20480,H=0;function B(e,t){if(typeof t=="number"&&Number.isFinite(t)||typeof t=="boolean")return t;if(typeof t!="string")return;let n=e.endsWith("_id")||e==="signal"?P:F[e]??G;if(!(t.length===0||t.length>n)&&U.test(t))return t}function M(e,t,n={}){let r=O[t],o={};for(let i of r){let s=n[i];if(s==null)continue;if(K[t]?.includes(i)){if(typeof s!="string"||s.length===0)continue;let d=s.replace(/[\u0000-\u001F\u007F]/g,"");if(Buffer.byteLength(d,"utf8")>W)continue;o[i]=d;continue}if(i==="items"){let d=Array.isArray(s)?s.filter(N=>typeof N=="string"):[],u=d.filter(N=>v.test(N));u.length>0&&(o.items=u.slice(0,50).join(","));let S=d.length-u.length;S>0&&(o.items_dropped=S);continue}let a=B(i,s);a!==void 0&&(o[i]=a)}if(typeof n.error_code=="string"&&r.includes("error_code")){let{error_domain:i,error_code:s}=h(n.error_code);o.error_code=s,r.includes("error_domain")&&(o.error_domain=i)}return{level:y[t],event:t,message:t,session_id:e.session_id,operation_id:e.operation_id,...e.parent_operation_id?{parent_operation_id:e.parent_operation_id}:{},...e.agent_session_id?{agent_session_id:e.agent_session_id}:{},context_lineage_id:e.context_lineage_id??null,context_instance_id:e.context_instance_id??null,verb:e.verb,mode:e.mode,component:"kane-cli",seq:H++,event_time:new Date().toISOString(),context:o}}import _ from"fs";import X from"path";var V=500,j=7;function w(e){if(e.length!==0)try{let t=g();_.mkdirSync(X.dirname(t),{recursive:!0});let n=e.map(r=>JSON.stringify(r)).join(`
|
|
3
3
|
`)+`
|
|
4
|
-
`;_.appendFileSync(t,n,{flag:"a",mode:384}),q()}catch{}}async function se(e){let t=
|
|
5
|
-
`))if(i.trim())try{o.push(JSON.parse(i))}catch{}try{(o.length===0?!0:await e(o))?_.unlinkSync(n):(_.appendFileSync(t,r,{flag:"a",mode:384}),_.unlinkSync(n))}catch{try{_.appendFileSync(t,r,{flag:"a",mode:384}),_.unlinkSync(n)}catch{}}}function q(e=V,t=j){try{let n=
|
|
4
|
+
`;_.appendFileSync(t,n,{flag:"a",mode:384}),q()}catch{}}async function se(e){let t=g(),n=`${t}.claim-${process.pid}`,r;try{_.renameSync(t,n),r=_.readFileSync(n,"utf8")}catch{return}let o=[];for(let i of r.split(`
|
|
5
|
+
`))if(i.trim())try{o.push(JSON.parse(i))}catch{}try{(o.length===0?!0:await e(o))?_.unlinkSync(n):(_.appendFileSync(t,r,{flag:"a",mode:384}),_.unlinkSync(n))}catch{try{_.appendFileSync(t,r,{flag:"a",mode:384}),_.unlinkSync(n)}catch{}}}function q(e=V,t=j){try{let n=g(),o=_.readFileSync(n,"utf8").split(`
|
|
6
6
|
`).filter(d=>d.trim()),i=Date.now()-t*24*3600*1e3,a=o.filter(d=>{try{let u=JSON.parse(d),S=Date.parse(u.event_time??u.timestamp??"");return Number.isNaN(S)||S>=i}catch{return!1}}).slice(-e);a.length!==o.length&&_.writeFileSync(n,a.length?a.join(`
|
|
7
7
|
`)+`
|
|
8
|
-
`:"",{mode:384})}catch{}}var E=null;function de(e){E=e}function le(){return E}var T=()=>!!process.env.KANE_DEV_MODE,c=[],
|
|
8
|
+
`:"",{mode:384})}catch{}}var E=null;function de(e){E=e}function le(){return E}var T=()=>!!process.env.KANE_DEV_MODE,c=[],A=!1,D=null,R=null,I=null,l=null,p=[];function Ee(e){if(l=e,e&&p.length>0){let t=p;p=[];for(let n of t)try{e.log(n.level,n.event,n.message,n.context)}catch{}}}function ue(e,t,n,r){if(l){try{l.log(e,t,n,r)}catch{}return}p.push({level:e,event:t,message:n,context:r})}function Se(){return l}function fe(){return A}function pe(e,t){c=c.filter(n=>n.name!==e),c.push({name:e,fn:t})}function Re(e){c=c.filter(t=>t.name!==e)}function ge(e,t){let n=c.find(o=>o.name===e);if(!n)return;c=c.filter(o=>o.name!==e);let r=!0;try{n.fn()}catch(o){r=!1,process.stderr.write(`[exit-manager] cleanup(${e}) failed: ${o instanceof Error?o.message:String(o)}
|
|
9
9
|
`)}t&&r&&T()&&process.stderr.write(`[exit-manager] cleanup(${e}): ${t}
|
|
10
|
-
`)}function
|
|
10
|
+
`)}function m(e,t,n=!1,r){if(A){process.exit(D??e);return}if(A=!0,D=e,n&&l)try{l.log("error","CRASH",t),l.shutdownSync()}catch{}if(n&&E&&e!==130&&e!==143)try{let s=/Uncaught exception:\s*([A-Za-z0-9_$]+)/.exec(t)?.[1]??"crash";w([M(E,"ASR_CRASH",{error_code:"cli_crash",error_name:s})])}catch{}let o=[...c].reverse(),i=[];for(let s of o)try{s.fn(),i.push(s.name)}catch(a){process.stderr.write(`[exit-manager] cleanup(${s.name}) failed: ${a instanceof Error?a.message:String(a)}
|
|
11
11
|
`)}if(c=[],T()&&(process.stderr.write(`[exit-manager] shutdown(${e}): ${t}
|
|
12
12
|
`),i.length>0&&process.stderr.write(`[exit-manager] cleaned up: ${i.join(", ")}
|
|
13
13
|
`)),n){if(I)try{I()}catch{}e===130||e===143||(process.stderr.write(`
|
|
@@ -16,4 +16,4 @@ kane-cli crashed: ${t}
|
|
|
16
16
|
`:"")),E&&process.stderr.write(`session: ${E.session_id} \u2014 share this id with support
|
|
17
17
|
`),r&&T()?process.stderr.write(`${r}
|
|
18
18
|
`):process.stderr.write(`(re-run with KANE_DEV_MODE=1 for the full stack)
|
|
19
|
-
`)),process.exit(e);return}if(
|
|
19
|
+
`)),process.exit(e);return}if(R&&!n){R();return}process.exit(e)}function me(e){R=e}function Ae(){R=null}function Ie(e){I=e}var x=!1;function Ne(){x||(x=!0,process.on("SIGINT",()=>{m(130,"Received SIGINT",!0)}),process.on("SIGTERM",()=>{m(143,"Received SIGTERM",!0)}),process.on("uncaughtException",e=>{m(1,`Uncaught exception: ${e.name}: ${e.message}`,!0,e.stack)}),process.on("unhandledRejection",e=>{m(1,`Unhandled rejection: ${String(e)}`,!0,e instanceof Error?e.stack:void 0)}))}function Te(){c=[],A=!1,D=null,R=null,I=null,l=null,p=[],x=!1,E=null}export{y as a,J as b,Z as c,M as d,w as e,se as f,de as g,le as h,Ee as i,ue as j,Se as k,fe as l,pe as m,Re as n,ge as o,m as p,me as q,Ae as r,Ie as s,Ne as t,Te as u};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as j}from"./chunk-CLGC7VEO.js";import{d as K}from"./chunk-RKXHVP2Z.js";import{a as L}from"./chunk-5Y2G4NC7.js";import{a as M}from"./chunk-YCCUBQY4.js";import{y as s}from"./chunk-7F2ZV46B.js";import{a as O}from"./chunk-HCBYKLMW.js";import{a as x,b as n,i as D,k as E}from"./chunk-C44QQJR4.js";import{a as I}from"./chunk-6YGTRKDT.js";import{e as y}from"./chunk-UR6MHSHU.js";var g=y(O(),1);function ee(e){let t=e.findIndex(r=>r.free);return t>=0?t:null}var q=60,Q=100;function te({headline:e,ask:t=!1,rows:r,sel:o,focused:d,freeText:c=null,freeTextNote:h,sublines:b=[]}){let{stdout:p}=E(),i=p?.columns??80,v=i<q,k=Math.min(i-1,Q),u=a=>d&&o===a?(0,g.jsx)(n,{color:s.assuranceAccent,children:"\u276F"}):" ",m=t?`? ${e}`:e,A=Math.max(4,k-3),S=b.map((a,w)=>(0,g.jsx)(n,{color:s.dim,children:` ${a.length>A?`${a.slice(0,A-1)}\u2026`:a}`},`sub-${w}`)),R=0,B=r.map((a,w)=>a.free?c?(0,g.jsxs)(x,{flexDirection:"column",children:[(0,g.jsxs)(x,{children:[(0,g.jsxs)(n,{children:[(0,g.jsx)(n,{color:s.assuranceAccent,children:"\u276F"})," ",(0,g.jsx)(n,{color:s.dim,children:"\u270E "})]}),(0,g.jsx)(M,{value:c.value,onChange:c.onChange,onSubmit:c.onSubmit,onCancel:c.onCancel,placeholder:a.label})]}),h?(0,g.jsx)(n,{color:s.muted,children:` ${h}`}):null]},a.key):(0,g.jsxs)(n,{children:[u(w)," ",(0,g.jsx)(n,{color:s.dim,children:`\u270E ${a.label}`})]},a.key):(R+=1,(0,g.jsxs)(n,{bold:d&&o===w,children:[u(w),` ${R}. ${a.label}`,a.detail?(0,g.jsx)(n,{color:s.dim,bold:!1,children:` \u2014 ${a.detail}`}):null]},a.key)));return v?(0,g.jsxs)(x,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,g.jsx)(n,{bold:!0,color:s.assuranceAccent,children:m}),S,B]}):(0,g.jsxs)(x,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,g.jsx)(n,{bold:!0,color:s.assuranceAccent,children:m}),S,(0,g.jsx)(n,{children:" "}),B]})}var H=y(I(),1);var $=y(O(),1),N=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function le(e){let t=e.replace(/…$/,"");return t&&t.charAt(0).toLowerCase()+t.slice(1)}function F(e,t){if(e.length<=t)return e;if(t<=1)return"\u2026";let r=Math.ceil((t-1)/2),o=Math.floor((t-1)/2);return`${e.slice(0,r)}\u2026${o>0?e.slice(-o):""}`}function ce({status:e,meta:t,tallies:r,keys:o,child:d,cols:c}){let{stdout:h}=E(),b=c??h?.columns??80,p=e.kind==="working"||e.kind==="child-working",[i,v]=(0,H.useState)(0);L(()=>v(f=>f+1),p?120:null);let k=N[i%N.length],u,m;switch(e.kind){case"working":u=`${k} ${e.step}${e.elapsedS!==void 0?` \xB7 ${e.elapsedS}s`:""}`,m=s.assuranceAccent;break;case"waiting":u=`\u25CF waiting on you${e.pending?` \u2014 ${e.pending} question${e.pending===1?"":"s"}`:""}`,m=s.amber;break;case"idle":u="\u25CF idle",m=s.assuranceAccent;break;case"card":u=`\u25CF card ${e.n} of ${e.m}`,m=s.amber;break;case"child-working":u=`${k} child: ${e.step}`,m=s.assuranceAccent;break;case"child-waiting":u="\u25CF child waiting on you",m=s.amber;break}let A=d?`${t.verb} \u25B8 ${d.verb}`:t.verb,S=d?.sid?t.sid?`${F(t.sid,14)} \u25B8 ${d.sid}`:d.sid:t.sid,R=t.env==="prod"?"":t.env,B=[A,S,R].filter(Boolean),a=" \xB7 ",w=u.length+a.length+B.join(a).length,C=t.subject;if(C){let f=b-w-a.length;C=f>=8?F(C,f):void 0}let _=[A,...C?[C]:[],S,R].filter(Boolean).join(a);return(0,$.jsxs)(x,{flexDirection:"column",children:[(0,$.jsx)(n,{color:s.muted,children:"\u2500".repeat(Math.max(1,b))}),(0,$.jsxs)(n,{children:[(0,$.jsx)(n,{color:m,children:u}),(0,$.jsx)(n,{color:s.dim,children:`${a}${_}`})]}),(0,$.jsx)(n,{color:s.dim,children:r.items.length>0?r.items.join(a):" "}),(0,$.jsx)(n,{color:s.muted,children:o.join(a)})]})}var P=y(I(),1);function ue({onToggleThinking:e,onCtrlC:t,explorer:r,panel:o}){let c=(0,P.useRef)(null),h=(0,P.useRef)(""),b=()=>{c.current&&clearTimeout(c.current),c.current=null,h.current=""};return(0,P.useEffect)(()=>b,[]),D((p,i)=>{if(i.ctrl&&p==="t"){e();return}if(i.ctrl&&p==="c"){t();return}if(!i.ctrl&&p.includes("")){t();return}if(!i.ctrl&&p.includes("")){e();return}if(r&&r.isOpen()){let v=()=>{c.current&&clearTimeout(c.current),c.current=setTimeout(()=>{b(),r.onBack()},150)};if(c.current){if(i.upArrow||i.downArrow||i.return){b(),i.return?r.onEnter():r.onMove(i.upArrow?-1:1);return}if(h.current+=p,h.current==="["){v();return}let k=h.current;b();let u=/^\[([ABCD])/.exec(k);if(u){(u[1]==="A"||u[1]==="B")&&r.onMove(u[1]==="A"?-1:1);return}r.onBack();return}if(i.upArrow){r.onMove(-1);return}if(i.downArrow){r.onMove(1);return}if(i.return){r.onEnter();return}if(i.escape){h.current="",v();return}return}if(o&&o.isFocused()){let v=()=>{c.current&&clearTimeout(c.current),c.current=setTimeout(()=>{b(),o.onBack()},150)};if(c.current){if(i.upArrow||i.downArrow||i.return||i.leftArrow||i.rightArrow){b(),i.return?o.onSelect():i.leftArrow?o.onLeft?.():i.rightArrow?o.onRight?.():o.onMove(i.upArrow?-1:1);return}if(h.current+=p,h.current==="["){v();return}let k=h.current;b();let u=/^\[([ABCD])/.exec(k);if(u){u[1]==="A"||u[1]==="B"?o.onMove(u[1]==="A"?-1:1):u[1]==="C"?o.onRight?.():o.onLeft?.();return}o.onBack();return}if(i.upArrow){o.onMove(-1);return}if(i.downArrow){o.onMove(1);return}if(i.leftArrow){o.onLeft?.();return}if(i.rightArrow){o.onRight?.();return}if(i.return){o.onSelect();return}if(i.escape){h.current="",v();return}if(/^[1-9]$/.test(p)){o.onDigit(Number(p));return}if(i.tab){o.onTab?.();return}if(p===" "&&o.isMulti()){o.onSpace();return}if(p&&!i.ctrl&&!i.meta){o.onType(p);return}return}}),null}var l=y(O(),1);function X(e){return e.kind==="REVIEW"?[{v:"approve",label:"approve",detail:"mark it reviewed and trusted"},{v:"archive",label:"archive",detail:"reject it \u2014 asks for a reason; impact shown above"},{v:"defer",label:"defer",detail:"not now \u2014 stays queued"}]:e.kind==="PAIR"?[{v:"merge",label:"merge",detail:"duplicate \u2014 fold into the older item (it stays unreviewed)"},{v:"keep_both",label:"keep both",detail:"genuinely distinct \u2014 promote both"},{v:"defer",label:"defer",detail:"not now \u2014 stays queued"}]:e.kind==="ARCHIVE"?[{v:"archive",label:"retire",detail:"hidden from now on; history is kept and it can be reverted"},{v:"skip",label:"skip",detail:"keep it \u2014 decided, never re-offered"},{v:"defer",label:"defer",detail:"not now \u2014 the plan re-offers it"}]:e.heldPayload?[{v:"approve",label:"approve update",detail:"commit the held payload \u2014 impact preview above"},{v:"skip",label:"keep current",detail:"drop the held payload (the owner's disk state stays untouched)"},{v:"defer",label:"defer",detail:"not now \u2014 stays held"}]:[{v:"approve",label:"approve",detail:e.kind==="ADD"?"commit + design it":"commit the updated version (old\u2192new redirect)"},{v:"skip",label:e.origin==="content-change"?"reject":"skip",detail:e.origin==="content-change"?"drop the staged proposal \u2014 nothing committed":"leave it as is"},{v:"defer",label:"defer",detail:"not now \u2014 the plan keeps it staged"}]}function V(e){let t=X(e);return e.viewDiff&&t.push({v:"view_diff",label:"view diff",detail:"full old \u2192 new"}),t}function W(e){return e.kind==="ARCHIVE"?null:V(e).length}var Y={ADD:{color:s.green??"green"},MODIFY:{color:"yellow"},ARCHIVE:{color:s.red},REVIEW:{color:"cyan"},PAIR:{color:"magenta"}},U=60;function be({card:e,position:t,sel:r=0,focused:o=!1,freeText:d=null,editorIntent:c="steer"}){let{stdout:h}=E(),b=h?.columns??80,p=b<U,i=V(e),v=W(e),k=Y[e.kind],u=f=>o&&r===f?(0,l.jsx)(n,{color:s.assuranceAccent,children:"\u276F"}):" ",m=e.impact,A=m&&"stale_refs"in m&&m.stale_refs.length>0?`${e.kind==="ARCHIVE"?"retiring leaves":"approving marks"} ${m.stale_refs.length} item(s) stale`+((m.direct_refs?.length??0)>0?` \u2014 ${m.direct_refs.length} directly touched: ${m.direct_refs.join(", ")}`:""):m&&"design_children"in m?`${e.kind==="REVIEW"?"archiving drops":"merging folds"} ${m.design_children} design child(ren)`:null,S=e.provenance&&e.provenance!==e.why?e.provenance:e.origin??null,R=[{label:"why",text:e.why},...S?[{label:"from",text:S,dimmer:!0}]:[],...e.tier?[{label:"match",text:e.tier,dimmer:!0}]:[],...A?[{label:"impact",text:A}]:[]],B=Math.max(...R.map(f=>f.label.length)),a="? reconcile",w=`item ${t.n} of ${t.of}`,C=(0,l.jsxs)(x,{flexDirection:"column",children:[(0,l.jsx)(x,{paddingLeft:2,children:(0,l.jsxs)(n,{bold:!0,children:[(0,l.jsx)(n,{color:k.color,children:`[${e.kind}]`}),` ${j(e.title)}`]})}),R.map((f,T)=>(0,l.jsx)(x,{paddingLeft:2,children:(0,l.jsxs)(n,{children:[(0,l.jsx)(n,{color:s.dim,children:`${f.label.padEnd(B)} `}),(0,l.jsx)(n,{color:f.dimmer?s.dim:void 0,children:f.text})]})},`f-${T}`)),e.diffSummary?(0,l.jsx)(x,{paddingLeft:2,children:(0,l.jsx)(n,{color:s.dim,children:e.diffSummary})}):(e.diff??[]).map((f,T)=>(0,l.jsx)(x,{paddingLeft:4,children:(0,l.jsx)(n,{color:f.op==="-"?"red":"green",children:`${f.op==="-"?"\u2212":"+"} ${f.field==="criteria"?"criterion":f.field}: ${f.text}`})},`d-${T}`)),(e.citeLines??[]).map((f,T)=>(0,l.jsx)(x,{paddingLeft:2,children:(0,l.jsx)(n,{color:s.dim,children:f})},`c-${T}`)),(0,l.jsx)(n,{children:" "}),i.map((f,T)=>(0,l.jsxs)(n,{children:[u(T),` ${T+1}. ${f.label}`,(0,l.jsx)(n,{color:s.dim,children:` \u2014 ${f.detail}`})]},`o-${T}`)),v!==null||d&&c==="because"?d?(0,l.jsxs)(x,{flexDirection:"column",children:[(0,l.jsxs)(x,{children:[(0,l.jsxs)(n,{children:[(0,l.jsx)(n,{color:s.assuranceAccent,children:"\u276F"})," ",(0,l.jsx)(n,{color:s.dim,children:"\u270E "})]}),(0,l.jsx)(M,{value:d.value,onChange:d.onChange,onSubmit:d.onSubmit,onCancel:d.onCancel,placeholder:c==="because"?"why archive it?":"say what to adjust"})]}),(0,l.jsx)(n,{color:s.muted,children:c==="because"?" submits as: archive \xB7 your reason goes on the record":e.kind==="PAIR"?" submits as: defer \xB7 your note parks with the card (it re-offers)":" submits as: approve \xB7 your words steer the re-design"})]}):v!==null?(0,l.jsxs)(n,{children:[u(v)," ",(0,l.jsx)(n,{color:s.dim,children:e.kind==="PAIR"?"\u270E defer with a note \u2014 say what you noticed":"\u270E approve with changes \u2014 say what to adjust"})]}):null:null]});if(p)return(0,l.jsxs)(x,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,l.jsx)(n,{bold:!0,color:s.assuranceAccent,children:a}),(0,l.jsx)(n,{color:s.dim,children:w}),C]});let _=Math.max(2,Math.min(b-1,100)-a.length-w.length);return(0,l.jsxs)(x,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,l.jsxs)(n,{children:[(0,l.jsx)(n,{bold:!0,color:s.assuranceAccent,children:a})," ".repeat(_),(0,l.jsx)(n,{color:s.dim,children:w})]}),(0,l.jsx)(n,{children:" "}),C]})}var z={"acceptance criteria":1,scenarios:2,"acceptance criteria + exercises":3,"tests + gaps":4};function we(e,t){let r=[],o=K(e.turns).entries.length;if(t==="design"){let c;for(let b=e.ledger.length-1;b>=0;b--){let p=e.ledger[b];if(p.kind==="banner"&&p.text.startsWith("designing: ")){c=p.text.slice(11);break}}let h=c?z[c]:void 0;h&&r.push(`phase ${h}/4`),o>0&&r.push(`${o} item${o===1?"":"s"} this session`)}else o>0&&r.push(`${o} saved as draft${o===1?"":"s"}`);let d=e.pending?e.pending.resolution.filter(c=>!c).length:0;return d>0&&r.push(`${d} question${d===1?"":"s"} pending`),e.credits&&r.push(`${e.credits.total.toFixed(1)} credits`),{items:r}}function ke(e,t){let r=[],o=e.applied+e.committed+e.retired;r.push(`${o} applied`),r.push(`${t} to decide`);let d=[];return e.skipped>0&&d.push(`${e.skipped} skipped`),e.deferred>0&&d.push(`${e.deferred} deferred`),e.failed>0&&d.push(`${e.failed} failed`),{items:[...r,...d]}}function Ae(e,t){let r=["\u2191\u2193 select","\u23CE confirm"];return e.multi_select&&r.push("space toggle"),t.batchCount>1&&r.push("\u2190 \u2192 questions"),(e.allow_free_text||e.options.some(o=>o.input===!0))&&r.push("\u270E type your own"),t.canAttach&&r.push("@ attach a file or URL"),t.escBack&&r.push("esc back"),{keys:r}}function Se(e,t){let r=["\u2191\u2193 select","\u23CE confirm"];return e.some(o=>o.free)&&r.push("\u270E type your own"),t.escBack&&r.push("esc back"),{keys:r}}function Re(e){let t=["\u2191\u2193 select","\u23CE confirm","1-9 verdict"];return W(e)!==null&&t.push("type = adjust"),t.push("esc \xB7 nothing to undo"),{keys:t}}export{ee as a,te as b,le as c,ce as d,ue as e,X as f,V as g,W as h,be as i,we as j,ke as k,Ae as l,Se as m,Re as n};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as R}from"./chunk-U5GHOGLM.js";import{y as i}from"./chunk-7F2ZV46B.js";import{a as X}from"./chunk-HCBYKLMW.js";import{a,b as l,i as p}from"./chunk-C44QQJR4.js";import{a as G}from"./chunk-6YGTRKDT.js";import{e as P}from"./chunk-UR6MHSHU.js";var x=P(G(),1);var e=P(X(),1),f=5;function K(t,I){if(!I)return t;let c=I.toLowerCase();return t.filter(B=>B.label.toLowerCase().includes(c))}function J(t){let{title:I,items:c,loading:B=!1,loadingText:Y,error:L=null,itemNoun:v="items",onSelect:F,onCancel:E,defaultActiveId:w,onTab:y,extraHint:H}=t,[g,d]=(0,x.useState)(0),[S,u]=(0,x.useState)(0),[s,A]=(0,x.useState)(""),[C,h]=(0,x.useState)(null);(0,x.useEffect)(()=>{if(c.length===0)return;if(t.preserveSelectionById&&C!==null){let o=c.findIndex(n=>n.id===C);if(o>=0){u(Math.floor(o/f)),d(o%f);return}}let r=w?c.findIndex(o=>o.id===w):c.findIndex(o=>o.isActive);r>=0?(u(Math.floor(r/f)),d(r%f),t.preserveSelectionById&&h(c[r].id)):t.preserveSelectionById&&(u(0),d(0),h(c[0]?.id??null))},[c,w,t.preserveSelectionById,C]),(0,x.useEffect)(()=>{if(!t.onSearch)return;let r=setTimeout(()=>t.onSearch(s),t.searchDebounceMs??250);return()=>clearTimeout(r)},[s,t.onSearch,t.searchDebounceMs]);let b=t.onSearch?c:K(c,s),D=S*f,N=Math.min(D+f,b.length),M=Math.ceil(b.length/f),O=N-D,T=b.slice(D,N);return p((r,o)=>{if(L){o.escape&&E();return}if(o.escape){s?(A(""),d(0),u(0)):E();return}if(o.tab&&y){y();return}if(o.upArrow){if(g>0){let n=g-1;d(n),t.preserveSelectionById&&h(T[n]?.id??null)}else if(S>0){let n=S-1,m=f-1;u(n),d(m),t.preserveSelectionById&&h(b[n*f+m]?.id??null)}return}if(o.downArrow){if(g<O-1){let n=g+1;d(n),t.preserveSelectionById&&h(T[n]?.id??null)}else if(S<M-1){let n=S+1,m=0;u(n),d(m),t.preserveSelectionById&&h(b[n*f+m]?.id??null)}return}if(o.return&&T[g]){if(T[g].disabled)return;F(T[g]);return}if(o.backspace||o.delete){A(n=>n.slice(0,-1)),d(0),u(0);return}r&&!o.ctrl&&!o.meta&&(A(n=>n+r),d(0),u(0))},{isActive:!B}),B?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:i.orange,paddingX:2,paddingY:1,children:[(0,e.jsx)(l,{color:i.orange,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(l,{color:i.secondary,children:Y??`Loading ${v}\u2026`})})]}):L?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:i.red,paddingX:2,paddingY:1,children:[(0,e.jsx)(l,{color:i.red,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(l,{color:i.red,children:L})}),(0,e.jsx)(R,{bindings:[]})]}):(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:i.orange,paddingX:2,paddingY:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(l,{color:i.orange,bold:!0,children:I}),(0,e.jsxs)(l,{color:i.dim,children:[" (",b.length,!t.onSearch&&s?`/${c.length}`:""," ",v,t.loadingMore?" \xB7 loading more":"",")"]})]}),(0,e.jsxs)(a,{marginTop:1,children:[(0,e.jsx)(l,{color:i.secondary,children:s?"filter: ":""}),s?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(l,{children:s}),(0,e.jsx)(l,{inverse:!0,children:" "})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)(l,{color:i.dim,children:["Search ",v,"\u2026"]}),(0,e.jsx)(l,{inverse:!0,children:" "})]})]}),(0,e.jsx)(a,{flexDirection:"column",marginTop:1,children:t.searching?(0,e.jsxs)(l,{color:i.secondary,children:["Searching ",v,"\u2026"]}):b.length===0?(0,e.jsxs)(l,{color:i.dim,children:["No ",v,' match "',s,'"']}):T.map((r,o)=>{let n=o===g,m=n?"\u276F ":" ",$=r.disabled?i.muted:r.isActive?i.green:n?i.orange:void 0;return(0,e.jsxs)(a,{flexDirection:"column",children:[(0,e.jsxs)(l,{color:$,children:[m,r.label,r.isActive&&!r.disabled?" \u25CF selected":""]}),n&&r.disabled&&r.disabledHint&&(0,e.jsxs)(l,{color:i.red,children:[" ",r.disabledHint]})]},r.id)})}),!t.searching&&M>1&&(0,e.jsx)(a,{marginTop:1,children:(0,e.jsxs)(l,{color:i.dim,children:["Page ",S+1,"/",M]})}),t.footer&&(0,e.jsx)(a,{marginTop:1,flexDirection:"column",children:t.footer}),(0,e.jsx)(R,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"type",label:"to search"},{keys:"\u21B5",label:"select"},...y&&H?[{keys:"tab",label:H}]:[]],escBackLabel:s?"clear":"back to chat"})]})}export{J as a};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
var c={darwin:"macOS",linux:"Linux",win32:"Windows"};function _(n){return c[n]??n}function r(n){return typeof n!="string"?void 0:n.trim()||void 0}function u(n){return typeof n=="number"&&Number.isFinite(n)&&n>0?n:void 0}function s(n){return n==="emulator"||n==="simulator"?n:void 0}function f(n){if(!n||typeof n!="object")return;let i=n,t=i.device&&typeof i.device=="object"?i.device:void 0,e=t?{...r(t.model)?{model:r(t.model)}:{},...r(t.manufacturer)?{manufacturer:r(t.manufacturer)}:{},...r(t.os_version)?{os_version:r(t.os_version)}:{},...u(t.pixel_ratio)!==void 0?{pixel_ratio:u(t.pixel_ratio)}:{},...r(t.automation)?{automation:r(t.automation)}:{},...r(t.device_instance_id)?{device_instance_id:r(t.device_instance_id)}:{},...s(t.target_kind)?{target_kind:s(t.target_kind)}:{}}:void 0,d=r(i.resolution),o=r(i.native_platform),a=e&&Object.keys(e).length>0;if(!(!d&&!o&&!a))return{...d?{resolution:d}:{},...o?{native_platform:o}:{},...a?{device:e}:{}}}function v(n,i){if(!n)return i;if(!i)return n;let t={...n.device??{},...i.device??{}};return{...n,...i,...Object.keys(t).length?{device:t}:{}}}function m(n){if(n.startsWith("android"))return"Android";if(n.startsWith("ios"))return"iOS"}function l(n,i){let t=f(i);if(!t)return n;let e={...n};if(t.resolution&&(t.native_platform||!e.resolution)&&(e.resolution=t.resolution),!t.native_platform)return e;e.native_platform=t.native_platform,delete e.browser,delete e.browser_version;let d=m(t.native_platform);d&&(e.os=d);let o=t.device;return o?.model&&(e.device=o.model),o?.manufacturer&&(e.manufacturer=o.manufacturer),o?.os_version&&(e.os_version=o.os_version),o?.pixel_ratio!==void 0&&(e.pixel_ratio=o.pixel_ratio),o?.automation&&(e.automation=o.automation),o?.device_instance_id&&(e.device_instance_id=o.device_instance_id),o?.target_kind&&(e.target_kind=o.target_kind),e}function p(n,i,t){let d=!!f(i)?.native_platform;return{model:n,platform:d?"Mobile":"Desktop",platform_type:d?"app":"web",...t?{run_kind:t}:{}}}function g(n,i){let t={},e=(d,o)=>{o!==void 0&&o!==""&&(t[d]=o)};return e("model",i.model),e("os",n.os),e("browser",n.browser),e("browser_version",n.browser_version),e("resolution",n.resolution),e("platform",i.platform),e("platform_type",i.platform_type),e("run_kind",i.run_kind),e("os_version",n.os_version),e("native_platform",n.native_platform),e("manufacturer",n.manufacturer),e("pixel_ratio",n.pixel_ratio),e("automation",n.automation),e("device_instance_id",n.device_instance_id),e("target_kind",n.target_kind),n.device!==void 0&&n.device!==""?t.device=n.device:i.platform_type&&i.platform_type!=="web"&&(t.device=null),t}export{_ as a,f as b,v as c,l as d,p as e,g as f};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
var u=(n,t)=>n.length<=t?n:t<=1?"\u2026":`${n.slice(0,t-1)}\u2026`,a=(n,t)=>n+" ".repeat(Math.max(0,t-n.length));function c(n,t,o,e){return n+e.map(r=>"\u2500".repeat(r+2)).join(t)+o}function h(n,t,o,e=n.length-1){let r=n.map((i,g)=>Math.max(i.length,...t.map(p=>(p[g]??"").length),1)),s=n.length*3+1,m=r.reduce((i,g)=>i+g,0)+s-o;return m>0&&(r[e]=Math.max(7,r[e]-m)),r}function l(n,t,o=100,e){let r=h(n,t,o,e),s=m=>"\u2502 "+r.map((i,g)=>a(u(m[g]??"",i),i)).join(" \u2502 ")+" \u2502";return[c("\u250C","\u252C","\u2510",r),s(n),c("\u251C","\u253C","\u2524",r),...t.map(s),c("\u2514","\u2534","\u2518",r)]}export{u as a,a as b,c,l as d};
|