@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.
Files changed (247) hide show
  1. package/dist/{ChatSurface-S2P7WMBI.js → ChatSurface-3PEXML4X.js} +1 -1
  2. package/dist/{ChromeProfilePicker-7DTJK2QW.js → ChromeProfilePicker-E3CZ52RH.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-Y3OYZX54.js → CliFeedbackPrompt-BEVZRLQA.js} +1 -1
  4. package/dist/{CliUploadProgress-I3N5WDNJ.js → CliUploadProgress-V2FLLVR6.js} +1 -1
  5. package/dist/ConfigView-ZOGKVFQT.js +2 -0
  6. package/dist/EvidenceViewOffer-KWX27WNZ.js +2 -0
  7. package/dist/FolderPicker-EIKQSSF6.js +2 -0
  8. package/dist/{InfoBox-QBXPPMM2.js → InfoBox-4TNE7QMG.js} +1 -1
  9. package/dist/{LinksBox-L24KON4U.js → LinksBox-TXO5X5UD.js} +1 -1
  10. package/dist/{ProfilesView-H6XCTIXI.js → ProfilesView-S4YPEZEF.js} +1 -1
  11. package/dist/{ProjectPicker-F6JGF2B3.js → ProjectPicker-LWFX2QT2.js} +1 -1
  12. package/dist/{SaveSessionPrompt-QGO65DZN.js → SaveSessionPrompt-MJTCIQIZ.js} +1 -1
  13. package/dist/SingleShotApp-5LCIH6DQ.js +2 -0
  14. package/dist/{SummaryBox-OZIZQY4B.js → SummaryBox-UIVK3QDR.js} +1 -1
  15. package/dist/TestMdRunView-RE5GX5QX.js +2 -0
  16. package/dist/{TestrunEvidenceTable-A7WTTKTV.js → TestrunEvidenceTable-GYGVNCYW.js} +1 -1
  17. package/dist/{WhoamiView-EB5AV27X.js → WhoamiView-NRGMMLL4.js} +1 -1
  18. package/dist/{app-download-SQ4RDY3E.js → app-download-HTQOD3YF.js} +1 -1
  19. package/dist/{auth-TW24FZQF.js → auth-5URO2XJU.js} +1 -1
  20. package/dist/{binary-5LMQJ3CZ.js → binary-2U4YTTFS.js} +1 -1
  21. package/dist/{bind-SJ6DOVQ4.js → bind-NO4TMSHJ.js} +3 -3
  22. package/dist/{bootstrap-BTEXO6HX.js → bootstrap-UOEW3VZM.js} +1 -1
  23. package/dist/bridge-P2EBLXPY.js +2 -0
  24. package/dist/{changelog-JLSLSA3Y.js → changelog-7BPYLUDK.js} +1 -1
  25. package/dist/chat-committer-GUK6IBCL.js +2 -0
  26. package/dist/{chat-controller-R4THYYPU.js → chat-controller-6GUUMUVP.js} +1 -1
  27. package/dist/{chunk-IWM5EZC3.js → chunk-2RO2BWCZ.js} +2 -2
  28. package/dist/chunk-3BY7MX3D.js +8 -0
  29. package/dist/{chunk-USI2WMAK.js → chunk-3IM5QGVV.js} +1 -1
  30. package/dist/{chunk-PT7V5WDQ.js → chunk-3YKNJIVB.js} +1 -1
  31. package/dist/{chunk-TKYJTXWL.js → chunk-44PZPNXJ.js} +1 -1
  32. package/dist/{chunk-FYS5VIOG.js → chunk-46HYKID6.js} +2 -2
  33. package/dist/{chunk-E5S4BASB.js → chunk-4EFDEDTL.js} +1 -1
  34. package/dist/chunk-5ZV64NAG.js +5 -0
  35. package/dist/{chunk-QISE272H.js → chunk-6AUSG5SB.js} +1 -1
  36. package/dist/{chunk-ATWDQCDA.js → chunk-6YVVTYVO.js} +1 -1
  37. package/dist/{chunk-GC5U55MW.js → chunk-72J4V3DA.js} +1 -1
  38. package/dist/{chunk-ZLSWHCWO.js → chunk-76ILJPZF.js} +1 -1
  39. package/dist/{chunk-3UUPP5W3.js → chunk-7CU5EBC6.js} +1 -1
  40. package/dist/{chunk-KLTKEGDH.js → chunk-7EFG27IZ.js} +4 -4
  41. package/dist/{chunk-JCD6FP7A.js → chunk-7UCICMK7.js} +3 -3
  42. package/dist/{chunk-JN44V63O.js → chunk-7VAE7WXF.js} +2 -2
  43. package/dist/{chunk-TDS6LG6T.js → chunk-A66ZGHO2.js} +1 -1
  44. package/dist/chunk-AJXOJF2X.js +4 -0
  45. package/dist/{chunk-TZFT7R7B.js → chunk-AUERMBX5.js} +1 -1
  46. package/dist/{chunk-4NSP2NPT.js → chunk-B27X3C2E.js} +1 -1
  47. package/dist/chunk-B2KXIFZD.js +2 -0
  48. package/dist/{chunk-WMQJBEQP.js → chunk-BISBPWN3.js} +1 -1
  49. package/dist/{chunk-GELPKSLC.js → chunk-BPHQNTUD.js} +1 -1
  50. package/dist/{chunk-JFAFKHDX.js → chunk-BZAGVBCX.js} +1 -1
  51. package/dist/{chunk-2DCNCH32.js → chunk-C4OVX65Q.js} +1 -1
  52. package/dist/{chunk-SQGBFCFO.js → chunk-C5ZIKKIB.js} +1 -1
  53. package/dist/{chunk-DZCG7FFP.js → chunk-C765HUXU.js} +1 -1
  54. package/dist/{chunk-KQ2MYMOS.js → chunk-DJC6MLO4.js} +1 -1
  55. package/dist/{chunk-2R7KL7YG.js → chunk-DMOZM22N.js} +1 -1
  56. package/dist/{chunk-D4SRHIJ5.js → chunk-DSNB7EI6.js} +1 -1
  57. package/dist/{chunk-TQKIE7AX.js → chunk-DTBKKC2R.js} +1 -1
  58. package/dist/chunk-E5C3HUIY.js +2 -0
  59. package/dist/chunk-E5Q5CDOX.js +2 -0
  60. package/dist/{chunk-VOBXYDJW.js → chunk-E6AF53HZ.js} +42 -43
  61. package/dist/chunk-EU5ZH334.js +2 -0
  62. package/dist/{chunk-GFKCTYCA.js → chunk-F43KOMVB.js} +1 -1
  63. package/dist/{chunk-ZRKPZLLG.js → chunk-F7RR24BL.js} +1 -1
  64. package/dist/{chunk-MKSTP2XN.js → chunk-FVKLNQ4T.js} +2 -2
  65. package/dist/{chunk-ZGBSGZZM.js → chunk-GAO6ZMCT.js} +1 -1
  66. package/dist/chunk-GDB2V6QA.js +21 -0
  67. package/dist/{chunk-RX5TZZNQ.js → chunk-GJ6RJVXH.js} +1 -1
  68. package/dist/{chunk-XJILZ2WN.js → chunk-GYTZLUFV.js} +1 -1
  69. package/dist/{chunk-OYJBABRV.js → chunk-HAGJA7KG.js} +1 -1
  70. package/dist/{chunk-7KORP5FF.js → chunk-HEWWWMUN.js} +1 -1
  71. package/dist/{chunk-SQC4P2Q7.js → chunk-HHQ67JCU.js} +1 -1
  72. package/dist/chunk-HL4UXOHV.js +2 -0
  73. package/dist/{chunk-DUAXZYAD.js → chunk-HLXOYLZV.js} +3 -3
  74. package/dist/{chunk-Z35BUPZT.js → chunk-HO3T5LJH.js} +1 -1
  75. package/dist/{chunk-FJYDEWOA.js → chunk-IJABR5SX.js} +1 -1
  76. package/dist/chunk-ILKSL4PI.js +4 -0
  77. package/dist/{chunk-YZ45OEH3.js → chunk-IQBKCLLR.js} +1 -1
  78. package/dist/{chunk-KDXQNLVV.js → chunk-IRPAWAK7.js} +2 -2
  79. package/dist/{chunk-3LEVCW6R.js → chunk-K7VX6YIT.js} +1 -1
  80. package/dist/{chunk-7VZCXW74.js → chunk-LOMPRMG3.js} +1 -1
  81. package/dist/{chunk-5COGCNED.js → chunk-LRZXVDPY.js} +1 -1
  82. package/dist/chunk-LWZ7EIXX.js +2 -0
  83. package/dist/{chunk-YEQVJWEF.js → chunk-MROHDW4W.js} +1 -1
  84. package/dist/{chunk-OFW3ZVTP.js → chunk-N2N5T5JN.js} +1 -1
  85. package/dist/{chunk-TYI4MLFJ.js → chunk-NM6PEYED.js} +1 -1
  86. package/dist/{chunk-RZLD7TPG.js → chunk-NQFAZM2D.js} +1 -1
  87. package/dist/{chunk-EXERQHXV.js → chunk-OADHU5HL.js} +1 -1
  88. package/dist/{chunk-S66MCU2Y.js → chunk-OHD4CZXT.js} +1 -1
  89. package/dist/{chunk-SS5TOK2J.js → chunk-P4JUY54O.js} +1 -1
  90. package/dist/chunk-Q3S5EKX5.js +21 -0
  91. package/dist/{chunk-AFPHLUQ5.js → chunk-Q4CTSXDM.js} +1 -1
  92. package/dist/{chunk-A44G533S.js → chunk-QQ67Z4IW.js} +1 -1
  93. package/dist/{chunk-NT3UETTV.js → chunk-QZB7CBRO.js} +1 -1
  94. package/dist/{chunk-FUNKVREV.js → chunk-R2JRQD4I.js} +1 -1
  95. package/dist/{chunk-CLGC7VEO.js → chunk-SWXEBLKX.js} +1 -1
  96. package/dist/{chunk-IGJIDN4U.js → chunk-SZTUZZEA.js} +1 -1
  97. package/dist/{chunk-RDNKYRKY.js → chunk-T3DVIDBA.js} +1 -1
  98. package/dist/{chunk-B4Q6FMIP.js → chunk-T4LAHU57.js} +3 -3
  99. package/dist/{chunk-XY325HDJ.js → chunk-TKQSIKMR.js} +1 -1
  100. package/dist/{chunk-BN6AHQL7.js → chunk-TMFFHGCT.js} +4 -4
  101. package/dist/{chunk-FMUCZWS3.js → chunk-U35Y7SGB.js} +1 -1
  102. package/dist/{chunk-V444REBC.js → chunk-UASEGQ7B.js} +1 -1
  103. package/dist/{chunk-INK66XQS.js → chunk-UFYIQ4E3.js} +1 -1
  104. package/dist/chunk-UOLERTKE.js +2 -0
  105. package/dist/{chunk-VMCSRLRC.js → chunk-VHA7UNDW.js} +1 -1
  106. package/dist/{chunk-P3RKXL3V.js → chunk-VMRP44MN.js} +1 -1
  107. package/dist/{chunk-4ONGF4NT.js → chunk-VOXDZS4N.js} +1 -1
  108. package/dist/{chunk-6KPPGMO2.js → chunk-WNHLKDOT.js} +1 -1
  109. package/dist/chunk-X7R2JWOJ.js +4 -0
  110. package/dist/chunk-XAQ3Y63J.js +21 -0
  111. package/dist/chunk-YC2TFACE.js +5 -0
  112. package/dist/{chunk-AWD56KGX.js → chunk-YC6HYBLN.js} +1 -1
  113. package/dist/{chunk-AO3PBE2V.js → chunk-YDEK2FJQ.js} +1 -1
  114. package/dist/chunk-YGVY63PE.js +20 -0
  115. package/dist/chunk-YKYZKBMH.js +26 -0
  116. package/dist/{chunk-C4WTZSX4.js → chunk-YYSWJU6H.js} +1 -1
  117. package/dist/{chunk-VRVFPMCR.js → chunk-Z3EEMIVV.js} +1 -1
  118. package/dist/{chunk-YHTYPTDD.js → chunk-Z7HUW3L4.js} +1 -1
  119. package/dist/chunk-Z7S3IWUX.js +2 -0
  120. package/dist/{chunk-CLLQQPBZ.js → chunk-ZFRWVWUR.js} +1 -1
  121. package/dist/{chunk-DN3E6RT6.js → chunk-ZH2ROVHE.js} +2 -2
  122. package/dist/committer-JC6BIBNR.js +2 -0
  123. package/dist/{config-6TQIMTNB.js → config-XNDP425N.js} +1 -1
  124. package/dist/cover-cmd-HREOYWWD.js +3 -0
  125. package/dist/{credentials-ZSNM4BTD.js → credentials-ZTBWB3LK.js} +1 -1
  126. package/dist/{deps-bundle-D2ZC2SPT.js → deps-bundle-OHCYH5KL.js} +1 -1
  127. package/dist/{deps-resolve-VRBMFUTX.js → deps-resolve-K2NX2W3K.js} +1 -1
  128. package/dist/design-committer-IIHKNEYF.js +2 -0
  129. package/dist/device-ref-LAZWPRQN.js +2 -0
  130. package/dist/dispatch-JZWIFKRB.js +2 -0
  131. package/dist/doctor-XXOGVMAI.js +2 -0
  132. package/dist/dossier-2M62K2PA.js +3 -0
  133. package/dist/evidence-FN2SQB6Z.js +2 -0
  134. package/dist/evolve-cmd-WQB7E2B5.js +2 -0
  135. package/dist/{explain-UAAQWHYR.js → explain-AOZNHWMB.js} +1 -1
  136. package/dist/{explain-cmd-2TKO7GRW.js → explain-cmd-2SCD5T6U.js} +1 -1
  137. package/dist/{explain-cmd-EX24XKD6.js → explain-cmd-7VTWRROR.js} +1 -1
  138. package/dist/{extract-bind-TJ2STXV5.js → extract-bind-3YXY7ZU2.js} +3 -3
  139. package/dist/{extract-cmd-FLOYO6HL.js → extract-cmd-WGXEJ54C.js} +2 -2
  140. package/dist/{feeder-C3TOJPKK.js → feeder-GVZSWX6Q.js} +1 -1
  141. package/dist/gaps-cmd-MFZ52DC7.js +3 -0
  142. package/dist/{generate-headless-DBT4MKQT.js → generate-headless-PCNAJ2LS.js} +2 -2
  143. package/dist/index.js +137 -131
  144. package/dist/ingest-TTSDUMH5.js +2 -0
  145. package/dist/ingest-cmd-D2MD6EAK.js +2 -0
  146. package/dist/install-RHINEFR5.js +2 -0
  147. package/dist/{interactive-bind-7UDJY4CF.js → interactive-bind-ZFMG2JIX.js} +4 -4
  148. package/dist/lifecycle-cmd-5FRGYY3M.js +2 -0
  149. package/dist/list-cmd-DD4WYJSH.js +3 -0
  150. package/dist/{list-commands-DA4ZXOPJ.js → list-commands-64THS67Y.js} +1 -1
  151. package/dist/logical-ids-U2OUMYCP.js +2 -0
  152. package/dist/login-flow-B5J6JXQN.js +2 -0
  153. package/dist/{maintenance-cmd-6XSVO6FO.js → maintenance-cmd-7V44VGL4.js} +1 -1
  154. package/dist/{mobile-prompts-JS7GPVKS.js → mobile-prompts-RITBS32L.js} +1 -1
  155. package/dist/{persist-recorded-session-LE3LGFOS.js → persist-recorded-session-Z5SCYWXR.js} +1 -1
  156. package/dist/phase-seed-ATH337WF.js +2 -0
  157. package/dist/pipeline-HMFLLUZJ.js +2 -0
  158. package/dist/prepare-target-HOEFIKXN.js +2 -0
  159. package/dist/readmodel-UZETCXV6.js +2 -0
  160. package/dist/reconcile-cmd-Q7CBNPRX.js +2 -0
  161. package/dist/reconcile-deps-XEUZHUQX.js +4 -0
  162. package/dist/reconcile-engine-ES2INERY.js +2 -0
  163. package/dist/{recording-banner-YMKWR3M3.js → recording-banner-NLS7K2RV.js} +1 -1
  164. package/dist/records-XWF6KDQH.js +2 -0
  165. package/dist/registry-E5RSXYQJ.js +2 -0
  166. package/dist/{require-project-folder-3KS7KTME.js → require-project-folder-V4F74R4A.js} +1 -1
  167. package/dist/resolve-run-intent-WSOCGJUN.js +2 -0
  168. package/dist/{resolver-V5VP5FLT.js → resolver-7EAM4A6O.js} +1 -1
  169. package/dist/revert-2UCOMQ4J.js +2 -0
  170. package/dist/review-cmd-VN6VGUWJ.js +4 -0
  171. package/dist/run-45ODACZR.js +2 -0
  172. package/dist/run-ZYARNPAS.js +2 -0
  173. package/dist/{run-test-md-FO2RNNOD.js → run-test-md-CPGKD3DD.js} +2 -2
  174. package/dist/{sessions-cmd-ZZIZN2VB.js → sessions-cmd-ME7NM6ES.js} +1 -1
  175. package/dist/{skill-installer-W4TT5MST.js → skill-installer-WEV2M32J.js} +1 -1
  176. package/dist/{spawner-ZSYJQGQW.js → spawner-GG6YQB4A.js} +1 -1
  177. package/dist/{structured-answers-5EY2AZN7.js → structured-answers-2WOTULBQ.js} +1 -1
  178. package/dist/tcg-generate-DASCY23M.js +2 -0
  179. package/dist/{testmd-actions-NPILETCQ.js → testmd-actions-X6HEL5NH.js} +1 -1
  180. package/dist/token-refresh-ZTQFC3Q3.js +2 -0
  181. package/dist/{validate-basic-727KRHX6.js → validate-basic-QJL4DCKY.js} +1 -1
  182. package/dist/verdicts-CRNN765C.js +2 -0
  183. package/dist/{version-check-A2JQYRI2.js → version-check-KONSQ4M3.js} +1 -1
  184. package/dist/{view-cmd-KPJTP4DI.js → view-cmd-ZSMU4I4J.js} +1 -1
  185. package/dist/walk-session-X2N4XHLU.js +2 -0
  186. package/dist/{with-telemetry-HSD6CXDS.js → with-telemetry-Y6MVROKX.js} +1 -1
  187. package/package.json +11 -11
  188. package/dist/ConfigView-EOYCKYJS.js +0 -2
  189. package/dist/EvidenceViewOffer-AQ3KB3EN.js +0 -2
  190. package/dist/FolderPicker-RCHRYYC4.js +0 -2
  191. package/dist/SingleShotApp-AY3XFEYT.js +0 -2
  192. package/dist/TestMdRunView-RPW4MIJA.js +0 -2
  193. package/dist/bridge-GQJ35GTL.js +0 -2
  194. package/dist/chat-committer-ZWWCLJFD.js +0 -2
  195. package/dist/chunk-3Q6WAK6P.js +0 -2
  196. package/dist/chunk-B5QGIUJA.js +0 -26
  197. package/dist/chunk-BRTARADN.js +0 -4
  198. package/dist/chunk-CZUOGGUK.js +0 -2
  199. package/dist/chunk-DEZ7CXGM.js +0 -21
  200. package/dist/chunk-ESC7AOCX.js +0 -2
  201. package/dist/chunk-LN7233E2.js +0 -20
  202. package/dist/chunk-LQQXPY5B.js +0 -4
  203. package/dist/chunk-Q4V2GK5U.js +0 -2
  204. package/dist/chunk-QBG7XEGQ.js +0 -15
  205. package/dist/chunk-QQAAPFIR.js +0 -2
  206. package/dist/chunk-R5T4RLF5.js +0 -2
  207. package/dist/chunk-SORVX3KI.js +0 -7
  208. package/dist/chunk-TH47OOBV.js +0 -4
  209. package/dist/chunk-TRJUD3XJ.js +0 -5
  210. package/dist/chunk-VAYBKR76.js +0 -4
  211. package/dist/chunk-XQFITNA3.js +0 -2
  212. package/dist/chunk-ZSXDZI56.js +0 -20
  213. package/dist/committer-SWEWEYNX.js +0 -2
  214. package/dist/cover-cmd-7JILZJUK.js +0 -3
  215. package/dist/design-committer-VYT6NU3T.js +0 -2
  216. package/dist/dispatch-2PBSJ7YW.js +0 -2
  217. package/dist/doctor-OWRRDA4Z.js +0 -2
  218. package/dist/dossier-KTLTGT2X.js +0 -3
  219. package/dist/evidence-NDAKCCHQ.js +0 -2
  220. package/dist/evolve-cmd-DIA5EWUT.js +0 -2
  221. package/dist/gaps-cmd-3ZX3PZF4.js +0 -3
  222. package/dist/ingest-JO5NJENZ.js +0 -2
  223. package/dist/ingest-cmd-T6HM3AHK.js +0 -2
  224. package/dist/install-NIVU4XVS.js +0 -2
  225. package/dist/lifecycle-cmd-O2324GN6.js +0 -2
  226. package/dist/list-cmd-N4KMA34H.js +0 -3
  227. package/dist/logical-ids-TEBCQJGO.js +0 -2
  228. package/dist/login-flow-NHBJVDW6.js +0 -2
  229. package/dist/phase-seed-DIRETNU6.js +0 -2
  230. package/dist/pipeline-MTAZDCZR.js +0 -2
  231. package/dist/prepare-target-YK2DLDWB.js +0 -2
  232. package/dist/readmodel-XOYGGQ3S.js +0 -2
  233. package/dist/reconcile-cmd-CYRYVS5B.js +0 -2
  234. package/dist/reconcile-deps-FYXRAMF2.js +0 -4
  235. package/dist/reconcile-engine-6AT6EVGS.js +0 -2
  236. package/dist/records-IOZTZUZV.js +0 -2
  237. package/dist/registry-V45ZQ6Q5.js +0 -2
  238. package/dist/resolve-run-intent-W32G6WM6.js +0 -2
  239. package/dist/revert-NQ7GEVSE.js +0 -2
  240. package/dist/review-cmd-DQRKQUMG.js +0 -4
  241. package/dist/run-26IR3CKX.js +0 -2
  242. package/dist/run-5IYI2TJI.js +0 -2
  243. package/dist/tcg-generate-ONLV5GXG.js +0 -2
  244. package/dist/token-refresh-G2CSTY4B.js +0 -2
  245. package/dist/types-O23GN2YM.js +0 -2
  246. package/dist/verdicts-TDJLJJ3F.js +0 -2
  247. package/dist/walk-session-HB3OOWVR.js +0 -2
@@ -1,4 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as u,c as f}from"./chunk-EYOCNMUM.js";import{c as _,j as g}from"./chunk-OFW3ZVTP.js";import{readFileSync as c,writeFileSync as m,mkdirSync as b,existsSync as h}from"fs";import{dirname as v}from"path";var s={window_size:{width:1920,height:1080},chrome_profile_path:"",default_url:g,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 w(r){let{mobile:e,...i}=r,t={...i};delete t.target,delete t.device,delete t.app;let n=e??{};n.tui_target&&(t.target=n.tui_target);let o=n.default_target?.id?.trim();o&&(t.device=o),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 C(r){let e=r.mobile??{},i=typeof r.target=="string"?r.target:void 0,t=typeof r.device=="string"&&r.device.trim()!==""?r.device.trim():void 0,n=typeof r.app=="string"&&r.app!==""?r.app:void 0,o={},a=i??e.tui_target;if(a&&(o.tui_target=a),t){let d=u(a,void 0);(d.kind==="emulator"||d.kind==="simulator")&&(o.default_target={platform:f(d.kind),kind:d.kind,id:t})}else e.default_target?.id?.trim()&&(o.default_target=e.default_target);let l=n??e.default_app;return l&&(o.default_app=l),e.no_reset!==void 0&&(o.no_reset=e.no_reset),e.appium_url!==void 0&&(o.appium_url=e.appium_url),e.auto_grant_permissions!==void 0&&(o.auto_grant_permissions=e.auto_grant_permissions),e.auto_accept_alerts!==void 0&&(o.auto_accept_alerts=e.auto_accept_alerts),Object.keys(o).length>0?o:void 0}var p=class{constructor(e=_){this.path=e}exists(){return h(this.path)}load(){try{let e=c(this.path,"utf-8"),i=JSON.parse(e),t=C(i),{target:n,device:o,app:a,...l}=i;return{...s,...l,...t?{mobile:t}:{},code_export:{...s.code_export,...i.code_export??{}},generate:{...s.generate,...i.generate??{}}}}catch{return{...s,code_export:{...s.code_export},generate:{...s.generate}}}}write(e){try{b(v(this.path),{recursive:!0}),m(this.path,JSON.stringify(w(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{p as a};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as R}from"./chunk-AO3PBE2V.js";import{x as i}from"./chunk-OFW3ZVTP.js";import{a as X}from"./chunk-HCBYKLMW.js";import{a,b as l,i as p}from"./chunk-C44QQJR4.js";import{a as G}from"./chunk-6YGTRKDT.js";import{e as P}from"./chunk-UR6MHSHU.js";var x=P(G(),1);var e=P(X(),1),f=5;function K(t,I){if(!I)return t;let c=I.toLowerCase();return t.filter(B=>B.label.toLowerCase().includes(c))}function J(t){let{title:I,items:c,loading:B=!1,loadingText:Y,error:L=null,itemNoun:v="items",onSelect:F,onCancel:E,defaultActiveId:w,onTab:y,extraHint:H}=t,[g,d]=(0,x.useState)(0),[S,u]=(0,x.useState)(0),[s,A]=(0,x.useState)(""),[C,h]=(0,x.useState)(null);(0,x.useEffect)(()=>{if(c.length===0)return;if(t.preserveSelectionById&&C!==null){let o=c.findIndex(n=>n.id===C);if(o>=0){u(Math.floor(o/f)),d(o%f);return}}let r=w?c.findIndex(o=>o.id===w):c.findIndex(o=>o.isActive);r>=0?(u(Math.floor(r/f)),d(r%f),t.preserveSelectionById&&h(c[r].id)):t.preserveSelectionById&&(u(0),d(0),h(c[0]?.id??null))},[c,w,t.preserveSelectionById,C]),(0,x.useEffect)(()=>{if(!t.onSearch)return;let r=setTimeout(()=>t.onSearch(s),t.searchDebounceMs??250);return()=>clearTimeout(r)},[s,t.onSearch,t.searchDebounceMs]);let b=t.onSearch?c:K(c,s),D=S*f,N=Math.min(D+f,b.length),M=Math.ceil(b.length/f),O=N-D,T=b.slice(D,N);return p((r,o)=>{if(L){o.escape&&E();return}if(o.escape){s?(A(""),d(0),u(0)):E();return}if(o.tab&&y){y();return}if(o.upArrow){if(g>0){let n=g-1;d(n),t.preserveSelectionById&&h(T[n]?.id??null)}else if(S>0){let n=S-1,m=f-1;u(n),d(m),t.preserveSelectionById&&h(b[n*f+m]?.id??null)}return}if(o.downArrow){if(g<O-1){let n=g+1;d(n),t.preserveSelectionById&&h(T[n]?.id??null)}else if(S<M-1){let n=S+1,m=0;u(n),d(m),t.preserveSelectionById&&h(b[n*f+m]?.id??null)}return}if(o.return&&T[g]){if(T[g].disabled)return;F(T[g]);return}if(o.backspace||o.delete){A(n=>n.slice(0,-1)),d(0),u(0);return}r&&!o.ctrl&&!o.meta&&(A(n=>n+r),d(0),u(0))},{isActive:!B}),B?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:i.orange,paddingX:2,paddingY:1,children:[(0,e.jsx)(l,{color:i.orange,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(l,{color:i.secondary,children:Y??`Loading ${v}\u2026`})})]}):L?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:i.red,paddingX:2,paddingY:1,children:[(0,e.jsx)(l,{color:i.red,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(l,{color:i.red,children:L})}),(0,e.jsx)(R,{bindings:[]})]}):(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:i.orange,paddingX:2,paddingY:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(l,{color:i.orange,bold:!0,children:I}),(0,e.jsxs)(l,{color:i.dim,children:[" (",b.length,!t.onSearch&&s?`/${c.length}`:""," ",v,t.loadingMore?" \xB7 loading more":"",")"]})]}),(0,e.jsxs)(a,{marginTop:1,children:[(0,e.jsx)(l,{color:i.secondary,children:s?"filter: ":""}),s?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(l,{children:s}),(0,e.jsx)(l,{inverse:!0,children:" "})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)(l,{color:i.dim,children:["Search ",v,"\u2026"]}),(0,e.jsx)(l,{inverse:!0,children:" "})]})]}),(0,e.jsx)(a,{flexDirection:"column",marginTop:1,children:t.searching?(0,e.jsxs)(l,{color:i.secondary,children:["Searching ",v,"\u2026"]}):b.length===0?(0,e.jsxs)(l,{color:i.dim,children:["No ",v,' match "',s,'"']}):T.map((r,o)=>{let n=o===g,m=n?"\u276F ":" ",$=r.disabled?i.muted:r.isActive?i.green:n?i.orange:void 0;return(0,e.jsxs)(a,{flexDirection:"column",children:[(0,e.jsxs)(l,{color:$,children:[m,r.label,r.isActive&&!r.disabled?" \u25CF selected":""]}),n&&r.disabled&&r.disabledHint&&(0,e.jsxs)(l,{color:i.red,children:[" ",r.disabledHint]})]},r.id)})}),!t.searching&&M>1&&(0,e.jsx)(a,{marginTop:1,children:(0,e.jsxs)(l,{color:i.dim,children:["Page ",S+1,"/",M]})}),t.footer&&(0,e.jsx)(a,{marginTop:1,flexDirection:"column",children:t.footer}),(0,e.jsx)(R,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"type",label:"to search"},{keys:"\u21B5",label:"select"},...y&&H?[{keys:"tab",label:H}]:[]],escBackLabel:s?"clear":"back to chat"})]})}export{J as a};
@@ -1,21 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as j}from"./chunk-VZ7KXRXB.js";import{c as C}from"./chunk-EYOCNMUM.js";import{dirname as z,basename as U,join as y}from"path";function Z(e){let t=U(e);return t.endsWith("_test.md")?t.slice(0,-8):t.endsWith(".md")?t.slice(0,-3):t}function k(e){return y(z(e),`output-${Z(e)}`)}function Te(e){return y(k(e),"Result.md")}function T(e){return y(k(e),".internal")}function O(e){return y(T(e),"meta.json")}function Ae(e,t,r){return y(k(e),`${t}-${r}-code`)}function Ie(e){return y(k(e),"generated-code")}function Le(e){return k(e)+".staging"}function Q(e){return y(T(e),"steps")}function Pe(e,t,r){return y(Q(e),`${t}-${r}`)}import{existsSync as u,renameSync as S,rmSync as _}from"fs";function Ke(e){let t=`${e}.staging`,r=`${e}.bak`;if(!u(t))throw new Error(`atomicReplaceDir: staging missing: ${t}`);if(process.platform==="win32"){u(e)&&_(e,{recursive:!0,force:!0}),S(t,e);return}u(e)&&(u(r)&&_(r,{recursive:!0,force:!0}),S(e,r)),S(t,e),u(r)&&_(r,{recursive:!0,force:!0})}function Ge(e){let t=`${e}.staging`,r=`${e}.bak`;if(process.platform==="win32"){u(t)&&(u(e)?_(t,{recursive:!0,force:!0}):S(t,e));return}if(u(r)&&!u(e)){S(r,e),u(t)&&_(t,{recursive:!0,force:!0});return}u(r)&&u(e)&&_(r,{recursive:!0,force:!0}),u(t)&&u(e)&&_(t,{recursive:!0,force:!0})}import{readFileSync as Se,existsSync as xe}from"fs";import{basename as N,dirname as Re,isAbsolute as $e,resolve as J}from"path";import{dirname as X,isAbsolute as ee,resolve as te}from"path";var d=class extends Error{constructor(r,o,n){super(`[${o}${n!=null?`:${n}`:""}] ${r}`);this.file=o;this.line=n;this.name="TestMdParseError"}},ne=new Set(["username","access_key","oauth","profile","project_id","folder_id"]),A=new Set(["mode","max_steps","timeout","global_context","local_context","variables","session_context","code_export","code_language","url","target","chrome_profile","cdp_endpoint","ws_endpoint","headless","app","no_reset","os_version","on_lock_conflict","tags","assurance"]),I=new Set(["optional"]),re=new Set(["optional","variables"]),oe=new Set(["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"]),ie=new Set(["app","no_reset","os_version"]),se=new Set(["mode","on_lock_conflict","tags","assurance"]);function L(e,t){let r=t.split(`
3
- `),{global:o,bodyStartLine:n}=ae(e,r),{title:a,steps:s}=be(e,r,n);return{path:e,title:a,global:o,steps:s}}function ae(e,t){if(t[0]?.trim()!=="---")return{global:{},bodyStartLine:0};let r=-1;for(let c=1;c<t.length;c++)if(t[c].trim()==="---"){r=c;break}if(r===-1)throw new d("frontmatter is missing closing '---'",e,1);let o=t.slice(1,r).join(`
4
- `),n;try{n=j(o)??{}}catch(c){throw new d(`invalid YAML in frontmatter: ${c.message}`,e,1)}if(V(e,n,"frontmatter",1),n.on_lock_conflict!==void 0){let c=n.on_lock_conflict;if(c!=="readonly"&&c!=="fail"&&c!=="wait")throw new d(`on_lock_conflict must be 'readonly' | 'fail' | 'wait', got: ${JSON.stringify(c)}`,e,1)}if(F(e,n,1),n.assurance!==void 0){let c=n.assurance;if(c===null||typeof c!="object"||Array.isArray(c))throw new d("assurance must be a mapping with sub-keys {id, base}",e,1);let f=c;for(let g of Object.keys(f))if(g!=="id"&&g!=="base")throw new d(`unknown assurance sub-key '${g}' \u2014 the engine block allows only {id, base}`,e,1);if(typeof f.id!="string"||f.id.length===0)throw new d("assurance.id must be a non-empty string (logical id)",e,1);if(f.base!==void 0&&!(typeof f.base=="string"&&/^sha256:[0-9a-f]+$/.test(f.base)))throw new d("assurance.base must be a 'sha256:<hex>' string",e,1)}if(n.tags!==void 0){let c=n.tags,f=Array.isArray(c)?c.map(g=>String(g)).join(","):String(c);n.tags=ce(f,e,1)}if(n.target!==void 0&&(n.target=le(n.target,e,1)),n.app!==void 0&&(n.app=ge(n.app,e,1)),n.no_reset!==void 0&&typeof n.no_reset!="boolean")throw new d(`no_reset must be boolean: got ${typeof n.no_reset}`,e,1);if(n.os_version!==void 0&&typeof n.os_version!="string")if(typeof n.os_version=="number")n.os_version=String(n.os_version);else throw new d(`os_version must be a string: got ${typeof n.os_version}`,e,1);let a=n.target,s=a==="emulator"||a==="simulator";if(s&&n.app===void 0)throw new d(`target: ${String(a)} needs an app \u2014 add \`app: <path-to-build | APPid>\``,e,1);if(!s&&n.app!==void 0)throw new d("app requires a mobile target \u2014 add `target: emulator` or `target: simulator`",e,1);if(!s&&n.no_reset!==void 0)throw new d("no_reset requires a mobile target \u2014 add `target: emulator` or `target: simulator`",e,1);if(!s&&n.os_version!==void 0)throw new d("os_version requires a mobile target \u2014 add `target: emulator` or `target: simulator`",e,1);return{global:n,bodyStartLine:r+1}}function ce(e,t,r){let n=e.trim().replace(/^\[/,"").replace(/\]$/,"").split(",").map(a=>a.trim().toLowerCase());if(n.length===0||n.some(a=>a.length===0))throw new d("tags must be a non-empty list of non-empty strings",t,r);return[...new Set(n)]}var de=new Set(["chrome","cdp","ws","emulator","simulator"]),fe="target must be one of 'chrome' | 'cdp' | 'ws' (web) or 'emulator' | 'simulator' (mobile, with a root `app:` key)";function le(e,t,r){if(typeof e=="string"&&de.has(e))return e;throw e!==null&&typeof e=="object"&&!Array.isArray(e)?new d(`the mapping form of target is no longer accepted \u2014 write flat keys:
5
- target: emulator | simulator
6
- app: <path-to-build | APPid>`,t,r):new d(`${fe} \u2014 got: ${JSON.stringify(e)}`,t,r)}function ge(e,t,r){if(typeof e!="string"||e.trim().length===0)throw new d("app must be a build (e.g. ./builds/app-debug.apk) or an app id from your cloud uploads",t,r);let o=e.trim();if(!/\.(apk|zip)$/i.test(o)&&!/^APP\d{6,}$/.test(o))throw new d(`app '${o}' is not a build \u2014 expected a path ending in .apk or .zip, or an app id from your cloud uploads.`,t,r);return ue(o,t)}function ue(e,t){return/^APP[0-9A-Za-z_-]+$/.test(e)||ee(e)?e:te(X(t),e)}function We(e){let t=e.target;if(!(t!=="emulator"&&t!=="simulator"))return{platform:C(t)??"",app:e.app??"",...e.no_reset!==void 0?{no_reset:e.no_reset}:{}}}function P(e){let t=e.target;return t==="chrome"||t==="cdp"||t==="ws"?t:void 0}var pe=/\s@verifies\s+(ac-[\w.:\/-]+(?:\s*,\s*ac-[\w.:\/-]+)*)\s*$/;function me(e,t,r){let o=pe.exec(t);if(o)return{label:t.slice(0,o.index).trim(),verifies:o[1].split(",").map(a=>a.trim())};let n=t.lastIndexOf("@verifies");if(n>0&&/\s/.test(t[n-1])){let a=t.slice(n+9).split(/[\s,]+/).filter(s=>s.length>0);if(a.length===0||a.every(s=>s.startsWith("ac-")))throw new d("malformed @verifies directive \u2014 expected '@verifies ac-<id>[, ac-<id>\u2026]' at the end of the heading",e,r)}return{label:t,verifies:[]}}function be(e,t,r){let o,n=r;for(;n<t.length&&t[n].trim()==="";)n++;let a=n<t.length?/^#\s+(.+?)\s*$/.exec(t[n]):null;a&&(o=a[1],n++);let s=[];for(let f=n;f<t.length;f++)/^##\s/.test(t[f])&&s.push(f);let c=[];for(let f=0;f<s.length;f++){let g=s[f],p=s[f+1]??t.length,h=t[g].replace(/^##\s+/,"").trim(),{label:i,verifies:l}=me(e,h,g+1),m=t.slice(g+1,p),{config:b,body:w,optional:R}=he(e,g+1,m);c.push({index:f+1,heading:i,verifies:l,config:b,body:w,headingLine:g+1,optional:R})}return{title:o,steps:c}}function he(e,t,r){let o=0;for(;o<r.length&&r[o].trim()==="";)o++;let n,a=t;if(o<r.length&&/^```yaml\s*$/.test(r[o])){let l=o;a=t+l,o++;let m=-1;for(;o<r.length;){if(/^```\s*$/.test(r[o])){m=o;break}o++}if(m===-1)throw new d("step-config fenced ```yaml block is not closed",e,a);let b=r.slice(l+1,m).join(`
7
- `);try{n=j(b)??{}}catch(w){throw new d(`invalid YAML in step config: ${w.message}`,e,a)}o=m+1}let s=we(r.slice(o)),c=s.filter(l=>l.trim()!=="");if(c.length>0&&/^@session\s+/.test(c[0].trim()))throw new d("@session is no longer supported (iteration 3); use @import instead",e,t);let f=/^@import\s+(\S.*)$/,p=s.filter(l=>f.test(l.trim())).length>0;if(p&&c.length!==1)throw new d("step body must be exactly one of prose / @import",e,t);let h=!1,i;if(n){if(V(e,n,p?"step config (ref)":"step config (objective)",a),F(e,n,a),typeof n.optional=="boolean")h=n.optional;else if(n.optional!==void 0)throw new d(`step config 'optional' must be boolean: got ${typeof n.optional}`,e,a);let l={...n};delete l.optional,p&&delete l.variables,!p&&Object.keys(l).length>0&&(i=l)}if(p){let m=f.exec(c[0].trim())[1].trim(),b=n?.variables;return{body:{kind:"import_ref",path:m,...b&&Object.keys(b).length>0?{bindings:b}:{}},optional:h}}return{body:{kind:"objective",text:s.join(`
8
- `).trim()},config:i,optional:h}}function we(e){let t=0,r=e.length;for(;t<r&&e[t].trim()==="";)t++;for(;r>t&&e[r-1].trim()==="";)r--;return e.slice(t,r)}function F(e,t,r){let o=t.variables;if(o==null)return;if(typeof o!="object"||Array.isArray(o))throw new d("variables must be an object map",e,r);let n={};for(let[a,s]of Object.entries(o))if(typeof s=="string")n[a]={value:s};else if(s&&typeof s=="object"&&!Array.isArray(s)&&typeof s.value=="string")n[a]=s;else throw new d(`variable '${a}' must be a string or { value: ... } object`,e,r);t.variables=n}function V(e,t,r,o){for(let n of Object.keys(t)){if(ne.has(n))throw new d(`auth/identity keys are CLI-only: ${n}`,e,o);if(r==="frontmatter"){if(I.has(n))throw new d(`step-only key in frontmatter: ${n}`,e,o);if(!A.has(n))throw new d(`unknown config key: ${n}`,e,o)}else if(r==="step config (objective)"){if(!A.has(n)&&!I.has(n))throw new d(`unknown config key: ${n}`,e,o);if(oe.has(n))throw new d(`chrome config is global-only: ${n}`,e,o);if(ie.has(n))throw new d(`'${n}' is global-only: the whole run drives one app`,e,o);if(se.has(n))throw new d(`'${n}' is run-level and cannot be set per-step`,e,o)}else if(!re.has(n))throw new d(`step config on @import may only contain 'optional' / 'variables': got ${n}`,e,o)}}import{createHash as K}from"crypto";function x(e){if(e==null)return null;if(Array.isArray(e))return e.map(x);if(typeof e=="object"){let t={};for(let r of Object.keys(e).sort()){let o=e[r];o!==void 0&&(t[r]=x(o))}return t}return e}function ye(e){if(e.body.kind!=="objective")throw new Error("stepMd5: only objective steps have an md5; @import rows do not");let t={...e.config??{},optional:e.optional??!1},r=JSON.stringify(x(t));return K("md5").update(e.body.text).update(`
9
- `).update(r).digest("hex")}function G(e){let t={};for(let[o,n]of Object.entries(e.bindings??{}))t[o]={value:n.value,...n.secret===!0?{secret:!0}:{},...n.syntax?{syntax:n.syntax}:{}};let r=JSON.stringify(x({bindings:t,optional:e.optional}));return K("md5").update(e.path).update(`
10
- `).update(r).digest("hex")}function qe(e){return ye({index:e.trace[e.trace.length-1].stepIndex,heading:e.trace[e.trace.length-1].heading,verifies:[],body:{kind:"objective",text:e.objective},config:e.parsedConfig,headingLine:1,optional:e.optional})}import{writeFileSync as _e,mkdirSync as ve,readFileSync as ke}from"fs";import{dirname as Y}from"path";function D(e){try{return JSON.parse(ke(O(e),"utf8"))}catch{return null}}function Xe(e){let t=O(e.sourcePath);try{ve(Y(t),{recursive:!0})}catch(o){return process.stderr.write(`
11
- \u26A0 Failed to create output directory.
12
- ${o.message}
13
- Path: ${Y(t)}
14
-
15
- `),t}let r={commit_id:e.commitId};e.testId!==void 0&&(r.test_id=e.testId),e.testcaseId!==void 0&&(r.testcase_id=e.testcaseId),e.projectId!==void 0&&(r.project_id=e.projectId),e.folderId!==void 0&&(r.folder_id=e.folderId),e.orgId!==void 0&&(r.org_id=e.orgId),e.sessionName!==void 0&&(r.session_name=e.sessionName),e.plan!==void 0&&(r.plan=e.plan);try{_e(t,JSON.stringify(r,null,2)+`
16
- `,"utf8")}catch(o){process.stderr.write(`
17
- \u26A0 Failed to write meta.json.
18
- ${o.message}
19
- Path: ${t}
20
-
21
- `)}return t}var W=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"],je=["app","no_reset","os_version"],Oe=["mode","on_lock_conflict","tags","target","chrome_profile","cdp_endpoint","ws_endpoint","headless","app","no_reset","os_version"],v=class extends Error{constructor(t){super(t),this.name="TestMdResolveError"}};function E(e){return N(e).endsWith("_test.md")?"test":"helper"}function st(e){let t=J(e),r=B(t),o=Ee(r.global),n=[],a=[],s=[{file:t,kind:E(t)}],c=[];return H(r,a,n,[],t,{},s,c,{}),n.forEach((g,p)=>g.flatIndex=p+1),{rootPath:t,rootTitle:r.title,rootGlobal:r.global,rootSteps:r.steps,chrome:o,steps:n,unitFiles:s,warnings:c}}function at(e){let t=[];for(let r of e.unitFiles){if(r.kind!=="test")continue;let o=D(r.file);o&&t.push({file:r.file,...o.project_id?{project_id:String(o.project_id)}:{},...o.org_id?{org_id:String(o.org_id)}:{}})}return t}function B(e){if(!xe(e))throw new v(`@import path not found: ${e}`);let t=Se(e,"utf8");return L(e,t)}function H(e,t,r,o,n,a,s,c,f){if(t.includes(e.path)){let i=[...t,e.path].map(l=>N(l)).join(" \u2192 ");throw new v(`cyclic reference: ${i}`)}t.push(e.path);let g=o.length===0,p=e.global.variables??{};for(let i of Object.keys(a))if(Object.hasOwn(p,i))throw new v(`callsite binding '${i}' collides with a declared variable in ${e.path} (frontmatter variables are pinned; parameters are its undeclared names)`);let h=e.global;if(!g){let i={...e.global};for(let l of Oe)i[l]!==void 0&&(c.push(`${e.path}: '${l}' is root-governed on imported units \u2014 ignored`),delete i[l]);i.url!==void 0&&(f.pending=String(i.url),delete i.url),h=i}for(let i of e.steps){let l=i.body.kind!=="objective";if(i.optional&&l&&!g)throw new v(`intermediate-ref 'optional' is not supported in v1: ${e.path}:${i.headingLine}`);if(i.body.kind==="objective"){let $={file:e.path,stepIndex:i.index,heading:i.heading,optional:i.optional??!1},q=Me(h,i.config,a),M={flatIndex:0,objective:i.body.text,sourceFile:e.path,trace:[...o,$],config:q,parsedConfig:i.config,optional:i.optional??!1,verifies:i.verifies,owningFile:e.path,unitKind:E(e.path)};f.pending&&(M.unitEntryUrl=f.pending,f.pending=void 0),r.push(M);continue}let m={file:e.path,stepIndex:i.index,heading:i.heading,optional:i.optional??!1,rowMd5:G({path:i.body.path,bindings:i.body.bindings,optional:i.optional??!1})},b=Re(e.path),w=$e(i.body.path)?i.body.path:J(b,i.body.path),R=B(w);s.some($=>$.file===w)||s.push({file:w,kind:E(w)}),H(R,t,r,[...o,m],n,i.body.bindings??{},s,c,f)}g||(f.pending=void 0),t.pop()}function Ee(e){let t={};for(let r of W){if(r==="target"){let o=P(e);o!==void 0&&(t.target=o);continue}e[r]!==void 0&&(t[r]=e[r])}return t}function Me(e,t,r){let o={};for(let[s,c]of Object.entries(e))W.includes(s)||je.includes(s)||(o[s]=c);let n={...o,...t??{}},a={...r,...e.variables??{},...t?.variables??{}};return Object.keys(a).length>0?n.variables=a:delete n.variables,n}export{Z as a,k as b,Te as c,T as d,O as e,Ae as f,Ie as g,Le as h,Q as i,Pe as j,Ke as k,Ge as l,L as m,We as n,G as o,qe as p,D as q,Xe as r,v as s,st as t,at as u};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as V,c as H,d as W,e as re,f as ie}from"./chunk-FJYDEWOA.js";import{a as se}from"./chunk-CLLQQPBZ.js";import{c as ee}from"./chunk-A44G533S.js";import{a as te}from"./chunk-BRTARADN.js";import{a as oe}from"./chunk-SQGBFCFO.js";import{b as Y}from"./chunk-TZFT7R7B.js";import{b as Z}from"./chunk-QISE272H.js";import{a as L}from"./chunk-BPMSNGXQ.js";import{a as T,b as j,d as ne}from"./chunk-VE3SUJMA.js";import{b as J}from"./chunk-TZXXJWHA.js";import{p as b}from"./chunk-56PAQAX5.js";import{b as Q}from"./chunk-XY325HDJ.js";import{a as D}from"./chunk-OYJBABRV.js";import{a as B,e as K}from"./chunk-EYOCNMUM.js";import{a as z}from"./chunk-ZLSWHCWO.js";import{a as q}from"./chunk-HCBYKLMW.js";import{a as c,b as u,i as I,j as G}from"./chunk-C44QQJR4.js";import{a as me}from"./chunk-6YGTRKDT.js";import{e as F}from"./chunk-UR6MHSHU.js";var s=F(me(),1);import{basename as ve}from"path";var o=F(q(),1);function Ne({resultRef:x,mode:g="singleshot",loginCompleteRef:d}){let{exit:m}=G(),A=(0,s.useRef)(new z),E=(0,s.useRef)(new te),v=(0,s.useRef)(new ee),n=A.current,l=E.current,O=v.current,le=V(),[h,f]=(0,s.useState)(g==="login"?"login":"gate"),[M,ae]=(0,s.useState)(null),[xe,R]=(0,s.useState)(null),[Pe,$]=(0,s.useState)(null),[X,ce]=(0,s.useState)(null),[N,_]=(0,s.useState)([]),P=(0,s.useCallback)((e,t,i,r)=>O.log(e,t,i,r),[O]),we=(0,s.useCallback)((e,t)=>{e?T(n,l,e,t):l.save({project_id:null,project_name:null,folder_id:null,folder_name:null})},[n,l]),C=(0,s.useCallback)(()=>{if(g==="login")d&&(d.current=!0),m();else{let e=l.load().mobile,t=B(e?.tui_target,e?.default_target?.kind),i=(t.kind==="unset"||t.kind==="choose-mobile")&&J();f(i?"target":"input")}},[g,m,d,l]),S=(0,s.useCallback)((e,t)=>{let i=T(n,l,e,t);if(g==="login"){f("ensure-project");return}ne(i)?C():i.projectId?f("ensure-folder"):f("ensure-project")},[n,l,C,g]);I((e,t)=>{t.ctrl&&e==="c"&&b(0,"Ctrl+C exit")});let U=(0,s.useRef)(!1);s.default.useEffect(()=>{U.current||(U.current=!0,g!=="login"&&ie(n,P).then(e=>{ae(e),e.status==="authenticated"?S(e.result.profile,e.result.env):e.status==="needs_pick"?f("pick"):(R(e.profile??null),$(e.env??null),f("login"))}).catch(e=>{ce(`Auth check failed: ${e instanceof Error?e.message:String(e)}`)}))},[n,P]);let ue=(0,s.useCallback)(e=>{x.current={objective:e},m()},[x,m]),fe=(0,s.useCallback)(async(e,t)=>{n.setActiveProfile(e),n.setDefaultEnv(t),(await re(n,e,t,P)).status==="authenticated"?S(e,t):(R(e),$(t),f("login"))},[n,P,S]),w=(0,s.useCallback)(()=>{let e=n.getActiveProfile(),t=n.getDefaultEnv();if(!e)return null;let i=D(t),r=n.loadBasicAuth(e,t);return new oe(i.controllerBaseUrl,async()=>n.loadCredentials(e,t)?.access_token??null,r,P)},[n,P]),de=(0,s.useCallback)(async()=>{let e=w();if(!e)return null;let t=e.cached??await e.resolve();if(!t)return null;let i=D(n.getDefaultEnv()),r=new L(i.tmsBaseUrl,t.username,t.access_key);try{let p=(await r.listProjects()).find(k=>k.name==="KaneAI Generated");if(p)return{id:p.project_id,name:p.name};let y=await r.createProject("KaneAI Generated");return{id:y.id,name:y.name}}catch{return null}},[w,n]),ge=(0,s.useCallback)(async e=>{let t=w();if(!t)return null;let i=t.cached??await t.resolve();if(!i)return null;let r=D(n.getDefaultEnv()),a=new L(r.tmsBaseUrl,i.username,i.access_key);try{let y=(await a.listFolders(e)).find(pe=>pe.name==="Untitled");if(y)return{id:y.id,name:y.name};let k=await a.createFolder(e,"Untitled");return{id:k.id,name:k.name}}catch{return null}},[w,n]);if(h==="gate")return(0,o.jsx)(c,{paddingX:1,children:(0,o.jsx)(u,{color:"yellow",children:"Checking authentication..."})});if(X)return(0,o.jsxs)(c,{flexDirection:"column",paddingX:1,children:[(0,o.jsx)(u,{color:"red",children:X}),(0,o.jsx)(u,{color:"gray",children:"Press Ctrl+C to exit."})]});if(h==="pick"&&M?.status==="needs_pick")return(0,o.jsx)(he,{profiles:M.profiles,onSelect:fe});if(h==="login")return(0,o.jsx)(W,{devMode:process.env.KANE_DEV_MODE==="1",profiles:n.listProfiles(),onBasicLogin:async(e,t,i,r)=>{let{validateBasicAuth:a}=await import("./validate-basic-727KRHX6.js");await a(t,i,r),n.saveBasicAuth(e,t,{username:i,access_key:r}),n.setActiveProfile(e),n.setDefaultEnv(t)},onOAuthLogin:async(e,t)=>{let{LoginFlow:i}=await import("./login-flow-NHBJVDW6.js");n.setDefaultEnv(t),n.setActiveProfile(e),await new i(e,t,n).login()},onComplete:(e,t)=>{R(e),$(t),n.setActiveProfile(e),n.setDefaultEnv(t),S(e,t)},onCancel:()=>{b(0,"Login cancelled")}});if(h==="ensure-project"){let e=n.getActiveProfile()??"default",t=n.getDefaultEnv(),i=()=>{if(g==="login"){f("ensure-folder");return}T(n,l,e,t).folderId?C():f("ensure-folder")};return(0,o.jsxs)(c,{flexDirection:"column",children:[(0,o.jsx)(c,{paddingX:1,marginBottom:1,children:(0,o.jsx)(u,{color:"yellow",children:"Project & folder are required to save tests \xB7 Esc to use defaults \xB7 Ctrl+C to exit"})}),(0,o.jsx)(Y,{resolver:w(),currentProjectId:l.load().project_id,env:t,onSelect:(r,a)=>{j(n,l,e,t,{projectId:r,projectName:a}),_(p=>[...p,`\u2713 Project: ${a} (${r})`]),i()},onCancel:async()=>{let r=await de();r&&(j(n,l,e,t,{projectId:r.id,projectName:r.name}),_(a=>[...a,`\u2713 Default project: ${r.name} (${r.id})`]),i())}})]})}if(h==="ensure-folder"){let e=n.getActiveProfile()??"default",t=n.getDefaultEnv(),i=n.loadProfileConfig(e,t);return(0,o.jsxs)(c,{flexDirection:"column",children:[(0,o.jsx)(c,{paddingX:1,marginBottom:1,children:(0,o.jsx)(u,{color:"yellow",children:"Project & folder are required to save tests \xB7 Esc to use defaults \xB7 Ctrl+C to exit"})}),(0,o.jsx)(Z,{resolver:w(),projectId:i?.project_id??"",currentFolderId:l.load().folder_id,env:t,onSelect:(r,a)=>{j(n,l,e,t,{folderId:r,folderName:a}),_(p=>[...p,`\u2713 Folder: ${a} (${r})`]),C()},onCancel:async()=>{if(!i?.project_id)return;let r=await ge(i.project_id);r&&(j(n,l,e,t,{folderId:r.id,folderName:r.name}),_(a=>[...a,`\u2713 Default folder: ${r.name} (${r.id})`]),C())}})]})}if(h==="target"){let e=B(l.load().mobile?.tui_target,l.load().mobile?.default_target?.kind).kind==="choose-mobile";return(0,o.jsx)(c,{paddingX:1,children:(0,o.jsx)(se,{mode:e?"mobile-only":"all",onSelect:t=>{l.setMobile({tui_target:t}),f("input")},onCancel:()=>f("input")})})}if(h==="input"){let e=l.load().mobile,t=B(e?.tui_target,e?.default_target?.kind),i=(()=>{if(t.kind==="emulator"||t.kind==="simulator"){let r=e?.default_target?.id??"(no device)",a=e?.default_app?Q(e.default_app)?e.default_app:ve(e.default_app):"(no app)";return`Config: ${K(t.kind)} \xB7 ${r} \xB7 ${a}`}return"Config: Desktop \xB7 Chrome"})();return(0,o.jsxs)(c,{flexDirection:"column",children:[N.length>0&&(0,o.jsx)(c,{flexDirection:"column",paddingX:1,marginBottom:1,children:N.map((r,a)=>(0,o.jsx)(u,{color:"green",children:r},a))}),(0,o.jsx)(c,{paddingX:1,children:(0,o.jsx)(u,{color:"gray",children:i})}),(0,o.jsx)(H,{onSubmit:ue,onEscape:()=>b(0,"User pressed Escape"),history:le,placeholder:"Type an objective..."})]})}return(0,o.jsx)(o.Fragment,{})}function he({profiles:x,onSelect:g}){let[d,m]=(0,s.useState)(0),[A,E]=(0,s.useState)(!1);return I((v,n)=>{if(!A){if(n.escape){b(0,"Profile picker cancelled");return}if(n.upArrow&&d>0&&m(l=>l-1),n.downArrow&&d<x.length-1&&m(l=>l+1),n.return){E(!0);let l=x[d];g(l.profile,l.env).catch(()=>E(!1))}}}),(0,o.jsxs)(c,{flexDirection:"column",paddingX:1,children:[(0,o.jsx)(u,{color:"#ff9500",bold:!0,children:"Select a profile:"}),(0,o.jsx)(c,{marginTop:1,flexDirection:"column",children:x.map((v,n)=>(0,o.jsxs)(u,{children:[n===d?"\u276F ":" ",(0,o.jsx)(u,{color:n===d?"#ff9500":"white",bold:n===d,children:v.profile}),(0,o.jsxs)(u,{color:"gray",children:[" [",v.env,"]"]})]},`${v.profile}-${v.env}`))}),A&&(0,o.jsx)(c,{marginTop:1,children:(0,o.jsx)(u,{color:"yellow",children:"Validating credentials..."})})]})}export{Ne as a};
@@ -1,20 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as G}from"./chunk-MMBBQ4OZ.js";import{j as O}from"./chunk-DN3E6RT6.js";import{d as E,e as z}from"./chunk-4JOD47QI.js";import{a as X}from"./chunk-RZ4F3BHX.js";import{spawn as Ie}from"child_process";import{existsSync as $e,readFileSync as Ne}from"fs";import{homedir as Ee}from"os";import{dirname as Q,join as S}from"path";import{access as we,mkdir as W,readFile as be}from"fs/promises";import{homedir as ye}from"os";import{arch as Ae,platform as xe}from"process";import{join as D}from"path";var Se=35,ke="google_apis",Te="KaneCLI_Pixel_API35",De="KaneAI_Pixel_API35";function yt(t){return t===De?Te:t}var Pe=1;function Me(t,e){return t==="darwin"&&e==="arm64"?"arm64-v8a":"x86_64"}function _e(){return{home:ye(),os:xe,arch:Ae}}async function Y(t){try{return await we(t),!0}catch{return!1}}var V=class{deps;constructor(e={}){this.deps={..._e(),...e}}paths(){let e=D(this.deps.home,".testmuai","kaneai","mobile"),r=D(e,"android-sdk");return{root:r,emulatorDir:D(r,"emulator"),systemImageDir:D(r,"system-images",`android-${Se}`,ke,Me(this.deps.os,this.deps.arch)),avdHome:D(e,"avd"),manifest:D(r,"sdk-manifest.json")}}environment(){let e=this.paths();return{ANDROID_HOME:e.root,ANDROID_SDK_ROOT:e.root,ANDROID_AVD_HOME:e.avdHome}}async ensureSdkRootMarkers(){let e=this.paths().root;await W(D(e,"platforms"),{recursive:!0}),await W(D(e,"platform-tools"),{recursive:!0})}async status(){let e=this.paths(),r=null;try{r=JSON.parse(await be(e.manifest,"utf8"))}catch{}if(!r||r.schemaVersion!==Pe)return{emulator:!1,systemImage:!1};let o=this.deps.os==="win32"?"emulator.exe":"emulator";return{emulator:!!r.components.emulator&&await Y(D(e.emulatorDir,o)),systemImage:!!r.components.systemImage&&await Y(D(e.systemImageDir,"system.img"))}}},Z;function L(){return Z??=new V,Z}var H="android",Oe="http://127.0.0.1:4723/status",Re=2e3,ee=12e4,Ce=1e3,Le=3e5;var Fe=5,te="Run `kane-cli doctor --target emulator --install` to install the managed Appium tree.",Be={device:"ready",unauthorized:"unauthorized",offline:"offline"};function Ue(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 qe(t){let e=[];for(let r of t.split(`
3
- `)){let o=r.trim();if(!o||o.startsWith("*"))continue;let c=o.toLowerCase();if(c.startsWith("list of devices")||c.startsWith("adb server"))continue;let f=o.split(/\s+/),p=f[0],v=f[1];if(!p||!v||!p.startsWith("emulator-"))continue;let h=Ue(f.slice(2)),b=h.model?h.model.replace(/_/g," "):void 0;e.push({platform:H,kind:"emulator",id:p,displayName:b??p,state:Be[v]??"offline"})}return e}function ie(t){let e=[];for(let r of t.split(`
4
- `)){let o=r.trim();o&&/^[A-Za-z0-9._-]+$/.test(o)&&(e.includes(o)||e.push(o))}return e}function Ve(t){for(let e of t.split(`
5
- `)){let r=e.trim();if(!(!r||r==="OK"))return r}}function He(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 je(t){let e=[];for(let r of t.split(`
6
- `)){let o=r.trim();if(!o.startsWith("package:"))continue;let c=o.slice(8).trim();c&&!e.includes(c)&&e.push(c)}return e.sort()}function Je(t){let e=Number(t.trim());return Number.isInteger(e)&&e>0?e:void 0}function Ke(t){return[...new Set(t.split(",").map(e=>e.trim()).filter(Boolean))]}var Xe=[{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 ze(t){for(let{match:e,hint:r}of Xe)if(e.test(t))return r}function j(t,e,r=Fe){let o=t.toLowerCase(),c=e.filter(v=>v.toLowerCase().includes(o)),f=Math.max(6,Math.floor(o.length/2)),p=e.filter(v=>!c.includes(v)&&Ge(v.toLowerCase(),o)>=f);return[...c,...p].slice(0,r)}function Ge(t,e){let r=Math.min(t.length,e.length),o=0;for(;o<r&&t[o]===e[o];)o++;return o}function ne(t){return t&&/^hw\.device\.name\s*=\s*(.+)\s*$/m.exec(t)?.[1]?.trim()||void 0}function We(){return X(Oe,{signal:AbortSignal.timeout(Re)}).then(t=>t.ok,()=>!1)}function Ye(t,e,r){Ie(t,e,{stdio:"ignore",detached:!0,...r?{env:{...process.env,...r}}:{}}).unref()}function Ze(){return{exec:E,spawnDetached:Ye,fileExists:$e,env:process.env,home:Ee(),os:process.platform,probeAppiumServer:We,now:()=>Date.now(),sleep:z,mobileDeps:{status:t=>O().status(t),environment:t=>O().environment(t)},sdkSuite:{status:()=>L().status(),environment:()=>L().environment(),emulatorPath:()=>{let t=L().paths().emulatorDir;return S(t,process.platform==="win32"?"emulator.exe":"emulator")},ensureSdkRootMarkers:()=>L().ensureSdkRootMarkers()}}}function re(t={}){let e={...Ze(),...t},r={},o=new Set;function c(i){return e.os==="win32"?`${i}.exe`:i}function f(i){if(e.readAvdConfig)return e.readAvdConfig(i);let n=[e.env.ANDROID_AVD_HOME,S(e.home,".android","avd"),e.sdkSuite.environment().ANDROID_AVD_HOME];for(let s of n){if(!s)continue;let a=S(s,`${i}.avd`,"config.ini");try{if(e.fileExists(a))return Ne(a,"utf8")}catch{}}}function p(){return e.os==="win32"?"appium.cmd":"appium"}function v(){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(S(e.home,"Library","Android","sdk")):e.os==="win32"?i.push(S(e.home,"AppData","Local","Android","Sdk")):i.push(S(e.home,"Android","Sdk")),i}function h(i){let n=i==="adb"?"platform-tools":"emulator";return v().map(s=>S(s,n,c(i)))}async function b(i){let n=e.os==="win32"?"where":"which",s=await e.exec(n,[c(i)],{timeoutMs:5e3});if(s.code!==0)return null;let a=s.stdout.split(`
9
- `)[0]?.trim();return a&&a!==""?a:null}async function $(i){let n=await e.exec(i,["-version"],{timeoutMs:1e4});return/Android emulator version/i.test(`${n.stdout}
10
- ${n.stderr}`)}async function M(i){if(i==="adb"){let n=G(e.env);if(n){let a=S(n.platformToolsDir,c("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:S(a.platformToolsDir,c("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 b(i);a&&!s.includes(a)&&s.push(a);for(let d of s){if(!await $(d))continue;let m={path:d,source:"sdk"};return r[i]=m,m}}return delete r[i],null}async function l(){let i=await M("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 u(i){let n=await e.exec(i,["devices","-l"],{timeoutMs:2e4});return qe(n.stdout)}async function g(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 Ve(a.stdout)}async function y(i){let n=await M("emulator");if(!n)return[];let s=await e.exec(n.path,["-list-avds"],{timeoutMs:2e4}),a=s.code===0?ie(s.stdout):[];if(o.clear(),(await e.sdkSuite.status()).emulator){let m=await e.exec(n.path,["-list-avds"],{timeoutMs:2e4,env:{...e.env,...e.sdkSuite.environment()}});if(m.code===0)for(let w of ie(m.stdout))o.add(w),a.includes(w)||a.push(w)}return a.filter(m=>!i.has(m)).map(m=>{let w=ne(f(m));return{platform:H,kind:"emulator",id:m,displayName:m,state:"stopped",virtualName:m,...w?{modelIdentifier:w}:{}}})}async function k(){let i=await M("adb");if(!i)return[];let n=await u(i.path),s=new Set;for(let d of n){if(d.kind!=="emulator"||d.state!=="ready")continue;let m=await g(i.path,d.id);if(!m)continue;d.virtualName=m,d.displayName=m;let w=ne(f(m));w&&(d.modelIdentifier=w),s.add(m)}let a=await y(s);return[...n,...a]}function A(i,n){return[`${i} did not finish booting within ${ee/1e3}s.`,n?`It attached as ${n} but never reported sys.boot_completed=1.`:"It never attached to adb.","The emulator process is still running \u2014 check its window for errors.","Common causes: no hardware acceleration (install the Android Emulator","hypervisor driver / enable KVM), or a corrupt AVD (recreate it in","Android Studio's Device Manager)."].join(`
12
- `)}async function _(i,n,s){let a=await M("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 u(i)).map(B=>B.id)),m=o.has(n);m&&await e.sdkSuite.ensureSdkRootMarkers();let w=m?{...e.env,...e.sdkSuite.environment()}:void 0;e.spawnDetached(a.path,["-avd",n],w),s?.(`booting ${n}\u2026`);let T=e.now()+ee,x;for(;e.now()<T;){if(await e.sleep(Ce),!x){let I=(await u(i)).find(C=>C.kind==="emulator"&&!d.has(C.id));I&&(x=I.id,s?.(`${n} attached as ${x}, waiting for boot\u2026`));continue}if((await e.exec(i,["-s",x,"shell","getprop","sys.boot_completed"],{timeoutMs:1e4})).stdout.trim()==="1")return x}throw new Error(A(n,x))}async function P(i,n){let s=await l();if(i.state==="ready")return N(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 _(s,a,n);return N({...i,kind:"emulator",id:d,displayName:a,state:"ready",virtualName:a},s)}async function N(i,n){let[s,a,d,m]=await Promise.all([e.exec(n,["-s",i.id,"shell","getprop","ro.build.version.sdk"],{timeoutMs:1e4}),e.exec(n,["-s",i.id,"shell","getprop","ro.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})]),w=s.code===0?Je(s.stdout):void 0,T=a.code===0?a.stdout.trim():"",x=Ke(d.code===0&&d.stdout.trim()!==""?d.stdout:m.stdout);return{...i,...w!==void 0?{androidApiLevel:w}:{},...T!==""?{osVersion:T}:{},...x.length>0?{androidAbis:x}:{}}}async function F(i){let n=await l(),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 je(s.stdout)}async function ce(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}).
13
- 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.
14
- Pass the package name explicitly with --app <package>.`);return n.trim()}async function me(i,n,s){let a=await l();s?.(`installing ${n} on ${i.id}\u2026`);let d=await e.exec(a,["-s",i.id,"install","-r",n],{timeoutMs:Le}),m=`${d.stdout}
15
- ${d.stderr}`;if(d.code===0&&!/\bFailure\b/i.test(m))return;let w=ze(m),T=[`Installing ${n} on ${i.id} failed (adb exited ${d.code}).`,m.trim()];throw w&&T.push("",w),new Error(T.filter(x=>x!=="").join(`
16
- `))}async function pe(i,n,s){if(n.kind==="package"){let a=await F(i);if(a.includes(n.value))return n.value;let d=j(n.value,a),m=[`${n.value} is not installed on ${i.displayName} (${i.id}).`];throw d.length>0?m.push("Close matches:",...d.map(w=>` ${w}`)):m.push("Pass a local .apk path to --app to install it instead."),new Error(m.join(`
17
- `))}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),ce(n.value)}async function fe(){let i=await e.mobileDeps.status("emulator");return i.installed?{status:i,env:await e.mobileDeps.environment("emulator")}:null}async function ge(i={}){let n=[],s=await fe(),a=await e.mobileDeps.status("emulator"),d=await M("adb");if(d){let I=await e.exec(d.path,["version"],{timeoutMs:1e4}),C=He(I.stdout);n.push({id:"android.adb",fixedByBundle:!0,label:"adb",required:!0,status:"pass",detail:C?`platform-tools ${C} \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 m=!i.appiumUrl;s?.env.appiumHome?n.push({id:"android.appium",fixedByBundle:!0,label:"Appium",required:m,status:"pass",detail:S(Q(s.env.appiumHome),"appium","node_modules",".bin",p())}):n.push({id:"android.appium",fixedByBundle:!0,label:"Appium",required:m,status:m?"fail":"info",detail:i.appiumUrl?`managed Appium not required because --appium-url is set (${i.appiumUrl})`:a.corrupt??"managed Appium is not installed",...m?{fixText:te}:{}}),n.push({id:"android.uiautomator2",fixedByBundle:!0,label:"uiautomator2 driver",required:m,status:s?"pass":m?"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||!m?{}:{fixText:te}});let w=S(e.home,".testmuai","kaneai","mobile","trees");e.fileExists(w)&&n.push({id:"android.legacy-trees",label:"legacy toolchain trees",required:!1,status:"info",detail:`${w} predates the deps bundle \u2014 removed automatically by the next bundle install`});let T=await b("adb");T&&n.push({id:"android.system-adb",label:"system adb",required:!1,status:"info",detail:`${T} (ignored; managed adb always wins and may restart its server)`});let x=await b("appium");x&&n.push({id:"android.system-appium",label:"system Appium",required:!1,status:"info",detail:`${x} (ignored; managed Appium always wins)`});let B=await e.sdkSuite.status(),q=await M("emulator");if(B.emulator?n.push({id:"android.emulator",label:"emulator",required:!1,status:"pass",detail:`managed emulator \xB7 ${e.sdkSuite.emulatorPath()}`}):q?n.push({id:"android.emulator",label:"emulator",required:!1,status:"info",detail:`${q.path} (system install)`}):n.push({id:"android.emulator",label:"emulator",required:!1,status:"info",detail:"not installed, so stopped AVDs are not listed. Install it with the Android SDK (Android Studio \u2192 SDK Manager \u2192 Android Emulator)."}),e.os==="darwin"){let I=await e.exec("sysctl",["-n","kern.hv_support"],{timeoutMs:5e3});n.push({id:"android.virtualization",label:"virtualization",required:!1,status:"info",detail:I.code===0&&I.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 he(i){let n=await e.mobileDeps.environment("emulator"),s=[...n.dirs],a=r.emulator,d=a?.source==="sdk"?Q(a.path):void 0;return d&&!s.includes(d)&&s.push(d),{...n,dirs:s}}async function ve(i,n){let s=await l(),a=[];return n.appPackage&&a.push({label:`closing ${n.appPackage}`,file:s,args:["-s",i.id,"shell","am","force-stop",n.appPackage]}),n.shutdown&&a.push({label:`shutting down ${i.displayName}`,file:s,args:["-s",i.id,"emu","kill"]}),a}return{platform:H,available:()=>!0,checks:ge,discover:k,prepare:P,listApps:F,ensureApp:pe,teardownPlan:ve,toolEnv:he}}import{mkdtemp as se,readdir as Qe,rm as oe,writeFile as et}from"fs/promises";import{tmpdir as ae}from"os";import{join as R}from"path";var de="ios",tt=12e4,it=3e5,nt="an .ipa cannot be installed on a simulator \u2014 use a .zip of the .app build";function rt(t){let e=/\.iOS-(\d+)-(\d+)$/.exec(t);return e?`${e[1]}.${e[2]}`:void 0}function st(t){let e;try{e=JSON.parse(t)}catch{return[]}let r=[];for(let[o,c]of Object.entries(e.devices??{})){let f=rt(o);for(let p of c??[]){let v=typeof p.udid=="string"?p.udid:void 0,h=typeof p.name=="string"?p.name:void 0;if(!v||!h)continue;let b=p.state==="Booted"?"ready":p.state==="Shutdown"?"stopped":"offline",$=typeof p.deviceTypeIdentifier=="string"?p.deviceTypeIdentifier.replace(/^com\.apple\.CoreSimulator\.SimDeviceType\./,""):void 0;r.push({platform:de,kind:"simulator",id:v,displayName:f?`${h} (iOS ${f})`:h,state:b,virtualName:h,...f?{osVersion:f}:{},...$?{modelIdentifier:$}:{}})}}return r}function ot(t){let e;try{e=JSON.parse(t)}catch{return[]}let r=[];for(let[o,c]of Object.entries(e)){if(c?.ApplicationType!=="User")continue;let f=c.CFBundleIdentifier??o;r.includes(f)||r.push(f)}return r.sort()}function at(t){let e;try{e=JSON.parse(t)}catch{return[]}let r=[];for(let[o,c]of Object.entries(e)){let f=c?.CFBundleIdentifier??o;f&&!r.includes(f)&&r.push(f)}return r.sort()}var J=16;function dt(t){return/^Xcode (\d+(?:\.\d+)*)/m.exec(t)?.[1]}async function lt(t){let e=await se(R(ae(),"kane-app-unzip-")),r=()=>oe(e,{recursive:!0,force:!0}),o=await E("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 c of[e,R(e,"Payload")]){let f;try{f=await Qe(c)}catch{continue}let p=f.find(v=>v.toLowerCase().endsWith(".app"));if(p)return{appPath:R(c,p),cleanup:r}}throw await r(),new Error(`${t} does not contain a .app bundle.`)}async function ut(t){let e=await se(R(ae(),"kane-plist-"));try{let r=R(e,"input.plist");await et(r,t);let o=await E("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 oe(e,{recursive:!0,force:!0})}}function ct(){return{exec:E,os:process.platform,convertPlistToJson:ut,mobileDeps:{status:()=>O().status("simulator"),environment:()=>O().environment("simulator")}}}function le(t={}){let e={...ct(),...t};async function r(l,u=3e4){return e.exec("xcrun",["simctl",...l],{timeoutMs:u})}async function o(){let l=await r(["list","devices","available","--json"]);return l.code!==0?[]:st(l.stdout)}async function c(){return o()}async function f(l,u){let g=await e.exec("open",["-a","Simulator","--args","-CurrentDeviceUDID",l],{timeoutMs:15e3});g.code!==0&&u?.(`could not open Simulator.app (${g.stderr.trim()||`exit ${g.code}`}); the device is booted and the run continues headless`)}async function p(l,u){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 f(l.id,u),l.state==="stopped"&&u?.(`booting ${l.displayName}\u2026`);let g=await r(["bootstatus",l.id,"-b"],tt);if(g.code!==0)throw new Error(`Could not boot ${l.displayName}: ${g.stderr.trim()||g.stdout.trim()||`simctl bootstatus exited ${g.code}`}`);let y=(await o()).find(k=>k.id===l.id);if(y?.state==="ready")return y;throw new Error(`${l.displayName} finished booting but simctl still reports it as ${y?.state??"missing"}.`)}async function v(l){let u=await r(["listapps",l.id]);if(u.code!==0)throw new Error(`Could not list apps on ${l.displayName}: ${u.stderr.trim()||`simctl exited ${u.code}`}`);return ot(await e.convertPlistToJson(u.stdout))}async function h(l){let u=R(l,"Info.plist"),g=await e.exec("plutil",["-convert","json","-o","-",u],{timeoutMs:15e3});if(g.code!==0)throw new Error(`${l} Info.plist could not be read: ${g.stderr.trim()||`plutil exited ${g.code}`}`);let y;try{y=JSON.parse(g.stdout)}catch{throw new Error(`${l} Info.plist did not contain valid JSON from plutil.`)}if(!y.CFBundleIdentifier)throw new Error(`${l} has no CFBundleIdentifier in its Info.plist.`);return y.CFBundleIdentifier}async function b(l,u,g){if(u.kind==="package"){let A=await r(["listapps",l.id]);if(A.code!==0)throw new Error(`Could not list apps on ${l.displayName}: ${A.stderr.trim()||`simctl exited ${A.code}`}`);let _=at(await e.convertPlistToJson(A.stdout));if(_.includes(u.value))return u.value;let P=j(u.value,_),N=[`${u.value} is not installed on ${l.displayName} (${l.id}).`];throw P.length>0?N.push("Close matches:",...P.map(F=>` ${F}`)):N.push("Pass a .zip of the .app bundle to install it instead."),new Error(N.join(`
18
- `))}if(u.kind==="ipa")throw new Error(`${nt}.`);if(u.kind!=="app"&&u.kind!=="zip")throw new Error(`${u.kind} artifacts are Android-only and not installable on iOS.`);let y=u.value,k;if(u.kind==="zip"){g?.(`unpacking ${u.value}\u2026`);let A=await lt(u.value);y=A.appPath,k=A.cleanup}g?.(`installing ${y} on ${l.displayName}\u2026`);try{let A=await r(["install",l.id,y],it);if(A.code!==0)throw new Error(`Installing ${u.value} on ${l.displayName} failed: ${A.stderr.trim()||A.stdout.trim()}`);return await h(y)}finally{await k?.()}}async function $(l={}){let u=[],g=await e.exec("xcode-select",["-p"],{timeoutMs:1e4});if(g.code===0&&g.stdout.trim()!==""){let _=await e.exec("xcodebuild",["-version"],{timeoutMs:3e4}),P=_.code===0?dt(_.stdout):void 0;P?Number(P.split(".")[0])<J?u.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:`Xcode ${P} is older than the required Xcode ${J}`,fixText:`Update Xcode to ${J} or newer from the App Store.`}):u.push({id:"ios.xcode",label:"Xcode",required:!0,status:"pass",detail:`Xcode ${P} \xB7 ${g.stdout.trim()}`}):u.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:`${g.stdout.trim()} has no usable xcodebuild (Command Line Tools only?)`,fixText:"Install full Xcode from the App Store, then run `sudo xcode-select -s /Applications/Xcode.app/Contents/Developer`."})}else u.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 y=await e.exec("xcrun",["simctl","help"],{timeoutMs:15e3});u.push(y.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: ${y.stderr.trim()||y.stdout.trim()||`exit ${y.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 k=!l.appiumUrl,A=await e.mobileDeps.status();return u.push({id:"ios.xcuitest",fixedByBundle:!0,label:"xcuitest driver",required:k,status:A.installed?"pass":k?"fail":"info",detail:A.installed?"bundled in the managed mobile deps (with prebuilt WDA)":l.appiumUrl?"managed driver not required because --appium-url is set":A.corrupt??"the simulator deps bundle is not installed",...A.installed||!k?{}:{fixText:"Run `kane-cli doctor --target simulator --install` to download the simulator deps bundle."}}),u}async function M(l,u){let g=[];return u.appPackage&&g.push({label:`closing ${u.appPackage}`,file:"xcrun",args:["simctl","terminate",l.id,u.appPackage]}),u.shutdown&&g.push({label:`shutting down ${l.displayName}`,file:"xcrun",args:["simctl","shutdown",l.id]}),g}return{platform:de,available:()=>e.os==="darwin",checks:$,discover:c,prepare:p,listApps:v,ensureApp:b,teardownPlan:M,toolEnv:()=>e.mobileDeps.environment()}}var ue=[re(),le()];function U(){return ue.filter(t=>t.available())}function Vt(){return U().map(t=>t.platform)}function Ht(){return ue.map(t=>t.platform)}function mt(t){let e=t.toLowerCase();return U().find(r=>r.platform.toLowerCase()===e)}async function pt(t){let e=t?U().filter(o=>o.platform.toLowerCase()===t.toLowerCase()):U(),r=[];for(let o of e)try{r.push(...await o.discover())}catch{}return r}function ft(t,e){let r=e.toLowerCase();return t.id.toLowerCase()===r||t.virtualName?.toLowerCase()===r}function gt(t){let e=t.virtualName&&t.virtualName!==t.id?`${t.displayName} (${t.virtualName})`:t.displayName;return`${t.id} \u2014 ${e} [${t.platform} \xB7 ${t.kind} \xB7 ${t.state}]`}function K(t){return t.length===0?"":`
19
- ${t.map(e=>` ${gt(e)}`).join(`
20
- `)}`}async function jt(t,e={}){let r=e.discover??pt,o=e.providerFor??mt,c=await r(t.platform),f=h=>{let b=o(h.platform);return b?{ok:!0,target:h,provider:b}:{ok:!1,reason:"not-found",candidates:c,message:`No provider is registered for platform '${h.platform}'.`}};if(t.device){let h=c.filter(b=>ft(b,t.device));return h.length===0?{ok:!1,reason:"not-found",candidates:c,message:`No target matches --device '${t.device}'.`+(c.length>0?` Available:${K(c)}`:" No targets were found \u2014 run `kane-cli doctor --target <emulator|simulator>`.")}:f(h.find(b=>b.state==="ready")??h[0])}let p=t.defaultTarget;if(p&&(!t.platform||t.platform.toLowerCase()===p.platform.toLowerCase())){let h=c.find(b=>b.platform===p.platform&&b.kind===p.kind&&(b.id===p.id||b.virtualName===p.id));return h?f(h):{ok:!1,reason:t.interactive?"needs-picker":"not-found",candidates:c,message:`The saved default target '${p.id}' (${p.platform} \xB7 ${p.kind}) is not connected. `+(t.interactive?"Pick a target to bind this run.":"Pass --device <id> explicitly \u2014 kane-cli never binds a different device on its own.")+(c.length>0?` Available:${K(c)}`:"")}}if(c.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=c.filter(h=>h.state==="ready");return v.length===1?f(v[0]):t.interactive?{ok:!1,reason:"needs-picker",candidates:c,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:c,message:(v.length===0?"No target is ready.":`${v.length} targets are ready.`)+` Pass --device <id>:${K(c)}`}}export{yt as a,Vt as b,Ht as c,mt as d,pt as e,jt as f};
@@ -1,4 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{d as ae,e as ue}from"./chunk-AXTPNZPX.js";import{a as oe}from"./chunk-L2TV4G56.js";import{b as K,d as se}from"./chunk-6KPPGMO2.js";import{d as ie}from"./chunk-NVGBE2DR.js";var ge=new Set(["approve","edit","reject"]);function pe(s,t){return`chatop:${t}:${s.target??"new"}:${s.op}:${s.seq}`}function me(s,t,y,k){let c=pe(s,t),h=s.payload;switch(s.op){case"approve":return{kind:"approve",target:s.target,expectedCid:s.expected_cid,eventId:c};case"edit":{let{reason:o,...v}=h;return{kind:"edit",target:s.target,expectedCid:s.expected_cid,edit:v,reason:o,eventId:c}}case"enhance":return{kind:"enhance",target:s.target,expectedCid:s.expected_cid,edges:h.edges??[],eventId:c};case"reject":return{kind:"reject",target:s.target,expectedCid:s.expected_cid,reason:h.reason??"",redirectTo:h.redirect_to,eventId:c};case"add":{let o=h.proposal_item??{},v=String(o.label??"");if(!y.mint_gate.includes(v))throw new Error(`GATED_LABEL: cannot mint "${v}" (gate: ${y.mint_gate.join(", ")})`);let l=o.cite??{},m=o.conv_source_id??k;if(!m||typeof l.turn!="number"||!l.quote)throw new Error("INVALID_ADD: a chat add requires a conversation cite {turn, quote} and conv_source_id");let _=o.content,C=_&&typeof _=="object"&&!Array.isArray(_)&&Object.keys(_).length>0?_:null,w=new Set(["label","cite","conv_source_id","content","rationale","edges"]),x=C??Object.fromEntries(Object.entries(o).filter(([D])=>!w.has(D)));return{kind:"add",label:v,content:x,cite:{turn:l.turn,quote:l.quote},convSourceId:m,rationale:o.rationale,eventId:c}}}}function ce(s,t,y={}){let k=y.turn??0,c=[],h=[];for(let l of s)(l.op==="add"||l.op==="enhance")&&h.push(l);let o=new Map;for(let l of s){if(!ge.has(l.op)||!l.target)continue;let m=o.get(l.target)??[];m.push(l),o.set(l.target,m)}for(let[l,m]of o){let _=Math.max(...m.map(w=>w.seq)),C=m.filter(w=>w.seq===_);if(C.length>1){c.push({target:l,seq:_,kinds:C.map(w=>w.op)});continue}h.push(C[0])}return{chatOps:h.sort((l,m)=>l.seq-m.seq).map(l=>me(l,k,t,y.convSourceId)),ambiguous:c}}function fe(s){let t=[];return s.questions.forEach((y,k)=>{if(s.resolution[k])return;let c=y.recommended_index!=null?y.options[y.recommended_index]?.label:void 0;c!=null&&t.push(y.risk==="high"?`${c} \u203C`:c)}),t.length>3?`${t.slice(0,3).join(" \xB7 ")} \xB7 +${t.length-3} more`:t.join(" \xB7 ")}function le(s){let t=s.text.replace(/\?+\s*$/,"");return t.length<=36?t:`${t.slice(0,33)}\u2026`}function he(s){return s.use_cases??[]}var ke={acs:"acceptance criteria",scenarios:"scenarios",exercises:"exercises",tests:"tests",gaps:"gaps"};function be(s){let t=[],y=[],k=(o,v)=>{v.length!==0&&(y.push(o),t.push(...v))},c=o=>typeof o=="string"&&/^[a-z]{1,4}\d{1,4}$/i.test(o)?o:null,h=o=>{let v=c(o.automates)??"1 scenario",l=o.verifies??[],m=l.map(c).filter(w=>w!==null).slice(0,2),_=l.length-m.length,C=m.length?`${m.join(" ")}${_>0?` +${_}`:""}`:`${l.length} ACs`;return`covers ${v} \xB7 verifies ${C}`};return k("acs",(s.acs??[]).map(o=>({temp_ref:o.temp_ref,title:o.text,kind:"ac",badge:String(o.kind),extra:{...o.expected_answer?{expects:`${String(o.expected_answer.operator??"")} \xB7 ${String(o.expected_answer.operand??"")}`}:{},"scoped to":o.scoped_to??"(use-case)"}}))),k("scenarios",(s.scenarios??[]).map(o=>({temp_ref:o.temp_ref,title:o.title,kind:"scenario",badge:o.case_type,why:o.intent,depends_on_hint:o.depends_on??[],extra:{technique:o.technique_notes}}))),k("exercises",(s.exercises??[]).map(o=>({temp_ref:c(o.scenario)??"wiring",title:`${c(o.scenario)??"scenario"} exercises ${c(o.ac)??"1 AC"}`,kind:"exercise",badge:"wires",why:o.rationale}))),k("tests",(s.tests??[]).map(o=>({temp_ref:o.temp_ref,title:o.title,kind:"test",why:h(o),depends_on_hint:o.reuses??[],extra:{automates:String(o.automates??"?"),verifies:(o.verifies??[]).join(", "),check:o.check?`${String(o.check.kind)} vs ${String(o.check.verified_against)}`:"?"}}))),k("gaps",(s.gaps??[]).map(o=>({temp_ref:o.temp_ref??o.ref??"?",title:String(o.question?.header??o.kind),kind:"gap",badge:o.kind,why:o.risk_rationale}))),{items:t,heading:y.join(" + ")||"design"}}function Se(s={}){let t={turns:[],thinking:ae(),pending:null,confirm:null,status:"idle",ledger:[],activeTurn:null,stream:null,checkpoint:!1},y=e=>{let n=[],r=e.minted.map(a=>a.slug).filter(Boolean);r.length&&n.push(`added ${r.join(", ")}`);let i=e.applied.length-e.minted.length;return i>0&&n.push(`${i} change${i===1?"":"s"} applied`),e.staleDelta.length&&n.push(`stales ${e.staleDelta.length}`),n.join(" \xB7 ")||"no changes"},k=[];s.onRender&&k.push(s.onRender);let c=0,h=0,o=null,v=null,l=null,m=[],_=0,C=e=>{if(!(!l||!s.contextDir||!e.trim()))try{let n=s.refreshGraph?.()??s.graph;if(!n)return;se({contextDir:s.contextDir,graph:n,sourceId:l,text:e,by:s.by??{kind:"human",id:"owner"}})}catch{}},w=e=>{if(!l||!s.contextDir)return;let n=s.refreshGraph?.()??s.graph,r=n?.heads.get(l),i=n?.convChains.get(l);if(!n||typeof r!="string"||!i)return;let a=n.getNode(r)?.content?.blob,u=typeof a=="string"?ie(s.contextDir,a)?.toString("utf8")??"":"";if(u)for(let f of e){if(f.kind!=="add"||f.convSourceId!==l)continue;let F=K(u,f.cite.turn);if(!(F!==null&&F.includes(f.cite.quote)))for(let $=i.turns;$>=1;$--){let z=K(u,$);if(z!==null&&z.includes(f.cite.quote)){f.cite={...f.cite,turn:$};break}}}},x={startedAt:null,thinkMs:0,toolCalls:0,tools:new Map},D=()=>{x.startedAt??=Date.now()},A=()=>{if(x.toolCalls>0){let e=x.startedAt!=null?Math.max(1,Math.round((Date.now()-x.startedAt)/1e3)):Math.max(1,Math.round(x.thinkMs/1e3));g({kind:"worked",durS:e,toolCalls:x.toolCalls,tools:[...x.tools.entries()].map(([n,r])=>({name:n,n:r}))})}x.startedAt=null,x.thinkMs=0,x.toolCalls=0,x.tools.clear()},I=null,G=new Map,V=e=>JSON.stringify([e.id,e.text,e.options.map(n=>n.label)]),q=null,J=new Map,U=new Map,Y=null,p=()=>{j&&(clearTimeout(j),j=null);for(let e of k)e()},j=null,X=()=>{j||(j=setTimeout(()=>{j=null;for(let e of k)e()},80))},B=0,g=e=>{e.kind==="childClose"&&B>0&&(B-=1),B>0&&e.kind!=="childOpen"&&e.kind!=="childBack"&&(e.era=B),e.kind==="childOpen"&&(B+=1),t.ledger.push(e)},E=null,W=!1,L=(e=!1)=>{E?g({kind:"agent",text:E}):e&&W&&g({kind:"note",text:'chat to refine ("looks good" approves; /done finishes)'}),E=null,W=!1},de=()=>{E=null,W=!1},P=null,H=e=>{if(P){if(e)for(let n of P.items){let r=e.get(n.temp_ref);r&&(n.logical_id=r)}g({kind:"turn",...P}),P=null}},M=()=>{H(),t.activeTurn&&(t.activeTurn=null)},Z=(e,n)=>n.choice||(n.selected_index!=null?e.options[n.selected_index]?.label??"?":"?"),N=()=>{let e=t.pending;if(!e)return;if(!e.resolution.every(Boolean)){e.cursor=e.resolution.findIndex(i=>i===null);return}let n=e.questions.map((i,a)=>{let u=e.resolution[a];return u.form==="deferred"?{id:i.id,selected_index:null,free_text:null}:{id:i.id,selected_index:u.selected_index,free_text:u.free_text}});t.pending=null,t.status=t.status==="pausing"?"pausing":"streaming",t.status==="streaming"&&(t.busySince=Date.now());let r=I;I=null,r?.(n)},R=(e,n)=>{let r=t.pending,i=r.questions[e],a=r.resolution[e];r.resolution[e]=n;let u=le(i);a?g({kind:"answer",receipt:{form:"changed",qNum:e+1,stub:u,choice:Z(i,n),prev:a.choice}}):n.form==="deferred"?g({kind:"answer",receipt:{form:"deferred",qNum:e+1,stub:u}}):g({kind:"answer",receipt:{form:n.form,qNum:e+1,stub:u,choice:Z(i,n)}})},ee=()=>{let e=t.pending;e&&(e.questions.forEach((n,r)=>{e.resolution[r]||R(r,{form:"deferred",selected_index:null,free_text:null,choice:""})}),N())},Q=new Map,te=e=>{Q.clear();let n={high:0,med:1,low:2};return e=e.map((r,i)=>({q:r,i})).sort((r,i)=>(n[r.q.risk]??3)-(n[i.q.risk]??3)||r.i-i.i).map(({q:r})=>r),{questions:e,cursor:0,resolution:e.map(()=>null)}};return{state:t,explainLines(e){if(!s.explain||!s.graph||s.contextDir===void 0)return null;let n=s.explain(s.contextDir,s.graph,e);return n.target?[`${n.target.label} ${n.target.slug??n.target.cid.slice(0,19)}:`,...n.entries.map(r=>` [${r.kind}] ${r.rationale??r.detail}`)]:null},explainRef(e){if(!s.explain||!s.graph||s.contextDir===void 0){g({kind:"note",text:"explain isn't available here"}),p();return}let n=s.explain(s.contextDir,s.graph,e),r=n.target?[`${n.target.label} ${n.target.slug??n.target.cid.slice(0,19)}:`,...n.entries.map(i=>` [${i.kind}] ${i.rationale??i.detail}`)].join(`
3
- `):`unknown ref: ${e}`;g({kind:"note",text:r}),p()},subscribe(e){return k.push(e),()=>{let n=k.indexOf(e);n>=0&&k.splice(n,1)}},submit(e){if(t.confirm&&(t.confirm=null),!t.pending){if(!o){t.turns.push({role:"user",text:e}),g({kind:"user",text:e}),t.notice="the agent isn't running \u2014 nothing sent",p();return}for(t.notice=void 0,t.checkpoint=!1,L(),t.turns.push({role:"user",text:e}),g({kind:"user",text:e}),C(e),t.status="streaming",t.busySince=Date.now(),D(),t.error=void 0,h+=1;m.length>0;)h+=1,o({type:"user_message",message_id:`u${h}-receipt`,text:m.shift()});o({type:"user_message",message_id:`u${h}`,text:e}),p()}},attachSender(e){let n=o;return o=e,()=>{o=n}},attachOnCommitted(e){v=e},attachConversationSource(e){l=e},attachSession(e){s.session=e},holdReceipt(e){m.push(e),t.checkpoint=!0,p()},drainHeldReceipts(){return m.splice(0,m.length)},peekHeldReceipts(){return[...m]},submitAnswer(e,n){let r=t.pending,i=r?.questions[e],a=i?.options[n]?.label;!r||!i||a==null||(R(e,{form:"answered",selected_index:n,free_text:null,choice:a}),N(),p())},submitFreeText(e,n){let r=t.pending,i=r?.questions[e],a=n.trim();!r||!i||!a||(R(e,{form:"answered",selected_index:null,free_text:a,choice:a}),N(),p())},deferBatch(e){let n=t.pending;if(!n||!I)return;n.questions.forEach((i,a)=>{let u=n.resolution[a];u&&u.form==="answered"&&G.set(V(i),u)}),t.pending=null,t.status=t.status==="pausing"?"pausing":"streaming",t.status==="streaming"&&(t.busySince=Date.now()),g({kind:"note",text:`questions set aside \u2014 source ${e.source_id} landed; the agent reads it next`});let r=I;I=null,r({deferred:!0,ingested:e}),p()},submitAnswerWithText(e,n,r){let i=t.pending,a=i?.questions[e],u=a?.options[n]?.label;if(!i||!a||u==null)return;let f=r.trim();R(e,{form:"answered",selected_index:n,free_text:f||null,choice:f?`${u} \u2014 ${f}`:u}),N(),p()},toggleOption(e,n){let r=t.pending?.questions[e];if(!r||r.options[n]==null)return;let i=Q.get(e)??new Set;i.has(n)?i.delete(n):i.add(n),Q.set(e,i),p()},multiSelection(e){return[...Q.get(e)??[]].sort((n,r)=>n-r)},confirmMulti(e){let n=t.pending,r=n?.questions[e];if(!n||!r)return;let i=[...Q.get(e)??[]].sort((u,f)=>u-f).map(u=>r.options[u]?.label).filter(u=>u!=null);if(i.length===0)return;Q.delete(e);let a=i.join(", ");R(e,{form:"answered",selected_index:null,free_text:a,choice:a}),N(),p()},goWithRecommendations(){let e=t.pending;if(!e)return{picks:""};let n=fe(e),r=null;return e.questions.forEach((i,a)=>{if(e.resolution[a])return;let u=i.recommended_index,f=u!=null?i.options[u]?.label:void 0;if(f==null){r===null&&(r=a);return}R(a,{form:"assumed",selected_index:u,free_text:null,choice:f})}),r!==null?(e.cursor=r,p(),{blocked:r}):(N(),p(),{picks:n})},reopenQuestion(){let e=t.pending;if(!e)return;let n=e.cursor<0?e.questions.length:e.cursor;for(let r=n-1;r>=0;r--)if(e.resolution[r]){e.cursor=r,p();return}},continueParked(){if(o){for(t.checkpoint=!1,g({kind:"continued"});m.length>0;)h+=1,o({type:"user_message",message_id:`u${h}-receipt`,text:m.shift()});h+=1,o({type:"user_message",message_id:`u${h}`,text:"continue"}),t.status="streaming",t.busySince=Date.now(),D(),p()}},note(e){g({kind:"note",text:e}),p()},finalizeForExit(){M(),A(),L(),t.stream=null,p()},aliasOf(e){return U.get(e)},registerAliases(e){for(let n of e)U.set(n.ref,n.cid);H(new Map(e.filter(n=>n.id).map(n=>[n.ref,n.id]))),p()},setWorking(e){if(e!=null){if(t.status!=="idle"&&t.status!=="working")return;t.status==="idle"&&(t.busySince=Date.now()),D(),t.status="working",t.workingLabel=e}else{if(t.status!=="working")return;t.status="idle",t.workingLabel=void 0,t.busySince=void 0}p()},ledger(e){e.kind==="commit"&&H(),e.kind==="error"&&(M(),A(),L()),g(e),e.kind==="commit"&&(e.ok?L(!0):de()),p()},senderAlive(){return o!=null},completeSession(){ee(),o?.({type:"session_complete"}),t.status="idle",t.busySince=void 0,p()},requestPause(){ee(),t.status="pausing",t.busySince=void 0;let e=o;Promise.resolve().then(()=>e?.({type:"pause"})),p()},ask(e){t.pending=te(e),J=new Map(e.map((r,i)=>[r.id,i+1])),t.status="awaiting-input",t.busySince=void 0;let n=new Promise(r=>{I=r});if(G.size>0){let r=0;e.forEach((i,a)=>{let u=V(i),f=G.get(u);f&&(G.delete(u),R(a,{...f}),r+=1)}),r>0&&g({kind:"note",text:`your earlier answer${r>1?"s are":" is"} pre-filled \u2014 press enter to send, or pick a different answer`})}return p(),n},attachIngest(e){let n=q;return q=e,()=>{q===e&&(q=n)}},canIngest(){return q!==null},async ingestAttach(e){let n=q,r=e.trim();if(!n||!r)return;let i;try{i=await n(r)}catch(a){i={ok:!1,error:a instanceof Error?a.message:String(a)}}i.ok||(g({kind:"note",text:i.error??"the source could not be ingested"}),p())},noteCoercion(e,n){g({kind:"answer",receipt:{form:"assumed",qNum:J.get(e.id)??0,stub:le(e),choice:n,note:"your typed answer couldn't be used here"}}),p()},onAgentEvent(e){switch(e.type){case"reasoning_delta":case"reasoning_done":case"tool_activity":case"decision_activity":{let n=t.thinking;if(t.thinking=ue(n,e),t.thinking!==n&&(e.type==="reasoning_done"&&e.present?(D(),x.thinkMs+=e.took_ms):e.type==="tool_activity"&&e.status!=="started"&&(D(),x.toolCalls+=1,x.tools.set(e.name,(x.tools.get(e.name)??0)+1))),e.type==="reasoning_delta"){X();return}break}case"usage":t.credits={turn:e.credits,total:e.total_credits};break;case"text_delta":{let n=Y;if(n&&(e.turn_id<n.turn_id||e.turn_id===n.turn_id&&e.attempt<n.attempt))return;(!n||n.turn_id!==e.turn_id||n.attempt!==e.attempt)&&(Y={turn_id:e.turn_id,attempt:e.attempt},t.stream={text:""}),t.stream={text:(t.stream?.text??"")+e.text},X();return}case"progress":break;case"proposal":{c+=1,M(),t.stream=null,t.busySince=void 0,A();let n=he(e.proposal),r=s.dedupFlags?.(e.proposal);if(r)for(let i of n){let a=r.get(i.temp_ref);a&&(i.matches_existing=a)}t.turns.push({role:"agent",turnIndex:c,items:n,text:e.narrative}),E=e.narrative??null,W=!0,t.activeTurn={turnIndex:c,heading:"use-cases",items:n},P={turnIndex:c,heading:"use-cases",items:n},(t.status==="streaming"||t.status==="working")&&(t.status="idle"),t.workingLabel=void 0;break}case"design":{c+=1,M(),t.stream=null,t.busySince=void 0,A();let{items:n,heading:r}=be(e.design),i=e.design.phase==="wiring"?"acceptance criteria + exercises":r.split(" + ").map(a=>ke[a]??a).join(" + ");g({kind:"banner",text:`designing: ${i}`}),t.turns.push({role:"agent",turnIndex:c,items:n,itemsHeading:r,text:e.narrative}),E=e.narrative??null,W=!0,t.activeTurn={turnIndex:c,heading:r,items:n},P={turnIndex:c,heading:r,items:n},(t.status==="streaming"||t.status==="working")&&(t.status="idle"),t.workingLabel=void 0;break}case"ask_user":A(),t.pending=te(e.questions),t.status="awaiting-input",t.busySince=void 0;break;case"chat_ops":{c+=1,M(),A(),t.stream=null,(t.status==="streaming"||t.status==="working")&&(t.status="idle",t.busySince=void 0,t.workingLabel=void 0);let n=e.chat_ops??e,r=Array.isArray(n.ops)?n.ops:[],i=n.text??e.text??"",a=s.refreshGraph?.()??s.graph,u=d=>U.get(d)??d,f=r.map(d=>{if(!d.target)return d;let b=u(d.target),S=d.expected_cid;if(S==null&&a){let re=a.resolve(b);re&&(S=a.tipOf(re.cid))}let O=d.payload?.redirect_to,T=O&&u(O);return b===d.target&&S===d.expected_cid&&T===O?d:{...d,target:b,expected_cid:S,...T!==O?{payload:{...d.payload,redirect_to:T}}:{}}}),F;try{if(!Array.isArray(n.ops))throw new Error("the agent sent an unreadable change set (no ops array) \u2014 say it again in different words");F=ce(f,s.descriptor??{mint_gate:[]},{turn:c,...l?{convSourceId:l}:{}})}catch(d){t.error=d instanceof Error?d.message:String(d),t.turns.push({role:"agent",turnIndex:c,text:i,narration:t.error}),i&&g({kind:"agent",text:i}),g({kind:"error",title:t.error,detail:[]});break}let{chatOps:$,ambiguous:z}=F;if(z.length>0){let d=z[0];t.confirm={kind:"ambiguity-confirm",prompt:`did you mean edit or ${d.kinds.filter(b=>b!=="edit").join("/")} on ${d.target}?`},t.turns.push({role:"agent",turnIndex:c,text:i}),i&&g({kind:"agent",text:i});break}if(w($),s.commitChatTurn&&$.length>0){let d=s.commitChatTurn({contextDir:s.contextDir??"",graph:s.refreshGraph?.()??s.graph,ops:$,by:s.by??{kind:"human",id:"owner"},...s.descriptor?.mint_gate?{mintable:s.descriptor.mint_gate}:{},...s.session?.state?.sid?{sid:s.session.state.sid}:{}});if(d.errors)t.error=d.errors.map(b=>b.detail).join("; "),t.turns.push({role:"agent",turnIndex:c,text:i}),g({kind:"commit",ok:!1,line:"commit failed \u2014 nothing landed",warnings:d.errors.map(b=>`${b.code}: ${b.detail}`)}),m.push(["COMMIT FAILED (chat turn) \u2014 nothing landed; do not assume any of your last ops applied.",...d.errors.map(b=>`- ${b.code}: ${b.detail}`),...d.errors.some(b=>b.code==="UNKNOWN_FIELD")?["If you were changing citations or matched-existing content, that is proposal territory (approve/re-propose) \u2014 a chat edit can only replace a node's own schema fields."]:[]].join(`
4
- `)),i&&g({kind:"agent",text:i});else{d.applied.length>0&&s.session?.markApplied(d.applied);let b=y(d);t.turns.push({role:"agent",turnIndex:c,text:i,narration:b}),g({kind:"commit",ok:!0,line:b});let S=s.refreshGraph?.();if(S&&v&&v(S),S)try{_+=1;let ne=s.descriptor?.mint_gate?.includes("usecase")?"extract":"design",O=oe({verb:ne,commitN:_,phase:"chat",committed:d.minted.map(T=>({cid:T.cid,...T.slug?{logical_id:T.slug}:{}}))},S);m.push(O.text)}catch{}i&&g({kind:"agent",text:i})}}else t.turns.push({role:"agent",turnIndex:c,text:i}),i&&g({kind:"agent",text:i});C(i);break}case"done":case"session_complete":M(),A(),L(),t.status="idle",t.busySince=void 0,o=null;break;case"error":M(),A(),L(),t.stream=null,t.status="idle",t.busySince=void 0,t.error=e.message,o=null,g({kind:"error",title:e.message,detail:[]});break;case"session_paused":break;default:break}p()}}}export{fe as a,le as b,Se as c};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- function o(e){return e.kind==="simulator"?e.id:e.virtualName??e.id}function a(e,i,r={}){let t={platform:e.platform,udid:e.id,target_kind:e.kind};return i&&(t.app_package=i),r.noReset!==void 0&&(t.no_reset=r.noReset),r.appiumUrl&&(t.appium_url=r.appiumUrl),e.platform==="android"&&r.autoGrantPermissions!==void 0&&(t.auto_grant_permissions=r.autoGrantPermissions),e.platform==="ios"&&r.autoAcceptAlerts!==void 0&&(t.auto_accept_alerts=r.autoAcceptAlerts),t}export{o as a,a as b};
@@ -1,15 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{d as lt,g as pt}from"./chunk-5DBK6QNS.js";import{b as pe,c as B,d as fe,e as me}from"./chunk-RZLD7TPG.js";import{b as h,c as ce,d as rt,f as de,g as ue}from"./chunk-5GUD3CIH.js";import{a as nt,e as A,f as it,g as ot,h as V,i as st,j as K,k as D,l as at}from"./chunk-ZSXDZI56.js";import{a as N,b as T,d as tt}from"./chunk-EHN5HTUD.js";import{d as ft}from"./chunk-NVGBE2DR.js";import{a as J}from"./chunk-CH273NAE.js";import{b as P,c as v}from"./chunk-VZ7KXRXB.js";import{a as se,c as Ze,d as Qe,e as et,f as ae}from"./chunk-P7YZ3PU3.js";import{A as w}from"./chunk-TH47OOBV.js";import{b as q}from"./chunk-VAYBKR76.js";import{a as dt}from"./chunk-CUM23TLF.js";import{b as ut,f as U,i as W}from"./chunk-DUAXZYAD.js";import{d as le,f as ct}from"./chunk-WXHQYYD5.js";import{a as Je,b as Xe}from"./chunk-SQC4P2Q7.js";import{a as qe}from"./chunk-OFW3ZVTP.js";function C(t){if(t===null)return"broken";let e=Math.floor(t/100);return e===1?"passed":e===7?"failed":e===2?"skipped":"broken"}var $={failed:3,broken:2,passed:1,skipped:0};function ge(t){let e="skipped";for(let r of t)$[r]>$[e]&&(e=r);return e}import{createHash as Ut}from"crypto";import{basename as Wt}from"path";function he(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40);return e.length>0?e:"session"}function ve(t){return Ut("sha256").update(t).digest("hex").slice(0,8)}function ye(t){let e=Wt(t).replace(/_test\.md$/i,"").replace(/\.md$/i,"");return`${he(e)}-${ve(t)}`}function we(t,e){return`${he(t)}-${ve(e)}`}function xe(t){let e={};for(let[r,n]of Object.entries(t))typeof n=="string"&&n.length>0&&(e[r]=n);return e}function qt(t,e){return{pack_test_dir:t,ordinal_offset:e}}import{promises as k}from"fs";import{join as S}from"path";function _e(t){let e={evidence:"0.1",run_id:t.execution_id,status:"running",title:t.title,started:t.started,environment:{producer:{name:"kane-cli",version:t.producerVersion},...t.surfaces?{surfaces:t.surfaces}:{},run_kind:t.run_kind,origin:t.origin,pid:t.pid},...t.credits!==void 0?{metrics:{credits:{value:t.credits,type:"count"}}}:{}};return v(e,{lineWidth:-1})}async function ke(t,e,r,n=process.cwd(),i){let s=i??h(t.execution_id,n),o=S(s,"tests",e);return await k.mkdir(S(s,"coverage"),{recursive:!0}),await k.writeFile(S(s,"coverage",".keep"),""),await k.mkdir(o,{recursive:!0}),await k.writeFile(S(s,"run.yaml"),_e(t)),r&&await k.writeFile(S(o,r.path),r.content),s}async function Jt(t,e=process.cwd()){let r=h(t.execution_id,e);await k.mkdir(S(r,"coverage"),{recursive:!0}),await k.writeFile(S(r,"coverage",".keep"),"");let n=P(_e(t));return n.environment&&delete n.environment.run_kind,await k.writeFile(S(r,"run.yaml"),v(n,{lineWidth:-1})),r}async function Xt(t,e=process.cwd()){return T(h(t,e),new Date().toISOString())}async function be(t,e=process.cwd()){await k.rm(h(t,e),{recursive:!0,force:!0})}import{promises as Se}from"fs";import{join as Ie}from"path";function X(t){let e={evidence:"0.1",test:t.testId,status:t.status,...t.durationMs!==void 0?{duration_ms:t.durationMs}:{},...t.attempts&&t.attempts.length?{attempts:t.attempts}:{},...t.flaky!==void 0?{flaky:t.flaky}:{},...t.adaptiveHeal?{adaptive_heal:t.adaptiveHeal}:{},...t.definitionPath?{definition:{path:t.definitionPath}}:{},...t.definitionId?{definition_id:t.definitionId}:{},...t.assuranceId?{assurance_id:t.assuranceId}:{},...Object.keys(t.externalId).length?{external_id:t.externalId}:{},...t.tags&&t.tags.length?{tags:t.tags}:{},...Object.keys(t.environment).length?{environment:t.environment}:{},steps:t.steps};return v(e,{lineWidth:-1})}function Ee(t){return v({logs:t},{lineWidth:-1})}async function Re(t,e,r){await Se.writeFile(Ie(t,"tests",e,"result.yaml"),r)}async function Pe(t,e,r){let n=Ie(t,"tests",e,"logs");await Se.mkdir(n,{recursive:!0}),await Se.writeFile(Ie(n,"meta.yaml"),r)}import{promises as Z}from"fs";import{join as mt}from"path";function gt(t){return mt(t,".internal","meta.json")}async function ht(t){let e;try{e=await Z.readFile(gt(t),"utf8")}catch(n){if(n?.code==="ENOENT")return null;throw n}let r=JSON.parse(e);if(!r||typeof r!="object"||Array.isArray(r))throw new Error("meta.json is not a JSON object");return r}async function Ae(t,e){let r;try{r=await ht(t)??{}}catch(o){console.warn(`evidence: meta.json at ${t} unreadable \u2014 skipping execution-pointer append to preserve identity`,o);return}let n=Array.isArray(r.executions)?r.executions:[];n.push(e),r.executions=n,await Z.mkdir(mt(t,".internal"),{recursive:!0});let i=gt(t),s=`${i}.tmp-${process.pid}-${Date.now()}`;await Z.writeFile(s,JSON.stringify(r,null,2)+`
3
- `),await Z.rename(s,i)}async function Zt(t){try{let e=await ht(t);return e&&Array.isArray(e.executions)?e.executions:[]}catch{return[]}}async function Qt(t,e,r=process.cwd()){let n=await de(t,r);if(!n){let s=`evidence: no pack found for "${t}"`;return e.json?console.log(JSON.stringify({valid:!1,error:"not_found",target:t})):console.error(s),2}let i=await N(n,e.profile??"L1");return e.json?console.log(JSON.stringify({valid:i.valid,status:i.status,diagnostics:i.diagnostics})):console.log(`evidence: ${i.valid?"valid":"INVALID"} (${e.profile??"L1"}, status ${i.status})`),i.valid?0:1}function De(t){let e=[];for(let r of t){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)e.push(C(i))}return ge(e)}function er(t){let e=null;for(let r of t){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)i!=null&&(e==null||$[C(i)]>$[C(e)]||$[C(i)]===$[C(e)]&&i>e)&&(e=i)}return e}import{promises as tr}from"fs";import{extname as vt,basename as rr}from"path";var nr={".ndjson":"ndjson",".log":"log",".json":"json",".har":"har"};async function $e(t){let e;try{e=await tr.readdir(t)}catch{return[]}return e.filter(r=>r!=="meta.yaml").sort().map(r=>({name:rr(r,vt(r)),file:r,format:nr[vt(r)]??"txt"}))}import{mkdirSync as ir,appendFileSync as or}from"fs";import{join as yt}from"path";function Ce(t,e){return yt(t,"tests",e,"logs")}function Le(t,e,r,n={},i){try{i?.(e,r,r,n)}catch{}if(t)try{ir(t,{recursive:!0});let s=JSON.stringify({ts:new Date().toISOString(),level:e,event:r,...n})+`
4
- `;or(yt(t,"diagnostics.ndjson"),s)}catch{}}import{promises as I}from"fs";import{dirname as mr,join as L}from"path";import{statSync as sr}from"fs";import{promises as Fe}from"fs";import{basename as ar,join as cr}from"path";var dr=1e6,ur=2e6;function lr(){return Je.map(t=>Xe(t))}function wt(t=lr()){return t.map(e=>{let r=0;try{r=sr(e).size}catch{}return{path:e,offset:r}})}var pr=/\x1b\[[0-9;]*[A-Za-z]/g;async function fr(t,e,r){let n;try{n=await Fe.open(t,"r");let i=(await n.stat()).size,s=e<=i?e:0,o=i-s;if(o<=0)return null;let a=o>r?i-r:s,c=Buffer.alloc(Math.min(o,r));return await n.read(c,0,c.length,a),c.toString("utf8")}catch{return null}finally{await n?.close().catch(()=>{})}}async function xt(t,e){let r=e.caps?.stderr??dr,n=e.caps?.appium??ur,i=[];e.runnerStderrPath&&i.push({src:e.runnerStderrPath,from:0,cap:r});for(let s of e.appiumMarks??[])i.push({src:s.path,from:s.offset,cap:n});for(let s of i){let o=await fr(s.src,s.from,s.cap);if(o===null)continue;let a=o.replace(pr,"");if(a!=="")try{await Fe.mkdir(t,{recursive:!0}),await Fe.writeFile(cr(t,ar(s.src)),a)}catch{}}}async function gr(t){try{let e=L(t,"tests"),r=await I.readdir(e).catch(()=>[]);for(let n of r){let i=L(e,n,"steps"),s=await I.readdir(i).catch(()=>[]);for(let o of s){let a=await I.readFile(L(i,o,"failure.yaml"),"utf8").catch(()=>null);if(a!=null)try{let c=P(a);if(c&&typeof c=="object"&&c.triage)return!0}catch{}}}}catch{}return!1}async function _t(t,e,r,n={}){let i=L(t,"tests",e,"logs");if(r)try{await I.mkdir(i,{recursive:!0}),await I.copyFile(r,L(i,"tui.log"))}catch{}await xt(i,{runnerStderrPath:r?L(mr(r),"runner-stderr.log"):void 0,appiumMarks:n.appiumMarks});let s=await $e(i);if(!s.length&&n.requireRealLog)throw new Error(`evidence test ${e} has no real log to declare`);s.length&&await Pe(t,e,Ee(s))}async function Oe(t){let e=t.cwd??process.cwd(),r=t.packDir??h(t.executionId,e);if(!t.saved&&!t.packDir)return await be(t.executionId,e),{sealed:!1};await _t(r,t.testId,t.tuiLogPath,{requireRealLog:t.requireRealLog,appiumMarks:t.appiumMarks});let n=L(r,"run.yaml"),i=P(await I.readFile(n,"utf8"));i.environment={...i.environment??{},saved:t.saved,run_kind:t.runKind},await I.writeFile(n,v(i,{lineWidth:-1}));let s=await I.open(n,"r+");try{await s.sync()}finally{await s.close()}let o=await gr(r);await T(r,new Date().toISOString());let a;try{let l=await N(r,"L1");a=l.valid;let d=(l.diagnostics??[]).filter(u=>String(u?.code??"").includes("failure.status_disagrees"));if(d.length>0)if(t.expectStatusDisagrees||o){let u=t.expectStatusDisagrees?"expected under --bug-detection continue":"self-explained by triaged failure record(s)";console.warn(`evidence: ${d.length} status_disagrees advisory(ies) \u2014 ${u}`)}else console.warn(`evidence: ${d.length} status_disagrees advisory(ies) \u2014 step verdicts disagree with their failure records`,d);if(!l.valid){console.warn(`evidence: sealed pack ${t.executionId} failed L1 validation`,l.diagnostics);let u=String(l.diagnostics?.[0]?.code??"");Le(Ce(r,t.testId),"warn","EVIDENCE_INVALID",{execution_id:t.executionId,first_code:u,surface:t.surface??"testmd"},t.log)}}catch(l){console.warn(`evidence: validation error for ${t.executionId}`,l)}let c;if(t.saved&&t.packDir)try{c=await rt(r,t.executionId,e)}catch(l){console.warn(`evidence: store install failed for ${t.executionId}`,l)}if(t.outputStemDir)try{await Ae(t.outputStemDir,{execution_id:t.executionId,run_kind:t.runKind,status:t.verdict,valid:a,at:new Date().toISOString()})}catch(l){console.warn(`evidence: execution-pointer append failed for ${t.executionId} (pack is sealed)`,l)}return{sealed:!0,valid:a,storePath:c}}import{release as Et}from"os";import{execFileSync as hr}from"child_process";import{promises as kt}from"fs";import{join as bt}from"path";function St(t){return t.replace(/\([^)]*\)/g," ").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||void 0}async function It(t){try{let e=bt(t,"steps"),r=(await kt.readdir(e,{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 kt.readFile(bt(e,n,"step.json"),"utf8"),o=JSON.parse(i).basis?.window;if(Array.isArray(o)&&o.length===2&&Number.isFinite(Number(o[0]))&&Number.isFinite(Number(o[1]))&&Number(o[0])>0&&Number(o[1])>0)return`${Math.round(Number(o[0]))}x${Math.round(Number(o[1]))}`}catch{}return}catch{return}}var Rt=!1,Q;function vr(){if(!Rt)if(Rt=!0,process.platform==="darwin")try{Q=hr("sw_vers",["-productVersion"],{timeout:2e3}).toString().trim()||void 0}catch{Q=Et()||void 0}else Q=Et()||void 0;return Q}function Me(t){let e={os:se(process.platform)},r=vr();if(r&&(e.os_version=r),t.cdpBrowser){let i=/^([A-Za-z]+)\/(\d+)/.exec(t.cdpBrowser);i&&(e.browser=i[1].replace(/^Headless/,""),e.browser_version=i[2])}t.resolution&&(e.resolution=t.resolution);let n=Qe(e,t.runnerEnvironment);if(!n.native_platform)return n;if(t.deviceName&&(n.device=t.deviceName),t.deviceModel){let i=St(t.deviceModel);i&&(n.device_slug=i)}return t.pixelResolution&&(n.viewport=n.resolution??yr(t.pixelResolution,n.pixel_ratio)??t.pixelResolution,n.resolution=t.pixelResolution),n}function yr(t,e){if(!e||!Number.isFinite(e)||e<=0)return;let r=/^(\d+)x(\d+)$/.exec(t);if(r)return`${Math.round(Number(r[1])/e)}x${Math.round(Number(r[2])/e)}`}async function Pt(t){if(t)try{let e=await fetch(`${t}/json/version`,{signal:AbortSignal.timeout(2e3)});if(!e.ok)return;let r=await e.json();return typeof r.Browser=="string"?r.Browser:void 0}catch{return}}function wr(t){let e;return()=>(e||(e=Pt(t)),e)}import{promises as E,existsSync as R,readFileSync as br}from"fs";import{basename as Sr,join as m}from"path";import{readFileSync as xr}from"fs";import{dirname as _r,resolve as kr}from"path";function At(t,e){let r=kr(t),n=xr(r,"utf8");return A(e?V(n,K(_r(r),e)):n)}var z=class t{constructor(e){this.opts=e}executionId;testId;definitionPath=null;definitionContent=null;accumulatedSteps=[];maxOrdinal=0;_attempts=[];_packDirOverride;_attached=!1;appiumMarks=wt();get attached(){return this._attached}static async attach(e){let r=Sr(e.packDir).replace(/\.evidence$/,""),n=new t({origin:"testrun",runKind:"author",pid:process.pid,title:e.testId,started:new Date().toISOString(),producerVersion:qe,cwd:e.cwd});n.executionId=r,n.testId=e.testId,n._packDirOverride=e.packDir,n._attached=!0;let i=m(e.packDir,"tests",e.testId);return await E.mkdir(i,{recursive:!0}),e.definition&&(await E.writeFile(m(i,e.definition.path),e.definition.content),n.definitionPath=e.definition.path,n.definitionContent=e.definition.content),n}async start(){if(this._attached)throw new Error("attach-mode session is already started");this.executionId=ce(),this.testId=this.opts.testmdRelPath?ye(this.opts.testmdRelPath):we(this.opts.objectiveOrName??"session",this.opts.sessionId??this.executionId);let e=this.opts.definition??null;return await ke({execution_id:this.executionId,title:this.opts.title,started:this.opts.started,producerVersion:this.opts.producerVersion,surfaces:this.opts.surfaces,run_kind:this.opts.runKind,origin:this.opts.origin,pid:this.opts.pid,...this.opts.credits!==void 0?{credits:this.opts.credits}:{}},this.testId,e,this.opts.cwd,this.opts.packRootDir?this.pack:void 0),e&&(this.definitionPath=e.path,this.definitionContent=e.content),{executionId:this.executionId,testId:this.testId,packTestDir:this.packTestDir}}get pack(){return this._packDirOverride?this._packDirOverride:this.opts.packRootDir?m(this.opts.packRootDir,`${this.executionId}.evidence`):h(this.executionId,this.opts.cwd)}get packTestDir(){return m(this.pack,"tests",this.testId)}async writeDefinition(e,r="test.md"){await E.writeFile(m(this.packTestDir,r),e),this.definitionPath=r,this.definitionContent=e}computeAssuranceId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let e=m(this.opts.cwd,this.opts.testmdRelPath);if(R(e))return D(br(e,"utf8"))?.id}}catch{}}computeDefinitionId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let e=m(this.opts.cwd,this.opts.testmdRelPath),r=m(this.opts.cwd,".context"),n=R(r)?w(r):void 0;if(R(e))return At(e,n)}if(this.definitionContent!=null)return A(this.definitionContent)}catch{}}noteSpawn(e){this.accumulatedSteps.push(...e.steps),this.maxOrdinal=Math.max(this.maxOrdinal,e.maxOrdinal)}nextOrdinalOffset(){return this.maxOrdinal}get steps(){return this.accumulatedSteps}get attempts(){return this._attempts}async archiveAttempt(e,r){let n=this._attempts.length+1,i=m(this.packTestDir,String(n)),s;try{await E.mkdir(i,{recursive:!0});for(let a of["steps","logs","v16-trajectory"]){let c=m(this.packTestDir,a);R(c)&&await E.rename(c,m(i,a))}this.definitionPath&&R(m(this.packTestDir,this.definitionPath))&&await E.copyFile(m(this.packTestDir,this.definitionPath),m(i,this.definitionPath));let o=m(i,"steps");if(R(o)){for(let a of await E.readdir(o))if(R(m(o,a,"failure.yaml"))){s=`${n}/steps/${a}/failure.yaml`;break}}}catch{}return this._attempts.push({n,status:e,steps:this.accumulatedSteps,...r!==void 0?{failedAt:r}:{},...s?{failure:s}:{}}),this.accumulatedSteps=[],this.maxOrdinal=0,n}async writeResult(e){let r=De(e.spawns),n=this._attempts.length?[...this._attempts.map(u=>({status:u.status})),{status:r,...e.durationMs!==void 0?{duration_ms:e.durationMs}:{}}]:void 0,i=n?new Set(n.map(u=>u.status)).size>1:void 0,s=this._attempts.length?{triggered:!0,outcome:r==="passed"?"healed":"exhausted",attempts:this._attempts.map(u=>({n:u.n,status:u.status,failed_at:u.failedAt??-1,...u.failure?{failure:u.failure}:{}}))}:void 0,o=this.pack,a=xe(e.externalIdInput),c=ae(e.runnerEnv,e.intentEnv),l=this.computeDefinitionId(),p=this.computeAssuranceId();await Re(o,this.testId,X({testId:this.testId,status:r,durationMs:e.durationMs,definitionPath:this.definitionPath,definitionId:l,assuranceId:p,externalId:a,environment:c,steps:e.steps,tags:e.tags,attempts:n,flaky:i,adaptiveHeal:s}));for(let u of this._attempts){let f=m(this.packTestDir,String(u.n));R(f)&&await E.writeFile(m(f,"result.yaml"),X({testId:this.testId,status:u.status,definitionPath:this.definitionPath,definitionId:l,assuranceId:p,externalId:a,environment:c,steps:u.steps,tags:e.tags}))}let d=e.externalIdInput;return e.log&&(d.commit_id||d.test_id||d.testcase_id)&&e.log("info","EVIDENCE_EXTERNAL_ID","Evidence external-id mapping",{execution_id:this.executionId,commit_id:d.commit_id??null,test_id:d.test_id??null,testcase_id:d.testcase_id??null,project_id:d.project_id??null,session_id:d.session_id??null,session_name:d.session_name??null}),r}get id(){return this.executionId}get test(){return this.testId}};async function Ir(t,e,r=ue){try{let n=await r(t);if(n.aborted.length>0||n.removed.length>0)try{e?.("info","EVIDENCE_RECOVERY","Startup evidence recovery swept incomplete packs",{aborted:n.aborted,removed:n.removed,origin:"startup"})}catch{}return n}catch(n){return console.warn("evidence: startup recovery failed",n),{aborted:[],removed:[]}}}import{promises as Ur}from"fs";import{existsSync as Te,mkdirSync as Vr,readdirSync as Br,readFileSync as zr,rmSync as Gr,statSync as Yr,writeFileSync as Hr}from"fs";import{join as O}from"path";import{mkdirSync as Er,renameSync as Rr,rmSync as Pr,writeFileSync as Ar}from"fs";import{join as Dt}from"path";var Dr=5e6;function $t(t,e,r){let n=Dt(t,"coverage","sources"),i=new Map,s=!1;try{for(let o of r.usecases)for(let a of o.sources){if(i.has(a.id)){a.file=i.get(a.id);continue}if(!a.cid)continue;let c=ft(e,a.cid);if(c===null||c.byteLength>Dr)continue;s||(Er(n,{recursive:!0}),s=!0);let l=Dt(n,a.id),p=`${l}.tmp-${process.pid}`;Ar(p,c),Rr(p,l);let d=`coverage/sources/${a.id}`;i.set(a.id,d),a.file=d}}catch{for(let o of r.usecases)for(let a of o.sources)delete a.file;if(s)try{Pr(n,{recursive:!0,force:!0})}catch{}}}import{existsSync as ee,readFileSync as F,renameSync as Fr,writeFileSync as Or}from"fs";import{dirname as Ne,isAbsolute as te,resolve as re}from"path";var $r=new Set(["inline","testmd","testrun"]),Cr=new Set(["inferred","authored","runtime-derived"]),je=new Set(["passed","failed","broken","skipped"]);function Ct(t,e,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=e;for(let i=0;;i++){let s=U(t);if(n.latestHash!==s){if(i>=3)return{record:null,errors:[{code:"STALE_BASIS",detail:`graph opened at ${String(n.latestHash)} but chain head is ${String(s)} \u2014 retry budget exhausted`}]};n=w(t);continue}let o=Lr(t,n,r);if(o!=="cas")return o;if(i>=3)return{record:null,errors:[{code:"STALE_BASIS",detail:"concurrent appends kept moving the head \u2014 retry budget exhausted"}]};n=w(t)}}function Lr(t,e,r){let n=[],i=[];for(let o of r.facts){let a=`executions[${o.ref}]`,c=e.resolve(o.ref),l=c?e.tipOf(c.cid):null;if(!c||!l||e.superseded.has(l)){n.push({code:"UNKNOWN_REF",detail:`${a}: '${o.ref}' is not a live committed node`});continue}if(e.nodeLabel.get(l)!==le.TEST){n.push({code:"ILLEGAL_TARGET",detail:`${a}: execution facts attach to tests \u2014 '${o.ref}' is a ${e.nodeLabel.get(l)}`});continue}if(!$r.has(o.mode)){n.push({code:"BAD_MODE",detail:`${a}: mode '${o.mode}' not in inline|testmd|testrun`});continue}if(!je.has(o.verdict)){n.push({code:"BAD_VERDICT",detail:`${a}: verdict '${o.verdict}' not in ${[...je].join("|")}`});continue}if(!Cr.has(o.oracle_mode)){n.push({code:"BAD_ORACLE_MODE",detail:`${a}: oracle_mode '${o.oracle_mode}' not in inferred|authored|runtime-derived`});continue}if(typeof o.drift_flag!="boolean"||typeof o.stale_at_run!="boolean"){n.push({code:"MISSING_FIELD",detail:`${a}: drift_flag and stale_at_run are required booleans`});continue}if(!o.execution_id||!o.started_at||!o.definition_id_at_run){n.push({code:"MISSING_FIELD",detail:`${a}: execution_id, started_at and definition_id_at_run are required`});continue}let p=[];for(let d of o.per_ac??[]){let u=e.resolve(d.ac_ref),f=u?e.tipOf(u.cid):null;if(!u||!f||e.superseded.has(f)||e.nodeLabel.get(f)!==le.AC){n.push({code:"UNKNOWN_REF",detail:`${a}.per_ac: '${d.ac_ref}' is not a live AC`});continue}if(!je.has(d.verdict)){n.push({code:"BAD_VERDICT",detail:`${a}.per_ac['${d.ac_ref}']: verdict '${d.verdict}'`});continue}p.push({ac_ref:e.nameOf.get(f)??f,verdict:d.verdict})}i.push({about:l,definition_id_at_run:o.definition_id_at_run,verdict:o.verdict,...p.length?{per_ac:p}:{},drift_flag:o.drift_flag,oracle_mode:o.oracle_mode,stale_at_run:o.stale_at_run,...o.unresolved_acs?.length?{unresolved_acs:o.unresolved_acs}:{},execution_id:o.execution_id,...o.evidence_id?{evidence_id:o.evidence_id}:{},...o.duration_ms!==void 0?{duration_ms:o.duration_ms}:{},started_at:o.started_at,mode:o.mode,local:o.local,...o.via_parent?{via_parent:o.via_parent}:{}})}if(n.length>0)return{record:null,errors:n};let s;try{s=W(t,{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:e.latestHash})}catch(o){if(o instanceof ut)return"cas";throw o}return q(t),{record:s.record,errors:null}}function Mt(t){let e={failed:3,broken:2,skipped:1,passed:0},r=new Map;for(let n of t)for(let i of n.verifies??[]){let s=r.get(i);(s===void 0||(e[n.status]??0)>(e[s]??0))&&r.set(i,n.status)}return[...r.entries()].map(([n,i])=>({ref:n,verdict:i}))}function jt(t){let e=[],r=J(t.cwd);if(!ee(r))return{synced:0,superseded:0,skipped:"no-context",warnings:e};let n=t.by??{kind:"ai",id:"exec-sync"},i=w(r),s=[],o=0,a=new Set,c=new Set(t.members.map(d=>te(d.path)?d.path:re(t.cwd,d.path))),l=new Map;for(let d of t.members){let u=te(d.path)?d.path:re(t.cwd,d.path);for(let f of Mr(u)){if(a.has(f.path))continue;let y=f.path===u,_=!y&&c.has(f.path),b=y?void 0:D(F(u,"utf8"))?.id,G=F(f.path,"utf8"),x=D(G);if(!x?.id){a.add(f.path);continue}let ie=i.resolve(x.id),M=ie?i.tipOf(ie.cid):null;if(!ie||!M||i.superseded.has(M)){a.add(f.path),e.push(`sync: ${x.id} does not resolve to a live test \u2014 skipped (foreign store?)`);continue}let Y=A(V(G,K(Ne(f.path),i))),Kt=String(i.getNode(M)?.content.test_md_blob??""),H=A(V(Kt,st(i))),j=!1,oe=M;if(Y===H)x.base!==H&&Ot(f.path,G,H,e);else if(x.base===H){let g=Nr(r,i,M,G,Y,Ne(f.path),n);g.error?(e.push(`sync: could not supersede ${x.id}: ${g.error}`),j=!0):(o++,oe=g.newCid,j=g.oracleTier,Ot(f.path,F(f.path,"utf8"),Y,e),i=w(r))}else j=!0,e.push(x.base?`sync: ${x.id} was edited from an older version \u2014 graph kept; reconcile via a redesign or maintain`:`sync: ${x.id} carries no base pin (hand-copied file?) \u2014 fact attached with drift flag`);if(_){j&&l.set(f.path,!0);continue}a.add(f.path);let He=i.getNode(oe)?.content.check,Ke=y?d.acs??[]:[],Ue=Ke.filter(g=>Lt(i,g.ref)),We=Ke.filter(g=>!Lt(i,g.ref)).map(g=>g.ref);s.push({ref:x.id,definition_id_at_run:Y,verdict:d.verdict,...Ue.length?{per_ac:Ue.map(g=>({ac_ref:g.ref,verdict:g.verdict}))}:{},drift_flag:j||l.get(f.path)===!0||y&&d.driftFlag===!0,oracle_mode:He?.expected_mode??(nt(He?.operand)?"runtime-derived":"inferred"),stale_at_run:i.stale(oe)!=="fresh",...We.length?{unresolved_acs:We}:{},execution_id:d.executionId,...d.evidenceId?{evidence_id:d.evidenceId}:{},...d.durationMs!==void 0?{duration_ms:d.durationMs}:{},started_at:d.startedAt,mode:d.mode,local:d.local,...b?{via_parent:b}:{}})}}if(s.length===0)return{synced:0,superseded:o,warnings:e};let p=Ct(r,w(r),{facts:s,by:n});return p.errors?(e.push(...p.errors.map(d=>`sync facts: ${d.code}: ${d.detail}`)),{synced:0,superseded:o,warnings:e}):{synced:s.length,superseded:o,warnings:e}}function Mr(t){let e=[],r=new Set,n=i=>{if(r.has(i)||!ee(i))return;r.add(i);let s=F(i,"utf8");for(let o of s.split(`
5
- `)){let a=/^@import\s+(\S+)\s*$/.exec(o.trim());if(!a)continue;let c=te(a[1])?a[1]:re(Ne(i),a[1]);ee(c)&&D(F(c,"utf8"))?.id&&n(c)}e.push({path:i})};return n(t),e}function Lt(t,e){let r=t.resolve(e),n=r?t.tipOf(r.cid):null;return!!(r&&n&&!t.superseded.has(n)&&t.nodeLabel.get(n)==="ac")}function jr(t,e,r){let n=t.split(`
6
- `),i=ot(n);return n.map((s,o)=>{let a=it.exec(s.trim());if(!a||i.has(o))return s;let c=a[1];if(r.resolve(c))return s;let l=te(c)?c:re(e,c);if(!ee(l))return s;let p=D(F(l,"utf8"))?.id;return!p||!r.resolve(p)?s:`@import ${p}`}).join(`
7
- `)}function Nr(t,e,r,n,i,s,o){let a=e.getNode(r);if(!a)return{oracleTier:!1,error:"tip unreadable"};let c=jr(at(n),s,e),l=String(a.content.test_md_blob??""),p=/^#\s+(.+?)\s*$/m.exec(c)?.[1]??String(a.content.title??""),d={...a.content,test_md_blob:c,definitionId:i,title:p},u=ct("test",d);if(u.length>0)return{oracleTier:!1,error:u.map(b=>b.detail).join("; ")};let f=dt("test",d);if(f===r)return{newCid:r,oracleTier:!1};let y=Ft(l)!==Ft(c),_=U(t);if(e.latestHash!==_)return{oracleTier:y,error:`store advanced under the sync (basis ${String(e.latestHash)} vs head ${String(_)}) \u2014 re-run to retry`};try{W(t,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:f,label:"test",content:d}],edges:[],review:[{id:f,kind:"review-item",resolution:"edited",edit:null,reason:"edited on disk (run sync)",by:o}],supersessions:[{kind:"node",old:r,new:f,reason:"edited on disk (run sync)",by:o}],source_head_moves:{}},{expectPrev:_})}catch(b){return{oracleTier:y,error:b instanceof Error?b.message:String(b)}}return q(t),{newCid:f,oracleTier:y}}var Tr=/\s@verifies\s+(ac-[\w.:\/-]+(?:\s*,\s*ac-[\w.:\/-]+)*)\s*$/;function Ft(t){let e=[],r=t.split(`
8
- `),n=!1;for(let i of r){if(/^##\s/.test(i)){n=/\bassert\b/i.test(i);let s=Tr.exec(i);s&&e.push(`v:${s[1].trim()}`);continue}n&&i.trim()!==""&&e.push(i.trim())}return e.join(`
9
- `)}function Ot(t,e,r,n){try{let i=e.split(`
10
- `),s=-1;if(i[0]?.trim()==="---"){for(let c=1;c<i.length;c++)if(i[c].trim()==="---"){s=c;break}}if(s<0)return;let o=!1;for(let c=1;c<s;c++){if(/^\s+base:\s*sha256:[0-9a-f]+\s*$/.test(i[c])){i[c]=i[c].replace(/sha256:[0-9a-f]+/,r),o=!0;break}if(/^assurance:\s*$/.test(i[c])&&!i.slice(c,Math.min(c+3,s)).some(l=>/^\s+base:/.test(l))){i.splice(c+2,0,` base: ${r}`),o=!0;break}}if(!o)return;let a=`${t}.tmp-sync`;Or(a,i.join(`
11
- `)),Fr(a,t)}catch(i){n.push(`sync: pin refresh failed for ${t} (${i instanceof Error?i.message:String(i)}) \u2014 next run self-heals`)}}var Kr={passed:"passed",failed:"failed",broken:"blocked",skipped:"not-run"},Nt=(t,e)=>{try{if(!Te(e))return{status:"skipped",reason:"no context store at the project root"};let r=O(t,"tests");if(!Te(r))return{status:"skipped",reason:"pack has no tests/"};let n=new Map;for(let a of Br(r)){let c=O(r,a,"result.yaml");if(!Te(c)||!Yr(O(r,a)).isDirectory())continue;let l=P(zr(c,"utf8"));if(!l?.definition_id&&!l?.assurance_id)continue;let p=Mt(l.steps??[]),d={testShortId:String(l.test??a),execution:Kr[String(l.status)]??"not-run",...p.length?{acs:p}:{}};l.assurance_id&&n.set(`id:${l.assurance_id}`,d),l.definition_id&&n.set(`def:${l.definition_id}`,d)}let i=pt(w(e),n,{scope:"run"}),s=lt(i);$t(t,e,i);let o=v({...i,rollup:s},{lineWidth:-1});return Vr(O(t,"coverage"),{recursive:!0}),Hr(O(t,"coverage","usecases.yaml"),o),{status:"written"}}catch(r){try{Gr(O(t,"coverage","sources"),{recursive:!0,force:!0})}catch{}return{status:"skipped",reason:r instanceof Error?r.message:String(r)}}};async function Wr(t){try{let e=new z({origin:"inline",runKind:"author",pid:t.pid,title:t.title,started:new Date().toISOString(),producerVersion:t.producerVersion,surfaces:t.surfaces,objectiveOrName:t.objectiveOrName,sessionId:t.sessionId,cwd:t.cwd,packRootDir:t.packRootDir}),r=await e.start();return{session:e,...r,packDir:e.pack,spawns:[],startedAtMs:Date.now(),cwd:t.cwd}}catch(e){return console.warn("evidence: inline pack creation failed",e),null}}function qr(t,e,r){if(!t)return;t.session.noteSpawn(e),e.resolution&&(t.resolution=e.resolution),t.runnerEnvironment=Ze(t.runnerEnvironment,e.runnerEnvironment);let n=(r?.per_flow_metadata??[]).map(i=>({resultCode:i?.result_code!=null?Number(i.result_code):null}));t.spawns.push({resultCode:r?.result_code!=null?Number(r.result_code):null,...n.length?{perFlow:n}:{}})}function Jr(t){if(t)return{packTestDir:t.packTestDir,ordinalOffset:t.session.nextOrdinalOffset()}}async function Xr(t,e){if(!t)return null;if(t.finalized)return t.finalized;let r=(n,i,s)=>e.log?e.log("warn",n,i,s):console.warn(`evidence: ${i}`,s??"");try{if(e.recordedTestPath)try{await t.session.writeDefinition(await Ur.readFile(e.recordedTestPath,"utf8"))}catch(o){r("EVIDENCE_DEFINITION_FAILED","could not attach synthesized test.md",{error:String(o)})}let n=e.cdpBrowserCapture?await e.cdpBrowserCapture():void 0,i=await t.session.writeResult({steps:t.session.steps,spawns:t.spawns.length?t.spawns:[{resultCode:null}],externalIdInput:{...e.externalIdInput,execution_id:t.executionId},runnerEnv:Me({cdpBrowser:n,resolution:t.resolution,runnerEnvironment:t.runnerEnvironment,deviceName:e.deviceName,deviceModel:e.deviceModel,pixelResolution:await It(t.packTestDir)}),intentEnv:et(e.model,t.runnerEnvironment),durationMs:e.durationMs??Date.now()-t.startedAtMs,log:e.log});try{if(e.recordedTestPath){let o=jt({cwd:e.cwd??t.cwd??process.cwd(),members:[{path:e.recordedTestPath,verdict:i,executionId:t.executionId,startedAt:new Date(t.startedAtMs).toISOString(),mode:"inline",local:e.local??!1}]});for(let a of o.warnings)r("EXEC_SYNC",a)}}catch(o){r("EXEC_SYNC","exec-sync failed",{error:String(o)})}try{let o=(e.coverageWriter??Nt)(t.packDir,J(e.cwd??t.cwd??process.cwd()));o.status==="skipped"&&r("EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${o.reason}`)}catch(o){r("EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(o)})}let s=await Oe({executionId:t.executionId,testId:t.testId,saved:e.saved,runKind:"author",verdict:i,cwd:e.cwd??t.cwd,packDir:t.packDir,tuiLogPath:e.tuiLogPath,log:e.log,surface:"inline",requireRealLog:!!t.runnerEnvironment?.native_platform,appiumMarks:t.session.appiumMarks});return t.finalized=s,e.log?.("info","EVIDENCE_SEALED","Inline pack sealed",{execution_id:t.executionId,verdict:i,valid:s.valid,pack:t.packDir,store_copy:s.storePath??null}),s}catch(n){return r("EVIDENCE_SEAL_FAILED","inline pack finalize failed",{error:String(n)}),null}}import{statSync as Zr,openSync as Qr,readSync as en,closeSync as tn}from"fs";import{basename as rn,resolve as nn}from"path";async function on(t,e,r={}){let n=r.out??(p=>process.stdout.write(p+`
12
- `)),i=p=>(n(`error: ${p}`),2);if(e.env!=="prod"&&e.env!=="stage")return i(`invalid --env: ${String(e.env)}`);if(e.port!==void 0&&(!Number.isInteger(e.port)||e.port<1||e.port>65535))return i("invalid --port: expected an integer 1-65535");let s;try{s=B(e.env,e.viewerUrl),new URL(s)}catch{return i(`invalid --viewer-url: ${e.viewerUrl}`)}if(t.length===0)return i("no pack paths given");let o=new Map;for(let p of t){let d=nn(p),u;try{u=Zr(d)}catch{return i(`${p}: not found`)}if(u.isDirectory())return i(`${p}: is a directory \u2014 packs must be sealed .evidence files (run the execution to completion, or seal it, first)`);if(!u.isFile())return i(`${p}: not a regular file`);let f=Buffer.alloc(2),y=Qr(d,"r");try{en(y,f,0,2,0)}finally{tn(y)}if(f.toString("latin1")!=="PK")return i(`${p}: not a sealed evidence pack (zip magic missing)`);let _=rn(d);if(o.has(_))return i(`duplicate pack basename: ${_} (URL names collide \u2014 rename one)`);o.set(_,d)}let a=r.log??((p,d,u)=>process.stderr.write(`warn: ${d} reason=${u.reason} path=${u.path}
13
- `)),c;try{c=await pe({packs:o,allowedOrigins:[new URL(s).origin],port:e.port,log:a})}catch(p){return i(`could not bind 127.0.0.1${e.port?`:${e.port}`:""} \u2014 ${p.message}`)}n(`serving ${o.size} pack${o.size===1?"":"s"} on http://127.0.0.1:${c.port}`);for(let p of o.keys()){let d=c.urlFor(p);n(p),n(` pack ${d}`),n(` viewer ${fe(d,s)}`)}return n("press Ctrl-C to stop"),await(r.hold??sn)(),await c.close(),0}function sn(){return new Promise(t=>{let e=process.listeners("SIGINT");process.removeAllListeners("SIGINT"),process.once("SIGINT",()=>{for(let r of e)process.on("SIGINT",r);t()})})}import{promises as ne}from"fs";import{tmpdir as un}from"os";import{join as Bt,resolve as Be}from"path";var an=["error","prefer_first","prefer_latest","discard"],cn=["external_id.commit_id","external_id.test_id"];function Tt(t){let e=t.replace(/-/g,"_");return an.includes(e)?e:null}function Vt(t){let e=t==="discard"?{on_collision:"discard"}:{on_collision:"error",identity:{keys:[...cn],on_same:t??"nest",on_different:t?"error":"split"}};return v({packs:{require_status:"finalized",require_valid:"L1",on_ineligible:"abort"},tests:e,rules:[{file:"run.yaml",key:"run_id",must:"different",on_violation:"skip"},{file:"result.yaml",key:"external_id.project_id",must:"same",on_violation:"error"},{file:"result.yaml",key:"external_id.org_id",must:"same",on_violation:"error"}]},{lineWidth:-1})}async function Ve(t){try{if(!t.isTTY){t.log(me(t.packPath));return}let e=B(t.env);await(t.renderPrompt??dn)(t.packPath,e)}catch(e){try{t.log(`evidence view failed \u2014 ${e.message}`)}catch{}}}async function dn(t,e){let r=await import("./react-QWOAB3TB.js"),{render:n}=await import("./build-JIKYOZUH.js"),{EvidenceViewOffer:i}=await import("./EvidenceViewOffer-AQ3KB3EN.js");await new Promise(s=>{let o=n(r.default.createElement(i,{packPath:t,viewerBase:e,onDone:()=>{o.unmount(),s()}}),{stdout:process.stderr,exitOnCtrlC:!1})})}async function ln(t,e,r=process.cwd(),n={}){let i=n.out??(u=>process.stdout.write(u+`
14
- `)),s=n.err??(u=>process.stderr.write(u+`
15
- `)),o=u=>(s(`evidence merge: ${u}`),2);if(!e.runId)return o("--run-id is required (merged identity is the caller's fact)");if(e.rules&&e.onCollision)return o("--rules and --on-collision are mutually exclusive");let a;if(e.onCollision!==void 0){let u=Tt(e.onCollision);if(!u)return o(`invalid --on-collision: ${e.onCollision} (expected error | prefer-first | prefer-latest | discard)`);a=u}let c=[];for(let u of t){let f=await pn(u,r);if(!f)return o(`no pack found for "${u}"`);c.push(f)}let l=e.out?Be(r,e.out):h(e.runId,r),p=null,d;e.rules?d=Be(r,e.rules):(p=await ne.mkdtemp(Bt(un(),"kane-merge-rules-")),d=Bt(p,"merge-rules.yaml"),await ne.writeFile(d,Vt(a)));try{let u=await(n.mergeFn??tt)(c,{runId:e.runId,out:l,rulesPath:d,title:e.title,finalize:e.finalize});return e.json?i(JSON.stringify(u)):fn(i,u),u.output.finalized&&!e.json&&await(n.offer??Ve)({packPath:l,env:e.env,isTTY:n.isTTY??(!!process.stdin.isTTY&&!!process.stderr.isTTY),log:s}),0}catch(u){let f=u instanceof Error?u.message:String(u);return u?.code==="ABORT"?(s(`evidence merge: aborted \u2014 ${f}`),1):o(f)}finally{p&&await ne.rm(p,{recursive:!0,force:!0}).catch(()=>{})}}async function pn(t,e){let r=Be(e,t);if(await zt(r))return r;let n=h(t,e);return await zt(n)?n:null}async function zt(t){try{return await ne.stat(t),!0}catch{return!1}}function fn(t,e){let{packs:r,tests:n,output:i}=e;t(`evidence: merged ${n.merged} tests from ${r.eligible.length} packs -> ${i.path} (${i.finalized?"sealed":"live"})`);for(let s of r.skipped)t(` skipped ${s.runId}: ${s.rule} \u2014 ${s.reason}`);for(let s of n.collisions){let o;s.action==="nest"?o=`nested into ${s.folder}, latest ${s.winner}`:s.action==="split"?o=`split into ${s.folder}`:o=`winner ${s.winner}`,t(` collision ${s.test}: ${o} (${s.rule})`)}for(let s of n.discarded)t(` discarded ${s}`)}import{copyFileSync as mn,existsSync as ze,mkdirSync as gn}from"fs";import{join as Gt}from"path";function hn(t,e,r){try{let n=Gt(t,"auteur","execution.json");if(ze(n))return!0;for(let i of e)if(!(!i||!ze(i)))return gn(Gt(t,"auteur"),{recursive:!0}),mn(i,n),!0}catch(n){try{r?.("debug","EVIDENCE_BLOB_COPY_FAILED","auteur execution blob copy failed",{operation:"ensureAuteurExecution",source:e.find(i=>i&&ze(i))??null,error:n instanceof Error?n.message:String(n)})}catch{}}return!1}import{readFileSync as vn}from"fs";import{join as yn}from"path";function Ye(t){let e=[],r=!0,n=s=>{if(s===null||typeof s!="object")return;let o=s;if(Array.isArray(o.operations))for(let a of o.operations){let c=a?.operation_id;typeof c=="string"&&c&&e.push(c)}if(Array.isArray(o.children)){o.content_type!=="generative_block"&&(r=!1);for(let a of o.children)n(a)}if(Array.isArray(o.branches)){r=!1;for(let a of o.branches){let c=a?.children;if(Array.isArray(c))for(let l of c)n(l)}}},i=t?.instructions;if(Array.isArray(i))for(let s of i)n(s);return{ids:e,linear:r}}function wn(t){return Ye(t).ids}function Ge(t,e){let r=new Set(e.map(a=>a.action_id).filter(Boolean)),n=-1;for(let a of r){let c=t.indexOf(a);c>n&&(n=c)}let i=e.reduce((a,c)=>Math.max(a,c.ordinal),0),s=new Set,o=[];for(let a of t.slice(n+1))r.has(a)||s.has(a)||(s.add(a),o.push({id:a,ordinal:++i,status:"skipped",action_id:a}));return o}function Yt(t,e){let r=new Set(e),n=t.filter(s=>s.action_id);if(n.some(s=>r.has(s.action_id))||n.length>e.length)return null;let i=0;return t.map(s=>s.action_id?{...s,action_id:e[i++]}:s)}function xn(t,e){if(t.length>e.length)return!1;for(let r=0;r<t.length;r++)if(e[r]!==t[r].action_id)return!1;return!0}function _n(t,e,r,n=!0){if(e.length===0)return{steps:t,tail:[]};let i=(r&&n?Yt(t,e):null)??t,s=i.filter(a=>a.action_id),o=new Set(e);return s.length>0&&s.every(a=>o.has(a.action_id))?{steps:i,tail:Ge(e,i)}:s.length>0&&!xn(s,e)?{steps:i,tail:[],unjoined:!0}:{steps:i,tail:Ge(e,i)}}function Ht(t){try{let e=vn(yn(t,"auteur","execution.json"),"utf8");return Ye(JSON.parse(e))}catch{return{ids:[],linear:!0}}}function kn(t){return Ht(t).ids}export{C as a,ge as b,he as c,ve as d,ye as e,we as f,xe as g,qt as h,_e as i,ke as j,Jt as k,Xt as l,be as m,X as n,Ee as o,Re as p,Pe as q,Ae as r,Zt as s,Qt as t,De as u,er as v,$e as w,Ce as x,Le as y,_t as z,Oe as A,It as B,Me as C,Pt as D,wr as E,z as F,Ir as G,Mt as H,jt as I,Nt as J,Wr as K,qr as L,Jr as M,Xr as N,on as O,Vt as P,Ve as Q,ln as R,hn as S,Ye as T,wn as U,Ge as V,Yt as W,_n as X,Ht as Y,kn as Z};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as C}from"./chunk-RX5TZZNQ.js";import{f as Z}from"./chunk-XQFITNA3.js";import{a as D}from"./chunk-YCCUBQY4.js";import{a as O}from"./chunk-CZUOGGUK.js";import{a as M}from"./chunk-LN7233E2.js";import{b as W}from"./chunk-XY325HDJ.js";import{a as B}from"./chunk-AO3PBE2V.js";import{x as o}from"./chunk-OFW3ZVTP.js";import{a as v}from"./chunk-HCBYKLMW.js";import{a as n,b as t,i as N}from"./chunk-C44QQJR4.js";import{a as L}from"./chunk-6YGTRKDT.js";import{e as g}from"./chunk-UR6MHSHU.js";var h=g(v(),1);function oe(e){let i=e.kind==="simulator";switch(e.state){case"ready":return i?"Booted":"Running";case"stopped":return i?"Shutdown":"Stopped";case"unauthorized":return"UNAUTHORIZED";case"offline":return"Offline"}}function te(e){switch(e.state){case"unauthorized":return"accept the authorisation prompt on the device, then reopen this list";case"offline":return e.kind==="simulator"?"not responding \u2014 open Simulator.app to inspect it":"not responding \u2014 reconnect it, or restart the emulator";default:return}}function re(e,i){let c=M(i.id);return e.platform===i.platform&&e.kind===i.kind&&(M(e.id)===c||e.virtualName!==void 0&&M(e.virtualName)===c)}function ne(e,i){let c=e.state==="ready"||e.state==="stopped",m=te(e);return{id:e.id,label:`${e.displayName} \xB7 ${oe(e)}`,...i&&re(e,i)?{isActive:!0}:{},...c?{}:{disabled:!0},...!c&&m?{disabledHint:m}:{}}}function ie(e){return e==="emulator"?"No Android emulator found. Make sure an emulator exists on this machine (Android Studio \u2192 Device Manager), then reopen this list.":e==="simulator"?"No iOS simulator found. Make sure a simulator exists on this machine (Xcode \u2192 Windows \u2192 Devices and Simulators), then reopen this list.":"No emulator or simulator found. Make sure one exists on this machine, then reopen this list."}function ge({targets:e,preselectedTarget:i,preselectedId:c,busyMessage:m,onSelect:S,onCancel:f,kind:l}){if(m)return(0,h.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,h.jsx)(t,{color:o.orange,bold:!0,children:"Device"}),(0,h.jsxs)(n,{marginTop:1,children:[(0,h.jsx)(C,{}),(0,h.jsxs)(t,{color:o.secondary,children:[" ",m]})]})]});if(e.length===0)return(0,h.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,h.jsx)(t,{color:o.orange,bold:!0,children:"Device"}),(0,h.jsx)(n,{marginTop:1,children:(0,h.jsx)(t,{color:o.dim,children:ie(l)})})]});let d=e.map(r=>ne(r,i)),p=i?d.find(r=>r.isActive)?.id??null:c?e.find(r=>r.id===c||r.virtualName===c)?.id??null:null,a=new Map(e.map(r=>[r.id,r]));return(0,h.jsx)(O,{title:"Device",items:d,itemNoun:"devices",defaultActiveId:p,preserveSelectionById:!0,onSelect:r=>{let y=a.get(r.id);y&&S(y)},onCancel:f})}var b=g(L(),1);var u=g(v(),1),q=50,G=500;function ae(e){return`${e.name} (${e.appId})`}function ve({kind:e,listApps:i,onSelect:c,onManualEntry:m,onCancel:S,busyMessage:f}){let[l,d]=(0,b.useState)([]),[p,a]=(0,b.useState)(!0),[r,y]=(0,b.useState)(!1),[Q,E]=(0,b.useState)(!1),[w,H]=(0,b.useState)(null),[$,V]=(0,b.useState)(""),[J,U]=(0,b.useState)(!1),X=(0,b.useRef)(!0),R=(0,b.useRef)(0);if((0,b.useEffect)(()=>{let x=++R.current,k=$.trim();X.current?a(!0):k&&E(!0),y(!0),H(null),U(!1),(async()=>{let I=[];try{for(let P=0;;P+=q){let z=await i({limit:q,offset:P,search:k});if(x!==R.current)return;if(I.push(...z.apps),d([...I]),X.current&&(a(!1),X.current=!1),E(!1),z.apps.length===0||I.length>=z.total)break;if(I.length>=G){U(!0);break}}}catch(P){if(x!==R.current)return;H(P instanceof Error?P.message:String(P)),a(!1),E(!1)}finally{x===R.current&&y(!1)}})()},[$,i]),N((x,k)=>{if(k.tab){m();return}k.escape&&S()},{isActive:!!w&&!f}),f)return(0,u.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,u.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,u.jsxs)(n,{marginTop:1,children:[(0,u.jsx)(C,{}),(0,u.jsxs)(t,{color:o.secondary,children:[" ",f]})]})]});if(w)return(0,u.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.red,paddingX:2,paddingY:1,children:[(0,u.jsx)(t,{color:o.red,bold:!0,children:"App under test"}),(0,u.jsx)(n,{marginTop:1,children:(0,u.jsx)(t,{color:o.red,children:"Could not load your uploads."})}),(0,u.jsx)(n,{marginTop:1,children:(0,u.jsx)(t,{color:o.dim,children:w})}),(0,u.jsx)(B,{bindings:[{keys:"tab",label:"tab to enter an app id"}],escBackLabel:"back to chat"})]});let j=new Map(l.map(x=>[x.appId,x])),ee=l.map(x=>({id:x.appId,label:ae(x)})),_=!p&&!r&&l.length===0&&!$.trim()?e==="simulator"?"No simulator builds uploaded to this account yet \u2014 press Tab to enter an app id.":"No emulator builds uploaded to this account yet \u2014 press Tab to enter an app id.":null;return(0,u.jsx)(O,{title:"App under test",items:ee,loading:p,loadingText:"Loading your uploads\u2026",loadingMore:r,searching:Q,itemNoun:"uploads",preserveSelectionById:!0,onSearch:V,onTab:m,extraHint:"tab to enter an id",footer:_?(0,u.jsx)(t,{color:o.dim,children:_}):J?(0,u.jsx)(t,{color:o.dim,children:`Showing the first ${G} \u2014 type to search the rest.`}):void 0,onSelect:x=>{let k=j.get(x.id);k&&c({appId:k.appId,name:k.name})},onCancel:S})}var Y=g(L(),1);var T=g(v(),1),le={emulator:["apk"],simulator:["zip"]};function pe(e){return Z(e.trim())}function Ne({kind:e,onBack:i,onSelect:c,onCancel:m}){let[S,f]=(0,Y.useState)(""),[l,d]=(0,Y.useState)(null),p=e==="emulator"?".apk":".zip";return(0,T.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,T.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,T.jsx)(n,{marginTop:1,children:(0,T.jsx)(t,{color:o.dim,children:`Path to a build (${p}): `})}),(0,T.jsxs)(n,{marginTop:1,children:[(0,T.jsx)(t,{color:o.dim,children:" "}),(0,T.jsx)(D,{value:S,onChange:a=>{f(a),l&&d(null)},onSubmit:a=>{let r=pe(a);if(!r){d(a.trim()?`Not a build \u2014 expected ${p}.`:"Enter the path to a build.");return}if(!le[e].includes(r.kind)){d(`${r.kind} builds don't run on a ${e} \u2014 expected ${p}.`);return}d(null),c(r).then(y=>{!y.ok&&y.error&&d(y.error)})},onCancel:i,placeholder:e==="emulator"?"/path/to/app-debug.apk":"/path/to/MyApp.zip"})]}),l&&(0,T.jsx)(n,{marginTop:1,children:(0,T.jsx)(t,{color:o.red,children:l})}),(0,T.jsx)(B,{bindings:[{keys:"\u21B5",label:"use this build"}],escBackLabel:"back"})]})}var F=g(L(),1);var A=g(v(),1);function se(e){return[{value:"local",label:"Local build",hint:e==="emulator"?".apk":".zip",available:!0},{value:"uploaded",label:"Uploaded app",hint:"an app id from your cloud uploads",available:!0}]}function $e({kind:e,onSelect:i,onCancel:c}){let m=se(e),[S,f]=(0,F.useState)(0),[l,d]=(0,F.useState)(null);return N((p,a)=>{if(a.escape){c();return}if(a.upArrow&&f(r=>Math.max(0,r-1)),a.downArrow&&f(r=>Math.min(m.length-1,r+1)),a.return){let r=m[S];if(!r.available){d("That source isn't available \u2014 choose a local build for now.");return}d(null),i(r.value)}}),(0,A.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,A.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,A.jsx)(n,{marginTop:1,flexDirection:"column",children:m.map((p,a)=>{let r=a===S,y=p.available?r?o.orange:void 0:o.muted;return(0,A.jsxs)(n,{children:[(0,A.jsxs)(t,{color:y,children:[r?"\u276F ":" ",p.label]}),(0,A.jsxs)(t,{color:o.dim,children:[" ",p.hint]})]},p.value)})}),l&&(0,A.jsx)(n,{marginTop:1,children:(0,A.jsx)(t,{color:o.red,children:l})}),(0,A.jsx)(B,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"select"}],escBackLabel:"back"})]})}var K=g(L(),1);var s=g(v(),1);function We({busyMessage:e,onSubmit:i,onBack:c}){let[m,S]=(0,K.useState)(""),[f,l]=(0,K.useState)(null);return e?(0,s.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,s.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,s.jsxs)(n,{marginTop:1,children:[(0,s.jsx)(C,{}),(0,s.jsxs)(t,{color:o.secondary,children:[" ",e]})]})]}):(0,s.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,s.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,s.jsx)(n,{marginTop:1,children:(0,s.jsx)(t,{color:o.dim,children:"App id from your cloud uploads:"})}),(0,s.jsxs)(n,{marginTop:1,children:[(0,s.jsx)(t,{color:o.dim,children:" "}),(0,s.jsx)(D,{value:m,onChange:d=>{S(d),f&&l(null)},onSubmit:d=>{let p=d.trim();if(!p){l("Enter an app id.");return}if(!W(p)){l("That doesn't look like an app id \u2014 they start with APP.");return}l(null),i(p).then(a=>{!a.ok&&a.error&&l(a.error)})},onCancel:c,placeholder:"APP1016032231178585590501450"})]}),f&&(0,s.jsxs)(n,{marginTop:1,flexDirection:"column",children:[(0,s.jsx)(t,{color:o.red,children:f}),(0,s.jsx)(t,{color:o.dim,children:"Enter a valid app id \u2014 copy it from your cloud uploads."})]}),(0,s.jsx)(B,{bindings:[{keys:"\u21B5",label:"use this app"}],escBackLabel:"back"})]})}export{ge as a,ve as b,Ne as c,$e as d,We as e};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as h}from"./chunk-RZ4F3BHX.js";var l=class{config;buffer=[];stepBuffer=new Map;flushTimer=null;currentRunIndex=null;stopped=!1;_droppedBatches=0;_droppedEntries=0;constructor(t){this.config=t}start(){if(this.flushTimer)return;let t=this.config.flushIntervalMs??5e3;this.flushTimer=setInterval(()=>{this.flush().catch(()=>{})},t),this.flushTimer.unref&&this.flushTimer.unref()}setRunIndex(t){this.currentRunIndex=t}log(t,e,n,i={}){if(this.stopped)return;let s=this.buildEntry(t,e,n,i);this.buffer.push(s)}logStep(t,e,n,i={}){if(this.stopped)return;let s=this.buildEntry("debug",e,n,i);s.run_index=t,this.stepBuffer.has(t)||this.stepBuffer.set(t,[]),this.stepBuffer.get(t).push(s)}escalate(t){let e=this.stepBuffer.get(t);e&&e.length>0&&this.buffer.push(...e),this.stepBuffer.delete(t)}discardSteps(t){this.stepBuffer.delete(t)}async flush(){if(this.buffer.length===0)return;let t=this.buffer.splice(0),e=null;try{e=await this.config.getToken()}catch{this.buffer.unshift(...t);return}let n={"Content-Type":"application/json"};e&&(n.Authorization=`Bearer ${e}`);let i=JSON.stringify(t);for(let s=0;s<3;s++){try{let u=new AbortController,f=setTimeout(()=>u.abort(),1e4),o=await h(this.config.proxyUrl,{method:"POST",headers:n,body:i,signal:u.signal});if(clearTimeout(f),o.ok)return}catch{}s<2&&await new Promise(u=>setTimeout(u,1e3*Math.pow(2,s)))}this._droppedBatches++,this._droppedEntries+=t.length}async flushOnce(t){if(this.buffer.length===0)return"empty";let e=this.buffer.splice(0),n=Date.now()+t,i=null;try{i=await Promise.race([this.config.getToken(),new Promise(f=>{let o=setTimeout(()=>f(null),t);o.unref&&o.unref()})])}catch{i=null}let s=n-Date.now();if(s<=0)return this.buffer.unshift(...e),"timeout";let u={"Content-Type":"application/json"};i&&(u.Authorization=`Bearer ${i}`);try{let f=new AbortController,o=setTimeout(()=>f.abort(),s);o.unref&&o.unref();let c=await h(this.config.proxyUrl,{method:"POST",headers:u,body:JSON.stringify(e),signal:f.signal});return clearTimeout(o),c.ok?"sent":(this.buffer.unshift(...e),"failed")}catch{return this.buffer.unshift(...e),Date.now()>=n?"timeout":"failed"}}drainBuffer(){return this.buffer.splice(0)}get droppedBatches(){return this._droppedBatches}get droppedEntries(){return this._droppedEntries}async shutdown(){this._droppedBatches>0&&this.log("warn","LOG_DROPS",`Dropped ${this._droppedEntries} entries in ${this._droppedBatches} batches`,{dropped_batches:this._droppedBatches,dropped_entries:this._droppedEntries}),this.stopped=!0,this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),await this.flush()}shutdownSync(){this.stopped=!0,this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null)}get bufferSize(){return this.buffer.length}stepBufferSize(t){return this.stepBuffer.get(t)?.length??0}buildEntry(t,e,n,i){return{hostname:"kane-cli",service:"kane-cli",ddsource:"kane-cli",ddtags:`version:${this.config.device.cli_version}`,level:t,event:e,message:n,session_id:this.config.sessionId,run_index:e.startsWith("tcg_")?null:this.currentRunIndex,identity:this.config.identity,device:this.config.device,context:i,timestamp:new Date().toISOString()}}};function g(r=process.env){try{let t=r.KANE_CLI_USER_AGENT;return t&&t.trim()?a(t):r.CLAUDECODE==="1"||r.CLAUDE_CODE_ENTRYPOINT?"claude-code":r.CURSOR_TRACE_ID||r.TERM_PROGRAM==="cursor"?"cursor":r.TERM_PROGRAM==="vscode"||r.VSCODE_PID?"vscode":r.CI==="true"||r.GITHUB_ACTIONS==="true"||r.GITLAB_CI==="true"||r.CIRCLECI==="true"||r.BUILDKITE==="true"?"ci":"unknown"}catch{return"unknown"}}function a(r){return r.toLowerCase().replace(/[^a-z0-9_-]/g,"-").slice(0,40)}export{l as a,g as b};
@@ -1,7 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{e as v,f as l}from"./chunk-XQFITNA3.js";import{a as f,c as m,e as p}from"./chunk-EYOCNMUM.js";var R=["desktop","emulator","simulator"];function k(e,n){return e.kind==="app_id"?!0:n==="emulator"?e.kind==="apk":e.kind==="zip"}function g(e,n,t){let s=l(e);return s?k(s,n)?null:n==="emulator"?`${t} cannot run on an emulator (needs an .apk, or an APP\u2026 id).`:`${t} cannot run on a simulator (needs a .zip of the .app bundle, or an APP\u2026 id).`:`${e}: ${v}`}function b(e){return R.includes(e)?e:null}function T(e){return`--target must be one of desktop, emulator, simulator (got "${e}")`}function h(e){let n=[];for(let[t,s]of[["--device",e.device],["--app",e.app]])s!==void 0&&n.push(`ignored ${t} ${s}: session target is desktop \u2014 set --target emulator|simulator to run on a device`);return n}function I(e){let{flags:n,saved:t}=e,s=[],r;if(n.target!==void 0){let i=b(n.target);if(!i)return{kind:"invalid",message:T(n.target)};r=i}else{let i=f(t?.tui_target,t?.default_target?.kind);if(i.kind==="choose-mobile")return{kind:"choose-mobile-kind"};r=i.kind==="unset"?"desktop":i.kind}if(r==="desktop")return s.push(...h(n)),{kind:"web",warnings:s};if(!e.host.supported)return{kind:"invalid",message:e.host.reason??"this machine cannot run mobile targets."};let a=[],o;n.device!==void 0?o={value:n.device,source:"flag"}:t?.default_target&&t.default_target.kind===r?o={value:t.default_target.id,source:"saved"}:a.push("device");let d;if(n.app!==void 0){let i=g(n.app,r,`--app ${n.app}`);if(i)return{kind:"invalid",message:i};d={value:n.app,source:"flag"}}else{let i=t?.default_app,c=i?l(i):null;c&&k(c,r)&&t?.default_target?.kind===r?d={value:i,source:"saved"}:a.push("app")}return{kind:"mobile",target:r,...o?{device:o}:{},...d?{app:d}:{},missing:a,warnings:s}}function P(e){let{flags:n,file:t}=e,s=[],r=t.target==="emulator"||t.target==="simulator"?t.target:void 0,a;if(n.target!==void 0){let i=b(n.target);if(!i)return{kind:"invalid",message:T(n.target)};a=i,r&&r!==a&&s.push(`--target ${a} overrides the file's \`target: ${r}\` \u2014 steps recorded on ${r==="emulator"?"an emulator":"a simulator"} may not replay here`)}else a=r??"desktop";if(a==="desktop")return s.push(...h(n)),{kind:"web",warnings:s};if(n.app!==void 0){let i=g(n.app,a,`--app ${n.app}`);if(i)return{kind:"invalid",message:i}}else if(t.app){let i=g(t.app,a,`the file's app: ${t.app}`);if(i)return{kind:"invalid",message:i}}let o=n.app??(t.app||void 0),d=n.device?.trim();return{kind:"mobile",target:a,platform:m(a)??"",...d?{device:d}:{},...o?{app:o}:{},...t.no_reset!==void 0?{noReset:t.no_reset}:{},warnings:s}}function _(e){return e.target==="desktop"?"Running on: Desktop \xB7 Chrome":`Running on: ${p(e.target)} \xB7 ${e.deviceLabel} \xB7 ${e.appLabel}`}var u={emulator:"</path/to/app.apk | APPid>",simulator:"</path/to/app.zip | APPid>"};function x(e,n){let t=p(e).toLowerCase();return n==="device"?[`session target is "${t}" but no device is set.`,` See devices: kane-cli devices list --target ${e}`,' Set one: kane-cli config set-device "<name>"',' Or per-run: --device "<name>"'].join(`
3
- `):[`session target is "${t}" but no app is set.`,` Set one: kane-cli config set-app ${u[e]}`,` Or per-run: --app ${u[e]}`].join(`
4
- `)}function A(e){return[`saved device "${e}" was not found on this machine.`," See devices: kane-cli devices list",' Set one: kane-cli config set-device "<name>"'].join(`
5
- `)}function w(e,n){return[`saved app ${e} no longer exists on disk.`," The build may have been moved or cleaned. Set a new one:",` kane-cli config set-app ${u[n]}`].join(`
6
- `)}var y=['session target is "mobile" from an older version \u2014 say which kind:'," kane-cli config set-target emulator|simulator"].join(`
7
- `);export{k as a,I as b,P as c,_ as d,x as e,A as f,w as g,y as h};
@@ -1,4 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as xe,b as ye}from"./chunk-VAYBKR76.js";import{a as oe,b as q,d as ae}from"./chunk-CUM23TLF.js";import{a as Ne,b as Ee,f as ue,i as X}from"./chunk-DUAXZYAD.js";import{d as Z,e as b,f as se,g as ne,h as _e}from"./chunk-WXHQYYD5.js";function ke(r,s){let t=r.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(t.length>60){let o=t.lastIndexOf("-",60);t=(o>0?t.slice(0,o):t.slice(0,60)).replace(/-+$/g,"")}if(!de.test(t))return null;let e=t;for(let o=2;s(e);o++)e=`${t}-${o}`;return de.test(e)?e:null}var Ae={source:"src",usecase:"uc",scenario:"sc",ac:"ac",test:"t",gap:"gap",stylenote:"sty"};function Ye(r,s,t){let e=Ae[r];return ke(e?`${e} ${s}`:s,t)}var De={usecase:"uc",scenario:"sc",ac:"ac",test:"t",gap:"gap",stylenote:"sty"},Re=/^(uc|sc|ac|t|gap|sty)-\d+$/i;function Oe(r,s,t){let e=De[r];if(!e)return null;let o=new RegExp(`^${e}-(\\d+)$`),u=0;for(let a of t){let g=o.exec(a);if(!g)continue;let n=Number(g[1]);Number.isSafeInteger(n)&&n>u&&(u=n)}let d=u+1;for(;s(`${e}-${d}`);)d+=1;return`${e}-${d}`}var Me=/^L([1-9]\d*)-L([1-9]\d*)$/,Ve=/^img#(p[1-9]\d*-[1-9]\d*|i[1-9]\d*)$/;function le(r){if(r==="img#whole")return{kind:"img-whole"};let s=Ve.exec(r);if(s)return{kind:"img-part",ref:s[1]};let t=Me.exec(r);return t?{kind:"lines",a:parseInt(t[1],10),b:parseInt(t[2],10)}:null}function Pe(r,s){let t=/^L(\d+)-L(\d+)$/.exec(s);if(!t)return null;let e=parseInt(t[1],10),o=parseInt(t[2],10),u=r.split(`
3
- `);return e<1||o<e||o>u.length?null:u.slice(e-1,o).map(d=>d.replace(/^\d+\| /,"")).join(`
4
- `)}function be(r,s,t){let e=le(s.anchor);if(r.format==="image")return e?.kind==="img-whole"?[]:[{code:"CITE_ANCHOR_INVALID",detail:`image cites are anchor-only (img#whole), got ${s.anchor}`}];if(e?.kind==="img-part")return new Set((r.images??[]).map(d=>d.ref)).has(e.ref)?[]:[{code:"CITE_ANCHOR_INVALID",detail:`anchor ${s.anchor} names no embedded image of this source version`}];if(!s.anchor||s.quote===void 0||s.quote==="")return[{code:"MISSING_CITE",detail:"text-kind cites need anchor+quote"}];let o=t!==null?Pe(t,s.anchor):null;return o===null?[{code:"BAD_ANCHOR",detail:`anchor ${s.anchor} does not resolve in the source`}]:o.includes(s.quote)?[]:[{code:"QUOTE_MISMATCH",detail:`quote is not verbatim within ${s.anchor}`}]}import{existsSync as Ge,readFileSync as Le}from"fs";function nt(r){let s=ye(r),t=new Map(Object.entries(s.heads)),e=new Map(Object.entries(s.trust)),o=new Map(Object.entries(s.nodeLabel)),u=new Map(Object.entries(s.superseded)),d=new Map(Object.entries(s.names)),a=new Map(Object.entries(s.archivedReason)),g=new Set(s.appliedEvents),n=new Map(Object.entries(s.conv)),_=p=>s.media[p]??{format:"text",media_type:"text/plain",anchors_supported:["L-L"]},h=new Map;for(let[p,E]of d)h.set(E,p);let c=new Map,C=p=>{if(c.has(p))return c.get(p);if(!o.has(p))return c.set(p,null),null;let E=xe(r,p);if(!Ge(E))throw new Ne(`derived node file missing for ${p} \u2014 run kane-cli context rebuild`);let I=JSON.parse(Le(E,"utf8"));return c.set(p,I),I},N=p=>{let E=p,I=new Set;for(;u.has(E)&&!I.has(E);){I.add(E);let O=u.get(E);if(typeof O!="string")break;E=O}return E},x=null,z=p=>{let E=h.get(p);if(E!==void 0)return E;if(x===null){x=new Map;for(let[L,k]of u)typeof k=="string"&&x.set(k,L)}let I=new Set,O=p;for(;!I.has(O);){I.add(O);let L=x.get(O);if(L===void 0)return null;let k=h.get(L);if(k!==void 0)return k;O=L}return null},Q=p=>{Re.test(p)&&(p=p.toLowerCase());let E=t.get(p),I=o.has(p)?p:d.get(p)??(typeof E=="string"?E:void 0);if(I===void 0||!o.has(I))return null;let O=N(I);return{cid:I,tip:O,superseded:u.has(I)||u.has(O)}},G=new Map;for(let p of Object.values(s.forward))for(let E of p){let I=G.get(E.dst);I?I.push(E):G.set(E.dst,[E])}let w=p=>(p??[]).filter(E=>!u.has(E.ecid)),ee=p=>w(G.get(p)),F=p=>ee(p).filter(E=>E.type===b.DERIVES),te=p=>w(s.forward[p]).some(E=>ne(E.type)?.pin?.comparesTo==="dst_tip"&&u.has(E.dst)),re=p=>{if(u.has(p))return"superseded";let E=F(p);if(E.length===0)return te(p)?"stale":"fresh";let I=new Map;for(let k of E)I.set(k.props.source_id,k);let O=!1,L=!1;for(let[k,D]of I){let J=t.get(k);if(J!=null&&(O=!0,J!==D.props.source_cid)){let i=n.get(k)?.chain;(!i||!i.includes(D.props.source_cid))&&(L=!0)}}return O?L||te(p)?"stale":"fresh":"orphaned"};return{heads:t,trust:e,nodeLabel:o,superseded:u,names:d,nameOf:h,archivedReason:a,appliedEvents:g,convChains:n,mediaOf:_,extractedSourceCids:new Set(s.extracted),extractionCompleteness:new Map(Object.entries(s.completeness??{}).map(([p,{seq:E,...I}])=>[p,I])),designOf:new Map(Object.entries(s.design_of??{})),designGenerationOf:new Map(Object.entries(s.design_generation??{})),latestHash:s.applied.hash,lastSeq:s.applied.seq,hasNode:p=>o.has(p),getNode:C,byLabel:p=>[...o.entries()].filter(([,E])=>E===p).map(([E])=>({cid:E,content:C(E)?.content??{}})),edgesFrom:p=>w(s.forward[p]),edgesInto:ee,derivesInto:F,resolve:Q,tipOf:N,displayNameOf:z,stale:re,staleList:()=>[...o.keys()].map(p=>({cid:p,state:re(p)})).filter(p=>p.state!=="fresh"),execHistory:p=>{let E=Q(p);if(!E)return[];let I=N(E.cid),O=new Set([I]),L=!0;for(;L;){L=!1;for(let[D,J]of u)J!==null&&O.has(J)&&!O.has(D)&&(O.add(D),L=!0)}let k=[];for(let D of Object.entries(s.exec??{}))O.has(D[0])&&k.push(...D[1]);return k.sort((D,J)=>D.started_at<J.started_at?-1:1)}}}function ot(r,s){if(r.stale(s)!=="stale")return!1;let t=new Map;for(let e of r.derivesInto(s))t.set(e.props.source_id,e);for(let[e,o]of t){let u=r.heads.get(e);if(u==null||u===o.props.source_cid)continue;let d=r.convChains.get(e)?.chain;if(!d||!d.includes(o.props.source_cid))return!0}for(let e of r.edgesFrom(s)){if(ne(e.type)?.pin?.comparesTo!=="dst_tip"||!r.superseded.has(e.dst))continue;let o=r.tipOf(e.dst);if(r.superseded.has(o)||r.nodeLabel.get(o)==="usecase")return!0}return!1}function pe(r,s){let t=new Map;for(let[d,a]of r.superseded)typeof a=="string"&&a!==d&&t.set(a,[...t.get(a)??[],d]);let e=[],o=[s],u=new Set;for(;o.length>0;){let d=o.pop();u.has(d)||(u.add(d),e.push(d),o.push(...t.get(d)??[]))}return e}function Ue(r,s){return(r.extraction_claims??[]).some(t=>t.source_id===s&&t.completeness==="complete")}function Fe(r,s){let t=new Set;for(let e of pe(r,s))for(let o of r.derivesInto(e))t.add(o.props?.source_id??"conversation");return t}function ve(r,s){let t=[],e=[],o=r.archived??[];if(o.length===0)return{valid:t,errors:e};let u=new Set([...r.source?[r.source.source_id]:[],...(r.sources??[]).map(a=>a.source_id)]),d=new Set;for(let a of r.use_cases){if(!a.matches_existing)continue;let g=s.resolve(a.matches_existing.cid);g&&d.add(s.tipOf(g.cid))}for(let a of o){let g=`archived[${a.target}]`,n=s.resolve(a.target),_=n?s.tipOf(n.cid):null;if(!_||(s.trust.get(_)??null)==="archived"){e.push({code:"ARCHIVE_TARGET_UNKNOWN",detail:`${g}: target does not resolve to an existing, live item`});continue}let h=Fe(s,_);if(!h.has(a.basis)){e.push({code:"ARCHIVE_FOREIGN_PROVENANCE",detail:`${g}: its provenance does not include ${a.basis} \u2014 an archive claim must come from a source that evidences the item`});continue}if(!u.has(a.basis)){e.push({code:"ARCHIVE_WITHOUT_COMPLETE_CLAIM",detail:`${g}: ${a.basis} was not read by this extraction \u2014 a completeness claim only counts for a source this run actually read`});continue}if(!Ue(r,a.basis)){e.push({code:"ARCHIVE_WITHOUT_COMPLETE_CLAIM",detail:`${g}: archiving needs an EXPLICIT complete extraction claim for ${a.basis} (the omitted-claims default does not count) \u2014 add extraction_claims`});continue}if(d.has(_)){e.push({code:"ARCHIVE_TARGET_MATCHED",detail:`${g}: this proposal also matches the target via matches_existing \u2014 a matched item cannot be archived by the same extraction; propose the change as an update instead`});continue}let c=[...h].filter(C=>C!==a.basis);if(c.length>0){e.push({code:"ARCHIVE_OTHER_LIVE_EVIDENCE",detail:`${g}: still evidenced by ${c.join(", ")} \u2014 an item another live source evidences is never archived from here`});continue}t.push({op:a,cid:_})}return{valid:t,errors:e}}var de=/^[a-z0-9][a-z0-9-]{1,63}$/;function we(r,s,t,e){if(!s)return{error:{code:"SUPERSEDE_TARGET_MISSING",detail:"supersede verdict needs a target (slug or cid)"}};let o=r.resolve(s);return o?o.superseded||e.has(o.cid)?{error:{code:"ALREADY_SUPERSEDED",detail:`${s} is already superseded (tip: ${o.tip})`}}:o.cid===t?{error:{code:"SELF_SUPERSEDE",detail:"a node cannot supersede itself"}}:{targetCid:o.cid}:{error:{code:"UNKNOWN_SUPERSEDE_TARGET",detail:`${s} names nothing in the graph`}}}function He(r,s,t,e,o=[]){if(!ne(s)?.acyclic)return null;if(t===e)return{code:"EDGE_CYCLE",detail:`${s} ${t} \u2192 itself`};let d=n=>[...r.edgesFrom(n).filter(_=>_.type===s).map(_=>_.dst),...o.filter(_=>_.type===s&&_.src===n).map(_=>_.dst)],a=new Set,g=[e];for(;g.length>0;){let n=g.pop();if(n===t)return{code:"EDGE_CYCLE",detail:`${s} ${t} \u2192 ${e} closes a cycle`};a.has(n)||(a.add(n),g.push(...d(n)))}return null}function vt(r,s,t,e){let u=ne(s)?.cardinality;if(u!=="one-live-per-src"&&u!=="one-live-per-src-and-dst")return null;let d=r.edgesFrom(t).filter(a=>a.type===s&&!r.superseded.has(a.dst));if(d.length>0)return{code:"CARDINALITY_VIOLATION",detail:`${s} from ${t} already has a live edge (${d[0].ecid}) \u2014 supersede it first`};if(u==="one-live-per-src-and-dst"&&e!==void 0){let a=r.edgesInto(e).filter(g=>g.type===s&&!r.superseded.has(g.src));if(a.length>0)return{code:"CARDINALITY_VIOLATION",detail:`${s} onto ${e} already has a live edge (${a[0].ecid}) \u2014 strict 1:1, supersede it first`}}return null}var Se=new Set(["high","med","low"]),fe=r=>r.cites&&r.cites.length>0?r.cites:[r.cite];function ge(r){let s=0;for(let t of r)typeof t=="object"&&t!==null&&"op"in t&&s++;return s===0?"flat":s===r.length?"ops":"mixed"}var qe=/^c[1-9][0-9]*$/;function Te(r,s,t,e){let o=new Map,u=[],d=[];for(let[g,n]of s.entries()){let _=`${r}.updated.criteria[${g}]`;if(n.op==="keep"||n.op==="remove"){if(!qe.test(n.ref??"")){e.push({code:"CRITERIA_REF_UNKNOWN",detail:`${_}: ref ${JSON.stringify(n.ref)} is not a c<N> criterion index`});continue}if(o.has(n.ref)){e.push({code:"CRITERIA_REF_DUPLICATE",detail:`${_}: ${n.ref} is already named by another op \u2014 every prior criterion appears in exactly one keep or remove`});continue}o.set(n.ref,n);let h=Number.parseInt(n.ref.slice(1),10);if(h>t.length){e.push({code:"CRITERIA_REF_UNKNOWN",detail:`${_}: ${n.ref} \u2014 the live target has ${t.length} criteria`});continue}if(t[h-1]!==n.text){e.push({code:"CRITERIA_REF_MISMATCH",detail:`${_}: ${n.ref} echo mismatch \u2014 the live target's criterion ${h} reads ${JSON.stringify(t[h-1])}, the op echoed ${JSON.stringify(n.text)} \u2014 re-read the node and re-emit`});continue}n.op==="remove"&&(u.push(n.text),(!n.reason||!n.reason.trim())&&e.push({code:"EMPTY_REASON",detail:`${_}: a remove op carries its reason`}))}else!n.text||!n.text.trim()?e.push({code:"EMPTY_CRITERION",detail:`${_}: set text is empty`}):d.push(n.text)}let a=[];for(let g=1;g<=t.length;g++)o.has(`c${g}`)||a.push(`c${g}`);a.length>0&&e.push({code:"CRITERIA_PARTITION_INCOMPLETE",detail:`${r}: prior criteria ${a.join(", ")} named by no keep/remove op \u2014 every prior criterion must be kept or removed (with a reason)`});for(let g of u)d.includes(g)&&e.push({code:"CRITERIA_OP_CONFLICT",detail:`${r}: ${JSON.stringify(g)} is removed AND re-set in the same update \u2014 drop one of the two ops`})}function St(r,s,t){let e=[],o=r.sources??[r.source],u=new Map(o.map(n=>[n.source_id,n.source_cid])),d=new Map;if(typeof s=="string")d.set(r.source.source_id,{media:t.mediaOf(r.source.source_cid),numberedText:s});else for(let[n,_]of s)d.set(n,_);for(let n of o)t.hasNode(n.source_cid)||e.push({code:"MISSING_SOURCE_NODE",detail:`source ${n.source_id} (${n.source_cid}) is not a committed node \u2014 ingest it first`});let a=(n,_)=>{let h=_.source_id??r.source.source_id;if(!u.has(h)){e.push({code:"CITE_SOURCE_UNKNOWN",detail:`${n}: cite source ${JSON.stringify(h)} is not in read_basis`});return}let c=d.get(h);if(!c){e.push({code:"MISSING_SOURCE_NODE",detail:`${n}: no citable text available for source ${h}`});return}for(let C of be(c.media,_,c.numberedText))e.push({code:C.code,detail:`${n}: ${C.detail}`})},g=new Set;for(let n of r.use_cases){if(g.has(n.temp_ref)&&e.push({code:"DUP_TEMP_REF",detail:`duplicate temp_ref ${n.temp_ref}`}),g.add(n.temp_ref),(!n.title||!n.title.trim())&&e.push({code:"EMPTY_TITLE",detail:`${n.temp_ref}: title is empty`}),Se.has(n.risk)||e.push({code:"BAD_RISK",detail:`${n.temp_ref}: risk ${JSON.stringify(n.risk)} not in high|med|low`}),!n.cite||!n.cite.anchor)e.push({code:"MISSING_CITE",detail:`${n.temp_ref}: every derived use-case must carry a cite`});else for(let h of fe(n))a(n.temp_ref,h);n.matches_existing&&!t.hasNode(n.matches_existing.cid)&&e.push({code:"UNKNOWN_MATCH",detail:`${n.temp_ref}: matches_existing ${n.matches_existing.cid} is not in the graph`});for(let[h,c]of(n.criteria??[]).entries())(!c.text||!c.text.trim())&&e.push({code:"EMPTY_CRITERION",detail:`${n.temp_ref}.criteria[${h}]: text is empty`}),!c.cite||!c.cite.anchor?e.push({code:"MISSING_CITE",detail:`${n.temp_ref}.criteria[${h}]: every criterion carries its own cite`}):a(`${n.temp_ref}.criteria[${h}]`,c.cite);let _=n.updated?.criteria??[];if(_.length>0){let h=ge(_);if(h==="mixed")e.push({code:"CRITERIA_SHAPE_MIXED",detail:`${n.temp_ref}.updated.criteria mixes op-shaped (keep/set/remove) and {text, cite} entries \u2014 emit ONE shape for the whole array`});else if(h==="ops"){let c=_,C=n.matches_existing?We(t,n.matches_existing.cid):null;if(!C)e.push({code:"CRITERIA_REF_UNKNOWN",detail:`${n.temp_ref}: op-union criteria address a prior version \u2014 they need a resolvable matches_existing target`});else{let N=t.getNode(C.cid)?.content.criteria??[];Te(n.temp_ref,c,N,e)}for(let[N,x]of c.entries())x.op==="set"&&(!x.cite||!x.cite.anchor?e.push({code:"MISSING_CITE",detail:`${n.temp_ref}.updated.criteria[${N}]: a set op carries the proposing source's cite`}):a(`${n.temp_ref}.updated.criteria[${N}]`,x.cite))}else for(let[c,C]of _.entries())(!C.text||!C.text.trim())&&e.push({code:"EMPTY_CRITERION",detail:`${n.temp_ref}.updated.criteria[${c}]: text is empty`}),!C.cite||!C.cite.anchor?e.push({code:"MISSING_CITE",detail:`${n.temp_ref}.updated.criteria[${c}]: every updated criterion carries its own cite`}):a(`${n.temp_ref}.updated.criteria[${c}]`,C.cite)}}return e.push(...ve(r,t).errors),e}function je(r,s,t){return`${r}:${s}:${t}`}function Ke(r,s,t,e){let o=`${s}:${t}:`,u=0;for(let d of r.appliedEvents){if(!d.startsWith(o))continue;let a=d.slice(o.length);if(!/^\d+$/.test(a))continue;let g=Number.parseInt(a,10);g>u&&(u=g)}return Array.from({length:e},(d,a)=>je(s,t,u+1+a))}function We(r,s){let t=r.resolve(s);if(t===null)return null;let e=t.cid;if(r.superseded.has(e)){let o=r.tipOf(e);return r.superseded.has(o)?null:{cid:o,redirected:!0}}return{cid:e,redirected:!1}}function It(r){let{contextDir:s,graph:t,proposal:e,proposalId:o,verdicts:u,by:d,allowStaleBasis:a,extractorVersion:g,autoName:n}=r,_=ue(s);if(!a&&e.read_basis!==_)return{record:null,errors:[{code:"STALE_BASIS",detail:`proposal read_basis ${String(e.read_basis)} != latest ${String(_)}`}]};for(let i of e.sources??[e.source])if(!t.hasNode(i.source_cid))return{record:null,errors:[{code:"MISSING_SOURCE_NODE",detail:`source ${i.source_id} (${i.source_cid}) is not a committed node \u2014 ingest it first`}]};let h=new Map((e.sources??[e.source]).map(i=>[i.source_id,i.source_cid])),c=[],C=[],N=new Map,x=[],z=t.mediaOf(e.source.source_cid),Q=new Set,G=[],w=[],ee=[],F=[];for(let i of ve(e,t).valid)F.push({id:i.cid,kind:"pending_archive",resolution:"pending",edit:null,reason:i.op.reason,by:d});let te=[],re=[],p=new Set,E=new Set,I=(i,f,M)=>{let j=we(t,f.supersedeTarget,M,p);if("error"in j){c.push({code:j.error.code,detail:`${i}: ${j.error.detail}`});return}p.add(j.targetCid),te.push({kind:"node",old:j.targetCid,new:M,reason:f.reason??`superseded via review by ${d.id}`,by:d})};for(let i of e.use_cases){let f=u.get(i.temp_ref)??{resolution:"skipped"};Q.has(i.temp_ref)&&c.push({code:"DUP_TEMP_REF",detail:`duplicate temp_ref ${i.temp_ref}`}),Q.add(i.temp_ref),(!i.title||!i.title.trim())&&c.push({code:"EMPTY_TITLE",detail:`${i.temp_ref}: title is empty`}),Se.has(i.risk)||c.push({code:"BAD_RISK",detail:`${i.temp_ref}: risk ${JSON.stringify(i.risk)} not in high|med|low`});let M=le(i.cite?.anchor??""),j=i.cite?.source_id!==void 0&&h.has(i.cite.source_id)?t.mediaOf(h.get(i.cite.source_id)):z;if(j.format==="image"){if(M?.kind!=="img-whole"){c.push({code:i.cite?.anchor?"CITE_ANCHOR_INVALID":"MISSING_CITE",detail:`${i.temp_ref}: image cites are anchor-only (img#whole)`});continue}}else if(M?.kind==="img-part"){if(!(j.images??[]).some(m=>m.ref===M.ref)){c.push({code:"CITE_ANCHOR_INVALID",detail:`${i.temp_ref}: anchor ${i.cite?.anchor} names no embedded image of this source version`});continue}}else if(!i.cite||!i.cite.anchor||!i.cite.quote){c.push({code:"MISSING_CITE",detail:`${i.temp_ref}: every derived use-case must cite anchor+quote`});continue}f.resolution==="edited"&&f.edit&&(f.edit.title!==void 0&&!f.edit.title.trim()&&c.push({code:"EMPTY_TITLE",detail:`${i.temp_ref}: edited title is empty`}),f.edit.risk!==void 0&&!Se.has(f.edit.risk)&&c.push({code:"BAD_RISK",detail:`${i.temp_ref}: edited risk ${JSON.stringify(f.edit.risk)} invalid`}));let he=ae({title:f.edit?.title??i.title,description:i.description,summary:f.edit?.summary??i.summary,actors:i.actors,value:i.value,risk:f.edit?.risk??i.risk,...i.criteria&&i.criteria.length>0?{criteria:i.criteria.map(l=>l.text)}:{}}),$=oe("usecase",he),me=i.cite.source_id??e.source.source_id,Ie=h.get(me);if(i.cite.source_id!==void 0&&Ie===void 0){c.push({code:"CITE_SOURCE_UNKNOWN",detail:`${i.temp_ref}: cite source ${JSON.stringify(me)} is not in read_basis`});continue}let Y={source_id:me,source_cid:Ie??e.source.source_cid,anchor:i.cite.anchor,...i.cite.quote?{quote:i.cite.quote}:{}};if(i.matches_existing&&!t.hasNode(i.matches_existing.cid)){c.push({code:"UNKNOWN_MATCH",detail:`${i.temp_ref}: matches_existing ${i.matches_existing.cid} is not in the graph`});continue}let y=i.matches_existing?.cid??(t.hasNode($)?$:null);if(y&&t.superseded.has(y)){let l=t.tipOf(y);y=t.superseded.has(l)?null:l}if(y&&i.matches_existing&&(t.trust.get(y)??null)==="derived"){let l=i.updated?.criteria??[];if(i.changed&&l.length>0&&ge(l)==="ops"&&(f.resolution==="approved"||f.resolution==="edited")){c.push({code:"UC_UNREVIEWED",detail:`${i.temp_ref}: merge target ${y.slice(0,19)} is unreviewed (derived) \u2014 bless it first (kane-cli context review) and re-propose the merge`});continue}let m=(r.probeHits??[]).find(v=>v.tempRef===i.temp_ref&&v.candidateCid===y);x.push({tempRef:i.temp_ref,candidate_cid:y,score:m?.score??1,scorer:m?.scorer??"lexical_fallback"}),y=null}if(y){if(i.changed&&(f.resolution==="approved"||f.resolution==="edited")){let l=i.updated;if(!l||Object.keys(l).length===0){c.push({code:"CHANGED_NEEDS_PAYLOAD",detail:`${i.temp_ref}: changed:true needs an updated{...} payload naming the moved fields`});continue}let m=t.getNode(y)?.content??{},v=l.criteria??[],T=v.length>0?ge(v):"flat";if(T==="mixed"){c.push({code:"CRITERIA_SHAPE_MIXED",detail:`${i.temp_ref}.updated.criteria mixes op-shaped (keep/set/remove) and {text, cite} entries \u2014 emit ONE shape for the whole array`});continue}if(T==="ops"){let A=v,V=m.criteria??[],P=c.length;Te(i.temp_ref,A,V,c);for(let[ie,ce]of A.entries())ce.op==="set"&&(!ce.cite||!ce.cite.anchor)&&c.push({code:"MISSING_CITE",detail:`${i.temp_ref}.updated.criteria[${ie}]: a set op carries the proposing source's cite`});if(c.length>P)continue;let R=A.filter(ie=>ie.op!=="remove").map(ie=>ie.text),H=ae({title:f.edit?.title??l.title??String(m.title??i.title),...l.description??m.description?{description:l.description??m.description}:{},...f.edit?.summary??l.summary??m.summary?{summary:f.edit?.summary??l.summary??m.summary}:{},...l.actors??m.actors?{actors:l.actors??m.actors}:{},...l.value??m.value?{value:l.value??m.value}:{},risk:f.edit?.risk??l.risk??String(m.risk??i.risk),...R.length>0?{criteria:R}:{}}),K=oe("usecase",H);if(K!==y){for(let S of se("usecase",H))c.push({code:S.code,detail:`${i.temp_ref}: ${S.detail}`});G.push({cid:K,label:Z.USECASE,content:H});for(let S of fe(i)){let W=S.source_id??e.source.source_id,U=h.get(W);if(!U){c.push({code:"CITE_SOURCE_UNKNOWN",detail:`${i.temp_ref}: cite source ${JSON.stringify(W)} is not in read_basis`});continue}let B={source_id:W,source_cid:U,anchor:S.anchor,...S.quote?{quote:S.quote}:{}};w.push({ecid:q("DERIVES",U,K,B),type:b.DERIVES,src:U,dst:K,props:B})}let ce=pe(t,y).flatMap(S=>t.edgesInto(S)).filter(S=>S.type===b.DERIVES&&typeof S.props.claim=="string");for(let S of A){if(S.op!=="keep")continue;let W=new Set;for(let U of ce){let B=U.props;if(B.claim!==S.text)continue;let $e=`${B.source_id}|${B.source_cid}|${B.anchor}`;if(W.has($e))continue;W.add($e);let Ce={...U.props};w.push({ecid:q("DERIVES",U.src,K,Ce),type:b.DERIVES,src:U.src,dst:K,props:Ce})}}for(let S of A){if(S.op!=="set")continue;let W=S.cite.source_id??e.source.source_id,U=h.get(W);if(!U){c.push({code:"CITE_SOURCE_UNKNOWN",detail:`${i.temp_ref}: set cite source ${JSON.stringify(W)} is not in read_basis`});continue}let B={source_id:W,source_cid:U,anchor:S.cite.anchor,...S.cite.quote?{quote:S.cite.quote}:{},claim:S.text};w.push({ecid:q("DERIVES",U,K,B),type:b.DERIVES,src:U,dst:K,props:B})}for(let S of A)S.op==="remove"&&C.push({about:y,ref:S.ref,text:S.text,reason:S.reason});I(i.temp_ref,{resolution:"supersede",supersedeTarget:y,reason:f.reason??`criteria merge: ${e.source.source_id} (${A.filter(S=>S.op==="keep").length} kept, ${A.filter(S=>S.op==="set").length} set, ${A.filter(S=>S.op==="remove").length} removed)`},K),F.push({id:K,kind:"review-item",resolution:f.resolution,edit:f.resolution==="edited"?{...f.edit}:null,reason:null,by:d});continue}}else{let A=v.map(R=>typeof R=="string"?{text:R,cite:void 0}:R),V=ae({title:f.edit?.title??l.title??String(m.title??i.title),...l.description??m.description?{description:l.description??m.description}:{},...f.edit?.summary??l.summary??m.summary?{summary:f.edit?.summary??l.summary??m.summary}:{},...l.actors??m.actors?{actors:l.actors??m.actors}:{},...l.value??m.value?{value:l.value??m.value}:{},risk:f.edit?.risk??l.risk??String(m.risk??i.risk),...l.criteria?A.length>0?{criteria:A.map(R=>R.text)}:{}:m.criteria?{criteria:m.criteria}:{}}),P=oe("usecase",V);if(P!==y){for(let R of se("usecase",V))c.push({code:R.code,detail:`${i.temp_ref}: ${R.detail}`});G.push({cid:P,label:Z.USECASE,content:V}),w.push({ecid:q("DERIVES",Y.source_cid,P,Y),type:b.DERIVES,src:Y.source_cid,dst:P,props:Y});for(let R of A){if(!R.cite)continue;let H={source_id:e.source.source_id,source_cid:e.source.source_cid,anchor:R.cite.anchor,...R.cite.quote?{quote:R.cite.quote}:{},claim:R.text};w.push({ecid:q("DERIVES",H.source_cid,P,H),type:b.DERIVES,src:H.source_cid,dst:P,props:H})}I(i.temp_ref,{resolution:"supersede",supersedeTarget:y,reason:f.reason??`matches-but-changed: ${e.source.source_id} moved (${Object.keys(l).join(", ")})`},P),F.push({id:P,kind:"review-item",resolution:f.resolution,edit:f.resolution==="edited"?{...f.edit}:null,reason:null,by:d});continue}for(let R of A){if(!R.cite)continue;let H={source_id:e.source.source_id,source_cid:e.source.source_cid,anchor:R.cite.anchor,...R.cite.quote?{quote:R.cite.quote}:{},claim:R.text};w.push({ecid:q("DERIVES",H.source_cid,y,H),type:b.DERIVES,src:H.source_cid,dst:y,props:H})}}}if(i.changed&&f.resolution==="skipped"){let l=i.updated?.criteria??[];l.length>0&&ge(l)==="ops"&&F.push({id:y,kind:"pending_update",resolution:"pending",edit:{temp_ref:i.temp_ref,source_id:e.source.source_id,updated:i.updated},reason:i.change_note??null,by:d})}if(f.resolution!=="rejected"){for(let l of fe(i)){let m=l.source_id??e.source.source_id,v=h.get(m);if(!v){c.push({code:"CITE_SOURCE_UNKNOWN",detail:`${i.temp_ref}: cite source ${JSON.stringify(m)} is not in read_basis`});continue}let T={source_id:m,source_cid:v,anchor:l.anchor,...l.quote?{quote:l.quote}:{}};w.push({ecid:q("DERIVES",v,y,T),type:b.DERIVES,src:v,dst:y,props:T})}(f.resolution==="approved"||f.resolution==="edited"||f.resolution==="supersede")&&F.push({id:y,kind:"review-item",resolution:"approved",edit:null,reason:null,by:d}),f.resolution==="supersede"&&I(i.temp_ref,f,y)}continue}for(let l of se("usecase",he))c.push({code:l.code,detail:`${i.temp_ref}: ${l.detail}`});for(let l of _e(b.DERIVES,"source","usecase",Y))c.push({code:l.code,detail:`${i.temp_ref}: ${l.detail}`});G.push({cid:$,label:Z.USECASE,content:he}),N.set(i.temp_ref,$),w.push({ecid:q("DERIVES",Y.source_cid,$,Y),type:b.DERIVES,src:Y.source_cid,dst:$,props:Y});for(let l of fe(i).slice(1)){let m=l.source_id??e.source.source_id,v=h.get(m);if(!v){c.push({code:"CITE_SOURCE_UNKNOWN",detail:`${i.temp_ref}: cite source ${JSON.stringify(m)} is not in read_basis`});continue}let T={source_id:m,source_cid:v,anchor:l.anchor,...l.quote?{quote:l.quote}:{}};for(let A of _e(b.DERIVES,"source","usecase",T))c.push({code:A.code,detail:`${i.temp_ref}: ${A.detail}`});w.push({ecid:q("DERIVES",v,$,T),type:b.DERIVES,src:v,dst:$,props:T})}for(let l of i.criteria??[]){let m=l.cite.source_id??e.source.source_id,v=h.get(m);if(!v){c.push({code:"CITE_SOURCE_UNKNOWN",detail:`${i.temp_ref}: criterion cite source ${JSON.stringify(m)} is not in read_basis`});continue}let T={source_id:m,source_cid:v,anchor:l.cite.anchor,...l.cite.quote?{quote:l.cite.quote}:{},claim:l.text};w.push({ecid:q("DERIVES",T.source_cid,$,T),type:b.DERIVES,src:T.source_cid,dst:$,props:T})}for(let l of i.depends_on_hint??[]){let m=V=>V.toLowerCase().trim().replace(/\s+/g," "),v=null,T=t.resolve(l);if(T&&!T.superseded&&t.nodeLabel.get(T.cid)===Z.USECASE&&(v=T.cid),!v){for(let{cid:V,content:P}of t.byLabel(Z.USECASE))if(!t.superseded.has(V)&&m(String(P.title??""))===m(l)){v=V;break}}if(!v){let V=G.find(P=>P.label===Z.USECASE&&m(String(P.content.title??""))===m(l));V&&(v=V.cid)}!v||v===$||He(t,b.DEPENDS_ON,$,v,ee)||ee.some(V=>V.src===$&&V.dst===v)||(w.push({ecid:q(b.DEPENDS_ON,$,v,{reason:"extract hint"}),type:b.DEPENDS_ON,src:$,dst:v,props:{reason:"extract hint"}}),ee.push({src:$,dst:v,type:b.DEPENDS_ON}))}if((f.resolution==="approved"||f.resolution==="edited"||f.resolution==="supersede")&&t.superseded.get($)===null&&!p.has($)&&te.push({kind:"node",old:$,new:$,reason:`re-minted after tombstone via review by ${d.id}`,by:d}),n){let l=Oe("usecase",m=>E.has(m),t.names.keys());l!==null&&!t.nameOf.has($)&&(E.add(l),re.push({cid:$,slug:l,by:d}))}f.resolution==="approved"?F.push({id:$,kind:"review-item",resolution:"approved",edit:null,reason:null,by:d}):f.resolution==="edited"?F.push({id:$,kind:"review-item",resolution:"edited",edit:{...f.edit},reason:null,by:d}):f.resolution==="rejected"?F.push({id:$,kind:"review-item",resolution:"rejected",edit:null,reason:f.reason??null,by:d}):f.resolution==="supersede"&&(F.push({id:$,kind:"review-item",resolution:"approved",edit:null,reason:f.reason??null,by:d}),I(i.temp_ref,f,$))}if(c.length)return{record:null,errors:c};let O=new Date().toISOString(),L=(e.sources?.length??0)>1||(e.extraction_claims?.length??0)>0,k;if(L){let i=[];if(e.extraction_claims==null)i.push({source_id:e.source.source_id,source_cid:e.source.source_cid,completeness:"complete",...g?{extractor_version:g}:{},at:O});else{let f=new Map(e.extraction_claims.map(M=>[M.source_id,M.completeness]));for(let M of e.sources??[e.source]){let j=f.get(M.source_id)??null;j!==null&&i.push({source_id:M.source_id,source_cid:M.source_cid,completeness:j,...g?{extractor_version:g}:{},at:O})}}k=i}else k=e.source.source_cid;let D=[];for(let i of r.probeHits??[])D.push({...N.has(i.tempRef)?{new_cid:N.get(i.tempRef)}:{},candidate_cid:i.candidateCid,score:i.score,scorer:i.scorer,probe_basis:null});for(let i of x){let f=N.get(i.tempRef);D.some(M=>M.new_cid===f&&M.candidate_cid===i.candidate_cid)||D.push({...f!==void 0?{new_cid:f}:{},candidate_cid:i.candidate_cid,score:i.score,scorer:i.scorer,probe_basis:null})}return{record:X(s,{ts:O,proposal_id:o,...o!=null?{extraction_of:k}:{},...o!=null&&g?{extractor_version:g}:{},...C.length>0?{criteria_removed:C}:{},...D.length>0?{dedup_hits:D}:{},nodes:G,edges:w,review:F,supersessions:te,...re.length>0?{names:re}:{},...r.judgements&&r.judgements.length>0?{judgements:r.judgements}:{},...r.eventIds&&r.eventIds.length>0?{event_ids:r.eventIds}:r.sid?{event_ids:Ke(t,r.sid,"extract",1)}:{},...r.sid?{sid:r.sid}:{},source_head_moves:{}},{expectPrev:_}).record,errors:null}}function $t(r){let{contextDir:s,graph:t,verdicts:e,by:o}=r,u=[],d=[],a=[],g=[],n=new Set;for(let[h,c]of e){if(c.resolution==="skipped")continue;let C=t.resolve(h);if(!C){u.push({code:"UNKNOWN_NODE",detail:`${h} names nothing in the graph`});continue}if(C.superseded){u.push({code:"SUPERSEDED_TARGET",detail:`${h} is superseded \u2014 review the tip (${C.tip})`});continue}let N=C.cid;if(c.resolution==="approved")a.push({id:N,kind:"review-item",resolution:"approved",edit:null,reason:null,by:o});else if(c.resolution==="rejected")r.holdArchives?a.push({id:N,kind:"pending_archive",resolution:"pending",edit:null,reason:c.reason??null,by:o}):a.push({id:N,kind:"review-item",resolution:"rejected",edit:null,reason:c.reason??null,by:o});else if(c.resolution==="edited"){let x=t.getNode(N);if(!x){u.push({code:"UNKNOWN_NODE",detail:`${h}: node file unreadable`});continue}let z={...x.content,...c.edit?.title!==void 0?{title:c.edit.title}:{},...c.edit?.summary!==void 0?{summary:c.edit.summary}:{},...c.edit?.risk!==void 0?{risk:c.edit.risk}:{}},Q=se(x.label,z);if(Q.length>0){for(let w of Q)u.push({code:w.code,detail:`${h}: ${w.detail}`});continue}let G=oe(x.label,z);if(G===N){a.push({id:N,kind:"review-item",resolution:"approved",edit:null,reason:null,by:o});continue}d.push({cid:G,label:x.label,content:z}),n.add(N),g.push({kind:"node",old:N,new:G,reason:c.reason??"edited in review",by:o}),a.push({id:G,kind:"review-item",resolution:"edited",edit:{...c.edit},reason:null,by:o})}else if(c.resolution==="supersede"){let x=we(t,c.supersedeTarget,N,n);if("error"in x){u.push({code:x.error.code,detail:`${h}: ${x.error.detail}`});continue}n.add(x.targetCid),r.holdArchives?a.push({id:x.targetCid,kind:"pending_archive",resolution:"pending",edit:null,reason:`supersede by ${N}${c.reason?` \u2014 ${c.reason}`:""}`,by:o}):(g.push({kind:"node",old:x.targetCid,new:N,reason:c.reason??`superseded via review by ${o.id}`,by:o}),a.push({id:N,kind:"review-item",resolution:"approved",edit:null,reason:c.reason??null,by:o}))}}return u.length?{record:null,errors:u}:a.length===0&&g.length===0?{record:null,errors:[{code:"NO_VERDICTS",detail:"every item was skipped \u2014 nothing to commit"}]}:{record:X(s,{ts:new Date().toISOString(),proposal_id:null,nodes:d,edges:[],review:a,supersessions:g,source_head_moves:{}},{expectPrev:t.latestHash}).record,errors:null}}function Ct(r){let{contextDir:s,graph:t,survivor:e,merged:o,reason:u,by:d}=r,a=t.resolve(e),g=t.resolve(o);return a?g?a.superseded||g.superseded?{record:null,errors:[{code:"ALREADY_SUPERSEDED",detail:"a side of the pair is already superseded \u2014 the pair is drained"}]}:a.cid===g.cid?{record:null,errors:[{code:"SELF_SUPERSEDE",detail:"a pair cannot merge a node into itself"}]}:{record:X(s,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[{kind:"node",old:g.cid,new:a.cid,reason:u??`pair merge: duplicate of ${e}`,by:d}],source_head_moves:{}},{expectPrev:t.latestHash}).record,errors:null}:{record:null,errors:[{code:"UNKNOWN_NODE",detail:`${o} names nothing in the graph`}]}:{record:null,errors:[{code:"UNKNOWN_NODE",detail:`${e} names nothing in the graph`}]}}function Nt(r){let{contextDir:s,graph:t,assignments:e,by:o}=r,u=[],d=[],a=new Set;for(let{ref:n,slug:_}of e){if(!de.test(_)){u.push({code:"BAD_SLUG",detail:`${JSON.stringify(_)} \u2014 slugs are kebab-case ${String(de)}`});continue}let h=t.resolve(n);if(!h){u.push({code:"UNKNOWN_REF",detail:`${n} names nothing in the graph`});continue}if(h.superseded){u.push({code:"SUPERSEDED_TARGET",detail:`${n} is superseded \u2014 name the tip instead (${h.tip})`});continue}let c=t.names.get(_);if(c!==void 0&&!t.superseded.has(c)&&c!==h.cid||a.has(_)){u.push({code:"SLUG_TAKEN",detail:`${_} already names ${c??"another node in this record"}`});continue}a.add(_),d.push({cid:h.cid,slug:_,by:o})}return u.length?{record:null,errors:u}:d.length===0?{record:null,errors:[{code:"NO_ASSIGNMENTS",detail:"nothing to name"}]}:{record:X(s,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[],names:d,source_head_moves:{}},{expectPrev:t.latestHash}).record,errors:null}}function xt(r){let{contextDir:s,graph:t,sourceId:e,reason:o,by:u}=r,d=t.heads.get(e);return d===void 0?{record:null,errors:[{code:"UNKNOWN_SOURCE",detail:`no source ${e} in the graph`}]}:d===null?{record:null,errors:[{code:"ALREADY_RETIRED",detail:`source ${e} is already retired`}]}:{record:X(s,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[{kind:"node",old:d,new:null,reason:o??`retired source ${e}`,by:u}],source_head_moves:{[e]:null},names:[]},{expectPrev:t.latestHash}).record,errors:null}}function yt(r){let s=se("gap",r.content);if(s.length>0)return{ok:!1,refusal:`defer gap failed schema validation: ${s.map(u=>u.detail).join("; ")}`};let t=oe("gap",r.content),e={reason:"reconcile change deferred"},o=r.annotates?[{ecid:q(b.ANNOTATES,t,r.annotates,e),type:b.ANNOTATES,src:t,dst:r.annotates,props:e}]:[];for(let u=0;;u++)try{return X(r.contextDir,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:t,label:"gap",content:r.content}],edges:o,review:[],supersessions:[],source_head_moves:{}},{expectPrev:ue(r.contextDir)}),{ok:!0,cid:t}}catch(d){if(d instanceof Ee){if(u<3)continue;return{ok:!1,refusal:"concurrent activity kept moving the store \u2014 try the card again"}}throw d}}function Rt(r){let s=r.graph.byLabel("gap").filter(t=>t.content.kind==="reconcile_deferred"&&typeof t.content.uc=="string"&&r.graph.tipOf(t.content.uc)===r.targetTip&&(r.sourceId===void 0||t.content.basis?.source_id===void 0||t.content.basis.source_id===r.sourceId)&&!r.graph.superseded.has(t.cid)&&r.graph.trust.get(t.cid)!=="archived");if(s.length===0)return{resolved:0};for(let t=0;;t++)try{return X(r.contextDir,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:s.map(e=>({kind:"node",old:e.cid,new:r.resolvedBy,reason:"reconcile change resolved by a later verdict",by:r.by})),source_head_moves:{}},{expectPrev:ue(r.contextDir)}),{resolved:s.length}}catch(e){if(e instanceof Ee){if(t<3)continue;return{resolved:0}}throw e}}export{le as a,Pe as b,be as c,ve as d,de as e,He as f,vt as g,fe as h,ge as i,Te as j,St as k,je as l,Ke as m,We as n,It as o,$t as p,Ct as q,Nt as r,xt as s,yt as t,Rt as u,ke as v,Ae as w,Ye as x,Re as y,Oe as z,nt as A,ot as B,pe as C};
@@ -1,5 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as w}from"./chunk-DNNZ353O.js";import{b as k}from"./chunk-TH47OOBV.js";import{d as S,e as m}from"./chunk-WXHQYYD5.js";var a=(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 u=a(e,r,o);if(u!==r)return u}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,u]of r){let i=e.heads.get(n);if(i==null||i===u.props.source_cid)continue;let c=e.convChains.get(n)?.chain;c&&c.includes(String(u.props.source_cid))||s.push(`DERIVES pin ${n}@${String(u.props.source_cid).slice(0,19)} broke \u2014 the source head moved`)}for(let n of e.edgesFrom(t)){if(n.type===m.DERIVES||!e.superseded.has(n.dst))continue;let u=e.tipOf(n.dst);if(e.superseded.has(u)){s.push(`${n.type} pin \u2192 ${a(e,n.dst)} \u2014 target retired`);continue}let i=D(e,n.dst,u);s.push(i.length>0?`${a(e,n.dst)} updated: ${i.map(c=>c.field).join(", ")}`:`${n.type} pin \u2192 ${a(e,n.dst)} \u2014 target superseded`)}return s.length>0?s.join("; "):"stale \u2014 a pinned dependency moved"}function D(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),u=[];for(let i of[...new Set([...Object.keys(s),...Object.keys(r)])].sort())JSON.stringify(s[i])!==JSON.stringify(r[i])&&u.push({field:i,old:n(s[i]),new:n(r[i])});return u}function C(e,t){let o=[];for(let{cid:s}of e.byLabel(S.SCENARIO))e.superseded.has(s)||e.edgesFrom(s).some(r=>r.type===m.BELONGS_TO&&e.tipOf(r.dst)===t)&&o.push(s);return o}function O(e,t){let o=[],s=[],r=[],n=C(e,t),u=new Set(n),i=(c,f)=>{let d=b(e,f);return d===void 0?c:{...c,stale:!0,stale_reason:d}};for(let c of n){let f=e.getNode(c)?.content??{};o.push(i({ref:a(e,c),title:String(f.title??""),case_type:String(f.case_type??""),intent:String(f.intent??"")},c));for(let d of e.edgesInto(c)){if(d.type!==m.AUTOMATES||e.superseded.has(d.src))continue;let p=e.getNode(d.src)?.content??{},g=e.edgesFrom(d.src).filter(l=>l.type===m.VERIFIES&&!e.superseded.has(l.dst)).map(l=>a(e,l.dst));s.push(i({ref:a(e,d.src),title:String(p.title??""),check:p.check,verifies:g},d.src))}}for(let{cid:c}of e.byLabel(S.AC)){if(e.superseded.has(c))continue;let f=e.edgesFrom(c).find(l=>l.type===m.SCOPED_TO);if(!f)continue;let d=e.tipOf(f.dst);if(!(d===t||u.has(d)))continue;let g=e.getNode(c)?.content??{};r.push(i({ref:a(e,c),text:String(g.text??""),kind:String(g.kind??""),scope:d===t?"use-case":a(e,d)},c))}return{scenarios:o,tests:s,acs:r}}function E(e,t,o){let s=w(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 u=o.find(i=>i.includes(n));u!==void 0&&!s.includes(u.trim())&&s.push(u.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(c=>t.resolve(c.ref)?.cid??"")].filter(Boolean),n=[],u=new Set;for(let c of r){let f=new Map;for(let d of t.derivesInto(c))f.set(String(d.props.source_id),d);for(let[d,p]of f){let g=t.heads.get(d);if(g==null||g===p.props.source_cid)continue;let l=String(p.props.anchor),_=`${d}\0${l}`;if(u.has(_)||l==="img#whole")continue;u.add(_);let y=E(e,t,String(p.props.source_cid)),h=y===null?null:k(y,l);if(h===null)continue;let x=E(e,t,g);n.push({source_id:d,anchor:l,old_anchor_text:h,new_anchor_text:x===null?{removed:!0}:v(h,x)})}}let i;for(let[c,f]of t.superseded){if(f!==o||t.nodeLabel.get(c)!==S.USECASE)continue;let d=D(t,c,o);d.length>0&&(i=d);break}return{kind:"source-change",changes:n,...i?{uc_updated:i}:{}}}function P(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,P as b};
@@ -1,4 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as j}from"./chunk-CUM23TLF.js";import{a as v,d as N,g as C}from"./chunk-DUAXZYAD.js";import{a as y,e as S,f as D,g as F,h as L}from"./chunk-WXHQYYD5.js";import{existsSync as b,mkdirSync as V,readFileSync as $,renameSync as G,rmSync as J,writeFileSync as W}from"fs";import{dirname as H,join as w}from"path";var q=i=>w(i,"derived"),M=i=>w(q(i),"index.json");function T(i,s){let t=s.startsWith("sha256:")?s.slice(7):s;return w(q(i),"nodes",t.slice(0,2),t.slice(2)+".json")}function O(){return{applied:{seq:0,hash:null},heads:{},trust:{},nodeLabel:{},forward:{},extracted:[],design_of:{},design_generation:{},exec:{},superseded:{},names:{},archivedReason:{},appliedEvents:[],completeness:{},srcOwner:{},conv:{},media:{},design_phases:{}}}function U(i){let s=M(i);if(!b(s))return null;try{let t=JSON.parse($(s,"utf8"));return t.superseded===void 0||t.names===void 0||t.archivedReason===void 0||t.appliedEvents===void 0||t.conv===void 0||t.media===void 0||t.exec===void 0||t.completeness===void 0||t.srcOwner===void 0||t.design_phases===void 0||t.reverse!==void 0?null:t}catch{return null}}function P(i,s){V(H(i),{recursive:!0});let t=`${i}.tmp-${process.pid}`;W(t,s),G(t,i)}function R(i,s,t,p,_={}){let l=_.writeNodeFiles!==!1,g=new Set(s.extracted),h=new Set(s.appliedEvents);t.forEach((n,E)=>{for(let e of n.nodes){let d=T(i,e.cid);l&&!b(d)&&P(d,JSON.stringify({label:e.label,content:e.content})+`
3
- `),!(e.cid in s.trust)&&e.content.derived===!0&&(s.trust[e.cid]="derived"),s.nodeLabel[e.cid]=e.label}for(let[e,d]of Object.entries(n.source_head_moves))typeof d=="string"&&(s.srcOwner[d]=e);if(n.proposal_id!=null&&typeof n.extraction_of=="string"){g.add(n.extraction_of);let e=null;for(let d of n.edges)if(d.type===S.DERIVES&&d.props.source_cid===n.extraction_of&&typeof d.props.source_id=="string"){e=d.props.source_id;break}if(e??=s.srcOwner[n.extraction_of]??null,e!==null){let d=s.completeness[e];(!d||n.seq>=d.seq)&&(s.completeness[e]={source_cid:n.extraction_of,completeness:"complete",...n.extractor_version?{extractor_version:n.extractor_version}:{},at:n.ts,seq:n.seq})}else s.completenessSkipped=(s.completenessSkipped??0)+1}else if(n.proposal_id!=null&&Array.isArray(n.extraction_of))for(let e of n.extraction_of){g.add(e.source_cid);let d=s.completeness[e.source_id];(!d||n.seq>=d.seq)&&(s.completeness[e.source_id]={source_cid:e.source_cid,completeness:e.completeness,...e.extractor_version?{extractor_version:e.extractor_version}:{},at:e.at,seq:n.seq})}n.design_of&&((s.design_of??={})[n.design_of.uc_cid]={engine:n.design_of.engine,seq:n.seq}),n.design_generation&&((s.design_generation??={})[n.design_generation.uc_root]={gen:n.design_generation.generation,seq:n.seq});{let e=n.design_phase;e&&typeof e.uc_root=="string"&&typeof e.phase=="string"&&typeof e.generation=="number"&&((s.design_phases??={})[e.uc_root]??=[]).push({phase:e.phase,generation:e.generation,seq:n.seq,completeness:e.completeness==="partial"?"partial":"complete"})}for(let e of n.executions??[])((s.exec??={})[e.about]??=[]).push(e);for(let e of n.edges){let{quote:d,...r}=e.props,o=s.forward[e.src]??=[];o.some(a=>a.ecid===e.ecid)||o.push({...e,props:r}),n.proposal_id!=null&&e.type===S.DERIVES&&typeof e.props.source_cid=="string"&&g.add(e.props.source_cid)}for(let e of n.review)e.resolution==="approved"||e.resolution==="edited"?(s.trust[e.id]="trusted",delete s.archivedReason[e.id]):e.resolution==="rejected"?(s.trust[e.id]="archived",e.reason?s.archivedReason[e.id]=e.reason:delete s.archivedReason[e.id]):e.resolution==="reset"&&(s.trust[e.id]="derived",delete s.archivedReason[e.id]);for(let e of n.supersessions)e.kind==="node"?e.new===e.old?delete s.superseded[e.old]:s.superseded[e.old]=e.new:s.superseded[e.ecid]=null;for(let e of n.names??[])s.names[e.slug]=e.cid;for(let[e,d]of Object.entries(n.source_head_moves))s.heads[e]=d;for(let e of n.event_ids??[])h.add(e);if(n.media)for(let[e,d]of Object.entries(n.media)){let r=n.source_head_moves[e];typeof r=="string"&&(s.media[r]=d)}if(n.conv){let e=n.source_head_moves[n.conv.source_id];if(typeof e=="string"){let d=s.conv[n.conv.source_id],r=d&&d.chain.length>0?d.chain[d.chain.length-1]:null;n.conv.append_of===r?s.conv[n.conv.source_id]={turns:n.conv.turn,chain:[...d?.chain??[],e]}:s.conv[n.conv.source_id]={turns:n.conv.turn,chain:[e]}}}for(let[e,d]of Object.entries(n.source_head_moves))n.conv?.source_id!==e&&s.conv[e]!==void 0&&(s.conv[e]=typeof d=="string"?{turns:s.conv[e].turns,chain:[d]}:{turns:s.conv[e].turns,chain:[]});s.applied={seq:n.seq,hash:p[E]}}),s.extracted=[...g].sort(),s.appliedEvents=[...h].sort()}function x(i,s){P(M(i),JSON.stringify(s)+`
4
- `)}function K(i){let s=w(i,"meta.json");if(b(s))try{let t=JSON.parse($(s,"utf8"));if(t.schema!==y||t.canonicalizer!=="v1")throw new v(`schema fence: store is ${t.schema}/${t.canonicalizer}, this build is ${y}/${"v1"} \u2014 migrate explicitly (kane-cli context rebuild after upgrading)`)}catch(t){throw t instanceof v?t:new v(`corrupt meta.json in ${i} \u2014 fix or remove it`)}}function Y(i){K(i);let s=U(i);if(s===null){s=O();let{records:_,hashes:l}=N(i);return R(i,s,_,l),x(i,s),s}let{records:t,hashes:p}=C(i,s.applied.seq,s.applied.hash);return t.length>0&&(R(i,s,t,p),x(i,s)),s}function se(i){return J(q(i),{recursive:!0,force:!0}),Y(i)}var z=new Set(["CHAIN_ERROR","DERIVED_MISSING","DERIVED_DRIFT","NODE_FILE_MISSING","NODE_FILE_MISMATCH","NODE_FILE_CORRUPT"]);function ne(i){return z.has(i.code)?i.detail:`${i.code}: ${i.detail}`}function te(i){let s=[],t=(r,o)=>{s.push({code:r,detail:o})},p=[],_=[];try{({records:p,hashes:_}=N(i))}catch(r){return{ok:!1,issues:[{code:"CHAIN_ERROR",detail:r instanceof v?r.message:String(r)}],records:0}}let l=O();R(i,l,p,_,{writeNodeFiles:!1});let g=U(i),h=0,n=l;if(g!==null&&g.applied.seq<p.length){let r=g.applied.seq;g.applied.hash===(r===0?null:_[r-1])&&(h=p.length-r,n=O(),R(i,n,p.slice(0,r),_.slice(0,r),{writeNodeFiles:!1}))}if(g===null)t("DERIVED_MISSING","derived/index.json missing or corrupt (run kane-cli context rebuild)");else{let r=o=>JSON.stringify(k(o));for(let o of["applied","heads","trust","nodeLabel","forward","extracted","superseded","names","archivedReason","appliedEvents","conv","media","design_of","design_generation","design_phases","exec","completeness","srcOwner"])r(n[o])!==r(g[o])&&t("DERIVED_DRIFT",`derived drift in index.${o} (run kane-cli context rebuild)`)}let E=new Set;for(let r of Object.values(l.forward))for(let o of r)E.add(o.ecid);let e=new Set;for(let r of p)for(let o of r.supersessions)o.kind==="node"?(o.old in l.nodeLabel||t("SUPERSEDE_UNKNOWN_OLD",`${o.old} (record ${r.seq})`),o.new!==null&&o.new!==o.old&&!(o.new in l.nodeLabel)&&t("SUPERSEDE_UNKNOWN_NEW",`${String(o.new)} (record ${r.seq})`),o.new===o.old?e.delete(o.old):(e.has(o.old)&&t("DOUBLE_SUPERSEDE",`${o.old} re-superseded while live (record ${r.seq})`),e.add(o.old))):E.has(o.ecid)||t("SUPERSEDE_UNKNOWN_ECID",`${o.ecid} (record ${r.seq})`);for(let r of Object.keys(l.superseded)){let o=new Set,a=r;for(;a!==null&&a in l.superseded;){if(o.has(a)){t("SUPERSEDE_CYCLE",`chain from ${r} revisits ${a}`);break}o.add(a),a=l.superseded[a]}}for(let[r,o]of Object.entries(l.names))o in l.nodeLabel||t("NAME_UNKNOWN_TARGET",`slug ${r} \u2192 ${o} not in the graph`);for(let r of p)for(let o of r.edges){let a=l.nodeLabel[o.src]??"(unknown)",f=l.nodeLabel[o.dst]??"(unknown)";for(let c of L(o.type,a,f,o.props))t(c.code,`${o.ecid} ${c.detail}`)}let d=new Map;for(let r of Object.values(l.forward))for(let o of r){if(o.ecid in l.superseded)continue;let a=d.get(o.type)??[];a.push(o),d.set(o.type,a)}for(let[r,o]of d){let a=F(r);if(a?.acyclic){let f=new Map;for(let u of o)f.set(u.src,[...f.get(u.src)??[],u.dst]);let c=new Map,m=u=>{c.set(u,1);for(let I of f.get(u)??[])if(c.get(I)===1||c.get(I)===void 0&&m(I))return!0;return c.set(u,2),!1};for(let u of f.keys())if(c.get(u)===void 0&&m(u)){t("EDGE_CYCLE",`live ${r} edges form a cycle reachable from ${u}`);break}}if(a?.cardinality==="one-live-per-src"||a?.cardinality==="one-live-per-src-and-dst"){let f=new Map;for(let c of o)c.dst in l.superseded||f.set(c.src,[...f.get(c.src)??[],c]);for(let[c,m]of f)m.length>1&&t("CARDINALITY_VIOLATION",`${m.length} live ${r} edges from ${c} (one-live-per-src): ecids ${m.map(u=>u.ecid).join(",")}`)}if(a?.cardinality==="one-live-per-src-and-dst"){let f=new Map;for(let c of o)c.src in l.superseded||c.dst in l.superseded||f.set(c.dst,[...f.get(c.dst)??[],c]);for(let[c,m]of f)m.length>1&&t("CARDINALITY_VIOLATION",`${m.length} live ${r} edges onto ${c} (one-live-per-dst): ecids ${m.map(u=>u.ecid).join(",")}`)}}for(let[r,o]of Object.entries(n.nodeLabel)){let a=T(i,r);if(!b(a)){t("NODE_FILE_MISSING",`missing node file for ${r} (run kane-cli context rebuild)`);continue}try{let f=JSON.parse($(a,"utf8"));(f.label!==o||j(f.label,f.content)!==r)&&t("NODE_FILE_MISMATCH",`node file content mismatch for ${r} (run kane-cli context rebuild)`);for(let c of D(f.label,f.content))t(c.code,`${r} ${c.detail}`)}catch{t("NODE_FILE_CORRUPT",`corrupt node file for ${r} (run kane-cli context rebuild)`)}}return{ok:s.length===0,issues:s,records:p.length,...h>0?{pending:h}:{}}}function k(i){return Array.isArray(i)?i.map(k):i&&typeof i=="object"?Object.fromEntries(Object.entries(i).sort(([s],[t])=>s<t?-1:1).map(([s,t])=>[s,k(t)])):i}export{T as a,Y as b,se as c,ne as d,te as e};