@testmuai/kane-cli 0.7.2 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ChatSurface-E7QKI4LA.js → ChatSurface-U37VZDCW.js} +1 -1
- package/dist/{ChromeProfilePicker-DGDWGCZD.js → ChromeProfilePicker-AUU7JF6F.js} +1 -1
- package/dist/{CliFeedbackPrompt-SYCZXSME.js → CliFeedbackPrompt-4W74Y3UF.js} +1 -1
- package/dist/{CliUploadProgress-VDEAKXJY.js → CliUploadProgress-6HL7WTEX.js} +1 -1
- package/dist/ConfigView-6BSCZP5Y.js +2 -0
- package/dist/EvidenceViewOffer-62XHEEGW.js +2 -0
- package/dist/FolderPicker-S7U2EN2M.js +2 -0
- package/dist/{HelpView-ON6BFGJM.js → HelpView-TU7ED43J.js} +1 -1
- package/dist/{InfoBox-B23NZ6IG.js → InfoBox-JLTMKVDE.js} +1 -1
- package/dist/{LinksBox-TI26VFFH.js → LinksBox-LREUUJDV.js} +1 -1
- package/dist/{ProfilesView-CRO5AH3H.js → ProfilesView-W3GX2N2E.js} +1 -1
- package/dist/{ProjectPicker-3N7LJOXU.js → ProjectPicker-SYQUJK2J.js} +1 -1
- package/dist/{SaveSessionPrompt-UTOEC5AW.js → SaveSessionPrompt-MR5NJMRP.js} +1 -1
- package/dist/SingleShotApp-XOKVOM7C.js +2 -0
- package/dist/{SummaryBox-JK64EKC2.js → SummaryBox-UAYSVFB7.js} +1 -1
- package/dist/TestMdRunView-7UVSDAF4.js +2 -0
- package/dist/{WhoamiView-6QSLPNF6.js → WhoamiView-2YU76ASQ.js} +1 -1
- package/dist/adbkit-apkreader-ORZBGCJQ.js +184 -0
- package/dist/app-client-OEXESV4U.js +2 -0
- package/dist/app-download-AEEFQ63M.js +2 -0
- package/dist/{auth-IKFVW3NX.js → auth-HET3TBRI.js} +1 -1
- package/dist/{bind-KCUSVJXG.js → bind-STKXOUYI.js} +3 -3
- package/dist/bootstrap-44YKVWWE.js +2 -0
- package/dist/bridge-5Z3BIB77.js +2 -0
- package/dist/{changelog-AAH2ZBYO.js → changelog-7OWRHFHZ.js} +1 -1
- package/dist/{chat-committer-UUC6JTRJ.js → chat-committer-ZWWCLJFD.js} +1 -1
- package/dist/{chunk-ZUGCHQFC.js → chunk-27U4PLPX.js} +1 -1
- package/dist/{chunk-ZBOWFJB2.js → chunk-2BGUUWNF.js} +2 -2
- package/dist/chunk-2KDGIZED.js +4 -0
- package/dist/{chunk-SFII7HPP.js → chunk-3LJWYRAA.js} +1 -1
- package/dist/chunk-3PECJD6S.js +11 -0
- package/dist/{chunk-7QJ75SYR.js → chunk-3POR47RC.js} +2 -2
- package/dist/chunk-4JOD47QI.js +2 -0
- package/dist/{chunk-QIGPXYMF.js → chunk-56PAQAX5.js} +6 -6
- package/dist/{chunk-DZPGG4S6.js → chunk-65ZTD5SJ.js} +2 -2
- package/dist/chunk-6IA6QMPH.js +2 -0
- package/dist/{chunk-VT54ARGE.js → chunk-6O3DDOP2.js} +1 -1
- package/dist/chunk-6XX4LEVJ.js +2 -0
- package/dist/{chunk-4NFCAGRK.js → chunk-766WGMBU.js} +1 -1
- package/dist/{chunk-VMM4LC4V.js → chunk-7BZSCUPP.js} +3 -3
- package/dist/{chunk-PLOWZLG5.js → chunk-7JWKHKFU.js} +2 -2
- package/dist/chunk-7Q6M6P4X.js +26 -0
- package/dist/chunk-AW2XUHH4.js +2 -0
- package/dist/{chunk-7OYZR6JA.js → chunk-BRHNRCEZ.js} +1 -1
- package/dist/chunk-BRIEBB2U.js +2 -0
- package/dist/{chunk-APPYQZFK.js → chunk-C7HSWZP6.js} +1 -1
- package/dist/chunk-CTW2VQKS.js +6 -0
- package/dist/{chunk-FDIPQRX4.js → chunk-DCY6R5DP.js} +1 -1
- package/dist/{chunk-KWIK22R6.js → chunk-DO5HAO3H.js} +1 -1
- package/dist/chunk-DPUV6OSP.js +2 -0
- package/dist/{chunk-B5RS2XZU.js → chunk-DZGCXKKI.js} +3 -3
- package/dist/{chunk-JKM2PUHI.js → chunk-EDSZJZFG.js} +1 -1
- package/dist/{chunk-OIYGGEUL.js → chunk-ELM6MXGJ.js} +1 -1
- package/dist/{chunk-VHZ4S57N.js → chunk-EWCAFKLX.js} +1 -1
- package/dist/chunk-EYOCNMUM.js +2 -0
- package/dist/{chunk-GYNTNKNB.js → chunk-FEJXWJ3L.js} +1 -1
- package/dist/{chunk-UC7MNPIN.js → chunk-FMRSMN34.js} +1 -1
- package/dist/chunk-FNH55WSR.js +19 -0
- package/dist/chunk-FQLIW3LM.js +2 -0
- package/dist/{chunk-O75ZHGJG.js → chunk-G7VQCS4J.js} +1 -1
- package/dist/{chunk-2WFZIQ62.js → chunk-GCBKDX2J.js} +1 -1
- package/dist/chunk-GKYPNSQP.js +26 -0
- package/dist/chunk-GPG3FIN3.js +21 -0
- package/dist/chunk-GZPK6FRP.js +7 -0
- package/dist/{chunk-XUS4WKDS.js → chunk-HCKH44I2.js} +1 -1
- package/dist/chunk-HEAIJCGZ.js +2 -0
- package/dist/{chunk-SL6PCVM2.js → chunk-HMYMSRA4.js} +1 -1
- package/dist/chunk-IOFZSQAA.js +2 -0
- package/dist/{chunk-YTHQNN2L.js → chunk-IP2O264K.js} +1 -1
- package/dist/{chunk-AXTGYOMK.js → chunk-JJHG3BWO.js} +1 -1
- package/dist/chunk-KFSUPQAG.js +66 -0
- package/dist/chunk-KRKGZ2ZW.js +47 -0
- package/dist/{chunk-AJ56AMT6.js → chunk-KU6IXFGZ.js} +1 -1
- package/dist/chunk-L7MXYCD7.js +2 -0
- package/dist/{chunk-5ZQZOVWY.js → chunk-MA34UWKX.js} +3 -3
- package/dist/chunk-MBF3FP5P.js +5 -0
- package/dist/chunk-MSGW4JDG.js +2 -0
- package/dist/{chunk-C3T7TKAC.js → chunk-MXHHMIO2.js} +2 -2
- package/dist/{chunk-RDNFVZEB.js → chunk-NX7TM662.js} +1 -1
- package/dist/chunk-OMQCD3KR.js +2 -0
- package/dist/{chunk-OR6MCL6Z.js → chunk-OTTGS2TE.js} +1 -1
- package/dist/chunk-QGKPLOUI.js +2 -0
- package/dist/{chunk-FBHRBFHP.js → chunk-QRZRSAZH.js} +1 -1
- package/dist/{chunk-VLWMMOMF.js → chunk-QSDH5P7C.js} +1 -1
- package/dist/{chunk-VOOPWFHW.js → chunk-QW6EZC53.js} +1 -1
- package/dist/{chunk-ZRASQ63J.js → chunk-RC52N7PC.js} +1 -1
- package/dist/{chunk-M6FKJKC6.js → chunk-RFR4ZKIC.js} +3 -3
- package/dist/{chunk-AFBKGZFG.js → chunk-RLRNLIRS.js} +1 -1
- package/dist/{chunk-5FJJJNJK.js → chunk-SDPRO2LE.js} +1 -1
- package/dist/chunk-T5Y6MOLM.js +4 -0
- package/dist/{chunk-VRLUNZAK.js → chunk-TFPPEOAK.js} +1 -1
- package/dist/{chunk-5SXMV66P.js → chunk-TKGUT425.js} +1 -1
- package/dist/chunk-TYLYFERW.js +10 -0
- package/dist/chunk-TZXXJWHA.js +2 -0
- package/dist/{chunk-KQZA2QSC.js → chunk-UDIQOJEL.js} +1 -1
- package/dist/chunk-UV462FZR.js +2 -0
- package/dist/{chunk-HYSFJSIG.js → chunk-UXDL4XDL.js} +1 -1
- package/dist/{chunk-53IBTIL3.js → chunk-V2R3LCA3.js} +1 -1
- package/dist/{chunk-VFII6C46.js → chunk-W2JFDDIB.js} +1 -1
- package/dist/{chunk-4LTXE3IX.js → chunk-XO5ZH3ZR.js} +1 -1
- package/dist/{chunk-EOLFTMWF.js → chunk-YFYCCTSL.js} +1 -1
- package/dist/{chunk-JPWLGHPM.js → chunk-YJELGSKJ.js} +1 -1
- package/dist/chunk-YRFMPIU2.js +4 -0
- package/dist/{chunk-F7ISS545.js → chunk-ZGBSGZZM.js} +1 -1
- package/dist/{chunk-VWKVUOXU.js → chunk-ZIUAOEUC.js} +1 -1
- package/dist/chunk-ZVHCQMJ6.js +13 -0
- package/dist/{config-CWZV6XPT.js → config-RS47F5SC.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-OH6AVI6N.js} +1 -1
- package/dist/deps-resolve-XC5S53DG.js +2 -0
- package/dist/{dispatch-WVNXB7AD.js → dispatch-SE5GY3Z2.js} +1 -1
- package/dist/doctor-FSECFZUU.js +2 -0
- package/dist/docx-convert-JMUMT5C4.js +2 -0
- package/dist/evidence-OYPHZUKI.js +2 -0
- package/dist/evolve-cmd-BCPNXAMV.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-5OWELRME.js → extract-bind-LLEASZAK.js} +3 -3
- package/dist/{extract-cmd-ZRYMJ6IC.js → extract-cmd-UZMEZMGP.js} +2 -2
- package/dist/{gaps-cmd-XBRXKXDL.js → gaps-cmd-IVXFPFAQ.js} +1 -1
- package/dist/{generate-headless-D6BISWDC.js → generate-headless-D3SVQ2AI.js} +3 -3
- package/dist/host-7GZPBA74.js +2 -0
- package/dist/index.js +85 -69
- package/dist/ingest-cmd-EAE7N5RC.js +2 -0
- package/dist/{interactive-bind-XSRD36MO.js → interactive-bind-ORMN2REX.js} +3 -3
- package/dist/{lifecycle-cmd-EQSFAZG6.js → lifecycle-cmd-O2324GN6.js} +1 -1
- package/dist/{list-cmd-IRJSUCM5.js → list-cmd-N4KMA34H.js} +1 -1
- package/dist/list-commands-MRXL5HGS.js +2 -0
- package/dist/login-flow-QJQM3RHT.js +2 -0
- package/dist/{maintenance-cmd-MVFA6H74.js → maintenance-cmd-6XSVO6FO.js} +1 -1
- package/dist/mobile-prompts-TOX35ER6.js +2 -0
- package/dist/persist-recorded-session-TLDQ5HKP.js +3 -0
- package/dist/{phase-seed-DIRETNU6.js → phase-seed-VFHIH6FL.js} +1 -1
- package/dist/pipeline-UOM4LNAI.js +2 -0
- package/dist/prepare-target-QYWIJIVQ.js +2 -0
- package/dist/reconcile-cmd-3H34KVVD.js +2 -0
- package/dist/{reconcile-deps-HTT6IPHT.js → reconcile-deps-XIH75ZLY.js} +2 -2
- package/dist/reconcile-engine-UKWPG2LV.js +2 -0
- package/dist/{recording-banner-76GCIPUN.js → recording-banner-4M7XHVGI.js} +1 -1
- package/dist/registry-PYOTKZYZ.js +2 -0
- package/dist/{require-project-folder-ACRDP5ZB.js → require-project-folder-4UPQNEBJ.js} +1 -1
- package/dist/resolve-run-intent-X72V3KJA.js +7 -0
- package/dist/{resolver-SRPCFW7P.js → resolver-UBOZLFFE.js} +1 -1
- package/dist/{review-cmd-L3V5UP5T.js → review-cmd-DQRKQUMG.js} +1 -1
- package/dist/run-2COODVX2.js +2 -0
- package/dist/run-URPGHOQM.js +2 -0
- package/dist/{run-test-md-KEHSRMCM.js → run-test-md-76ZPKXO6.js} +3 -3
- 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-CIS6GAYF.js} +1 -1
- package/dist/spawner-J67QR4QP.js +2 -0
- package/dist/{structured-answers-A43Q25CZ.js → structured-answers-5EY2AZN7.js} +1 -1
- package/dist/tcg-generate-BDTRKY2A.js +2 -0
- package/dist/testmd-actions-77ELR5UU.js +2 -0
- package/dist/token-refresh-4BPAPXKK.js +2 -0
- package/dist/types-6E2HTDKJ.js +2 -0
- package/dist/{validate-basic-ZGWPBYB6.js → validate-basic-2GVSQ2R5.js} +1 -1
- package/dist/{verdicts-SCETLY5J.js → verdicts-TRSTJLCL.js} +1 -1
- package/dist/{version-check-CJWKDAXV.js → version-check-O6PYTI4T.js} +1 -1
- package/dist/{view-cmd-SOVM64L2.js → view-cmd-KPJTP4DI.js} +1 -1
- package/dist/{walk-session-YUYRULPY.js → walk-session-CHJXHZMO.js} +1 -1
- package/dist/with-telemetry-CQCWLVOC.js +2 -0
- package/package.json +12 -6
- 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/bootstrap-NFYYRGGR.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-5WXGMXGA.js +0 -26
- package/dist/chunk-74HTO7K3.js +0 -11
- package/dist/chunk-AECMF3T2.js +0 -8
- package/dist/chunk-BXYWX4J3.js +0 -2
- package/dist/chunk-DBKNJRJG.js +0 -2
- package/dist/chunk-H32GM5G4.js +0 -2
- package/dist/chunk-J5FBU425.js +0 -62
- 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-WAOCHXJ5.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/ingest-cmd-YTGOICTC.js +0 -2
- 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-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/with-telemetry-E7QWPGL6.js +0 -2
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{g as w}from"./chunk-HEAIJCGZ.js";import{a as h}from"./chunk-RZ4F3BHX.js";import{c as f}from"./chunk-27U4PLPX.js";import{mkdtemp as O,rm as $}from"fs/promises";import{createWriteStream as R}from"fs";import{Readable as U}from"stream";import{pipeline as F}from"stream/promises";import{tmpdir as T}from"os";import{basename as z,join as A}from"path";import{access as x,cp as P,mkdir as g,readdir as y,readFile as S,rename as I,rm as k,stat as b,writeFile as v}from"fs/promises";import{basename as D,join as d}from"path";function u(){return d(f,"mobile","apps")}function m(){return d(u(),"index.json")}function C(){return{readIndex:async()=>{try{let e=JSON.parse(await S(m(),"utf8"));return{apps:Array.isArray(e.apps)?e.apps:[]}}catch{return{apps:[]}}},writeIndex:async r=>{await g(u(),{recursive:!0});let e=`${m()}.tmp`;await v(e,JSON.stringify(r,null,2)),await I(e,m())},exists:async r=>{try{return await x(r),!0}catch{return!1}},copy:(r,e)=>P(r,e,{recursive:!0,force:!0}),remove:r=>k(r,{recursive:!0,force:!0}),sizeOf:async r=>{try{return(await b(r)).size}catch{return}},now:()=>new Date}}var c=class{deps;constructor(e={}){this.deps={...C(),...e}}async list(){let{apps:e}=await this.deps.readIndex();return[...e].sort((t,s)=>s.lastUsedAt.localeCompare(t.lastUsedAt))}async find(e){return(await this.deps.readIndex()).apps.find(t=>t.key===e)}async put(e){let t=await this.deps.readIndex(),s=t.apps.find(n=>n.key===e.key),a=this.deps.now().toISOString();if(s&&await this.deps.exists(s.path))return s.lastUsedAt=a,await this.deps.writeIndex(t),s;s&&(t.apps=t.apps.filter(n=>n.key!==e.key));let l=D(e.name??e.sourcePath),o=d(u(),e.key),p=d(o,l);await g(o,{recursive:!0}),await this.deps.copy(e.sourcePath,p);let i={key:e.key,path:p,name:l,source:e.source,...e.source==="local"?{originPath:e.sourcePath}:{},addedAt:a,lastUsedAt:a,...await this.deps.sizeOf(p).then(n=>n?{bytes:n}:{})};return t.apps=[...t.apps.filter(n=>n.key!==e.key),i],await this.deps.writeIndex(t),i}async exists(e){if(await this.deps.sizeOf(e.path)!==void 0)return!0;try{return await y(e.path),!0}catch{return!1}}async forget(e){let t=await this.deps.readIndex(),s=t.apps.find(a=>a.key===e);s&&(await this.deps.remove(s.path),t.apps=t.apps.filter(a=>a.key!==e),await this.deps.writeIndex(t))}async prune(){let e=await this.deps.readIndex(),t=[];for(let s of e.apps)if(await this.deps.sizeOf(s.path)!==void 0)t.push(s);else try{await y(s.path),t.push(s)}catch{}return t.length!==e.apps.length&&await this.deps.writeIndex({apps:t}),t}};var E=30*6e4,j=/^APP\d{6,}$/;function Y(r){return!!r&&j.test(r.trim())}function _(){return{store:new c,client:(r,e)=>new w(r,e),fetchToFile:async(r,e)=>{let t=await h(r,{method:"GET",signal:AbortSignal.timeout(E)});if(!t.ok)throw new Error(`Downloading the app failed: ${t.status} ${t.statusText}`);if(!t.body)throw new Error("Downloading the app failed: empty response body");await F(U.fromWeb(t.body),R(e))}}}async function Z(r,e={}){let t={..._(),...e},s=r.appId.trim(),a=await t.store.find(s);if(a&&await t.store.exists(a))return r.onProgress?.(`using the copy of ${a.name} already on this machine`),await t.store.put({key:s,sourcePath:a.path,source:"cloud",name:a.name}),{path:a.path,name:a.name,fromStore:!0};r.onProgress?.(`looking up ${s}\u2026`);let o=await t.client(r.baseUrl,r.auth).details(s);if(r.accepts&&!r.accepts.some(i=>o.name.toLowerCase().endsWith(i)))throw new Error(`${o.name} cannot run on this device \u2014 expected ${r.accepts.join(" or ")}.`);r.onProgress?.(`downloading ${o.name} \u2014 this can take a while, please wait\u2026`);let p=await O(A(T(),"kane-app-dl-"));try{let i=A(p,z(o.name));await t.fetchToFile(o.url,i);let n=await t.store.put({key:s,sourcePath:i,source:"cloud",name:o.name});return r.onProgress?.(`${o.name} is ready`),{path:n.path,name:n.name,fromStore:!1,details:o}}finally{await $(p,{recursive:!0,force:!0})}}export{c as a,Y as b,Z as c};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{d as X}from"./chunk-BB2W35TW.js";import{a as $}from"./chunk-YKTYVJBN.js";import{A as T,l as z,m as Y,n as H}from"./chunk-TH47OOBV.js";import{b as q,g as N}from"./chunk-DUAXZYAD.js";import{a as W,d as S,f as L}from"./chunk-DBIBROYW.js";import{c as C}from"./chunk-UD7KKHPW.js";import{a as K,c as J}from"./chunk-
|
|
2
|
+
import{d as X}from"./chunk-BB2W35TW.js";import{a as $}from"./chunk-YKTYVJBN.js";import{A as T,l as z,m as Y,n as H}from"./chunk-TH47OOBV.js";import{b as q,g as N}from"./chunk-DUAXZYAD.js";import{a as W,d as S,f as L}from"./chunk-DBIBROYW.js";import{c as C}from"./chunk-UD7KKHPW.js";import{a as K,c as J}from"./chunk-27U4PLPX.js";var ce=3,de=1e4,Q=()=>new Promise(r=>setTimeout(r,25+Math.floor(Math.random()*50))),Z=r=>r==="design"||r==="maintain"?"session":r==="revert"||r==="shape-op"?"exclusive":"commit";function le(r,e,o){for(let s of r){for(let t of s.supersessions)if(t.kind==="node"&&(o.has(t.old)||t.new!==null&&o.has(t.new)))return!0;for(let t of s.nodes)if(t.label==="usecase"&&e.newBuCandidates.length>0||o.has(t.cid))return!0;if(s.design_generation&&e.generationTicket&&s.design_generation.uc_root===e.generationTicket.uc_root)return!0;for(let t of e.sourcePins)if(Object.prototype.hasOwnProperty.call(s.source_head_moves,t.source_id))return!0}return!1}async function De(r,e,o){let{contextDir:s,locks:t,probe:a}=r,m=r.sid??r.rootSid,f=e.newBuCandidates.map(b=>({tempRef:b.tempRef,probeText:b.probeText})),k=0,g=!0,p={hits:[],degraded:!1,probeBasis:null};for(;;){g&&(f.length>0&&(p=await a.batchSimilar(T(s),f)),g=!1);let b=T(s),_={seq:b.lastSeq,hash:b.latestHash},P=new Map,w=[],v=[],R=new Set;for(let d of e.ucTargets){let c=H(b,d.ref);if(c===null)return{ok:!1,kind:"validation",errors:[{code:"UNKNOWN_REF",detail:`${d.ref}: names no living node (unknown or tombstoned chain)`}]};d.expectedTip!==void 0&&d.expectedTip!==c.cid&&P.set(d.expectedTip,c.cid),R.add(c.cid),v.push(L(b,d.ref).key)}(e.verb==="revert"||e.verb==="shape-op")&&(v.length=0,v.push({kind:"context",mode:"exclusive"}));let y;try{y=t.acquire(S(v),{hold:Z(e.verb),verb:e.verb})}catch(d){if(d instanceof W&&(d.code==="UC_HELD"||d.code==="CONTEXT_HELD"))return{ok:!1,kind:"contended",err:d};throw d}let V=!1,M=!1;try{let d=await t.withKeySerialized(v,async()=>{let c=T(s),O=_.hash===c.latestHash?[]:N(s,_.seq,_.hash).records;for(let n of e.ucTargets){let i=H(c,n.ref);if(i===null){w.push({kind:"supersession",ref:n.ref,detail:`${n.ref} was retired while this commit staged \u2014 re-ground or abandon`});continue}for(let l of R)c.superseded.has(l)&&c.tipOf(l)===i.cid&&P.set(l,i.cid)}for(let n of e.sourcePins){let i=c.heads.get(n.source_id);i!=null&&i!==n.source_cid&&w.push({kind:"pin",ref:n.source_id,detail:`source '${n.source_id}' moved (pinned ${n.source_cid.slice(0,19)}, head ${i.slice(0,19)}) \u2014 re-ground or abandon`})}if(w.length>0)return{ok:!1,kind:"drifted",asks:w};if(e.generationTicket){let n=X(c,e.generationTicket);if(n!==null)return{ok:!1,kind:"validation",errors:[n]}}if(f.length>0&&O.length>0){let n=new Set(p.hits.map(u=>u.candidateCid)),i=a.recheckLocal(c,f,p.probeBasis,O);if(i.hits.some(u=>!n.has(u.candidateCid))||i.uncachedNewNodes.length>0)return M=!0,"restart"}if(e.verb!=="revert"&&e.verb!=="shape-op"){let n=S(e.ucTargets.map(u=>L(c,u.ref).key)),i=S(v);if(!(n.length===i.length&&n.every((u,h)=>JSON.stringify(u)===JSON.stringify(i[h]))))return"restart"}if(e.eventIds&&e.eventIds.length>0&&e.eventIds.every(n=>c.appliedEvents.has(n)))return{ok:!0,skipped:"already-applied"};let ae=Date.now()+de,j=c.latestHash,E=c;for(;;){let n={graph:E,expectPrev:j,redirects:P,probeHits:p.hits,degradedProbe:p.degraded,sid:m,eventIds:(l,u)=>{if(e.eventIds&&e.eventIds.length>0)return e.eventIds.slice(0,u);let h=Y(E,r.rootSid,l,u),U=r.reservedEventIds??[];if(U.length===0)return h;let D=`${r.rootSid}:${l}:`,A=0;for(let F of U){if(!F.startsWith(D))continue;let x=F.slice(D.length);/^\d+$/.test(x)&&(A=Math.max(A,Number.parseInt(x,10)))}if(A===0)return h;let G=Number.parseInt(h[0].slice(D.length),10);return!Number.isInteger(G)||G>A?h:Array.from({length:u},(F,x)=>z(r.rootSid,l,A+1+x))},assertLocks:()=>y.assertHeld()};if(r.revalidate){let l=r.revalidate(n);if(l.length>0)return{ok:!1,kind:"validation",errors:l}}y.assertHeld();let i;try{i=o(n)}catch(l){if(l instanceof q){let u=T(s),h=N(s,E.lastSeq,E.latestHash).records;if(!le(h,e,R)&&Date.now()<ae){await Q(),E=u,j=u.latestHash;continue}return"restart"}throw l}return"errors"in i?{ok:!1,kind:"validation",errors:i.errors}:(Z(e.verb)==="session"&&y.touch(),{ok:!0,result:i.result,record:i.record})}});if(d==="restart")V=!0;else return d}finally{y.release()}if(V){if(k+=1,k>=ce)return{ok:!1,kind:"unsettled",attempts:k};M&&(g=!0),await Q();continue}}}import{readFileSync as ue,writeFileSync as fe,renameSync as me,mkdirSync as pe}from"fs";import{dirname as he,join as ge}from"path";var B=1,be=720*60*1e3;function I(r){return ge(J,"embeddings",`alias-${r}.json`)}function ee(r,e=Date.now()){return r!==null&&e-r.fetchedAt<be}function re(r){try{let e=JSON.parse(ue(r,"utf-8"));return e.wrapperVersion!==B||typeof e.purposes!="object"||e.purposes===null?null:{wrapperVersion:B,writtenByVersion:String(e.writtenByVersion??""),purposes:e.purposes}}catch{return null}}function te(r,e,o=I(r)){let t=re(o)?.purposes?.[e];return!t||typeof t.alias!="string"||typeof t.dims!="number"||typeof t.fetchedAt!="number"?null:{alias:t.alias,dims:t.dims,fetchedAt:t.fetchedAt}}function se(r,e,o,s=I(r)){try{pe(he(s),{recursive:!0});let a=re(s)?.purposes??{};a[e]={alias:o.alias,dims:o.dims,fetchedAt:Date.now()};let m={wrapperVersion:B,writtenByVersion:K,purposes:a},f=`${s}.tmp`;fe(f,JSON.stringify(m,null,2)+`
|
|
3
3
|
`),me(f,s)}catch(t){C(`[embed] Failed to save alias cache: ${t instanceof Error?t.message:String(t)}`,"EMBED_CACHE_WRITE_FAILED")}}function ve(r){return r.TESTMUAI_ENV==="stage"?"stage":"prod"}function oe(r){let e=r.env??process.env,o=r.auth?.TESTMUAI_BASIC_AUTH||e.TESTMUAI_BASIC_AUTH;if(o)return{authorization:`Basic ${o}`};let s=r.auth?.TESTMUAI_API_KEY||e.TESTMUAI_API_KEY;return s?{authorization:`Bearer ${s}`}:{}}async function Oe(r,e={}){let o=e.env??process.env,s=ve(o),t=e.aliasCacheFile??I(s),a=e.now??Date.now,m=te(s,r,t);if(ee(m,a()))return{alias:m.alias,dims:m.dims};let k=`${$(o)}/assurance/embed/alias?purpose=${encodeURIComponent(r)}`,g=await(e.fetchImpl??fetch)(k,{method:"GET",headers:oe(e)});if(!g.ok)throw new Error(`embed alias resolve failed: ${g.status}`);let p=await g.json();return se(s,r,{alias:p.alias,dims:p.dims},t),{alias:p.alias,dims:p.dims}}async function je(r,e,o={}){let s=o.env??process.env,t=$(s),a=await(o.fetchImpl??fetch)(`${t}/assurance/embed`,{method:"POST",headers:{...oe(o),"content-type":"application/json"},body:JSON.stringify({purpose:r,input:e})});if(!a.ok)throw new Error(`embed failed: ${a.status}`);return await a.json()}import{readFileSync as ke,writeFileSync as ye,renameSync as Ee,mkdirSync as Ae}from"fs";import{dirname as Te,join as ne}from"path";function we(r){return ne(r,"embeddings")}function xe(r){let e=r.indexOf(":");return e>=0?r.slice(e+1):r}function ie(r,e,o){let s=xe(o);return ne(we(r),e,s.slice(0,2),`${s.slice(2)}.f32`)}function We(r,e,o){try{let s=ke(ie(r,e,o)),t=new Float32Array(Math.floor(s.length/4));for(let a=0;a<t.length;a++)t[a]=s.readFloatLE(a*4);return t}catch{return null}}function qe(r,e,o,s){try{let t=ie(r,e,o);Ae(Te(t),{recursive:!0});let a=Buffer.alloc(s.length*4);for(let f=0;f<s.length;f++)a.writeFloatLE(s[f],f*4);let m=`${t}.tmp`;ye(m,a),Ee(m,t)}catch(t){C(`[embed] Failed to cache vector: ${t instanceof Error?t.message:String(t)}`,"EMBED_CACHE_WRITE_FAILED")}}export{De as a,Oe as b,je as c,We as d,qe as e};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
function o(e){return e.kind==="simulator"?e.id:e.virtualName??e.id}function a(e,i,r={}){let t={platform:e.platform,udid:e.id,target_kind:e.kind};return i&&(t.app_package=i),r.noReset!==void 0&&(t.no_reset=r.noReset),r.appiumUrl&&(t.appium_url=r.appiumUrl),t}export{o as a,a as b};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as B}from"./chunk-S3DAAAE5.js";import{a as g}from"./chunk-
|
|
2
|
+
import{b as B}from"./chunk-S3DAAAE5.js";import{a as g}from"./chunk-UDIQOJEL.js";import{y as s}from"./chunk-27U4PLPX.js";import{a as w}from"./chunk-HCBYKLMW.js";import{a as x,b as t,c as h,i as P,j as S}from"./chunk-C44QQJR4.js";import{a as C}from"./chunk-6YGTRKDT.js";import{e as T}from"./chunk-UR6MHSHU.js";var o=T(C(),1);var e=T(w(),1);function D({defaultName:i,onSubmit:c}){let[d,p]=(0,o.useState)("confirm"),[f,a]=(0,o.useState)(""),[m,u]=(0,o.useState)(null),l=(0,o.useMemo)(()=>f.trim()||i,[f,i]);return P((n,r)=>{if(d==="confirm"){if(n==="y"||n==="Y"){a(i),p("name");return}if(n==="n"||n==="N"||r.escape||r.ctrl&&n==="c"){c(null);return}if(r.return){c(i);return}return}if(r.return){if(!B(l)){u(`name "${l}" is invalid; allowed: letters, digits, underscore, hyphen`);return}c(l);return}if(r.escape||r.ctrl&&n==="c"){c(null);return}if(r.backspace||r.delete){a(v=>v.slice(0,-1)),u(null);return}n&&!r.ctrl&&!r.meta&&(a(v=>v+n),u(null))}),d==="confirm"?(0,e.jsx)(g,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsx)(t,{color:s.orange,children:i})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[(0,e.jsx)(t,{color:s.dim,children:"enter \u2014 save with this name"}),(0,e.jsx)(t,{color:s.dim,children:"Y \u2014 edit name"}),(0,e.jsx)(t,{color:s.dim,children:"N/esc \u2014 discard session"})]})}):(0,e.jsx)(g,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsxs)(x,{children:[(0,e.jsx)(t,{color:s.orange,children:f}),(0,e.jsx)(t,{inverse:!0,children:" "})]})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[m&&(0,e.jsx)(t,{color:s.red,children:m}),(0,e.jsx)(t,{color:s.dim,children:"enter \u2014 save \xB7 esc \u2014 discard"})]})})}function V(){return new Date().toISOString().slice(0,19).replace(/:/g,"-")}async function Y(i){return new Promise(c=>{function d(){let{exit:a}=S(),[m,u]=(0,o.useState)(!1);return(0,o.useEffect)(()=>{if(m){let l=setTimeout(()=>a(),50);return()=>clearTimeout(l)}},[m,a]),(0,e.jsx)(D,{defaultName:i,onSubmit:l=>{c(l),u(!0)}})}let{waitUntilExit:p,unmount:f}=h((0,e.jsx)(d,{}),{stdout:process.stderr,exitOnCtrlC:!1});p().then(()=>{try{f()}catch{}})})}export{D as a,V as b,Y as c};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as X,b as Y,c as Z,d as nn,e as en}from"./chunk-GZPK6FRP.js";import{b as tn,c as rn}from"./chunk-6IA6QMPH.js";import{m as Q,o as P}from"./chunk-56PAQAX5.js";import{a as Cn}from"./chunk-6YGTRKDT.js";import{e as kn}from"./chunk-UR6MHSHU.js";function sn(i){return{command:"start",...i}}function on(i,e,o){return{command:"run",run_id:i,kind:e,...o}}function an(i){return{command:"cancel",...i?{run_id:i}:{}}}function un(i){return{command:"ask_user_response",answer:i}}function dn(){return{command:"shutdown"}}var q=Symbol("run-queue-end"),z=class{items=[];waiting=null;ended=!1;error=null;push(e){if(this.waiting){let{resolve:o}=this.waiting;this.waiting=null,o(e)}else this.items.push(e)}end(){if(this.ended=!0,this.waiting){let{resolve:e}=this.waiting;this.waiting=null,e(q)}}fail(e){if(this.error=e,this.waiting){let{reject:o}=this.waiting;this.waiting=null,o(e)}}next(){return this.items.length>0?Promise.resolve(this.items.shift()):this.error?Promise.reject(this.error):this.ended?Promise.resolve(q):new Promise((e,o)=>{this.waiting={resolve:e,reject:o}})}},A=class{env;runner;log;sessionId;spawnFn;proc=null;activeRun=null;pendingReady=null;shuttingDown=!1;finalized=!1;exitInfo=null;exitedUnexpectedly=!1;exitResolve;exited;constructor(e){this.env=e.env,this.runner=e.runner,this.log=e.log,this.sessionId=e.sessionId,this.spawnFn=e.spawn??Y;let o;this.exited=new Promise(c=>{o=c}),this.exitResolve=o}async start(e){if(this.proc)throw new Error("PersistentRunner.start called twice");this.proc=this.spawnFn({env:this.env,runner:this.runner,log:this.log,sessionId:this.sessionId}),this.consume();let o=new Promise((c,g)=>{this.pendingReady={resolve:c,reject:g}});this.writeCommand(sn(e)),await o}async*run(e,o,c){if(!this.proc)throw new Error("PersistentRunner.run called before start");if(this.finalized)throw new Error(`v16-runner is not running (exited code=${this.exitInfo?.code??"null"}, signal=${this.exitInfo?.signal??"none"}) \u2014 cannot start run '${e}'`);if(this.activeRun)throw new Error(`PersistentRunner.run overlap: '${this.activeRun.runId}' still in flight`);let g=new z,w={runId:e,queue:g};this.activeRun=w,this.writeCommand(on(e,o,c));try{for(;;){let v=await g.next();if(v===q||(yield v,v.type==="run_end"&&(v.run_id===void 0||v.run_id===e)))break}}finally{this.activeRun===w&&(this.activeRun=null)}}sendUserResponse(e){this.writeCommand(un(e))}cancel(e){this.writeCommand(an(e))}kill(){this.proc?.child.kill("SIGTERM")}async shutdown(){this.shuttingDown=!0,this.proc&&(this.writeCommand(dn()),await this.exited)}get stderr(){return this.proc?.getStderr()??""}get diedUnexpectedly(){return this.exitedUnexpectedly}writeCommand(e){let o=JSON.stringify(e)+`
|
|
3
|
+
`;try{this.proc?.child.stdin?.write(o)}catch{}}async consume(){if(!this.proc)return;try{for await(let c of this.proc.events){if(c.type==="ready"){this.onReady();continue}this.routeEvent(c)}}catch(c){this.log?.("error","PERSISTENT_RUNNER_STREAM_ERROR","Runner stdout stream errored",{error:c instanceof Error?c.message:String(c)})}let{code:e,signal:o}=await this.proc.exited;this.onExit(e,o)}onReady(){if(this.pendingReady){let{resolve:e}=this.pendingReady;this.pendingReady=null,e()}}routeEvent(e){let o=this.activeRun;if(!o){this.log?.("warn","PERSISTENT_RUNNER_ORPHAN_EVENT","Runner event with no active run",{event_type:e.type});return}o.queue.push(e)}onExit(e,o){if(!this.finalized){if(this.finalized=!0,this.exitInfo={code:e,signal:o},this.shuttingDown||(this.exitedUnexpectedly=!0),this.exitResolve({code:e,signal:o}),this.pendingReady){let{reject:c}=this.pendingReady;this.pendingReady=null,c(new Error(`v16-runner exited before ready (code=${e}, signal=${o??"none"})`))}if(this.activeRun){let{queue:c}=this.activeRun;if(this.activeRun=null,this.shuttingDown)c.end();else{let g=this.proc?.getStderr()?.slice(-500)??"";c.fail(new Error(`v16-runner exited unexpectedly mid-run (code=${e}, signal=${o??"none"})${g?`
|
|
4
|
+
${g}`:""}`))}}}}};var p=kn(Cn(),1);function ln(i){let e={cdp_endpoint:i.cdp_endpoint,ws_endpoint:i.ws_endpoint,width:i.width,height:i.height,headless:i.headless,model:i.model,max_steps:i.max_steps,network_ws:i.network_ws,network_sse:i.network_sse,session_id:i.session_id};return i.device&&(e.device=i.device),i.auth&&(e.auth=i.auth),i.username&&(e.username=i.username),i.access_key&&(e.access_key=i.access_key),e}function j(i,e){let o=null,c=(g,w)=>{for(let v=0;v<g.length;v++){let x=g[v],h=[...w,v];e(x)&&(o===null||h.length>o.length)&&(o=h),x.children&&x.children.length>0&&c(x.children,h)}};return c(i,[]),o}function N(i,e,o){if(e.length===0)return[...i];let c=e[0],g=[...i],w=g[c];if(e.length===1)g[c]=o(w);else{let v=e.slice(1),x=N(w.children??[],v,o);g[c]={...w,children:x}}return g}function cn(){return{steps:[],maxOrdinal:0}}function Pn(i,e){if(e.type==="run_start"&&e.child_id)return e.environment?.resolution?{...i,resolution:e.environment.resolution}:i;if(e.type==="run_start"){let o=rn(i.runnerEnvironment,tn(e.environment));if(o)return{...i,runnerEnvironment:o,...o.resolution?{resolution:o.resolution}:{}}}if(e.type==="step_end"&&typeof e.ordinal=="number"&&e.id){let o={id:e.id,ordinal:e.ordinal,status:e.status,...e.kind?{kind:e.kind}:{},...typeof e.duration=="number"?{duration_ms:Math.round(e.duration*1e3)}:{},...typeof e.action_id=="string"&&e.action_id?{action_id:e.action_id}:{}};return{...i,steps:[...i.steps,o],maxOrdinal:Math.max(i.maxOrdinal,e.ordinal)}}return i}function V(i){let e=i.indexOf(": ");return e>0&&e<15?i.slice(e+2):i}function W(i){return i.map(e=>{let o=e.children?W(e.children):e.children;return e.status==="running"?{...e,status:"stopped",phase:void 0,children:o}:o!==e.children?{...e,children:o}:e})}function qn(i,e,o,c,g){let[w,v]=(0,p.useState)(!1),[x,h]=(0,p.useState)([]),[pn,T]=(0,p.useState)(null),[hn,D]=(0,p.useState)(null),[fn,I]=(0,p.useState)(null),[mn,J]=(0,p.useState)(null),[vn,G]=(0,p.useState)([]),[gn,H]=(0,p.useState)(null),[Rn,Sn]=(0,p.useState)(void 0),y=(0,p.useRef)(null),E=(0,p.useRef)(null),S=(0,p.useRef)(null),b=(0,p.useRef)(0),B=(0,p.useRef)(!1),$=(0,p.useRef)(cn()),U=(0,p.useRef)(null),yn=(0,p.useCallback)(async(m,_)=>{let K=U.current;if(K)try{await K}catch{}h([]),T(null),D(null),I(null),J(null),G([]),H(null),Sn(m.max_steps),v(!0),S.current=null,b.current=0,$.current=cn();let k=y.current;if(k&&E.current!==m.session_id){try{k.kill()}catch{}y.current=null,E.current=null,k=null}if(!k){let n=X();if(!n){I("v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available."),v(!1);return}let d=nn({environment:_?.environment,mode:_?.mode,assertionMode:_?.assertionMode,finalValidation:_?.finalValidation,username:m.username,accessKey:m.access_key,sessionId:m.session_id});m.device?.platform&&await Z(d,m.device);let u=new A({env:d,runner:n,log:_?.log,sessionId:m.session_id});y.current=u,E.current=m.session_id,k=u,Q("runner",()=>{try{u.kill()}catch{}});let s=ln(m);try{await u.start(s)}catch(a){I(a instanceof Error?a.message:String(a)),v(!1),P("runner","Runner start failed"),y.current=null,E.current=null;return}}let F={...m};delete F.run_id,en(F,{environment:_?.environment});let En=`run-${m.run_index}`,In=m.mode==="replay"?"replay":"author",M=k,L=(async()=>{B.current=!1;for await(let n of M.run(En,In,F)){if(B.current)break;switch($.current=Pn($.current,n),n.type){case"run_start":if(n.child_id)break;if(S.current&&!S.current.isSingleFlow){let d=b.current;b.current++,h(u=>u.map((s,a)=>a===d?{...s,status:"running"}:s.status==="running"&&!s.children?.some(t=>t.status==="running")?{...s,status:s.children?.some(t=>t.status==="failed")?"failed":"passed"}:s))}break;case"bifurcation":{let d=n.flows??[],u=n.count??d.length,s={flows:d,isSingleFlow:n.is_single_flow??u<=1};J(s),S.current=s,b.current=0,h(d.map((a,t)=>({index:t+1,objective:a??`Flow ${t+1}`,status:"pending"})));break}case"step_start":{e?.("STEP_START",`Step ${n.index} started`,{index:n.index,objective:n.objective,child_id:n.child_id});let d=n.index,u=n.objective??`Step ${d}`,s=n.child_id,a=S.current&&!S.current.isSingleFlow;if(s)h(t=>{let r=j(t,l=>l.branchChildId===s)??j(t,l=>l.status==="running");return r?N(t,r,l=>{let f=(l.children??[]).map(R=>R.status==="running"&&R.childId===s?{...R,status:"stopped",phase:void 0}:R);return f.push({index:d,objective:u,status:"running",childId:s}),{...l,children:f}}):t});else if(a){let t=Math.max(0,b.current-1);h(r=>{let l=[...r];if(t>=l.length)return r;let f={...l[t]},C=[...f.children??[]].map(O=>O.status==="running"&&O.childId===void 0?{...O,status:"stopped",phase:void 0}:O);return C.push({index:d,objective:u,status:"running"}),f.children=C,f.status="running",l[t]=f,l})}else h(t=>{let r=W(t);return r.some(f=>f.index===d)?r.map(f=>f.index===d?{...f,status:"running",objective:u}:f):[...r,{index:d,objective:u,status:"running"}]});break}case"step_event":{e?.("STEP_EVENT",`Step ${n.index} ${n.event}`,{index:n.index,phase:n.event,action_type:n.action_type,detail:n.detail,child_id:n.child_id});let d=n.child_id,u=S.current&&!S.current.isSingleFlow;if(n.event==="cm_init"&&n.checkpoint_count!=null){G(s=>[...s,n.checkpoint_count]);break}if(n.event==="replay_started"){H({recordingLength:n.recording_length??0});break}if(n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&o?.(n.detail),d){let s=t=>{if(t.index!==n.index||t.childId!==d)return t;let r={phase:n.event};return n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(r.objective=n.detail),n.action_type&&(r.actionType=n.action_type),{...t,...r}},a=t=>t.map(r=>{let l=s(r);return l!==r?l:r.children&&r.children.length>0?{...r,children:a(r.children)}:r});h(t=>t.map(r=>r.children?{...r,children:a(r.children)}:r))}else if(u){let s=Math.max(0,b.current-1);h(a=>{let t=[...a];if(s>=t.length)return a;let r={...t[s]},l=[...r.children??[]];if(!l.some(R=>R.index===n.index&&R.childId===void 0))l.push({index:n.index,objective:`Step ${n.index}`,status:"running",phase:n.event,actionType:n.action_type});else for(let R=0;R<l.length;R++){if(l[R].index!==n.index||l[R].childId!==void 0)continue;let C={phase:n.event};n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(C.objective=n.detail),n.action_type&&(C.actionType=n.action_type),l[R]={...l[R],...C}}return r.children=l,t[s]=r,t})}else h(s=>s.some(t=>t.index===n.index)?s.map(t=>{if(t.index!==n.index)return t;let r={phase:n.event};return n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(r.objective=n.detail),n.action_type&&(r.actionType=n.action_type),{...t,...r}}):[...W(s),{index:n.index,objective:`Step ${n.index}`,status:"running",phase:n.event,actionType:n.action_type}]);break}case"step_end":{e?.("STEP_END",`Step ${n.index} ${n.status}`,{index:n.index,status:n.status,duration:n.duration,summary:n.summary,child_id:n.child_id}),c?.();let d=n.child_id,u=S.current&&!S.current.isSingleFlow;if(d){let s=t=>t.index===n.index&&t.childId===d?{...t,status:n.status,duration:n.duration,phase:void 0,objective:t.objective.startsWith("Step ")?V(n.summary||t.objective):t.objective}:t,a=t=>t.map(r=>{let l=s(r);return l!==r?l:r.children&&r.children.length>0?{...r,children:a(r.children)}:r});h(t=>t.map(r=>r.children?{...r,children:a(r.children)}:r))}else if(u){let s=Math.max(0,b.current-1);h(a=>{let t=[...a];if(s>=t.length)return a;let r={...t[s]},l=(r.children??[]).map(f=>f.index===n.index&&f.childId===void 0?{...f,status:n.status,duration:n.duration,phase:void 0,objective:f.objective.startsWith("Step ")?V(n.summary||f.objective):f.objective}:f);return r.children=l,t[s]=r,t})}else h(s=>s.map(a=>a.index===n.index?{...a,status:n.status,duration:n.duration,phase:void 0,objective:a.objective.startsWith("Step ")?V(n.summary||a.objective):a.objective}:a));{let a=S.current&&!S.current.isSingleFlow?Math.max(0,b.current-1):0,t=typeof n.ordinal=="number"&&n.id?{ordinal:n.ordinal,id:n.id}:void 0;i?.(n.index,a,n.child_id,t)}break}case"child_agent_start":{let d=n.objective??"",u=n.child_id;h(s=>{let a=j(s,t=>t.status==="running");return a?N(s,a,t=>({...t,objective:`${d} (branch)`,phase:`child: ${d.slice(0,50)}`,branchObjective:d,branchChildId:u})):s});break}case"child_agent_end":{let d=n.child_id,u=`child ${n.success?"done":"failed"}`;h(s=>{let a=j(s,t=>t.branchChildId===d);return a?N(s,a,t=>({...t,phase:u})):s.map(t=>t.phase?.startsWith("child:")?{...t,phase:u}:t)});break}case"describe_trigger":g?.(n);break;case"ask_user":T(n.question??"");break;case"run_end":h(d=>d.map(u=>u.status==="running"?{...u,status:n.status,phase:void 0}:u)),v(!1),D(n);break;case"error":v(!1),I(n.message??"Runner error"),h(d=>d.map(u=>u.status==="running"?{...u,status:"failed",phase:void 0}:u));break}}})().catch(n=>{if(y.current!==M)return;let u=[n instanceof Error?n.message:String(n)],s=M.stderr;s&&!u.join(`
|
|
5
|
+
`).includes(s)&&u.push(s),I(u.join(`
|
|
6
|
+
`)),v(!1),h(a=>a.map(t=>t.status==="running"?{...t,status:"failed",phase:void 0}:t)),P("runner","Runner died mid-run"),y.current=null,E.current=null});U.current=L,L.finally(()=>{U.current===L&&(U.current=null)})},[i,e,o,c,g]),wn=(0,p.useCallback)(m=>{y.current?.sendUserResponse(m),T(null)},[]),xn=(0,p.useCallback)(()=>{let m=y.current;m&&(m.cancel(),v(!1),T(null))},[]),bn=(0,p.useCallback)(async()=>{let m=y.current;if(m){try{await Promise.race([m.shutdown(),new Promise(_=>setTimeout(_,5e3))])}catch{}P("runner","Runner shut down"),y.current=null,E.current=null}},[]),_n=(0,p.useCallback)(()=>{h([]),D(null),I(null)},[]);return(0,p.useEffect)(()=>()=>{B.current=!0,P("runner","Component unmounted"),y.current=null,E.current=null},[]),{isRunning:w,steps:x,askingUser:pn,lastRunEnd:hn,runError:fn,bifurcationInfo:mn,cmInitCounts:vn,replayInfo:gn,maxSteps:Rn,startRun:yn,sendAnswer:wn,cancelRun:xn,shutdownRunner:bn,clearLastRun:_n,getEvidenceState:()=>$.current}}export{A as a,ln as b,cn as c,Pn as d,qn as e};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as m}from"./chunk-
|
|
2
|
+
import{a as m}from"./chunk-TFPPEOAK.js";import{y as t}from"./chunk-27U4PLPX.js";import{a as p}from"./chunk-HCBYKLMW.js";import{a,b as r,i as u}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as n}from"./chunk-UR6MHSHU.js";var c=n(b(),1);var e=n(p(),1);function R({onSubmit:l}){let[o,f]=(0,c.useState)(0),s=(0,c.useRef)(!1);return u((x,i)=>{s.current||(i.leftArrow||i.rightArrow?f(d=>d===0?1:0):i.return?(s.current=!0,l(o===0?"positive":"negative")):i.escape&&(s.current=!0,l(null)))}),(0,e.jsxs)(a,{flexDirection:"column",marginTop:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(r,{color:t.secondary,children:"Rate this session: "}),(0,e.jsx)(r,{color:o===0?t.orange:t.dim,children:o===0?"[ \u{1F44D} ]":" \u{1F44D} "}),(0,e.jsx)(r,{children:" "}),(0,e.jsx)(r,{color:o===1?t.orange:t.dim,children:o===1?"[ \u{1F44E} ]":" \u{1F44E} "})]}),(0,e.jsx)(m,{bindings:[{keys:"\u2190/\u2192",label:"select"},{keys:"\u21B5",label:"submit"}],escBackLabel:"skip"})]})}export{R as a};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as l}from"./chunk-
|
|
2
|
+
import{b as l}from"./chunk-QW6EZC53.js";import{a as m}from"./chunk-G7VQCS4J.js";import{a as p}from"./chunk-RZ4F3BHX.js";import{a as f}from"./chunk-6O3DDOP2.js";import{a as c,c as s,i as a,x as u}from"./chunk-27U4PLPX.js";var v="/public/skills/kane-cli";function C(){try{let n=new f().getDefaultEnv();if(n in u)return n}catch{}return"prod"}function k(){return`${m(C()).controllerBaseUrl}${v}`}import{readFileSync as S,writeFileSync as E,mkdirSync as g}from"fs";import{join as d}from"path";var h=d(s,"skill-check.json"),y=3600*1e3;function V(){try{let n=JSON.parse(S(h,"utf-8"));if(Date.now()-n.checkedAt<y)return n}catch{}return null}function A(n){try{g(s,{recursive:!0}),E(h,JSON.stringify({map:n,checkedAt:Date.now()}))}catch{}}function I(){for(let{dir:n}of a)try{let t=S(d(n,"VERSION"),"utf-8").trim();if(t)return t}catch{}return null}function M(n,t){let i=Object.keys(n.versions??{});if(i.length===0)return null;let o=i.slice().sort((r,e)=>l(r,e));for(let r of o){let e=n.versions[r]?.kaneCliMinVersion;if(!e||l(t,e)<=0)return r}return null}async function U(){try{let n=V()?.map;if(!n){let o=new AbortController,r=setTimeout(()=>o.abort(),5e3),e=await p(k(),{headers:{Accept:"application/json"},signal:o.signal});if(clearTimeout(r),!e.ok)return null;n=await e.json(),A(n)}let t=M(n,c);if(!t)return null;let i=I();return i===null?{current:null,latestCompatible:t}:l(i,t)>0?{current:i,latestCompatible:t}:null}catch{return null}}export{k as a,M as b,U as c};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{b as n}from"./chunk-NLCCBXXV.js";import{a as r}from"./chunk-RZ4F3BHX.js";var i={attempts:3,backoffMs:[250,750]},o=class extends n{constructor(e,s){super(e,s)}headers(){return{Authorization:this.authHeader,"Content-Type":"application/json"}}async getTmsCredentials(){let e=await r(`${this.baseUrl}/auth/tms-credentials`,{method:"GET",headers:this.headers(),retry:i});if(!e.ok)throw new Error(`Credential exchange failed: ${e.status} ${await e.text()}`);return await e.json()}async getPresignedUrls(e,s,t){let a=await r(`${this.baseUrl}/upload/presign`,{method:"POST",headers:this.headers(),body:JSON.stringify({test_id:e,session_id:s,files:t})});if(!a.ok)throw new Error(`Presign request failed: ${a.status} ${await a.text()}`);return await a.json()}async getScreenshotSas(){let e=await r(`${this.baseUrl}/upload/screenshot-sas`,{method:"GET",headers:this.headers(),retry:i});if(!e.ok)throw new Error(`Screenshot SAS request failed: ${e.status} ${await e.text()}`);return await e.json()}async resolveMobileDepsBundle(e){let s=await r(`${this.baseUrl}/mobile-deps/presign`,{method:"POST",headers:this.headers(),body:JSON.stringify({cli_version:e.cliVersion,os:e.os,arch:e.arch,device_class:e.deviceClass})});if(!s.ok)throw new Error(`Mobile deps resolve failed: ${s.status} ${await s.text()}`);let t=await s.json();return{bundleVersion:t.bundle_version,url:t.url,sha256:t.sha256,bytes:t.bytes}}async getCreditBalance(){let e=await r(`${this.baseUrl}/credits/balance`,{method:"GET",headers:this.headers(),retry:i});if(!e.ok)throw new Error(`Credit balance request failed: ${e.status} ${await e.text()}`);return await e.json()}};export{o as a};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as
|
|
2
|
+
import{a as g}from"./chunk-2WVKOZ6W.js";import{b as f,c as j}from"./chunk-VE3SUJMA.js";import{a as m}from"./chunk-G7VQCS4J.js";var _="KaneAI Generated",E="Untitled";async function p(e){let r=e.config.load(),d=new g(m(e.env).tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key),n=e.projectName??_,o=e.folderName??E,t=r.project_id??null,s=r.project_name??null;if(!t){let a=(await d.listProjects()).find(l=>l.name===n);if(a)t=a.project_id,s=a.name,e.log("info","ENSURE_PROJECT_FOUND","Found default project",{project_id:t,name:s});else{let l=await d.createProject(n);t=l.id,s=l.name,e.log("info","ENSURE_PROJECT_CREATED","Created default project",{project_id:t,name:s})}f(e.creds,e.config,e.profile,e.env,{projectId:t,projectName:s})}let c=r.folder_id??null,i=r.folder_name??null,u=!r.project_id;if(!c||u){let a=(await d.listFolders(t)).find(l=>l.name===o);if(a)c=a.id,i=a.name,e.log("info","ENSURE_FOLDER_FOUND","Found default folder",{folder_id:c,name:i});else{let l=await d.createFolder(t,o);c=l.id,i=l.name,e.log("info","ENSURE_FOLDER_CREATED","Created default folder",{folder_id:c,name:i})}f(e.creds,e.config,e.profile,e.env,{folderId:c,folderName:i})}return{projectId:t,projectName:s??n,folderId:c,folderName:i??o}}function A(e,r,d){let n=e.loadProfileConfig(r,d)??{};return{projectId:n.project_id??null,folderId:n.folder_id??null}}function N(e,r){return e.projectId===null||e.folderId===null||r===null?"needs-picker":r.project==="ok"&&r.folder==="ok"?"ok":r.project==="error"&&r.folder==="error"?"ok-tms-degraded":"needs-picker"}var k=(e,r)=>`error: profile "${e}" (${r}) has no project/folder configured AND no TMS credentials were available to auto-configure one.
|
|
3
3
|
|
|
4
4
|
discover IDs:
|
|
5
5
|
kane-cli projects list --search "<keyword>" --limit 10
|
|
@@ -13,5 +13,5 @@ set them:
|
|
|
13
13
|
kane-cli config project <project-id>
|
|
14
14
|
kane-cli config folder <folder-id>
|
|
15
15
|
`;function C(e,r){return k(e,r)}function D(e){return`info: auto-configured project "${e.projectName}" (${e.projectId}) and folder "${e.folderName}" (${e.folderId}). Change with: kane-cli config project <id> / kane-cli config folder <id>.`}function S(e){return`${JSON.stringify(T(e))}
|
|
16
|
-
`}function T(e){return{type:"project_folder_auto_defaulted",project_id:e.projectId,project_name:e.projectName,folder_id:e.folderId,folder_name:e.folderName}}async function x(e){if(e.isLocal)return e.log("info","GATE_SKIP_LOCAL","Gate skipped (--local)",{}),{status:"skip",reason:"local"};j(e.creds,e.config,e.profile,e.env,e.log);let r=A(e.creds,e.profile,e.env),d=null;if(r.projectId!==null){let o=
|
|
17
|
-
`),{status:"ok",projectId:t.projectId,folderId:t.folderId,autoDefaulted:t}}catch(o){let t=C(e.profile,e.env);if(e.log("error","GATE_FATAL","Auto-default failed",{profile:e.profile,env:e.env,cached_project_id:r.projectId,cached_folder_id:r.folderId,validation:d,error:o instanceof Error?o.message:String(o)}),e.onFatalExit)e.onFatalExit(t);else{process.stderr.write(t);let{shutdown:s}=await import("./exit-manager-
|
|
16
|
+
`}function T(e){return{type:"project_folder_auto_defaulted",project_id:e.projectId,project_name:e.projectName,folder_id:e.folderId,folder_name:e.folderName}}async function x(e){if(e.isLocal)return e.log("info","GATE_SKIP_LOCAL","Gate skipped (--local)",{}),{status:"skip",reason:"local"};j(e.creds,e.config,e.profile,e.env,e.log);let r=A(e.creds,e.profile,e.env),d=null;if(r.projectId!==null){let o=m(e.env);d=await new g(o.tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key).validateProjectFolder(r.projectId,r.folderId??""),e.log("info","GATE_VALIDATE","TMS project/folder validation",{project:d.project,folder:d.folder,folder_was_cached:r.folderId!==null})}else r.folderId!==null&&(f(e.creds,e.config,e.profile,e.env,{folderId:null,folderName:null}),e.log("warn","GATE_CLEARED_ORPHAN_FOLDER","Cleared orphan folder (no project cached)",{folder_id:r.folderId}),r.folderId=null);let n=N(r,d);if(n==="ok")return{status:"ok",projectId:r.projectId,folderId:r.folderId};if(n==="ok-tms-degraded")return e.log("warn","GATE_TMS_DEGRADED","TMS validation failed; using cached IDs",{project_id:r.projectId,folder_id:r.folderId}),{status:"ok",projectId:r.projectId,folderId:r.folderId};if(d){let o={};d.project==="missing"?(o.projectId=null,o.projectName=null,o.folderId=null,o.folderName=null):d.folder==="missing"&&(o.folderId=null,o.folderName=null),Object.keys(o).length>0&&(f(e.creds,e.config,e.profile,e.env,o),e.log("info","GATE_CLEARED_STALE","Cleared stale cached IDs before re-resolve",{project_cleared:d.project==="missing",folder_cleared:d.folder==="missing"||d.project==="missing"}))}try{let o=await p({creds:e.creds,config:e.config,profile:e.profile,env:e.env,tmsCreds:e.tmsCreds,log:e.log}),t={projectId:o.projectId,projectName:o.projectName,folderId:o.folderId,folderName:o.folderName};return e.log("info","GATE_AUTO_DEFAULTED","Auto-configured project/folder",{project_id:t.projectId,project_name:t.projectName,folder_id:t.folderId,folder_name:t.folderName}),e.onAnnounce?e.onAnnounce(t):process.stderr.write(`${D(t)}
|
|
17
|
+
`),{status:"ok",projectId:t.projectId,folderId:t.folderId,autoDefaulted:t}}catch(o){let t=C(e.profile,e.env);if(e.log("error","GATE_FATAL","Auto-default failed",{profile:e.profile,env:e.env,cached_project_id:r.projectId,cached_folder_id:r.folderId,validation:d,error:o instanceof Error?o.message:String(o)}),e.onFatalExit)e.onFatalExit(t);else{process.stderr.write(t);let{shutdown:s}=await import("./exit-manager-3FVBTNYR.js");s(2,"Project/folder gate failed")}return{status:"cancelled"}}}export{p as a,A as b,N as c,C as d,D as e,S as f,T as g,x as h};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as o,b as i}from"./chunk-
|
|
2
|
+
import{a as o,b as i}from"./chunk-IP2O264K.js";import{resolve as n}from"path";async function w(c,s,r={}){let e=i({verb:c,mode:"cli",contextRoot:n(process.cwd(),".context"),env:o(),write:r.write});try{let t=await s(e);return r.write&&t===0&&await e.lateBindContext(n(process.cwd(),".context")),t===1&&process.stderr.write(e.supportFooter()+`
|
|
3
3
|
`),await e.end({exit_code:t}),t}catch(t){throw e.error("cli_crash"),process.stderr.write(e.supportFooter()+`
|
|
4
4
|
`),await e.end({exit_code:1}),t}}export{w as a};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as G,c as P,e as J,h as q,i as z,j as Q,m as V,
|
|
2
|
+
import{b as G,c as P,e as J,h as q,i as z,j as Q,m as V,o as X,p as T}from"./chunk-GPG3FIN3.js";import{e as U}from"./chunk-EHN5HTUD.js";import{copyFileSync as ae,cpSync as le,existsSync as w,mkdirSync as ue,readFileSync as Oe,readdirSync as pe,rmSync as Te,writeFileSync as _e}from"fs";import{dirname as Ae,isAbsolute as Le,join as R,relative as Ee,resolve as Ne}from"path";import{writeFileSync as ge,mkdirSync as Se,readFileSync as Re}from"fs";import{dirname as Ie,basename as Y}from"path";function ee(e){let t=e.outPath??P(e.sourcePath);Se(Ie(t),{recursive:!0});let s=[];s.push("---"),s.push(`test: ../${Y(e.sourcePath)}`),s.push(`status: ${e.overallStatus}`),s.push(`started: ${e.startedISO}`),s.push(`duration_s: ${e.durationS}`),s.push(`session_id: ${e.sessionId}`),s.push("---",""),s.push(`# ${e.title??Y(e.sourcePath)} \u2014 Result`,"");for(let l=0;l<e.rootSteps.length;l++){let a=e.rootSteps[l],i=e.outcomes.find(p=>p.rootStepIndex===l+1);if(s.push(ye(a,i)),i?.stepMd5&&s.push(`md5: ${i.stepMd5}`),i?.status==="failed"&&i.reason&&s.push(`Reason: ${i.reason}`),i?.softFailures?.length)for(let p of i.softFailures){let o=p.reason?`: ${p.reason}`:"";s.push(`\u26A0 optional sub-step ${p.subStepIndex} failed${o}`)}a.body.kind==="objective"&&i?.status!=="skipped"&&s.push(a.body.text),s.push("")}return ge(t,s.join(`
|
|
3
3
|
`),"utf8"),t}function ye(e,t){if(!t)return`## ${e.heading} (no outcome)`;let s=t.duration_s!=null?`${t.duration_s}s`:"\u2014";if(t.status==="skipped")return`## ${e.heading} \u23ED skipped`;let l=t.softFailed?" (optional)":"";if(t.refKind&&t.status==="passed"){let a=t.helperResultRelPath?` \u2192 ${t.helperResultRelPath}`:"";return`## ${e.heading} \u2713 passed (via @${t.refKind} ${t.refLabel} \u2014 ${t.inlinedCount} inlined steps, ${s}${a})`}if(t.refKind&&t.status==="failed"){let a=t.failedSubStepIndex&&t.failedSubStepIndex.length>0?` \u2014 at sub-step ${t.failedSubStepIndex.join(" \u2192 sub-step ")}`:"",i=t.helperResultRelPath?` \u2192 ${t.helperResultRelPath}`:"";return`## ${e.heading} \u2717 failed${l} (via @${t.refKind} ${t.refLabel}${a}, ${s}${i})`}return t.status==="passed"?`## ${e.heading} \u2713 passed (${s})`:`## ${e.heading} \u2717 failed${l} (${s})`}var xe=/^##\s+(.+?)\s+(✓ passed|✗ failed(?:\s+\(optional\))?|⏭ skipped)(?:\s+\((.*)\))?\s*$/,be=/via\s+@\w+\s+(\S+).*?(?:→\s+(\S+))?\s*$/,ke=/^md5:\s+([a-f0-9]{32})\s*$/;function Z(e,t){for(let s=t;s<e.length&&!/^##\s/.test(e[s]);s++){if(e[s].trim()==="")continue;let l=ke.exec(e[s]);return l?l[1]:null}return null}function $(e){let s=Re(e,"utf8").split(`
|
|
4
4
|
`),l="passed";if(s[0]?.trim()==="---")for(let i=1;i<s.length&&s[i].trim()!=="---";i++){let p=/^status:\s+(passed|failed|interrupted)\s*$/.exec(s[i]);p&&(l=p[1])}let a=[];for(let i=0;i<s.length;i++){let p=xe.exec(s[i]);if(!p)continue;let o=p[1],r=p[2],c=p[3]??"",m=r.startsWith("\u2713")?"passed":r.startsWith("\u23ED")?"skipped":"failed";if(/via\s+@/.test(c)){let f=be.exec(c),b=f?.[1]??"",g=f?.[2]??null;a.push({kind:"import",heading:o,status:m,md5:Z(s,i+1),importPath:b,helperResultRelPath:g})}else a.push({kind:"objective",heading:o,status:m,md5:Z(s,i+1)})}return{overallStatus:l,steps:a}}import{copyFileSync as te,existsSync as K,mkdirSync as ve,writeFileSync as se,promises as Ge}from"fs";import{join as D,dirname as re,basename as Pe}from"path";async function ne(e){for(let t=0;t<e.totalRunDirs;t++){let s=e.runIndex+t,l=D(e.sessionDir,"runs",String(s)),a=D(e.stagingStepDir,"flows",String(t));ve(a,{recursive:!0});let i=D(a,"actions.ndjson");if(e.packTestDir){let r=D(e.packTestDir,"logs",`${s}-actions.ndjson`);if(K(r)){te(r,i);continue}let c=re(re(e.packTestDir)),m=Pe(e.packTestDir),I=K(c)?await U(c,`tests/${m}/logs/${s}-actions.ndjson`).catch(()=>null):null;se(i,I??"");continue}let p=[D(l,"run-test","actions.ndjson"),D(l,"actions.ndjson")],o=!1;for(let r of p)if(K(r)){te(r,i),o=!0;break}o||se(i,"")}}import{existsSync as _,readdirSync as we}from"fs";import{dirname as $e,join as M,basename as C}from"path";function et(e){let t=[],s=new Set,l=new Map;function a(r){if(l.has(r))return l.get(r);let c=P(r),m=_(c)?$(c):null;return l.set(r,m),m}let i=new Map;function p(r){if(i.has(r))return i.get(r);let c=M(r,"Result.md"),m=_(c)?$(c):null;return i.set(r,m),m}function o(r){for(let c=1;c<r.trace.length;c++){let m=r.trace[c-1],I=a(m.file);if(!I)continue;let f=I.steps[m.stepIndex-1];if(f){if(f.kind!=="import")return{kind:"author",reason:"structure-mismatch"};if(C(f.importPath)!==C(r.trace[c].file))return{kind:"author",reason:"structure-mismatch"};if(f.md5!=null&&f.md5!==m.rowMd5)return{kind:"author",reason:"structure-mismatch"}}}return null}for(let r of e.steps){let c=r.trace[r.trace.length-1].stepIndex,m=s.has(r.owningFile);for(let g=0;g<r.trace.length-1&&!m;g++)s.has(r.trace[g].file)&&(m=!0);if(m){t.push({kind:"author",reason:a(r.owningFile)===null?"no-result-md":"downstream-of-divergence"});continue}let I=o(r);if(I){t.push(I);for(let g=0;g<r.trace.length;g++)s.add(r.trace[g].file);continue}let f=a(r.owningFile),b;if(f===null&&r.trace.length>1){let g=H(r.trace);b=ie(r,p(g),c,g)}else b=ie(r,f,c);if(t.push(b),b.kind==="author"){s.add(r.owningFile);for(let g=0;g<r.trace.length-1;g++)s.add(r.trace[g].file)}}return t}function ie(e,t,s,l=null){if(!t)return{kind:"author",reason:"no-result-md"};let a=t.steps[s-1];if(!a)return{kind:"author",reason:"no-result-md"};if(a.kind!=="objective")return{kind:"author",reason:"structure-mismatch"};if(a.status!=="passed")return{kind:"author",reason:"recorded-failed"};let i=T(e);if(i!==a.md5)return{kind:"author",reason:"md5-mismatch"};let p=l===null?Q(e.owningFile,s,i.slice(0,8)):M(l,".internal","steps",`${s}-${i.slice(0,8)}`),o=De(p);return o===0?{kind:"author",reason:"missing-recording"}:{kind:"replay",recordingDir:p,flowCount:o}}function De(e){let t=M(e,"flows");if(!_(t))return 0;let s;try{s=we(t,{withFileTypes:!0}).filter(a=>a.isDirectory()&&/^\d+$/.test(a.name)).map(a=>parseInt(a.name,10))}catch{return 0}if(s.length===0)return 0;let l=Math.max(...s);for(let a=0;a<=l;a++)if(!_(M(t,String(a),"actions.ndjson")))return 0;return l+1}function tt(e){return e.some(t=>t.kind==="author")}function st(e){for(let t=0;t<e.length;t++)if(e[t].kind==="author")return t;return e.length}function H(e){let t=i=>{let p=C(i);return p.endsWith("_test.md")?p.slice(0,-8):p.endsWith(".md")?p.slice(0,-3):p},s=t(e[0].file),l=t(e[e.length-1].file),a=e.slice(0,-1).map(i=>String(i.stepIndex));return M($e(e[e.length-1].file),`helper-output-${l}-${s}-${a.join("-")}`)}function rt(e){return Array.from({length:e.flowCount},(t,s)=>M(e.recordingDir,"flows",String(s),"actions.ndjson"))}import{existsSync as oe,mkdirSync as Me,rmSync as je,cpSync as Fe}from"fs";function de(e,t){oe(e)&&(oe(t)&&je(t,{recursive:!0,force:!0}),Me(t,{recursive:!0}),Fe(e,t,{recursive:!0}))}async function gt(e){let t=new Map;for(let o of e.stepRunRecords)t.set(o.testmdStepIndex,o);let s=e.authoredFlatIdx??new Set,l=[],a=[],i=new Map,p=o=>{if(i.has(o))return i.get(o);let r=R(o,"Result.md"),c=w(r)?$(r):null;return i.set(o,c),c};for(let o of e.resolvedTest.unitFiles){let r=o.file===e.resolvedTest.rootPath,c=V(o.file,Oe(o.file,"utf8")),m=P(o.file),I=w(m)?$(m):null,f=[],b=[],g=[],j=[];if(!r)for(let d of e.resolvedTest.steps){if(d.owningFile!==o.file||d.trace.length<2)continue;let n=H(d.trace);j.includes(n)||j.push(n)}let F=d=>{if(I!==null)return null;for(let n of j){let v=p(n)?.steps[d-1];if(v)return{row:v,dir:n}}return null},W=[],A=!1,B=!1,L=!1,E=!1;for(let d of c.steps){let n=d.index,u=I?.steps[n-1];if(d.body.kind==="objective"){let h=e.resolvedTest.steps.filter(S=>S.owningFile===o.file&&S.trace[S.trace.length-1].stepIndex===n&&t.has(S.flatIndex)),y=h.length>0?h[h.length-1]:null;if(y){A=!0,s.has(y.flatIndex)&&(B=!0);let S=T(y),x;r?x=e.outcomes.find(he=>he.rootStepIndex===n)??{rootStepIndex:n,status:"skipped"}:x={rootStepIndex:n,status:ce(y,e.outcomes)},x.status==="failed"&&(L=!0),x.stepMd5==null&&(x.stepMd5=S),f.push(x),b.push({stepIndex:n,md5:S,rec:t.get(y.flatIndex)}),(!u||u.kind!=="objective"||u.status!==x.status||x.status==="passed"&&u.md5!==S)&&(E=!0)}else if(u&&u.kind==="objective")f.push({rootStepIndex:n,status:u.status,...u.md5?{stepMd5:u.md5}:{}}),g.push(n);else if(!r&&F(n)?.row.kind==="objective"){let S=F(n),x=S.row;f.push({rootStepIndex:n,status:x.status,...x.md5?{stepMd5:x.md5}:{}}),W.push({psIdx:n,dir:S.dir})}else r?f.push(e.outcomes.find(S=>S.rootStepIndex===n)??{rootStepIndex:n,status:"skipped"}):f.push({rootStepIndex:n,status:"skipped"});continue}let v=Le(d.body.path)?d.body.path:Ne(Ae(o.file),d.body.path),O=X({path:d.body.path,bindings:d.body.bindings,optional:d.optional??!1}),me=Ee(G(o.file),P(v)),N=e.resolvedTest.steps.filter(h=>h.trace.some((y,S)=>S<h.trace.length-1&&y.file===o.file&&y.stepIndex===n)&&t.has(h.flatIndex));if(N.length>0){A=!0;let h;if(r)h=e.outcomes.find(y=>y.rootStepIndex===n)??{rootStepIndex:n,status:"passed",refKind:"import",refLabel:d.body.path};else{let y=N.some(S=>ce(S,e.outcomes)==="failed");h={rootStepIndex:n,status:y?"failed":"passed",refKind:"import",refLabel:d.body.path,inlinedCount:N.length}}h.status==="failed"&&(L=!0),h.stepMd5==null&&(h.stepMd5=O),h.helperResultRelPath==null&&(h.helperResultRelPath=me),f.push(h),(!u||u.kind!=="import"||u.status!==h.status||u.md5!==O)&&(E=!0)}else if(u&&u.kind==="import")f.push({rootStepIndex:n,status:u.status,refKind:"import",refLabel:u.importPath,...u.md5?{stepMd5:u.md5}:{},...u.helperResultRelPath?{helperResultRelPath:u.helperResultRelPath}:{}});else if(!r&&F(n)?.row.kind==="import"){let h=F(n).row;f.push({rootStepIndex:n,status:h.status,refKind:"import",refLabel:d.body.path})}else r?f.push(e.outcomes.find(h=>h.rootStepIndex===n)??{rootStepIndex:n,status:"skipped",refKind:"import",refLabel:d.body.path}):f.push({rootStepIndex:n,status:"skipped",refKind:"import",refLabel:d.body.path})}if(!(r||A&&(B||L||I===null||E)))continue;l.push(o.file);let k=q(o.file);ue(R(k,".internal"),{recursive:!0});for(let d of b){let n=R(k,".internal","steps",`${d.stepIndex}-${d.md5.slice(0,8)}`);ue(n,{recursive:!0}),await ne({sessionDir:e.sessionDir,runIndex:d.rec.runIndex,totalRunDirs:d.rec.totalRunDirs,stagingStepDir:n,packTestDir:e.packTestDir})}if(g.length>0){let d=z(o.file);if(w(d))for(let n of pe(d)){let u=parseInt(n.split("-")[0]??"",10);!Number.isNaN(u)&&g.includes(u)&&le(R(d,n),R(k,".internal","steps",n),{recursive:!0})}}for(let d of W){let n=R(d.dir,".internal","steps");if(w(n))for(let u of pe(n))parseInt(u.split("-")[0]??"",10)===d.psIdx&&le(R(n,u),R(k,".internal","steps",u),{recursive:!0})}let fe=f.some(d=>d.status==="failed");if(ee({sourcePath:o.file,title:c.title,rootSteps:c.steps,outcomes:f,overallStatus:r?e.overallStatus:fe?"failed":"passed",startedISO:e.startedISO,durationS:r?e.durationS:0,sessionId:e.sessionId,outPath:R(k,"Result.md")}),r){let d={};e.commitId&&(d.commit_id=e.commitId),e.tmsIds.testId&&(d.test_id=e.tmsIds.testId),e.tmsIds.testcaseId&&(d.testcase_id=e.tmsIds.testcaseId),e.tmsIds.projectId&&(d.project_id=e.tmsIds.projectId),e.tmsIds.folderId&&(d.folder_id=e.tmsIds.folderId),e.tmsIds.orgId&&(d.org_id=e.tmsIds.orgId),e.tmsIds.sessionName&&(d.session_name=e.tmsIds.sessionName),_e(R(k,".internal","meta.json"),JSON.stringify(d,null,2)+`
|
|
5
5
|
`,"utf8");let n=R(e.sessionDir,"execution.json");if(w(n))try{ae(n,R(k,".internal","execution.json"))}catch{}if(e.codeExportDir){let u=e.codeExportLanguage??"python",v=R(k,`playwright-${u}-code`);try{de(e.codeExportDir,v)}catch(O){process.stderr.write(`warn: codegen copy failed: ${O.message}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a}from"./chunk-5Y2G4NC7.js";import{y as o}from"./chunk-
|
|
2
|
+
import{a}from"./chunk-5Y2G4NC7.js";import{y as o}from"./chunk-27U4PLPX.js";import{a as n}from"./chunk-HCBYKLMW.js";import{b as t}from"./chunk-C44QQJR4.js";import{a as s}from"./chunk-6YGTRKDT.js";import{e as r}from"./chunk-UR6MHSHU.js";var l=r(s(),1);var m=r(n(),1),i=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function b({active:e=!0}){let[p,c]=(0,l.useState)(0);return a(()=>{c(f=>(f+1)%i.length)},e?80:null),(0,m.jsx)(t,{color:o.orange,children:e?i[p]:"\u25CF"})}export{b as a};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
var o=["desktop","emulator","simulator"],r=["emulator","simulator"];function i(e,n){return e===void 0||e===""?{kind:"unset"}:o.includes(e)?{kind:e}:e==="web"?{kind:"desktop"}:e==="mobile"?r.includes(n??"")?{kind:n}:{kind:"choose-mobile"}:{kind:"unset"}}function s(e){return e==="emulator"||e==="simulator"}function u(e){if(e==="emulator")return"android";if(e==="simulator")return"ios"}function a(e){return r.includes(e)?e:void 0}var t={desktop:"Desktop",emulator:"Emulator",simulator:"Simulator"};function d(e){return t[e]}export{i as a,s as b,u as c,a as d,d as e};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{y as o}from"./chunk-
|
|
2
|
+
import{y as o}from"./chunk-27U4PLPX.js";import{a as m}from"./chunk-HCBYKLMW.js";import{a as e,b as i}from"./chunk-C44QQJR4.js";import{e as d}from"./chunk-UR6MHSHU.js";var r=d(m(),1),s={default:o.muted,error:o.red,success:o.green,info:o.orange,warning:o.orange};function h({title:t,titleColor:a,borderColor:l,variant:n="default",children:c,width:u,paddingX:x=2,paddingY:g=0,marginBottom:f=0}){let p=l??s[n],B=a??(n==="default"?o.orange:s[n]);return(0,r.jsxs)(e,{flexDirection:"column",marginBottom:f,children:[t&&(0,r.jsx)(e,{marginBottom:0,children:(0,r.jsxs)(i,{color:B,bold:!0,children:[" ",t]})}),(0,r.jsx)(e,{borderStyle:"round",borderColor:p,flexDirection:"column",paddingX:x,paddingY:g,width:u,children:c})]})}function k({label:t,value:a,labelColor:l=o.dim,valueColor:n,labelWidth:c=14}){return(0,r.jsxs)(e,{children:[(0,r.jsx)(e,{width:c,flexShrink:0,children:(0,r.jsx)(i,{color:l,children:t})}),(0,r.jsx)(e,{flexShrink:1,children:(0,r.jsx)(i,{color:n,wrap:"wrap",children:a})})]})}function I({label:t}){return(0,r.jsx)(e,{marginTop:1,marginBottom:0,children:(0,r.jsx)(i,{bold:!0,children:t})})}export{h as a,k as b,I as c};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{
|
|
2
|
+
import{c as k}from"./chunk-RFHMDQXZ.js";import{a as b}from"./chunk-766WGMBU.js";import{a as C}from"./chunk-6O3DDOP2.js";import{q as m,r as u,s as f,t as x,u as y}from"./chunk-27U4PLPX.js";import{createServer as S}from"http";import{randomBytes as A}from"crypto";import{URL as L}from"url";var P=class{profile;environment;creds;oauth;constructor(r="default",o="prod",e){this.profile=r,this.environment=o,this.creds=e??new C,this.oauth=new b(o)}async login(){let{server:r,port:o}=await this.startCallbackServer(),e=y(o);try{let t=this.creds.loadClient(this.profile,this.environment),i=t?.redirect_uris;(!t||!i?.includes(e))&&(t=await this.oauth.registerClient(e),this.creds.saveClient(this.profile,this.environment,t));let c=t.client_id,[h,d]=b.generatePkce(),a=A(32).toString("hex"),n=this.oauth.buildAuthorizationUrl(c,d,a,e),l=await this.waitForCallback(r,o,n,a);if(!l)throw new Error("Login cancelled or timed out");let p=await this.oauth.exchangeCode(l,c,h,e),g={access_token:p.access_token,refresh_token:p.refresh_token,expires_at:Math.floor(Date.now()/1e3)+p.expires_in,scope:p.scope??"*"};return this.creds.saveCredentials(this.profile,this.environment,g),this.creds.setActiveProfile(this.profile),g}catch(t){throw r.close(),t}}startCallbackServer(){return new Promise((r,o)=>{let e=u,t=()=>{let i=S();i.on("error",c=>{c.code==="EADDRINUSE"&&e<f?(e++,t()):o(new Error(`Failed to start callback server: ${c.message}. Ports ${u}-${f} are all in use.`))}),i.listen(e,m,()=>{r({server:i,port:e})})};t()})}waitForCallback(r,o,e,t){return new Promise(i=>{let c=!1,h=setTimeout(()=>d(null),12e4),d=a=>{c||(c=!0,clearTimeout(h),r.close(),i(a))};r.on("request",(a,n)=>{let l=new L(a.url??"/",`http://${m}:${o}`);if(l.pathname!==x){n.writeHead(404),n.end();return}let p=l.searchParams.get("state"),g=l.searchParams.get("code");if(l.searchParams.get("error")){n.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),n.end(v({state:"error",title:"Login failed",message:"We couldn't complete the sign-in. You can close this tab and try again from your terminal."})),d(null);return}if(p!==t){n.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),n.end(v({state:"error",title:"Invalid state",message:"The sign-in response didn't match this session. Please return to your terminal and try again."})),d(null);return}n.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),n.end(v({state:"success",title:"You're signed in",message:"Head back to your terminal \u2014 KaneAI is ready when you are.",autoClose:!0})),d(g)}),k(e).catch(a=>{let n=a instanceof Error?a.message:String(a);process.stderr.write(`[auth] Could not open browser: ${n}
|
|
3
3
|
Please open this URL manually: ${e}
|
|
4
4
|
`)})})}};function v(s){let r=s.state==="success",o=r?"#22c55e":"#ef4444",e=r?"rgba(34, 197, 94, 0.12)":"rgba(239, 68, 68, 0.12)",t=r?'<svg viewBox="0 0 24 24" width="36" height="36" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12.5l4.5 4.5L19 7"/></svg>':'<svg viewBox="0 0 24 24" width="36" height="36" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18"/></svg>',i=s.autoClose?"<script>setTimeout(function(){try{window.close();}catch(e){}}, 1500);</script>":"";return`<!doctype html>
|
|
5
5
|
<html lang="en">
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{c as N,d as G}from"./chunk-TYLYFERW.js";import{d as I,e as z}from"./chunk-4JOD47QI.js";import{a as X}from"./chunk-RZ4F3BHX.js";import{spawn as Pe}from"child_process";import{existsSync as Me}from"fs";import{homedir as _e}from"os";import{dirname as Q,join as D}from"path";import{access as ge,mkdir as W,readFile as he}from"fs/promises";import{homedir as ve}from"os";import{arch as be,platform as we}from"process";import{join as T}from"path";var ye=35,Ae="google_apis",xe="KaneCLI_Pixel_API35",Se="KaneAI_Pixel_API35";function ht(t){return t===Se?xe:t}var ke=1;function Te(t,e){return t==="darwin"&&e==="arm64"?"arm64-v8a":"x86_64"}function De(){return{home:ve(),os:we,arch:be}}async function Y(t){try{return await ge(t),!0}catch{return!1}}var j=class{deps;constructor(e={}){this.deps={...De(),...e}}paths(){let e=T(this.deps.home,".testmuai","kaneai","mobile"),r=T(e,"android-sdk");return{root:r,emulatorDir:T(r,"emulator"),systemImageDir:T(r,"system-images",`android-${ye}`,Ae,Te(this.deps.os,this.deps.arch)),avdHome:T(e,"avd"),manifest:T(r,"sdk-manifest.json")}}environment(){let e=this.paths();return{ANDROID_HOME:e.root,ANDROID_SDK_ROOT:e.root,ANDROID_AVD_HOME:e.avdHome}}async ensureSdkRootMarkers(){let e=this.paths().root;await W(T(e,"platforms"),{recursive:!0}),await W(T(e,"platform-tools"),{recursive:!0})}async status(){let e=this.paths(),r=null;try{r=JSON.parse(await he(e.manifest,"utf8"))}catch{}if(!r||r.schemaVersion!==ke)return{emulator:!1,systemImage:!1};let o=this.deps.os==="win32"?"emulator.exe":"emulator";return{emulator:!!r.components.emulator&&await Y(T(e.emulatorDir,o)),systemImage:!!r.components.systemImage&&await Y(T(e.systemImageDir,"system.img"))}}},Z;function L(){return Z??=new j,Z}var H="android",$e="http://127.0.0.1:4723/status",Ie=2e3,ee=12e4,Ne=1e3,Ee=3e5;var Oe=5,te="Run `kane-cli doctor --install` to install the managed Appium tree.",Re={device:"ready",unauthorized:"unauthorized",offline:"offline"};function Ce(t){let e={};for(let r of t){let o=r.indexOf(":");o<=0||(e[r.slice(0,o)]=r.slice(o+1))}return e}function Le(t){let e=[];for(let r of t.split(`
|
|
3
|
+
`)){let o=r.trim();if(!o||o.startsWith("*"))continue;let u=o.toLowerCase();if(u.startsWith("list of devices")||u.startsWith("adb server"))continue;let f=o.split(/\s+/),p=f[0],b=f[1];if(!p||!b||!p.startsWith("emulator-"))continue;let h=Ce(f.slice(2)),v=h.model?h.model.replace(/_/g," "):void 0;e.push({platform:H,kind:"emulator",id:p,displayName:v??p,state:Re[b]??"offline"})}return e}function ie(t){let e=[];for(let r of t.split(`
|
|
4
|
+
`)){let o=r.trim();o&&/^[A-Za-z0-9._-]+$/.test(o)&&(e.includes(o)||e.push(o))}return e}function Fe(t){for(let e of t.split(`
|
|
5
|
+
`)){let r=e.trim();if(!(!r||r==="OK"))return r}}function Be(t){let e=/^Version\s+(\S+)/m.exec(t);return e?.[1]?e[1].split("-")[0]:/Android Debug Bridge version\s+(\S+)/.exec(t)?.[1]}function Ue(t){let e=[];for(let r of t.split(`
|
|
6
|
+
`)){let o=r.trim();if(!o.startsWith("package:"))continue;let u=o.slice(8).trim();u&&!e.includes(u)&&e.push(u)}return e.sort()}function qe(t){let e=Number(t.trim());return Number.isInteger(e)&&e>0?e:void 0}function je(t){return[...new Set(t.split(",").map(e=>e.trim()).filter(Boolean))]}var He=[{match:/INSTALL_FAILED_VERIFICATION|verif(?:ier|ication)/i,hint:`Package verification blocked the install. Disable it for adb installs:
|
|
7
|
+
adb -s <device> shell settings put global verifier_verify_adb_installs 0`},{match:/INSTALL_FAILED_UPDATE_INCOMPATIBLE|INSTALL_FAILED_VERSION_DOWNGRADE|signatures do not match/i,hint:`A different build of this package is already installed. Uninstall it first:
|
|
8
|
+
adb -s <device> uninstall <package>`},{match:/INSUFFICIENT_STORAGE/i,hint:"The device is out of storage. Free space on the device and retry."}];function Ve(t){for(let{match:e,hint:r}of He)if(e.test(t))return r}function V(t,e,r=Oe){let o=t.toLowerCase(),u=e.filter(b=>b.toLowerCase().includes(o)),f=Math.max(6,Math.floor(o.length/2)),p=e.filter(b=>!u.includes(b)&&Je(b.toLowerCase(),o)>=f);return[...u,...p].slice(0,r)}function Je(t,e){let r=Math.min(t.length,e.length),o=0;for(;o<r&&t[o]===e[o];)o++;return o}function Ke(){return X($e,{signal:AbortSignal.timeout(Ie)}).then(t=>t.ok,()=>!1)}function Xe(t,e,r){Pe(t,e,{stdio:"ignore",detached:!0,...r?{env:{...process.env,...r}}:{}}).unref()}function ze(){return{exec:I,spawnDetached:Xe,fileExists:Me,env:process.env,home:_e(),os:process.platform,probeAppiumServer:Ke,now:()=>Date.now(),sleep:z,mobileDeps:{status:t=>N().status(t),environment:t=>N().environment(t)},sdkSuite:{status:()=>L().status(),environment:()=>L().environment(),emulatorPath:()=>{let t=L().paths().emulatorDir;return D(t,process.platform==="win32"?"emulator.exe":"emulator")},ensureSdkRootMarkers:()=>L().ensureSdkRootMarkers()}}}function ne(t={}){let e={...ze(),...t},r={},o=new Set;function u(i){return e.os==="win32"?`${i}.exe`:i}function f(){return e.os==="win32"?"appium.cmd":"appium"}function p(){let i=[];for(let n of["ANDROID_HOME","ANDROID_SDK_ROOT"]){let s=e.env[n];s&&s.trim()!==""&&i.push(s.trim())}return e.os==="darwin"?i.push(D(e.home,"Library","Android","sdk")):e.os==="win32"?i.push(D(e.home,"AppData","Local","Android","Sdk")):i.push(D(e.home,"Android","Sdk")),i}function b(i){let n=i==="adb"?"platform-tools":"emulator";return p().map(s=>D(s,n,u(i)))}async function h(i){let n=e.os==="win32"?"where":"which",s=await e.exec(n,[u(i)],{timeoutMs:5e3});if(s.code!==0)return null;let a=s.stdout.split(`
|
|
9
|
+
`)[0]?.trim();return a&&a!==""?a:null}async function v(i){if(i==="adb"){let s=G(e.env);if(s){let m=D(s.platformToolsDir,u("adb"));if(e.fileExists(m)){let c={path:m,source:"sdk"};return r[i]=c,c}return delete r[i],null}if((await e.mobileDeps.status("emulator")).installed){let m=await e.mobileDeps.environment("emulator");if(m.platformToolsDir){let c={path:D(m.platformToolsDir,u("adb")),source:"local"};return r[i]=c,c}}return delete r[i],null}if(i==="emulator"&&(await e.sdkSuite.status()).emulator){let a={path:e.sdkSuite.emulatorPath(),source:"local"};return r[i]=a,a}let n=await h(i);if(n){let s={path:n,source:"sdk"};return r[i]=s,s}for(let s of b(i))if(e.fileExists(s)){let a={path:s,source:"sdk"};return r[i]=a,a}return delete r[i],null}async function $(){let i=await v("adb");if(!i)throw new Error("Managed adb is not installed.\nRun `kane-cli doctor --install` to install the pinned Android platform-tools.");return i.path}async function O(i){let n=await e.exec(i,["devices","-l"],{timeoutMs:2e4});return Le(n.stdout)}async function d(i,n){let s=await e.exec(i,["-s",n,"shell","getprop","ro.boot.qemu.avd_name"],{timeoutMs:1e4});if(s.code===0){let m=s.stdout.split(`
|
|
10
|
+
`)[0]?.trim();if(m)return m}let a=await e.exec(i,["-s",n,"emu","avd","name"],{timeoutMs:1e4});if(a.code===0)return Fe(a.stdout)}async function l(i){let n=await v("emulator");if(!n)return[];let s=await e.exec(n.path,["-list-avds"],{timeoutMs:2e4}),a=s.code===0?ie(s.stdout):[];if(o.clear(),(await e.sdkSuite.status()).emulator){let c=await e.exec(n.path,["-list-avds"],{timeoutMs:2e4,env:{...e.env,...e.sdkSuite.environment()}});if(c.code===0)for(let A of ie(c.stdout))o.add(A),a.includes(A)||a.push(A)}return a.filter(c=>!i.has(c)).map(c=>({platform:H,kind:"emulator",id:c,displayName:c,state:"stopped",virtualName:c}))}async function g(){let i=await v("adb");if(!i)return[];let n=await O(i.path),s=new Set;for(let m of n){if(m.kind!=="emulator"||m.state!=="ready")continue;let c=await d(i.path,m.id);c&&(m.virtualName=c,m.displayName=c,s.add(c))}let a=await l(s);return[...n,...a]}function w(i,n){return[`${i} did not finish booting within ${ee/1e3}s.`,n?`It attached as ${n} but never reported sys.boot_completed=1.`:"It never attached to adb.","The emulator process is still running \u2014 check its window for errors.","Common causes: no hardware acceleration (install the Android Emulator","hypervisor driver / enable KVM), or a corrupt AVD (recreate it in","Android Studio's Device Manager)."].join(`
|
|
11
|
+
`)}async function S(i,n,s){let a=await v("emulator");if(!a)throw new Error("The Android `emulator` binary was not found, so AVDs cannot be booted.\nInstall it via Android Studio's SDK Manager (Android Emulator) and set ANDROID_HOME.");let m=new Set((await O(i)).map(F=>F.id)),c=o.has(n);c&&await e.sdkSuite.ensureSdkRootMarkers();let A=c?{...e.env,...e.sdkSuite.environment()}:void 0;e.spawnDetached(a.path,["-avd",n],A),s?.(`booting ${n}\u2026`);let M=e.now()+ee,x;for(;e.now()<M;){if(await e.sleep(Ne),!x){let _=(await O(i)).find(C=>C.kind==="emulator"&&!m.has(C.id));_&&(x=_.id,s?.(`${n} attached as ${x}, waiting for boot\u2026`));continue}if((await e.exec(i,["-s",x,"shell","getprop","sys.boot_completed"],{timeoutMs:1e4})).stdout.trim()==="1")return x}throw new Error(w(n,x))}async function y(i,n){let s=await $();if(i.state==="ready")return P(i,s);if(i.state==="unauthorized")throw new Error(`${i.displayName} (${i.id}) is UNAUTHORIZED. Accept the USB-debugging prompt on the device, then retry.`);if(i.state==="offline")throw new Error(`${i.displayName} (${i.id}) is offline. Reconnect it (USB) or re-run \`adb connect ${i.id}\` (wireless), then retry.`);let a=i.virtualName??i.id,m=await S(s,a,n);return P({...i,kind:"emulator",id:m,displayName:a,state:"ready",virtualName:a},s)}async function P(i,n){let[s,a,m]=await Promise.all([e.exec(n,["-s",i.id,"shell","getprop","ro.build.version.sdk"],{timeoutMs:1e4}),e.exec(n,["-s",i.id,"shell","getprop","ro.product.cpu.abilist"],{timeoutMs:1e4}),e.exec(n,["-s",i.id,"shell","getprop","ro.product.cpu.abi"],{timeoutMs:1e4})]),c=s.code===0?qe(s.stdout):void 0,A=je(a.code===0&&a.stdout.trim()!==""?a.stdout:m.stdout);return{...i,...c!==void 0?{androidApiLevel:c}:{},...A.length>0?{androidAbis:A}:{}}}async function k(i){let n=await $(),s=await e.exec(n,["-s",i.id,"shell","pm","list","packages","-3"],{timeoutMs:3e4});if(s.code!==0)throw new Error(`Could not list installed packages on ${i.id}: ${s.stderr.trim()||`adb exited ${s.code}`}`);return Ue(s.stdout)}async function R(i){let n;try{let{default:s}=await import("./adbkit-apkreader-ORZBGCJQ.js");n=(await(await s.open(i)).readManifest())?.package}catch(s){let a=s instanceof Error?s.message:String(s);throw new Error(`Could not read the package name from ${i} (${a}).
|
|
12
|
+
Pass the package name explicitly with --app <package>.`)}if(typeof n!="string"||n.trim()==="")throw new Error(`${i} has no package name in its manifest.
|
|
13
|
+
Pass the package name explicitly with --app <package>.`);return n.trim()}async function U(i,n,s){let a=await $();s?.(`installing ${n} on ${i.id}\u2026`);let m=await e.exec(a,["-s",i.id,"install","-r",n],{timeoutMs:Ee}),c=`${m.stdout}
|
|
14
|
+
${m.stderr}`;if(m.code===0&&!/\bFailure\b/i.test(c))return;let A=Ve(c),M=[`Installing ${n} on ${i.id} failed (adb exited ${m.code}).`,c.trim()];throw A&&M.push("",A),new Error(M.filter(x=>x!=="").join(`
|
|
15
|
+
`))}async function ue(i,n,s){if(n.kind==="package"){let a=await k(i);if(a.includes(n.value))return n.value;let m=V(n.value,a),c=[`${n.value} is not installed on ${i.displayName} (${i.id}).`];throw m.length>0?c.push("Close matches:",...m.map(A=>` ${A}`)):c.push("Pass a local .apk path to --app to install it instead."),new Error(c.join(`
|
|
16
|
+
`))}if(n.kind!=="apk"){let a=n.kind==="aab"?"Android app bundles are not directly installable; build an APK first.":n.kind==="apks"?"Split bundles are not supported yet.":`${n.kind} artifacts are not installable on Android.`;throw new Error(a)}return await U(i,n.value,s),R(n.value)}async function ce(){let i=await e.mobileDeps.status("emulator");return i.installed?{status:i,env:await e.mobileDeps.environment("emulator")}:null}async function me(i={}){let n=[],s=await ce(),a=await e.mobileDeps.status("emulator"),m=await v("adb");if(m){let _=await e.exec(m.path,["version"],{timeoutMs:1e4}),C=Be(_.stdout);n.push({id:"android.adb",fixedByBundle:!0,label:"adb",required:!0,status:"pass",detail:C?`platform-tools ${C} \xB7 ${m.path}`:m.path})}else n.push({id:"android.adb",fixedByBundle:!0,label:"adb",required:!0,status:"fail",detail:a.corrupt??"managed mobile dependencies are not installed",fixText:"Run `kane-cli doctor --install` to download the managed mobile deps bundle under ~/.testmuai/kaneai/mobile."});let c=!i.appiumUrl;s?.env.appiumHome?n.push({id:"android.appium",fixedByBundle:!0,label:"Appium",required:c,status:"pass",detail:D(Q(s.env.appiumHome),"appium","node_modules",".bin",f())}):n.push({id:"android.appium",fixedByBundle:!0,label:"Appium",required:c,status:c?"fail":"info",detail:i.appiumUrl?`managed Appium not required because --appium-url is set (${i.appiumUrl})`:a.corrupt??"managed Appium is not installed",...c?{fixText:te}:{}}),n.push({id:"android.uiautomator2",fixedByBundle:!0,label:"uiautomator2 driver",required:c,status:s?"pass":c?"fail":"info",detail:s?"bundled in the managed mobile deps":i.appiumUrl?"managed driver not required because --appium-url is set":"not installed in the managed deps tree",...s||!c?{}:{fixText:te}});let A=D(e.home,".testmuai","kaneai","mobile","trees");e.fileExists(A)&&n.push({id:"android.legacy-trees",label:"legacy toolchain trees",required:!1,status:"info",detail:`${A} predates the deps bundle \u2014 removed automatically by the next bundle install`});let M=await h("adb");M&&n.push({id:"android.system-adb",label:"system adb",required:!1,status:"info",detail:`${M} (ignored; managed adb always wins and may restart its server)`});let x=await h("appium");x&&n.push({id:"android.system-appium",label:"system Appium",required:!1,status:"info",detail:`${x} (ignored; managed Appium always wins)`});let F=await e.sdkSuite.status(),q=await v("emulator");if(F.emulator?n.push({id:"android.emulator",label:"emulator",required:!1,status:"pass",detail:`managed emulator \xB7 ${e.sdkSuite.emulatorPath()}`}):q?n.push({id:"android.emulator",label:"emulator",required:!1,status:"info",detail:`${q.path} (system install)`}):n.push({id:"android.emulator",label:"emulator",required:!1,status:"info",detail:"not installed, so stopped AVDs are not listed. Install it with the Android SDK (Android Studio \u2192 SDK Manager \u2192 Android Emulator)."}),e.os==="darwin"){let _=await e.exec("sysctl",["-n","kern.hv_support"],{timeoutMs:5e3});n.push({id:"android.virtualization",label:"virtualization",required:!1,status:"info",detail:_.code===0&&_.stdout.trim()==="1"?"Hypervisor.framework available":"Hypervisor.framework not reported \u2014 emulator boots may hang"})}else e.os==="linux"?n.push({id:"android.virtualization",label:"virtualization",required:!1,status:"info",detail:e.fileExists("/dev/kvm")?"/dev/kvm present":"/dev/kvm missing \u2014 enable KVM or emulator boots will hang"}):n.push({id:"android.virtualization",label:"virtualization",required:!1,status:"info",detail:"not checked on this host"});return n}async function pe(i){let n=await e.mobileDeps.environment("emulator"),s=[...n.dirs],a=r.emulator,m=a?.source==="sdk"?Q(a.path):void 0;return m&&!s.includes(m)&&s.push(m),{...n,dirs:s}}async function fe(i,n){let s=await $(),a=[];return n.appPackage&&a.push({label:`closing ${n.appPackage}`,file:s,args:["-s",i.id,"shell","am","force-stop",n.appPackage]}),n.shutdown&&a.push({label:`shutting down ${i.displayName}`,file:s,args:["-s",i.id,"emu","kill"]}),a}return{platform:H,available:()=>!0,checks:me,discover:g,prepare:y,listApps:k,ensureApp:ue,teardownPlan:fe,toolEnv:pe}}import{mkdtemp as re,readdir as Ge,rm as se,writeFile as We}from"fs/promises";import{tmpdir as oe}from"os";import{join as E}from"path";var ae="ios",Ye=12e4,Ze=3e5,Qe="an .ipa cannot be installed on a simulator \u2014 use a .zip of the .app build";function et(t){let e=/\.iOS-(\d+)-(\d+)$/.exec(t);return e?`${e[1]}.${e[2]}`:void 0}function tt(t){let e;try{e=JSON.parse(t)}catch{return[]}let r=[];for(let[o,u]of Object.entries(e.devices??{})){let f=et(o);for(let p of u??[]){let b=typeof p.udid=="string"?p.udid:void 0,h=typeof p.name=="string"?p.name:void 0;if(!b||!h)continue;let v=p.state==="Booted"?"ready":p.state==="Shutdown"?"stopped":"offline";r.push({platform:ae,kind:"simulator",id:b,displayName:f?`${h} (iOS ${f})`:h,state:v,virtualName:h,...f?{iosVersion:f}:{}})}}return r}function it(t){let e;try{e=JSON.parse(t)}catch{return[]}let r=[];for(let[o,u]of Object.entries(e)){if(u?.ApplicationType!=="User")continue;let f=u.CFBundleIdentifier??o;r.includes(f)||r.push(f)}return r.sort()}function nt(t){let e;try{e=JSON.parse(t)}catch{return[]}let r=[];for(let[o,u]of Object.entries(e)){let f=u?.CFBundleIdentifier??o;f&&!r.includes(f)&&r.push(f)}return r.sort()}var J=16;function rt(t){return/^Xcode (\d+(?:\.\d+)*)/m.exec(t)?.[1]}async function st(t){let e=await re(E(oe(),"kane-app-unzip-")),r=()=>se(e,{recursive:!0,force:!0}),o=await I("unzip",["-q",t,"-d",e],{timeoutMs:10*6e4});if(o.code!==0)throw await r(),new Error(`Could not unpack ${t}: ${o.stderr.trim()||`unzip exited ${o.code}`}`);for(let u of[e,E(e,"Payload")]){let f;try{f=await Ge(u)}catch{continue}let p=f.find(b=>b.toLowerCase().endsWith(".app"));if(p)return{appPath:E(u,p),cleanup:r}}throw await r(),new Error(`${t} does not contain a .app bundle.`)}async function ot(t){let e=await re(E(oe(),"kane-plist-"));try{let r=E(e,"input.plist");await We(r,t);let o=await I("plutil",["-convert","json","-o","-",r],{timeoutMs:15e3});if(o.code!==0)throw new Error(`plutil could not convert simctl output: ${o.stderr.trim()}`);return o.stdout}finally{await se(e,{recursive:!0,force:!0})}}function at(){return{exec:I,os:process.platform,convertPlistToJson:ot,mobileDeps:{status:()=>N().status("simulator"),environment:()=>N().environment("simulator")}}}function de(t={}){let e={...at(),...t};async function r(d,l=3e4){return e.exec("xcrun",["simctl",...d],{timeoutMs:l})}async function o(){let d=await r(["list","devices","available","--json"]);return d.code!==0?[]:tt(d.stdout)}async function u(){return o()}async function f(d,l){let g=await e.exec("open",["-a","Simulator","--args","-CurrentDeviceUDID",d],{timeoutMs:15e3});g.code!==0&&l?.(`could not open Simulator.app (${g.stderr.trim()||`exit ${g.code}`}); the device is booted and the run continues headless`)}async function p(d,l){if(d.state!=="ready"&&d.state!=="stopped")throw new Error(`${d.displayName} (${d.id}) is ${d.state}; open Simulator.app to inspect it, then retry.`);d.kind==="simulator"&&await f(d.id,l),d.state==="stopped"&&l?.(`booting ${d.displayName}\u2026`);let g=await r(["bootstatus",d.id,"-b"],Ye);if(g.code!==0)throw new Error(`Could not boot ${d.displayName}: ${g.stderr.trim()||g.stdout.trim()||`simctl bootstatus exited ${g.code}`}`);let w=(await o()).find(S=>S.id===d.id);if(w?.state==="ready")return w;throw new Error(`${d.displayName} finished booting but simctl still reports it as ${w?.state??"missing"}.`)}async function b(d){let l=await r(["listapps",d.id]);if(l.code!==0)throw new Error(`Could not list apps on ${d.displayName}: ${l.stderr.trim()||`simctl exited ${l.code}`}`);return it(await e.convertPlistToJson(l.stdout))}async function h(d){let l=E(d,"Info.plist"),g=await e.exec("plutil",["-convert","json","-o","-",l],{timeoutMs:15e3});if(g.code!==0)throw new Error(`${d} Info.plist could not be read: ${g.stderr.trim()||`plutil exited ${g.code}`}`);let w;try{w=JSON.parse(g.stdout)}catch{throw new Error(`${d} Info.plist did not contain valid JSON from plutil.`)}if(!w.CFBundleIdentifier)throw new Error(`${d} has no CFBundleIdentifier in its Info.plist.`);return w.CFBundleIdentifier}async function v(d,l,g){if(l.kind==="package"){let y=await r(["listapps",d.id]);if(y.code!==0)throw new Error(`Could not list apps on ${d.displayName}: ${y.stderr.trim()||`simctl exited ${y.code}`}`);let P=nt(await e.convertPlistToJson(y.stdout));if(P.includes(l.value))return l.value;let k=V(l.value,P),R=[`${l.value} is not installed on ${d.displayName} (${d.id}).`];throw k.length>0?R.push("Close matches:",...k.map(U=>` ${U}`)):R.push("Pass a .zip of the .app bundle to install it instead."),new Error(R.join(`
|
|
17
|
+
`))}if(l.kind==="ipa")throw new Error(`${Qe}.`);if(l.kind!=="app"&&l.kind!=="zip")throw new Error(`${l.kind} artifacts are Android-only and not installable on iOS.`);let w=l.value,S;if(l.kind==="zip"){g?.(`unpacking ${l.value}\u2026`);let y=await st(l.value);w=y.appPath,S=y.cleanup}g?.(`installing ${w} on ${d.displayName}\u2026`);try{let y=await r(["install",d.id,w],Ze);if(y.code!==0)throw new Error(`Installing ${l.value} on ${d.displayName} failed: ${y.stderr.trim()||y.stdout.trim()}`);return await h(w)}finally{await S?.()}}async function $(d={}){let l=[],g=await e.exec("xcode-select",["-p"],{timeoutMs:1e4});if(g.code===0&&g.stdout.trim()!==""){let P=await e.exec("xcodebuild",["-version"],{timeoutMs:3e4}),k=P.code===0?rt(P.stdout):void 0;k?Number(k.split(".")[0])<J?l.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:`Xcode ${k} is older than the required Xcode ${J}`,fixText:`Update Xcode to ${J} or newer from the App Store.`}):l.push({id:"ios.xcode",label:"Xcode",required:!0,status:"pass",detail:`Xcode ${k} \xB7 ${g.stdout.trim()}`}):l.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:`${g.stdout.trim()} has no usable xcodebuild (Command Line Tools only?)`,fixText:"Install full Xcode from the App Store, then run `sudo xcode-select -s /Applications/Xcode.app/Contents/Developer`."})}else l.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:"xcode-select reports no developer directory",fixText:"Install Xcode from the App Store, then run `xcode-select --install`."});let w=await e.exec("xcrun",["simctl","help"],{timeoutMs:15e3});l.push(w.code===0?{id:"ios.xcrun",label:"xcrun",required:!0,status:"pass",detail:"simctl reachable"}:{id:"ios.xcrun",label:"xcrun",required:!0,status:"fail",detail:`xcrun cannot run simctl: ${w.stderr.trim()||w.stdout.trim()||`exit ${w.code}`}`,fixText:"Run `xcode-select --install`, then confirm with `xcrun simctl list devices`. If Xcode is installed, `sudo xcode-select -s /Applications/Xcode.app/Contents/Developer` repoints it."});let S=!d.appiumUrl,y=await e.mobileDeps.status();return l.push({id:"ios.xcuitest",fixedByBundle:!0,label:"xcuitest driver",required:S,status:y.installed?"pass":S?"fail":"info",detail:y.installed?"bundled in the managed mobile deps (with prebuilt WDA)":d.appiumUrl?"managed driver not required because --appium-url is set":y.corrupt??"the simulator deps bundle is not installed",...y.installed||!S?{}:{fixText:"Run `kane-cli doctor --install` to download the simulator deps bundle."}}),l}async function O(d,l){let g=[];return l.appPackage&&g.push({label:`closing ${l.appPackage}`,file:"xcrun",args:["simctl","terminate",d.id,l.appPackage]}),l.shutdown&&g.push({label:`shutting down ${d.displayName}`,file:"xcrun",args:["simctl","shutdown",d.id]}),g}return{platform:ae,available:()=>e.os==="darwin",checks:$,discover:u,prepare:p,listApps:b,ensureApp:v,teardownPlan:O,toolEnv:()=>e.mobileDeps.environment()}}var le=[ne(),de()];function B(){return le.filter(t=>t.available())}function Ft(){return B().map(t=>t.platform)}function Bt(){return le.map(t=>t.platform)}function dt(t){let e=t.toLowerCase();return B().find(r=>r.platform.toLowerCase()===e)}async function lt(t){let e=t?B().filter(o=>o.platform.toLowerCase()===t.toLowerCase()):B(),r=[];for(let o of e)try{r.push(...await o.discover())}catch{}return r}function ut(t,e){let r=e.toLowerCase();return t.id.toLowerCase()===r||t.virtualName?.toLowerCase()===r}function ct(t){let e=t.virtualName&&t.virtualName!==t.id?`${t.displayName} (${t.virtualName})`:t.displayName;return`${t.id} \u2014 ${e} [${t.platform} \xB7 ${t.kind} \xB7 ${t.state}]`}function K(t){return t.length===0?"":`
|
|
18
|
+
${t.map(e=>` ${ct(e)}`).join(`
|
|
19
|
+
`)}`}async function Ut(t,e={}){let r=e.discover??lt,o=e.providerFor??dt,u=await r(t.platform),f=h=>{let v=o(h.platform);return v?{ok:!0,target:h,provider:v}:{ok:!1,reason:"not-found",candidates:u,message:`No provider is registered for platform '${h.platform}'.`}};if(t.device){let h=u.filter(v=>ut(v,t.device));return h.length===0?{ok:!1,reason:"not-found",candidates:u,message:`No target matches --device '${t.device}'.`+(u.length>0?` Available:${K(u)}`:" No targets were found \u2014 run `kane-cli doctor`.")}:f(h.find(v=>v.state==="ready")??h[0])}let p=t.defaultTarget;if(p&&(!t.platform||t.platform.toLowerCase()===p.platform.toLowerCase())){let h=u.find(v=>v.platform===p.platform&&v.kind===p.kind&&(v.id===p.id||v.virtualName===p.id));return h?f(h):{ok:!1,reason:t.interactive?"needs-picker":"not-found",candidates:u,message:`The saved default target '${p.id}' (${p.platform} \xB7 ${p.kind}) is not connected. `+(t.interactive?"Pick a target to bind this run.":"Pass --device <id> explicitly \u2014 kane-cli never binds a different device on its own.")+(u.length>0?` Available:${K(u)}`:"")}}if(u.length===0)return{ok:!1,reason:"none-found",candidates:[],message:"No emulator or simulator found. Start an Android emulator or boot an iOS simulator, then run `kane-cli doctor`."};let b=u.filter(h=>h.state==="ready");return b.length===1?f(b[0]):t.interactive?{ok:!1,reason:"needs-picker",candidates:u,message:b.length===0?"No target is ready \u2014 pick one to prepare it.":"More than one target is ready \u2014 pick one."}:{ok:!1,reason:"ambiguous",candidates:u,message:(b.length===0?"No target is ready.":`${b.length} targets are ready.`)+` Pass --device <id>:${K(u)}`}}export{ht as a,Ft as b,Bt as c,dt as d,lt as e,Ut as f};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{b as V,c as H,d as W,e as re,f as ie}from"./chunk-3PECJD6S.js";import{a as se}from"./chunk-IOFZSQAA.js";import{c as ee}from"./chunk-HMYMSRA4.js";import{a as te}from"./chunk-T5Y6MOLM.js";import{a as oe}from"./chunk-OTTGS2TE.js";import{b as Y}from"./chunk-QRZRSAZH.js";import{b as Z}from"./chunk-UXDL4XDL.js";import{a as L}from"./chunk-2WVKOZ6W.js";import{a as D,b as A,d as ne}from"./chunk-VE3SUJMA.js";import{b as J}from"./chunk-TZXXJWHA.js";import{p as j}from"./chunk-56PAQAX5.js";import{b as Q}from"./chunk-AW2XUHH4.js";import{a as T}from"./chunk-G7VQCS4J.js";import{a as B,e as K}from"./chunk-EYOCNMUM.js";import{a as z}from"./chunk-6O3DDOP2.js";import{a as q}from"./chunk-HCBYKLMW.js";import{a as c,b as u,i as I,j as G}from"./chunk-C44QQJR4.js";import{a as me}from"./chunk-6YGTRKDT.js";import{e as F}from"./chunk-UR6MHSHU.js";var s=F(me(),1);import{basename as ve}from"path";var o=F(q(),1);function Ne({resultRef:x,mode:g="singleshot",loginCompleteRef:d}){let{exit:m}=G(),C=(0,s.useRef)(new z),E=(0,s.useRef)(new te),v=(0,s.useRef)(new ee),n=C.current,l=E.current,O=v.current,le=V(),[h,f]=(0,s.useState)(g==="login"?"login":"gate"),[M,ae]=(0,s.useState)(null),[xe,R]=(0,s.useState)(null),[Pe,$]=(0,s.useState)(null),[X,ce]=(0,s.useState)(null),[N,_]=(0,s.useState)([]),P=(0,s.useCallback)((e,t,i,r)=>O.log(e,t,i,r),[O]),we=(0,s.useCallback)((e,t)=>{e?D(n,l,e,t):l.save({project_id:null,project_name:null,folder_id:null,folder_name:null})},[n,l]),b=(0,s.useCallback)(()=>{if(g==="login")d&&(d.current=!0),m();else{let e=l.load().mobile,t=B(e?.tui_target,e?.default_target?.kind),i=(t.kind==="unset"||t.kind==="choose-mobile")&&J();f(i?"target":"input")}},[g,m,d,l]),S=(0,s.useCallback)((e,t)=>{let i=D(n,l,e,t);if(g==="login"){f("ensure-project");return}ne(i)?b():i.projectId?f("ensure-folder"):f("ensure-project")},[n,l,b,g]);I((e,t)=>{t.ctrl&&e==="c"&&j(0,"Ctrl+C exit")});let U=(0,s.useRef)(!1);s.default.useEffect(()=>{U.current||(U.current=!0,g!=="login"&&ie(n,P).then(e=>{ae(e),e.status==="authenticated"?S(e.result.profile,e.result.env):e.status==="needs_pick"?f("pick"):(R(e.profile??null),$(e.env??null),f("login"))}).catch(e=>{ce(`Auth check failed: ${e instanceof Error?e.message:String(e)}`)}))},[n,P]);let ue=(0,s.useCallback)(e=>{x.current={objective:e},m()},[x,m]),fe=(0,s.useCallback)(async(e,t)=>{n.setActiveProfile(e),n.setDefaultEnv(t),(await re(n,e,t,P)).status==="authenticated"?S(e,t):(R(e),$(t),f("login"))},[n,P,S]),w=(0,s.useCallback)(()=>{let e=n.getActiveProfile(),t=n.getDefaultEnv();if(!e)return null;let i=T(t),r=n.loadBasicAuth(e,t);return new oe(i.controllerBaseUrl,async()=>n.loadCredentials(e,t)?.access_token??null,r,P)},[n,P]),de=(0,s.useCallback)(async()=>{let e=w();if(!e)return null;let t=e.cached??await e.resolve();if(!t)return null;let i=T(n.getDefaultEnv()),r=new L(i.tmsBaseUrl,t.username,t.access_key);try{let p=(await r.listProjects()).find(k=>k.name==="KaneAI Generated");if(p)return{id:p.project_id,name:p.name};let y=await r.createProject("KaneAI Generated");return{id:y.id,name:y.name}}catch{return null}},[w,n]),ge=(0,s.useCallback)(async e=>{let t=w();if(!t)return null;let i=t.cached??await t.resolve();if(!i)return null;let r=T(n.getDefaultEnv()),a=new L(r.tmsBaseUrl,i.username,i.access_key);try{let y=(await a.listFolders(e)).find(pe=>pe.name==="Untitled");if(y)return{id:y.id,name:y.name};let k=await a.createFolder(e,"Untitled");return{id:k.id,name:k.name}}catch{return null}},[w,n]);if(h==="gate")return(0,o.jsx)(c,{paddingX:1,children:(0,o.jsx)(u,{color:"yellow",children:"Checking authentication..."})});if(X)return(0,o.jsxs)(c,{flexDirection:"column",paddingX:1,children:[(0,o.jsx)(u,{color:"red",children:X}),(0,o.jsx)(u,{color:"gray",children:"Press Ctrl+C to exit."})]});if(h==="pick"&&M?.status==="needs_pick")return(0,o.jsx)(he,{profiles:M.profiles,onSelect:fe});if(h==="login")return(0,o.jsx)(W,{devMode:process.env.KANE_DEV_MODE==="1",profiles:n.listProfiles(),onBasicLogin:async(e,t,i,r)=>{let{validateBasicAuth:a}=await import("./validate-basic-2GVSQ2R5.js");await a(t,i,r),n.saveBasicAuth(e,t,{username:i,access_key:r}),n.setActiveProfile(e),n.setDefaultEnv(t)},onOAuthLogin:async(e,t)=>{let{LoginFlow:i}=await import("./login-flow-QJQM3RHT.js");n.setDefaultEnv(t),n.setActiveProfile(e),await new i(e,t,n).login()},onComplete:(e,t)=>{R(e),$(t),n.setActiveProfile(e),n.setDefaultEnv(t),S(e,t)},onCancel:()=>{j(0,"Login cancelled")}});if(h==="ensure-project"){let e=n.getActiveProfile()??"default",t=n.getDefaultEnv(),i=()=>{if(g==="login"){f("ensure-folder");return}D(n,l,e,t).folderId?b():f("ensure-folder")};return(0,o.jsxs)(c,{flexDirection:"column",children:[(0,o.jsx)(c,{paddingX:1,marginBottom:1,children:(0,o.jsx)(u,{color:"yellow",children:"Project & folder are required to save tests \xB7 Esc to use defaults \xB7 Ctrl+C to exit"})}),(0,o.jsx)(Y,{resolver:w(),currentProjectId:l.load().project_id,env:t,onSelect:(r,a)=>{A(n,l,e,t,{projectId:r,projectName:a}),_(p=>[...p,`\u2713 Project: ${a} (${r})`]),i()},onCancel:async()=>{let r=await de();r&&(A(n,l,e,t,{projectId:r.id,projectName:r.name}),_(a=>[...a,`\u2713 Default project: ${r.name} (${r.id})`]),i())}})]})}if(h==="ensure-folder"){let e=n.getActiveProfile()??"default",t=n.getDefaultEnv(),i=n.loadProfileConfig(e,t);return(0,o.jsxs)(c,{flexDirection:"column",children:[(0,o.jsx)(c,{paddingX:1,marginBottom:1,children:(0,o.jsx)(u,{color:"yellow",children:"Project & folder are required to save tests \xB7 Esc to use defaults \xB7 Ctrl+C to exit"})}),(0,o.jsx)(Z,{resolver:w(),projectId:i?.project_id??"",currentFolderId:l.load().folder_id,env:t,onSelect:(r,a)=>{A(n,l,e,t,{folderId:r,folderName:a}),_(p=>[...p,`\u2713 Folder: ${a} (${r})`]),b()},onCancel:async()=>{if(!i?.project_id)return;let r=await ge(i.project_id);r&&(A(n,l,e,t,{folderId:r.id,folderName:r.name}),_(a=>[...a,`\u2713 Default folder: ${r.name} (${r.id})`]),b())}})]})}if(h==="target"){let e=B(l.load().mobile?.tui_target,l.load().mobile?.default_target?.kind).kind==="choose-mobile";return(0,o.jsx)(c,{paddingX:1,children:(0,o.jsx)(se,{mode:e?"mobile-only":"all",onSelect:t=>{l.setMobile({tui_target:t}),f("input")},onCancel:()=>f("input")})})}if(h==="input"){let e=l.load().mobile,t=B(e?.tui_target,e?.default_target?.kind),i=(()=>{if(t.kind==="emulator"||t.kind==="simulator"){let r=e?.default_target?.id??"(no device)",a=e?.default_app?Q(e.default_app)?e.default_app:ve(e.default_app):"(no app)";return`Target: ${K(t.kind)} \xB7 ${r} \xB7 ${a}`}return"Target: Desktop \xB7 Chrome"})();return(0,o.jsxs)(c,{flexDirection:"column",children:[N.length>0&&(0,o.jsx)(c,{flexDirection:"column",paddingX:1,marginBottom:1,children:N.map((r,a)=>(0,o.jsx)(u,{color:"green",children:r},a))}),(0,o.jsx)(c,{paddingX:1,children:(0,o.jsx)(u,{color:"gray",children:i})}),(0,o.jsx)(H,{onSubmit:ue,onEscape:()=>j(0,"User pressed Escape"),history:le,placeholder:"Type an objective..."})]})}return(0,o.jsx)(o.Fragment,{})}function he({profiles:x,onSelect:g}){let[d,m]=(0,s.useState)(0),[C,E]=(0,s.useState)(!1);return I((v,n)=>{if(!C){if(n.escape){j(0,"Profile picker cancelled");return}if(n.upArrow&&d>0&&m(l=>l-1),n.downArrow&&d<x.length-1&&m(l=>l+1),n.return){E(!0);let l=x[d];g(l.profile,l.env).catch(()=>E(!1))}}}),(0,o.jsxs)(c,{flexDirection:"column",paddingX:1,children:[(0,o.jsx)(u,{color:"#ff9500",bold:!0,children:"Select a profile:"}),(0,o.jsx)(c,{marginTop:1,flexDirection:"column",children:x.map((v,n)=>(0,o.jsxs)(u,{children:[n===d?"\u276F ":" ",(0,o.jsx)(u,{color:n===d?"#ff9500":"white",bold:n===d,children:v.profile}),(0,o.jsxs)(u,{color:"gray",children:[" [",v.env,"]"]})]},`${v.profile}-${v.env}`))}),C&&(0,o.jsx)(c,{marginTop:1,children:(0,o.jsx)(u,{color:"yellow",children:"Validating credentials..."})})]})}export{Ne as a};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{x as s}from"./chunk-
|
|
2
|
+
import{x as s}from"./chunk-27U4PLPX.js";function n(r="prod"){let e=s[r];return r!=="stage"?e:{authBaseUrl:process.env.KANE_STAGE_AUTH_URL??e.authBaseUrl,consentUrl:process.env.KANE_STAGE_CONSENT_URL??e.consentUrl,controllerBaseUrl:process.env.TESTMUAI_BASE_URL??e.controllerBaseUrl,tmsBaseUrl:process.env.KANE_STAGE_TMS_URL??e.tmsBaseUrl,testGeneratorBaseUrl:process.env.KANE_STAGE_TCG_URL??e.testGeneratorBaseUrl,secretsBaseUrl:process.env.KANE_STAGE_SECRETS_URL??e.secretsBaseUrl,testManagerUiUrl:process.env.KANE_STAGE_TEST_MANAGER_UI_URL??e.testManagerUiUrl,shareApiBaseUrl:process.env.KANE_STAGE_SHARE_API_URL??e.shareApiBaseUrl,v16ServerHost:process.env.KANE_STAGE_V16_SERVER_HOST??e.v16ServerHost,evidenceViewerUrl:process.env.KANE_STAGE_EVIDENCE_VIEWER_URL??e.evidenceViewerUrl,mediaArtefactsHost:process.env.KANE_STAGE_MEDIA_ARTEFACTS_HOST??e.mediaArtefactsHost}}export{n as a};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as S}from"./chunk-I7TIGB7K.js";import{a as x,b as P,c as C,d as V,e as j}from"./chunk-
|
|
2
|
+
import{a as S}from"./chunk-I7TIGB7K.js";import{a as x,b as P,c as C,d as V,e as j}from"./chunk-BRHNRCEZ.js";import{a as R,b as D}from"./chunk-DNNZ353O.js";import{A as y,c as b,p as f,q as k}from"./chunk-TH47OOBV.js";import{e as w}from"./chunk-DBIBROYW.js";function I(o,t){return{contextDir:o,rootSid:t,locks:w(o,t),probe:S(o,{resolveAlias:i=>P(i),embed:(i,s)=>C(i,s),readVector:(i,s)=>V(o,i,s),writeVector:(i,s,n)=>j(o,i,s,n)})}}var N=new Set(["archive"]);async function Y(o,t,i,s){let n=y(o.contextDir);if(i.v==="defer")return{outcome:"deferred"};if(t.kind==="MODIFY_HELD"){if(!t.heldPayload)return{outcome:"failed",detail:`${t.ref} carries no held payload`};let e=t.heldPayload;if(i.v==="keep_current"){if(!e.event_id)return{outcome:"failed",detail:`this held row has no durable event id \u2014 resume the owner to drop it: kane-cli context extract --resume ${e.sid}`};let{commitChatTurn:r}=await import("./chat-committer-ZWWCLJFD.js"),u=r({contextDir:o.contextDir,graph:n,ops:[{kind:"resolve_question",questionId:`drop-held:${e.sid}:${e.tempRef}`,resolution:"deferred",eventId:e.event_id}],by:s});return u.errors?{outcome:"failed",detail:u.errors.map(d=>`${d.code}: ${d.detail}`).join("; ")}:(o.signals?.({ref:t.ref,verdict:"held-dropped"}),{outcome:"committed",detail:"held payload dropped (recorded) \u2014 the owner's resume will not re-present it"})}if(i.v==="approve"){let r=e.content._held??null;if(!r?.source_id||!r.source_cid||!r.anchor||!r.quote)return{outcome:"failed",detail:`this held row carries no committable provenance \u2014 resume the owner to apply it: kane-cli context extract --resume ${e.sid}`};{let a=n.mediaOf(r.source_cid),m=R(o.contextDir,n,r.source_cid),g=a.format==="image"?null:m?D(m):null;if(a.format!=="image"&&g===null)return{outcome:"failed",detail:`the pinned source ${r.source_id} (${r.source_cid.slice(0,19)}) has no citable text to verify this held row against \u2014 resume the owner: kane-cli context extract --resume ${e.sid}`};let _=b(a,{anchor:r.anchor,quote:r.quote},g);if(_.length>0)return{outcome:"failed",detail:`held provenance does not verify against the pinned source (${_.map($=>`${$.code}: ${$.detail}`).join("; ")}) \u2014 resume the owner: kane-cli context extract --resume ${e.sid}`}}let{commitProposal:u}=await import("./committer-SWEWEYNX.js"),{_held:d,...c}=e.content,q={version:1,read_basis:n.latestHash,source:{source_id:r.source_id,source_cid:r.source_cid},use_cases:[{temp_ref:e.tempRef,title:String(c.title??e.tempRef),...c.summary!==void 0?{summary:c.summary}:{},risk:String(c.risk??"med"),cite:{anchor:r.anchor,quote:r.quote},depends_on_hint:[],matches_existing:null}]},l=await x(I(o.contextDir,o.rootSid??`review-${process.pid}`),{verb:"maintain",ucTargets:[],newBuCandidates:[{tempRef:e.tempRef,title:String(c.title??e.tempRef),probeText:`${String(c.title??"")} ${String(c.summary??"")}`.trim()}],sourcePins:[{source_id:r.source_id,source_cid:r.source_cid}],readBasis:n.latestHash,...e.event_id?{eventIds:[e.event_id]}:{}},a=>{let m=u({contextDir:o.contextDir,graph:a.graph,proposal:q,proposalId:null,verdicts:new Map([[e.tempRef,{resolution:"skipped"}]]),by:s,autoName:!0,allowStaleBasis:!0,eventIds:e.event_id?[e.event_id]:a.eventIds("maintain",1),sid:a.sid,probeHits:a.probeHits});return m.errors!==null?{errors:m.errors}:{result:m,record:m.record}}),h=l.ok&&"result"in l?l.result:{record:null,errors:l.ok?null:l.kind==="validation"?l.errors:[{code:l.kind==="contended"?l.err.code:"UNSETTLED",detail:l.kind==="contended"?`held by ${l.err.holder?.owner_sid??"another session"}`:"concurrent activity kept moving the store"}]};return h.errors?{outcome:"failed",detail:h.errors.map(a=>`${a.code}: ${a.detail}`).join("; ")}:(o.signals?.({ref:t.ref,verdict:"held-applied"}),{outcome:"committed",detail:`held payload committed (derived) by ${s.id}`})}return{outcome:"failed",detail:`verdict ${i.v} does not apply to a MODIFY_HELD card`}}let v=n.resolve(t.ref);if(!v)return{outcome:"failed",detail:`${t.ref} names nothing in the graph`};let p=n.tipOf(v.cid);if(i.v==="archive"){if(!i.because||!i.because.trim())return{outcome:"failed",detail:"archive requires --because (a reason the record keeps)"};let e=f({contextDir:o.contextDir,graph:n,verdicts:new Map([[p,{resolution:"rejected",reason:i.because}]]),by:s});return e.errors?{outcome:"failed",detail:e.errors.map(r=>`${r.code}: ${r.detail}`).join("; ")}:(o.signals?.({ref:t.ref,verdict:"archived",reason:i.because}),{outcome:"retired"})}if(i.v==="approve"){let e=f({contextDir:o.contextDir,graph:n,verdicts:new Map([[p,{resolution:"approved"}]]),by:s});return e.errors?{outcome:"failed",detail:e.errors.map(r=>`${r.code}: ${r.detail}`).join("; ")}:(o.signals?.({ref:t.ref,verdict:"approved"}),{outcome:"applied"})}if(i.v==="merge"||i.v==="keep_both"){if(t.kind!=="PAIR"||!t.pair)return{outcome:"failed",detail:`${t.ref} is not a PAIR card`};let e=n.resolve(t.pair.candidate_cid);if(!e)return{outcome:"failed",detail:`pair candidate ${t.pair.candidate_ref} names nothing`};let r=n.tipOf(e.cid);if(i.v==="merge"){let d=k({contextDir:o.contextDir,graph:n,survivor:r,merged:p,reason:`pair merge: duplicate of ${t.pair.candidate_ref} (score ${t.pair.score})`,by:s});return d.errors?{outcome:"failed",detail:d.errors.map(c=>`${c.code}: ${c.detail}`).join("; ")}:(o.signals?.({ref:t.ref,verdict:"pair-merged",reason:t.pair.candidate_ref}),{outcome:"committed",detail:`merged into ${t.pair.candidate_ref} \u2014 survivor stays derived`})}let u=f({contextDir:o.contextDir,graph:n,verdicts:new Map([[p,{resolution:"approved"}],[r,{resolution:"approved"}]]),by:s});return u.errors?{outcome:"failed",detail:u.errors.map(d=>`${d.code}: ${d.detail}`).join("; ")}:(o.signals?.({ref:t.ref,verdict:"pair-kept-both",reason:t.pair.candidate_ref}),{outcome:"applied",detail:"both promoted as distinct"})}return{outcome:"failed",detail:`verdict ${i.v} does not apply to a ${t.kind} card`}}export{I as a,N as b,Y as c};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as B,b as H,c as ie}from"./chunk-RFR4ZKIC.js";import{a as j,b as N}from"./chunk-YJELGSKJ.js";import{a as C,b as G,e as M,f as te,m as re,n as ne}from"./chunk-GPG3FIN3.js";import{a as oe,b as se}from"./chunk-2YQ6TW77.js";import{a as L}from"./chunk-T5Y6MOLM.js";import{a as ee}from"./chunk-L7MXYCD7.js";import{a as q}from"./chunk-G7VQCS4J.js";import{a as Z}from"./chunk-DPUV6OSP.js";import{a as A}from"./chunk-RZ4F3BHX.js";import{a as O}from"./chunk-6O3DDOP2.js";import{y as h}from"./chunk-27U4PLPX.js";import{a as F}from"./chunk-HCBYKLMW.js";import{a as k,b as m,i as Q}from"./chunk-C44QQJR4.js";import{a as X}from"./chunk-6YGTRKDT.js";import{e as v}from"./chunk-UR6MHSHU.js";var D=v(X(),1);import{existsSync as P,readFileSync as Ge,rmSync as he,unlinkSync as He}from"fs";import{resolve as z}from"path";import{promises as ae,realpathSync as be}from"fs";import{homedir as Te}from"os";import{join as V,parse as Ee,relative as ce,resolve as le}from"path";var ue=new Set(["node_modules",".git","dist","build",".next",".venv","venv","target","__pycache__"]),R=class extends Error{constructor(s){super(`refusing to scan '${s}'. Run from your project root, or pass --root <dir>.`);this.cwd=s;this.name="HomeRefusedError"}};function de(e){try{return be(le(e))}catch{return le(e)}}function Se(e){let r=de(e),s=de(Te()),n=Ee(r).root;if(process.platform==="win32"){let o=t=>t.toLowerCase();return o(r)===o(s)||o(r)===o(n)}return r===s||r===n}async function U(e){if(Se(e.root))throw new R(e.root);let r=e.maxEntries??5e4,s=e.maxResults??5e3,n=new Set(e.ignore??[]),o=[],t=0,i=0,c=!1,f,l=[e.root];for(;l.length>0&&!c;){let a=l.shift(),g;try{g=await ae.readdir(a,{withFileTypes:!0})}catch{continue}i++;for(let b of g){if(t++,t>r){c=!0,f="max_entries";break}let x=b.name,E=V(a,x);if(b.isDirectory()){if(ue.has(x)||x.startsWith(".")||x.startsWith("output-")||n.has(x))continue;l.push(E)}else if(b.isFile()&&x.endsWith("_test.md")&&(o.push({path:E,relPath:ce(e.root,E),source:"cwd"}),o.length>=s)){c=!0,f="max_results";break}}e.onProgress?.(i,o.length)}if(!c){let g=[{dir:V(e.root,".testmuai","tests"),depth:0}];for(;g.length>0&&!c;){let{dir:b,depth:x}=g.shift(),E;try{E=await ae.readdir(b,{withFileTypes:!0})}catch{continue}i++;for(let u of E){if(t++,t>r){c=!0,f="max_entries";break}let w=u.name,y=V(b,w);if(u.isDirectory()){if(x>=20||w.startsWith(".")||w.startsWith("output-")||ue.has(w))continue;g.push({dir:y,depth:x+1})}else if(u.isFile()&&w.endsWith("_test.md")&&(o.push({path:y,relPath:ce(e.root,y),source:"tests-dir"}),o.length>=s)){c=!0,f="max_results";break}}}}return{results:o,aborted:c,abortReason:f,dirsScanned:i}}import{readFileSync as ve}from"fs";function Re(e){let r;try{r=ve(e,"utf8")}catch{return{tags:[]}}try{let{global:s}=re(e,r),n=ne(s);return{tags:s.tags??[],...n?{mobileTarget:n}:{}}}catch{return{tags:[],...Me(r)?{mobileTarget:Pe}:{}}}}var Pe={platform:"",app:""};function Me(e){let r=/^---\r?\n([\s\S]*?)\r?\n---/.exec(e);if(!r)return!1;let s=r[1].split(/\r?\n/);if(s.some(o=>/^target:\s*['"]?(emulator|simulator)['"]?\s*$/.test(o)))return!0;let n=s.findIndex(o=>/^target:\s*$/.test(o));return n<0?!1:s.slice(n+1).some(o=>/^\s+\S/.test(o))}function W(e){return Re(e).tags}import{mkdirSync as De,writeFileSync as $e}from"fs";import{join as Ce}from"path";function fe(e,r){return`Basic ${Buffer.from(`${e}:${r}`).toString("base64")}`}async function Ie(e){let r=oe({tmsBaseUrl:e.tmsBaseUrl,testcaseId:e.testcaseId,codeExport:{enabled:!0,language:e.language,skipValidation:e.skipValidation}}),s=await A(r.url,{method:"POST",headers:{"content-type":"application/json",authorization:fe(e.auth.username,e.auth.access_key)},body:JSON.stringify(r.body)});if(!s.ok)throw new Error(`code-export trigger failed: ${s.status} ${await s.text()}`);e.log("info","CODE_EXPORT_TRIGGERED","Code export triggered",{testcase_id:e.testcaseId})}async function Fe(e){let r=se({tmsBaseUrl:e.tmsBaseUrl,testcaseId:e.testcaseId}),s=e.pollIntervalMs??5e3,n=e.timeoutMs??3e5,o=Date.now()+n;for(;Date.now()<o;){let t=await A(r,{headers:{authorization:fe(e.auth.username,e.auth.access_key),accept:"application/json"}});if(!t.ok){await new Promise(l=>setTimeout(l,s));continue}let c=(await t.json()).data?.find(l=>l.code_name==="kane-cli-trigger");if(!c){await new Promise(l=>setTimeout(l,s));continue}let f=(c.status??"").toLowerCase();if(f==="in progress"||f==="in_progress"||f==="pending"){await new Promise(l=>setTimeout(l,s));continue}if(!c.url||c.url.length===0)throw new Error(`code-export status=${c.status} but no files returned`);De(e.outDir,{recursive:!0});for(let l of c.url){let a=Ce(e.outDir,l.file_name),g=await A(l.file_url);if(!g.ok){e.log("warn","CODE_EXPORT_FILE_FAILED","Failed to download file",{file_name:l.file_name,status:g.status});continue}let b=await g.text();$e(a,b,"utf-8")}return e.log("info","CODE_EXPORT_DOWNLOADED","Code export saved",{out_dir:e.outDir,file_count:c.url.length}),e.outDir}throw new Error("code-export polling timed out")}async function ge(e){return await Ie(e),await Fe(e)}var T=v(X(),1);import{existsSync as Oe,readFileSync as Ae}from"fs";var p=v(F(),1);function Le(e){B(e);let r=M(e);if(!Oe(r))return null;try{return JSON.parse(Ae(r,"utf8"))}catch{return{}}}function Be(e){return e===null?"never_run":e.testcase_id?"synced":"local_only"}function je(e){return e==="synced"?"\u2601":e==="local_only"?"\u25A3":"\u25CB"}function Ne(e){return e==="tests-dir"?"\u2726":" "}function Ue(e,r){return r==="all"?!0:r==="synced"?e.status==="synced":r==="local"?e.status==="local_only":r==="never_run"?e.status==="never_run":r==="cli"?e.source==="tests-dir":r==="hand"?e.source==="cwd":!0}var Y=["all","synced","local","never_run","cli","hand"];function We(e){let r=Y.indexOf(e);return Y[(r+1)%Y.length]}function me({root:e,currentOrgId:r,onSelect:s,onCancel:n}){let[o,t]=(0,T.useState)([]),[i,c]=(0,T.useState)(null),[f,l]=(0,T.useState)(!0),[a,g]=(0,T.useState)("all");(0,T.useEffect)(()=>{(async()=>{try{let u=await U({root:e}),w=[];for(let y of u.results){let K=Le(y.path);K?.org_id!==void 0&&K.org_id!==r||w.push({path:y.path,relPath:y.relPath,name:C(y.path),status:Be(K),source:y.source,tags:W(y.path)})}t(w),l(!1)}catch(u){u instanceof R,c(u.message),l(!1)}})()},[e,r]);let b=(0,T.useMemo)(()=>o.filter(u=>Ue(u,a)).map(u=>({id:u.path,label:`${je(u.status)} ${Ne(u.source)} ${u.relPath}${u.tags.length>0?` [${u.tags.join(", ")}]`:""}`})),[o,a]),x=(0,T.useMemo)(()=>Ke(a,o),[a,o]);if(i)return(0,p.jsxs)(k,{flexDirection:"column",borderStyle:"round",borderColor:h.red,paddingX:2,paddingY:1,children:[(0,p.jsx)(m,{color:h.red,bold:!0,children:"testmd"}),(0,p.jsx)(k,{marginTop:1,children:(0,p.jsx)(m,{color:h.red,children:i})})]});let E=a==="all"?"all":Je(a);return(0,p.jsx)(ee,{title:`testmd \xB7 filter: ${E}`,items:b,loading:f,itemNoun:"tests",onSelect:u=>{let w=o.find(y=>y.path===u.id);w&&s(w)},onCancel:n,onTab:()=>g(u=>We(u)),extraHint:"cycle filter",footer:x})}function Je(e){return e==="synced"?"synced (\u2601)":e==="local"?"local (\u25A3)":e==="never_run"?"never run (\u25CB)":e==="cli"?"cli-generated (\u2726)":e==="hand"?"hand-written":"all"}function Ke(e,r){let s={synced:r.filter(o=>o.status==="synced").length,local:r.filter(o=>o.status==="local_only").length,never:r.filter(o=>o.status==="never_run").length,cli:r.filter(o=>o.source==="tests-dir").length,hand:r.filter(o=>o.source==="cwd").length},n=o=>o?h.orange:h.dim;return(0,p.jsxs)(k,{flexDirection:"column",children:[(0,p.jsx)(m,{color:h.dim,children:"legend:"}),(0,p.jsxs)(k,{children:[(0,p.jsx)(m,{color:n(e==="synced"),children:` \u2601 synced (${s.synced}) `}),(0,p.jsx)(m,{color:n(e==="local"),children:`\u25A3 local (${s.local}) `}),(0,p.jsx)(m,{color:n(e==="never_run"),children:`\u25CB never run (${s.never})`})]}),(0,p.jsxs)(k,{children:[(0,p.jsx)(m,{color:n(e==="cli"),children:` \u2726 cli-generated (${s.cli}) `}),(0,p.jsx)(m,{color:n(e==="hand"),children:` hand-written (${s.hand})`})]})]})}var I=v(X(),1);import{existsSync as Xe,readFileSync as qe}from"fs";var d=v(F(),1);function pe({path:e,relPath:r,onAction:s,onBack:n,onView:o}){let[t,i]=(0,I.useState)(null),[c,f]=(0,I.useState)(!1);(0,I.useEffect)(()=>{let a=M(e);if(Xe(a))try{i(JSON.parse(qe(a,"utf8")))}catch{i(null)}},[e]),Q((a,g)=>{if(g.escape){if(c){f(!1);return}n();return}if(c){a==="y"||a==="Y"?(f(!1),s("delete")):(a==="n"||a==="N")&&f(!1);return}a==="r"&&s("run"),a==="e"&&t?.testcase_id&&s("export"),a==="d"&&f(!0),a==="v"&&o&&o()});let l=({k:a,v:g})=>g?(0,d.jsxs)(m,{children:[(0,d.jsx)(m,{color:h.dim,children:a.padEnd(14)}),g]}):null;return(0,d.jsxs)(k,{flexDirection:"column",borderStyle:"round",borderColor:h.orange,paddingX:2,paddingY:1,children:[(0,d.jsx)(m,{color:h.orange,bold:!0,children:r}),(0,d.jsx)(k,{marginTop:1,flexDirection:"column",children:t?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(l,{k:"test_id",v:t.test_id}),(0,d.jsx)(l,{k:"testcase_id",v:t.testcase_id}),(0,d.jsx)(l,{k:"project_id",v:t.project_id}),(0,d.jsx)(l,{k:"folder_id",v:t.folder_id}),(0,d.jsx)(l,{k:"org_id",v:t.org_id}),(0,d.jsx)(l,{k:"session_name",v:t.session_name}),(0,d.jsx)(l,{k:"commit_id",v:t.commit_id})]}):(0,d.jsx)(m,{color:h.dim,children:"(never run \u2014 no meta.json)"})}),c?(0,d.jsx)(k,{marginTop:1,children:(0,d.jsxs)(m,{color:h.red,bold:!0,children:["Delete ",r," and its output dir? [y/n]"]})}):(0,d.jsx)(k,{marginTop:1,children:(0,d.jsxs)(m,{color:h.dim,children:["[r] run [e] export",t?.testcase_id?"":" (need testcase_id)"," [d] delete",o?" [v] view":""," [Esc] back"]})})]})}function $(e){B(e);let r=M(e);if(!P(r))return null;try{return JSON.parse(Ge(r,"utf8"))}catch{return null}}function _e(e,r){return!e||e.org_id===void 0?!0:e.org_id===r}function J(e,r){return _e(e,r)?null:(process.stderr.write(`error: this test belongs to org ${e.org_id}; you are logged in as org ${r}.
|
|
3
|
+
Switch profiles with \`kane-cli profiles switch\` to act on it.
|
|
4
|
+
`),2)}async function Xt(e={}){let r=!!process.stdin.isTTY&&!e.json,s=new O,n=new L;await H({isInteractive:r,creds:s,config:n});let o=s.getDefaultEnv()??"prod";try{let t=await N({creds:s,env:o,log:()=>{}});return t.resolvedCreds?.org_id===void 0?(process.stderr.write("error: TMS did not return an org_id. Run `kane-cli login` again.\n"),{ok:!1,code:2}):{ok:!0,orgId:String(t.resolvedCreds.org_id)}}catch(t){if(t instanceof j)return process.stderr.write("error: not authenticated. Run `kane-cli login` first.\n"),{ok:!1,code:2};throw t}}async function qt(e,r){if(process.stdin.isTTY&&!e.json)return await ze(r,e.root);let s=e.root??process.cwd(),n;try{n=await U({root:s,ignore:e.ignore})}catch(o){if(o instanceof R)return process.stderr.write(`error: ${o.message}
|
|
5
|
+
`),2;throw o}for(let o of n.results){let t=$(o.path);if(!_e(t,r))continue;let i={path:o.relPath.startsWith(".")?o.relPath:`./${o.relPath}`,name:C(o.path),has_meta:t!==null,source:o.source,synced:!!t?.testcase_id,tags:W(o.path)};t&&(t.test_id&&(i.test_id=t.test_id),t.testcase_id&&(i.testcase_id=t.testcase_id),t.org_id&&(i.org_id=t.org_id),t.project_id&&(i.project_id=t.project_id),t.folder_id&&(i.folder_id=t.folder_id)),process.stdout.write(JSON.stringify(i)+`
|
|
6
|
+
`)}return n.aborted&&process.stderr.write(`warn: walk aborted (${n.abortReason}). Pass --root or --ignore to narrow.
|
|
7
|
+
`),0}var ye=-1001,xe=-1002,we=-1003,_={action:null,path:null};function Ve(e,r){return _.action=e,_.path=r,e==="run"?ye:e==="export"?xe:we}function Ye({root:e,currentOrgId:r,onComplete:s}){let[n,o]=D.default.useState({kind:"list"});return D.default.useEffect(()=>{n.kind==="exiting"&&s(n.code)},[n,s]),n.kind==="list"?D.default.createElement(me,{root:e,currentOrgId:r,onSelect:t=>o({kind:"inspect",path:t.path,relPath:t.relPath}),onCancel:()=>o({kind:"exiting",code:0})}):n.kind==="inspect"?D.default.createElement(pe,{path:n.path,relPath:n.relPath,onAction:async t=>{o({kind:"exiting",code:Ve(t,n.path)})},onBack:()=>o({kind:"list"})}):null}async function ze(e,r){let s=r??process.cwd(),{render:n}=await import("./build-JIKYOZUH.js"),o=await new Promise(t=>{let{unmount:i,waitUntilExit:c}=n(D.default.createElement(Ye,{root:s,currentOrgId:e,onComplete:f=>{i(),t(f)}}),{stdout:process.stderr,exitOnCtrlC:!0});c().then(()=>t(0)).catch(()=>t(0))});if(o===ye&&_.path){let{runTestMdFile:t}=await import("./run-test-md-76ZPKXO6.js"),i=await t(_.path,{});return _.action=null,_.path=null,i}if(o===xe&&_.path){let t=await Ze(_.path,{},e);return _.action=null,_.path=null,t}if(o===we&&_.path){let t=await Qe(_.path,!0,e);return _.action=null,_.path=null,t}return o}async function Gt(e,r){let s=z(e);if(!P(s))return process.stderr.write(`error: file not found: ${s}
|
|
8
|
+
`),2;let n=$(s),o=J(n,r);if(o!==null)return o;let t={path:s,name:C(s),has_meta:n!==null};return n&&(n.commit_id&&(t.commit_id=n.commit_id),n.test_id&&(t.test_id=n.test_id),n.testcase_id&&(t.testcase_id=n.testcase_id),n.project_id&&(t.project_id=n.project_id),n.folder_id&&(t.folder_id=n.folder_id),n.org_id&&(t.org_id=n.org_id),n.session_name&&(t.session_name=n.session_name)),process.stdout.write(JSON.stringify(t)+`
|
|
9
|
+
`),0}async function Qe(e,r,s){let n=z(e);if(!P(n))return process.stderr.write(`error: file not found: ${n}
|
|
10
|
+
`),2;let o=$(n),t=J(o,s);if(t!==null)return t;if(!r)return process.stderr.write(`error: refusing to delete without --yes.
|
|
11
|
+
This will remove '${n}' and '${G(n)}/'.
|
|
12
|
+
`),2;let i=G(n);if(P(i))try{he(i,{recursive:!0,force:!0})}catch(c){return process.stderr.write(`error: failed to remove ${i}: ${c.message}
|
|
13
|
+
`),2}try{He(n)}catch(c){return process.stderr.write(`error: failed to remove ${n}: ${c.message}
|
|
14
|
+
`),2}return process.stderr.write(`removed ${n} and ${i}/
|
|
15
|
+
`),0}var S=class extends Error{kind;constructor(r,s){super(s),this.name="ExportError",this.kind=r}};async function Ht(e,r){let{codeDir:s}=await ke(e,r);return{codeDir:s}}async function ke(e,r){let s=$(e);if(!s?.testcase_id)throw new S("not-synced","this test has not been synced to TMS \u2014 run `kane-cli testmd run` first.");let n=new L().load(),o=r.language??n.code_export?.language;if(!o)throw new S("no-language","--language not provided and no default in tui-config.");let t=r.output??te(e,"playwright",o),i=P(t);if(i&&!r.force){let a=!1;try{let{readdirSync:g}=await import("fs");a=g(t).length>0}catch{}if(a)return{kind:"reused",codeDir:t}}i&&r.force&&he(t,{recursive:!0,force:!0});let c=new O,f=r.env??c.getDefaultEnv()??"prod",l;try{l=await N({creds:c,env:f,log:()=>{}})}catch(a){throw a instanceof j?new S("auth-fail","not authenticated. Run `kane-cli login` first."):a}if(!l.basicAuth)throw new S("auth-incomplete","TMS basic auth could not be resolved. Run `kane-cli login` again.");try{let a=q(f);await ge({tmsBaseUrl:a.tmsBaseUrl,testcaseId:s.testcase_id,auth:l.basicAuth,language:o,framework:"playwright",skipValidation:n.code_export?.skip_validation??!0,outDir:t,log:()=>{}})}catch(a){throw new S("export-fail",`code export failed: ${a.message}`)}return{kind:"exported",codeDir:t}}async function Ze(e,r,s){let n=z(e);if(!P(n))return process.stderr.write(`error: file not found: ${n}
|
|
16
|
+
`),2;let o=$(n),t=J(o,s);if(t!==null)return t;try{let i=await ke(n,r);return i.kind==="reused"?process.stderr.write(`reusing existing export at ${i.codeDir}
|
|
17
|
+
`):process.stderr.write(`exported to ${i.codeDir}
|
|
18
|
+
`),0}catch(i){if(i instanceof S)return i.kind==="not-synced"?(process.stderr.write("error: this test has not been synced to TMS \u2014 run `kane-cli testmd run` first.\n"),2):i.kind==="no-language"?(process.stderr.write(`error: --language not provided and no default in tui-config.
|
|
19
|
+
`),2):i.kind==="auth-fail"?(process.stderr.write("error: not authenticated. Run `kane-cli login` first.\n"),2):i.kind==="auth-incomplete"?(process.stderr.write("error: TMS basic auth could not be resolved. Run `kane-cli login` again.\n"),2):(process.stderr.write(`error: ${i.message}
|
|
20
|
+
`),2);throw i}}async function Vt(e={}){let r=!!process.stdin.isTTY,s=new O,n=new L;await H({isInteractive:r,creds:s,config:n});let o=e.env??s.getDefaultEnv()??"prod";try{let t=await N({creds:s,env:o,usernameFlag:e.username,accessKeyFlag:e.accessKey,log:()=>{}});return t.resolvedCreds?.org_id===void 0||!t.basicAuth?(process.stderr.write("error: could not resolve TMS credentials. Run `kane-cli login` again.\n"),{ok:!1,code:2}):{ok:!0,orgId:String(t.resolvedCreds.org_id),basicAuth:t.basicAuth,controllerBaseUrl:q(o).controllerBaseUrl}}catch(t){if(t instanceof j)return process.stderr.write("error: not authenticated. Run `kane-cli login` first.\n"),{ok:!1,code:2};throw t}}async function Yt(e,r,s=ie){if(!P(e))return process.stderr.write(`error: file not found: ${e}
|
|
21
|
+
`),2;if(!e.endsWith("_test.md"))return process.stderr.write(`error: not a *_test.md file: ${e}
|
|
22
|
+
`),2;let n=$(e),o=J(n,r.orgId);if(o!==null)return o;if(!n?.commit_id||!n?.test_id)return process.stderr.write(`error: ${e} is not authored \u2014 run \`kane-cli testmd run ${e}\` first.
|
|
23
|
+
`),2;let t=await s({sourcePath:e,testId:n.test_id,sessionId:n.commit_id,commitId:n.commit_id,controller:new Z(r.controllerBaseUrl,{username:r.basicAuth.username,accessKey:r.basicAuth.access_key})}),i={type:"test_md_bundle_sync",status:t.ok?"ok":"failed",commit_id:n.commit_id,...t.ok?{bytes:t.bytes}:{stage:t.stage}};return process.stdout.write(JSON.stringify(i)+`
|
|
24
|
+
`),t.ok?(process.stderr.write(`synced: ${n.commit_id}-testmd.zip (${t.bytes} bytes)
|
|
25
|
+
`),0):(process.stderr.write(`error: bundle sync failed at ${t.stage}: ${t.error}
|
|
26
|
+
`),t.stage==="collect"?2:1)}export{U as a,Re as b,me as c,pe as d,$ as e,_e as f,J as g,Xt as h,qt as i,ze as j,Gt as k,Qe as l,S as m,Ht as n,Ze as o,Vt as p,Yt as q};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as j}from"./chunk-L5LI2JF4.js";import{c as C}from"./chunk-EYOCNMUM.js";import{dirname as U,basename as q,join as y}from"path";function Z(e){let t=q(e);return t.endsWith("_test.md")?t.slice(0,-8):t.endsWith(".md")?t.slice(0,-3):t}function v(e){return y(U(e),`output-${Z(e)}`)}function Te(e){return y(v(e),"Result.md")}function T(e){return y(v(e),".internal")}function O(e){return y(T(e),"meta.json")}function Ae(e,t,n){return y(v(e),`${t}-${n}-code`)}function Ie(e){return y(v(e),"generated-code")}function Le(e){return v(e)+".staging"}function Q(e){return y(T(e),"steps")}function Pe(e,t,n){return y(Q(e),`${t}-${n}`)}import{existsSync as p,renameSync as S,rmSync as _}from"fs";function Ke(e){let t=`${e}.staging`,n=`${e}.bak`;if(!p(t))throw new Error(`atomicReplaceDir: staging missing: ${t}`);if(process.platform==="win32"){p(e)&&_(e,{recursive:!0,force:!0}),S(t,e);return}p(e)&&(p(n)&&_(n,{recursive:!0,force:!0}),S(e,n)),S(t,e),p(n)&&_(n,{recursive:!0,force:!0})}function Ge(e){let t=`${e}.staging`,n=`${e}.bak`;if(process.platform==="win32"){p(t)&&(p(e)?_(t,{recursive:!0,force:!0}):S(t,e));return}if(p(n)&&!p(e)){S(n,e),p(t)&&_(t,{recursive:!0,force:!0});return}p(n)&&p(e)&&_(n,{recursive:!0,force:!0}),p(t)&&p(e)&&_(t,{recursive:!0,force:!0})}import{readFileSync as Se,existsSync as xe}from"fs";import{basename as N,dirname as Re,isAbsolute as $e,resolve as J}from"path";import{dirname as X,isAbsolute as ee,resolve as te}from"path";var d=class extends Error{constructor(n,o,r){super(`[${o}${r!=null?`:${r}`:""}] ${n}`);this.file=o;this.line=r;this.name="TestMdParseError"}},ne=new Set(["username","access_key","oauth","profile","project_id","folder_id"]),A=new Set(["mode","max_steps","timeout","global_context","local_context","variables","session_context","code_export","code_language","url","target","chrome_profile","cdp_endpoint","ws_endpoint","headless","app","no_reset","on_lock_conflict","tags","assurance"]),I=new Set(["optional"]),re=new Set(["optional","variables"]),oe=new Set(["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"]),ie=new Set(["app","no_reset"]),se=new Set(["mode","on_lock_conflict","tags","assurance"]);function L(e,t){let n=t.split(`
|
|
3
|
+
`),{global:o,bodyStartLine:r}=ae(e,n),{title:a,steps:s}=be(e,n,r);return{path:e,title:a,global:o,steps:s}}function ae(e,t){if(t[0]?.trim()!=="---")return{global:{},bodyStartLine:0};let n=-1;for(let c=1;c<t.length;c++)if(t[c].trim()==="---"){n=c;break}if(n===-1)throw new d("frontmatter is missing closing '---'",e,1);let o=t.slice(1,n).join(`
|
|
4
|
+
`),r;try{r=j(o)??{}}catch(c){throw new d(`invalid YAML in frontmatter: ${c.message}`,e,1)}if(V(e,r,"frontmatter",1),r.on_lock_conflict!==void 0){let c=r.on_lock_conflict;if(c!=="readonly"&&c!=="fail"&&c!=="wait")throw new d(`on_lock_conflict must be 'readonly' | 'fail' | 'wait', got: ${JSON.stringify(c)}`,e,1)}if(F(e,r,1),r.assurance!==void 0){let c=r.assurance;if(c===null||typeof c!="object"||Array.isArray(c))throw new d("assurance must be a mapping with sub-keys {id, base}",e,1);let f=c;for(let g of Object.keys(f))if(g!=="id"&&g!=="base")throw new d(`unknown assurance sub-key '${g}' \u2014 the engine block allows only {id, base}`,e,1);if(typeof f.id!="string"||f.id.length===0)throw new d("assurance.id must be a non-empty string (logical id)",e,1);if(f.base!==void 0&&!(typeof f.base=="string"&&/^sha256:[0-9a-f]+$/.test(f.base)))throw new d("assurance.base must be a 'sha256:<hex>' string",e,1)}if(r.tags!==void 0){let c=r.tags,f=Array.isArray(c)?c.map(g=>String(g)).join(","):String(c);r.tags=ce(f,e,1)}if(r.target!==void 0&&(r.target=le(r.target,e,1)),r.app!==void 0&&(r.app=ge(r.app,e,1)),r.no_reset!==void 0&&typeof r.no_reset!="boolean")throw new d(`no_reset must be boolean: got ${typeof r.no_reset}`,e,1);let a=r.target,s=a==="emulator"||a==="simulator";if(s&&r.app===void 0)throw new d(`target: ${String(a)} needs an app \u2014 add \`app: <path-to-build | APPid>\``,e,1);if(!s&&r.app!==void 0)throw new d("app requires a mobile target \u2014 add `target: emulator` or `target: simulator`",e,1);if(!s&&r.no_reset!==void 0)throw new d("no_reset requires a mobile target \u2014 add `target: emulator` or `target: simulator`",e,1);return{global:r,bodyStartLine:n+1}}function ce(e,t,n){let r=e.trim().replace(/^\[/,"").replace(/\]$/,"").split(",").map(a=>a.trim().toLowerCase());if(r.length===0||r.some(a=>a.length===0))throw new d("tags must be a non-empty list of non-empty strings",t,n);return[...new Set(r)]}var de=new Set(["chrome","cdp","ws","emulator","simulator"]),fe="target must be one of 'chrome' | 'cdp' | 'ws' (web) or 'emulator' | 'simulator' (mobile, with a root `app:` key)";function le(e,t,n){if(typeof e=="string"&&de.has(e))return e;throw e!==null&&typeof e=="object"&&!Array.isArray(e)?new d(`the mapping form of target is no longer accepted \u2014 write flat keys:
|
|
5
|
+
target: emulator | simulator
|
|
6
|
+
app: <path-to-build | APPid>`,t,n):new d(`${fe} \u2014 got: ${JSON.stringify(e)}`,t,n)}function ge(e,t,n){if(typeof e!="string"||e.trim().length===0)throw new d("app must be a build (e.g. ./builds/app-debug.apk) or an app id from your cloud uploads",t,n);let o=e.trim();if(!/\.(apk|zip)$/i.test(o)&&!/^APP\d{6,}$/.test(o))throw new d(`app '${o}' is not a build \u2014 expected a path ending in .apk or .zip, or an app id from your cloud uploads.`,t,n);return pe(o,t)}function pe(e,t){return/^APP[0-9A-Za-z_-]+$/.test(e)||ee(e)?e:te(X(t),e)}function We(e){let t=e.target;if(!(t!=="emulator"&&t!=="simulator"))return{platform:C(t)??"",app:e.app??"",...e.no_reset!==void 0?{no_reset:e.no_reset}:{}}}function P(e){let t=e.target;return t==="chrome"||t==="cdp"||t==="ws"?t:void 0}var ue=/\s@verifies\s+(ac-[\w.:\/-]+(?:\s*,\s*ac-[\w.:\/-]+)*)\s*$/;function me(e,t,n){let o=ue.exec(t);if(o)return{label:t.slice(0,o.index).trim(),verifies:o[1].split(",").map(a=>a.trim())};let r=t.lastIndexOf("@verifies");if(r>0&&/\s/.test(t[r-1])){let a=t.slice(r+9).split(/[\s,]+/).filter(s=>s.length>0);if(a.length===0||a.every(s=>s.startsWith("ac-")))throw new d("malformed @verifies directive \u2014 expected '@verifies ac-<id>[, ac-<id>\u2026]' at the end of the heading",e,n)}return{label:t,verifies:[]}}function be(e,t,n){let o,r=n;for(;r<t.length&&t[r].trim()==="";)r++;let a=r<t.length?/^#\s+(.+?)\s*$/.exec(t[r]):null;a&&(o=a[1],r++);let s=[];for(let f=r;f<t.length;f++)/^##\s/.test(t[f])&&s.push(f);let c=[];for(let f=0;f<s.length;f++){let g=s[f],u=s[f+1]??t.length,h=t[g].replace(/^##\s+/,"").trim(),{label:i,verifies:l}=me(e,h,g+1),m=t.slice(g+1,u),{config:b,body:w,optional:R}=he(e,g+1,m);c.push({index:f+1,heading:i,verifies:l,config:b,body:w,headingLine:g+1,optional:R})}return{title:o,steps:c}}function he(e,t,n){let o=0;for(;o<n.length&&n[o].trim()==="";)o++;let r,a=t;if(o<n.length&&/^```yaml\s*$/.test(n[o])){let l=o;a=t+l,o++;let m=-1;for(;o<n.length;){if(/^```\s*$/.test(n[o])){m=o;break}o++}if(m===-1)throw new d("step-config fenced ```yaml block is not closed",e,a);let b=n.slice(l+1,m).join(`
|
|
7
|
+
`);try{r=j(b)??{}}catch(w){throw new d(`invalid YAML in step config: ${w.message}`,e,a)}o=m+1}let s=we(n.slice(o)),c=s.filter(l=>l.trim()!=="");if(c.length>0&&/^@session\s+/.test(c[0].trim()))throw new d("@session is no longer supported (iteration 3); use @import instead",e,t);let f=/^@import\s+(\S.*)$/,u=s.filter(l=>f.test(l.trim())).length>0;if(u&&c.length!==1)throw new d("step body must be exactly one of prose / @import",e,t);let h=!1,i;if(r){if(V(e,r,u?"step config (ref)":"step config (objective)",a),F(e,r,a),typeof r.optional=="boolean")h=r.optional;else if(r.optional!==void 0)throw new d(`step config 'optional' must be boolean: got ${typeof r.optional}`,e,a);let l={...r};delete l.optional,u&&delete l.variables,!u&&Object.keys(l).length>0&&(i=l)}if(u){let m=f.exec(c[0].trim())[1].trim(),b=r?.variables;return{body:{kind:"import_ref",path:m,...b&&Object.keys(b).length>0?{bindings:b}:{}},optional:h}}return{body:{kind:"objective",text:s.join(`
|
|
8
|
+
`).trim()},config:i,optional:h}}function we(e){let t=0,n=e.length;for(;t<n&&e[t].trim()==="";)t++;for(;n>t&&e[n-1].trim()==="";)n--;return e.slice(t,n)}function F(e,t,n){let o=t.variables;if(o==null)return;if(typeof o!="object"||Array.isArray(o))throw new d("variables must be an object map",e,n);let r={};for(let[a,s]of Object.entries(o))if(typeof s=="string")r[a]={value:s};else if(s&&typeof s=="object"&&!Array.isArray(s)&&typeof s.value=="string")r[a]=s;else throw new d(`variable '${a}' must be a string or { value: ... } object`,e,n);t.variables=r}function V(e,t,n,o){for(let r of Object.keys(t)){if(ne.has(r))throw new d(`auth/identity keys are CLI-only: ${r}`,e,o);if(n==="frontmatter"){if(I.has(r))throw new d(`step-only key in frontmatter: ${r}`,e,o);if(!A.has(r))throw new d(`unknown config key: ${r}`,e,o)}else if(n==="step config (objective)"){if(!A.has(r)&&!I.has(r))throw new d(`unknown config key: ${r}`,e,o);if(oe.has(r))throw new d(`chrome config is global-only: ${r}`,e,o);if(ie.has(r))throw new d(`'${r}' is global-only: the whole run drives one app`,e,o);if(se.has(r))throw new d(`'${r}' is run-level and cannot be set per-step`,e,o)}else if(!re.has(r))throw new d(`step config on @import may only contain 'optional' / 'variables': got ${r}`,e,o)}}import{createHash as K}from"crypto";function x(e){if(e==null)return null;if(Array.isArray(e))return e.map(x);if(typeof e=="object"){let t={};for(let n of Object.keys(e).sort()){let o=e[n];o!==void 0&&(t[n]=x(o))}return t}return e}function ye(e){if(e.body.kind!=="objective")throw new Error("stepMd5: only objective steps have an md5; @import rows do not");let t={...e.config??{},optional:e.optional??!1},n=JSON.stringify(x(t));return K("md5").update(e.body.text).update(`
|
|
9
|
+
`).update(n).digest("hex")}function G(e){let t={};for(let[o,r]of Object.entries(e.bindings??{}))t[o]={value:r.value,...r.secret===!0?{secret:!0}:{},...r.syntax?{syntax:r.syntax}:{}};let n=JSON.stringify(x({bindings:t,optional:e.optional}));return K("md5").update(e.path).update(`
|
|
10
|
+
`).update(n).digest("hex")}function ze(e){return ye({index:e.trace[e.trace.length-1].stepIndex,heading:e.trace[e.trace.length-1].heading,verifies:[],body:{kind:"objective",text:e.objective},config:e.parsedConfig,headingLine:1,optional:e.optional})}import{writeFileSync as _e,mkdirSync as ke,readFileSync as ve}from"fs";import{dirname as Y}from"path";function D(e){try{return JSON.parse(ve(O(e),"utf8"))}catch{return null}}function Xe(e){let t=O(e.sourcePath);try{ke(Y(t),{recursive:!0})}catch(o){return process.stderr.write(`
|
|
11
|
+
\u26A0 Failed to create output directory.
|
|
12
|
+
${o.message}
|
|
13
|
+
Path: ${Y(t)}
|
|
14
|
+
|
|
15
|
+
`),t}let n={commit_id:e.commitId};e.testId!==void 0&&(n.test_id=e.testId),e.testcaseId!==void 0&&(n.testcase_id=e.testcaseId),e.projectId!==void 0&&(n.project_id=e.projectId),e.folderId!==void 0&&(n.folder_id=e.folderId),e.orgId!==void 0&&(n.org_id=e.orgId),e.sessionName!==void 0&&(n.session_name=e.sessionName),e.plan!==void 0&&(n.plan=e.plan);try{_e(t,JSON.stringify(n,null,2)+`
|
|
16
|
+
`,"utf8")}catch(o){process.stderr.write(`
|
|
17
|
+
\u26A0 Failed to write meta.json.
|
|
18
|
+
${o.message}
|
|
19
|
+
Path: ${t}
|
|
20
|
+
|
|
21
|
+
`)}return t}var W=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"],je=["app","no_reset"],Oe=["mode","on_lock_conflict","tags","target","chrome_profile","cdp_endpoint","ws_endpoint","headless","app","no_reset"],k=class extends Error{constructor(t){super(t),this.name="TestMdResolveError"}};function E(e){return N(e).endsWith("_test.md")?"test":"helper"}function st(e){let t=J(e),n=B(t),o=Ee(n.global),r=[],a=[],s=[{file:t,kind:E(t)}],c=[];return H(n,a,r,[],t,{},s,c,{}),r.forEach((g,u)=>g.flatIndex=u+1),{rootPath:t,rootTitle:n.title,rootGlobal:n.global,rootSteps:n.steps,chrome:o,steps:r,unitFiles:s,warnings:c}}function at(e){let t=[];for(let n of e.unitFiles){if(n.kind!=="test")continue;let o=D(n.file);o&&t.push({file:n.file,...o.project_id?{project_id:String(o.project_id)}:{},...o.org_id?{org_id:String(o.org_id)}:{}})}return t}function B(e){if(!xe(e))throw new k(`@import path not found: ${e}`);let t=Se(e,"utf8");return L(e,t)}function H(e,t,n,o,r,a,s,c,f){if(t.includes(e.path)){let i=[...t,e.path].map(l=>N(l)).join(" \u2192 ");throw new k(`cyclic reference: ${i}`)}t.push(e.path);let g=o.length===0,u=e.global.variables??{};for(let i of Object.keys(a))if(Object.hasOwn(u,i))throw new k(`callsite binding '${i}' collides with a declared variable in ${e.path} (frontmatter variables are pinned; parameters are its undeclared names)`);let h=e.global;if(!g){let i={...e.global};for(let l of Oe)i[l]!==void 0&&(c.push(`${e.path}: '${l}' is root-governed on imported units \u2014 ignored`),delete i[l]);i.url!==void 0&&(f.pending=String(i.url),delete i.url),h=i}for(let i of e.steps){let l=i.body.kind!=="objective";if(i.optional&&l&&!g)throw new k(`intermediate-ref 'optional' is not supported in v1: ${e.path}:${i.headingLine}`);if(i.body.kind==="objective"){let $={file:e.path,stepIndex:i.index,heading:i.heading,optional:i.optional??!1},z=Me(h,i.config,a),M={flatIndex:0,objective:i.body.text,sourceFile:e.path,trace:[...o,$],config:z,parsedConfig:i.config,optional:i.optional??!1,verifies:i.verifies,owningFile:e.path,unitKind:E(e.path)};f.pending&&(M.unitEntryUrl=f.pending,f.pending=void 0),n.push(M);continue}let m={file:e.path,stepIndex:i.index,heading:i.heading,optional:i.optional??!1,rowMd5:G({path:i.body.path,bindings:i.body.bindings,optional:i.optional??!1})},b=Re(e.path),w=$e(i.body.path)?i.body.path:J(b,i.body.path),R=B(w);s.some($=>$.file===w)||s.push({file:w,kind:E(w)}),H(R,t,n,[...o,m],r,i.body.bindings??{},s,c,f)}g||(f.pending=void 0),t.pop()}function Ee(e){let t={};for(let n of W){if(n==="target"){let o=P(e);o!==void 0&&(t.target=o);continue}e[n]!==void 0&&(t[n]=e[n])}return t}function Me(e,t,n){let o={};for(let[s,c]of Object.entries(e))W.includes(s)||je.includes(s)||(o[s]=c);let r={...o,...t??{}},a={...n,...e.variables??{},...t?.variables??{}};return Object.keys(a).length>0?r.variables=a:delete r.variables,r}export{Z as a,v as b,Te as c,T as d,O as e,Ae as f,Ie as g,Le as h,Q as i,Pe as j,Ke as k,Ge as l,L as m,We as n,G as o,ze as p,D as q,Xe as r,k as s,st as t,at as u};
|