@testmuai/kane-cli 0.8.6 → 0.8.7
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-S2P7WMBI.js → ChatSurface-3PEXML4X.js} +1 -1
- package/dist/{ChromeProfilePicker-7DTJK2QW.js → ChromeProfilePicker-E3CZ52RH.js} +1 -1
- package/dist/{CliFeedbackPrompt-Y3OYZX54.js → CliFeedbackPrompt-BEVZRLQA.js} +1 -1
- package/dist/{CliUploadProgress-I3N5WDNJ.js → CliUploadProgress-V2FLLVR6.js} +1 -1
- package/dist/ConfigView-ZOGKVFQT.js +2 -0
- package/dist/EvidenceViewOffer-KWX27WNZ.js +2 -0
- package/dist/FolderPicker-EIKQSSF6.js +2 -0
- package/dist/{InfoBox-QBXPPMM2.js → InfoBox-4TNE7QMG.js} +1 -1
- package/dist/{LinksBox-L24KON4U.js → LinksBox-TXO5X5UD.js} +1 -1
- package/dist/{ProfilesView-H6XCTIXI.js → ProfilesView-S4YPEZEF.js} +1 -1
- package/dist/{ProjectPicker-F6JGF2B3.js → ProjectPicker-LWFX2QT2.js} +1 -1
- package/dist/{SaveSessionPrompt-QGO65DZN.js → SaveSessionPrompt-MJTCIQIZ.js} +1 -1
- package/dist/SingleShotApp-5LCIH6DQ.js +2 -0
- package/dist/{SummaryBox-OZIZQY4B.js → SummaryBox-UIVK3QDR.js} +1 -1
- package/dist/TestMdRunView-RE5GX5QX.js +2 -0
- package/dist/{TestrunEvidenceTable-A7WTTKTV.js → TestrunEvidenceTable-GYGVNCYW.js} +1 -1
- package/dist/{WhoamiView-EB5AV27X.js → WhoamiView-NRGMMLL4.js} +1 -1
- package/dist/{app-download-SQ4RDY3E.js → app-download-HTQOD3YF.js} +1 -1
- package/dist/{auth-TW24FZQF.js → auth-5URO2XJU.js} +1 -1
- package/dist/{binary-5LMQJ3CZ.js → binary-2U4YTTFS.js} +1 -1
- package/dist/{bind-SJ6DOVQ4.js → bind-NO4TMSHJ.js} +3 -3
- package/dist/{bootstrap-BTEXO6HX.js → bootstrap-UOEW3VZM.js} +1 -1
- package/dist/bridge-P2EBLXPY.js +2 -0
- package/dist/{changelog-JLSLSA3Y.js → changelog-7BPYLUDK.js} +1 -1
- package/dist/chat-committer-GUK6IBCL.js +2 -0
- package/dist/{chat-controller-R4THYYPU.js → chat-controller-6GUUMUVP.js} +1 -1
- package/dist/{chunk-IWM5EZC3.js → chunk-2RO2BWCZ.js} +2 -2
- package/dist/chunk-3BY7MX3D.js +8 -0
- package/dist/{chunk-USI2WMAK.js → chunk-3IM5QGVV.js} +1 -1
- package/dist/{chunk-PT7V5WDQ.js → chunk-3YKNJIVB.js} +1 -1
- package/dist/{chunk-TKYJTXWL.js → chunk-44PZPNXJ.js} +1 -1
- package/dist/{chunk-FYS5VIOG.js → chunk-46HYKID6.js} +2 -2
- package/dist/{chunk-E5S4BASB.js → chunk-4EFDEDTL.js} +1 -1
- package/dist/chunk-5ZV64NAG.js +5 -0
- package/dist/{chunk-QISE272H.js → chunk-6AUSG5SB.js} +1 -1
- package/dist/{chunk-ATWDQCDA.js → chunk-6YVVTYVO.js} +1 -1
- package/dist/{chunk-GC5U55MW.js → chunk-72J4V3DA.js} +1 -1
- package/dist/{chunk-ZLSWHCWO.js → chunk-76ILJPZF.js} +1 -1
- package/dist/{chunk-3UUPP5W3.js → chunk-7CU5EBC6.js} +1 -1
- package/dist/{chunk-KLTKEGDH.js → chunk-7EFG27IZ.js} +4 -4
- package/dist/{chunk-JCD6FP7A.js → chunk-7UCICMK7.js} +3 -3
- package/dist/{chunk-JN44V63O.js → chunk-7VAE7WXF.js} +2 -2
- package/dist/{chunk-TDS6LG6T.js → chunk-A66ZGHO2.js} +1 -1
- package/dist/chunk-AJXOJF2X.js +4 -0
- package/dist/{chunk-TZFT7R7B.js → chunk-AUERMBX5.js} +1 -1
- package/dist/{chunk-4NSP2NPT.js → chunk-B27X3C2E.js} +1 -1
- package/dist/chunk-B2KXIFZD.js +2 -0
- package/dist/{chunk-WMQJBEQP.js → chunk-BISBPWN3.js} +1 -1
- package/dist/{chunk-GELPKSLC.js → chunk-BPHQNTUD.js} +1 -1
- package/dist/{chunk-JFAFKHDX.js → chunk-BZAGVBCX.js} +1 -1
- package/dist/{chunk-2DCNCH32.js → chunk-C4OVX65Q.js} +1 -1
- package/dist/{chunk-SQGBFCFO.js → chunk-C5ZIKKIB.js} +1 -1
- package/dist/{chunk-DZCG7FFP.js → chunk-C765HUXU.js} +1 -1
- package/dist/{chunk-KQ2MYMOS.js → chunk-DJC6MLO4.js} +1 -1
- package/dist/{chunk-2R7KL7YG.js → chunk-DMOZM22N.js} +1 -1
- package/dist/{chunk-D4SRHIJ5.js → chunk-DSNB7EI6.js} +1 -1
- package/dist/{chunk-TQKIE7AX.js → chunk-DTBKKC2R.js} +1 -1
- package/dist/chunk-E5C3HUIY.js +2 -0
- package/dist/chunk-E5Q5CDOX.js +2 -0
- package/dist/{chunk-VOBXYDJW.js → chunk-E6AF53HZ.js} +42 -43
- package/dist/chunk-EU5ZH334.js +2 -0
- package/dist/{chunk-GFKCTYCA.js → chunk-F43KOMVB.js} +1 -1
- package/dist/{chunk-ZRKPZLLG.js → chunk-F7RR24BL.js} +1 -1
- package/dist/{chunk-MKSTP2XN.js → chunk-FVKLNQ4T.js} +2 -2
- package/dist/{chunk-ZGBSGZZM.js → chunk-GAO6ZMCT.js} +1 -1
- package/dist/chunk-GDB2V6QA.js +21 -0
- package/dist/{chunk-RX5TZZNQ.js → chunk-GJ6RJVXH.js} +1 -1
- package/dist/{chunk-XJILZ2WN.js → chunk-GYTZLUFV.js} +1 -1
- package/dist/{chunk-OYJBABRV.js → chunk-HAGJA7KG.js} +1 -1
- package/dist/{chunk-7KORP5FF.js → chunk-HEWWWMUN.js} +1 -1
- package/dist/{chunk-SQC4P2Q7.js → chunk-HHQ67JCU.js} +1 -1
- package/dist/chunk-HL4UXOHV.js +2 -0
- package/dist/{chunk-DUAXZYAD.js → chunk-HLXOYLZV.js} +3 -3
- package/dist/{chunk-Z35BUPZT.js → chunk-HO3T5LJH.js} +1 -1
- package/dist/{chunk-FJYDEWOA.js → chunk-IJABR5SX.js} +1 -1
- package/dist/chunk-ILKSL4PI.js +4 -0
- package/dist/{chunk-YZ45OEH3.js → chunk-IQBKCLLR.js} +1 -1
- package/dist/{chunk-KDXQNLVV.js → chunk-IRPAWAK7.js} +2 -2
- package/dist/{chunk-3LEVCW6R.js → chunk-K7VX6YIT.js} +1 -1
- package/dist/{chunk-7VZCXW74.js → chunk-LOMPRMG3.js} +1 -1
- package/dist/{chunk-5COGCNED.js → chunk-LRZXVDPY.js} +1 -1
- package/dist/chunk-LWZ7EIXX.js +2 -0
- package/dist/{chunk-YEQVJWEF.js → chunk-MROHDW4W.js} +1 -1
- package/dist/{chunk-OFW3ZVTP.js → chunk-N2N5T5JN.js} +1 -1
- package/dist/{chunk-TYI4MLFJ.js → chunk-NM6PEYED.js} +1 -1
- package/dist/{chunk-RZLD7TPG.js → chunk-NQFAZM2D.js} +1 -1
- package/dist/{chunk-EXERQHXV.js → chunk-OADHU5HL.js} +1 -1
- package/dist/{chunk-S66MCU2Y.js → chunk-OHD4CZXT.js} +1 -1
- package/dist/{chunk-SS5TOK2J.js → chunk-P4JUY54O.js} +1 -1
- package/dist/chunk-Q3S5EKX5.js +21 -0
- package/dist/{chunk-AFPHLUQ5.js → chunk-Q4CTSXDM.js} +1 -1
- package/dist/{chunk-A44G533S.js → chunk-QQ67Z4IW.js} +1 -1
- package/dist/{chunk-NT3UETTV.js → chunk-QZB7CBRO.js} +1 -1
- package/dist/{chunk-FUNKVREV.js → chunk-R2JRQD4I.js} +1 -1
- package/dist/{chunk-CLGC7VEO.js → chunk-SWXEBLKX.js} +1 -1
- package/dist/{chunk-IGJIDN4U.js → chunk-SZTUZZEA.js} +1 -1
- package/dist/{chunk-RDNKYRKY.js → chunk-T3DVIDBA.js} +1 -1
- package/dist/{chunk-B4Q6FMIP.js → chunk-T4LAHU57.js} +3 -3
- package/dist/{chunk-XY325HDJ.js → chunk-TKQSIKMR.js} +1 -1
- package/dist/{chunk-BN6AHQL7.js → chunk-TMFFHGCT.js} +4 -4
- package/dist/{chunk-FMUCZWS3.js → chunk-U35Y7SGB.js} +1 -1
- package/dist/{chunk-V444REBC.js → chunk-UASEGQ7B.js} +1 -1
- package/dist/{chunk-INK66XQS.js → chunk-UFYIQ4E3.js} +1 -1
- package/dist/chunk-UOLERTKE.js +2 -0
- package/dist/{chunk-VMCSRLRC.js → chunk-VHA7UNDW.js} +1 -1
- package/dist/{chunk-P3RKXL3V.js → chunk-VMRP44MN.js} +1 -1
- package/dist/{chunk-4ONGF4NT.js → chunk-VOXDZS4N.js} +1 -1
- package/dist/{chunk-6KPPGMO2.js → chunk-WNHLKDOT.js} +1 -1
- package/dist/chunk-X7R2JWOJ.js +4 -0
- package/dist/chunk-XAQ3Y63J.js +21 -0
- package/dist/chunk-YC2TFACE.js +5 -0
- package/dist/{chunk-AWD56KGX.js → chunk-YC6HYBLN.js} +1 -1
- package/dist/{chunk-AO3PBE2V.js → chunk-YDEK2FJQ.js} +1 -1
- package/dist/chunk-YGVY63PE.js +20 -0
- package/dist/chunk-YKYZKBMH.js +26 -0
- package/dist/{chunk-C4WTZSX4.js → chunk-YYSWJU6H.js} +1 -1
- package/dist/{chunk-VRVFPMCR.js → chunk-Z3EEMIVV.js} +1 -1
- package/dist/{chunk-YHTYPTDD.js → chunk-Z7HUW3L4.js} +1 -1
- package/dist/chunk-Z7S3IWUX.js +2 -0
- package/dist/{chunk-CLLQQPBZ.js → chunk-ZFRWVWUR.js} +1 -1
- package/dist/{chunk-DN3E6RT6.js → chunk-ZH2ROVHE.js} +2 -2
- package/dist/committer-JC6BIBNR.js +2 -0
- package/dist/{config-6TQIMTNB.js → config-XNDP425N.js} +1 -1
- package/dist/cover-cmd-HREOYWWD.js +3 -0
- package/dist/{credentials-ZSNM4BTD.js → credentials-ZTBWB3LK.js} +1 -1
- package/dist/{deps-bundle-D2ZC2SPT.js → deps-bundle-OHCYH5KL.js} +1 -1
- package/dist/{deps-resolve-VRBMFUTX.js → deps-resolve-K2NX2W3K.js} +1 -1
- package/dist/design-committer-IIHKNEYF.js +2 -0
- package/dist/device-ref-LAZWPRQN.js +2 -0
- package/dist/dispatch-JZWIFKRB.js +2 -0
- package/dist/doctor-XXOGVMAI.js +2 -0
- package/dist/dossier-2M62K2PA.js +3 -0
- package/dist/evidence-FN2SQB6Z.js +2 -0
- package/dist/evolve-cmd-WQB7E2B5.js +2 -0
- package/dist/{explain-UAAQWHYR.js → explain-AOZNHWMB.js} +1 -1
- package/dist/{explain-cmd-2TKO7GRW.js → explain-cmd-2SCD5T6U.js} +1 -1
- package/dist/{explain-cmd-EX24XKD6.js → explain-cmd-7VTWRROR.js} +1 -1
- package/dist/{extract-bind-TJ2STXV5.js → extract-bind-3YXY7ZU2.js} +3 -3
- package/dist/{extract-cmd-FLOYO6HL.js → extract-cmd-WGXEJ54C.js} +2 -2
- package/dist/{feeder-C3TOJPKK.js → feeder-GVZSWX6Q.js} +1 -1
- package/dist/gaps-cmd-MFZ52DC7.js +3 -0
- package/dist/{generate-headless-DBT4MKQT.js → generate-headless-PCNAJ2LS.js} +2 -2
- package/dist/index.js +137 -131
- package/dist/ingest-TTSDUMH5.js +2 -0
- package/dist/ingest-cmd-D2MD6EAK.js +2 -0
- package/dist/install-RHINEFR5.js +2 -0
- package/dist/{interactive-bind-7UDJY4CF.js → interactive-bind-ZFMG2JIX.js} +4 -4
- package/dist/lifecycle-cmd-5FRGYY3M.js +2 -0
- package/dist/list-cmd-DD4WYJSH.js +3 -0
- package/dist/{list-commands-DA4ZXOPJ.js → list-commands-64THS67Y.js} +1 -1
- package/dist/logical-ids-U2OUMYCP.js +2 -0
- package/dist/login-flow-B5J6JXQN.js +2 -0
- package/dist/{maintenance-cmd-6XSVO6FO.js → maintenance-cmd-7V44VGL4.js} +1 -1
- package/dist/{mobile-prompts-JS7GPVKS.js → mobile-prompts-RITBS32L.js} +1 -1
- package/dist/{persist-recorded-session-LE3LGFOS.js → persist-recorded-session-Z5SCYWXR.js} +1 -1
- package/dist/phase-seed-ATH337WF.js +2 -0
- package/dist/pipeline-HMFLLUZJ.js +2 -0
- package/dist/prepare-target-HOEFIKXN.js +2 -0
- package/dist/readmodel-UZETCXV6.js +2 -0
- package/dist/reconcile-cmd-Q7CBNPRX.js +2 -0
- package/dist/reconcile-deps-XEUZHUQX.js +4 -0
- package/dist/reconcile-engine-ES2INERY.js +2 -0
- package/dist/{recording-banner-YMKWR3M3.js → recording-banner-NLS7K2RV.js} +1 -1
- package/dist/records-XWF6KDQH.js +2 -0
- package/dist/registry-E5RSXYQJ.js +2 -0
- package/dist/{require-project-folder-3KS7KTME.js → require-project-folder-V4F74R4A.js} +1 -1
- package/dist/resolve-run-intent-WSOCGJUN.js +2 -0
- package/dist/{resolver-V5VP5FLT.js → resolver-7EAM4A6O.js} +1 -1
- package/dist/revert-2UCOMQ4J.js +2 -0
- package/dist/review-cmd-VN6VGUWJ.js +4 -0
- package/dist/run-45ODACZR.js +2 -0
- package/dist/run-ZYARNPAS.js +2 -0
- package/dist/{run-test-md-FO2RNNOD.js → run-test-md-CPGKD3DD.js} +2 -2
- package/dist/{sessions-cmd-ZZIZN2VB.js → sessions-cmd-ME7NM6ES.js} +1 -1
- package/dist/{skill-installer-W4TT5MST.js → skill-installer-WEV2M32J.js} +1 -1
- package/dist/{spawner-ZSYJQGQW.js → spawner-GG6YQB4A.js} +1 -1
- package/dist/{structured-answers-5EY2AZN7.js → structured-answers-2WOTULBQ.js} +1 -1
- package/dist/tcg-generate-DASCY23M.js +2 -0
- package/dist/{testmd-actions-NPILETCQ.js → testmd-actions-X6HEL5NH.js} +1 -1
- package/dist/token-refresh-ZTQFC3Q3.js +2 -0
- package/dist/{validate-basic-727KRHX6.js → validate-basic-QJL4DCKY.js} +1 -1
- package/dist/verdicts-CRNN765C.js +2 -0
- package/dist/{version-check-A2JQYRI2.js → version-check-KONSQ4M3.js} +1 -1
- package/dist/{view-cmd-KPJTP4DI.js → view-cmd-ZSMU4I4J.js} +1 -1
- package/dist/walk-session-X2N4XHLU.js +2 -0
- package/dist/{with-telemetry-HSD6CXDS.js → with-telemetry-Y6MVROKX.js} +1 -1
- package/package.json +11 -11
- package/dist/ConfigView-EOYCKYJS.js +0 -2
- package/dist/EvidenceViewOffer-AQ3KB3EN.js +0 -2
- package/dist/FolderPicker-RCHRYYC4.js +0 -2
- package/dist/SingleShotApp-AY3XFEYT.js +0 -2
- package/dist/TestMdRunView-RPW4MIJA.js +0 -2
- package/dist/bridge-GQJ35GTL.js +0 -2
- package/dist/chat-committer-ZWWCLJFD.js +0 -2
- package/dist/chunk-3Q6WAK6P.js +0 -2
- package/dist/chunk-B5QGIUJA.js +0 -26
- package/dist/chunk-BRTARADN.js +0 -4
- package/dist/chunk-CZUOGGUK.js +0 -2
- package/dist/chunk-DEZ7CXGM.js +0 -21
- package/dist/chunk-ESC7AOCX.js +0 -2
- package/dist/chunk-LN7233E2.js +0 -20
- package/dist/chunk-LQQXPY5B.js +0 -4
- package/dist/chunk-Q4V2GK5U.js +0 -2
- package/dist/chunk-QBG7XEGQ.js +0 -15
- package/dist/chunk-QQAAPFIR.js +0 -2
- package/dist/chunk-R5T4RLF5.js +0 -2
- package/dist/chunk-SORVX3KI.js +0 -7
- package/dist/chunk-TH47OOBV.js +0 -4
- package/dist/chunk-TRJUD3XJ.js +0 -5
- package/dist/chunk-VAYBKR76.js +0 -4
- package/dist/chunk-XQFITNA3.js +0 -2
- package/dist/chunk-ZSXDZI56.js +0 -20
- package/dist/committer-SWEWEYNX.js +0 -2
- package/dist/cover-cmd-7JILZJUK.js +0 -3
- package/dist/design-committer-VYT6NU3T.js +0 -2
- package/dist/dispatch-2PBSJ7YW.js +0 -2
- package/dist/doctor-OWRRDA4Z.js +0 -2
- package/dist/dossier-KTLTGT2X.js +0 -3
- package/dist/evidence-NDAKCCHQ.js +0 -2
- package/dist/evolve-cmd-DIA5EWUT.js +0 -2
- package/dist/gaps-cmd-3ZX3PZF4.js +0 -3
- package/dist/ingest-JO5NJENZ.js +0 -2
- package/dist/ingest-cmd-T6HM3AHK.js +0 -2
- package/dist/install-NIVU4XVS.js +0 -2
- package/dist/lifecycle-cmd-O2324GN6.js +0 -2
- package/dist/list-cmd-N4KMA34H.js +0 -3
- package/dist/logical-ids-TEBCQJGO.js +0 -2
- package/dist/login-flow-NHBJVDW6.js +0 -2
- package/dist/phase-seed-DIRETNU6.js +0 -2
- package/dist/pipeline-MTAZDCZR.js +0 -2
- package/dist/prepare-target-YK2DLDWB.js +0 -2
- package/dist/readmodel-XOYGGQ3S.js +0 -2
- package/dist/reconcile-cmd-CYRYVS5B.js +0 -2
- package/dist/reconcile-deps-FYXRAMF2.js +0 -4
- package/dist/reconcile-engine-6AT6EVGS.js +0 -2
- package/dist/records-IOZTZUZV.js +0 -2
- package/dist/registry-V45ZQ6Q5.js +0 -2
- package/dist/resolve-run-intent-W32G6WM6.js +0 -2
- package/dist/revert-NQ7GEVSE.js +0 -2
- package/dist/review-cmd-DQRKQUMG.js +0 -4
- package/dist/run-26IR3CKX.js +0 -2
- package/dist/run-5IYI2TJI.js +0 -2
- package/dist/tcg-generate-ONLV5GXG.js +0 -2
- package/dist/token-refresh-G2CSTY4B.js +0 -2
- package/dist/types-O23GN2YM.js +0 -2
- package/dist/verdicts-TDJLJJ3F.js +0 -2
- package/dist/walk-session-HB3OOWVR.js +0 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{c as b,d as _}from"./chunk-NVGBE2DR.js";import{a as g,c as h}from"./chunk-CUM23TLF.js";import{
|
|
2
|
+
import{c as b,d as _}from"./chunk-NVGBE2DR.js";import{a as g,c as h}from"./chunk-CUM23TLF.js";import{j as S}from"./chunk-HLXOYLZV.js";import{d as f,f as v}from"./chunk-WXHQYYD5.js";var V=n=>`conv#turn=${n}`;function E(n,o){for(let t of n.split(`
|
|
3
3
|
`))if(t.trim())try{let r=JSON.parse(t);if(r.turn===o)return r.text}catch{}return null}var y={format:"conversation",media_type:"text/x-conversation",anchors_supported:["#turn="]};function $(n){let{contextDir:o,graph:t,sessionStamp:r}=n,e=`su-conv-${r}`,u=t.heads.get(e);if(typeof u=="string")return{record:null,errors:[{code:"CONV_SOURCE_EXISTS",detail:`${e} already exists \u2014 resume it`}],sourceId:e,cid:u};let i=b(o,Buffer.from("","utf8")),c=h(e,i),a=v("source",c);if(a.length>0)return{record:null,errors:a.map(s=>({code:s.code,detail:s.detail})),sourceId:e,cid:""};let d=g("source",c);return{record:S(o,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:d,label:f.SOURCE,content:c}],edges:[],review:[],supersessions:[],source_head_moves:{[e]:d},media:{[e]:y},conv:{source_id:e,turn:0,append_of:null}},{expectPrev:t.latestHash}).record,errors:null,sourceId:e,cid:d}}function G(n){let{contextDir:o,graph:t,sourceId:r,text:e,force:u}=n,i=t.heads.get(r),c=t.convChains.get(r);if(typeof i!="string"||!c)return{record:null,errors:[{code:"CONV_SOURCE_MISSING",detail:`${r} is not a live conversation source`}]};let d=t.getNode(i)?.content?.blob;if(typeof d!="string")return{record:null,errors:[{code:"CONV_SOURCE_MISSING",detail:`${r} head node unreadable`}]};let l=_(o,d)?.toString("utf8")??"",s=c.turns;if(!u&&s>0&&E(l,s)===e)return{record:null,errors:null,turn:s,cid:i,idempotent:!0};let p=s+1,C=`${l}${JSON.stringify({turn:p,text:e})}
|
|
4
4
|
`,O=b(o,Buffer.from(C,"utf8")),x=h(r,O),m=g("source",x);return{record:S(o,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:m,label:f.SOURCE,content:x}],edges:[],review:[],supersessions:[],source_head_moves:{[r]:m},media:{[r]:y},conv:{source_id:r,turn:p,append_of:i}},{expectPrev:t.latestHash}).record,errors:null,turn:p,cid:m,idempotent:!1}}export{V as a,E as b,$ as c,G as d};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as m,c}from"./chunk-EYOCNMUM.js";import{c as b,j as v}from"./chunk-N2N5T5JN.js";import{readFileSync as w,writeFileSync as C,mkdirSync as y,existsSync as k}from"fs";import{dirname as x}from"path";var f={window_size:{width:1920,height:1080},chrome_profile_path:"",default_url:v,model:"v16-alpha",project_id:null,project_name:null,folder_id:null,folder_name:null,mode:"testing",assertion_mode:"dom",network_ws:!1,network_sse:!1,bug_detection:"off",final_validation:!1,code_export:{enabled:!0,language:"python",skip_validation:!0},generate:{scenario_limit:2,per_scenario_limit:3,memory_enabled:!1},last_seen_version:"",hints_enabled:!0};function T(o){let{mobile:e,...i}=o,t={...i};delete t.target,delete t.device,delete t.device_name,delete t.os_version,delete t.app;let n=e??{};n.tui_target&&(t.target=n.tui_target);let s=n.default_target?.name?.trim(),l=n.default_target?.os_version?.trim();if(s||l)s&&(t.device_name=s),l&&(t.os_version=l);else{let r=n.default_target?.id?.trim();r&&(t.device=r)}n.default_app&&(t.app=n.default_app);let a={};return n.no_reset!==void 0&&(a.no_reset=n.no_reset),n.appium_url!==void 0&&(a.appium_url=n.appium_url),n.auto_grant_permissions!==void 0&&(a.auto_grant_permissions=n.auto_grant_permissions),n.auto_accept_alerts!==void 0&&(a.auto_accept_alerts=n.auto_accept_alerts),Object.keys(a).length>0&&(t.mobile=a),t}function S(o){let e=o.mobile??{},i=typeof o.target=="string"?o.target:void 0,t=typeof o.device=="string"&&o.device.trim()!==""?o.device.trim():void 0,n=g=>typeof g=="string"&&g.trim()!==""?g.trim():void 0,s=n(o.device_name),l=n(o.os_version),a=typeof o.app=="string"&&o.app!==""?o.app:void 0,r={},u=i??e.tui_target;u&&(r.tui_target=u);let _=m(u,void 0).kind,d=_==="emulator"||_==="simulator"?_:null;d&&(s||l)?r.default_target={platform:c(d),kind:d,...s?{name:s}:{},...l?{os_version:l}:{}}:d&&t?r.default_target={platform:c(d),kind:d,id:t}:(e.default_target?.id?.trim()||e.default_target?.name?.trim())&&(r.default_target=e.default_target);let p=a??e.default_app;return p&&(r.default_app=p),e.no_reset!==void 0&&(r.no_reset=e.no_reset),e.appium_url!==void 0&&(r.appium_url=e.appium_url),e.auto_grant_permissions!==void 0&&(r.auto_grant_permissions=e.auto_grant_permissions),e.auto_accept_alerts!==void 0&&(r.auto_accept_alerts=e.auto_accept_alerts),Object.keys(r).length>0?r:void 0}var h=class{constructor(e=b){this.path=e}exists(){return k(this.path)}load(){try{let e=w(this.path,"utf-8"),i=JSON.parse(e),t=S(i),{target:n,device:s,app:l,...a}=i;return{...f,...a,...t?{mobile:t}:{},code_export:{...f.code_export,...i.code_export??{}},generate:{...f.generate,...i.generate??{}}}}catch{return{...f,code_export:{...f.code_export},generate:{...f.generate}}}}write(e){try{y(x(this.path),{recursive:!0}),C(this.path,JSON.stringify(T(e),null,2)+`
|
|
3
|
+
`)}catch(i){let t=i instanceof Error?i.message:String(i);process.stderr.write(`[config] Failed to save config: ${t}
|
|
4
|
+
`)}}set(e,i){let t=this.load();t[e]=i,this.write(t)}save(e){this.write({...this.load(),...e})}getMobile(){return this.load().mobile??{}}setMobile(e){let i={...this.getMobile()};for(let t of Object.keys(e)){let n=e[t];n===void 0?delete i[t]:i[t]=n}this.set("mobile",Object.keys(i).length>0?i:void 0)}writeRaw(e){this.write(e)}};export{h as a};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{d as wt,g as _t}from"./chunk-5DBK6QNS.js";import{b as ve,c as Y,d as ye,e as we}from"./chunk-NQFAZM2D.js";import{b as y,c as fe,d as ct,f as me,g as ge}from"./chunk-5GUD3CIH.js";import{a as dt,e as L,f as ut,g as lt,h as G,i as pt,j as Z,k as ft,l as F,m as mt}from"./chunk-GDB2V6QA.js";import{a as B,b as z,d as at}from"./chunk-EHN5HTUD.js";import{d as xt}from"./chunk-NVGBE2DR.js";import{a as re}from"./chunk-CH273NAE.js";import{b as A,c as _}from"./chunk-VZ7KXRXB.js";import{a as le,c as it,d as ot,e as st,f as pe}from"./chunk-P7YZ3PU3.js";import{C as x,e as vt,f as yt}from"./chunk-AJXOJF2X.js";import{b as W}from"./chunk-ILKSL4PI.js";import{a as ht}from"./chunk-CUM23TLF.js";import{b as he,d as ee,g as te,j as q}from"./chunk-HLXOYLZV.js";import{d as U,f as gt}from"./chunk-WXHQYYD5.js";import{a as rt,b as nt}from"./chunk-HHQ67JCU.js";import{a as tt}from"./chunk-N2N5T5JN.js";function D(e){if(e===null)return"broken";let t=Math.floor(e/100);return t===1?"passed":t===7?"failed":t===2?"skipped":"broken"}var C={failed:3,broken:2,passed:1,skipped:0};function _e(e){let t="skipped";for(let r of e)C[r]>C[t]&&(t=r);return t}import{createHash as cr}from"crypto";import{basename as dr}from"path";function xe(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40);return t.length>0?t:"session"}function be(e){return cr("sha256").update(e).digest("hex").slice(0,8)}function ke(e){let t=dr(e).replace(/_test\.md$/i,"").replace(/\.md$/i,"");return`${xe(t)}-${be(e)}`}function Se(e,t){return`${xe(e)}-${be(t)}`}function Ee(e){let t={};for(let[r,n]of Object.entries(e))typeof n=="string"&&n.length>0&&(t[r]=n);return t}function ur(e,t){return{pack_test_dir:e,ordinal_offset:t}}import{promises as k}from"fs";import{join as E}from"path";function Ie(e){let t={evidence:"0.1",run_id:e.execution_id,status:"running",title:e.title,started:e.started,environment:{producer:{name:"kane-cli",version:e.producerVersion},...e.surfaces?{surfaces:e.surfaces}:{},run_kind:e.run_kind,origin:e.origin,pid:e.pid},...e.credits!==void 0?{metrics:{credits:{value:e.credits,type:"count"}}}:{}};return _(t,{lineWidth:-1})}async function Re(e,t,r,n=process.cwd(),i){let o=i??y(e.execution_id,n),s=E(o,"tests",t);return await k.mkdir(E(o,"coverage"),{recursive:!0}),await k.writeFile(E(o,"coverage",".keep"),""),await k.mkdir(s,{recursive:!0}),await k.writeFile(E(o,"run.yaml"),Ie(e)),r&&await k.writeFile(E(s,r.path),r.content),o}async function lr(e,t=process.cwd()){let r=y(e.execution_id,t);await k.mkdir(E(r,"coverage"),{recursive:!0}),await k.writeFile(E(r,"coverage",".keep"),"");let n=A(Ie(e));return n.environment&&delete n.environment.run_kind,await k.writeFile(E(r,"run.yaml"),_(n,{lineWidth:-1})),r}async function pr(e,t=process.cwd()){return z(y(e,t),new Date().toISOString())}async function Pe(e,t=process.cwd()){await k.rm(y(e,t),{recursive:!0,force:!0})}import{promises as $e}from"fs";import{join as Ae}from"path";function ne(e){let t={evidence:"0.1",test:e.testId,status:e.status,...e.durationMs!==void 0?{duration_ms:e.durationMs}:{},...e.attempts&&e.attempts.length?{attempts:e.attempts}:{},...e.flaky!==void 0?{flaky:e.flaky}:{},...e.adaptiveHeal?{adaptive_heal:e.adaptiveHeal}:{},...e.definitionPath?{definition:{path:e.definitionPath}}:{},...e.definitionId?{definition_id:e.definitionId}:{},...e.assuranceId?{assurance_id:e.assuranceId}:{},...Object.keys(e.externalId).length?{external_id:e.externalId}:{},...e.tags&&e.tags.length?{tags:e.tags}:{},...Object.keys(e.environment).length?{environment:e.environment}:{},steps:e.steps};return _(t,{lineWidth:-1})}function Le(e){return _({logs:e},{lineWidth:-1})}async function Fe(e,t,r){await $e.writeFile(Ae(e,"tests",t,"result.yaml"),r)}async function Ce(e,t,r){let n=Ae(e,"tests",t,"logs");await $e.mkdir(n,{recursive:!0}),await $e.writeFile(Ae(n,"meta.yaml"),r)}import{promises as ie}from"fs";import{join as bt}from"path";function kt(e){return bt(e,".internal","meta.json")}async function St(e){let t;try{t=await ie.readFile(kt(e),"utf8")}catch(n){if(n?.code==="ENOENT")return null;throw n}let r=JSON.parse(t);if(!r||typeof r!="object"||Array.isArray(r))throw new Error("meta.json is not a JSON object");return r}async function De(e,t){let r;try{r=await St(e)??{}}catch(s){console.warn(`evidence: meta.json at ${e} unreadable \u2014 skipping execution-pointer append to preserve identity`,s);return}let n=Array.isArray(r.executions)?r.executions:[];n.push(t),r.executions=n,await ie.mkdir(bt(e,".internal"),{recursive:!0});let i=kt(e),o=`${i}.tmp-${process.pid}-${Date.now()}`;await ie.writeFile(o,JSON.stringify(r,null,2)+`
|
|
3
|
+
`),await ie.rename(o,i)}async function fr(e){try{let t=await St(e);return t&&Array.isArray(t.executions)?t.executions:[]}catch{return[]}}async function mr(e,t,r=process.cwd()){let n=await me(e,r);if(!n){let o=`evidence: no pack found for "${e}"`;return t.json?console.log(JSON.stringify({valid:!1,error:"not_found",target:e})):console.error(o),2}let i=await B(n,t.profile??"L1");return t.json?console.log(JSON.stringify({valid:i.valid,status:i.status,diagnostics:i.diagnostics})):console.log(`evidence: ${i.valid?"valid":"INVALID"} (${t.profile??"L1"}, status ${i.status})`),i.valid?0:1}function Oe(e){let t=[];for(let r of e){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)t.push(D(i))}return _e(t)}function gr(e){let t=null;for(let r of e){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)i!=null&&(t==null||C[D(i)]>C[D(t)]||C[D(i)]===C[D(t)]&&i>t)&&(t=i)}return t}import{promises as hr}from"fs";import{extname as Et,basename as vr}from"path";var yr={".ndjson":"ndjson",".log":"log",".json":"json",".har":"har"};async function je(e){let t;try{t=await hr.readdir(e)}catch{return[]}return t.filter(r=>r!=="meta.yaml"&&!r.startsWith(".")).sort().map(r=>({name:vr(r,Et(r)),file:r,format:yr[Et(r)]??"txt"}))}import{mkdirSync as wr,appendFileSync as _r}from"fs";import{join as It}from"path";function Me(e,t){return It(e,"tests",t,"logs")}function Te(e,t,r,n={},i){try{i?.(t,r,r,n)}catch{}if(e)try{wr(e,{recursive:!0});let o=JSON.stringify({ts:new Date().toISOString(),level:t,event:r,...n})+`
|
|
4
|
+
`;_r(It(e,"diagnostics.ndjson"),o)}catch{}}import{promises as I}from"fs";import{dirname as $r,join as O}from"path";import{statSync as xr}from"fs";import{promises as Ne}from"fs";import{basename as br,join as kr}from"path";var Sr=1e6,Er=2e6;function Ir(){return rt.map(e=>nt(e))}function Rt(e=Ir()){return e.map(t=>{let r=0;try{r=xr(t).size}catch{}return{path:t,offset:r}})}var Rr=/\x1b\[[0-9;]*[A-Za-z]/g;async function Pr(e,t,r){let n;try{n=await Ne.open(e,"r");let i=(await n.stat()).size,o=t<=i?t:0,s=i-o;if(s<=0)return null;let a=s>r?i-r:o,u=Buffer.alloc(Math.min(s,r));return await n.read(u,0,u.length,a),u.toString("utf8")}catch{return null}finally{await n?.close().catch(()=>{})}}async function Pt(e,t){let r=t.caps?.stderr??Sr,n=t.caps?.appium??Er,i=[];t.runnerStderrPath&&i.push({src:t.runnerStderrPath,from:0,cap:r});for(let o of t.appiumMarks??[])i.push({src:o.path,from:o.offset,cap:n});for(let o of i){let s=await Pr(o.src,o.from,o.cap);if(s===null)continue;let a=s.replace(Rr,"");if(a!=="")try{await Ne.mkdir(e,{recursive:!0}),await Ne.writeFile(kr(e,br(o.src)),a)}catch{}}}async function Ar(e){try{let t=O(e,"tests"),r=await I.readdir(t).catch(()=>[]);for(let n of r){let i=O(t,n,"steps"),o=await I.readdir(i).catch(()=>[]);for(let s of o){let a=await I.readFile(O(i,s,"failure.yaml"),"utf8").catch(()=>null);if(a!=null)try{let u=A(a);if(u&&typeof u=="object"&&u.triage)return!0}catch{}}}}catch{}return!1}async function $t(e,t,r,n={}){let i=O(e,"tests",t,"logs");if(r)try{await I.mkdir(i,{recursive:!0}),await I.copyFile(r,O(i,"tui.log"))}catch{}await Pt(i,{runnerStderrPath:r?O($r(r),"runner-stderr.log"):void 0,appiumMarks:n.appiumMarks});let o=await je(i);if(!o.length&&n.requireRealLog)throw new Error(`evidence test ${t} has no real log to declare`);o.length&&await Ce(e,t,Le(o))}async function Ve(e){let t=e.cwd??process.cwd(),r=e.packDir??y(e.executionId,t);if(!e.saved&&!e.packDir)return await Pe(e.executionId,t),{sealed:!1};await $t(r,e.testId,e.tuiLogPath,{requireRealLog:e.requireRealLog,appiumMarks:e.appiumMarks});let n=O(r,"run.yaml"),i=A(await I.readFile(n,"utf8"));i.environment={...i.environment??{},saved:e.saved,run_kind:e.runKind},await I.writeFile(n,_(i,{lineWidth:-1}));let o=await I.open(n,"r+");try{await o.sync()}finally{await o.close()}let s=await Ar(r);await z(r,new Date().toISOString());let a;try{let d=await B(r,"L1");a=d.valid;let l=(d.diagnostics??[]).filter(c=>String(c?.code??"").includes("failure.status_disagrees"));if(l.length>0)if(e.expectStatusDisagrees||s){let c=e.expectStatusDisagrees?"expected under --bug-detection continue":"self-explained by triaged failure record(s)";console.warn(`evidence: ${l.length} status_disagrees advisory(ies) \u2014 ${c}`)}else console.warn(`evidence: ${l.length} status_disagrees advisory(ies) \u2014 step verdicts disagree with their failure records`,l);if(!d.valid){console.warn(`evidence: sealed pack ${e.executionId} failed L1 validation`,d.diagnostics);let c=String(d.diagnostics?.[0]?.code??"");Te(Me(r,e.testId),"warn","EVIDENCE_INVALID",{execution_id:e.executionId,first_code:c,surface:e.surface??"testmd"},e.log)}}catch(d){console.warn(`evidence: validation error for ${e.executionId}`,d)}let u;if(e.saved&&e.packDir)try{u=await ct(r,e.executionId,t)}catch(d){console.warn(`evidence: store install failed for ${e.executionId}`,d)}if(e.outputStemDir)try{await De(e.outputStemDir,{execution_id:e.executionId,run_kind:e.runKind,status:e.verdict,valid:a,at:new Date().toISOString()})}catch(d){console.warn(`evidence: execution-pointer append failed for ${e.executionId} (pack is sealed)`,d)}return{sealed:!0,valid:a,storePath:u}}import{release as Dt}from"os";import{execFileSync as Lr}from"child_process";import{promises as At}from"fs";import{join as Lt}from"path";function Ft(e){return e.replace(/\([^)]*\)/g," ").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||void 0}async function Ct(e){try{let t=Lt(e,"steps"),r=(await At.readdir(t,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name).sort((n,i)=>(parseInt(n,10)||0)-(parseInt(i,10)||0));for(let n of r)try{let i=await At.readFile(Lt(t,n,"step.json"),"utf8"),s=JSON.parse(i).basis?.window;if(Array.isArray(s)&&s.length===2&&Number.isFinite(Number(s[0]))&&Number.isFinite(Number(s[1]))&&Number(s[0])>0&&Number(s[1])>0)return`${Math.round(Number(s[0]))}x${Math.round(Number(s[1]))}`}catch{}return}catch{return}}var Ot=!1,oe;function Fr(){if(!Ot)if(Ot=!0,process.platform==="darwin")try{oe=Lr("sw_vers",["-productVersion"],{timeout:2e3}).toString().trim()||void 0}catch{oe=Dt()||void 0}else oe=Dt()||void 0;return oe}function Be(e){let t={os:le(process.platform)},r=Fr();if(r&&(t.os_version=r),e.cdpBrowser){let i=/^([A-Za-z]+)\/(\d+)/.exec(e.cdpBrowser);i&&(t.browser=i[1].replace(/^Headless/,""),t.browser_version=i[2])}e.resolution&&(t.resolution=e.resolution);let n=ot(t,e.runnerEnvironment);if(!n.native_platform)return n;if(e.deviceName&&(n.device=e.deviceName),e.deviceModel){let i=Ft(e.deviceModel);i&&(n.device_slug=i)}return e.pixelResolution&&(n.viewport=n.resolution??Cr(e.pixelResolution,n.pixel_ratio)??e.pixelResolution,n.resolution=e.pixelResolution),n}function Cr(e,t){if(!t||!Number.isFinite(t)||t<=0)return;let r=/^(\d+)x(\d+)$/.exec(e);if(r)return`${Math.round(Number(r[1])/t)}x${Math.round(Number(r[2])/t)}`}async function jt(e){if(e)try{let t=await fetch(`${e}/json/version`,{signal:AbortSignal.timeout(2e3)});if(!t.ok)return;let r=await t.json();return typeof r.Browser=="string"?r.Browser:void 0}catch{return}}function Dr(e){let t;return()=>(t||(t=jt(e)),t)}import{promises as R,existsSync as P,readFileSync as Tr}from"fs";import{basename as Nr,join as h}from"path";import{readFileSync as Or}from"fs";import{dirname as jr,resolve as Mr}from"path";function Mt(e,t){let r=Mr(e),n=Or(r,"utf8");return L(t?G(n,Z(jr(r),t)):n)}var H=class e{constructor(t){this.opts=t}executionId;testId;definitionPath=null;definitionContent=null;accumulatedSteps=[];maxOrdinal=0;_attempts=[];_packDirOverride;_attached=!1;appiumMarks=Rt();get attached(){return this._attached}static async attach(t){let r=Nr(t.packDir).replace(/\.evidence$/,""),n=new e({origin:"testrun",runKind:"author",pid:process.pid,title:t.testId,started:new Date().toISOString(),producerVersion:tt,cwd:t.cwd});n.executionId=r,n.testId=t.testId,n._packDirOverride=t.packDir,n._attached=!0;let i=h(t.packDir,"tests",t.testId);return await R.mkdir(i,{recursive:!0}),t.definition&&(await R.writeFile(h(i,t.definition.path),t.definition.content),n.definitionPath=t.definition.path,n.definitionContent=t.definition.content),n}async start(){if(this._attached)throw new Error("attach-mode session is already started");this.executionId=fe(),this.testId=this.opts.testmdRelPath?ke(this.opts.testmdRelPath):Se(this.opts.objectiveOrName??"session",this.opts.sessionId??this.executionId);let t=this.opts.definition??null;return await Re({execution_id:this.executionId,title:this.opts.title,started:this.opts.started,producerVersion:this.opts.producerVersion,surfaces:this.opts.surfaces,run_kind:this.opts.runKind,origin:this.opts.origin,pid:this.opts.pid,...this.opts.credits!==void 0?{credits:this.opts.credits}:{}},this.testId,t,this.opts.cwd,this.opts.packRootDir?this.pack:void 0),t&&(this.definitionPath=t.path,this.definitionContent=t.content),{executionId:this.executionId,testId:this.testId,packTestDir:this.packTestDir}}get pack(){return this._packDirOverride?this._packDirOverride:this.opts.packRootDir?h(this.opts.packRootDir,`${this.executionId}.evidence`):y(this.executionId,this.opts.cwd)}get packTestDir(){return h(this.pack,"tests",this.testId)}async writeDefinition(t,r="test.md"){await R.writeFile(h(this.packTestDir,r),t),this.definitionPath=r,this.definitionContent=t}computeAssuranceId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let t=h(this.opts.cwd,this.opts.testmdRelPath);if(P(t))return F(Tr(t,"utf8"))?.id}}catch{}}computeDefinitionId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let t=h(this.opts.cwd,this.opts.testmdRelPath),r=h(this.opts.cwd,".context"),n=P(r)?x(r):void 0;if(P(t))return Mt(t,n)}if(this.definitionContent!=null)return L(this.definitionContent)}catch{}}noteSpawn(t){this.accumulatedSteps.push(...t.steps),this.maxOrdinal=Math.max(this.maxOrdinal,t.maxOrdinal)}nextOrdinalOffset(){return this.maxOrdinal}get steps(){return this.accumulatedSteps}get attempts(){return this._attempts}async archiveAttempt(t,r){let n=this._attempts.length+1,i=h(this.packTestDir,String(n)),o;try{await R.mkdir(i,{recursive:!0});for(let a of["steps","logs","v16-trajectory"]){let u=h(this.packTestDir,a);P(u)&&await R.rename(u,h(i,a))}this.definitionPath&&P(h(this.packTestDir,this.definitionPath))&&await R.copyFile(h(this.packTestDir,this.definitionPath),h(i,this.definitionPath));let s=h(i,"steps");if(P(s)){for(let a of await R.readdir(s))if(P(h(s,a,"failure.yaml"))){o=`${n}/steps/${a}/failure.yaml`;break}}}catch{}return this._attempts.push({n,status:t,steps:this.accumulatedSteps,...r!==void 0?{failedAt:r}:{},...o?{failure:o}:{}}),this.accumulatedSteps=[],this.maxOrdinal=0,n}async writeResult(t){let r=Oe(t.spawns),n=this._attempts.length?[...this._attempts.map(c=>({status:c.status})),{status:r,...t.durationMs!==void 0?{duration_ms:t.durationMs}:{}}]:void 0,i=n?new Set(n.map(c=>c.status)).size>1:void 0,o=this._attempts.length?{triggered:!0,outcome:r==="passed"?"healed":"exhausted",attempts:this._attempts.map(c=>({n:c.n,status:c.status,failed_at:c.failedAt??-1,...c.failure?{failure:c.failure}:{}}))}:void 0,s=this.pack,a=Ee(t.externalIdInput),u=pe(t.runnerEnv,t.intentEnv),d=this.computeDefinitionId(),p=this.computeAssuranceId();await Fe(s,this.testId,ne({testId:this.testId,status:r,durationMs:t.durationMs,definitionPath:this.definitionPath,definitionId:d,assuranceId:p,externalId:a,environment:u,steps:t.steps,tags:t.tags,attempts:n,flaky:i,adaptiveHeal:o}));for(let c of this._attempts){let f=h(this.packTestDir,String(c.n));P(f)&&await R.writeFile(h(f,"result.yaml"),ne({testId:this.testId,status:c.status,definitionPath:this.definitionPath,definitionId:d,assuranceId:p,externalId:a,environment:u,steps:c.steps,tags:t.tags}))}let l=t.externalIdInput;return t.log&&(l.commit_id||l.test_id||l.testcase_id)&&t.log("info","EVIDENCE_EXTERNAL_ID","Evidence external-id mapping",{execution_id:this.executionId,commit_id:l.commit_id??null,test_id:l.test_id??null,testcase_id:l.testcase_id??null,project_id:l.project_id??null,session_id:l.session_id??null,session_name:l.session_name??null}),r}get id(){return this.executionId}get test(){return this.testId}};async function Vr(e,t,r=ge){try{let n=await r(e);if(n.aborted.length>0||n.removed.length>0)try{t?.("info","EVIDENCE_RECOVERY","Startup evidence recovery swept incomplete packs",{aborted:n.aborted,removed:n.removed,origin:"startup"})}catch{}return n}catch(n){return console.warn("evidence: startup recovery failed",n),{aborted:[],removed:[]}}}import{promises as dn}from"fs";import{existsSync as qe,mkdirSync as tn,readdirSync as rn,readFileSync as nn,rmSync as on,statSync as sn,writeFileSync as an}from"fs";import{join as T}from"path";import{mkdirSync as Br,renameSync as zr,rmSync as Gr,writeFileSync as Ur}from"fs";import{join as Tt}from"path";var qr=5e6;function Nt(e,t,r){let n=Tt(e,"coverage","sources"),i=new Map,o=!1;try{for(let s of r.usecases)for(let a of s.sources){if(i.has(a.id)){a.file=i.get(a.id);continue}if(!a.cid)continue;let u=xt(t,a.cid);if(u===null||u.byteLength>qr)continue;o||(Br(n,{recursive:!0}),o=!0);let d=Tt(n,a.id),p=`${d}.tmp-${process.pid}`;Ur(p,u),zr(p,d);let l=`coverage/sources/${a.id}`;i.set(a.id,l),a.file=l}}catch{for(let s of r.usecases)for(let a of s.sources)delete a.file;if(o)try{Gr(n,{recursive:!0,force:!0})}catch{}}}import{appendFileSync as Ht,existsSync as j,readFileSync as $,renameSync as Kt,writeFileSync as Jt}from"fs";import{dirname as Ge,isAbsolute as ae,join as M,resolve as ce}from"path";var Wr=new Set(["inline","testmd","testrun"]),Yr=new Set(["inferred","authored","runtime-derived"]),se=new Set(["passed","failed","broken","skipped"]);function Vt(e,t,r){if(r.facts.length===0)return{record:null,errors:[{code:"EMPTY_EXECUTIONS",detail:"a run with no designed units attaches no facts \u2014 skip the call"}]};let n=t;for(let i=0;;i++){let o=te(e);if(n.latestHash!==o){if(i>=3)return{record:null,errors:[{code:"STALE_BASIS",detail:`graph opened at ${String(n.latestHash)} but chain head is ${String(o)} \u2014 retry budget exhausted`}]};n=x(e);continue}let s=Hr(e,n,r);if(s!=="cas")return s;if(i>=3)return{record:null,errors:[{code:"STALE_BASIS",detail:"concurrent appends kept moving the head \u2014 retry budget exhausted"}]};n=x(e)}}function Bt(e,t){return Wr.has(e.mode)?se.has(e.verdict)?Yr.has(e.oracle_mode)?typeof e.drift_flag!="boolean"||typeof e.stale_at_run!="boolean"?[{code:"MISSING_FIELD",detail:`${t}: drift_flag and stale_at_run are required booleans`}]:!e.execution_id||!e.started_at||!e.definition_id_at_run?[{code:"MISSING_FIELD",detail:`${t}: execution_id, started_at and definition_id_at_run are required`}]:[]:[{code:"BAD_ORACLE_MODE",detail:`${t}: oracle_mode '${e.oracle_mode}' not in inferred|authored|runtime-derived`}]:[{code:"BAD_VERDICT",detail:`${t}: verdict '${e.verdict}' not in ${[...se].join("|")}`}]:[{code:"BAD_MODE",detail:`${t}: mode '${e.mode}' not in inline|testmd|testrun`}]}function zt(e,t,r,n){return{about:t,definition_id_at_run:e.definition_id_at_run,verdict:e.verdict,...r&&r.length?{per_ac:r}:{},drift_flag:e.drift_flag,oracle_mode:e.oracle_mode,stale_at_run:e.stale_at_run,...n.length?{unresolved_acs:n}:{},execution_id:e.execution_id,...e.evidence_id?{evidence_id:e.evidence_id}:{},...e.duration_ms!==void 0?{duration_ms:e.duration_ms}:{},started_at:e.started_at,mode:e.mode,local:e.local,...e.via_parent?{via_parent:e.via_parent}:{}}}function Gt(e,t){if(!Array.isArray(t.facts)||t.facts.length===0)return{record:null,errors:[{code:"EMPTY_EXECUTIONS",detail:"parked line carries no facts"}]};for(let r=0;;r++){let n=x(e),i=t.facts.filter(d=>n.appliedEvents.has(d.event_id)).map(d=>d.event_id),o=t.facts.filter(d=>!n.appliedEvents.has(d.event_id));if(o.length===0)return{record:null,errors:null,applied:[],skipped:i,rejected:[]};let s=[],a=[],u=[];for(let d of o){let p=`executions[${d.ref}]`,l=[];if(!d.about_cid||!n.hasNode(d.about_cid))l.push({code:"UNKNOWN_REF",detail:`${p}: about_cid '${String(d.about_cid)}' is not in the graph \u2014 the pinned run-time target is gone`});else if(n.nodeLabel.get(d.about_cid)!==U.TEST)l.push({code:"ILLEGAL_TARGET",detail:`${p}: execution facts attach to tests \u2014 '${d.about_cid}' is a ${n.nodeLabel.get(d.about_cid)}`});else if(!d.event_id)l.push({code:"MISSING_FIELD",detail:`${p}: parked facts require event_id`});else{l.push(...Bt(d,p));for(let m of d.per_ac??[])se.has(m.verdict)||l.push({code:"BAD_VERDICT",detail:`${p}.per_ac['${m.ac_ref}']: verdict '${m.verdict}'`})}if(l.length>0){s.push({event_id:d.event_id??"",errors:l});continue}let c=[],f=[...d.unresolved_acs??[]];for(let m of d.per_ac??[]){let g=n.resolve(m.ac_ref),w=g?n.tipOf(g.cid):null;if(!g||!w||n.superseded.has(w)||n.nodeLabel.get(w)!==U.AC){f.push(m.ac_ref);continue}c.push({ac_ref:n.nameOf.get(w)??w,verdict:m.verdict})}a.push(zt(d,d.about_cid,c,f)),u.push(d.event_id)}if(a.length===0)return{record:null,errors:null,applied:[],skipped:i,rejected:s};try{let d=q(e,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[],executions:a,event_ids:[...u].sort(),source_head_moves:{}},{expectPrev:n.latestHash,busyRetry:{deadlineMs:5e3}}),p;try{W(e)}catch(l){p=`parked facts committed, but the projection refresh failed (${l instanceof Error?l.message:String(l)}) \u2014 read state rebuilds on the next open`}return{record:d.record,errors:null,applied:u,skipped:i,rejected:s,...p?{warnings:[p]}:{}}}catch(d){if(!(d instanceof he))throw d;if(r>=3)return{record:null,errors:[{code:"STALE_BASIS",detail:"concurrent appends kept moving the head \u2014 parked replay retry budget exhausted (line stays queued)"}]}}}}function Hr(e,t,r){let n=[],i=[];for(let a of r.facts){let u=`executions[${a.ref}]`,d=t.resolve(a.ref),p=d?t.tipOf(d.cid):null;if(!d||!p||t.superseded.has(p)){n.push({code:"UNKNOWN_REF",detail:`${u}: '${a.ref}' is not a live committed node`});continue}if(t.nodeLabel.get(p)!==U.TEST){n.push({code:"ILLEGAL_TARGET",detail:`${u}: execution facts attach to tests \u2014 '${a.ref}' is a ${t.nodeLabel.get(p)}`});continue}let l=Bt(a,u);if(l.length>0){n.push(...l);continue}let c=[];for(let f of a.per_ac??[]){let m=t.resolve(f.ac_ref),g=m?t.tipOf(m.cid):null;if(!m||!g||t.superseded.has(g)||t.nodeLabel.get(g)!==U.AC){n.push({code:"UNKNOWN_REF",detail:`${u}.per_ac: '${f.ac_ref}' is not a live AC`});continue}if(!se.has(f.verdict)){n.push({code:"BAD_VERDICT",detail:`${u}.per_ac['${f.ac_ref}']: verdict '${f.verdict}'`});continue}c.push({ac_ref:t.nameOf.get(g)??g,verdict:f.verdict})}i.push(zt(a,p,c,a.unresolved_acs??[]))}if(n.length>0)return{record:null,errors:n};let o;try{o=q(e,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[],executions:i,...r.eventIds&&r.eventIds.length>0?{event_ids:r.eventIds}:{},source_head_moves:{}},{expectPrev:t.latestHash,busyRetry:{deadlineMs:r.lockDeadlineMs??5e3}})}catch(a){if(a instanceof he)return"cas";throw a}let s;try{W(e)}catch(a){s=`facts committed, but the projection refresh failed (${a instanceof Error?a.message:String(a)}) \u2014 read state rebuilds on the next open`}return{record:o.record,errors:null,...s?{warnings:[s]}:{}}}function Xt(e){let t={failed:3,broken:2,skipped:1,passed:0},r=new Map;for(let n of e)for(let i of n.verifies??[]){let o=r.get(i);(o===void 0||(t[n.status]??0)>(t[o]??0))&&r.set(i,n.status)}return[...r.entries()].map(([n,i])=>({ref:n,verdict:i}))}function Qt(e){let t=[],r=re(e.cwd);if(!j(r))return{synced:0,superseded:0,skipped:"no-context",warnings:t};let n=e.by??{kind:"ai",id:"exec-sync"},i=e.lockDeadlineMs;try{Kr(r,t,i)}catch(c){t.push(`sync: parked-facts replay failed (${c instanceof Error?c.message:String(c)}) \u2014 queue intact, retrying next sync`)}let o=x(r),s=[],a=0,u=new Set,d=new Set(e.members.map(c=>ae(c.path)?c.path:ce(e.cwd,c.path))),p=new Map;for(let c of e.members){let f=ae(c.path)?c.path:ce(e.cwd,c.path);if(!j(f)){t.push(`sync: member file missing: ${f} \u2014 skipped, no fact attached`);continue}for(let m of Jr(f,t))if(!u.has(m.path))try{let g=m.path===f,w=!g&&d.has(m.path),S=g?void 0:F($(f,"utf8"))?.id,K=$(m.path,"utf8"),b=F(K);if(!b?.id){u.add(m.path);continue}let ue=o.resolve(b.id),N=ue?o.tipOf(ue.cid):null;if(!ue||!N||o.superseded.has(N)){u.add(m.path),t.push(`sync: ${b.id} does not resolve to a live test \u2014 skipped (foreign store?)`);continue}let J=L(G(K,Z(Ge(m.path),o))),ar=String(o.getNode(N)?.content.test_md_blob??""),X=L(G(ar,pt(o))),V=!1,Q=N;if(J===X)b.base!==X&&Yt(m.path,K,X,t);else if(b.base===X){let v=Qr(r,o,N,K,J,Ge(m.path),n);v.error?(t.push(`sync: could not supersede ${b.id}: ${v.error}`),V=!0):(a++,Q=v.newCid,V=v.oracleTier,Yt(m.path,$(m.path,"utf8"),J,t),o=x(r))}else V=!0,t.push(b.base?`sync: ${b.id} was edited from an older version \u2014 graph kept; reconcile via a redesign or maintain`:`sync: ${b.id} carries no base pin (hand-copied file?) \u2014 fact attached with drift flag`);if(w){V&&p.set(m.path,!0);continue}u.add(m.path);let Xe=o.getNode(Q)?.content.check,Qe=g?c.acs??[]:[],Ze=Qe.filter(v=>qt(o,v.ref)),et=Qe.filter(v=>!qt(o,v.ref)).map(v=>v.ref);s.push({ref:b.id,about_cid:Q,definition_id_at_run:J,verdict:c.verdict,...Ze.length?{per_ac:Ze.map(v=>({ac_ref:v.ref,verdict:v.verdict}))}:{},drift_flag:V||p.get(m.path)===!0||g&&c.driftFlag===!0,oracle_mode:Xe?.expected_mode??(dt(Xe?.operand)?"runtime-derived":"inferred"),stale_at_run:o.stale(Q)!=="fresh",...et.length?{unresolved_acs:et}:{},execution_id:c.executionId,...c.evidenceId?{evidence_id:c.evidenceId}:{},...c.durationMs!==void 0?{duration_ms:c.durationMs}:{},started_at:c.startedAt,mode:c.mode,local:c.local,...S?{via_parent:S}:{}})}catch(g){m.path!==f&&d.has(m.path)||u.add(m.path),t.push(`sync: ${m.path} failed to sync (${g instanceof Error?g.message:String(g)}) \u2014 skipped; other members unaffected`)}}if(s.length===0)return{synced:0,superseded:a,warnings:t};let l;try{l=Vt(r,x(r),{facts:s,by:n,lockDeadlineMs:i})}catch(c){return t.push(`sync facts: commit threw: ${c instanceof Error?c.message:String(c)}`),Ut(r,s,n,t,i),{synced:0,superseded:a,warnings:t}}return l.errors?(Ut(r,s,n,t,i),t.push(...l.errors.map(c=>`sync facts: ${c.code}: ${c.detail}`)),{synced:0,superseded:a,warnings:t}):(l.warnings&&t.push(...l.warnings.map(c=>`sync facts: ${c}`)),{synced:s.length,superseded:a,warnings:t})}var Ue="pending-facts.ndjson",ze=".pending-facts.bad";function Ut(e,t,r,n,i){try{let o={by:r,ts:new Date().toISOString(),facts:t.map(a=>({...a,about_cid:a.about_cid??"",event_id:`exec-fact:${a.execution_id}:${a.ref}`}))},s=null;try{s=ee(e,{deadlineMs:i??5e3})}catch{n.push("sync facts: store lock busy \u2014 parking without it (a concurrent queue rewrite may race this line)")}try{Ht(M(e,Ue),JSON.stringify(o)+`
|
|
5
|
+
`)}finally{s?.()}n.push(`sync facts: commit failed \u2014 ${t.length} fact(s) parked to ${M(e,Ue)}; they replay on the next sync`)}catch(o){n.push(`sync facts: could not park the failed batch (${o instanceof Error?o.message:String(o)}) \u2014 this run's facts are LOST`)}}function Kr(e,t,r){let n=M(e,Ue);if(!j(n))return;let i;{let d=ee(e,{deadlineMs:r??5e3});try{i=$(n,"utf8")}finally{d()}}let o=i.split(`
|
|
6
|
+
`).filter(d=>d.trim()!=="");if(o.length===0)return;let s=new Set,a=[],u=[];for(let d of o){let p=null;try{let c=JSON.parse(d);c&&Array.isArray(c.facts)&&(p=c)}catch{}if(!p){a.push(d),s.add(d);continue}let l=Gt(e,p);if(l.errors){if(l.errors.some(c=>c.code==="STALE_BASIS")){t.push(`sync: parked facts replay deferred (${l.errors[0].detail}) \u2014 retrying next sync`);continue}a.push(d),s.add(d),t.push(`sync: parked facts line quarantined to ${M(e,ze)} (${l.errors.map(c=>`${c.code}: ${c.detail}`).join("; ")})`);continue}for(let c of l.rejected){let f=p.facts.find(m=>m.event_id===c.event_id);u.push({parent:d,line:JSON.stringify({...f??{event_id:c.event_id},_reason:c.errors})})}l.rejected.length>0&&t.push(`sync: ${l.rejected.length} parked fact(s) quarantined to ${M(e,ze)} (${l.rejected.map(c=>c.errors.map(f=>`${f.code}: ${f.detail}`).join("; ")).join(" | ")})`),s.add(d),l.warnings&&t.push(...l.warnings.map(c=>`sync: ${c}`)),l.applied.length>0&&t.push(`sync: replayed ${l.applied.length} parked fact(s) from a previous run`)}if(s.size!==0)try{let d=ee(e,{deadlineMs:r??5e3});try{let l=(j(n)?$(n,"utf8"):"").split(`
|
|
7
|
+
`).filter(g=>g.trim()!==""),c=[...a.filter(g=>l.includes(g)),...u.filter(g=>l.includes(g.parent)).map(g=>g.line)];c.length>0&&Ht(M(e,ze),c.map(g=>g+`
|
|
8
|
+
`).join(""));let f=l.filter(g=>!s.has(g)),m=`${n}.tmp.${process.pid}`;Jt(m,f.length>0?f.join(`
|
|
9
|
+
`)+`
|
|
10
|
+
`:""),Kt(m,n)}finally{d()}}catch(d){t.push(`sync: queue rewrite failed (${d instanceof Error?d.message:String(d)}) \u2014 already-applied lines dedupe next sync; bad lines re-quarantine then`)}}function Jr(e,t){let r=[],n=new Set,i=o=>{if(n.has(o)||!j(o))return;n.add(o);let s;try{s=$(o,"utf8")}catch(a){t.push(`sync: unreadable unit ${o} (${a instanceof Error?a.message:String(a)}) \u2014 skipped`);return}for(let a of s.split(`
|
|
11
|
+
`)){let u=/^@import\s+(\S+)\s*$/.exec(a.trim());if(!u)continue;let d=ae(u[1])?u[1]:ce(Ge(o),u[1]);if(!j(d))continue;let p;try{p=$(d,"utf8")}catch(l){t.push(`sync: unreadable import ${d} (${l instanceof Error?l.message:String(l)}) \u2014 skipped; importer continues`);continue}F(p)?.id&&i(d)}r.push({path:o})};return i(e),r}function qt(e,t){let r=e.resolve(t),n=r?e.tipOf(r.cid):null;return!!(r&&n&&!e.superseded.has(n)&&e.nodeLabel.get(n)==="ac")}function Xr(e,t,r){let n=e.split(`
|
|
12
|
+
`),i=lt(n);return n.map((o,s)=>{let a=ut.exec(o.trim());if(!a||i.has(s))return o;let u=a[1];if(r.resolve(u))return o;let d=ae(u)?u:ce(t,u);if(!j(d))return o;let p=F($(d,"utf8"))?.id;return!p||!r.resolve(p)?o:`@import ${p}`}).join(`
|
|
13
|
+
`)}function Qr(e,t,r,n,i,o,s){let a=t.getNode(r);if(!a)return{oracleTier:!1,error:"tip unreadable"};let u=Xr(mt(n),o,t),d=String(a.content.test_md_blob??""),p=/^#\s+(.+?)\s*$/m.exec(u)?.[1]??String(a.content.title??""),l={...a.content,test_md_blob:u,definitionId:i,title:p},c=gt("test",l);if(c.length>0)return{oracleTier:!1,error:c.map(S=>S.detail).join("; ")};let f=ht("test",l);if(f===r)return{newCid:r,oracleTier:!1};let m=Wt(d)!==Wt(u);if(vt(t,r,f))return{oracleTier:m,error:"file content reproduces an already-superseded version (supersession cycle guard) \u2014 graph kept; re-edit forward or redesign"};let g=yt({graph:t,oldTip:r,newCid:f,newLabel:"test",by:s,reason:`re-blessed onto ${f} (edited on disk, run sync)`});if(g.errors.length>0)return{oracleTier:m,error:`edge re-bless refused: ${g.errors.join("; ")}`};let w=te(e);if(t.latestHash!==w)return{oracleTier:m,error:`store advanced under the sync (basis ${String(t.latestHash)} vs head ${String(w)}) \u2014 re-run to retry`};try{q(e,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:f,label:"test",content:l}],edges:g.edges,review:[{id:f,kind:"review-item",resolution:"edited",edit:null,reason:"edited on disk (run sync)",by:s}],supersessions:[{kind:"node",old:r,new:f,reason:"edited on disk (run sync)",by:s},...g.supersessions],source_head_moves:{}},{expectPrev:w})}catch(S){return{oracleTier:m,error:S instanceof Error?S.message:String(S)}}return W(e),{newCid:f,oracleTier:m}}var Zr=/\s@verifies\s+(ac-[\w.:\/-]+(?:\s*,\s*ac-[\w.:\/-]+)*)\s*$/;function Wt(e){let t=[],r=e.split(`
|
|
14
|
+
`),n=!1;for(let i of r){if(/^##\s/.test(i)){n=/\bassert\b/i.test(i);let o=Zr.exec(i);o&&t.push(`v:${o[1].trim()}`);continue}n&&i.trim()!==""&&t.push(i.trim())}return t.join(`
|
|
15
|
+
`)}var en=0;function Yt(e,t,r,n){try{let i=t.split(`
|
|
16
|
+
`),o=-1;if(i[0]?.trim()==="---"){for(let u=1;u<i.length;u++)if(i[u].trim()==="---"){o=u;break}}if(o<0)return;let s=ft(i,o);if(!s)return;if(s.baseLine!==void 0){let u=i[s.baseLine].endsWith("\r")?"\r":"";i[s.baseLine]=`${s.childIndent}base: ${r}${s.baseComment?` ${s.baseComment}`:""}${u}`}else if(s.strayBase){n.push(`sync: ${e} has a base: line this scanner cannot confidently rewrite (unexpected indentation or key quoting) \u2014 pin refresh skipped (stale pin until the shape is fixed)`);return}else{let d=i[s.idLine??s.start].endsWith("\r")?"\r":"";i.splice((s.idLine??s.start)+1,0,`${s.childIndent??" "}base: ${r}${d}`)}let a=`${e}.tmp-sync.${process.pid}-${en++}`;Jt(a,i.join(`
|
|
17
|
+
`)),Kt(a,e)}catch(i){n.push(`sync: pin refresh failed for ${e} (${i instanceof Error?i.message:String(i)}) \u2014 next run self-heals`)}}var cn={passed:"passed",failed:"failed",broken:"blocked",skipped:"not-run"},Zt=(e,t)=>{try{if(!qe(t))return{status:"skipped",reason:"no context store at the project root"};let r=T(e,"tests");if(!qe(r))return{status:"skipped",reason:"pack has no tests/"};let n=new Map;for(let a of rn(r)){let u=T(r,a,"result.yaml");if(!qe(u)||!sn(T(r,a)).isDirectory())continue;let d=A(nn(u,"utf8"));if(!d?.definition_id&&!d?.assurance_id)continue;let p=Xt(d.steps??[]),l={testShortId:String(d.test??a),execution:cn[String(d.status)]??"not-run",...p.length?{acs:p}:{}};d.assurance_id&&n.set(`id:${d.assurance_id}`,l),d.definition_id&&n.set(`def:${d.definition_id}`,l)}let i=_t(x(t),n,{scope:"run"}),o=wt(i);Nt(e,t,i);let s=_({...i,rollup:o},{lineWidth:-1});return tn(T(e,"coverage"),{recursive:!0}),an(T(e,"coverage","usecases.yaml"),s),{status:"written"}}catch(r){try{on(T(e,"coverage","sources"),{recursive:!0,force:!0})}catch{}return{status:"skipped",reason:r instanceof Error?r.message:String(r)}}};async function un(e){try{let t=new H({origin:"inline",runKind:"author",pid:e.pid,title:e.title,started:new Date().toISOString(),producerVersion:e.producerVersion,surfaces:e.surfaces,objectiveOrName:e.objectiveOrName,sessionId:e.sessionId,cwd:e.cwd,packRootDir:e.packRootDir}),r=await t.start();return{session:t,...r,packDir:t.pack,spawns:[],startedAtMs:Date.now(),cwd:e.cwd}}catch(t){return console.warn("evidence: inline pack creation failed",t),null}}function ln(e,t,r){if(!e)return;e.session.noteSpawn(t),t.resolution&&(e.resolution=t.resolution),e.runnerEnvironment=it(e.runnerEnvironment,t.runnerEnvironment);let n=(r?.per_flow_metadata??[]).map(i=>({resultCode:i?.result_code!=null?Number(i.result_code):null}));e.spawns.push({resultCode:r?.result_code!=null?Number(r.result_code):null,...n.length?{perFlow:n}:{}})}function pn(e){if(e)return{packTestDir:e.packTestDir,ordinalOffset:e.session.nextOrdinalOffset()}}async function fn(e,t){if(!e)return null;if(e.finalized)return e.finalized;let r=(n,i,o)=>t.log?t.log("warn",n,i,o):console.warn(`evidence: ${i}`,o??"");try{if(t.recordedTestPath)try{await e.session.writeDefinition(await dn.readFile(t.recordedTestPath,"utf8"))}catch(s){r("EVIDENCE_DEFINITION_FAILED","could not attach synthesized test.md",{error:String(s)})}let n=t.cdpBrowserCapture?await t.cdpBrowserCapture():void 0,i=await e.session.writeResult({steps:e.session.steps,spawns:e.spawns.length?e.spawns:[{resultCode:null}],externalIdInput:{...t.externalIdInput,execution_id:e.executionId},runnerEnv:Be({cdpBrowser:n,resolution:e.resolution,runnerEnvironment:e.runnerEnvironment,deviceName:t.deviceName,deviceModel:t.deviceModel,pixelResolution:await Ct(e.packTestDir)}),intentEnv:st(t.model,e.runnerEnvironment),durationMs:t.durationMs??Date.now()-e.startedAtMs,log:t.log});try{if(t.recordedTestPath){let s=Qt({cwd:t.cwd??e.cwd??process.cwd(),members:[{path:t.recordedTestPath,verdict:i,executionId:e.executionId,startedAt:new Date(e.startedAtMs).toISOString(),mode:"inline",local:t.local??!1}]});for(let a of s.warnings)r("EXEC_SYNC",a)}}catch(s){r("EXEC_SYNC","exec-sync failed",{error:String(s)})}try{let s=(t.coverageWriter??Zt)(e.packDir,re(t.cwd??e.cwd??process.cwd()));s.status==="skipped"&&r("EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${s.reason}`)}catch(s){r("EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(s)})}let o=await Ve({executionId:e.executionId,testId:e.testId,saved:t.saved,runKind:"author",verdict:i,cwd:t.cwd??e.cwd,packDir:e.packDir,tuiLogPath:t.tuiLogPath,log:t.log,surface:"inline",requireRealLog:!!e.runnerEnvironment?.native_platform,appiumMarks:e.session.appiumMarks});return e.finalized=o,t.log?.("info","EVIDENCE_SEALED","Inline pack sealed",{execution_id:e.executionId,verdict:i,valid:o.valid,pack:e.packDir,store_copy:o.storePath??null}),o}catch(n){return r("EVIDENCE_SEAL_FAILED","inline pack finalize failed",{error:String(n)}),null}}import{statSync as mn,openSync as gn,readSync as hn,closeSync as vn}from"fs";import{basename as yn,resolve as wn}from"path";async function _n(e,t,r={}){let n=r.out??(p=>process.stdout.write(p+`
|
|
18
|
+
`)),i=p=>(n(`error: ${p}`),2);if(t.env!=="prod"&&t.env!=="stage")return i(`invalid --env: ${String(t.env)}`);if(t.port!==void 0&&(!Number.isInteger(t.port)||t.port<1||t.port>65535))return i("invalid --port: expected an integer 1-65535");let o;try{o=Y(t.env,t.viewerUrl),new URL(o)}catch{return i(`invalid --viewer-url: ${t.viewerUrl}`)}if(e.length===0)return i("no pack paths given");let s=new Map;for(let p of e){let l=wn(p),c;try{c=mn(l)}catch{return i(`${p}: not found`)}if(c.isDirectory())return i(`${p}: is a directory \u2014 packs must be sealed .evidence files (run the execution to completion, or seal it, first)`);if(!c.isFile())return i(`${p}: not a regular file`);let f=Buffer.alloc(2),m=gn(l,"r");try{hn(m,f,0,2,0)}finally{vn(m)}if(f.toString("latin1")!=="PK")return i(`${p}: not a sealed evidence pack (zip magic missing)`);let g=yn(l);if(s.has(g))return i(`duplicate pack basename: ${g} (URL names collide \u2014 rename one)`);s.set(g,l)}let a=r.log??((p,l,c)=>process.stderr.write(`warn: ${l} reason=${c.reason} path=${c.path}
|
|
19
|
+
`)),u;try{u=await ve({packs:s,allowedOrigins:[new URL(o).origin],port:t.port,log:a})}catch(p){return i(`could not bind 127.0.0.1${t.port?`:${t.port}`:""} \u2014 ${p.message}`)}n(`serving ${s.size} pack${s.size===1?"":"s"} on http://127.0.0.1:${u.port}`);for(let p of s.keys()){let l=u.urlFor(p);n(p),n(` pack ${l}`),n(` viewer ${ye(l,o)}`)}return n("press Ctrl-C to stop"),await(r.hold??xn)(),await u.close(),0}function xn(){return new Promise(e=>{let t=process.listeners("SIGINT");process.removeAllListeners("SIGINT"),process.once("SIGINT",()=>{for(let r of t)process.on("SIGINT",r);e()})})}import{promises as de}from"fs";import{tmpdir as En}from"os";import{join as rr,resolve as Ye}from"path";var bn=["error","prefer_first","prefer_latest","discard"],kn=["external_id.commit_id","external_id.test_id"];function er(e){let t=e.replace(/-/g,"_");return bn.includes(t)?t:null}function tr(e){let t=e==="discard"?{on_collision:"discard"}:{on_collision:"error",identity:{keys:[...kn],on_same:e??"nest",on_different:e?"error":"split"}};return _({packs:{require_status:"finalized",require_valid:"L1",on_ineligible:"abort"},tests:t,rules:[{file:"run.yaml",key:"run_id",must:"different",on_violation:"skip"},{file:"result.yaml",key:"external_id.project_id",must:"same",on_violation:"error"},{file:"result.yaml",key:"external_id.org_id",must:"same",on_violation:"error"}]},{lineWidth:-1})}async function We(e){try{if(!e.isTTY){e.log(we(e.packPath));return}let t=Y(e.env);await(e.renderPrompt??Sn)(e.packPath,t)}catch(t){try{e.log(`evidence view failed \u2014 ${t.message}`)}catch{}}}async function Sn(e,t){let r=await import("./react-QWOAB3TB.js"),{render:n}=await import("./build-JIKYOZUH.js"),{EvidenceViewOffer:i}=await import("./EvidenceViewOffer-KWX27WNZ.js");await new Promise(o=>{let s=n(r.default.createElement(i,{packPath:e,viewerBase:t,onDone:()=>{s.unmount(),o()}}),{stdout:process.stderr,exitOnCtrlC:!1})})}async function In(e,t,r=process.cwd(),n={}){let i=n.out??(c=>process.stdout.write(c+`
|
|
20
|
+
`)),o=n.err??(c=>process.stderr.write(c+`
|
|
21
|
+
`)),s=c=>(o(`evidence merge: ${c}`),2);if(!t.runId)return s("--run-id is required (merged identity is the caller's fact)");if(t.rules&&t.onCollision)return s("--rules and --on-collision are mutually exclusive");let a;if(t.onCollision!==void 0){let c=er(t.onCollision);if(!c)return s(`invalid --on-collision: ${t.onCollision} (expected error | prefer-first | prefer-latest | discard)`);a=c}let u=[];for(let c of e){let f=await Rn(c,r);if(!f)return s(`no pack found for "${c}"`);u.push(f)}let d=t.out?Ye(r,t.out):y(t.runId,r),p=null,l;t.rules?l=Ye(r,t.rules):(p=await de.mkdtemp(rr(En(),"kane-merge-rules-")),l=rr(p,"merge-rules.yaml"),await de.writeFile(l,tr(a)));try{let c=await(n.mergeFn??at)(u,{runId:t.runId,out:d,rulesPath:l,title:t.title,finalize:t.finalize});return t.json?i(JSON.stringify(c)):Pn(i,c),c.output.finalized&&!t.json&&await(n.offer??We)({packPath:d,env:t.env,isTTY:n.isTTY??(!!process.stdin.isTTY&&!!process.stderr.isTTY),log:o}),0}catch(c){let f=c instanceof Error?c.message:String(c);return c?.code==="ABORT"?(o(`evidence merge: aborted \u2014 ${f}`),1):s(f)}finally{p&&await de.rm(p,{recursive:!0,force:!0}).catch(()=>{})}}async function Rn(e,t){let r=Ye(t,e);if(await nr(r))return r;let n=y(e,t);return await nr(n)?n:null}async function nr(e){try{return await de.stat(e),!0}catch{return!1}}function Pn(e,t){let{packs:r,tests:n,output:i}=t;e(`evidence: merged ${n.merged} tests from ${r.eligible.length} packs -> ${i.path} (${i.finalized?"sealed":"live"})`);for(let o of r.skipped)e(` skipped ${o.runId}: ${o.rule} \u2014 ${o.reason}`);for(let o of n.collisions){let s;o.action==="nest"?s=`nested into ${o.folder}, latest ${o.winner}`:o.action==="split"?s=`split into ${o.folder}`:s=`winner ${o.winner}`,e(` collision ${o.test}: ${s} (${o.rule})`)}for(let o of n.discarded)e(` discarded ${o}`)}import{copyFileSync as $n,existsSync as He,mkdirSync as An}from"fs";import{join as ir}from"path";function Ln(e,t,r){try{let n=ir(e,"auteur","execution.json");if(He(n))return!0;for(let i of t)if(!(!i||!He(i)))return An(ir(e,"auteur"),{recursive:!0}),$n(i,n),!0}catch(n){try{r?.("debug","EVIDENCE_BLOB_COPY_FAILED","auteur execution blob copy failed",{operation:"ensureAuteurExecution",source:t.find(i=>i&&He(i))??null,error:n instanceof Error?n.message:String(n)})}catch{}}return!1}import{readFileSync as Fn}from"fs";import{join as Cn}from"path";function Je(e){let t=[],r=!0,n=o=>{if(o===null||typeof o!="object")return;let s=o;if(Array.isArray(s.operations))for(let a of s.operations){let u=a?.operation_id;typeof u=="string"&&u&&t.push(u)}if(Array.isArray(s.children)){s.content_type!=="generative_block"&&(r=!1);for(let a of s.children)n(a)}if(Array.isArray(s.branches)){r=!1;for(let a of s.branches){let u=a?.children;if(Array.isArray(u))for(let d of u)n(d)}}},i=e?.instructions;if(Array.isArray(i))for(let o of i)n(o);return{ids:t,linear:r}}function Dn(e){return Je(e).ids}function Ke(e,t){let r=new Set(t.map(a=>a.action_id).filter(Boolean)),n=-1;for(let a of r){let u=e.indexOf(a);u>n&&(n=u)}let i=t.reduce((a,u)=>Math.max(a,u.ordinal),0),o=new Set,s=[];for(let a of e.slice(n+1))r.has(a)||o.has(a)||(o.add(a),s.push({id:a,ordinal:++i,status:"skipped",action_id:a}));return s}function or(e,t){let r=new Set(t),n=e.filter(o=>o.action_id);if(n.some(o=>r.has(o.action_id))||n.length>t.length)return null;let i=0;return e.map(o=>o.action_id?{...o,action_id:t[i++]}:o)}function On(e,t){if(e.length>t.length)return!1;for(let r=0;r<e.length;r++)if(t[r]!==e[r].action_id)return!1;return!0}function jn(e,t,r,n=!0){if(t.length===0)return{steps:e,tail:[]};let i=(r&&n?or(e,t):null)??e,o=i.filter(a=>a.action_id),s=new Set(t);return o.length>0&&o.every(a=>s.has(a.action_id))?{steps:i,tail:Ke(t,i)}:o.length>0&&!On(o,t)?{steps:i,tail:[],unjoined:!0}:{steps:i,tail:Ke(t,i)}}function sr(e){try{let t=Fn(Cn(e,"auteur","execution.json"),"utf8");return Je(JSON.parse(t))}catch{return{ids:[],linear:!0}}}function Mn(e){return sr(e).ids}export{D as a,_e as b,xe as c,be as d,ke as e,Se as f,Ee as g,ur as h,Ie as i,Re as j,lr as k,pr as l,Pe as m,ne as n,Le as o,Fe as p,Ce as q,De as r,fr as s,mr as t,Oe as u,gr as v,je as w,Me as x,Te as y,$t as z,Ve as A,Ct as B,Be as C,jt as D,Dr as E,H as F,Vr as G,Xt as H,Qt as I,Zt as J,un as K,ln as L,pn as M,fn as N,_n as O,tr as P,We as Q,In as R,Ln as S,Je as T,Dn as U,Ke as V,or as W,jn as X,sr as Y,Mn as Z};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as k}from"./chunk-DNNZ353O.js";import{b as w}from"./chunk-AJXOJF2X.js";import{d as E,e as h}from"./chunk-WXHQYYD5.js";var g=(e,t,o=new Set)=>{let s=e.nameOf.get(t);if(s!==void 0)return s;if(o.has(t))return t;o.add(t);for(let[r,n]of e.superseded){if(n!==t)continue;let d=g(e,r,o);if(d!==r)return d}return t};function b(e,t){let o=e.stale(t);if(o==="fresh")return;if(o==="orphaned")return"orphaned \u2014 no live source evidences this item";let s=[],r=new Map;for(let n of e.derivesInto(t))r.set(String(n.props.source_id),n);for(let[n,d]of r){let i=e.heads.get(n);if(i==null||i===d.props.source_cid)continue;let a=e.convChains.get(n)?.chain;a&&a.includes(String(d.props.source_cid))||s.push(`DERIVES pin ${n}@${String(d.props.source_cid).slice(0,19)} broke \u2014 the source head moved`)}for(let n of e.edgesFrom(t)){if(n.type===h.DERIVES||!e.superseded.has(n.dst))continue;let d=e.tipOf(n.dst);if(e.superseded.has(d)){s.push(`${n.type} pin \u2192 ${g(e,n.dst)} \u2014 target retired`);continue}let i=C(e,n.dst,d);s.push(i.length>0?`${g(e,n.dst)} updated: ${i.map(a=>a.field).join(", ")}`:`${n.type} pin \u2192 ${g(e,n.dst)} \u2014 target superseded`)}return s.length>0?s.join("; "):"stale \u2014 a pinned dependency moved"}function C(e,t,o){let s=e.getNode(t)?.content??{},r=e.getNode(o)?.content??{},n=i=>i===void 0?"":Array.isArray(i)?i.map(String).join(" \xB7 "):typeof i=="object"?JSON.stringify(i):String(i),d=[];for(let i of[...new Set([...Object.keys(s),...Object.keys(r)])].sort())JSON.stringify(s[i])!==JSON.stringify(r[i])&&d.push({field:i,old:n(s[i]),new:n(r[i])});return d}function P(e,t){let o=[];for(let{cid:s}of e.byLabel(E.SCENARIO))e.superseded.has(s)||e.edgesFrom(s).some(r=>r.type===h.BELONGS_TO&&e.tipOf(r.dst)===t)&&o.push(s);return o}function O(e,t){let o=[],s=[],r=[],n=[],d=[],i=[],a=P(e,t),_=new Set(a),l=(c,f)=>{let u=b(e,f);return u===void 0?c:{...c,stale:!0,stale_reason:u}};for(let c of a){let f=e.getNode(c)?.content??{};o.push(l({ref:g(e,c),title:String(f.title??""),case_type:String(f.case_type??""),intent:String(f.intent??"")},c));for(let u of e.edgesInto(c)){if(u.type!==h.AUTOMATES||e.superseded.has(u.src))continue;let m=e.getNode(u.src)?.content??{},S=e.edgesFrom(u.src).filter(x=>x.type===h.VERIFIES&&!e.superseded.has(x.dst)).map(x=>g(e,x.dst));s.push(l({ref:g(e,u.src),title:String(m.title??""),automates:g(e,c),check:m.check,verifies:S},u.src)),d.push(u.src)}for(let u of e.edgesFrom(c))u.type!==h.EXERCISES||e.superseded.has(u.dst)||n.push({scenario:g(e,c),ac:g(e,u.dst)})}for(let{cid:c}of e.byLabel(E.AC)){if(e.superseded.has(c))continue;let f=e.edgesFrom(c).find(x=>x.type===h.SCOPED_TO);if(!f)continue;let u=e.tipOf(f.dst);if(!(u===t||_.has(u)))continue;let S=e.getNode(c)?.content??{};r.push(l({ref:g(e,c),text:String(S.text??""),kind:String(S.kind??""),scope:u===t?"use-case":g(e,u)},c)),i.push(c)}let y=[],p=new Set;for(let c of[t,...a,...d,...i])for(let f of e.retractedEdgesTouching(c))p.has(f.ecid)||(p.add(f.ecid),y.push({type:f.type,src:g(e,f.src),dst:g(e,f.dst),at:f.retraction.at,...f.retraction.reason?{reason:f.retraction.reason}:{}}));return{scenarios:o,tests:s,acs:r,exercises:n,retracted_edges:y}}function D(e,t,o){let s=k(e,t,o);return s===null?null:s.toString("utf8")}function v(e,t){let o=t.split(`
|
|
3
|
+
`).map(r=>r.replace(/^\d+\| /,"")),s=[];for(let r of e.split(`
|
|
4
|
+
`)){let n=r.trim();if(n.length===0)continue;let d=o.find(i=>i.includes(n));d!==void 0&&!s.includes(d.trim())&&s.push(d.trim())}return s.length>0?s.join(`
|
|
5
|
+
`):{removed:!0}}function G(e,t,o,s){if(s!==void 0&&s.trim().length>0)return{kind:"user-directive",text:s.trim()};let r=[o,...O(t,o).acs.map(a=>t.resolve(a.ref)?.cid??"")].filter(Boolean),n=[],d=new Set;for(let a of r){let _=new Map;for(let l of t.derivesInto(a))_.set(String(l.props.source_id),l);for(let[l,y]of _){let p=t.heads.get(l);if(p==null||p===y.props.source_cid)continue;let c=String(y.props.anchor),f=`${l}\0${c}`;if(d.has(f)||c==="img#whole")continue;d.add(f);let u=D(e,t,String(y.props.source_cid)),m=u===null?null:w(u,c);if(m===null)continue;let S=D(e,t,p);n.push({source_id:l,anchor:c,old_anchor_text:m,new_anchor_text:S===null?{removed:!0}:v(m,S)})}}let i;for(let[a,_]of t.superseded){if(_!==o||t.nodeLabel.get(a)!==E.USECASE)continue;let l=C(t,a,o);l.length>0&&(i=l);break}return{kind:"source-change",changes:n,...i?{uc_updated:i}:{}}}function $(e,t,o,s){let r=O(t,o);if(r.scenarios.length===0&&r.tests.length===0&&r.acs.length===0)return;let n=G(e,t,o,s);if(!(n.kind==="source-change"&&n.changes.length===0&&!n.uc_updated))return{prior_design:r,change_delta:n}}export{O as a,$ as b};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as n}from"./chunk-
|
|
2
|
+
import{a as n}from"./chunk-N2N5T5JN.js";import{createHash as _}from"crypto";import{existsSync as m,readFileSync as u}from"fs";import{dirname as T,join as f,resolve as o}from"path";import{fileURLToPath as E}from"url";var s=T(E(import.meta.url)),l=2;function p(e,r){let t=_("sha256");return t.update(`kane-assurance-contract
|
|
3
3
|
`),t.update(e),t.update(`
|
|
4
4
|
agent_state_schema=${r}`),"sha256:"+t.digest("hex")}function d(){return[o(s,".."),o(s,"../../..")]}function i(){return"sha256:85dd52f33a9fd9cf22ebb81f04dfd3c05bdbeca2e62e3a7a53e8caaaa4060752"}var a=class extends Error{constructor(t,c){super(`agent/cli contract mismatch (cli ${t||"<unset>"}, agent ${c||"<unset>"}) \u2014 rebuild or reinstall the stale half`);this.expected=t;this.actual=c;this.name="PairMismatchError"}};function I(){return{TESTMUAI_CONTRACT_DIGEST:i(),TESTMUAI_CLIENT_VERSION:process.env.KANE_DEV_FORCE_CLIENT_RELEASE??`kane-cli/${n}`}}export{a,I as b};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{x as n}from"./chunk-
|
|
2
|
+
import{x as n}from"./chunk-N2N5T5JN.js";import{a as s}from"./chunk-HCBYKLMW.js";import{a,b as i}from"./chunk-C44QQJR4.js";import{e as r}from"./chunk-UR6MHSHU.js";var o=r(s(),1);function g({bindings:c,suppressEscBack:p=!1,escBackLabel:m="back to chat"}){let e=c.map(t=>`${t.keys} ${t.label}`);return p||e.push(`esc \xB7 ${m}`),(0,o.jsx)(a,{marginTop:1,children:(0,o.jsx)(i,{color:n.dim,children:e.join(" \xB7 ")})})}export{g as a};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as ae}from"./chunk-MMBBQ4OZ.js";import{j as R}from"./chunk-ZH2ROVHE.js";import{c as ie,e as ne,i as re,j as K}from"./chunk-Z7S3IWUX.js";import{d as $,e as oe}from"./chunk-4JOD47QI.js";import{a as se}from"./chunk-RZ4F3BHX.js";import{spawn as Xe}from"child_process";import{closeSync as ze,existsSync as Ge,mkdirSync as We,openSync as Ye,readFileSync as Ze,rmSync as Qe}from"fs";import{homedir as ge}from"os";import{dirname as z,join as A}from"path";import{access as Re,mkdir as de,readFile as Le}from"fs/promises";import{homedir as Ce}from"os";import{arch as Fe,platform as Be}from"process";import{join as _}from"path";var Ue=35,qe="google_apis",Ve="KaneCLI_Pixel_API35",He="KaneAI_Pixel_API35";function Ht(t){return t===He?Ve:t}var je=1;function Ke(t,e){return t==="darwin"&&e==="arm64"?"arm64-v8a":"x86_64"}function Je(){return{home:Ce(),os:Be,arch:Fe}}async function le(t){try{return await Re(t),!0}catch{return!1}}var J=class{deps;constructor(e={}){this.deps={...Je(),...e}}paths(){let e=_(this.deps.home,".testmuai","kaneai","mobile"),r=_(e,"android-sdk");return{root:r,emulatorDir:_(r,"emulator"),systemImageDir:_(r,"system-images",`android-${Ue}`,qe,Ke(this.deps.os,this.deps.arch)),avdHome:_(e,"avd"),manifest:_(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 de(_(e,"platforms"),{recursive:!0}),await de(_(e,"platform-tools"),{recursive:!0})}async status(){let e=this.paths(),r=null;try{r=JSON.parse(await Le(e.manifest,"utf8"))}catch{}if(!r||r.schemaVersion!==je)return{emulator:!1,systemImage:!1};let o=this.deps.os==="win32"?"emulator.exe":"emulator";return{emulator:!!r.components.emulator&&await le(_(e.emulatorDir,o)),systemImage:!!r.components.systemImage&&await le(_(e.systemImageDir,"system.img"))}}},ue;function F(){return ue??=new J,ue}var G="android",et="http://127.0.0.1:4723/status",tt=2e3,X=(()=>{let t=Number(process.env.KANE_CLI_EMULATOR_BOOT_TIMEOUT_MS);return Number.isFinite(t)&&t>=3e4?t:3e5})(),it=1e3,nt=3e5;var rt=5,ce="Run `kane-cli doctor --target emulator --install` to install the managed Appium tree.",st={device:"ready",unauthorized:"unauthorized",offline:"offline"};function ot(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 at(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 g=o.split(/\s+/),f=g[0],v=g[1];if(!f||!v||!f.startsWith("emulator-"))continue;let b=ot(g.slice(2)),S=b.model?b.model.replace(/_/g," "):void 0;e.push({platform:G,kind:"emulator",id:f,displayName:S??f,state:st[v]??"offline"})}return e}function me(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 dt(t){for(let e of t.split(`
|
|
5
|
+
`)){let r=e.trim();if(!(!r||r==="OK"))return r}}function lt(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 ut(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 ct(t){let e=Number(t.trim());return Number.isInteger(e)&&e>0?e:void 0}function mt(t){return[...new Set(t.split(",").map(e=>e.trim()).filter(Boolean))]}var pt=[{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 ft(t){for(let{match:e,hint:r}of pt)if(e.test(t))return r}function W(t,e,r=rt){let o=t.toLowerCase(),u=e.filter(v=>v.toLowerCase().includes(o)),g=Math.max(6,Math.floor(o.length/2)),f=e.filter(v=>!u.includes(v)&>(v.toLowerCase(),o)>=g);return[...u,...f].slice(0,r)}function gt(t,e){let r=Math.min(t.length,e.length),o=0;for(;o<r&&t[o]===e[o];)o++;return o}function ht(t){if(!t)return;let e=/^image\.sysdir\.\d+\s*=.*?android-(\d+)/m.exec(t),r=e?.[1]?Number(e[1]):NaN;return Number.isInteger(r)&&r>0?r:void 0}var vt={36:"16",35:"15",34:"14",33:"13",32:"12",31:"12",30:"11",29:"10",28:"9",27:"8.1",26:"8.0",25:"7.1",24:"7.0",23:"6.0",22:"5.1",21:"5.0"};function wt(t){return t===void 0?void 0:vt[t]}function pe(t){let e=bt(t),r=ht(t),o=wt(r);return{...e?{modelIdentifier:e}:{},...r!==void 0?{androidApiLevel:r}:{},...o?{osVersion:o}:{}}}function bt(t){return t&&/^hw\.device\.name\s*=\s*(.+)\s*$/m.exec(t)?.[1]?.trim()||void 0}function yt(){return se(et,{signal:AbortSignal.timeout(tt)}).then(t=>t.ok,()=>!1)}function fe(t){return A(ge(),".testmuai","kaneai","mobile",`emulator-${t}.log`)}function At(t,e,r,o){let u="ignore";if(o)try{We(z(o),{recursive:!0}),u=Ye(o,"w")}catch{u="ignore"}if(Xe(t,e,{stdio:["ignore",u,u],detached:!0,...r?{env:{...process.env,...r}}:{}}).unref(),typeof u=="number")try{ze(u)}catch{}}function q(t){try{return Ze(t,"utf8")}catch{return}}function he(t){try{Qe(t,{force:!0})}catch{}}async function ve(t){if(process.platform==="win32"){let o=await $("tasklist",["/FI",`PID eq ${t}`,"/FO","CSV","/NH"],{timeoutMs:5e3});return o.code===0&&o.stdout.trim()!==""?o.stdout:void 0}let e=await $("ps",["-p",String(t),"-o","command="],{timeoutMs:5e3}),r=e.stdout.trim();return e.code===0&&r!==""?r:void 0}function St(){return{exec:$,spawnDetached:At,readFileIfAny:q,removeFile:he,processCommand:ve,fileExists:Ge,env:process.env,home:ge(),os:process.platform,probeAppiumServer:yt,now:()=>Date.now(),sleep:oe,mobileDeps:{status:t=>R().status(t),environment:t=>R().environment(t)},sdkSuite:{status:()=>F().status(),environment:()=>F().environment(),emulatorPath:()=>{let t=F().paths().emulatorDir;return A(t,process.platform==="win32"?"emulator.exe":"emulator")},ensureSdkRootMarkers:()=>F().ensureSdkRootMarkers()}}}function we(t={}){let e={...St(),...t},r={},o=new Set;function u(i){return e.os==="win32"?`${i}.exe`:i}function g(i){if(e.readAvdConfig)return e.readAvdConfig(i);let n=f(i);if(n)return(e.readFileIfAny??q)(A(n,"config.ini"))}function f(i){let n=[e.env.ANDROID_AVD_HOME,A(e.home,".android","avd"),e.sdkSuite.environment().ANDROID_AVD_HOME];for(let s of n){if(!s)continue;let a=A(s,`${i}.avd`);if(e.fileExists(A(a,"config.ini")))return a}}let v=["hardware-qemu.ini.lock","multiinstance.lock"];async function b(i){let n=f(i);if(!n)return{state:"free"};let s=v.map(h=>A(n,h)).filter(h=>e.fileExists(h));if(s.length===0)return{state:"free"};let d=(e.readFileIfAny??q)(A(n,"hardware-qemu.ini.lock")),c=Number(String(d??"").replace(/\0/g,"").trim());if(Number.isInteger(c)&&c>0){let h=await(e.processCommand??ve)(c);if(h&&/qemu|emulator/i.test(h))return{state:"held",pid:c}}return{state:"stale",paths:s}}function S(){return e.os==="win32"?"appium.cmd":"appium"}function I(){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(A(e.home,"Library","Android","sdk")):e.os==="win32"?i.push(A(e.home,"AppData","Local","Android","Sdk")):i.push(A(e.home,"Android","Sdk")),i}function H(i){let n=i==="adb"?"platform-tools":"emulator";return I().map(s=>A(s,n,u(i)))}async function l(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 m(i){let n=await e.exec(i,["-version"],{timeoutMs:1e4});return/Android emulator version/i.test(`${n.stdout}
|
|
10
|
+
${n.stderr}`)}async function p(i){if(i==="adb"){let n=ae(e.env);if(n){let a=A(n.platformToolsDir,u("adb"));if(e.fileExists(a)){let d={path:a,source:"sdk"};return r[i]=d,d}return delete r[i],null}if((await e.mobileDeps.status("emulator")).installed){let a=await e.mobileDeps.environment("emulator");if(a.platformToolsDir){let d={path:A(a.platformToolsDir,u("adb")),source:"local"};return r[i]=d,d}}return delete r[i],null}if(i==="emulator"){if((await e.sdkSuite.status()).emulator){let d={path:e.sdkSuite.emulatorPath(),source:"local"};return r[i]=d,d}let s=H(i).filter(d=>e.fileExists(d)),a=await l(i);a&&!s.includes(a)&&s.push(a);for(let d of s){if(!await m(d))continue;let c={path:d,source:"sdk"};return r[i]=c,c}}return delete r[i],null}async function w(){let i=await p("adb");if(!i)throw new Error("Managed adb is not installed.\nRun `kane-cli doctor --target emulator --install` to install the pinned Android platform-tools.");return i.path}async function D(i){let n=await e.exec(i,["devices","-l"],{timeoutMs:2e4});return at(n.stdout)}async function y(i,n){let s=await e.exec(i,["-s",n,"shell","getprop","ro.boot.qemu.avd_name"],{timeoutMs:1e4});if(s.code===0){let d=s.stdout.split(`
|
|
11
|
+
`)[0]?.trim();if(d)return d}let a=await e.exec(i,["-s",n,"emu","avd","name"],{timeoutMs:1e4});if(a.code===0)return dt(a.stdout)}async function E(i){let n=await p("emulator");if(!n)return[];let s=await e.exec(n.path,["-list-avds"],{timeoutMs:2e4}),a=s.code===0?me(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 h of me(c.stdout))o.add(h),a.includes(h)||a.push(h)}return a.filter(c=>!i.has(c)).map(c=>({platform:G,kind:"emulator",id:c,displayName:c,state:"stopped",virtualName:c,...pe(g(c))}))}async function M(){let i=await p("adb");if(!i)return[];let n=await D(i.path),s=new Set;for(let d of n){if(d.kind!=="emulator"||d.state!=="ready")continue;let c=await y(i.path,d.id);c&&(d.virtualName=c,d.displayName=c,Object.assign(d,pe(g(c))),s.add(c))}let a=await E(s);return[...n,...a]}function C(i){let n=(e.readFileIfAny??q)(i);if(!n)return;let s=n.split(/\r?\n/).find(a=>/^FATAL\b/.test(a.trim()));return s?s.replace(/^FATAL\s*\|\s*/,"").trim():void 0}function j(i,n,s){let a=[`${i} could not start: ${n}`];return/multiple emulators with the same AVD/i.test(n)&&a.push(`Another emulator is already using ${i}. Close it (or quit the Android`,"Emulator app), then retry \u2014 kane-cli clears the lock a killed emulator","leaves behind, but it will not take an AVD away from a live one."),a.push(`Full output: ${s}`),a.join(`
|
|
12
|
+
`)}function De(i,n){return[`${i} did not finish booting within ${X/1e3}s.`,n?`It attached as ${n} but never reported sys.boot_completed=1.`:"It never attached to adb.",`Its own output: ${fe(i)}`,"The emulator process may still be running \u2014 check its window for errors.","Common causes: no hardware acceleration (install the Android Emulator","hypervisor driver / enable KVM); a corrupt AVD (recreate it in Android","Studio's Device Manager); or a boot that is merely slow \u2014 software GL","rendering under memory pressure can exceed",`${X/1e3}s on a loaded machine (raise it with`,"KANE_CLI_EMULATOR_BOOT_TIMEOUT_MS)."].join(`
|
|
13
|
+
`)}async function Te(i,n,s){let a=await p("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 d=new Set((await D(i)).map(P=>P.id)),c=o.has(n);c&&await e.sdkSuite.ensureSdkRootMarkers();let h=c?{...e.env,...e.sdkSuite.environment()}:void 0,x=await b(n);if(x.state==="stale"){s?.(`clearing a stale lock left by a previous ${n} emulator\u2026`);for(let P of x.paths)(e.removeFile??he)(P)}let T=fe(n);x.state==="held"?s?.(`${n} is already starting (pid ${x.pid}) \u2014 waiting for it\u2026`):(e.spawnDetached(a.path,["-avd",n],h,T),s?.(`booting ${n}\u2026 (log: ${T})`));let B=async()=>{let P=await D(i),te=P.find(N=>N.kind==="emulator"&&!d.has(N.id));if(te)return te.id;for(let N of P)if(!(N.kind!=="emulator"||N.state!=="ready")&&await y(i,N.id)===n)return N.id},U=x.state!=="held",O=e.now()+X,k=await B();for(k&&s?.(`${n} attached as ${k}, waiting for boot\u2026`);e.now()<O;){if(k&&(await e.exec(i,["-s",k,"shell","getprop","sys.boot_completed"],{timeoutMs:1e4})).stdout.trim()==="1")return k;if(await e.sleep(it),U){let P=C(T);if(P)throw new Error(j(n,P,T))}k||(k=await B(),k&&s?.(`${n} attached as ${k}, waiting for boot\u2026`))}throw new Error(De(n,k))}async function Pe(i,n){let s=await w();if(i.state==="ready")return Q(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,d=await Te(s,a,n);return Q({...i,kind:"emulator",id:d,displayName:a,state:"ready",virtualName:a},s)}async function Q(i,n){let[s,a,d,c]=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.build.version.release"],{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})]),h=s.code===0?ct(s.stdout):void 0,x=a.code===0?a.stdout.trim():"",T=mt(d.code===0&&d.stdout.trim()!==""?d.stdout:c.stdout);return{...i,...h!==void 0?{androidApiLevel:h}:{},...x!==""?{osVersion:x}:{},...T.length>0?{androidAbis:T}:{}}}async function ee(i){let n=await w(),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 ut(s.stdout)}async function _e(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}).
|
|
14
|
+
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.
|
|
15
|
+
Pass the package name explicitly with --app <package>.`);return n.trim()}async function Me(i,n,s){let a=await w();s?.(`installing ${n} on ${i.id}\u2026`);let d=await e.exec(a,["-s",i.id,"install","-r",n],{timeoutMs:nt}),c=`${d.stdout}
|
|
16
|
+
${d.stderr}`;if(d.code===0&&!/\bFailure\b/i.test(c))return;let h=ft(c),x=[`Installing ${n} on ${i.id} failed (adb exited ${d.code}).`,c.trim()];throw h&&x.push("",h),new Error(x.filter(T=>T!=="").join(`
|
|
17
|
+
`))}async function Ie(i,n,s){if(n.kind==="package"){let a=await ee(i);if(a.includes(n.value))return n.value;let d=W(n.value,a),c=[`${n.value} is not installed on ${i.displayName} (${i.id}).`];throw d.length>0?c.push("Close matches:",...d.map(h=>` ${h}`)):c.push("Pass a local .apk path to --app to install it instead."),new Error(c.join(`
|
|
18
|
+
`))}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 Me(i,n.value,s),_e(n.value)}async function $e(){let i=await e.mobileDeps.status("emulator");return i.installed?{status:i,env:await e.mobileDeps.environment("emulator")}:null}async function Ee(i={}){let n=[],s=await $e(),a=await e.mobileDeps.status("emulator"),d=await p("adb");if(d){let O=await e.exec(d.path,["version"],{timeoutMs:1e4}),k=lt(O.stdout);n.push({id:"android.adb",fixedByBundle:!0,label:"adb",required:!0,status:"pass",detail:k?`platform-tools ${k} \xB7 ${d.path}`:d.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 --target emulator --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:A(z(s.env.appiumHome),"appium","node_modules",".bin",S())}):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:ce}:{}}),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:ce}});let h=A(e.home,".testmuai","kaneai","mobile","trees");e.fileExists(h)&&n.push({id:"android.legacy-trees",label:"legacy toolchain trees",required:!1,status:"info",detail:`${h} predates the deps bundle \u2014 removed automatically by the next bundle install`});let x=await l("adb");x&&n.push({id:"android.system-adb",label:"system adb",required:!1,status:"info",detail:`${x} (ignored; managed adb always wins and may restart its server)`});let T=await l("appium");T&&n.push({id:"android.system-appium",label:"system Appium",required:!1,status:"info",detail:`${T} (ignored; managed Appium always wins)`});let B=await e.sdkSuite.status(),U=await p("emulator");if(B.emulator?n.push({id:"android.emulator",label:"emulator",required:!1,status:"pass",detail:`managed emulator \xB7 ${e.sdkSuite.emulatorPath()}`}):U?n.push({id:"android.emulator",label:"emulator",required:!1,status:"info",detail:`${U.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 O=await e.exec("sysctl",["-n","kern.hv_support"],{timeoutMs:5e3});n.push({id:"android.virtualization",label:"virtualization",required:!1,status:"info",detail:O.code===0&&O.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 Ne(i){let n=await e.mobileDeps.environment("emulator"),s=[...n.dirs],a=r.emulator,d=a?.source==="sdk"?z(a.path):void 0;return d&&!s.includes(d)&&s.push(d),{...n,dirs:s}}async function Oe(i,n){let s=await w(),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:G,available:()=>!0,checks:Ee,discover:M,prepare:Pe,listApps:ee,ensureApp:Ie,teardownPlan:Oe,toolEnv:Ne}}import{mkdtemp as be,readdir as xt,rm as ye,writeFile as kt}from"fs/promises";import{tmpdir as Ae}from"os";import{join as L}from"path";var Se="ios",Dt=12e4,Tt=3e5,Pt="an .ipa cannot be installed on a simulator \u2014 use a .zip of the .app build";function _t(t){let e=/\.iOS-(\d+)-(\d+)$/.exec(t);return e?`${e[1]}.${e[2]}`:void 0}function Mt(t){let e;try{e=JSON.parse(t)}catch{return[]}let r=[];for(let[o,u]of Object.entries(e.devices??{})){let g=_t(o);for(let f of u??[]){let v=typeof f.udid=="string"?f.udid:void 0,b=typeof f.name=="string"?f.name:void 0;if(!v||!b)continue;let S=f.state==="Booted"?"ready":f.state==="Shutdown"?"stopped":"offline",I=typeof f.deviceTypeIdentifier=="string"?f.deviceTypeIdentifier.replace(/^com\.apple\.CoreSimulator\.SimDeviceType\./,""):void 0;r.push({platform:Se,kind:"simulator",id:v,displayName:b,state:S,virtualName:b,...g?{osVersion:g}:{},...I?{modelIdentifier:I}:{}})}}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 g=u.CFBundleIdentifier??o;r.includes(g)||r.push(g)}return r.sort()}function $t(t){let e;try{e=JSON.parse(t)}catch{return[]}let r=[];for(let[o,u]of Object.entries(e)){let g=u?.CFBundleIdentifier??o;g&&!r.includes(g)&&r.push(g)}return r.sort()}var Y=16;function Et(t){return/^Xcode (\d+(?:\.\d+)*)/m.exec(t)?.[1]}async function Nt(t){let e=await be(L(Ae(),"kane-app-unzip-")),r=()=>ye(e,{recursive:!0,force:!0}),o=await $("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,L(e,"Payload")]){let g;try{g=await xt(u)}catch{continue}let f=g.find(v=>v.toLowerCase().endsWith(".app"));if(f)return{appPath:L(u,f),cleanup:r}}throw await r(),new Error(`${t} does not contain a .app bundle.`)}async function Ot(t){let e=await be(L(Ae(),"kane-plist-"));try{let r=L(e,"input.plist");await kt(r,t);let o=await $("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 ye(e,{recursive:!0,force:!0})}}function Rt(){return{exec:$,os:process.platform,convertPlistToJson:Ot,mobileDeps:{status:()=>R().status("simulator"),environment:()=>R().environment("simulator")}}}function xe(t={}){let e={...Rt(),...t};async function r(l,m=3e4){return e.exec("xcrun",["simctl",...l],{timeoutMs:m})}async function o(){let l=await r(["list","devices","available","--json"]);return l.code!==0?[]:Mt(l.stdout)}async function u(){return o()}async function g(l,m){let p=await e.exec("open",["-a","Simulator","--args","-CurrentDeviceUDID",l],{timeoutMs:15e3});p.code!==0&&m?.(`could not open Simulator.app (${p.stderr.trim()||`exit ${p.code}`}); the device is booted and the run continues headless`)}async function f(l,m){if(l.state!=="ready"&&l.state!=="stopped")throw new Error(`${l.displayName} (${l.id}) is ${l.state}; open Simulator.app to inspect it, then retry.`);l.kind==="simulator"&&await g(l.id,m),l.state==="stopped"&&m?.(`booting ${l.displayName}\u2026`);let p=await r(["bootstatus",l.id,"-b"],Dt);if(p.code!==0)throw new Error(`Could not boot ${l.displayName}: ${p.stderr.trim()||p.stdout.trim()||`simctl bootstatus exited ${p.code}`}`);let w=(await o()).find(D=>D.id===l.id);if(w?.state==="ready")return w;throw new Error(`${l.displayName} finished booting but simctl still reports it as ${w?.state??"missing"}.`)}async function v(l){let m=await r(["listapps",l.id]);if(m.code!==0)throw new Error(`Could not list apps on ${l.displayName}: ${m.stderr.trim()||`simctl exited ${m.code}`}`);return It(await e.convertPlistToJson(m.stdout))}async function b(l){let m=L(l,"Info.plist"),p=await e.exec("plutil",["-convert","json","-o","-",m],{timeoutMs:15e3});if(p.code!==0)throw new Error(`${l} Info.plist could not be read: ${p.stderr.trim()||`plutil exited ${p.code}`}`);let w;try{w=JSON.parse(p.stdout)}catch{throw new Error(`${l} Info.plist did not contain valid JSON from plutil.`)}if(!w.CFBundleIdentifier)throw new Error(`${l} has no CFBundleIdentifier in its Info.plist.`);return w.CFBundleIdentifier}async function S(l,m,p){if(m.kind==="package"){let y=await r(["listapps",l.id]);if(y.code!==0)throw new Error(`Could not list apps on ${l.displayName}: ${y.stderr.trim()||`simctl exited ${y.code}`}`);let E=$t(await e.convertPlistToJson(y.stdout));if(E.includes(m.value))return m.value;let M=W(m.value,E),C=[`${m.value} is not installed on ${l.displayName} (${l.id}).`];throw M.length>0?C.push("Close matches:",...M.map(j=>` ${j}`)):C.push("Pass a .zip of the .app bundle to install it instead."),new Error(C.join(`
|
|
19
|
+
`))}if(m.kind==="ipa")throw new Error(`${Pt}.`);if(m.kind!=="app"&&m.kind!=="zip")throw new Error(`${m.kind} artifacts are Android-only and not installable on iOS.`);let w=m.value,D;if(m.kind==="zip"){p?.(`unpacking ${m.value}\u2026`);let y=await Nt(m.value);w=y.appPath,D=y.cleanup}p?.(`installing ${w} on ${l.displayName}\u2026`);try{let y=await r(["install",l.id,w],Tt);if(y.code!==0)throw new Error(`Installing ${m.value} on ${l.displayName} failed: ${y.stderr.trim()||y.stdout.trim()}`);return await b(w)}finally{await D?.()}}async function I(l={}){let m=[],p=await e.exec("xcode-select",["-p"],{timeoutMs:1e4});if(p.code===0&&p.stdout.trim()!==""){let E=await e.exec("xcodebuild",["-version"],{timeoutMs:3e4}),M=E.code===0?Et(E.stdout):void 0;M?Number(M.split(".")[0])<Y?m.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:`Xcode ${M} is older than the required Xcode ${Y}`,fixText:`Update Xcode to ${Y} or newer from the App Store.`}):m.push({id:"ios.xcode",label:"Xcode",required:!0,status:"pass",detail:`Xcode ${M} \xB7 ${p.stdout.trim()}`}):m.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:`${p.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 m.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});m.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 D=!l.appiumUrl,y=await e.mobileDeps.status();return m.push({id:"ios.xcuitest",fixedByBundle:!0,label:"xcuitest driver",required:D,status:y.installed?"pass":D?"fail":"info",detail:y.installed?"bundled in the managed mobile deps (with prebuilt WDA)":l.appiumUrl?"managed driver not required because --appium-url is set":y.corrupt??"the simulator deps bundle is not installed",...y.installed||!D?{}:{fixText:"Run `kane-cli doctor --target simulator --install` to download the simulator deps bundle."}}),m}async function H(l,m){let p=[];return m.appPackage&&p.push({label:`closing ${m.appPackage}`,file:"xcrun",args:["simctl","terminate",l.id,m.appPackage]}),m.shutdown&&p.push({label:`shutting down ${l.displayName}`,file:"xcrun",args:["simctl","shutdown",l.id]}),p}return{platform:Se,available:()=>e.os==="darwin",checks:I,discover:u,prepare:f,listApps:v,ensureApp:S,teardownPlan:H,toolEnv:()=>e.mobileDeps.environment()}}var ke=[we(),xe()];function V(){return ke.filter(t=>t.available())}function mi(){return V().map(t=>t.platform)}function pi(){return ke.map(t=>t.platform)}function Lt(t){let e=t.toLowerCase();return V().find(r=>r.platform.toLowerCase()===e)}async function Ct(t){let e=t?V().filter(o=>o.platform.toLowerCase()===t.toLowerCase()):V(),r=[];for(let o of e)try{r.push(...await o.discover())}catch{}return r}function Ft(t){return t.name!==void 0?`--device-name "${t.name}" --os-version ${t.osVersion}`:`os_version ${t.osVersion}`}function Z(t){return`
|
|
20
|
+
See devices: kane-cli devices list --target ${t?.toLowerCase()==="ios"?"simulator":t?.toLowerCase()==="android"?"emulator":"<emulator|simulator>"}`}async function fi(t,e={}){let r=e.discover??Ct,o=e.providerFor??Lt,u=await r(t.platform),g=b=>{let S=o(b.platform);return S?{ok:!0,target:b,provider:S}:{ok:!1,reason:"not-found",candidates:u,message:`No provider is registered for platform '${b.platform}'.`}};if(t.device){let b=u.filter(S=>ie(S,t.device));return b.length===0?{ok:!1,reason:"not-found",candidates:u,message:`No device matches ${Ft(t.device)}.`+(u.length>0?Z(t.platform):" No devices were found \u2014 run `kane-cli doctor --target <emulator|simulator>`.")}:g(K(b))}let f=t.defaultTarget;if(f&&(!t.platform||t.platform.toLowerCase()===f.platform.toLowerCase())){let b=u.filter(I=>ne(I,f)),S=K(b);return S?g(S):{ok:!1,reason:t.interactive?"needs-picker":"not-found",candidates:u,message:`The saved default device ${re(f)} (${f.platform} \xB7 ${f.kind}) is not connected. `+(t.interactive?"Pick a target to bind this run.":"Pass --device-name <name> --os-version <version> explicitly \u2014 kane-cli never binds a different device on its own.")+(u.length>0?Z(f.platform):"")}}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 devices list --target <emulator|simulator>`."};let v=u.filter(b=>b.state==="ready");return v.length===1?g(v[0]):t.interactive?{ok:!1,reason:"needs-picker",candidates:u,message:v.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:(v.length===0?"No target is ready.":`${v.length} targets are ready.`)+" Pass --device-name <name> --os-version <version>."+Z(t.platform)}}export{Ht as a,mi as b,pi as c,Lt as d,Ct as e,fi as f};
|