@testmuai/kane-cli 0.8.12 → 0.8.14

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 (308) hide show
  1. package/dist/{ChatSurface-DALSIICW.js → ChatSurface-AVL3TJA2.js} +3 -3
  2. package/dist/{ChromeProfilePicker-ZMVZH3AK.js → ChromeProfilePicker-WJZJOZ6Z.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-K66H7YE6.js → CliFeedbackPrompt-65BQF5G5.js} +1 -1
  4. package/dist/{CliUploadProgress-5DZHZY4M.js → CliUploadProgress-HEBZYKGN.js} +1 -1
  5. package/dist/{ConfigView-S5KBV62S.js → ConfigView-JEVQ2SO4.js} +1 -1
  6. package/dist/EvidenceViewOffer-5MB4ZXKM.js +2 -0
  7. package/dist/FolderPicker-SYFXH6D5.js +2 -0
  8. package/dist/{InfoBox-7PAM2FQH.js → InfoBox-KM5DLBCV.js} +1 -1
  9. package/dist/{LinksBox-2NVZ3FHJ.js → LinksBox-FQA36GTV.js} +1 -1
  10. package/dist/{ProfilesView-SIUBF7IU.js → ProfilesView-76KGHTMK.js} +1 -1
  11. package/dist/{ProjectPicker-5NI554X3.js → ProjectPicker-65YOU46H.js} +1 -1
  12. package/dist/{SaveSessionPrompt-5OULBV5N.js → SaveSessionPrompt-QD6BNTWO.js} +1 -1
  13. package/dist/ScrollbackTap-QHJOFYMC.js +2 -0
  14. package/dist/SingleShotApp-U54ETXS3.js +2 -0
  15. package/dist/{SummaryBox-GTGF3CBO.js → SummaryBox-N2B6DUDD.js} +1 -1
  16. package/dist/TestMdRunView-WA4TC5PT.js +2 -0
  17. package/dist/{TestrunEvidenceTable-7WBCOGYW.js → TestrunEvidenceTable-3WLQVTF4.js} +1 -1
  18. package/dist/{WhoamiView-E2SVBHLC.js → WhoamiView-T26HA4ZZ.js} +1 -1
  19. package/dist/agent-parse-XMWVKCRD.js +2 -0
  20. package/dist/{app-download-SAXSYXIV.js → app-download-XKZWFMEK.js} +1 -1
  21. package/dist/attach-target-V6LECVES.js +2 -0
  22. package/dist/{auth-3LLVDHOJ.js → auth-PPJANIMZ.js} +1 -1
  23. package/dist/{binary-WSMIRJNC.js → binary-DKWWODT2.js} +1 -1
  24. package/dist/bind-62AZYFAY.js +15 -0
  25. package/dist/{bootstrap-QTVHGL45.js → bootstrap-6IJNZIPT.js} +1 -1
  26. package/dist/bridge-X5DEJL6F.js +2 -0
  27. package/dist/{changelog-CNYWOB2V.js → changelog-UTGJ7FSP.js} +1 -1
  28. package/dist/chat-committer-HDE3TP5I.js +2 -0
  29. package/dist/chat-controller-3EPK7UZG.js +2 -0
  30. package/dist/chunk-22QIVSQR.js +29 -0
  31. package/dist/{chunk-CQ3ZQ5UK.js → chunk-2BFXT7VQ.js} +3 -3
  32. package/dist/{chunk-AHRL4E3M.js → chunk-2RMHDOP4.js} +1 -1
  33. package/dist/{chunk-HPUQJRDX.js → chunk-3BHRGHIZ.js} +1 -1
  34. package/dist/{chunk-EEFZXZTZ.js → chunk-3IXEARDX.js} +1 -1
  35. package/dist/chunk-3N6IAVD5.js +7 -0
  36. package/dist/{chunk-3OU2F34I.js → chunk-3SPOJWRA.js} +1 -1
  37. package/dist/chunk-3YX3RQXO.js +2 -0
  38. package/dist/chunk-42FHKRPA.js +4 -0
  39. package/dist/{chunk-FBYB3SRE.js → chunk-4BBDKWM3.js} +1 -1
  40. package/dist/{chunk-UDFDTFBL.js → chunk-4K5XTIJ6.js} +1 -1
  41. package/dist/chunk-52WM3XYO.js +4 -0
  42. package/dist/{chunk-H6VS5RYO.js → chunk-53MPG2J3.js} +1 -1
  43. package/dist/{chunk-R7QAS6LZ.js → chunk-55YDTPB7.js} +1 -1
  44. package/dist/{chunk-IDX3TOPY.js → chunk-5LJRZI7S.js} +1 -1
  45. package/dist/chunk-66MOZKD2.js +2 -0
  46. package/dist/chunk-6F6YI3ZG.js +2 -0
  47. package/dist/chunk-6LGED4FC.js +35 -0
  48. package/dist/chunk-73ULUGBM.js +5 -0
  49. package/dist/{chunk-X6APRDUM.js → chunk-75I46VTM.js} +2 -2
  50. package/dist/{chunk-5FYO3PFG.js → chunk-7L25ZNNP.js} +1 -1
  51. package/dist/chunk-7O54QURK.js +2 -0
  52. package/dist/{chunk-4T35SA2O.js → chunk-7RAI77XD.js} +1 -1
  53. package/dist/{chunk-7NXHVC7G.js → chunk-AC7BPO4X.js} +1 -1
  54. package/dist/chunk-AHXOKBVE.js +7 -0
  55. package/dist/{chunk-DNNZ353O.js → chunk-ALCE5RLK.js} +1 -1
  56. package/dist/{chunk-5AHOVOWV.js → chunk-ARG56PJG.js} +1 -1
  57. package/dist/chunk-B2ZGG7WM.js +2 -0
  58. package/dist/{chunk-GNAPBOAJ.js → chunk-BAKJPQGU.js} +1 -1
  59. package/dist/chunk-BJYGWXVP.js +52 -0
  60. package/dist/chunk-C74ABM24.js +2 -0
  61. package/dist/chunk-CGT4NFQN.js +8 -0
  62. package/dist/{chunk-EV64VI66.js → chunk-CRZUBDJ3.js} +1 -1
  63. package/dist/{chunk-M4WSRYRA.js → chunk-DA57DXCF.js} +1 -1
  64. package/dist/chunk-DHJSM5DT.js +2 -0
  65. package/dist/{chunk-UZXCCO7V.js → chunk-EMSLJTYN.js} +1 -1
  66. package/dist/{chunk-2LXJ2ZM3.js → chunk-FFFB5BXL.js} +1 -1
  67. package/dist/{chunk-WIAZN7G4.js → chunk-FFVNISYH.js} +1 -1
  68. package/dist/chunk-FQNQVC5O.js +5 -0
  69. package/dist/{chunk-NSD2H67E.js → chunk-GESG672R.js} +1 -1
  70. package/dist/{chunk-FHYG3QLL.js → chunk-GKZ2KVE6.js} +1 -1
  71. package/dist/chunk-GP7WD4UY.js +4 -0
  72. package/dist/{chunk-7R5K4IGS.js → chunk-GPIXV7AV.js} +2 -2
  73. package/dist/chunk-H6TNBKGR.js +5 -0
  74. package/dist/chunk-HOA4VWSD.js +5 -0
  75. package/dist/chunk-IE3OO5GI.js +2 -0
  76. package/dist/chunk-IICQ5KRD.js +5 -0
  77. package/dist/{chunk-VG7BTA5G.js → chunk-IQ7GPETF.js} +1 -1
  78. package/dist/{chunk-AFNDJK2A.js → chunk-IQ7NGOAT.js} +1 -1
  79. package/dist/{chunk-F2CET54H.js → chunk-J7NRD4Q7.js} +1 -1
  80. package/dist/{chunk-FAREJ4P2.js → chunk-JH6E632O.js} +1 -1
  81. package/dist/{chunk-L7GAZQYL.js → chunk-JJJSDDQ2.js} +1 -1
  82. package/dist/{chunk-XWO5MDEU.js → chunk-JKX57HA7.js} +1 -1
  83. package/dist/{chunk-LLY7TQSI.js → chunk-K7K23DIQ.js} +1 -1
  84. package/dist/chunk-KN65CUNT.js +15 -0
  85. package/dist/{chunk-YF26DH4Z.js → chunk-KOL6ZWOQ.js} +1 -1
  86. package/dist/{chunk-COVIEKZN.js → chunk-KOPP4CJW.js} +1 -1
  87. package/dist/chunk-KZG4E5RM.js +2 -0
  88. package/dist/{chunk-GRDYYYIQ.js → chunk-L4M7753M.js} +1 -1
  89. package/dist/{chunk-ZVJGHQNG.js → chunk-L6MOO4WT.js} +1 -1
  90. package/dist/chunk-LBNADEQN.js +8 -0
  91. package/dist/{chunk-HWHLKBUT.js → chunk-LL5DQO6V.js} +1 -1
  92. package/dist/chunk-LNV7C2YO.js +6 -0
  93. package/dist/{chunk-3N2YOHD6.js → chunk-LR5DJ6EN.js} +1 -1
  94. package/dist/{chunk-ZXN67F4U.js → chunk-M7DN6FO3.js} +1 -1
  95. package/dist/chunk-MLRO7OH3.js +9 -0
  96. package/dist/{chunk-ZZI4Y3CX.js → chunk-MNE5VMHT.js} +1 -1
  97. package/dist/{chunk-3G3LY6BM.js → chunk-N7ZRF5K3.js} +1 -1
  98. package/dist/{chunk-MMQLVGUJ.js → chunk-NBMLBCJ3.js} +1 -1
  99. package/dist/{chunk-WHYEXCTG.js → chunk-NDCRJXYF.js} +1 -1
  100. package/dist/{chunk-4E4GJPEM.js → chunk-NOLYYHVG.js} +1 -1
  101. package/dist/{chunk-IWVA37B6.js → chunk-O25AL4B7.js} +1 -1
  102. package/dist/{chunk-2MTAXT2U.js → chunk-O2APH6TZ.js} +1 -1
  103. package/dist/{chunk-KAZGHWGK.js → chunk-O3XBIURC.js} +1 -1
  104. package/dist/{chunk-APZCLVZD.js → chunk-O5AS2ZIX.js} +1 -1
  105. package/dist/{chunk-43DM2I6Q.js → chunk-O6U2HU5M.js} +1 -1
  106. package/dist/{chunk-7KAPHA56.js → chunk-OH2NSBO6.js} +1 -1
  107. package/dist/{chunk-3CCD434H.js → chunk-OO5GMBVI.js} +1 -1
  108. package/dist/chunk-OPL2MIQG.js +2 -0
  109. package/dist/chunk-P3JUE2RM.js +17 -0
  110. package/dist/{chunk-QZRHXGNI.js → chunk-PGU64EWQ.js} +1 -1
  111. package/dist/{chunk-24QPDHRD.js → chunk-Q7XBMBMR.js} +1 -1
  112. package/dist/{chunk-4TZSEC2C.js → chunk-QJ5O27SJ.js} +1 -1
  113. package/dist/{chunk-YTAAF62A.js → chunk-QPUVOVD7.js} +1 -1
  114. package/dist/{chunk-5A4QG7ZM.js → chunk-RBHQXWR7.js} +1 -1
  115. package/dist/{chunk-G52YPXKT.js → chunk-RH6KFHJB.js} +1 -1
  116. package/dist/{chunk-ASYWKYTQ.js → chunk-RQLU4NDG.js} +12 -12
  117. package/dist/{chunk-U27OWZPW.js → chunk-SFTFHFG3.js} +7 -7
  118. package/dist/{chunk-H6NHARB4.js → chunk-SGHP44WS.js} +1 -1
  119. package/dist/{chunk-U2CIXGZR.js → chunk-SQDQADWD.js} +1 -1
  120. package/dist/{chunk-IE4BCGUE.js → chunk-SX56MVUO.js} +1 -1
  121. package/dist/{chunk-O5U6EAL3.js → chunk-TCAHDVII.js} +1 -1
  122. package/dist/chunk-TNBF5OMZ.js +2 -0
  123. package/dist/chunk-TU6IMGWO.js +2 -0
  124. package/dist/{chunk-5G22NOZK.js → chunk-UHT5SVP5.js} +1 -1
  125. package/dist/{chunk-L2BCQQLJ.js → chunk-UXH3RMQ7.js} +1 -1
  126. package/dist/{chunk-DYXYNH6X.js → chunk-VNFCX2SH.js} +1 -1
  127. package/dist/{chunk-O7U5BVX5.js → chunk-WBHSPN55.js} +2 -2
  128. package/dist/chunk-WILT62DP.js +16 -0
  129. package/dist/{chunk-I57TM22L.js → chunk-WOA7VCGA.js} +1 -1
  130. package/dist/{chunk-SA6EDKUF.js → chunk-WR42Q3HU.js} +1 -1
  131. package/dist/chunk-X5276I5H.js +9 -0
  132. package/dist/{chunk-75HF3GPO.js → chunk-X74PP5NJ.js} +1 -1
  133. package/dist/{chunk-3XWKKSIM.js → chunk-XGHMZJGI.js} +2 -2
  134. package/dist/{chunk-XS2LZFCH.js → chunk-YCH7H7JX.js} +1 -1
  135. package/dist/{chunk-IGW77FMB.js → chunk-YHR2YAN5.js} +1 -1
  136. package/dist/chunk-YHVG7V3E.js +21 -0
  137. package/dist/chunk-YLQHY4A7.js +2 -0
  138. package/dist/{chunk-KGKJU27A.js → chunk-YYYQ5MVD.js} +1 -1
  139. package/dist/chunk-ZA4M4O7E.js +27 -0
  140. package/dist/chunk-ZKEOPIQ3.js +9 -0
  141. package/dist/chunk-ZUZ6QJRA.js +23 -0
  142. package/dist/{chunk-4ASRA7CD.js → chunk-ZWHPIR2Z.js} +2 -2
  143. package/dist/chunk-ZZTZJPT2.js +88 -0
  144. package/dist/committer-IYQPXG6C.js +2 -0
  145. package/dist/{config-HUK7V364.js → config-3AKWRTFS.js} +1 -1
  146. package/dist/{controller-client-OB4WD2C4.js → controller-client-ZF5IXRUV.js} +1 -1
  147. package/dist/cover-cmd-ZLAWMEC2.js +3 -0
  148. package/dist/{credentials-6DP4KAMJ.js → credentials-Q4WH5CBN.js} +1 -1
  149. package/dist/{deps-bundle-PZNXSKLC.js → deps-bundle-RVZK6LZJ.js} +1 -1
  150. package/dist/{deps-resolve-62XK3LKV.js → deps-resolve-6F2U4TJP.js} +1 -1
  151. package/dist/design-committer-J57IAAA5.js +2 -0
  152. package/dist/dispatch-46BETGXY.js +2 -0
  153. package/dist/{doctor-ZQQ4VMPY.js → doctor-WRPG56HH.js} +1 -1
  154. package/dist/docx-convert-WPZS6OIC.js +2 -0
  155. package/dist/{dossier-Y6TJWFZU.js → dossier-UGJMYYAB.js} +1 -1
  156. package/dist/evidence-XWR32HWP.js +2 -0
  157. package/dist/evolve-cmd-27ZQN6YB.js +2 -0
  158. package/dist/explain-H5HJEDEF.js +2 -0
  159. package/dist/explain-cmd-JCJTXVZY.js +9 -0
  160. package/dist/{explain-cmd-XCRO4AS6.js → explain-cmd-R45I5MT7.js} +1 -1
  161. package/dist/extract-bind-D5BYYGYA.js +14 -0
  162. package/dist/{extract-cmd-IPBCCR3T.js → extract-cmd-CCYW7FIY.js} +3 -3
  163. package/dist/feeder-RSHMGW6B.js +2 -0
  164. package/dist/gaps-cmd-3VJKQ25D.js +3 -0
  165. package/dist/{generate-headless-CLMSXEAS.js → generate-headless-2M6UT3IK.js} +2 -2
  166. package/dist/headless-io-3A3BZVQ5.js +2 -0
  167. package/dist/index.js +206 -164
  168. package/dist/ingest-QGLVY7ND.js +2 -0
  169. package/dist/ingest-cmd-HVTUK264.js +2 -0
  170. package/dist/install-5WJLE7XT.js +2 -0
  171. package/dist/interactive-bind-OJCYNQPI.js +26 -0
  172. package/dist/lifecycle-cmd-GWFGUGTC.js +2 -0
  173. package/dist/{list-cmd-V3HJ5K4O.js → list-cmd-AXDW64OY.js} +1 -1
  174. package/dist/list-commands-YNZ6EFIF.js +2 -0
  175. package/dist/{locks-cmd-CSVSWY2Y.js → locks-cmd-67OHQZNV.js} +1 -1
  176. package/dist/logical-ids-DN6IZSUM.js +2 -0
  177. package/dist/login-flow-PRXFPRYZ.js +2 -0
  178. package/dist/maintenance-cmd-QEMK6YNV.js +2 -0
  179. package/dist/{mobile-prompts-WJVFBWW5.js → mobile-prompts-OXHA5GHJ.js} +1 -1
  180. package/dist/{objective-variable-gate-GCQYYM77.js → objective-variable-gate-76GYUHEP.js} +1 -1
  181. package/dist/open-provider-E5VUGFNE.js +2 -0
  182. package/dist/pdf-convert-5H4HQNN3.js +2 -0
  183. package/dist/{persist-recorded-session-MHLD4A32.js → persist-recorded-session-KWPH37HI.js} +1 -1
  184. package/dist/phase-seed-HKJ2EF7R.js +2 -0
  185. package/dist/pipeline-A2OGF4XW.js +2 -0
  186. package/dist/prepare-target-P6BWJZBZ.js +2 -0
  187. package/dist/readmodel-IBFRM6EO.js +2 -0
  188. package/dist/reconcile-cmd-V7TDYETT.js +2 -0
  189. package/dist/reconcile-deps-X6IGH4CA.js +4 -0
  190. package/dist/reconcile-engine-OGXSIE7O.js +2 -0
  191. package/dist/{recording-banner-4H4AL6YN.js → recording-banner-IZWN2XFY.js} +1 -1
  192. package/dist/records-TJJJWBUD.js +2 -0
  193. package/dist/registry-GOLIFVK5.js +2 -0
  194. package/dist/{require-project-folder-G2G4WKWW.js → require-project-folder-PEEUITK6.js} +1 -1
  195. package/dist/{resolve-run-intent-MZRPYN4V.js → resolve-run-intent-JGXXE45Y.js} +1 -1
  196. package/dist/{resolver-X5NHNX5O.js → resolver-TY7XLJBN.js} +1 -1
  197. package/dist/revert-6BBBK3I4.js +2 -0
  198. package/dist/review-cmd-74YTPT7E.js +5 -0
  199. package/dist/run-DN4XARP2.js +2 -0
  200. package/dist/run-GRYWYKIH.js +2 -0
  201. package/dist/{run-test-md-4VRH7FU5.js → run-test-md-DFCKCQ4T.js} +2 -2
  202. package/dist/sessions-NH7WQWMX.js +2 -0
  203. package/dist/{sessions-cmd-VDQGRBEM.js → sessions-cmd-DV442ZCY.js} +1 -1
  204. package/dist/{skill-installer-WPW6NDCR.js → skill-installer-GRU3HOYF.js} +1 -1
  205. package/dist/{spawner-R3XOP3GP.js → spawner-LNMD4NJF.js} +1 -1
  206. package/dist/store-guard-Q4MYZQHF.js +2 -0
  207. package/dist/structured-answers-NADW6D44.js +5 -0
  208. package/dist/sync-cmd-H6Y5EB3L.js +2 -0
  209. package/dist/sync-setup-THGRBKTA.js +2 -0
  210. package/dist/sync-setup-ui-RC727VK6.js +3 -0
  211. package/dist/tcg-generate-SZZ7MJXY.js +2 -0
  212. package/dist/testmd-actions-MRIUOOXO.js +2 -0
  213. package/dist/testmd-sync-UYVJ47BN.js +2 -0
  214. package/dist/token-refresh-KN5JK2U4.js +2 -0
  215. package/dist/{validate-basic-YNGP5JFB.js → validate-basic-RCBEELSB.js} +1 -1
  216. package/dist/{variable-receipt-2VCUG7NN.js → variable-receipt-JHRW73Z6.js} +1 -1
  217. package/dist/verdicts-XFXDRND4.js +2 -0
  218. package/dist/{version-check-GUGRBTIH.js → version-check-Z774UWW3.js} +1 -1
  219. package/dist/{view-cmd-SXXNDZIC.js → view-cmd-I4LQGJ2X.js} +1 -1
  220. package/dist/walk-session-FP52IGLB.js +2 -0
  221. package/dist/with-telemetry-P6RUPWBH.js +2 -0
  222. package/package.json +12 -11
  223. package/dist/EvidenceViewOffer-UACWB3YJ.js +0 -2
  224. package/dist/FolderPicker-YH5TKMX3.js +0 -2
  225. package/dist/ScrollbackTap-Q3IOKNMS.js +0 -2
  226. package/dist/SingleShotApp-LA3EMPUK.js +0 -2
  227. package/dist/TestMdRunView-5MNKJJMS.js +0 -2
  228. package/dist/bind-A3M4PV4V.js +0 -12
  229. package/dist/bridge-E2C5VV3H.js +0 -2
  230. package/dist/chat-committer-RAOIL2T6.js +0 -2
  231. package/dist/chat-controller-YJCNU76T.js +0 -2
  232. package/dist/chunk-4O6XBS5G.js +0 -5
  233. package/dist/chunk-54JZ6VEW.js +0 -4
  234. package/dist/chunk-5DT7PIGB.js +0 -5
  235. package/dist/chunk-5KLDW3ZW.js +0 -85
  236. package/dist/chunk-6A47PRDS.js +0 -4
  237. package/dist/chunk-6FCPS2VT.js +0 -4
  238. package/dist/chunk-7RFGO3TH.js +0 -2
  239. package/dist/chunk-DBIBROYW.js +0 -5
  240. package/dist/chunk-DPUV6OSP.js +0 -2
  241. package/dist/chunk-G2Q2TP3O.js +0 -9
  242. package/dist/chunk-IAHKTEET.js +0 -2
  243. package/dist/chunk-IVQX3AKL.js +0 -4
  244. package/dist/chunk-JDGBRACP.js +0 -16
  245. package/dist/chunk-JOATASPP.js +0 -4
  246. package/dist/chunk-KRL2BDI5.js +0 -8
  247. package/dist/chunk-N7Z7BQYO.js +0 -3
  248. package/dist/chunk-NJJQL54J.js +0 -2
  249. package/dist/chunk-NP3VGFZM.js +0 -26
  250. package/dist/chunk-NVGBE2DR.js +0 -2
  251. package/dist/chunk-OS4VSIHT.js +0 -4
  252. package/dist/chunk-OZMYKG6E.js +0 -6
  253. package/dist/chunk-QQ5MHSSY.js +0 -2
  254. package/dist/chunk-RV7Q4RUV.js +0 -7
  255. package/dist/chunk-SACCB44S.js +0 -21
  256. package/dist/chunk-T4OJX2GZ.js +0 -15
  257. package/dist/chunk-TLFNUXKS.js +0 -2
  258. package/dist/chunk-UH2ZTX4E.js +0 -2
  259. package/dist/chunk-VDM3TWF6.js +0 -17
  260. package/dist/chunk-W3Z7AZNT.js +0 -4
  261. package/dist/chunk-WMVPJWWA.js +0 -37
  262. package/dist/chunk-XMTSHHYQ.js +0 -4
  263. package/dist/chunk-ZVZHE7KH.js +0 -27
  264. package/dist/committer-C6UCDYMC.js +0 -2
  265. package/dist/cover-cmd-5LPHIOSI.js +0 -3
  266. package/dist/design-committer-UPC6NZUF.js +0 -2
  267. package/dist/dispatch-7JCKGQVC.js +0 -2
  268. package/dist/docx-convert-BIV5T7F5.js +0 -2
  269. package/dist/evidence-YAXIWZ6A.js +0 -2
  270. package/dist/evolve-cmd-5ACHYQPE.js +0 -2
  271. package/dist/explain-3HAZY7Q6.js +0 -2
  272. package/dist/explain-cmd-RMJPXD4U.js +0 -9
  273. package/dist/extract-bind-BF2G6AS6.js +0 -10
  274. package/dist/feeder-IOR3XRNF.js +0 -2
  275. package/dist/gaps-cmd-3WXL6PAW.js +0 -3
  276. package/dist/headless-io-66RG5NN5.js +0 -2
  277. package/dist/ingest-TTUQ7UDK.js +0 -2
  278. package/dist/ingest-cmd-KP5M6XTA.js +0 -2
  279. package/dist/install-5VWCH5GW.js +0 -2
  280. package/dist/interactive-bind-MOV2VWHJ.js +0 -25
  281. package/dist/lifecycle-cmd-KSMETBPP.js +0 -2
  282. package/dist/list-commands-KUDSKVP5.js +0 -2
  283. package/dist/logical-ids-MLXAH45L.js +0 -2
  284. package/dist/login-flow-GZ3XHVCS.js +0 -2
  285. package/dist/maintenance-cmd-VFYGKY3X.js +0 -2
  286. package/dist/pdf-convert-OZIRUADA.js +0 -2
  287. package/dist/phase-seed-BMOSAA74.js +0 -2
  288. package/dist/pipeline-G7KWRK2G.js +0 -2
  289. package/dist/prepare-target-SQ5IGKXD.js +0 -2
  290. package/dist/readmodel-TDRFVDVI.js +0 -2
  291. package/dist/reconcile-cmd-NI3AYU3Y.js +0 -2
  292. package/dist/reconcile-deps-DCHUFIEC.js +0 -4
  293. package/dist/reconcile-engine-QXUKUKSL.js +0 -2
  294. package/dist/records-JLS63SDI.js +0 -2
  295. package/dist/registry-R6QNPI5E.js +0 -2
  296. package/dist/revert-PRR3D4XM.js +0 -2
  297. package/dist/review-cmd-SAGIKWEW.js +0 -4
  298. package/dist/run-PBS2J4N4.js +0 -2
  299. package/dist/run-VTUYLPSG.js +0 -2
  300. package/dist/sessions-GIEXOCE4.js +0 -2
  301. package/dist/structured-answers-YAVW65G4.js +0 -5
  302. package/dist/tcg-generate-HIC5AA3L.js +0 -2
  303. package/dist/testmd-actions-VOSP7L74.js +0 -2
  304. package/dist/testmd-sync-GNCDKPQN.js +0 -2
  305. package/dist/token-refresh-GSFVJ6GU.js +0 -2
  306. package/dist/verdicts-PRXUKSDV.js +0 -2
  307. package/dist/walk-session-G3DLBR24.js +0 -2
  308. package/dist/with-telemetry-5Y2CVPXK.js +0 -2
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as h}from"./chunk-3CCD434H.js";import{x as l}from"./chunk-NJJQL54J.js";import{a as A}from"./chunk-HCBYKLMW.js";import{a as c,b as f,i as P}from"./chunk-C44QQJR4.js";import{a as B}from"./chunk-6YGTRKDT.js";import{e as x}from"./chunk-UR6MHSHU.js";var L=x(B(),1);var n=x(A(),1);function S(r,d,s,u,m){let p=s==="basic"&&u?`basic (${u})`:s,i=20,a=`${r} [${d}]`,g="\xB7".repeat(Math.max(2,i-a.length+3));return{label:`${a} ${g} ${p}`,profile:r,env:d,isActive:m}}function M({creds:r,onSwitch:d,onCancel:s}){let u=r.listProfiles(),m=r.getActiveProfile(),p=r.getDefaultEnv(),i=u.map(e=>{let o=r.loadBasicAuth(e.profile,e.env),t=r.loadCredentials(e.profile,e.env)!==null,v=o?"basic":t?"oauth":"none",b=o?o.username:null,w=e.profile===m&&e.env===p;return S(e.profile,e.env,v,b,w)}),[a,g]=(0,L.useState)(()=>{let e=i.findIndex(o=>o.isActive);return e>=0?e:0});return P((e,o)=>{if(o.escape){s();return}if(o.upArrow){g(t=>Math.max(0,t-1));return}if(o.downArrow){g(t=>Math.min(i.length-1,t+1));return}if(o.return&&i[a]){let t=i[a];t.isActive||d(t.profile,t.env),s();return}}),i.length===0?(0,n.jsxs)(c,{flexDirection:"column",borderStyle:"round",borderColor:l.orange,paddingX:2,paddingY:1,children:[(0,n.jsx)(f,{color:l.orange,bold:!0,children:"Profiles"}),(0,n.jsx)(c,{marginTop:1,children:(0,n.jsx)(f,{color:l.dim,children:"No profiles \u2014 use Login to create one"})}),(0,n.jsx)(h,{bindings:[],escBackLabel:"back"})]}):(0,n.jsxs)(c,{flexDirection:"column",borderStyle:"round",borderColor:l.orange,paddingX:2,paddingY:1,children:[(0,n.jsx)(f,{color:l.orange,bold:!0,children:"Profiles"}),(0,n.jsx)(c,{flexDirection:"column",marginTop:1,children:i.map((e,o)=>{let t=o===a,v=t?"\u276F ":" ",b=e.isActive?l.green:t?l.orange:void 0;return(0,n.jsxs)(f,{color:b,children:[v,e.label,e.isActive?" \u25CF active":""]},`${e.profile}-${e.env}`)})}),(0,n.jsx)(h,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"switch"}],escBackLabel:"back"})]})}export{S as a,M as b};
2
+ import{a as h}from"./chunk-OO5GMBVI.js";import{y as l}from"./chunk-B2ZGG7WM.js";import{a as A}from"./chunk-HCBYKLMW.js";import{a as c,b as f,i as P}from"./chunk-C44QQJR4.js";import{a as B}from"./chunk-6YGTRKDT.js";import{e as x}from"./chunk-UR6MHSHU.js";var L=x(B(),1);var n=x(A(),1);function S(r,d,s,u,m){let p=s==="basic"&&u?`basic (${u})`:s,i=20,a=`${r} [${d}]`,g="\xB7".repeat(Math.max(2,i-a.length+3));return{label:`${a} ${g} ${p}`,profile:r,env:d,isActive:m}}function M({creds:r,onSwitch:d,onCancel:s}){let u=r.listProfiles(),m=r.getActiveProfile(),p=r.getDefaultEnv(),i=u.map(e=>{let o=r.loadBasicAuth(e.profile,e.env),t=r.loadCredentials(e.profile,e.env)!==null,v=o?"basic":t?"oauth":"none",b=o?o.username:null,w=e.profile===m&&e.env===p;return S(e.profile,e.env,v,b,w)}),[a,g]=(0,L.useState)(()=>{let e=i.findIndex(o=>o.isActive);return e>=0?e:0});return P((e,o)=>{if(o.escape){s();return}if(o.upArrow){g(t=>Math.max(0,t-1));return}if(o.downArrow){g(t=>Math.min(i.length-1,t+1));return}if(o.return&&i[a]){let t=i[a];t.isActive||d(t.profile,t.env),s();return}}),i.length===0?(0,n.jsxs)(c,{flexDirection:"column",borderStyle:"round",borderColor:l.orange,paddingX:2,paddingY:1,children:[(0,n.jsx)(f,{color:l.orange,bold:!0,children:"Profiles"}),(0,n.jsx)(c,{marginTop:1,children:(0,n.jsx)(f,{color:l.dim,children:"No profiles \u2014 use Login to create one"})}),(0,n.jsx)(h,{bindings:[],escBackLabel:"back"})]}):(0,n.jsxs)(c,{flexDirection:"column",borderStyle:"round",borderColor:l.orange,paddingX:2,paddingY:1,children:[(0,n.jsx)(f,{color:l.orange,bold:!0,children:"Profiles"}),(0,n.jsx)(c,{flexDirection:"column",marginTop:1,children:i.map((e,o)=>{let t=o===a,v=t?"\u276F ":" ",b=e.isActive?l.green:t?l.orange:void 0;return(0,n.jsxs)(f,{color:b,children:[v,e.label,e.isActive?" \u25CF active":""]},`${e.profile}-${e.env}`)})}),(0,n.jsx)(h,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"switch"}],escBackLabel:"back"})]})}export{S as a,M as b};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as B}from"./chunk-S3DAAAE5.js";import{a as g}from"./chunk-5FYO3PFG.js";import{x as s}from"./chunk-NJJQL54J.js";import{a as w}from"./chunk-HCBYKLMW.js";import{a as x,b as t,c as h,i as P,j as S}from"./chunk-C44QQJR4.js";import{a as C}from"./chunk-6YGTRKDT.js";import{e as T}from"./chunk-UR6MHSHU.js";var o=T(C(),1);var e=T(w(),1);function D({defaultName:i,onSubmit:c}){let[d,p]=(0,o.useState)("confirm"),[f,a]=(0,o.useState)(""),[m,u]=(0,o.useState)(null),l=(0,o.useMemo)(()=>f.trim()||i,[f,i]);return P((n,r)=>{if(d==="confirm"){if(n==="y"||n==="Y"){a(i),p("name");return}if(n==="n"||n==="N"||r.escape||r.ctrl&&n==="c"){c(null);return}if(r.return){c(i);return}return}if(r.return){if(!B(l)){u(`name "${l}" is invalid; allowed: letters, digits, underscore, hyphen`);return}c(l);return}if(r.escape||r.ctrl&&n==="c"){c(null);return}if(r.backspace||r.delete){a(v=>v.slice(0,-1)),u(null);return}n&&!r.ctrl&&!r.meta&&(a(v=>v+n),u(null))}),d==="confirm"?(0,e.jsx)(g,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsx)(t,{color:s.orange,children:i})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[(0,e.jsx)(t,{color:s.dim,children:"enter \u2014 save with this name"}),(0,e.jsx)(t,{color:s.dim,children:"Y \u2014 edit name"}),(0,e.jsx)(t,{color:s.dim,children:"N/esc \u2014 discard session"})]})}):(0,e.jsx)(g,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsxs)(x,{children:[(0,e.jsx)(t,{color:s.orange,children:f}),(0,e.jsx)(t,{inverse:!0,children:" "})]})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[m&&(0,e.jsx)(t,{color:s.red,children:m}),(0,e.jsx)(t,{color:s.dim,children:"enter \u2014 save \xB7 esc \u2014 discard"})]})})}function V(){return new Date().toISOString().slice(0,19).replace(/:/g,"-")}async function Y(i){return new Promise(c=>{function d(){let{exit:a}=S(),[m,u]=(0,o.useState)(!1);return(0,o.useEffect)(()=>{if(m){let l=setTimeout(()=>a(),50);return()=>clearTimeout(l)}},[m,a]),(0,e.jsx)(D,{defaultName:i,onSubmit:l=>{c(l),u(!0)}})}let{waitUntilExit:p,unmount:f}=h((0,e.jsx)(d,{}),{stdout:process.stderr,exitOnCtrlC:!1});p().then(()=>{try{f()}catch{}})})}export{D as a,V as b,Y as c};
2
+ import{b as B}from"./chunk-S3DAAAE5.js";import{a as g}from"./chunk-7L25ZNNP.js";import{y as s}from"./chunk-B2ZGG7WM.js";import{a as w}from"./chunk-HCBYKLMW.js";import{a as x,b as t,c as h,i as P,j as S}from"./chunk-C44QQJR4.js";import{a as C}from"./chunk-6YGTRKDT.js";import{e as T}from"./chunk-UR6MHSHU.js";var o=T(C(),1);var e=T(w(),1);function D({defaultName:i,onSubmit:c}){let[d,p]=(0,o.useState)("confirm"),[f,a]=(0,o.useState)(""),[m,u]=(0,o.useState)(null),l=(0,o.useMemo)(()=>f.trim()||i,[f,i]);return P((n,r)=>{if(d==="confirm"){if(n==="y"||n==="Y"){a(i),p("name");return}if(n==="n"||n==="N"||r.escape||r.ctrl&&n==="c"){c(null);return}if(r.return){c(i);return}return}if(r.return){if(!B(l)){u(`name "${l}" is invalid; allowed: letters, digits, underscore, hyphen`);return}c(l);return}if(r.escape||r.ctrl&&n==="c"){c(null);return}if(r.backspace||r.delete){a(v=>v.slice(0,-1)),u(null);return}n&&!r.ctrl&&!r.meta&&(a(v=>v+n),u(null))}),d==="confirm"?(0,e.jsx)(g,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsx)(t,{color:s.orange,children:i})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[(0,e.jsx)(t,{color:s.dim,children:"enter \u2014 save with this name"}),(0,e.jsx)(t,{color:s.dim,children:"Y \u2014 edit name"}),(0,e.jsx)(t,{color:s.dim,children:"N/esc \u2014 discard session"})]})}):(0,e.jsx)(g,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsxs)(x,{children:[(0,e.jsx)(t,{color:s.orange,children:f}),(0,e.jsx)(t,{inverse:!0,children:" "})]})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[m&&(0,e.jsx)(t,{color:s.red,children:m}),(0,e.jsx)(t,{color:s.dim,children:"enter \u2014 save \xB7 esc \u2014 discard"})]})})}function V(){return new Date().toISOString().slice(0,19).replace(/:/g,"-")}async function Y(i){return new Promise(c=>{function d(){let{exit:a}=S(),[m,u]=(0,o.useState)(!1);return(0,o.useEffect)(()=>{if(m){let l=setTimeout(()=>a(),50);return()=>clearTimeout(l)}},[m,a]),(0,e.jsx)(D,{defaultName:i,onSubmit:l=>{c(l),u(!0)}})}let{waitUntilExit:p,unmount:f}=h((0,e.jsx)(d,{}),{stdout:process.stderr,exitOnCtrlC:!1});p().then(()=>{try{f()}catch{}})})}export{D as a,V as b,Y as c};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as R}from"./chunk-3CCD434H.js";import{x as i}from"./chunk-NJJQL54J.js";import{a as Y}from"./chunk-HCBYKLMW.js";import{a,b as l,i as X}from"./chunk-C44QQJR4.js";import{a as K}from"./chunk-6YGTRKDT.js";import{e as P}from"./chunk-UR6MHSHU.js";var x=P(K(),1);var e=P(Y(),1),f=5;function Z(t,S){if(!S)return t;let c=S.toLowerCase();return t.filter(B=>B.label.toLowerCase().includes(c))}function Q(t){let{title:S,items:c,loading:B=!1,loadingText:p,error:L=null,itemNoun:v="items",onSelect:O,onCancel:E,defaultActiveId:w,onTab:y,extraHint:H}=t,[g,s]=(0,x.useState)(0),[h,u]=(0,x.useState)(0),[d,A]=(0,x.useState)(""),[C,I]=(0,x.useState)(null),N=!t.onSearch&&d!=="";(0,x.useEffect)(()=>{if(c.length===0||N)return;if(t.preserveSelectionById&&C!==null){let o=c.findIndex(n=>n.id===C);if(o>=0){u(Math.floor(o/f)),s(o%f);return}}let r=w?c.findIndex(o=>o.id===w):c.findIndex(o=>o.isActive);r>=0?(u(Math.floor(r/f)),s(r%f),t.preserveSelectionById&&I(c[r].id)):t.preserveSelectionById&&(u(0),s(0),I(c[0]?.id??null))},[c,w,t.preserveSelectionById,C,N]),(0,x.useEffect)(()=>{if(!t.onSearch)return;let r=setTimeout(()=>t.onSearch(d),t.searchDebounceMs??250);return()=>clearTimeout(r)},[d,t.onSearch,t.searchDebounceMs]);let b=t.onSearch?c:Z(c,d),D=h*f,F=Math.min(D+f,b.length),M=Math.ceil(b.length/f),$=F-D,T=b.slice(D,F);return X((r,o)=>{if(L){o.escape&&E();return}if(o.escape){d?(A(""),s(0),u(0)):E();return}if(o.tab&&y){y();return}if(o.upArrow){if(g>0){let n=g-1;s(n),t.preserveSelectionById&&I(T[n]?.id??null)}else if(h>0){let n=h-1,m=f-1;u(n),s(m),t.preserveSelectionById&&I(b[n*f+m]?.id??null)}return}if(o.downArrow){if(g<$-1){let n=g+1;s(n),t.preserveSelectionById&&I(T[n]?.id??null)}else if(h<M-1){let n=h+1,m=0;u(n),s(m),t.preserveSelectionById&&I(b[n*f+m]?.id??null)}return}if(o.return&&T[g]){if(T[g].disabled)return;O(T[g]);return}if(o.backspace||o.delete){A(n=>n.slice(0,-1)),s(0),u(0);return}r&&!o.ctrl&&!o.meta&&(A(n=>n+r),s(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:S}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(l,{color:i.secondary,children:p??`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:S}),(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:S}),(0,e.jsxs)(l,{color:i.dim,children:[" (",b.length,!t.onSearch&&d?`/${c.length}`:""," ",v,t.loadingMore?" \xB7 loading more":"",")"]})]}),(0,e.jsxs)(a,{marginTop:1,children:[(0,e.jsx)(l,{color:i.secondary,children:d?"filter: ":""}),d?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(l,{children:d}),(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 "',d,'"']}):T.map((r,o)=>{let n=o===g,m=n?"\u276F ":" ",G=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:G,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 ",h+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:d?"clear":"back to chat"})]})}export{Q as a};
2
+ import{a as R}from"./chunk-OO5GMBVI.js";import{y as i}from"./chunk-B2ZGG7WM.js";import{a as Y}from"./chunk-HCBYKLMW.js";import{a,b as l,i as X}from"./chunk-C44QQJR4.js";import{a as K}from"./chunk-6YGTRKDT.js";import{e as P}from"./chunk-UR6MHSHU.js";var x=P(K(),1);var e=P(Y(),1),f=5;function Z(t,S){if(!S)return t;let c=S.toLowerCase();return t.filter(B=>B.label.toLowerCase().includes(c))}function Q(t){let{title:S,items:c,loading:B=!1,loadingText:p,error:L=null,itemNoun:v="items",onSelect:O,onCancel:E,defaultActiveId:w,onTab:y,extraHint:H}=t,[g,s]=(0,x.useState)(0),[h,u]=(0,x.useState)(0),[d,A]=(0,x.useState)(""),[C,I]=(0,x.useState)(null),N=!t.onSearch&&d!=="";(0,x.useEffect)(()=>{if(c.length===0||N)return;if(t.preserveSelectionById&&C!==null){let o=c.findIndex(n=>n.id===C);if(o>=0){u(Math.floor(o/f)),s(o%f);return}}let r=w?c.findIndex(o=>o.id===w):c.findIndex(o=>o.isActive);r>=0?(u(Math.floor(r/f)),s(r%f),t.preserveSelectionById&&I(c[r].id)):t.preserveSelectionById&&(u(0),s(0),I(c[0]?.id??null))},[c,w,t.preserveSelectionById,C,N]),(0,x.useEffect)(()=>{if(!t.onSearch)return;let r=setTimeout(()=>t.onSearch(d),t.searchDebounceMs??250);return()=>clearTimeout(r)},[d,t.onSearch,t.searchDebounceMs]);let b=t.onSearch?c:Z(c,d),D=h*f,F=Math.min(D+f,b.length),M=Math.ceil(b.length/f),$=F-D,T=b.slice(D,F);return X((r,o)=>{if(L){o.escape&&E();return}if(o.escape){d?(A(""),s(0),u(0)):E();return}if(o.tab&&y){y();return}if(o.upArrow){if(g>0){let n=g-1;s(n),t.preserveSelectionById&&I(T[n]?.id??null)}else if(h>0){let n=h-1,m=f-1;u(n),s(m),t.preserveSelectionById&&I(b[n*f+m]?.id??null)}return}if(o.downArrow){if(g<$-1){let n=g+1;s(n),t.preserveSelectionById&&I(T[n]?.id??null)}else if(h<M-1){let n=h+1,m=0;u(n),s(m),t.preserveSelectionById&&I(b[n*f+m]?.id??null)}return}if(o.return&&T[g]){if(T[g].disabled)return;O(T[g]);return}if(o.backspace||o.delete){A(n=>n.slice(0,-1)),s(0),u(0);return}r&&!o.ctrl&&!o.meta&&(A(n=>n+r),s(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:S}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(l,{color:i.secondary,children:p??`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:S}),(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:S}),(0,e.jsxs)(l,{color:i.dim,children:[" (",b.length,!t.onSearch&&d?`/${c.length}`:""," ",v,t.loadingMore?" \xB7 loading more":"",")"]})]}),(0,e.jsxs)(a,{marginTop:1,children:[(0,e.jsx)(l,{color:i.secondary,children:d?"filter: ":""}),d?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(l,{children:d}),(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 "',d,'"']}):T.map((r,o)=>{let n=o===g,m=n?"\u276F ":" ",G=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:G,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 ",h+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:d?"clear":"back to chat"})]})}export{Q as a};
@@ -1,4 +1,4 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as N,c as O,e as S,f as D,j as T,n as y,p as z,r as U}from"./chunk-T4OJX2GZ.js";import{a as Y,b as M}from"./chunk-NBXYL2JT.js";import{a as F}from"./chunk-KRL2BDI5.js";import{a as R}from"./chunk-DPUV6OSP.js";import{a as A}from"./chunk-NJJQL54J.js";import{e as $}from"./chunk-UR6MHSHU.js";var C=$(Y(),1);import{existsSync as k,readFileSync as I,readdirSync as J,statSync as K}from"fs";import{dirname as H,isAbsolute as V,join as h,relative as P,resolve as Z,sep as _}from"path";import{createHash as q}from"crypto";var b="testmd-bundle.json",u=class extends Error{constructor(t){super(t),this.name="BundleUsageError"}},B=e=>e.split(_).join("/");function v(e){if(!k(e))return[];let t=[];for(let s of J(e).sort()){let r=h(e,s);K(r).isDirectory()?t.push(...v(r)):t.push(r)}return t}function G(e){let t=e.map(r=>H(r).split(_)),s=t[0];for(let r of t.slice(1)){let i=0;for(;i<s.length&&i<r.length&&s[i]===r[i];)i++;s=s.slice(0,i)}return s.join(_)||_}function Q(e){for(let t of e){let s=F(t,I(t,"utf8"));for(let r of s.steps)if(r.body.kind==="import_ref"&&V(r.body.path))throw new u(`bundle sync: absolute @import is not portable after unzip: ${t} step ${r.index} (@import ${r.body.path})`)}}function j(e,t={}){let s=Z(e),r=S(s),i=y(s);if(!i?.commit_id||!i?.test_id)throw new u(`bundle sync: ${s} is not authored \u2014 run \`kane-cli testmd run\` first (output-<stem>/.internal/meta.json needs commit_id + test_id)`);let l;try{l=U(s)}catch(n){throw n instanceof z?new u(`bundle sync: ${n.message}`):n}let c=[s];for(let n of l.steps)for(let a of n.trace.slice(1))c.includes(a.file)||c.push(a.file);Q(c);let o=[],d=[];for(let n of l.unitFiles){if(n.file===s)continue;let a=N(n.file);o.includes(a)||o.push(a),n.kind==="module"&&d.push(S(n.file))}let m=[...c],p=n=>{k(n)&&m.push(n)};p(O(s)),m.push(r),p(D(s)),m.push(...v(T(s)));for(let n of o)p(h(n,"Result.md")),m.push(...v(h(n,".internal","steps")));for(let n of d)p(n);let f=G(m);if(k(h(f,b)))throw new u(`bundle sync: a real file named ${b} exists at the zip root (${f}) \u2014 it would collide with the generated manifest`);let w=m.map(n=>{let a=n===r&&t.identityOverride?Buffer.from(JSON.stringify({...JSON.parse(I(n,"utf8")),commit_id:t.identityOverride.commit_id},null,2)+`
2
+ import{b as N,c as O,e as S,f as D,j as T,n as y,p as z,r as U}from"./chunk-KN65CUNT.js";import{a as Y,b as M}from"./chunk-NBXYL2JT.js";import{a as F}from"./chunk-LBNADEQN.js";import{a as R}from"./chunk-DHJSM5DT.js";import{a as A}from"./chunk-B2ZGG7WM.js";import{e as $}from"./chunk-UR6MHSHU.js";var C=$(Y(),1);import{existsSync as k,readFileSync as I,readdirSync as J,statSync as K}from"fs";import{dirname as H,isAbsolute as V,join as h,relative as P,resolve as Z,sep as _}from"path";import{createHash as q}from"crypto";var b="testmd-bundle.json",u=class extends Error{constructor(t){super(t),this.name="BundleUsageError"}},B=e=>e.split(_).join("/");function v(e){if(!k(e))return[];let t=[];for(let s of J(e).sort()){let r=h(e,s);K(r).isDirectory()?t.push(...v(r)):t.push(r)}return t}function G(e){let t=e.map(r=>H(r).split(_)),s=t[0];for(let r of t.slice(1)){let i=0;for(;i<s.length&&i<r.length&&s[i]===r[i];)i++;s=s.slice(0,i)}return s.join(_)||_}function Q(e){for(let t of e){let s=F(t,I(t,"utf8"));for(let r of s.steps)if(r.body.kind==="import_ref"&&V(r.body.path))throw new u(`bundle sync: absolute @import is not portable after unzip: ${t} step ${r.index} (@import ${r.body.path})`)}}function j(e,t={}){let s=Z(e),r=S(s),i=y(s);if(!i?.commit_id||!i?.test_id)throw new u(`bundle sync: ${s} is not authored \u2014 run \`kane-cli testmd run\` first (output-<stem>/.internal/meta.json needs commit_id + test_id)`);let l;try{l=U(s)}catch(n){throw n instanceof z?new u(`bundle sync: ${n.message}`):n}let c=[s];for(let n of l.steps)for(let a of n.trace.slice(1))c.includes(a.file)||c.push(a.file);Q(c);let o=[],d=[];for(let n of l.unitFiles){if(n.file===s)continue;let a=N(n.file);o.includes(a)||o.push(a),n.kind==="module"&&d.push(S(n.file))}let m=[...c],p=n=>{k(n)&&m.push(n)};p(O(s)),m.push(r),p(D(s)),m.push(...v(T(s)));for(let n of o)p(h(n,"Result.md")),m.push(...v(h(n,".internal","steps")));for(let n of d)p(n);let f=G(m);if(k(h(f,b)))throw new u(`bundle sync: a real file named ${b} exists at the zip root (${f}) \u2014 it would collide with the generated manifest`);let w=m.map(n=>{let a=n===r&&t.identityOverride?Buffer.from(JSON.stringify({...JSON.parse(I(n,"utf8")),commit_id:t.identityOverride.commit_id},null,2)+`
3
3
  `):void 0,E=a??I(n);return{abs:n,rel:B(P(f,n)),sha256:q("sha256").update(E).digest("hex"),bytes:E.length,...a?{contents:a}:{}}}).sort((n,a)=>n.rel<a.rel?-1:1),x=B(P(f,s)),L={schema_version:2,entry:x,commit_id:t.identityOverride?.commit_id??i.commit_id,test_id:i.test_id,testcase_id:i.testcase_id??null,project_id:i.project_id??null,folder_id:i.folder_id??null,org_id:i.org_id??null,created_at:new Date().toISOString(),producer:{name:"kane-cli",version:A},files:w.map(n=>({path:n.rel,sha256:n.sha256,bytes:n.bytes})),units:l.unitFiles.filter(n=>n.file!==s).map(n=>({path:B(P(f,n.file)),kind:n.kind}))};return{zipRoot:f,entry:x,files:w,manifest:L}}var g=e=>e instanceof Error?e.message:String(e);function W(e){return new Promise((t,s)=>{let r=(0,C.default)("zip",{zlib:{level:6}}),i=[];r.on("data",l=>i.push(l)),r.on("error",s),r.on("end",()=>t(Buffer.concat(i))),r.append(JSON.stringify(e.manifest,null,2)+`
4
4
  `,{name:b});for(let l of e.files)l.contents?r.append(l.contents,{name:l.rel}):r.file(l.abs,{name:l.rel});r.finalize()})}async function X(e){let{plan:t,controller:s,testId:r,sessionId:i,commitId:l}=e,c;try{c=await W(t)}catch(d){return{ok:!1,stage:"zip",error:g(d)}}let o;try{let d={key:"testmd",content_type:"application/zip",filename:`${l}-testmd.zip`},p=(await s.getPresignedUrls(r,i,[d])).urls?.testmd?.upload_url;if(!p)return{ok:!1,stage:"presign",error:"presign response missing testmd upload_url"};o=p}catch(d){return{ok:!1,stage:"presign",error:g(d)}}try{await M(o,c,"application/zip")}catch(d){return{ok:!1,stage:"upload",error:g(d)}}return{ok:!0,bytes:c.length}}async function ee(e){let t;try{t=j(e.sourcePath,{identityOverride:e.identityOverride})}catch(s){return s instanceof u?{ok:!1,stage:"collect",error:s.message}:{ok:!1,stage:"collect",error:g(s)}}return X({...e,plan:t})}function ge(e){return e.shouldUploadPipeline&&e.uploadSucceeded&&!!e.metaCommitId&&!!e.metaTestId}function te(e){return e.persisted?e.uploadSucceeded?e.local?"local":e.hasBasicAuth?!e.metaCommitId||!e.metaTestId?"not_authored":null:"no_auth":"upload_failed":"not_persisted"}async function ye(e){let t=e.recordedTestPath??null,s=t?y(t):null,r=te({persisted:!!t,uploadSucceeded:e.uploadSucceeded,local:e.local,hasBasicAuth:!!e.basicAuth,metaCommitId:s?.commit_id,metaTestId:s?.test_id});if(r)return e.log("info","BUNDLE_SYNC_SKIPPED","testmd bundle sync skipped",{reason:r,...t?{path:t}:{}}),{skipped:r};let i=s.commit_id,l=s.test_id,c=o=>{try{e.onAgentEvent?.(o)}catch{}};try{let o=await(e.syncFn??ee)({sourcePath:t,testId:l,sessionId:e.sessionId,commitId:i,controller:new R(e.controllerBaseUrl,{username:e.basicAuth.username,accessKey:e.basicAuth.access_key})});return o.ok?(e.log("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:i,path:t,bytes:o.bytes}),c({type:"test_md_bundle_sync",status:"ok",commit_id:i,path:t,bytes:o.bytes})):(e.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:i,path:t,stage:o.stage,error:o.error}),c({type:"test_md_bundle_sync",status:"failed",commit_id:i,path:t,stage:o.stage})),o}catch(o){let d=g(o);return e.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{commit_id:i,path:t,error:d}),c({type:"test_md_bundle_sync",status:"failed",commit_id:i,path:t,stage:"upload"}),{ok:!1,stage:"upload",error:d}}}export{j as a,W as b,X as c,ee as d,ge as e,te as f,ye as g};
@@ -1,20 +1,20 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as ae}from"./chunk-MMBBQ4OZ.js";import{j as R}from"./chunk-O7U5BVX5.js";import{c as ie,e as ne,i as re,j as K}from"./chunk-Z7S3IWUX.js";import{d as $,e as oe}from"./chunk-4JOD47QI.js";import{a as se}from"./chunk-RZ4F3BHX.js";import{spawn as Xe}from"child_process";import{closeSync as ze,existsSync as Ge,mkdirSync as We,openSync as Ye,readFileSync as Ze,rmSync as Qe}from"fs";import{homedir as ge}from"os";import{dirname as z,join as A}from"path";import{access as Re,mkdir as de,readFile as Le}from"fs/promises";import{homedir as Ce}from"os";import{arch as Fe,platform as Be}from"process";import{join as _}from"path";var Ue=35,qe="google_apis",Ve="KaneCLI_Pixel_API35",He="KaneAI_Pixel_API35";function Ht(t){return t===He?Ve:t}var je=1;function Ke(t,e){return t==="darwin"&&e==="arm64"?"arm64-v8a":"x86_64"}function Je(){return{home:Ce(),os:Be,arch:Fe}}async function le(t){try{return await Re(t),!0}catch{return!1}}var J=class{deps;constructor(e={}){this.deps={...Je(),...e}}paths(){let e=_(this.deps.home,".testmuai","kaneai","mobile"),r=_(e,"android-sdk");return{root:r,emulatorDir:_(r,"emulator"),systemImageDir:_(r,"system-images",`android-${Ue}`,qe,Ke(this.deps.os,this.deps.arch)),avdHome:_(e,"avd"),manifest:_(r,"sdk-manifest.json")}}environment(){let e=this.paths();return{ANDROID_HOME:e.root,ANDROID_SDK_ROOT:e.root,ANDROID_AVD_HOME:e.avdHome}}async ensureSdkRootMarkers(){let e=this.paths().root;await de(_(e,"platforms"),{recursive:!0}),await de(_(e,"platform-tools"),{recursive:!0})}async status(){let e=this.paths(),r=null;try{r=JSON.parse(await Le(e.manifest,"utf8"))}catch{}if(!r||r.schemaVersion!==je)return{emulator:!1,systemImage:!1};let o=this.deps.os==="win32"?"emulator.exe":"emulator";return{emulator:!!r.components.emulator&&await le(_(e.emulatorDir,o)),systemImage:!!r.components.systemImage&&await le(_(e.systemImageDir,"system.img"))}}},ue;function F(){return ue??=new J,ue}var G="android",et="http://127.0.0.1:4723/status",tt=2e3,X=(()=>{let t=Number(process.env.KANE_CLI_EMULATOR_BOOT_TIMEOUT_MS);return Number.isFinite(t)&&t>=3e4?t:3e5})(),it=1e3,nt=3e5;var rt=5,ce="Run `kane-cli doctor --target emulator --install` to install the managed Appium tree.",st={device:"ready",unauthorized:"unauthorized",offline:"offline"};function ot(t){let e={};for(let r of t){let o=r.indexOf(":");o<=0||(e[r.slice(0,o)]=r.slice(o+1))}return e}function at(t){let e=[];for(let r of t.split(`
3
- `)){let o=r.trim();if(!o||o.startsWith("*"))continue;let u=o.toLowerCase();if(u.startsWith("list of devices")||u.startsWith("adb server"))continue;let g=o.split(/\s+/),f=g[0],v=g[1];if(!f||!v||!f.startsWith("emulator-"))continue;let b=ot(g.slice(2)),S=b.model?b.model.replace(/_/g," "):void 0;e.push({platform:G,kind:"emulator",id:f,displayName:S??f,state:st[v]??"offline"})}return e}function me(t){let e=[];for(let r of t.split(`
2
+ import{a as ae}from"./chunk-MMBBQ4OZ.js";import{j as R}from"./chunk-WBHSPN55.js";import{c as ie,e as ne,i as re,j as K}from"./chunk-Z7S3IWUX.js";import{d as $,e as oe}from"./chunk-4JOD47QI.js";import{a as se}from"./chunk-RZ4F3BHX.js";import{spawn as ze}from"child_process";import{closeSync as Xe,existsSync as Ge,mkdirSync as We,openSync as Ye,readFileSync as Ze,rmSync as Qe}from"fs";import{homedir as ge}from"os";import{dirname as X,join as S}from"path";import{access as Re,mkdir as de,readFile as Le}from"fs/promises";import{homedir as Ce}from"os";import{arch as Fe,platform as Be}from"process";import{join as M}from"path";var Ue=35,qe="google_apis",Ve="KaneCLI_Pixel_API35",He="KaneAI_Pixel_API35";function Ht(t){return t===He?Ve:t}var je=1;function Ke(t,e){return t==="darwin"&&e==="arm64"?"arm64-v8a":"x86_64"}function Je(){return{home:Ce(),os:Be,arch:Fe}}async function le(t){try{return await Re(t),!0}catch{return!1}}var J=class{deps;constructor(e={}){this.deps={...Je(),...e}}paths(){let e=M(this.deps.home,".testmuai","kaneai","mobile"),r=M(e,"android-sdk");return{root:r,emulatorDir:M(r,"emulator"),systemImageDir:M(r,"system-images",`android-${Ue}`,qe,Ke(this.deps.os,this.deps.arch)),avdHome:M(e,"avd"),manifest:M(r,"sdk-manifest.json")}}environment(){let e=this.paths();return{ANDROID_HOME:e.root,ANDROID_SDK_ROOT:e.root,ANDROID_AVD_HOME:e.avdHome}}async ensureSdkRootMarkers(){let e=this.paths().root;await de(M(e,"platforms"),{recursive:!0}),await de(M(e,"platform-tools"),{recursive:!0})}async status(){let e=this.paths(),r=null;try{r=JSON.parse(await Le(e.manifest,"utf8"))}catch{}if(!r||r.schemaVersion!==je)return{emulator:!1,systemImage:!1};let o=this.deps.os==="win32"?"emulator.exe":"emulator";return{emulator:!!r.components.emulator&&await le(M(e.emulatorDir,o)),systemImage:!!r.components.systemImage&&await le(M(e.systemImageDir,"system.img"))}}},ue;function B(){return ue??=new J,ue}var G="android",et="http://127.0.0.1:4723/status",tt=2e3,z=(()=>{let t=Number(process.env.KANE_CLI_EMULATOR_BOOT_TIMEOUT_MS);return Number.isFinite(t)&&t>=3e4?t:3e5})(),it=1e3,nt=3e5;var rt=5,ce="Run `kane-cli doctor --target emulator --install` to install the managed Appium tree.",st={device:"ready",unauthorized:"unauthorized",offline:"offline"};function ot(t){let e={};for(let r of t){let o=r.indexOf(":");o<=0||(e[r.slice(0,o)]=r.slice(o+1))}return e}function at(t){let e=[];for(let r of t.split(`
3
+ `)){let o=r.trim();if(!o||o.startsWith("*"))continue;let u=o.toLowerCase();if(u.startsWith("list of devices")||u.startsWith("adb server"))continue;let g=o.split(/\s+/),p=g[0],w=g[1];if(!p||!w)continue;let v=ot(g.slice(2)),x=/^(localhost|127\.0\.0\.1):\d{1,5}$/.test(p),P=/^[A-Za-z0-9._-]+:\d{1,5}$/.test(p),C=/^sdk_/.test(v.product??"")||/^sdk_/.test(v.model??"")||/^emu/.test(v.device??"");if(!p.startsWith("emulator-")&&!x&&!(P&&C))continue;let l=v.model?v.model.replace(/_/g," "):void 0;e.push({platform:G,kind:"emulator",id:p,displayName:l??p,state:st[w]??"offline"})}return e}function me(t){let e=[];for(let r of t.split(`
4
4
  `)){let o=r.trim();o&&/^[A-Za-z0-9._-]+$/.test(o)&&(e.includes(o)||e.push(o))}return e}function dt(t){for(let e of t.split(`
5
5
  `)){let r=e.trim();if(!(!r||r==="OK"))return r}}function lt(t){let e=/^Version\s+(\S+)/m.exec(t);return e?.[1]?e[1].split("-")[0]:/Android Debug Bridge version\s+(\S+)/.exec(t)?.[1]}function ut(t){let e=[];for(let r of t.split(`
6
6
  `)){let o=r.trim();if(!o.startsWith("package:"))continue;let u=o.slice(8).trim();u&&!e.includes(u)&&e.push(u)}return e.sort()}function ct(t){let e=Number(t.trim());return Number.isInteger(e)&&e>0?e:void 0}function mt(t){return[...new Set(t.split(",").map(e=>e.trim()).filter(Boolean))]}var pt=[{match:/INSTALL_FAILED_VERIFICATION|verif(?:ier|ication)/i,hint:`Package verification blocked the install. Disable it for adb installs:
7
7
  adb -s <device> shell settings put global verifier_verify_adb_installs 0`},{match:/INSTALL_FAILED_UPDATE_INCOMPATIBLE|INSTALL_FAILED_VERSION_DOWNGRADE|signatures do not match/i,hint:`A different build of this package is already installed. Uninstall it first:
8
- adb -s <device> uninstall <package>`},{match:/INSUFFICIENT_STORAGE/i,hint:"The device is out of storage. Free space on the device and retry."}];function ft(t){for(let{match:e,hint:r}of pt)if(e.test(t))return r}function W(t,e,r=rt){let o=t.toLowerCase(),u=e.filter(v=>v.toLowerCase().includes(o)),g=Math.max(6,Math.floor(o.length/2)),f=e.filter(v=>!u.includes(v)&&gt(v.toLowerCase(),o)>=g);return[...u,...f].slice(0,r)}function gt(t,e){let r=Math.min(t.length,e.length),o=0;for(;o<r&&t[o]===e[o];)o++;return o}function ht(t){if(!t)return;let e=/^image\.sysdir\.\d+\s*=.*?android-(\d+)/m.exec(t),r=e?.[1]?Number(e[1]):NaN;return Number.isInteger(r)&&r>0?r:void 0}var vt={36:"16",35:"15",34:"14",33:"13",32:"12",31:"12",30:"11",29:"10",28:"9",27:"8.1",26:"8.0",25:"7.1",24:"7.0",23:"6.0",22:"5.1",21:"5.0"};function wt(t){return t===void 0?void 0:vt[t]}function pe(t){let e=bt(t),r=ht(t),o=wt(r);return{...e?{modelIdentifier:e}:{},...r!==void 0?{androidApiLevel:r}:{},...o?{osVersion:o}:{}}}function bt(t){return t&&/^hw\.device\.name\s*=\s*(.+)\s*$/m.exec(t)?.[1]?.trim()||void 0}function yt(){return se(et,{signal:AbortSignal.timeout(tt)}).then(t=>t.ok,()=>!1)}function fe(t){return A(ge(),".testmuai","kaneai","mobile",`emulator-${t}.log`)}function At(t,e,r,o){let u="ignore";if(o)try{We(z(o),{recursive:!0}),u=Ye(o,"w")}catch{u="ignore"}if(Xe(t,e,{stdio:["ignore",u,u],detached:!0,...r?{env:{...process.env,...r}}:{}}).unref(),typeof u=="number")try{ze(u)}catch{}}function q(t){try{return Ze(t,"utf8")}catch{return}}function he(t){try{Qe(t,{force:!0})}catch{}}async function ve(t){if(process.platform==="win32"){let o=await $("tasklist",["/FI",`PID eq ${t}`,"/FO","CSV","/NH"],{timeoutMs:5e3});return o.code===0&&o.stdout.trim()!==""?o.stdout:void 0}let e=await $("ps",["-p",String(t),"-o","command="],{timeoutMs:5e3}),r=e.stdout.trim();return e.code===0&&r!==""?r:void 0}function St(){return{exec:$,spawnDetached:At,readFileIfAny:q,removeFile:he,processCommand:ve,fileExists:Ge,env:process.env,home:ge(),os:process.platform,probeAppiumServer:yt,now:()=>Date.now(),sleep:oe,mobileDeps:{status:t=>R().status(t),environment:t=>R().environment(t)},sdkSuite:{status:()=>F().status(),environment:()=>F().environment(),emulatorPath:()=>{let t=F().paths().emulatorDir;return A(t,process.platform==="win32"?"emulator.exe":"emulator")},ensureSdkRootMarkers:()=>F().ensureSdkRootMarkers()}}}function we(t={}){let e={...St(),...t},r={},o=new Set;function u(i){return e.os==="win32"?`${i}.exe`:i}function g(i){if(e.readAvdConfig)return e.readAvdConfig(i);let n=f(i);if(n)return(e.readFileIfAny??q)(A(n,"config.ini"))}function f(i){let n=[e.env.ANDROID_AVD_HOME,A(e.home,".android","avd"),e.sdkSuite.environment().ANDROID_AVD_HOME];for(let s of n){if(!s)continue;let a=A(s,`${i}.avd`);if(e.fileExists(A(a,"config.ini")))return a}}let v=["hardware-qemu.ini.lock","multiinstance.lock"];async function b(i){let n=f(i);if(!n)return{state:"free"};let s=v.map(h=>A(n,h)).filter(h=>e.fileExists(h));if(s.length===0)return{state:"free"};let d=(e.readFileIfAny??q)(A(n,"hardware-qemu.ini.lock")),c=Number(String(d??"").replace(/\0/g,"").trim());if(Number.isInteger(c)&&c>0){let h=await(e.processCommand??ve)(c);if(h&&/qemu|emulator/i.test(h))return{state:"held",pid:c}}return{state:"stale",paths:s}}function S(){return e.os==="win32"?"appium.cmd":"appium"}function I(){let i=[];for(let n of["ANDROID_HOME","ANDROID_SDK_ROOT"]){let s=e.env[n];s&&s.trim()!==""&&i.push(s.trim())}return e.os==="darwin"?i.push(A(e.home,"Library","Android","sdk")):e.os==="win32"?i.push(A(e.home,"AppData","Local","Android","Sdk")):i.push(A(e.home,"Android","Sdk")),i}function H(i){let n=i==="adb"?"platform-tools":"emulator";return I().map(s=>A(s,n,u(i)))}async function l(i){let n=e.os==="win32"?"where":"which",s=await e.exec(n,[u(i)],{timeoutMs:5e3});if(s.code!==0)return null;let a=s.stdout.split(`
8
+ adb -s <device> uninstall <package>`},{match:/INSUFFICIENT_STORAGE/i,hint:"The device is out of storage. Free space on the device and retry."}];function ft(t){for(let{match:e,hint:r}of pt)if(e.test(t))return r}function W(t,e,r=rt){let o=t.toLowerCase(),u=e.filter(w=>w.toLowerCase().includes(o)),g=Math.max(6,Math.floor(o.length/2)),p=e.filter(w=>!u.includes(w)&&gt(w.toLowerCase(),o)>=g);return[...u,...p].slice(0,r)}function gt(t,e){let r=Math.min(t.length,e.length),o=0;for(;o<r&&t[o]===e[o];)o++;return o}function ht(t){if(!t)return;let e=/^image\.sysdir\.\d+\s*=.*?android-(\d+)/m.exec(t),r=e?.[1]?Number(e[1]):NaN;return Number.isInteger(r)&&r>0?r:void 0}var vt={36:"16",35:"15",34:"14",33:"13",32:"12",31:"12",30:"11",29:"10",28:"9",27:"8.1",26:"8.0",25:"7.1",24:"7.0",23:"6.0",22:"5.1",21:"5.0"};function wt(t){return t===void 0?void 0:vt[t]}function pe(t){let e=bt(t),r=ht(t),o=wt(r);return{...e?{modelIdentifier:e}:{},...r!==void 0?{androidApiLevel:r}:{},...o?{osVersion:o}:{}}}function bt(t){return t&&/^hw\.device\.name\s*=\s*(.+)\s*$/m.exec(t)?.[1]?.trim()||void 0}function yt(){return se(et,{signal:AbortSignal.timeout(tt)}).then(t=>t.ok,()=>!1)}function fe(t){return S(ge(),".testmuai","kaneai","mobile",`emulator-${t}.log`)}function At(t,e,r,o){let u="ignore";if(o)try{We(X(o),{recursive:!0}),u=Ye(o,"w")}catch{u="ignore"}if(ze(t,e,{stdio:["ignore",u,u],detached:!0,...r?{env:{...process.env,...r}}:{}}).unref(),typeof u=="number")try{Xe(u)}catch{}}function V(t){try{return Ze(t,"utf8")}catch{return}}function he(t){try{Qe(t,{force:!0})}catch{}}async function ve(t){if(process.platform==="win32"){let o=await $("tasklist",["/FI",`PID eq ${t}`,"/FO","CSV","/NH"],{timeoutMs:5e3});return o.code===0&&o.stdout.trim()!==""?o.stdout:void 0}let e=await $("ps",["-p",String(t),"-o","command="],{timeoutMs:5e3}),r=e.stdout.trim();return e.code===0&&r!==""?r:void 0}function St(){return{exec:$,spawnDetached:At,readFileIfAny:V,removeFile:he,processCommand:ve,fileExists:Ge,env:process.env,home:ge(),os:process.platform,probeAppiumServer:yt,now:()=>Date.now(),sleep:oe,mobileDeps:{status:t=>R().status(t),environment:t=>R().environment(t)},sdkSuite:{status:()=>B().status(),environment:()=>B().environment(),emulatorPath:()=>{let t=B().paths().emulatorDir;return S(t,process.platform==="win32"?"emulator.exe":"emulator")},ensureSdkRootMarkers:()=>B().ensureSdkRootMarkers()}}}function we(t={}){let e={...St(),...t},r={},o=new Set;function u(i){return e.os==="win32"?`${i}.exe`:i}function g(i){if(e.readAvdConfig)return e.readAvdConfig(i);let n=p(i);if(n)return(e.readFileIfAny??V)(S(n,"config.ini"))}function p(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`);if(e.fileExists(S(a,"config.ini")))return a}}let w=["hardware-qemu.ini.lock","multiinstance.lock"];async function v(i){let n=p(i);if(!n)return{state:"free"};let s=w.map(h=>S(n,h)).filter(h=>e.fileExists(h));if(s.length===0)return{state:"free"};let d=(e.readFileIfAny??V)(S(n,"hardware-qemu.ini.lock")),c=Number(String(d??"").replace(/\0/g,"").trim());if(Number.isInteger(c)&&c>0){let h=await(e.processCommand??ve)(c);if(h&&/qemu|emulator/i.test(h))return{state:"held",pid:c}}return{state:"stale",paths:s}}function x(){return e.os==="win32"?"appium.cmd":"appium"}function P(){let i=[];for(let n of["ANDROID_HOME","ANDROID_SDK_ROOT"]){let s=e.env[n];s&&s.trim()!==""&&i.push(s.trim())}return e.os==="darwin"?i.push(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 C(i){let n=i==="adb"?"platform-tools":"emulator";return P().map(s=>S(s,n,u(i)))}async function l(i){let n=e.os==="win32"?"where":"which",s=await e.exec(n,[u(i)],{timeoutMs:5e3});if(s.code!==0)return null;let a=s.stdout.split(`
9
9
  `)[0]?.trim();return a&&a!==""?a:null}async function m(i){let n=await e.exec(i,["-version"],{timeoutMs:1e4});return/Android emulator version/i.test(`${n.stdout}
10
- ${n.stderr}`)}async function p(i){if(i==="adb"){let n=ae(e.env);if(n){let a=A(n.platformToolsDir,u("adb"));if(e.fileExists(a)){let d={path:a,source:"sdk"};return r[i]=d,d}return delete r[i],null}if((await e.mobileDeps.status("emulator")).installed){let a=await e.mobileDeps.environment("emulator");if(a.platformToolsDir){let d={path:A(a.platformToolsDir,u("adb")),source:"local"};return r[i]=d,d}}return delete r[i],null}if(i==="emulator"){if((await e.sdkSuite.status()).emulator){let d={path:e.sdkSuite.emulatorPath(),source:"local"};return r[i]=d,d}let s=H(i).filter(d=>e.fileExists(d)),a=await l(i);a&&!s.includes(a)&&s.push(a);for(let d of s){if(!await m(d))continue;let c={path:d,source:"sdk"};return r[i]=c,c}}return delete r[i],null}async function w(){let i=await p("adb");if(!i)throw new Error("Managed adb is not installed.\nRun `kane-cli doctor --target emulator --install` to install the pinned Android platform-tools.");return i.path}async function D(i){let n=await e.exec(i,["devices","-l"],{timeoutMs:2e4});return at(n.stdout)}async function y(i,n){let s=await e.exec(i,["-s",n,"shell","getprop","ro.boot.qemu.avd_name"],{timeoutMs:1e4});if(s.code===0){let d=s.stdout.split(`
11
- `)[0]?.trim();if(d)return d}let a=await e.exec(i,["-s",n,"emu","avd","name"],{timeoutMs:1e4});if(a.code===0)return dt(a.stdout)}async function E(i){let n=await p("emulator");if(!n)return[];let s=await e.exec(n.path,["-list-avds"],{timeoutMs:2e4}),a=s.code===0?me(s.stdout):[];if(o.clear(),(await e.sdkSuite.status()).emulator){let c=await e.exec(n.path,["-list-avds"],{timeoutMs:2e4,env:{...e.env,...e.sdkSuite.environment()}});if(c.code===0)for(let h of me(c.stdout))o.add(h),a.includes(h)||a.push(h)}return a.filter(c=>!i.has(c)).map(c=>({platform:G,kind:"emulator",id:c,displayName:c,state:"stopped",virtualName:c,...pe(g(c))}))}async function M(){let i=await p("adb");if(!i)return[];let n=await D(i.path),s=new Set;for(let d of n){if(d.kind!=="emulator"||d.state!=="ready")continue;let c=await y(i.path,d.id);c&&(d.virtualName=c,d.displayName=c,Object.assign(d,pe(g(c))),s.add(c))}let a=await E(s);return[...n,...a]}function C(i){let n=(e.readFileIfAny??q)(i);if(!n)return;let s=n.split(/\r?\n/).find(a=>/^FATAL\b/.test(a.trim()));return s?s.replace(/^FATAL\s*\|\s*/,"").trim():void 0}function j(i,n,s){let a=[`${i} could not start: ${n}`];return/multiple emulators with the same AVD/i.test(n)&&a.push(`Another emulator is already using ${i}. Close it (or quit the Android`,"Emulator app), then retry \u2014 kane-cli clears the lock a killed emulator","leaves behind, but it will not take an AVD away from a live one."),a.push(`Full output: ${s}`),a.join(`
12
- `)}function De(i,n){return[`${i} did not finish booting within ${X/1e3}s.`,n?`It attached as ${n} but never reported sys.boot_completed=1.`:"It never attached to adb.",`Its own output: ${fe(i)}`,"The emulator process may still be running \u2014 check its window for errors.","Common causes: no hardware acceleration (install the Android Emulator","hypervisor driver / enable KVM); a corrupt AVD (recreate it in Android","Studio's Device Manager); or a boot that is merely slow \u2014 software GL","rendering under memory pressure can exceed",`${X/1e3}s on a loaded machine (raise it with`,"KANE_CLI_EMULATOR_BOOT_TIMEOUT_MS)."].join(`
13
- `)}async function Te(i,n,s){let a=await p("emulator");if(!a)throw new Error("The Android `emulator` binary was not found, so AVDs cannot be booted.\nInstall it via Android Studio's SDK Manager (Android Emulator) and set ANDROID_HOME.");let d=new Set((await D(i)).map(P=>P.id)),c=o.has(n);c&&await e.sdkSuite.ensureSdkRootMarkers();let h=c?{...e.env,...e.sdkSuite.environment()}:void 0,x=await b(n);if(x.state==="stale"){s?.(`clearing a stale lock left by a previous ${n} emulator\u2026`);for(let P of x.paths)(e.removeFile??he)(P)}let T=fe(n);x.state==="held"?s?.(`${n} is already starting (pid ${x.pid}) \u2014 waiting for it\u2026`):(e.spawnDetached(a.path,["-avd",n],h,T),s?.(`booting ${n}\u2026 (log: ${T})`));let B=async()=>{let P=await D(i),te=P.find(N=>N.kind==="emulator"&&!d.has(N.id));if(te)return te.id;for(let N of P)if(!(N.kind!=="emulator"||N.state!=="ready")&&await y(i,N.id)===n)return N.id},U=x.state!=="held",O=e.now()+X,k=await B();for(k&&s?.(`${n} attached as ${k}, waiting for boot\u2026`);e.now()<O;){if(k&&(await e.exec(i,["-s",k,"shell","getprop","sys.boot_completed"],{timeoutMs:1e4})).stdout.trim()==="1")return k;if(await e.sleep(it),U){let P=C(T);if(P)throw new Error(j(n,P,T))}k||(k=await B(),k&&s?.(`${n} attached as ${k}, waiting for boot\u2026`))}throw new Error(De(n,k))}async function Pe(i,n){let s=await w();if(i.state==="ready")return Q(i,s);if(i.state==="unauthorized")throw new Error(`${i.displayName} (${i.id}) is UNAUTHORIZED. Accept the USB-debugging prompt on the device, then retry.`);if(i.state==="offline")throw new Error(`${i.displayName} (${i.id}) is offline. Reconnect it (USB) or re-run \`adb connect ${i.id}\` (wireless), then retry.`);let a=i.virtualName??i.id,d=await Te(s,a,n);return Q({...i,kind:"emulator",id:d,displayName:a,state:"ready",virtualName:a},s)}async function Q(i,n){let[s,a,d,c]=await Promise.all([e.exec(n,["-s",i.id,"shell","getprop","ro.build.version.sdk"],{timeoutMs:1e4}),e.exec(n,["-s",i.id,"shell","getprop","ro.build.version.release"],{timeoutMs:1e4}),e.exec(n,["-s",i.id,"shell","getprop","ro.product.cpu.abilist"],{timeoutMs:1e4}),e.exec(n,["-s",i.id,"shell","getprop","ro.product.cpu.abi"],{timeoutMs:1e4})]),h=s.code===0?ct(s.stdout):void 0,x=a.code===0?a.stdout.trim():"",T=mt(d.code===0&&d.stdout.trim()!==""?d.stdout:c.stdout);return{...i,...h!==void 0?{androidApiLevel:h}:{},...x!==""?{osVersion:x}:{},...T.length>0?{androidAbis:T}:{}}}async function ee(i){let n=await w(),s=await e.exec(n,["-s",i.id,"shell","pm","list","packages","-3"],{timeoutMs:3e4});if(s.code!==0)throw new Error(`Could not list installed packages on ${i.id}: ${s.stderr.trim()||`adb exited ${s.code}`}`);return ut(s.stdout)}async function _e(i){let n;try{let{default:s}=await import("./adbkit-apkreader-ORZBGCJQ.js");n=(await(await s.open(i)).readManifest())?.package}catch(s){let a=s instanceof Error?s.message:String(s);throw new Error(`Could not read the package name from ${i} (${a}).
10
+ ${n.stderr}`)}async function f(i){if(i==="adb"){let n=ae(e.env);if(n){let a=S(n.platformToolsDir,u("adb"));if(e.fileExists(a)){let d={path:a,source:"sdk"};return r[i]=d,d}return delete r[i],null}if((await e.mobileDeps.status("emulator")).installed){let a=await e.mobileDeps.environment("emulator");if(a.platformToolsDir){let d={path:S(a.platformToolsDir,u("adb")),source:"local"};return r[i]=d,d}}return delete r[i],null}if(i==="emulator"){if((await e.sdkSuite.status()).emulator){let d={path:e.sdkSuite.emulatorPath(),source:"local"};return r[i]=d,d}let s=C(i).filter(d=>e.fileExists(d)),a=await l(i);a&&!s.includes(a)&&s.push(a);for(let d of s){if(!await m(d))continue;let c={path:d,source:"sdk"};return r[i]=c,c}}return delete r[i],null}async function b(){let i=await f("adb");if(!i)throw new Error("Managed adb is not installed.\nRun `kane-cli doctor --target emulator --install` to install the pinned Android platform-tools.");return i.path}async function D(i){let n=await e.exec(i,["devices","-l"],{timeoutMs:2e4});return at(n.stdout)}async function y(i,n){let s=await e.exec(i,["-s",n,"shell","getprop","ro.boot.qemu.avd_name"],{timeoutMs:1e4});if(s.code===0){let d=s.stdout.split(`
11
+ `)[0]?.trim();if(d)return d}let a=await e.exec(i,["-s",n,"emu","avd","name"],{timeoutMs:1e4});if(a.code===0)return dt(a.stdout)}async function E(i){let n=await f("emulator");if(!n)return[];let s=await e.exec(n.path,["-list-avds"],{timeoutMs:2e4}),a=s.code===0?me(s.stdout):[];if(o.clear(),(await e.sdkSuite.status()).emulator){let c=await e.exec(n.path,["-list-avds"],{timeoutMs:2e4,env:{...e.env,...e.sdkSuite.environment()}});if(c.code===0)for(let h of me(c.stdout))o.add(h),a.includes(h)||a.push(h)}return a.filter(c=>!i.has(c)).map(c=>({platform:G,kind:"emulator",id:c,displayName:c,state:"stopped",virtualName:c,...pe(g(c))}))}async function I(){let i=await f("adb");if(!i)return[];let n=await D(i.path),s=new Set;for(let d of n){if(d.kind!=="emulator"||d.state!=="ready")continue;let c=await y(i.path,d.id);if(c&&(d.virtualName=c,d.displayName=c,Object.assign(d,pe(g(c))),s.add(c)),!d.osVersion&&d.state==="ready"){let h=await e.exec(i.path,["-s",d.id,"shell","getprop","ro.build.version.release"],{timeoutMs:1e4}),A=h.code===0?h.stdout.trim():"";A!==""&&(d.osVersion=A)}}let a=await E(s);return[...n,...a]}function F(i){let n=(e.readFileIfAny??V)(i);if(!n)return;let s=n.split(/\r?\n/).find(a=>/^FATAL\b/.test(a.trim()));return s?s.replace(/^FATAL\s*\|\s*/,"").trim():void 0}function j(i,n,s){let a=[`${i} could not start: ${n}`];return/multiple emulators with the same AVD/i.test(n)&&a.push(`Another emulator is already using ${i}. Close it (or quit the Android`,"Emulator app), then retry \u2014 kane-cli clears the lock a killed emulator","leaves behind, but it will not take an AVD away from a live one."),a.push(`Full output: ${s}`),a.join(`
12
+ `)}function De(i,n){return[`${i} did not finish booting within ${z/1e3}s.`,n?`It attached as ${n} but never reported sys.boot_completed=1.`:"It never attached to adb.",`Its own output: ${fe(i)}`,"The emulator process may still be running \u2014 check its window for errors.","Common causes: no hardware acceleration (install the Android Emulator","hypervisor driver / enable KVM); a corrupt AVD (recreate it in Android","Studio's Device Manager); or a boot that is merely slow \u2014 software GL","rendering under memory pressure can exceed",`${z/1e3}s on a loaded machine (raise it with`,"KANE_CLI_EMULATOR_BOOT_TIMEOUT_MS)."].join(`
13
+ `)}async function Te(i,n,s){let a=await f("emulator");if(!a)throw new Error("The Android `emulator` binary was not found, so AVDs cannot be booted.\nInstall it via Android Studio's SDK Manager (Android Emulator) and set ANDROID_HOME.");let d=new Set((await D(i)).map(_=>_.id)),c=o.has(n);c&&await e.sdkSuite.ensureSdkRootMarkers();let h=c?{...e.env,...e.sdkSuite.environment()}:void 0,A=await v(n);if(A.state==="stale"){s?.(`clearing a stale lock left by a previous ${n} emulator\u2026`);for(let _ of A.paths)(e.removeFile??he)(_)}let T=fe(n);A.state==="held"?s?.(`${n} is already starting (pid ${A.pid}) \u2014 waiting for it\u2026`):(e.spawnDetached(a.path,["-avd",n],h,T),s?.(`booting ${n}\u2026 (log: ${T})`));let U=async()=>{let _=await D(i),te=_.find(N=>N.kind==="emulator"&&!d.has(N.id));if(te)return te.id;for(let N of _)if(!(N.kind!=="emulator"||N.state!=="ready")&&await y(i,N.id)===n)return N.id},q=A.state!=="held",O=e.now()+z,k=await U();for(k&&s?.(`${n} attached as ${k}, waiting for boot\u2026`);e.now()<O;){if(k&&(await e.exec(i,["-s",k,"shell","getprop","sys.boot_completed"],{timeoutMs:1e4})).stdout.trim()==="1")return k;if(await e.sleep(it),q){let _=F(T);if(_)throw new Error(j(n,_,T))}k||(k=await U(),k&&s?.(`${n} attached as ${k}, waiting for boot\u2026`))}throw new Error(De(n,k))}async function Pe(i,n){let s=await b();if(i.state==="ready")return Q(i,s);if(i.state==="unauthorized")throw new Error(`${i.displayName} (${i.id}) is UNAUTHORIZED. Accept the USB-debugging prompt on the device, then retry.`);if(i.state==="offline")throw new Error(`${i.displayName} (${i.id}) is offline. Reconnect it (USB) or re-run \`adb connect ${i.id}\` (wireless), then retry.`);let a=i.virtualName??i.id,d=await Te(s,a,n);return Q({...i,kind:"emulator",id:d,displayName:a,state:"ready",virtualName:a},s)}async function Q(i,n){let[s,a,d,c]=await Promise.all([e.exec(n,["-s",i.id,"shell","getprop","ro.build.version.sdk"],{timeoutMs:1e4}),e.exec(n,["-s",i.id,"shell","getprop","ro.build.version.release"],{timeoutMs:1e4}),e.exec(n,["-s",i.id,"shell","getprop","ro.product.cpu.abilist"],{timeoutMs:1e4}),e.exec(n,["-s",i.id,"shell","getprop","ro.product.cpu.abi"],{timeoutMs:1e4})]),h=s.code===0?ct(s.stdout):void 0,A=a.code===0?a.stdout.trim():"",T=mt(d.code===0&&d.stdout.trim()!==""?d.stdout:c.stdout);return{...i,...h!==void 0?{androidApiLevel:h}:{},...A!==""?{osVersion:A}:{},...T.length>0?{androidAbis:T}:{}}}async function ee(i){let n=await b(),s=await e.exec(n,["-s",i.id,"shell","pm","list","packages","-3"],{timeoutMs:3e4});if(s.code!==0)throw new Error(`Could not list installed packages on ${i.id}: ${s.stderr.trim()||`adb exited ${s.code}`}`);return ut(s.stdout)}async function _e(i){let n;try{let{default:s}=await import("./adbkit-apkreader-ORZBGCJQ.js");n=(await(await s.open(i)).readManifest())?.package}catch(s){let a=s instanceof Error?s.message:String(s);throw new Error(`Could not read the package name from ${i} (${a}).
14
14
  Pass the package name explicitly with --app <package>.`)}if(typeof n!="string"||n.trim()==="")throw new Error(`${i} has no package name in its manifest.
15
- Pass the package name explicitly with --app <package>.`);return n.trim()}async function Me(i,n,s){let a=await w();s?.(`installing ${n} on ${i.id}\u2026`);let d=await e.exec(a,["-s",i.id,"install","-r",n],{timeoutMs:nt}),c=`${d.stdout}
16
- ${d.stderr}`;if(d.code===0&&!/\bFailure\b/i.test(c))return;let h=ft(c),x=[`Installing ${n} on ${i.id} failed (adb exited ${d.code}).`,c.trim()];throw h&&x.push("",h),new Error(x.filter(T=>T!=="").join(`
15
+ Pass the package name explicitly with --app <package>.`);return n.trim()}async function Me(i,n,s){let a=await b();s?.(`installing ${n} on ${i.id}\u2026`);let d=await e.exec(a,["-s",i.id,"install","-r",n],{timeoutMs:nt}),c=`${d.stdout}
16
+ ${d.stderr}`;if(d.code===0&&!/\bFailure\b/i.test(c))return;let h=ft(c),A=[`Installing ${n} on ${i.id} failed (adb exited ${d.code}).`,c.trim()];throw h&&A.push("",h),new Error(A.filter(T=>T!=="").join(`
17
17
  `))}async function Ie(i,n,s){if(n.kind==="package"){let a=await ee(i);if(a.includes(n.value))return n.value;let d=W(n.value,a),c=[`${n.value} is not installed on ${i.displayName} (${i.id}).`];throw d.length>0?c.push("Close matches:",...d.map(h=>` ${h}`)):c.push("Pass a local .apk path to --app to install it instead."),new Error(c.join(`
18
- `))}if(n.kind!=="apk"){let a=n.kind==="aab"?"Android app bundles are not directly installable; build an APK first.":n.kind==="apks"?"Split bundles are not supported yet.":`${n.kind} artifacts are not installable on Android.`;throw new Error(a)}return await Me(i,n.value,s),_e(n.value)}async function $e(){let i=await e.mobileDeps.status("emulator");return i.installed?{status:i,env:await e.mobileDeps.environment("emulator")}:null}async function Ee(i={}){let n=[],s=await $e(),a=await e.mobileDeps.status("emulator"),d=await p("adb");if(d){let O=await e.exec(d.path,["version"],{timeoutMs:1e4}),k=lt(O.stdout);n.push({id:"android.adb",fixedByBundle:!0,label:"adb",required:!0,status:"pass",detail:k?`platform-tools ${k} \xB7 ${d.path}`:d.path})}else n.push({id:"android.adb",fixedByBundle:!0,label:"adb",required:!0,status:"fail",detail:a.corrupt??"managed mobile dependencies are not installed",fixText:"Run `kane-cli doctor --target emulator --install` to download the managed mobile deps bundle under ~/.testmuai/kaneai/mobile."});let c=!i.appiumUrl;s?.env.appiumHome?n.push({id:"android.appium",fixedByBundle:!0,label:"Appium",required:c,status:"pass",detail:A(z(s.env.appiumHome),"appium","node_modules",".bin",S())}):n.push({id:"android.appium",fixedByBundle:!0,label:"Appium",required:c,status:c?"fail":"info",detail:i.appiumUrl?`managed Appium not required because --appium-url is set (${i.appiumUrl})`:a.corrupt??"managed Appium is not installed",...c?{fixText:ce}:{}}),n.push({id:"android.uiautomator2",fixedByBundle:!0,label:"uiautomator2 driver",required:c,status:s?"pass":c?"fail":"info",detail:s?"bundled in the managed mobile deps":i.appiumUrl?"managed driver not required because --appium-url is set":"not installed in the managed deps tree",...s||!c?{}:{fixText:ce}});let h=A(e.home,".testmuai","kaneai","mobile","trees");e.fileExists(h)&&n.push({id:"android.legacy-trees",label:"legacy toolchain trees",required:!1,status:"info",detail:`${h} predates the deps bundle \u2014 removed automatically by the next bundle install`});let x=await l("adb");x&&n.push({id:"android.system-adb",label:"system adb",required:!1,status:"info",detail:`${x} (ignored; managed adb always wins and may restart its server)`});let T=await l("appium");T&&n.push({id:"android.system-appium",label:"system Appium",required:!1,status:"info",detail:`${T} (ignored; managed Appium always wins)`});let B=await e.sdkSuite.status(),U=await p("emulator");if(B.emulator?n.push({id:"android.emulator",label:"emulator",required:!1,status:"pass",detail:`managed emulator \xB7 ${e.sdkSuite.emulatorPath()}`}):U?n.push({id:"android.emulator",label:"emulator",required:!1,status:"info",detail:`${U.path} (system install)`}):n.push({id:"android.emulator",label:"emulator",required:!1,status:"info",detail:"not installed, so stopped AVDs are not listed. Install it with the Android SDK (Android Studio \u2192 SDK Manager \u2192 Android Emulator)."}),e.os==="darwin"){let O=await e.exec("sysctl",["-n","kern.hv_support"],{timeoutMs:5e3});n.push({id:"android.virtualization",label:"virtualization",required:!1,status:"info",detail:O.code===0&&O.stdout.trim()==="1"?"Hypervisor.framework available":"Hypervisor.framework not reported \u2014 emulator boots may hang"})}else e.os==="linux"?n.push({id:"android.virtualization",label:"virtualization",required:!1,status:"info",detail:e.fileExists("/dev/kvm")?"/dev/kvm present":"/dev/kvm missing \u2014 enable KVM or emulator boots will hang"}):n.push({id:"android.virtualization",label:"virtualization",required:!1,status:"info",detail:"not checked on this host"});return n}async function Ne(i){let n=await e.mobileDeps.environment("emulator"),s=[...n.dirs],a=r.emulator,d=a?.source==="sdk"?z(a.path):void 0;return d&&!s.includes(d)&&s.push(d),{...n,dirs:s}}async function Oe(i,n){let s=await w(),a=[];return n.appPackage&&a.push({label:`closing ${n.appPackage}`,file:s,args:["-s",i.id,"shell","am","force-stop",n.appPackage]}),n.shutdown&&a.push({label:`shutting down ${i.displayName}`,file:s,args:["-s",i.id,"emu","kill"]}),a}return{platform:G,available:()=>!0,checks:Ee,discover:M,prepare:Pe,listApps:ee,ensureApp:Ie,teardownPlan:Oe,toolEnv:Ne}}import{mkdtemp as be,readdir as xt,rm as ye,writeFile as kt}from"fs/promises";import{tmpdir as Ae}from"os";import{join as L}from"path";var Se="ios",Dt=12e4,Tt=3e5,Pt="an .ipa cannot be installed on a simulator \u2014 use a .zip of the .app build";function _t(t){let e=/\.iOS-(\d+)-(\d+)$/.exec(t);return e?`${e[1]}.${e[2]}`:void 0}function Mt(t){let e;try{e=JSON.parse(t)}catch{return[]}let r=[];for(let[o,u]of Object.entries(e.devices??{})){let g=_t(o);for(let f of u??[]){let v=typeof f.udid=="string"?f.udid:void 0,b=typeof f.name=="string"?f.name:void 0;if(!v||!b)continue;let S=f.state==="Booted"?"ready":f.state==="Shutdown"?"stopped":"offline",I=typeof f.deviceTypeIdentifier=="string"?f.deviceTypeIdentifier.replace(/^com\.apple\.CoreSimulator\.SimDeviceType\./,""):void 0;r.push({platform:Se,kind:"simulator",id:v,displayName:b,state:S,virtualName:b,...g?{osVersion:g}:{},...I?{modelIdentifier:I}:{}})}}return r}function It(t){let e;try{e=JSON.parse(t)}catch{return[]}let r=[];for(let[o,u]of Object.entries(e)){if(u?.ApplicationType!=="User")continue;let g=u.CFBundleIdentifier??o;r.includes(g)||r.push(g)}return r.sort()}function $t(t){let e;try{e=JSON.parse(t)}catch{return[]}let r=[];for(let[o,u]of Object.entries(e)){let g=u?.CFBundleIdentifier??o;g&&!r.includes(g)&&r.push(g)}return r.sort()}var Y=16;function Et(t){return/^Xcode (\d+(?:\.\d+)*)/m.exec(t)?.[1]}async function Nt(t){let e=await be(L(Ae(),"kane-app-unzip-")),r=()=>ye(e,{recursive:!0,force:!0}),o=await $("unzip",["-q",t,"-d",e],{timeoutMs:10*6e4});if(o.code!==0)throw await r(),new Error(`Could not unpack ${t}: ${o.stderr.trim()||`unzip exited ${o.code}`}`);for(let u of[e,L(e,"Payload")]){let g;try{g=await xt(u)}catch{continue}let f=g.find(v=>v.toLowerCase().endsWith(".app"));if(f)return{appPath:L(u,f),cleanup:r}}throw await r(),new Error(`${t} does not contain a .app bundle.`)}async function Ot(t){let e=await be(L(Ae(),"kane-plist-"));try{let r=L(e,"input.plist");await kt(r,t);let o=await $("plutil",["-convert","json","-o","-",r],{timeoutMs:15e3});if(o.code!==0)throw new Error(`plutil could not convert simctl output: ${o.stderr.trim()}`);return o.stdout}finally{await ye(e,{recursive:!0,force:!0})}}function Rt(){return{exec:$,os:process.platform,convertPlistToJson:Ot,mobileDeps:{status:()=>R().status("simulator"),environment:()=>R().environment("simulator")}}}function xe(t={}){let e={...Rt(),...t};async function r(l,m=3e4){return e.exec("xcrun",["simctl",...l],{timeoutMs:m})}async function o(){let l=await r(["list","devices","available","--json"]);return l.code!==0?[]:Mt(l.stdout)}async function u(){return o()}async function g(l,m){let p=await e.exec("open",["-a","Simulator","--args","-CurrentDeviceUDID",l],{timeoutMs:15e3});p.code!==0&&m?.(`could not open Simulator.app (${p.stderr.trim()||`exit ${p.code}`}); the device is booted and the run continues headless`)}async function f(l,m){if(l.state!=="ready"&&l.state!=="stopped")throw new Error(`${l.displayName} (${l.id}) is ${l.state}; open Simulator.app to inspect it, then retry.`);l.kind==="simulator"&&await g(l.id,m),l.state==="stopped"&&m?.(`booting ${l.displayName}\u2026`);let p=await r(["bootstatus",l.id,"-b"],Dt);if(p.code!==0)throw new Error(`Could not boot ${l.displayName}: ${p.stderr.trim()||p.stdout.trim()||`simctl bootstatus exited ${p.code}`}`);let w=(await o()).find(D=>D.id===l.id);if(w?.state==="ready")return w;throw new Error(`${l.displayName} finished booting but simctl still reports it as ${w?.state??"missing"}.`)}async function v(l){let m=await r(["listapps",l.id]);if(m.code!==0)throw new Error(`Could not list apps on ${l.displayName}: ${m.stderr.trim()||`simctl exited ${m.code}`}`);return It(await e.convertPlistToJson(m.stdout))}async function b(l){let m=L(l,"Info.plist"),p=await e.exec("plutil",["-convert","json","-o","-",m],{timeoutMs:15e3});if(p.code!==0)throw new Error(`${l} Info.plist could not be read: ${p.stderr.trim()||`plutil exited ${p.code}`}`);let w;try{w=JSON.parse(p.stdout)}catch{throw new Error(`${l} Info.plist did not contain valid JSON from plutil.`)}if(!w.CFBundleIdentifier)throw new Error(`${l} has no CFBundleIdentifier in its Info.plist.`);return w.CFBundleIdentifier}async function S(l,m,p){if(m.kind==="package"){let y=await r(["listapps",l.id]);if(y.code!==0)throw new Error(`Could not list apps on ${l.displayName}: ${y.stderr.trim()||`simctl exited ${y.code}`}`);let E=$t(await e.convertPlistToJson(y.stdout));if(E.includes(m.value))return m.value;let M=W(m.value,E),C=[`${m.value} is not installed on ${l.displayName} (${l.id}).`];throw M.length>0?C.push("Close matches:",...M.map(j=>` ${j}`)):C.push("Pass a .zip of the .app bundle to install it instead."),new Error(C.join(`
19
- `))}if(m.kind==="ipa")throw new Error(`${Pt}.`);if(m.kind!=="app"&&m.kind!=="zip")throw new Error(`${m.kind} artifacts are Android-only and not installable on iOS.`);let w=m.value,D;if(m.kind==="zip"){p?.(`unpacking ${m.value}\u2026`);let y=await Nt(m.value);w=y.appPath,D=y.cleanup}p?.(`installing ${w} on ${l.displayName}\u2026`);try{let y=await r(["install",l.id,w],Tt);if(y.code!==0)throw new Error(`Installing ${m.value} on ${l.displayName} failed: ${y.stderr.trim()||y.stdout.trim()}`);return await b(w)}finally{await D?.()}}async function I(l={}){let m=[],p=await e.exec("xcode-select",["-p"],{timeoutMs:1e4});if(p.code===0&&p.stdout.trim()!==""){let E=await e.exec("xcodebuild",["-version"],{timeoutMs:3e4}),M=E.code===0?Et(E.stdout):void 0;M?Number(M.split(".")[0])<Y?m.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:`Xcode ${M} is older than the required Xcode ${Y}`,fixText:`Update Xcode to ${Y} or newer from the App Store.`}):m.push({id:"ios.xcode",label:"Xcode",required:!0,status:"pass",detail:`Xcode ${M} \xB7 ${p.stdout.trim()}`}):m.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:`${p.stdout.trim()} has no usable xcodebuild (Command Line Tools only?)`,fixText:"Install full Xcode from the App Store, then run `sudo xcode-select -s /Applications/Xcode.app/Contents/Developer`."})}else m.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:"xcode-select reports no developer directory",fixText:"Install Xcode from the App Store, then run `xcode-select --install`."});let w=await e.exec("xcrun",["simctl","help"],{timeoutMs:15e3});m.push(w.code===0?{id:"ios.xcrun",label:"xcrun",required:!0,status:"pass",detail:"simctl reachable"}:{id:"ios.xcrun",label:"xcrun",required:!0,status:"fail",detail:`xcrun cannot run simctl: ${w.stderr.trim()||w.stdout.trim()||`exit ${w.code}`}`,fixText:"Run `xcode-select --install`, then confirm with `xcrun simctl list devices`. If Xcode is installed, `sudo xcode-select -s /Applications/Xcode.app/Contents/Developer` repoints it."});let D=!l.appiumUrl,y=await e.mobileDeps.status();return m.push({id:"ios.xcuitest",fixedByBundle:!0,label:"xcuitest driver",required:D,status:y.installed?"pass":D?"fail":"info",detail:y.installed?"bundled in the managed mobile deps (with prebuilt WDA)":l.appiumUrl?"managed driver not required because --appium-url is set":y.corrupt??"the simulator deps bundle is not installed",...y.installed||!D?{}:{fixText:"Run `kane-cli doctor --target simulator --install` to download the simulator deps bundle."}}),m}async function H(l,m){let p=[];return m.appPackage&&p.push({label:`closing ${m.appPackage}`,file:"xcrun",args:["simctl","terminate",l.id,m.appPackage]}),m.shutdown&&p.push({label:`shutting down ${l.displayName}`,file:"xcrun",args:["simctl","shutdown",l.id]}),p}return{platform:Se,available:()=>e.os==="darwin",checks:I,discover:u,prepare:f,listApps:v,ensureApp:S,teardownPlan:H,toolEnv:()=>e.mobileDeps.environment()}}var ke=[we(),xe()];function V(){return ke.filter(t=>t.available())}function mi(){return V().map(t=>t.platform)}function pi(){return ke.map(t=>t.platform)}function Lt(t){let e=t.toLowerCase();return V().find(r=>r.platform.toLowerCase()===e)}async function Ct(t){let e=t?V().filter(o=>o.platform.toLowerCase()===t.toLowerCase()):V(),r=[];for(let o of e)try{r.push(...await o.discover())}catch{}return r}function Ft(t){return t.name!==void 0?`--device-name "${t.name}" --os-version ${t.osVersion}`:`os_version ${t.osVersion}`}function Z(t){return`
20
- See devices: kane-cli devices list --target ${t?.toLowerCase()==="ios"?"simulator":t?.toLowerCase()==="android"?"emulator":"<emulator|simulator>"}`}async function fi(t,e={}){let r=e.discover??Ct,o=e.providerFor??Lt,u=await r(t.platform),g=b=>{let S=o(b.platform);return S?{ok:!0,target:b,provider:S}:{ok:!1,reason:"not-found",candidates:u,message:`No provider is registered for platform '${b.platform}'.`}};if(t.device){let b=u.filter(S=>ie(S,t.device));return b.length===0?{ok:!1,reason:"not-found",candidates:u,message:`No device matches ${Ft(t.device)}.`+(u.length>0?Z(t.platform):" No devices were found \u2014 run `kane-cli doctor --target <emulator|simulator>`.")}:g(K(b))}let f=t.defaultTarget;if(f&&(!t.platform||t.platform.toLowerCase()===f.platform.toLowerCase())){let b=u.filter(I=>ne(I,f)),S=K(b);return S?g(S):{ok:!1,reason:t.interactive?"needs-picker":"not-found",candidates:u,message:`The saved default device ${re(f)} (${f.platform} \xB7 ${f.kind}) is not connected. `+(t.interactive?"Pick a target to bind this run.":"Pass --device-name <name> --os-version <version> explicitly \u2014 kane-cli never binds a different device on its own.")+(u.length>0?Z(f.platform):"")}}if(u.length===0)return{ok:!1,reason:"none-found",candidates:[],message:"No emulator or simulator found. Start an Android emulator or boot an iOS simulator, then run `kane-cli devices list --target <emulator|simulator>`."};let v=u.filter(b=>b.state==="ready");return v.length===1?g(v[0]):t.interactive?{ok:!1,reason:"needs-picker",candidates:u,message:v.length===0?"No target is ready \u2014 pick one to prepare it.":"More than one target is ready \u2014 pick one."}:{ok:!1,reason:"ambiguous",candidates:u,message:(v.length===0?"No target is ready.":`${v.length} targets are ready.`)+" Pass --device-name <name> --os-version <version>."+Z(t.platform)}}export{Ht as a,mi as b,pi as c,Lt as d,Ct as e,fi as f};
18
+ `))}if(n.kind!=="apk"){let a=n.kind==="aab"?"Android app bundles are not directly installable; build an APK first.":n.kind==="apks"?"Split bundles are not supported yet.":`${n.kind} artifacts are not installable on Android.`;throw new Error(a)}return await Me(i,n.value,s),_e(n.value)}async function $e(){let i=await e.mobileDeps.status("emulator");return i.installed?{status:i,env:await e.mobileDeps.environment("emulator")}:null}async function Ee(i={}){let n=[],s=await $e(),a=await e.mobileDeps.status("emulator"),d=await f("adb");if(d){let O=await e.exec(d.path,["version"],{timeoutMs:1e4}),k=lt(O.stdout);n.push({id:"android.adb",fixedByBundle:!0,label:"adb",required:!0,status:"pass",detail:k?`platform-tools ${k} \xB7 ${d.path}`:d.path})}else n.push({id:"android.adb",fixedByBundle:!0,label:"adb",required:!0,status:"fail",detail:a.corrupt??"managed mobile dependencies are not installed",fixText:"Run `kane-cli doctor --target emulator --install` to download the managed mobile deps bundle under ~/.testmuai/kaneai/mobile."});let c=!i.appiumUrl;s?.env.appiumHome?n.push({id:"android.appium",fixedByBundle:!0,label:"Appium",required:c,status:"pass",detail:S(X(s.env.appiumHome),"appium","node_modules",".bin",x())}):n.push({id:"android.appium",fixedByBundle:!0,label:"Appium",required:c,status:c?"fail":"info",detail:i.appiumUrl?`managed Appium not required because --appium-url is set (${i.appiumUrl})`:a.corrupt??"managed Appium is not installed",...c?{fixText:ce}:{}}),n.push({id:"android.uiautomator2",fixedByBundle:!0,label:"uiautomator2 driver",required:c,status:s?"pass":c?"fail":"info",detail:s?"bundled in the managed mobile deps":i.appiumUrl?"managed driver not required because --appium-url is set":"not installed in the managed deps tree",...s||!c?{}:{fixText:ce}});let h=S(e.home,".testmuai","kaneai","mobile","trees");e.fileExists(h)&&n.push({id:"android.legacy-trees",label:"legacy toolchain trees",required:!1,status:"info",detail:`${h} predates the deps bundle \u2014 removed automatically by the next bundle install`});let A=await l("adb");A&&n.push({id:"android.system-adb",label:"system adb",required:!1,status:"info",detail:`${A} (ignored; managed adb always wins and may restart its server)`});let T=await l("appium");T&&n.push({id:"android.system-appium",label:"system Appium",required:!1,status:"info",detail:`${T} (ignored; managed Appium always wins)`});let U=await e.sdkSuite.status(),q=await f("emulator");if(U.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 O=await e.exec("sysctl",["-n","kern.hv_support"],{timeoutMs:5e3});n.push({id:"android.virtualization",label:"virtualization",required:!1,status:"info",detail:O.code===0&&O.stdout.trim()==="1"?"Hypervisor.framework available":"Hypervisor.framework not reported \u2014 emulator boots may hang"})}else e.os==="linux"?n.push({id:"android.virtualization",label:"virtualization",required:!1,status:"info",detail:e.fileExists("/dev/kvm")?"/dev/kvm present":"/dev/kvm missing \u2014 enable KVM or emulator boots will hang"}):n.push({id:"android.virtualization",label:"virtualization",required:!1,status:"info",detail:"not checked on this host"});return n}async function Ne(i){let n=await e.mobileDeps.environment("emulator"),s=[...n.dirs],a=r.emulator,d=a?.source==="sdk"?X(a.path):void 0;return d&&!s.includes(d)&&s.push(d),{...n,dirs:s}}async function Oe(i,n){let s=await b(),a=[];return n.appPackage&&a.push({label:`closing ${n.appPackage}`,file:s,args:["-s",i.id,"shell","am","force-stop",n.appPackage]}),n.shutdown&&a.push({label:`shutting down ${i.displayName}`,file:s,args:["-s",i.id,"emu","kill"]}),a}return{platform:G,available:()=>!0,checks:Ee,discover:I,prepare:Pe,listApps:ee,ensureApp:Ie,teardownPlan:Oe,toolEnv:Ne}}import{mkdtemp as be,readdir as xt,rm as ye,writeFile as kt}from"fs/promises";import{tmpdir as Ae}from"os";import{join as L}from"path";var Se="ios",Dt=12e4,Tt=3e5,Pt="an .ipa cannot be installed on a simulator \u2014 use a .zip of the .app build";function _t(t){let e=/\.iOS-(\d+)-(\d+)$/.exec(t);return e?`${e[1]}.${e[2]}`:void 0}function Mt(t){let e;try{e=JSON.parse(t)}catch{return[]}let r=[];for(let[o,u]of Object.entries(e.devices??{})){let g=_t(o);for(let p of u??[]){let w=typeof p.udid=="string"?p.udid:void 0,v=typeof p.name=="string"?p.name:void 0;if(!w||!v)continue;let x=p.state==="Booted"?"ready":p.state==="Shutdown"?"stopped":"offline",P=typeof p.deviceTypeIdentifier=="string"?p.deviceTypeIdentifier.replace(/^com\.apple\.CoreSimulator\.SimDeviceType\./,""):void 0;r.push({platform:Se,kind:"simulator",id:w,displayName:v,state:x,virtualName:v,...g?{osVersion:g}:{},...P?{modelIdentifier:P}:{}})}}return r}function It(t){let e;try{e=JSON.parse(t)}catch{return[]}let r=[];for(let[o,u]of Object.entries(e)){if(u?.ApplicationType!=="User")continue;let g=u.CFBundleIdentifier??o;r.includes(g)||r.push(g)}return r.sort()}function $t(t){let e;try{e=JSON.parse(t)}catch{return[]}let r=[];for(let[o,u]of Object.entries(e)){let g=u?.CFBundleIdentifier??o;g&&!r.includes(g)&&r.push(g)}return r.sort()}var Y=16;function Et(t){return/^Xcode (\d+(?:\.\d+)*)/m.exec(t)?.[1]}async function Nt(t){let e=await be(L(Ae(),"kane-app-unzip-")),r=()=>ye(e,{recursive:!0,force:!0}),o=await $("unzip",["-q",t,"-d",e],{timeoutMs:10*6e4});if(o.code!==0)throw await r(),new Error(`Could not unpack ${t}: ${o.stderr.trim()||`unzip exited ${o.code}`}`);for(let u of[e,L(e,"Payload")]){let g;try{g=await xt(u)}catch{continue}let p=g.find(w=>w.toLowerCase().endsWith(".app"));if(p)return{appPath:L(u,p),cleanup:r}}throw await r(),new Error(`${t} does not contain a .app bundle.`)}async function Ot(t){let e=await be(L(Ae(),"kane-plist-"));try{let r=L(e,"input.plist");await kt(r,t);let o=await $("plutil",["-convert","json","-o","-",r],{timeoutMs:15e3});if(o.code!==0)throw new Error(`plutil could not convert simctl output: ${o.stderr.trim()}`);return o.stdout}finally{await ye(e,{recursive:!0,force:!0})}}function Rt(){return{exec:$,os:process.platform,convertPlistToJson:Ot,mobileDeps:{status:()=>R().status("simulator"),environment:()=>R().environment("simulator")}}}function xe(t={}){let e={...Rt(),...t};async function r(l,m=3e4){return e.exec("xcrun",["simctl",...l],{timeoutMs:m})}async function o(){let l=await r(["list","devices","available","--json"]);return l.code!==0?[]:Mt(l.stdout)}async function u(){return o()}async function g(l,m){let f=await e.exec("open",["-a","Simulator","--args","-CurrentDeviceUDID",l],{timeoutMs:15e3});f.code!==0&&m?.(`could not open Simulator.app (${f.stderr.trim()||`exit ${f.code}`}); the device is booted and the run continues headless`)}async function p(l,m){if(l.state!=="ready"&&l.state!=="stopped")throw new Error(`${l.displayName} (${l.id}) is ${l.state}; open Simulator.app to inspect it, then retry.`);l.kind==="simulator"&&await g(l.id,m),l.state==="stopped"&&m?.(`booting ${l.displayName}\u2026`);let f=await r(["bootstatus",l.id,"-b"],Dt);if(f.code!==0)throw new Error(`Could not boot ${l.displayName}: ${f.stderr.trim()||f.stdout.trim()||`simctl bootstatus exited ${f.code}`}`);let b=(await o()).find(D=>D.id===l.id);if(b?.state==="ready")return b;throw new Error(`${l.displayName} finished booting but simctl still reports it as ${b?.state??"missing"}.`)}async function w(l){let m=await r(["listapps",l.id]);if(m.code!==0)throw new Error(`Could not list apps on ${l.displayName}: ${m.stderr.trim()||`simctl exited ${m.code}`}`);return It(await e.convertPlistToJson(m.stdout))}async function v(l){let m=L(l,"Info.plist"),f=await e.exec("plutil",["-convert","json","-o","-",m],{timeoutMs:15e3});if(f.code!==0)throw new Error(`${l} Info.plist could not be read: ${f.stderr.trim()||`plutil exited ${f.code}`}`);let b;try{b=JSON.parse(f.stdout)}catch{throw new Error(`${l} Info.plist did not contain valid JSON from plutil.`)}if(!b.CFBundleIdentifier)throw new Error(`${l} has no CFBundleIdentifier in its Info.plist.`);return b.CFBundleIdentifier}async function x(l,m,f){if(m.kind==="package"){let y=await r(["listapps",l.id]);if(y.code!==0)throw new Error(`Could not list apps on ${l.displayName}: ${y.stderr.trim()||`simctl exited ${y.code}`}`);let E=$t(await e.convertPlistToJson(y.stdout));if(E.includes(m.value))return m.value;let I=W(m.value,E),F=[`${m.value} is not installed on ${l.displayName} (${l.id}).`];throw I.length>0?F.push("Close matches:",...I.map(j=>` ${j}`)):F.push("Pass a .zip of the .app bundle to install it instead."),new Error(F.join(`
19
+ `))}if(m.kind==="ipa")throw new Error(`${Pt}.`);if(m.kind!=="app"&&m.kind!=="zip")throw new Error(`${m.kind} artifacts are Android-only and not installable on iOS.`);let b=m.value,D;if(m.kind==="zip"){f?.(`unpacking ${m.value}\u2026`);let y=await Nt(m.value);b=y.appPath,D=y.cleanup}f?.(`installing ${b} on ${l.displayName}\u2026`);try{let y=await r(["install",l.id,b],Tt);if(y.code!==0)throw new Error(`Installing ${m.value} on ${l.displayName} failed: ${y.stderr.trim()||y.stdout.trim()}`);return await v(b)}finally{await D?.()}}async function P(l={}){let m=[],f=await e.exec("xcode-select",["-p"],{timeoutMs:1e4});if(f.code===0&&f.stdout.trim()!==""){let E=await e.exec("xcodebuild",["-version"],{timeoutMs:3e4}),I=E.code===0?Et(E.stdout):void 0;I?Number(I.split(".")[0])<Y?m.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:`Xcode ${I} is older than the required Xcode ${Y}`,fixText:`Update Xcode to ${Y} or newer from the App Store.`}):m.push({id:"ios.xcode",label:"Xcode",required:!0,status:"pass",detail:`Xcode ${I} \xB7 ${f.stdout.trim()}`}):m.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:`${f.stdout.trim()} has no usable xcodebuild (Command Line Tools only?)`,fixText:"Install full Xcode from the App Store, then run `sudo xcode-select -s /Applications/Xcode.app/Contents/Developer`."})}else m.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:"xcode-select reports no developer directory",fixText:"Install Xcode from the App Store, then run `xcode-select --install`."});let b=await e.exec("xcrun",["simctl","help"],{timeoutMs:15e3});m.push(b.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: ${b.stderr.trim()||b.stdout.trim()||`exit ${b.code}`}`,fixText:"Run `xcode-select --install`, then confirm with `xcrun simctl list devices`. If Xcode is installed, `sudo xcode-select -s /Applications/Xcode.app/Contents/Developer` repoints it."});let D=!l.appiumUrl,y=await e.mobileDeps.status();return m.push({id:"ios.xcuitest",fixedByBundle:!0,label:"xcuitest driver",required:D,status:y.installed?"pass":D?"fail":"info",detail:y.installed?"bundled in the managed mobile deps (with prebuilt WDA)":l.appiumUrl?"managed driver not required because --appium-url is set":y.corrupt??"the simulator deps bundle is not installed",...y.installed||!D?{}:{fixText:"Run `kane-cli doctor --target simulator --install` to download the simulator deps bundle."}}),m}async function C(l,m){let f=[];return m.appPackage&&f.push({label:`closing ${m.appPackage}`,file:"xcrun",args:["simctl","terminate",l.id,m.appPackage]}),m.shutdown&&f.push({label:`shutting down ${l.displayName}`,file:"xcrun",args:["simctl","shutdown",l.id]}),f}return{platform:Se,available:()=>e.os==="darwin",checks:P,discover:u,prepare:p,listApps:w,ensureApp:x,teardownPlan:C,toolEnv:()=>e.mobileDeps.environment()}}var ke=[we(),xe()];function H(){return ke.filter(t=>t.available())}function mi(){return H().map(t=>t.platform)}function pi(){return ke.map(t=>t.platform)}function Lt(t){let e=t.toLowerCase();return H().find(r=>r.platform.toLowerCase()===e)}async function Ct(t){let e=t?H().filter(o=>o.platform.toLowerCase()===t.toLowerCase()):H(),r=[];for(let o of e)try{r.push(...await o.discover())}catch{}return r}function Ft(t){return t.name!==void 0?`--device-name "${t.name}" --os-version ${t.osVersion}`:`os_version ${t.osVersion}`}function Z(t){return`
20
+ See devices: kane-cli devices list --target ${t?.toLowerCase()==="ios"?"simulator":t?.toLowerCase()==="android"?"emulator":"<emulator|simulator>"}`}async function fi(t,e={}){let r=e.discover??Ct,o=e.providerFor??Lt,u=await r(t.platform),g=v=>{let x=o(v.platform);return x?{ok:!0,target:v,provider:x}:{ok:!1,reason:"not-found",candidates:u,message:`No provider is registered for platform '${v.platform}'.`}};if(t.device){let v=u.filter(x=>ie(x,t.device));return v.length===0?{ok:!1,reason:"not-found",candidates:u,message:`No device matches ${Ft(t.device)}.`+(u.length>0?Z(t.platform):" No devices were found \u2014 run `kane-cli doctor --target <emulator|simulator>`.")}:g(K(v))}let p=t.defaultTarget;if(p&&(!t.platform||t.platform.toLowerCase()===p.platform.toLowerCase())){let v=u.filter(P=>ne(P,p)),x=K(v);return x?g(x):{ok:!1,reason:t.interactive?"needs-picker":"not-found",candidates:u,message:`The saved default device ${re(p)} (${p.platform} \xB7 ${p.kind}) is not connected. `+(t.interactive?"Pick a target to bind this run.":"Pass --device-name <name> --os-version <version> explicitly \u2014 kane-cli never binds a different device on its own.")+(u.length>0?Z(p.platform):"")}}if(u.length===0)return{ok:!1,reason:"none-found",candidates:[],message:"No emulator or simulator found. Start an Android emulator or boot an iOS simulator, then run `kane-cli devices list --target <emulator|simulator>`."};let w=u.filter(v=>v.state==="ready");return w.length===1?g(w[0]):t.interactive?{ok:!1,reason:"needs-picker",candidates:u,message:w.length===0?"No target is ready \u2014 pick one to prepare it.":"More than one target is ready \u2014 pick one."}:{ok:!1,reason:"ambiguous",candidates:u,message:(w.length===0?"No target is ready.":`${w.length} targets are ready.`)+" Pass --device-name <name> --os-version <version>."+Z(t.platform)}}export{Ht as a,mi as b,pi as c,Lt as d,Ct as e,fi as f};
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as nt}from"./chunk-ZKSN2SJ7.js";import{a as st,b as he}from"./chunk-N7Z7BQYO.js";import{a as Z,b as We,e as pe,f as ge,g as Ke,h as Ze}from"./chunk-G2Q2TP3O.js";import{a as ze,c as Je,d as Ye,e as fe,f as Xe}from"./chunk-5G22NOZK.js";import{a as Fe,b as Ge,c as Ve}from"./chunk-2LXJ2ZM3.js";import{a as Le,b as Me,c as Be}from"./chunk-BB2W35TW.js";import{a as Qe}from"./chunk-GX3FPJUG.js";import{a as et,b as tt}from"./chunk-JUJ4SAGH.js";import{a as He}from"./chunk-L2TV4G56.js";import{c as Ue}from"./chunk-IVQX3AKL.js";import{a as je,e as qe}from"./chunk-EV64VI66.js";import{c as it}from"./chunk-JDGBRACP.js";import{b as Oe,c as Pe,d as re,f as Ne}from"./chunk-GRDYYYIQ.js";import{b as Se,c as De,e as $e,f as Ee,g as Re,h as de,k as me,l as ue}from"./chunk-NP3VGFZM.js";import{d as xe}from"./chunk-KRL2BDI5.js";import{b as ce}from"./chunk-VZ7KXRXB.js";import{a as ke,b as le}from"./chunk-IDX3TOPY.js";import{C as U}from"./chunk-W3Z7AZNT.js";import{g as Ie}from"./chunk-XMTSHHYQ.js";import{a as Ce,e as Ae,f as Te}from"./chunk-DBIBROYW.js";import{d as Q,e as Y}from"./chunk-AKX4VRRR.js";import{a as we}from"./chunk-5EOX4MEY.js";import{mkdirSync as Vt,appendFileSync as Ut,rmdirSync as St}from"fs";import{randomBytes as Ht}from"crypto";import{dirname as ae,join as ve,relative as zt}from"path";function rt(t,e){let n=[];for(let i of e??[]){let o=t.resolve(i.ref)?.tip??null;o!==i.cid&&n.push({ref:i.ref,pinned:i.cid,now:o})}return n}import{existsSync as be,readFileSync as _e,readdirSync as Et}from"fs";import{join as se}from"path";var at=`
2
+ import{a as nt}from"./chunk-ZKSN2SJ7.js";import{a as it,b as he}from"./chunk-HOA4VWSD.js";import{a as Z,b as Ke,e as pe,f as ge,g as Qe,h as et}from"./chunk-MLRO7OH3.js";import{a as We,c as Ye,d as Xe,e as fe,f as Ze}from"./chunk-UHT5SVP5.js";import{a as Ge,b as Ve,c as Ue}from"./chunk-FFFB5BXL.js";import{a as ze}from"./chunk-L2TV4G56.js";import{c as He}from"./chunk-52WM3XYO.js";import{a as Me,b as Be,c as Fe}from"./chunk-BB2W35TW.js";import{a as qe,e as Le}from"./chunk-CRZUBDJ3.js";import{a as Je}from"./chunk-GX3FPJUG.js";import{a as tt,b as st}from"./chunk-JUJ4SAGH.js";import{q as je}from"./chunk-6LGED4FC.js";import{b as Oe,c as Pe,d as re,f as Ne}from"./chunk-L4M7753M.js";import{b as Se,c as De,e as $e,f as Ee,g as Re,h as de,k as me,l as ue}from"./chunk-22QIVSQR.js";import{d as xe}from"./chunk-LBNADEQN.js";import{b as ce}from"./chunk-VZ7KXRXB.js";import{a as ke,c as le}from"./chunk-5LJRZI7S.js";import{C as U}from"./chunk-GP7WD4UY.js";import{H as Ie}from"./chunk-3N6IAVD5.js";import{a as Ce,f as Ae,g as Te}from"./chunk-FQNQVC5O.js";import{d as Q,e as Y}from"./chunk-AKX4VRRR.js";import{a as we}from"./chunk-5EOX4MEY.js";import{mkdirSync as Vt,appendFileSync as Ut,rmdirSync as St}from"fs";import{randomBytes as Ht}from"crypto";import{dirname as ae,join as ve,relative as zt}from"path";function rt(t,e){let n=[];for(let i of e??[]){let o=t.resolve(i.ref)?.tip??null;o!==i.cid&&n.push({ref:i.ref,pinned:i.cid,now:o})}return n}import{existsSync as be,readFileSync as _e,readdirSync as Et}from"fs";import{join as se}from"path";var at=`
3
3
  version: 1
4
4
  techniques:
5
5
  - id: eqp
@@ -349,19 +349,19 @@ pitfalls:
349
349
  - "'Test the checkout flow' has no end state \u2014 state what done looks like."
350
350
  - "Do not cram many unrelated operations into one step; do not reference data outside the step."
351
351
  - "A step whose only content is an assertion is a smell \u2014 fold it into the action step before it."
352
- `;var Rt=["presence","forbidden-presence","count","delta","state-transition","absolute","bound","propagation","latency","graded"];function mt(t,e){for(let n of t)if(!Rt.includes(n))throw new Error(`${e}: emits '${n}' is not an oracle kind`)}function lt(t,e){let n=ce(t);if(!n||!Array.isArray(n.techniques))throw new Error(`${e}: expected { techniques: [...] }`);for(let i of n.techniques){if(!i.id||!i.name||!i.applies_hint||!Array.isArray(i.emits))throw new Error(`${e}: technique '${i?.id??"?"}' missing id/name/applies_hint/emits`);mt(i.emits,`${e}: technique '${i.id}'`)}return n.techniques}function dt(t,e){let n=ce(t);if(!n||!n.id||!n.name||!n.applies_when||!Array.isArray(n.candidate_checks))throw new Error(`${e}: profile missing id/name/applies_when/candidate_checks`);for(let i of n.candidate_checks){if(!i.id||!i.family||!i.measurable_example||!i.emits)throw new Error(`${e}: candidate_check '${i?.id??"?"}' missing id/family/measurable_example/emits`);mt([i.emits],`${e}: check '${i.id}'`)}return n}function ut(t){let e=new Map(lt(at,"packaged techniques").map(i=>[i.id,i])),n=se(t,"design","techniques.yaml");if(be(n))for(let i of lt(_e(n,"utf8"),n))e.set(i.id,i);return[...e.values()]}function pt(t){let e=new Map(Object.entries(ot).map(([i,o])=>[i,dt(o,`packaged profile '${i}'`)])),n=se(t,"design","profiles");if(be(n))for(let i of Et(n).filter(o=>o.endsWith(".yaml")||o.endsWith(".yml")).sort()){let o=dt(_e(se(n,i),"utf8"),se(n,i));e.set(o.id,o)}return[...e.values()]}function gt(t){let e=se(t,"design","runner-grammar.yaml");return be(e)?_e(e,"utf8"):ct}function ie(t,e){return!t.superseded.has(e)}function ye(t,e,n){return{cid:e,logical_id:t.nameOf.get(e)??null,content:n}}async function ft(t,e,n,i,o){let r=await We(t,"search_similar",{text:e,label:n,k:i},o);return r.ok&&Array.isArray(r.result)?r.result:[]}async function ht(t,e,n={}){let i=U(t),o=i.resolve(e);if(!o)throw new Error(`assembleDesignContext: unknown use-case '${e}' (run designGate first)`);let r=o.tip,v=i.getNode(r);if(!v||v.label!==Q.USECASE)throw new Error(`assembleDesignContext: '${e}' is not a use-case (run designGate first)`);let N=i.derivesInto(r).map(l=>({source_id:l.props.source_id??null,anchor:l.props.anchor??null})),w=[],T=new Set;for(let{cid:l,content:g}of i.byLabel(Q.SCENARIO))ie(i,l)&&i.edgesFrom(l).some(h=>h.type===Y.BELONGS_TO&&h.dst===r)&&(w.push(ye(i,l,g)),T.add(l));let $=[];for(let{cid:l,content:g}of i.byLabel(Q.AC)){if(!ie(i,l))continue;let h=i.edgesFrom(l).find(S=>S.type===Y.SCOPED_TO);!h||h.dst!==r&&!T.has(h.dst)||$.push({...ye(i,l,g),scoped_to:h.dst})}let x=Array.isArray(v.content.criteria)?v.content.criteria:[],C=[v.content.title,v.content.description,...x].filter(Boolean).join(`
353
- `),M=(await ft(i,C,Q.SCENARIO,10,n.embedSearch)).filter(l=>!T.has(l.cid)),R=[],P=new Set,X=[],E=[r],q=new Set([r]);for(;E.length>0;){let l=E.shift();for(let g of i.edgesFrom(l)){if(g.type!==Y.DEPENDS_ON||i.nodeLabel.get(g.dst)!==Q.USECASE)continue;let h=i.tipOf(g.dst);q.has(h)||(q.add(h),X.push(h),E.push(h))}}for(let l of X){let g=`depends_on ${i.nameOf.get(l)??l.slice(0,19)}`;for(let{cid:h}of i.byLabel(Q.SCENARIO))if(ie(i,h)&&i.edgesFrom(h).some(S=>S.type===Y.BELONGS_TO&&S.dst===l))for(let S of i.edgesInto(h)){if(S.type!==Y.AUTOMATES||!ie(i,S.src)||P.has(S.src))continue;P.add(S.src);let G=String(i.getNode(S.src)?.content.title??"");R.push({cid:S.src,logical_id:i.nameOf.get(S.src)??null,title:G,via:g})}}for(let l of await ft(i,C,Q.TEST,5,n.embedSearch)){let{cid:g,title:h}=l;P.has(g)||(P.add(g),R.push({cid:g,logical_id:i.nameOf.get(g)??null,title:h??"",via:"similar"}))}let f=i.byLabel(Q.STYLENOTE).filter(l=>ie(i,l.cid)).sort((l,g)=>l.cid<g.cid?-1:1).slice(0,5).map(l=>`${String(l.content.statement)} [${String(l.content.learned_from_kind)}]`);return{usecase:ye(i,r,v.content),cites:N,committed_acs:$,existing:{scenarios:w,reuse_candidates:M},import_candidates:R,style_notes:f,techniques:ut(t),profiles:pt(t),runner_grammar:gt(t),variables:[...(n.variablesIndex??new Map).entries()].map(([l,g])=>({name:l,has_value:g.has_value})).sort((l,g)=>l.name<g.name?-1:1),budget:{...n.max!=null?{max_pairs:n.max}:{},...n.strength!=null?{strength_override:n.strength}:{}},design_of:(()=>{let l=et(i,r);return l?{engine:l.engine,seq:l.seq}:null})()}}function bt(t){let e=n=>{if(Array.isArray(n))return n.map(e);if(n!==null&&typeof n=="object"){let i={};for(let o of Object.keys(n).sort())i[o]=e(n[o]);return i}return n};return JSON.stringify(e(t),null,1)}import{basename as qt,dirname as vt,resolve as wt}from"path";import{existsSync as Ct,mkdirSync as At,readFileSync as Tt,renameSync as It,writeFileSync as Ot}from"fs";import{dirname as Pt,join as Nt}from"path";function _t(t){return Nt(t,".testmuai","variables","assurance.json")}function yt(t){for(let o of t.declarations){let r=re(o.name);if(r)throw new Error(`variable declaration refused: ${r}`)}let e={};if(Ct(t.file)){let o=JSON.parse(Tt(t.file,"utf8"));o&&typeof o=="object"&&!Array.isArray(o)&&(e=o)}let n=[],i=[];for(let o of t.declarations){if(Object.hasOwn(e,o.name)||t.known?.has(o.name)){i.push(o.name);continue}e[o.name]={value:"",secret:!!o.secret,description:o.description},n.push(o.name)}if(n.length>0){At(Pt(t.file),{recursive:!0});let o=`${t.file}.tmp-${process.pid}-${Date.now()}`;Ot(o,JSON.stringify(e,null,2)+`
352
+ `;var Rt=["presence","forbidden-presence","count","delta","state-transition","absolute","bound","propagation","latency","graded"];function mt(t,e){for(let n of t)if(!Rt.includes(n))throw new Error(`${e}: emits '${n}' is not an oracle kind`)}function lt(t,e){let n=ce(t);if(!n||!Array.isArray(n.techniques))throw new Error(`${e}: expected { techniques: [...] }`);for(let i of n.techniques){if(!i.id||!i.name||!i.applies_hint||!Array.isArray(i.emits))throw new Error(`${e}: technique '${i?.id??"?"}' missing id/name/applies_hint/emits`);mt(i.emits,`${e}: technique '${i.id}'`)}return n.techniques}function dt(t,e){let n=ce(t);if(!n||!n.id||!n.name||!n.applies_when||!Array.isArray(n.candidate_checks))throw new Error(`${e}: profile missing id/name/applies_when/candidate_checks`);for(let i of n.candidate_checks){if(!i.id||!i.family||!i.measurable_example||!i.emits)throw new Error(`${e}: candidate_check '${i?.id??"?"}' missing id/family/measurable_example/emits`);mt([i.emits],`${e}: check '${i.id}'`)}return n}function ut(t){let e=new Map(lt(at,"packaged techniques").map(i=>[i.id,i])),n=se(t,"design","techniques.yaml");if(be(n))for(let i of lt(_e(n,"utf8"),n))e.set(i.id,i);return[...e.values()]}function pt(t){let e=new Map(Object.entries(ot).map(([i,o])=>[i,dt(o,`packaged profile '${i}'`)])),n=se(t,"design","profiles");if(be(n))for(let i of Et(n).filter(o=>o.endsWith(".yaml")||o.endsWith(".yml")).sort()){let o=dt(_e(se(n,i),"utf8"),se(n,i));e.set(o.id,o)}return[...e.values()]}function gt(t){let e=se(t,"design","runner-grammar.yaml");return be(e)?_e(e,"utf8"):ct}function ie(t,e){return!t.superseded.has(e)}function ye(t,e,n){return{cid:e,logical_id:t.nameOf.get(e)??null,content:n}}async function ft(t,e,n,i,o){let r=await Ke(t,"search_similar",{text:e,label:n,k:i},o);return r.ok&&Array.isArray(r.result)?r.result:[]}async function ht(t,e,n={}){let i=U(t),o=i.resolve(e);if(!o)throw new Error(`assembleDesignContext: unknown use-case '${e}' (run designGate first)`);let r=o.tip,v=i.getNode(r);if(!v||v.label!==Q.USECASE)throw new Error(`assembleDesignContext: '${e}' is not a use-case (run designGate first)`);let N=i.derivesInto(r).map(l=>({source_id:l.props.source_id??null,anchor:l.props.anchor??null})),w=[],T=new Set;for(let{cid:l,content:g}of i.byLabel(Q.SCENARIO))ie(i,l)&&i.edgesFrom(l).some(h=>h.type===Y.BELONGS_TO&&h.dst===r)&&(w.push(ye(i,l,g)),T.add(l));let $=[];for(let{cid:l,content:g}of i.byLabel(Q.AC)){if(!ie(i,l))continue;let h=i.edgesFrom(l).find(S=>S.type===Y.SCOPED_TO);!h||h.dst!==r&&!T.has(h.dst)||$.push({...ye(i,l,g),scoped_to:h.dst})}let x=Array.isArray(v.content.criteria)?v.content.criteria:[],C=[v.content.title,v.content.description,...x].filter(Boolean).join(`
353
+ `),M=(await ft(i,C,Q.SCENARIO,10,n.embedSearch)).filter(l=>!T.has(l.cid)),R=[],P=new Set,X=[],E=[r],q=new Set([r]);for(;E.length>0;){let l=E.shift();for(let g of i.edgesFrom(l)){if(g.type!==Y.DEPENDS_ON||i.nodeLabel.get(g.dst)!==Q.USECASE)continue;let h=i.tipOf(g.dst);q.has(h)||(q.add(h),X.push(h),E.push(h))}}for(let l of X){let g=`depends_on ${i.nameOf.get(l)??l.slice(0,19)}`;for(let{cid:h}of i.byLabel(Q.SCENARIO))if(ie(i,h)&&i.edgesFrom(h).some(S=>S.type===Y.BELONGS_TO&&S.dst===l))for(let S of i.edgesInto(h)){if(S.type!==Y.AUTOMATES||!ie(i,S.src)||P.has(S.src))continue;P.add(S.src);let G=String(i.getNode(S.src)?.content.title??"");R.push({cid:S.src,logical_id:i.nameOf.get(S.src)??null,title:G,via:g})}}for(let l of await ft(i,C,Q.TEST,5,n.embedSearch)){let{cid:g,title:h}=l;P.has(g)||(P.add(g),R.push({cid:g,logical_id:i.nameOf.get(g)??null,title:h??"",via:"similar"}))}let f=i.byLabel(Q.STYLENOTE).filter(l=>ie(i,l.cid)).sort((l,g)=>l.cid<g.cid?-1:1).slice(0,5).map(l=>`${String(l.content.statement)} [${String(l.content.learned_from_kind)}]`);return{usecase:ye(i,r,v.content),cites:N,committed_acs:$,existing:{scenarios:w,reuse_candidates:M},import_candidates:R,style_notes:f,techniques:ut(t),profiles:pt(t),runner_grammar:gt(t),variables:[...(n.variablesIndex??new Map).entries()].map(([l,g])=>({name:l,has_value:g.has_value})).sort((l,g)=>l.name<g.name?-1:1),budget:{...n.max!=null?{max_pairs:n.max}:{},...n.strength!=null?{strength_override:n.strength}:{}},design_of:(()=>{let l=tt(i,r);return l?{engine:l.engine,seq:l.seq}:null})()}}function bt(t){let e=n=>{if(Array.isArray(n))return n.map(e);if(n!==null&&typeof n=="object"){let i={};for(let o of Object.keys(n).sort())i[o]=e(n[o]);return i}return n};return JSON.stringify(e(t),null,1)}import{basename as qt,dirname as vt,resolve as wt}from"path";import{existsSync as Ct,mkdirSync as At,readFileSync as Tt,renameSync as It,writeFileSync as Ot}from"fs";import{dirname as Pt,join as Nt}from"path";function _t(t){return Nt(t,".testmuai","variables","assurance.json")}function yt(t){for(let o of t.declarations){let r=re(o.name);if(r)throw new Error(`variable declaration refused: ${r}`)}let e={};if(Ct(t.file)){let o=JSON.parse(Tt(t.file,"utf8"));o&&typeof o=="object"&&!Array.isArray(o)&&(e=o)}let n=[],i=[];for(let o of t.declarations){if(Object.hasOwn(e,o.name)||t.known?.has(o.name)){i.push(o.name);continue}e[o.name]={value:"",secret:!!o.secret,description:o.description},n.push(o.name)}if(n.length>0){At(Pt(t.file),{recursive:!0});let o=`${t.file}.tmp-${process.pid}-${Date.now()}`;Ot(o,JSON.stringify(e,null,2)+`
354
354
  `),It(o,t.file)}return{written:n,skipped:i}}var jt=me,Lt=new Set(["narrative","acs","scenarios","tests","exercises","gaps","scoped_to_repoints","judgements","variables","phase"]);function Mt(t){let e=/strength=(\d+)\s*(?:—|-)?\s*(.*)/.exec(t??"");return e?{strength:Number(e[1]),reason:e[2]||t||""}:{strength:2,reason:t??""}}function Bt(t,e,n=new Set,i=0){return jt(e,ue(t),n,i)}function Ft(t,e,n,i){let o=e.scenarios?.find(x=>x.temp_ref===n.automates)??(()=>{let x=t.resolve(n.automates),C=x?t.getNode(x.tip)?.content:void 0;return C?{title:String(C.title??""),intent:String(C.intent??""),technique_notes:String(C.technique_notes??"")}:{}})(),r=[...(e.acs??[]).map(x=>({ref:x.temp_ref,text:x.text})),...n.verifies.filter(x=>!(e.acs??[]).some(C=>C.temp_ref===x)).map(x=>{let C=t.resolve(x);return{ref:x,text:C?String(t.getNode(C.tip)?.content.text??""):""}})],{test_md:v,objectives_yaml:N}=Re({title:n.title,steps:n.steps,check:n.check,check_prose:n.check_prose,reuses:n.reuses,...n.target?{target:n.target,...n.app?{app:n.app}:{}}:{}},{title:o.title,intent:o.intent},r),w=de(Bt(t,v)),T=n.check,$={technique:o.technique_notes??"",profile_family:e.judgements?.find(x=>x.kind==="profile_family"&&(x.target===n.temp_ref||x.target===n.automates))?.rationale??"unspecified",anchor:T.verified_against,expected_how:e.judgements?.find(x=>x.kind==="expected_how"&&x.target===T.verified_against)?.rationale??`expected_mode: ${T.expected_mode??"inferred"}`,combinatorial:Mt(o.technique_notes),surface_state:"absent",deferred_bindings:T.expected_mode==="runtime-derived"?1:0};return i.push({definitionId:w,rationale:$,anchorRef:T.verified_against,tempRef:n.temp_ref}),{temp_ref:n.temp_ref,title:n.title,automates:n.automates,verifies:n.verifies,check:n.check,definitionId:w,test_md_blob:v,objectives_blob:N,...n.reuses?.length?{reuses:n.reuses}:{},...n.surface_required!==void 0?{surface_required:n.surface_required}:{},...n.target?{target:n.target}:{},...n.target&&n.app?{app:n.app}:{}}}function Gt(t,e){try{let n=t.resolve(e.automates);if(!n)return!1;let i=t.tipOf(n.cid)??n.cid;for(let o of t.edgesInto(i)){if(o.type!==Y.AUTOMATES)continue;let r=t.getNode(t.tipOf(o.src)??o.src)?.content,v=typeof r?.test_md_blob=="string"?r.test_md_blob:"";if(!v)continue;if(!v.split(`
355
- `).some(w=>/^##\s/.test(w)&&!/—\s?assert/.test(w)&&xe.test(w)))return!0}return!1}catch{return!1}}function kt(t){let e=0,n=t.forceScope??null;return{terminalEventType:"design",async onProposalEvent(i){let o=a=>t.steer?(t.steer(`[auto-repair] ${a} \u2014 please re-finalize with this fixed.`),{proposal:null,error:null}):{proposal:null,error:a};if(i==null||typeof i!="object")return o("finalize_design payload is not an object");let r=i,v=Object.keys(r).filter(a=>!Lt.has(a));if(v.length>0)return o(`finalize_design carries ungated/unknown section(s): ${v.join(", ")} \u2014 mintable here: acs, scenarios, tests (+gaps)`);let N=new Map;for(let a of r.tests??[]){let m=N.get(a.automates);if(m)return o(`strict 1:1 violated in-payload: ${m} and ${a.temp_ref} both automate ${a.automates}`);if(N.set(a.automates,a.temp_ref),typeof a.app=="string"&&!/^APP/.test(a.app)&&!/[\/]/.test(a.app)&&!/\.(apk|zip|app)$/i.test(a.app))return o(`${a.temp_ref}: app '${a.app}' is neither a build path (.apk / .zip of an .app) nor an APP\u2026 upload id \u2014 omit the field when only a bundle id exists`)}let w=U(t.contextDir),T=/^design@(\d+)$/.exec(t.templateVersion?.()??"");if(T&&Number.parseInt(T[1],10)>=6)for(let a of r.tests??[]){if(!Array.isArray(a.steps??[]))return o(`${a.temp_ref}: steps must be an array of objective strings or {text, verifies} objects`);let m=new Set;for(let k of Array.isArray(a.steps)?a.steps:[])if(typeof k=="object"&&k.verifies)for(let O of k.verifies)m.add(O);let _=new Set(a.verifies??[]),b=[..._].filter(k=>!m.has(k)),I=[...m].filter(k=>!_.has(k));if(!(m.size===0&&Gt(w,a))&&(m.size===0||b.length>0||I.length>0))return o(`${a.temp_ref}: every AC must be claimed by the step that proves it \u2014 `+(m.size===0?"no step carries verifies tags":`not claimed by any step: [${b.join(", ")}]; tagged but not in the test's verifies: [${I.join(", ")}]`))}if(r.variables!==void 0&&!Array.isArray(r.variables))return o("variables must be an array of {name, description, secret}");let $=!!T&&Number.parseInt(T[1],10)>=7;if((r.variables??[]).length>0&&!$)return o("variables[] needs design@7 \u2014 this session is bound to an older template; drop the section");let x=new Set;for(let a of r.variables??[]){if(!a||typeof a!="object"||typeof a.name!="string"||typeof a.description!="string"||typeof a.secret!="boolean")return o(`variables[]: every entry is {name, description, secret} \u2014 got ${JSON.stringify(a)}`);let m=Object.keys(a).filter(b=>!["name","description","secret"].includes(b));if(m.length>0)return o(`variables[]: '${a.name}' carries ${m.join(", ")} \u2014 a declaration has no value and no other fields`);let _=re(a.name);if(_)return o(`variables[]: ${_}`);if(!a.description.trim()||/[\r\n]/.test(a.description))return o(`variables[]: '${a.name}' needs a one-line, non-empty description`);if(x.has(a.name))return o(`variables[]: '${a.name}' is declared twice`);x.add(a.name)}if($){let a=t.variablesIndex?.()??new Map;for(let m of r.tests??[]){let _=[...(Array.isArray(m.steps)?m.steps:[]).map(b=>typeof b=="string"?b:b.text),m.check_prose??""];for(let b of _)for(let I of Ne(b))if(!(a.has(I)||x.has(I)))return o(`${m.temp_ref}: step references {{${I}}} but no variable named '${I}' exists in the pool and this payload does not declare it \u2014 reuse a name from the variables block, or declare it in \`variables\` ({name, description, secret})`)}}t.force&&!t.resuming&&e===0&&n===null&&(n=st(w,t.ucRef));let C=w.resolve(t.ucRef),M=C?String(w.getNode(C.tip)?.content.risk??"med"):"med",R=[],P=new Set([t.ucRef,C?.cid,C?.tip].filter(Boolean)),X=a=>{if(P.has(a))return!0;let m=w.resolve(a);return m!=null&&(P.has(m.cid)||P.has(m.tip))},E;try{E={...r.acs?.length?{acs:r.acs.map(a=>({temp_ref:a.temp_ref,text:a.text,kind:a.kind,risk:a.risk??M,...a.expected_answer?{expected_answer:a.expected_answer}:{},...a.scoped_to&&!X(a.scoped_to)?{scope:{type:"scenario",ref:a.scoped_to}}:{}}))}:{},...r.scenarios?.length?{scenarios:r.scenarios}:{},...r.tests?.length?{tests:r.tests.map(a=>Ft(w,r,a,R))}:{},...r.exercises?.length?{exercises:r.exercises}:{},...r.gaps?.length?{gaps:r.gaps}:{},...r.scoped_to_repoints?.length?{scoped_to_repoints:r.scoped_to_repoints}:{},...r.judgements?.length?{judgements:r.judgements}:{}}}catch(a){return o(a instanceof Error?a.message:String(a))}let q=r.phase??(r.tests?.length?"tests":r.scenarios?.length?"scenarios":r.acs?.length?"acs":"design"),f=(a,m={})=>({contextDir:t.contextDir,graph:a,ucRef:t.ucRef,sections:E,by:t.by,phase:q,...m,...t.templateVersion?{templateVersion:t.templateVersion()}:{},...t.engine?{engine:t.engine}:{},...n?.length?{forceScope:n}:{},...t.because?{reason:t.because}:{},finalizeTestBody:(()=>{let _=new Map((E.tests??[]).map(k=>[k.temp_ref,k])),b=new Map,I=(k,O,H)=>{let L=_.get(k);if(!L?.test_md_blob)return null;let z=b.get(k);if(z!==void 0)return z;if(H.has(k))return L.test_md_blob;H.add(k);let W=new Map;for(let s of L.reuses??[]){I(s,O,H);let d=O(s);d!==null&&d!==s&&W.set(s,d)}let j=L.verifies.map(O).filter(s=>s!==null),J=Ee(L.test_md_blob,W),{md:ne,tagged:D}=Se(J,O),K=D?ne:$e(J,j);return De(K,j),b.set(k,K),K};return(k,O)=>{if(!k.test_md_blob)return null;let H=I(k.temp_ref,O,new Set)??k.test_md_blob;if(H===k.test_md_blob)return null;let L=z=>{for(let W of _.keys())if(O(W)===z){let j=I(W,O,new Set);if(j!==null)return{body:j,cycleKey:`batch:${z}`,next:L}}return ue(w)(z)};return{test_md_blob:H,definitionId:de(me(H,L))}}})()}),l;if(t.protocol){let a=t.generationTicket,m=await Fe(t.protocol,{verb:"design",ucTargets:[{ref:t.ucRef}],newBuCandidates:[],sourcePins:[],readBasis:w.latestHash,...a?{generationTicket:a}:{}},_=>{let b=he(f(_.graph,{eventIds:_.eventIds("design",1),sid:_.sid,...a&&!t.generationStamped?{generationTicket:a}:{}}));return b.errors!==null?{errors:b.errors}:{result:b,record:b.record}});m.ok&&"result"in m?(l=m.result,a&&!t.generationStamped&&(t.generationStamped=!0,t.generationTicket={...a,expected_prev_gen:a.next_gen})):m.ok?l={record:null,errors:null,minted:{},logicalIds:{},superseded:[],warnings:["commit already applied (recommit)"],finalizedTests:{}}:l={record:null,errors:m.kind==="validation"?m.errors:m.kind==="contended"?[{code:m.err.code,detail:`${t.ucRef} is held by ${m.err.holder?.owner_sid??"another session"}${m.err.holder?.alive?" (live)":" (stale)"} \u2014 try another use-case or wait for it to free`}]:m.kind==="drifted"?m.asks.map(b=>({code:"DRIFTED",detail:b.detail})):[{code:"UNSETTLED",detail:`concurrent activity kept moving the store (${m.attempts} attempts) \u2014 retry when the store is quieter`}],minted:{},logicalIds:{},superseded:[],warnings:[],finalizedTests:{}}}else l=he(f(w));if(l.errors)return o("design commit failed: "+l.errors.map(a=>`${a.code}: ${a.detail}`).join("; "));let g=l.warnings.filter(a=>a.includes("\u2014 committed anyway; approve"));for(let a of l.warnings)(!g.includes(a)||g.length===1)&&t.note(`warning: ${a}`);g.length>1&&t.note(`warning: ${g.length} test link(s) refer to items still awaiting approval \u2014 saved anyway; review and approve those items in chat or via kane-cli context review`);let h=(a,m)=>a?`${a} ${m}${a>1?"s":""}`:null,S=[h(r.acs?.length,"AC"),h(r.scenarios?.length,"scenario"),h(r.tests?.length,"test"),h(r.gaps?.length,"gap")].filter(Boolean);t.aliases?.(Object.entries(l.minted).map(([a,m])=>({ref:a,cid:m,...l.logicalIds[a]?{id:l.logicalIds[a]}:{}})));{let a=`saved ${S.join(" \xB7 ")||"judgements/wiring"} as drafts`;(t.commitLine??t.note)(a)}let G=U(t.contextDir);t.onCommitted?.(G);for(let a of R){let m=l.logicalIds[a.anchorRef]??l.minted[a.anchorRef];nt(t.contextDir,l.finalizedTests[a.tempRef]??a.definitionId,{...a.rationale,anchor:m??a.rationale.anchor})}try{let a=Object.values(l.minted).filter(m=>G.getNode(m)?.label==="test");if(a.length>0){let m=vt(wt(t.contextDir)),_=it({graph:G,cids:a,cwd:m});_.wrote.length>0&&t.note(`\u2692 wrote ${_.wrote.map(b=>qt(b.path)).join(" \xB7 ")}`);for(let b of _.refused)t.note(`warning: could not create the test file for ${b.id} \u2014 ${b.reason}`)}}catch(a){t.note(`warning: the design was saved, but its test file could not be created (${a instanceof Error?a.message:String(a)})`)}try{if((r.variables??[]).length>0){let a=vt(wt(t.contextDir)),m=_t(a),{written:_}=yt({file:m,declarations:r.variables,known:t.variablesIndex?.()});if(_.sort(),_.length>0){let b=_.map(I=>({...r.variables.find(k=>k.name===I),file:m}));t.note(`\u2692 declared ${_.length} new variable${_.length===1?"":"s"} \u2014 ${_.join(" \xB7 ")} (values needed)`),t.event?.({type:"variables_declared",file:m,variables:b.map(({name:I,description:k,secret:O})=>({name:I,description:k,secret:O}))}),t.onVariablesDeclared?.(b)}}}catch(a){t.note(`warning: the design was saved, but its variable stubs could not be written (${a instanceof Error?a.message:String(a)})`)}t.event?.({type:"commit",acs:r.acs?.length??0,scenarios:r.scenarios?.length??0,tests:r.tests?.length??0,gaps:r.gaps?.length??0,warnings:l.warnings.length,minted:Object.entries(l.minted).map(([a,m])=>({temp_ref:a,cid:m,...l.logicalIds[a]?{logical_id:l.logicalIds[a]}:{}}))}),e+=1,n!==null&&(n=l.forceScopeRemaining??n,t.onForceScope?.(n));let V=He({verb:"design",commitN:e,ucRef:t.ucRef,phase:q,committed:Object.entries(l.minted).map(([a,m])=>({temp_ref:a,cid:m,...l.logicalIds[a]?{logical_id:l.logicalIds[a]}:{}})),warnings:l.warnings},G),ee=V.event.parity?.missing??[],te=!!r.tests?.length&&ee.length===0;return{proposal:l,error:null,receipt:V,...te?{sessionComplete:te}:{}}}}}function xt(t,e){return{type:"run_config",version:1,session_id:e.session_id,mode:e.mode,source:{source_id:`design:${t.usecase.logical_id??e.ucCid.slice(0,19)}`,source_cid:e.ucCid,kind:"design_context",numbered_text:bt({...t,session_mode:e.mode})},existing_use_cases:[],read_basis:e.readBasis,max_free_text_rounds:2,graph_reads:!0,verb:"design",chat:!0,design_budget:t.budget,topology:e.topology}}var Dt=Symbol("design-out-tee");function Wt(t,e,n,i){return{terminalEventType:"design",async onProposalEvent(o){let r=o??{},v=["acs","scenarios","tests","gaps"].map(N=>r[N]?.length?`${r[N].length} ${N}`:null).filter(Boolean).join(" \xB7 ");return n?.("plan_payload",{payload:r}),t(`plan: finalize_design \u2014 ${v||"wiring/judgements only"} (nothing committed${i?`; full payload: ${Z(i)}`:""})`),e?.({type:"plan",payload:r}),{proposal:r,error:null}}}}async function ii(t,e){let n=U(e.contextDir),i=null,o=null,r=t.useCase;if(t.resume){try{{let p=await Xe(e.contextDir,t.resume,n,{deps:{onWarn:y=>e.out(`note: ${y}`)}});o=p,i=p.handle,p.drift.length>0&&(e.out(`note: sources changed since the pause: ${p.drift.map(y=>y.subject).join(", ")} \u2014 the design continues against the current versions`),e.emit?.({type:"stale_basis",sources:p.drift.map(y=>y.subject)}))}}catch(p){if(p instanceof ke||p instanceof fe)return e.out(`error: ${p.message}`),e.emit?.({type:"error",message:`error: ${p.message}`}),p instanceof fe||p.code==="SESSION_MISSING"||p.code==="SESSION_EXPIRED"?2:1;throw p}let s=i.state,d=ze(s.verb,"design",t.resume);if(d)return e.out(d.message),e.emit?.({type:"error",message:d.message,code:d.code}),i.release(),2;if(r&&s.use_case&&r!==s.use_case){let p=`session ${t.resume} was designing ${s.use_case}; --use-case ${r} RETARGETS it`;if(!(t.confirmRetarget?await t.confirmRetarget(`${p} \u2014 continue with the new target?`):!1))return e.out(`error: ${p} \u2014 resume without --use-case to continue ${s.use_case}, or start a fresh session on ${r}`),e.emit?.({type:"error",code:"RETARGET_MISMATCH",message:p}),i.release(),2}if(r=r??s.use_case,s.uc_tip&&r){let p=n.resolve(r)?.tip;if(p&&p!==s.uc_tip){let y=`the use-case changed since the pause (${s.uc_tip.slice(0,19)}\u2026 \u2192 ${p.slice(0,19)}\u2026)`;if(!(t.confirmRetarget?await t.confirmRetarget(`${y} \u2014 re-ground and continue against the new version?`):!1))return e.out(`error: ${y} \u2014 resume interactively to re-ground, or abandon this session`),e.emit?.({type:"error",code:"UC_TIP_MOVED",message:y}),i.release(),2;e.emit?.({type:"stale_basis",usecase:r})}}let u=rt(n,s.target_pins);if(u.length>0){let p=`items this session pinned have changed since it paused: ${u.map(A=>`${A.ref}${A.now===null?" (now gone)":""}`).join(", ")}`;if(!(t.confirmRetarget?await t.confirmRetarget(`${p} \u2014 re-ground and continue?`):!1))return e.out(`error: ${p} \u2014 resume interactively to re-ground, or abandon`),e.emit?.({type:"error",code:"TARGET_PIN_MOVED",message:p}),i.release(),2;i.save({target_pins:(s.target_pins??[]).map(A=>({ref:A.ref,cid:n.resolve(A.ref)?.tip??A.cid}))})}let c=[...new Set([...i.state.held_receipts??[],...o?.view.kane?.held_receipts??[]])];if(c.length>0)if(e.chat?.holdReceipt)for(let p of c)e.chat.holdReceipt(p);else e={...e,initialMessage:[c.join(`
355
+ `).some(w=>/^##\s/.test(w)&&!/—\s?assert/.test(w)&&xe.test(w)))return!0}return!1}catch{return!1}}function kt(t){let e=0,n=t.forceScope??null;return{terminalEventType:"design",async onProposalEvent(i){let o=a=>t.steer?(t.steer(`[auto-repair] ${a} \u2014 please re-finalize with this fixed.`),{proposal:null,error:null}):{proposal:null,error:a};if(i==null||typeof i!="object")return o("finalize_design payload is not an object");let r=i,v=Object.keys(r).filter(a=>!Lt.has(a));if(v.length>0)return o(`finalize_design carries ungated/unknown section(s): ${v.join(", ")} \u2014 mintable here: acs, scenarios, tests (+gaps)`);let N=new Map;for(let a of r.tests??[]){let m=N.get(a.automates);if(m)return o(`strict 1:1 violated in-payload: ${m} and ${a.temp_ref} both automate ${a.automates}`);if(N.set(a.automates,a.temp_ref),typeof a.app=="string"&&!/^APP/.test(a.app)&&!/[\/]/.test(a.app)&&!/\.(apk|zip|app)$/i.test(a.app))return o(`${a.temp_ref}: app '${a.app}' is neither a build path (.apk / .zip of an .app) nor an APP\u2026 upload id \u2014 omit the field when only a bundle id exists`)}let w=U(t.contextDir),T=/^design@(\d+)$/.exec(t.templateVersion?.()??"");if(T&&Number.parseInt(T[1],10)>=6)for(let a of r.tests??[]){if(!Array.isArray(a.steps??[]))return o(`${a.temp_ref}: steps must be an array of objective strings or {text, verifies} objects`);let m=new Set;for(let k of Array.isArray(a.steps)?a.steps:[])if(typeof k=="object"&&k.verifies)for(let O of k.verifies)m.add(O);let _=new Set(a.verifies??[]),b=[..._].filter(k=>!m.has(k)),I=[...m].filter(k=>!_.has(k));if(!(m.size===0&&Gt(w,a))&&(m.size===0||b.length>0||I.length>0))return o(`${a.temp_ref}: every AC must be claimed by the step that proves it \u2014 `+(m.size===0?"no step carries verifies tags":`not claimed by any step: [${b.join(", ")}]; tagged but not in the test's verifies: [${I.join(", ")}]`))}if(r.variables!==void 0&&!Array.isArray(r.variables))return o("variables must be an array of {name, description, secret}");let $=!!T&&Number.parseInt(T[1],10)>=7;if((r.variables??[]).length>0&&!$)return o("variables[] needs design@7 \u2014 this session is bound to an older template; drop the section");let x=new Set;for(let a of r.variables??[]){if(!a||typeof a!="object"||typeof a.name!="string"||typeof a.description!="string"||typeof a.secret!="boolean")return o(`variables[]: every entry is {name, description, secret} \u2014 got ${JSON.stringify(a)}`);let m=Object.keys(a).filter(b=>!["name","description","secret"].includes(b));if(m.length>0)return o(`variables[]: '${a.name}' carries ${m.join(", ")} \u2014 a declaration has no value and no other fields`);let _=re(a.name);if(_)return o(`variables[]: ${_}`);if(!a.description.trim()||/[\r\n]/.test(a.description))return o(`variables[]: '${a.name}' needs a one-line, non-empty description`);if(x.has(a.name))return o(`variables[]: '${a.name}' is declared twice`);x.add(a.name)}if($){let a=t.variablesIndex?.()??new Map;for(let m of r.tests??[]){let _=[...(Array.isArray(m.steps)?m.steps:[]).map(b=>typeof b=="string"?b:b.text),m.check_prose??""];for(let b of _)for(let I of Ne(b))if(!(a.has(I)||x.has(I)))return o(`${m.temp_ref}: step references {{${I}}} but no variable named '${I}' exists in the pool and this payload does not declare it \u2014 reuse a name from the variables block, or declare it in \`variables\` ({name, description, secret})`)}}t.force&&!t.resuming&&e===0&&n===null&&(n=it(w,t.ucRef));let C=w.resolve(t.ucRef),M=C?String(w.getNode(C.tip)?.content.risk??"med"):"med",R=[],P=new Set([t.ucRef,C?.cid,C?.tip].filter(Boolean)),X=a=>{if(P.has(a))return!0;let m=w.resolve(a);return m!=null&&(P.has(m.cid)||P.has(m.tip))},E;try{E={...r.acs?.length?{acs:r.acs.map(a=>({temp_ref:a.temp_ref,text:a.text,kind:a.kind,risk:a.risk??M,...a.expected_answer?{expected_answer:a.expected_answer}:{},...a.scoped_to&&!X(a.scoped_to)?{scope:{type:"scenario",ref:a.scoped_to}}:{}}))}:{},...r.scenarios?.length?{scenarios:r.scenarios}:{},...r.tests?.length?{tests:r.tests.map(a=>Ft(w,r,a,R))}:{},...r.exercises?.length?{exercises:r.exercises}:{},...r.gaps?.length?{gaps:r.gaps}:{},...r.scoped_to_repoints?.length?{scoped_to_repoints:r.scoped_to_repoints}:{},...r.judgements?.length?{judgements:r.judgements}:{}}}catch(a){return o(a instanceof Error?a.message:String(a))}let q=r.phase??(r.tests?.length?"tests":r.scenarios?.length?"scenarios":r.acs?.length?"acs":"design"),f=(a,m={})=>({contextDir:t.contextDir,graph:a,ucRef:t.ucRef,sections:E,by:t.by,phase:q,...m,...t.templateVersion?{templateVersion:t.templateVersion()}:{},...t.engine?{engine:t.engine}:{},...n?.length?{forceScope:n}:{},...t.because?{reason:t.because}:{},finalizeTestBody:(()=>{let _=new Map((E.tests??[]).map(k=>[k.temp_ref,k])),b=new Map,I=(k,O,H)=>{let L=_.get(k);if(!L?.test_md_blob)return null;let z=b.get(k);if(z!==void 0)return z;if(H.has(k))return L.test_md_blob;H.add(k);let W=new Map;for(let s of L.reuses??[]){I(s,O,H);let d=O(s);d!==null&&d!==s&&W.set(s,d)}let j=L.verifies.map(O).filter(s=>s!==null),J=Ee(L.test_md_blob,W),{md:ne,tagged:D}=Se(J,O),K=D?ne:$e(J,j);return De(K,j),b.set(k,K),K};return(k,O)=>{if(!k.test_md_blob)return null;let H=I(k.temp_ref,O,new Set)??k.test_md_blob;if(H===k.test_md_blob)return null;let L=z=>{for(let W of _.keys())if(O(W)===z){let j=I(W,O,new Set);if(j!==null)return{body:j,cycleKey:`batch:${z}`,next:L}}return ue(w)(z)};return{test_md_blob:H,definitionId:de(me(H,L))}}})()}),l;if(t.protocol){let a=t.generationTicket,m=await Ge(t.protocol,{verb:"design",ucTargets:[{ref:t.ucRef}],newBuCandidates:[],sourcePins:[],readBasis:w.latestHash,...a?{generationTicket:a}:{}},_=>{let b=he(f(_.graph,{eventIds:_.eventIds("design",1),sid:_.sid,...a&&!t.generationStamped?{generationTicket:a}:{}}));return b.errors!==null?{errors:b.errors}:{result:b,record:b.record}});m.ok&&"result"in m?(l=m.result,a&&!t.generationStamped&&(t.generationStamped=!0,t.generationTicket={...a,expected_prev_gen:a.next_gen})):m.ok?l={record:null,errors:null,minted:{},logicalIds:{},superseded:[],warnings:["commit already applied (recommit)"],finalizedTests:{}}:l={record:null,errors:m.kind==="validation"?m.errors:m.kind==="contended"?[{code:m.err.code,detail:`${t.ucRef} is held by ${m.err.holder?.owner_sid??"another session"}${m.err.holder?.alive?" (live)":" (stale)"} \u2014 try another use-case or wait for it to free`}]:m.kind==="drifted"?m.asks.map(b=>({code:"DRIFTED",detail:b.detail})):[{code:"UNSETTLED",detail:`concurrent activity kept moving the store (${m.attempts} attempts) \u2014 retry when the store is quieter`}],minted:{},logicalIds:{},superseded:[],warnings:[],finalizedTests:{}}}else l=he(f(w));if(l.errors)return o("design commit failed: "+l.errors.map(a=>`${a.code}: ${a.detail}`).join("; "));let g=l.warnings.filter(a=>a.includes("\u2014 committed anyway; approve"));for(let a of l.warnings)(!g.includes(a)||g.length===1)&&t.note(`warning: ${a}`);g.length>1&&t.note(`warning: ${g.length} test link(s) refer to items still awaiting approval \u2014 saved anyway; review and approve those items in chat or via kane-cli context review`);let h=(a,m)=>a?`${a} ${m}${a>1?"s":""}`:null,S=[h(r.acs?.length,"AC"),h(r.scenarios?.length,"scenario"),h(r.tests?.length,"test"),h(r.gaps?.length,"gap")].filter(Boolean);t.aliases?.(Object.entries(l.minted).map(([a,m])=>({ref:a,cid:m,...l.logicalIds[a]?{id:l.logicalIds[a]}:{}})));{let a=`saved ${S.join(" \xB7 ")||"judgements/wiring"} as drafts`;(t.commitLine??t.note)(a)}let G=U(t.contextDir);t.onCommitted?.(G);for(let a of R){let m=l.logicalIds[a.anchorRef]??l.minted[a.anchorRef];nt(t.contextDir,l.finalizedTests[a.tempRef]??a.definitionId,{...a.rationale,anchor:m??a.rationale.anchor})}try{let a=Object.values(l.minted).filter(m=>G.getNode(m)?.label==="test");if(a.length>0){let m=vt(wt(t.contextDir)),_=je({graph:G,cids:a,cwd:m});_.wrote.length>0&&t.note(`\u2692 wrote ${_.wrote.map(b=>qt(b.path)).join(" \xB7 ")}`);for(let b of _.refused)t.note(`warning: could not create the test file for ${b.id} \u2014 ${b.reason}`)}}catch(a){t.note(`warning: the design was saved, but its test file could not be created (${a instanceof Error?a.message:String(a)})`)}try{if((r.variables??[]).length>0){let a=vt(wt(t.contextDir)),m=_t(a),{written:_}=yt({file:m,declarations:r.variables,known:t.variablesIndex?.()});if(_.sort(),_.length>0){let b=_.map(I=>({...r.variables.find(k=>k.name===I),file:m}));t.note(`\u2692 declared ${_.length} new variable${_.length===1?"":"s"} \u2014 ${_.join(" \xB7 ")} (values needed)`),t.event?.({type:"variables_declared",file:m,variables:b.map(({name:I,description:k,secret:O})=>({name:I,description:k,secret:O}))}),t.onVariablesDeclared?.(b)}}}catch(a){t.note(`warning: the design was saved, but its variable stubs could not be written (${a instanceof Error?a.message:String(a)})`)}t.event?.({type:"commit",acs:r.acs?.length??0,scenarios:r.scenarios?.length??0,tests:r.tests?.length??0,gaps:r.gaps?.length??0,warnings:l.warnings.length,minted:Object.entries(l.minted).map(([a,m])=>({temp_ref:a,cid:m,...l.logicalIds[a]?{logical_id:l.logicalIds[a]}:{}}))}),e+=1,n!==null&&(n=l.forceScopeRemaining??n,t.onForceScope?.(n));let V=ze({verb:"design",commitN:e,ucRef:t.ucRef,phase:q,committed:Object.entries(l.minted).map(([a,m])=>({temp_ref:a,cid:m,...l.logicalIds[a]?{logical_id:l.logicalIds[a]}:{}})),warnings:l.warnings},G),ee=V.event.parity?.missing??[],te=!!r.tests?.length&&ee.length===0;return{proposal:l,error:null,receipt:V,...te?{sessionComplete:te}:{}}}}}function xt(t,e){return{type:"run_config",version:1,session_id:e.session_id,mode:e.mode,source:{source_id:`design:${t.usecase.logical_id??e.ucCid.slice(0,19)}`,source_cid:e.ucCid,kind:"design_context",numbered_text:bt({...t,session_mode:e.mode})},existing_use_cases:[],read_basis:e.readBasis,max_free_text_rounds:2,graph_reads:!0,verb:"design",chat:!0,design_budget:t.budget,topology:e.topology}}var Dt=Symbol("design-out-tee");function Wt(t,e,n,i){return{terminalEventType:"design",async onProposalEvent(o){let r=o??{},v=["acs","scenarios","tests","gaps"].map(N=>r[N]?.length?`${r[N].length} ${N}`:null).filter(Boolean).join(" \xB7 ");return n?.("plan_payload",{payload:r}),t(`plan: finalize_design \u2014 ${v||"wiring/judgements only"} (nothing committed${i?`; full payload: ${Z(i)}`:""})`),e?.({type:"plan",payload:r}),{proposal:r,error:null}}}}async function ii(t,e){let n=U(e.contextDir),i=null,o=null,r=t.useCase;if(t.resume){try{{let p=await Ze(e.contextDir,t.resume,n,{deps:{onWarn:y=>e.out(`note: ${y}`)}});o=p,i=p.handle,p.drift.length>0&&(e.out(`note: sources changed since the pause: ${p.drift.map(y=>y.subject).join(", ")} \u2014 the design continues against the current versions`),e.emit?.({type:"stale_basis",sources:p.drift.map(y=>y.subject)}))}}catch(p){if(p instanceof ke||p instanceof fe)return e.out(`error: ${p.message}`),e.emit?.({type:"error",message:`error: ${p.message}`}),p instanceof fe||p.code==="SESSION_MISSING"||p.code==="SESSION_EXPIRED"?2:1;throw p}let s=i.state,d=We(s.verb,"design",t.resume);if(d)return e.out(d.message),e.emit?.({type:"error",message:d.message,code:d.code}),i.release(),2;if(r&&s.use_case&&r!==s.use_case){let p=`session ${t.resume} was designing ${s.use_case}; --use-case ${r} RETARGETS it`;if(!(t.confirmRetarget?await t.confirmRetarget(`${p} \u2014 continue with the new target?`):!1))return e.out(`error: ${p} \u2014 resume without --use-case to continue ${s.use_case}, or start a fresh session on ${r}`),e.emit?.({type:"error",code:"RETARGET_MISMATCH",message:p}),i.release(),2}if(r=r??s.use_case,s.uc_tip&&r){let p=n.resolve(r)?.tip;if(p&&p!==s.uc_tip){let y=`the use-case changed since the pause (${s.uc_tip.slice(0,19)}\u2026 \u2192 ${p.slice(0,19)}\u2026)`;if(!(t.confirmRetarget?await t.confirmRetarget(`${y} \u2014 re-ground and continue against the new version?`):!1))return e.out(`error: ${y} \u2014 resume interactively to re-ground, or abandon this session`),e.emit?.({type:"error",code:"UC_TIP_MOVED",message:y}),i.release(),2;e.emit?.({type:"stale_basis",usecase:r})}}let u=rt(n,s.target_pins);if(u.length>0){let p=`items this session pinned have changed since it paused: ${u.map(A=>`${A.ref}${A.now===null?" (now gone)":""}`).join(", ")}`;if(!(t.confirmRetarget?await t.confirmRetarget(`${p} \u2014 re-ground and continue?`):!1))return e.out(`error: ${p} \u2014 resume interactively to re-ground, or abandon`),e.emit?.({type:"error",code:"TARGET_PIN_MOVED",message:p}),i.release(),2;i.save({target_pins:(s.target_pins??[]).map(A=>({ref:A.ref,cid:n.resolve(A.ref)?.tip??A.cid}))})}let c=[...new Set([...i.state.held_receipts??[],...o?.view.kane?.held_receipts??[]])];if(c.length>0)if(e.chat?.holdReceipt)for(let p of c)e.chat.holdReceipt(p);else e={...e,initialMessage:[c.join(`
356
356
 
357
357
  `),e.initialMessage].filter(Boolean).join(`
358
358
 
359
- `)};if(!r)return e.out(`error: session ${t.resume} predates use-case persistence \u2014 re-supply --use-case <ref>`),e.emit?.({type:"error",message:`error: session ${t.resume} predates use-case persistence \u2014 re-supply --use-case <ref>`}),i.release(),2}let v=t.resume?void 0:t.phase,N=!1;if(v!==void 0){let{checkPhaseEntry:s,phaseEntryCmd:d,phaseLadderFor:u}=await import("./phase-seed-BMOSAA74.js");N=u(e.contextDir,n,r).length>0;let c=s(e.contextDir,n,r,v);if(!c.ok&&c.code==="UNKNOWN_PHASE")return e.out(`error: ${c.message}`),e.emit?.({type:"error",code:"UNKNOWN_PHASE",message:c.message}),i?.release(),2;if(!c.ok&&c.code==="PHASE_ORDER"){let p=t.askPhaseEntry?await t.askPhaseEntry({message:c.message,earliest:c.earliest}):"cancel";if(p==="earliest")e.out(`starting at ${c.earliest} instead (${c.missing.join(", ")} not committed yet)`),v=c.earliest;else if(p==="proceed")e.out(`note: entering at ${v} with ${c.missing.join(", ")} uncommitted \u2014 proceeding on your say-so`),e.emit?.({type:"phase_entry_override",phase:v,missing:c.missing});else{let y=(t.mode??"interactive")==="agent",A=d(r,c.earliest,y);return e.out(`error: ${c.message}`),e.emit?.({type:"error",code:"PHASE_ORDER",message:c.message,next:[{cmd:A,why:`${c.earliest} is the earliest uncommitted phase for ${r}`,title:`Start at ${c.earliest}`}]}),i?.release(),2}}}let w=!!(t.force||i?.state.force),T=!!(t.resume&&i),$=tt(n,r,w||T||N);if(!$.ok){let s=(t.mode??"interactive")==="interactive";if($.wall&&s&&t.askDesignEntry){let{captureForceScope:d}=await import("./design-committer-UPC6NZUF.js"),u=d(n,r).length,c=await t.askDesignEntry({wall:$.wall.kind,message:$.message,display:$.wall.display,impactPairs:u});if(c.pick==="redesign"||c.pick==="proceed"){if(!c.because.trim())return e.out("a redesign needs a reason (--because) \u2014 nothing executed"),i?.release(),2;e.out(c.pick==="redesign"?`redesigning ${$.wall.display} (${u} pair(s) superseded) \u2014 because: ${c.because.trim()}`:`proceeding against the stale design (noted) \u2014 because: ${c.because.trim()}`),t={...t,force:!0,because:t.because??c.because.trim()},w=!0}else return c.pick==="view"?(e.out(`view the existing design: kane-cli context view ${$.wall.display}`),i?.release(),0):c.pick==="refresh"?(e.out(`refresh it first: kane-cli maintain evolve ${$.wall.display}`),i?.release(),0):(e.out("nothing executed \u2014 list use-cases: kane-cli context list"),i?.release(),0)}else{e.out(`design: ${$.message}`);let d=$.wall&&t.mode==="agent"?[{cmd:`kane-cli context view ${$.wall.display}`,why:"view the existing design",title:"View the design"},...$.wall.kind==="designed-stale"?[{cmd:`kane-cli maintain evolve ${$.wall.display}`,why:"the use-case moved since the design \u2014 evolve refreshes it",title:"Evolve the design"}]:[],{cmd:`kane-cli design tests --use-case ${$.wall.display} --force --mode agent`,why:"redesign \u2014 supersedes the live scenario+test pairs",title:"Redesign"}]:void 0;return e.emit?.({type:"gate_refused",message:$.message,...d?{next:d}:{}}),i?.release(),$.code}}if(e.preflightTurn){let s=await e.preflightTurn();if(!s.ok)return e.out(s.message??"error: turn-endpoint preflight failed"),e.emit?.({type:"error",message:s.message??"error: turn-endpoint preflight failed",code:"PREFLIGHT"}),i?.release(),2}let x={contextDir:e.contextDir,resolveAlias:s=>Ge(s,{env:process.env,auth:e.auth}),embed:(s,d)=>Ve(s,d,{env:process.env,auth:e.auth})};e.chat?.setWorking?.("assembling context\u2026");let C=Pe(Oe(ae(e.contextDir))),M=[],R=await ht(e.contextDir,r,{max:t.max,strength:t.strength,embedSearch:x,variablesIndex:C});if(t.priorDesign!==void 0&&(R.prior_design=t.priorDesign),t.changeDelta!==void 0&&(R.change_delta=t.changeDelta),t.because&&(R.because=t.because),v!==void 0){let{buildPhaseSeed:s}=await import("./phase-seed-BMOSAA74.js"),d=s(e.contextDir,n,r,v);R.prior_design===void 0&&d.priorDesign!==void 0&&(R.prior_design=d.priorDesign),R.entry_phase=v,d.phaseLadder.length>0&&(R.phase_ladder=d.phaseLadder)}let P=e.now?.()??new Date,X=`${P.toISOString().replace(/[-:]/g,"").slice(0,15)}-${Ht(2).toString("hex")}`,E=t.mode??"interactive",q=E==="interactive"&&!!e.chat&&!e.nested,f=o?{...o.spawnConfig,mode:E}:xt(R,{session_id:t.resume??`design-${X}`,mode:E,ucCid:R.usecase.cid,readBasis:n.latestHash,topology:Qe("design")}),l={current:null};if(f.resume&&"schema"in f.resume){let s=f.resume.binding?.template_version;typeof s=="string"&&(l.current=s)}t.plan?f.chat=!1:f.chat=!0;let g=e.telemetry?.enabled?e.telemetry:void 0,h=g?we(g.ids.context_instance_id??null,"design",g.ids.session_id):ve(e.contextDir,"logs",`design-${X}.log`);Vt(ae(h),{recursive:!0}),q||e.out(`trace: ${Z(h)}`),e.emit?.({type:"run_start",mode:E,trace:h,use_case:r,...g?{session:g.ids.session_id}:{}});let S=(s,d,u)=>{try{Ut(h,JSON.stringify({ts:new Date().toISOString(),level:s==="error"?"error":"info",run_id:g?.ids.operation_id,...g?{user_session_id:g.ids.session_id}:{},kind:s,session_id:u,data:d})+`
360
- `)}catch{}g?.wireTrace(s,d,u)};{let s=e.out;if(s[Dt]!==!0){let d=u=>{S("transcript",{line:u}),s(u)};d[Dt]=!0,e.out=d}}if(t.resume&&i){o||(f.resume={agent_state:i.state.agent_state}),e.out(`resuming design session ${t.resume}`),i.state.assumed.length>0&&e.out(`note: ${i.state.assumed.length} default(s) were assumed while you were away \u2014 kane-cli context sessions show ${t.resume} lists them`);try{let{readRecords:s}=await import("./records-JLS63SDI.js"),d=s(e.contextDir).records.filter(u=>u.sid===t.resume).map(u=>u.design_phase).filter(u=>u!=null&&typeof u.phase=="string");if(d.length>0){let u=d.map(p=>`${p.phase}${p.completeness==="partial"?" (partial)":""}`).join(" \u2192 "),c=`[kane] durable record for this session (${t.resume}) on ${r}: design phases already COMMITTED \u2014 ${u}. Those finalizes landed; do not re-send them. Continue from the next uncommitted phase, or finish if the design is complete.`;e={...e,initialMessage:[e.initialMessage,c].filter(Boolean).join(`
359
+ `)};if(!r)return e.out(`error: session ${t.resume} predates use-case persistence \u2014 re-supply --use-case <ref>`),e.emit?.({type:"error",message:`error: session ${t.resume} predates use-case persistence \u2014 re-supply --use-case <ref>`}),i.release(),2}let v=t.resume?void 0:t.phase,N=!1;if(v!==void 0){let{checkPhaseEntry:s,phaseEntryCmd:d,phaseLadderFor:u}=await import("./phase-seed-HKJ2EF7R.js");N=u(e.contextDir,n,r).length>0;let c=s(e.contextDir,n,r,v);if(!c.ok&&c.code==="UNKNOWN_PHASE")return e.out(`error: ${c.message}`),e.emit?.({type:"error",code:"UNKNOWN_PHASE",message:c.message}),i?.release(),2;if(!c.ok&&c.code==="PHASE_ORDER"){let p=t.askPhaseEntry?await t.askPhaseEntry({message:c.message,earliest:c.earliest}):"cancel";if(p==="earliest")e.out(`starting at ${c.earliest} instead (${c.missing.join(", ")} not committed yet)`),v=c.earliest;else if(p==="proceed")e.out(`note: entering at ${v} with ${c.missing.join(", ")} uncommitted \u2014 proceeding on your say-so`),e.emit?.({type:"phase_entry_override",phase:v,missing:c.missing});else{let y=(t.mode??"interactive")==="agent",A=d(r,c.earliest,y);return e.out(`error: ${c.message}`),e.emit?.({type:"error",code:"PHASE_ORDER",message:c.message,next:[{cmd:A,why:`${c.earliest} is the earliest uncommitted phase for ${r}`,title:`Start at ${c.earliest}`}]}),i?.release(),2}}}let w=!!(t.force||i?.state.force),T=!!(t.resume&&i),$=st(n,r,w||T||N);if(!$.ok){let s=(t.mode??"interactive")==="interactive";if($.wall&&s&&t.askDesignEntry){let{captureForceScope:d}=await import("./design-committer-J57IAAA5.js"),u=d(n,r).length,c=await t.askDesignEntry({wall:$.wall.kind,message:$.message,display:$.wall.display,impactPairs:u});if(c.pick==="redesign"||c.pick==="proceed"){if(!c.because.trim())return e.out("a redesign needs a reason (--because) \u2014 nothing executed"),i?.release(),2;e.out(c.pick==="redesign"?`redesigning ${$.wall.display} (${u} pair(s) superseded) \u2014 because: ${c.because.trim()}`:`proceeding against the stale design (noted) \u2014 because: ${c.because.trim()}`),t={...t,force:!0,because:t.because??c.because.trim()},w=!0}else return c.pick==="view"?(e.out(`view the existing design: kane-cli context view ${$.wall.display}`),i?.release(),0):c.pick==="refresh"?(e.out(`refresh it first: kane-cli maintain evolve ${$.wall.display}`),i?.release(),0):(e.out("nothing executed \u2014 list use-cases: kane-cli context list"),i?.release(),0)}else{e.out(`design: ${$.message}`);let d=$.wall&&t.mode==="agent"?[{cmd:`kane-cli context view ${$.wall.display}`,why:"view the existing design",title:"View the design"},...$.wall.kind==="designed-stale"?[{cmd:`kane-cli maintain evolve ${$.wall.display}`,why:"the use-case moved since the design \u2014 evolve refreshes it",title:"Evolve the design"}]:[],{cmd:`kane-cli design tests --use-case ${$.wall.display} --force --mode agent`,why:"redesign \u2014 supersedes the live scenario+test pairs",title:"Redesign"}]:void 0;return e.emit?.({type:"gate_refused",message:$.message,...d?{next:d}:{}}),i?.release(),$.code}}if(e.preflightTurn){let s=await e.preflightTurn();if(!s.ok)return e.out(s.message??"error: turn-endpoint preflight failed"),e.emit?.({type:"error",message:s.message??"error: turn-endpoint preflight failed",code:"PREFLIGHT"}),i?.release(),2}let x={contextDir:e.contextDir,resolveAlias:s=>Ve(s,{env:process.env,auth:e.auth}),embed:(s,d)=>Ue(s,d,{env:process.env,auth:e.auth})};e.chat?.setWorking?.("assembling context\u2026");let C=Pe(Oe(ae(e.contextDir))),M=[],R=await ht(e.contextDir,r,{max:t.max,strength:t.strength,embedSearch:x,variablesIndex:C});if(t.priorDesign!==void 0&&(R.prior_design=t.priorDesign),t.changeDelta!==void 0&&(R.change_delta=t.changeDelta),t.because&&(R.because=t.because),v!==void 0){let{buildPhaseSeed:s}=await import("./phase-seed-HKJ2EF7R.js"),d=s(e.contextDir,n,r,v);R.prior_design===void 0&&d.priorDesign!==void 0&&(R.prior_design=d.priorDesign),R.entry_phase=v,d.phaseLadder.length>0&&(R.phase_ladder=d.phaseLadder)}let P=e.now?.()??new Date,X=`${P.toISOString().replace(/[-:]/g,"").slice(0,15)}-${Ht(2).toString("hex")}`,E=t.mode??"interactive",q=E==="interactive"&&!!e.chat&&!e.nested,f=o?{...o.spawnConfig,mode:E}:xt(R,{session_id:t.resume??`design-${X}`,mode:E,ucCid:R.usecase.cid,readBasis:n.latestHash,topology:Je("design")}),l={current:null};if(f.resume&&"schema"in f.resume){let s=f.resume.binding?.template_version;typeof s=="string"&&(l.current=s)}t.plan?f.chat=!1:f.chat=!0;let g=e.telemetry?.enabled?e.telemetry:void 0,h=g?we(g.ids.context_instance_id??null,"design",g.ids.session_id):ve(e.contextDir,"logs",`design-${X}.log`);Vt(ae(h),{recursive:!0}),q||e.out(`trace: ${Z(h)}`),e.emit?.({type:"run_start",mode:E,trace:h,use_case:r,...g?{session:g.ids.session_id}:{}});let S=(s,d,u)=>{try{Ut(h,JSON.stringify({ts:new Date().toISOString(),level:s==="error"?"error":"info",run_id:g?.ids.operation_id,...g?{user_session_id:g.ids.session_id}:{},kind:s,session_id:u,data:d})+`
360
+ `)}catch{}g?.wireTrace(s,d,u)};{let s=e.out;if(s[Dt]!==!0){let d=u=>{S("transcript",{line:u}),s(u)};d[Dt]=!0,e.out=d}}if(t.resume&&i){o||(f.resume={agent_state:i.state.agent_state}),e.out(`resuming design session ${t.resume}`),i.state.assumed.length>0&&e.out(`note: ${i.state.assumed.length} default(s) were assumed while you were away \u2014 kane-cli context sessions show ${t.resume} lists them`);try{let{readRecords:s}=await import("./records-TJJJWBUD.js"),d=s(e.contextDir).records.filter(u=>u.sid===t.resume).map(u=>u.design_phase).filter(u=>u!=null&&typeof u.phase=="string");if(d.length>0){let u=d.map(p=>`${p.phase}${p.completeness==="partial"?" (partial)":""}`).join(" \u2192 "),c=`[kane] durable record for this session (${t.resume}) on ${r}: design phases already COMMITTED \u2014 ${u}. Those finalizes landed; do not re-send them. Continue from the next uncommitted phase, or finish if the design is complete.`;e={...e,initialMessage:[e.initialMessage,c].filter(Boolean).join(`
361
361
 
362
362
  `)}}}catch{}t.message&&(e={...e,initialMessage:[e.initialMessage,t.message].filter(Boolean).join(`
363
363
 
364
- `)})}let G=null,V={current:n},ee={detach:null},te=()=>{let s=ee.detach;ee.detach=null,s&&s()},a=(s,d)=>{let u=i;if(!u)return{};let c=s.ask,p=Ke({contextDir:s.contextDir,cwd:ae(s.contextDir),handle:u,note:y=>s.chat?s.chat.note(y):s.out(y),graphSlot:d,...s.now?{now:s.now}:{}});if(s.chat?.attachIngest){let y=s.chat;ee.detach=y.attachIngest(async A=>{try{u.save({ingest_registry:ge(u.state.ingest_registry,A,s.now?.()??new Date)});let B=await p({id:`attach-${u.state.sid}-${(u.state.ingest_registry??[]).length}`,ref:A,purpose:null});return B.ok?(y.deferBatch({source_id:B.result.source_id,cid:B.result.cid}),{ok:!0}):{ok:!1,error:B.error.message}}catch(B){return{ok:!1,error:B instanceof Error?B.message:String(B)}}})}return{ask:async y=>{let A=await c(y);if(Array.isArray(A)){let B=A.filter(F=>{if(F.free_text==null||F.free_text.trim()==="")return!1;let oe=y.find($t=>$t.id===F.id);return F.selected_index!=null&&oe?.options[F.selected_index]?.input===!0}).map(F=>F.free_text.trim());if(B.length>0){let F=u.state.ingest_registry;for(let oe of B)F=ge(F,oe,s.now?.()??new Date);u.save({ingest_registry:F})}}return A},ingest:p}};e.nested||e.chat?.attachOnCommitted?.(s=>{V.current=s});let m="";if(e.chat&&!t.plan&&!e.nested){let s=Ue({contextDir:e.contextDir,graph:U(e.contextDir),sessionStamp:f.session_id,by:e.by??{kind:"human",id:"owner"}});s.errors===null||s.errors[0]?.code==="CONV_SOURCE_EXISTS"?(m=s.sourceId,e.chat.attachConversationSource?.(m),V.current=U(e.contextDir)):e.out(`warning: notes you add in chat can't be saved to the context this session (${s.errors[0]?.detail})`)}let _=U(e.contextDir),b;if(!t.plan){let s=Me(_,r);if(T&&s!==null&&s.live){let d=_.resolve(r);b={uc_root:Le(_,d.cid),next_gen:s.gen,expected_prev_gen:s.gen}}else{let d=Be(_,r,{...w?{force:!0}:{},because:t.because??(w?"forced redesign (--force)":void 0)});if("error"in d)return e.out(`design: ${d.error.detail}`),e.emit?.({type:"gate_refused",message:d.error.detail,code:d.error.code}),i?.release(),2;b=d}}let I=Ae(e.contextDir,f.session_id),k=null,O=()=>{try{k?.release()}catch{}};if(!t.plan)try{k=I.acquire([Te(_,r).key],{hold:"session",verb:"design"})}catch(s){if(s instanceof Ce&&s.code==="UC_HELD"){let d=s.holder,u=`design: ${r} is being designed by another session${d?.alive===!1?` \u2014 that session looks stopped; resume it with kane-cli design tests --resume ${d?.owner_sid??"<session>"}`:""} \u2014 pick another use-case (kane-cli design tests) or wait for it to finish`;return e.out(u),e.emit?.({type:"error",code:"UC_HELD",message:u}),i?.release(),2}throw s}let H={contextDir:e.contextDir,rootSid:f.session_id,locks:I,probe:{batchSimilar:async()=>({hits:[],degraded:!1,probeBasis:null}),recheckLocal:()=>({hits:[],uncachedNewNodes:[]})}},L=!t.plan&&E!=="ci",z=()=>Object.fromEntries((n.resolve(r)?n.edgesInto(n.resolve(r).tip):[]).filter(s=>s.type==="DERIVES"&&typeof s.props.source_id=="string").map(s=>[String(s.props.source_id),n.heads.get(String(s.props.source_id))??null])),W=!1;L&&!i&&(W=!0,i=le(e.contextDir,{sid:f.session_id,mode:"agent",created_at:P.toISOString(),expires_at:new Date(P.getTime()+1440*60*1e3).toISOString(),agent_state:{schema:2,items:[],provider_state:""},pending:{questions:[],proposals:[]},read_basis:z(),assumed:[],corpus_cursor:{remaining:[]},conv_source:m,target_pins:n.resolve(r)?[{ref:r,cid:n.resolve(r).tip}]:[],verb:"design",use_case:r,...n.resolve(r)?.tip?{uc_tip:n.resolve(r).tip}:{},...w?{force:!0}:{},...g?{user_session_id:g.ids.session_id}:{}}));let j;if(L&&i){let{resume:s,...d}=f;qe(e.contextDir,f.session_id,{schema:je,kind:"base",sid:f.session_id,verb:"design",mode:E,created_at:P.toISOString(),run_config:d,conv_source:m||i.state.conv_source||"",...r?{use_case:r}:{},...n.resolve(r)?.tip?{uc_tip:n.resolve(r).tip}:{},store_watermark:Ie(e.contextDir)}),f.checkpoints=!0,t.resume&&S("resume_kind",{kind:o?o.view.pointer===null?"bare-base":o.view.pointer.at==="final"?"pause":"crash":"v1-shim"},f.session_id);let u=o?0:i.state.checkpoint?.seq??0,c=i;j=Ye({contextDir:e.contextDir,handle:c,seqBase:()=>u,peekHeldReceipts:()=>e.chat?.peekHeldReceipts?.()??[],readBasis:()=>z(),corpusCursor:()=>({remaining:[]}),onSoftCap:y=>e.out(y),onStat:y=>S("ckpt_stat",y,f.session_id),...e.now?{now:e.now}:{}});let p=j;j={...p,persist:y=>{let A=y.binding?.template_version;return typeof A=="string"&&A&&(l.current=A),p.persist(y)}}}!L&&!t.plan&&(f.checkpoints=!0,j={persist:s=>{let d=s.binding?.template_version;return typeof d=="string"&&d&&(l.current=d),{seq:s.seq,turn_id:s.turn_id,at:s.at,ts:new Date().toISOString(),full_seq:null}}});let J=()=>{if(!i)return;let s=i.state.checkpoint;if(s){let d=E!=="interactive"?` --mode ${E}`:"";e.out(`session ${i.state.sid} kept its last checkpoint (seq ${s.seq}, ${s.ts}) \u2014 resume with: kane-cli design tests --resume ${i.state.sid}${d}`),i.release()}else if(W){try{i.complete()}catch{i.release()}try{St(ve(e.contextDir,"sessions"))}catch{}}else i.release();i=null},ne=t.plan?Wt(e.out,e.emit,S,h):kt({templateVersion:()=>l.current,contextDir:e.contextDir,ucRef:r,by:{kind:"ai",id:"design-agent"},force:w,engine:"design@1",note:s=>e.chat?e.chat.note(s):e.out(s),commitLine:s=>e.chat?e.chat.ledger({kind:"commit",ok:!0,line:s}):e.out(s),steer:e.chat?s=>e.chat.submit(s):void 0,event:e.emit,variablesIndex:()=>C,onVariablesDeclared:s=>{M.push(...s);for(let d of s)C.set(d.name,{has_value:!1,source:d.file})},resuming:T,...i?.state.force_scope?.length?{forceScope:i.state.force_scope}:{},onForceScope:s=>{G=s},...t.because?{because:t.because}:{},aliases:e.chat?s=>e.chat.registerAliases?.(s):void 0,onCommitted:s=>{V.current=s},protocol:H,...b?{generationTicket:b}:{},...T?{generationStamped:!0}:{}});e.chat||(S("design_budget",{max_pairs:R.budget.max_pairs??null,strength:R.budget.strength_override??null}),e.out(`designing: ${R.usecase.logical_id??r}`)),e.chat?.setWorking?.(`designing ${R.usecase.logical_id??r}\u2026`);let D;try{D=await pe(f,{...e,graphSlot:V,...a(e,V),...j?{checkpoint:j}:{}},new Map,n,S,ne)}catch(s){throw S("error",{message:s instanceof Error?s.message:String(s),stack:s instanceof Error?s.stack:void 0},f.session_id),J(),s}finally{e.chat?.setWorking?.(null),te()}if(D.errorCode==="binding_mismatch"&&o){let s=await e.ask([{id:"binding-mismatch",text:"this session's saved conversation is no longer accepted by the service \u2014 start the conversation fresh (committed work is kept), or stop and keep the session?",risk:"high",rationale:"the service refused the saved conversation on the first turn after resume",options:[{label:"start fresh",detail:"continue with a fresh conversation \u2014 earlier answers may be re-asked"},{label:"stop",detail:"stop here; the session stays resumable"}],recommended_index:1,allow_free_text:!1}]);if((Array.isArray(s)?s.find(c=>c.id==="binding-mismatch"):void 0)?.selected_index!==0){let c=`resume abandoned: binding mismatch on session ${f.session_id} \u2014 the session is preserved`;return e.out(c),e.emit?.({type:"error",message:c,code:"BINDING_MISMATCH"}),i?.release(),2}S("binding_migrate",{sid:f.session_id},f.session_id);let u=f.resume&&"schema"in f.resume?{...f.resume,binding:{}}:void 0;try{D=await pe({...f,...u?{resume:u}:{}},{...e,graphSlot:V,...a(e,V),...j?{checkpoint:j}:{}},new Map,n,S,ne)}catch(c){throw S("error",{message:c instanceof Error?c.message:String(c),stack:c instanceof Error?c.stack:void 0},f.session_id),J(),c}finally{e.chat?.setWorking?.(null),te()}}if(D.highRisk)return e.out(`error: ${D.highRisk.length} high-risk decision${D.highRisk.length===1?"":"s"} need a human \u2014 ci mode won't guess. Re-run with --mode agent to pause for review.`),e.emit?.({type:"error",message:`error: high-risk question(s) in ci mode (fail-closed): ${D.highRisk.map(s=>s.id).join(", ")}`,code:"HIGH_RISK_CI"}),J(),O(),1;if(D.paused){let s=i;s||(s=le(e.contextDir,{sid:f.session_id,mode:"agent",created_at:P.toISOString(),expires_at:new Date(P.getTime()+1440*60*1e3).toISOString(),agent_state:D.paused.agent_state,pending:{questions:[],proposals:[]},read_basis:Object.fromEntries((n.resolve(r)?n.edgesInto(n.resolve(r).tip):[]).filter(c=>c.type==="DERIVES"&&typeof c.props.source_id=="string").map(c=>[String(c.props.source_id),n.heads.get(String(c.props.source_id))??null])),assumed:[],corpus_cursor:{remaining:[]},conv_source:m,target_pins:n.resolve(r)?[{ref:r,cid:n.resolve(r).tip}]:[],verb:"design",use_case:r,...n.resolve(r)?.tip?{uc_tip:n.resolve(r).tip}:{},...w?{force:!0}:{},...g?{user_session_id:g.ids.session_id}:{}}));try{w&&!s.state.force&&s.save({force:!0}),g&&s.state.user_session_id!==g.ids.session_id&&s.save({user_session_id:g.ids.session_id}),m&&s.state.conv_source!==m&&s.save({conv_source:m});let c=e.chat?.drainHeldReceipts?.()??[];(c.length>0||(s.state.held_receipts?.length??0)>0)&&s.save({held_receipts:c}),G!==null&&s.save({force_scope:G}),Je(s,D.paused)}catch(c){let p=s.state.checkpoint,y=`error: couldn't persist the pause for session ${s.state.sid}`+(p?` \u2014 last durable checkpoint: seq ${p.seq} @ ${p.ts}`:" \u2014 no durable checkpoint exists")+` (${c instanceof Error?c.message:String(c)})`;return e.out(y),e.emit?.({type:"error",message:y,code:"PAUSE_PERSIST_FAILED",sid:s.state.sid}),1}S("session_paused",{sid:s.state.sid},f.session_id);let d=E!=="interactive"?` --mode ${E}`:"",u=`kane-cli design tests --resume ${s.state.sid}${d}`;if(q||e.out(`paused \u2014 resume with: ${u}`),e.emit?.({type:"session_paused",sid:s.state.sid,mode:E,resume:u,expires_at:s.state.expires_at,pending_questions:D.paused.pending.questions}),q){let c=e.chat?.state.credits?.total;e.onSummary?.({state:"paused",reason:"ctrl+c",facts:[`session ${s.state.sid} saved \u2014 designing ${R.usecase.logical_id??r}`,...s.state.expires_at?[`expires: ${s.state.expires_at}`]:[],...c!==void 0?[`credits used: ${c.toFixed(1)}`]:[]],resume:u,resumeMessage:`${u} --message "<your words>"`,tracePath:Z(h)})}return O(),3}if(D.crashed&&i?.state.checkpoint){let s=i.state.checkpoint,d=E!=="interactive"?` --mode ${E}`:"",u=`kane-cli design tests --resume ${i.state.sid}${d}`;if(S("agent_crashed_resumable",{sid:i.state.sid,seq:s.seq},f.session_id),q||e.out(`agent crashed \u2014 session ${i.state.sid} is resumable at checkpoint seq ${s.seq} (at most the in-flight turn lost); resume with: ${u}`),e.emit?.({type:"session_paused",sid:i.state.sid,mode:E,resume:u,expires_at:i.state.expires_at,crashed:!0}),q){let c=e.chat?.state.credits?.total;e.onSummary?.({state:"crashed",facts:[`agent crashed \u2014 session ${i.state.sid} is resumable at checkpoint seq ${s.seq}`,"at most the in-flight turn was lost",...c!==void 0?[`credits used: ${c.toFixed(1)}`]:[]],resume:u,resumeMessage:`${u} --message "<your words>"`,tracePath:Z(h)})}return i.release(),i=null,3}if(D.error)return e.out(`error: design agent failed: ${D.error}`),e.emit?.({type:"error",message:`error: design agent failed: ${D.error}`}),J(),O(),1;if(D.proposal==null&&E!=="interactive")return e.out(`error: the design session stopped before saving anything \u2014 nothing committed (trace: ${h})`),e.emit?.({type:"error",message:`error: the design session stopped before saving anything \u2014 nothing committed (trace: ${h})`}),J(),O(),1;let K=0;if(D.proposal==null)try{let{readRecords:s}=await import("./records-JLS63SDI.js"),d=t.resume??f.session_id;K=s(e.contextDir).records.filter(u=>u.sid===d).reduce((u,c)=>u+c.nodes.filter(p=>p.label!=="source").length,0)}catch{}if(D.proposal==null&&e.out(K>0?`done \u2014 ${K} item(s) committed in this session (earlier legs included); nothing new since the resume`:"done \u2014 nothing designed this session (no finalize before the session ended)"),D.assumedDefaults&&e.out(`assumed: ${D.assumedDefaults} default(s) taken while unattended`),i&&e.emit?.({type:"session_complete",sid:t.resume??f.session_id}),g?.event("ASR_SESSION_COMPLETE",{}),i?.complete(),W)try{St(ve(e.contextDir,"sessions"))}catch{}if(M.length>0){let s=Kt(M,ae(e.contextDir));e.chat?e.chat.note(s):e.out(s),e.emit?.({type:"variables_summary",file:M[0].file,variables:M.map(({name:d,description:u,secret:c})=>({name:d,description:u,secret:c}))})}if(q){let s=e.chat.state.ledger.filter(c=>c.kind==="answer"&&c.receipt.form==="assumed").length??0,d=(D.assumedDefaults??0)+s,u=e.chat.state.credits?.total??D.creditsTotal;e.onSummary?.({state:"complete",facts:[`designed: ${R.usecase.logical_id??r}${D.proposal==null?K>0?` (${K} item(s) committed across this session)`:" (nothing committed this session)":""}`,...M.length>0?[`${M.length} variable(s) need values \u2014 see .testmuai/variables/assurance.json`]:[],...d>0?[`${d} assumed default(s)`]:[],...u!==void 0?[`credits used: ${u.toFixed(1)}`]:[]],tracePath:Z(h)})}return t.plan||Ze(e.contextDir),O(),0}function Kt(t,e){if(t.length===0)return"";let n=zt(e,t[0].file)||t[0].file,i=Math.max(...t.map(r=>r.name.length))+3,o=t.slice().sort((r,v)=>r.name<v.name?-1:1).map(r=>` ${r.name.padEnd(i)}${r.description}${r.secret?" (secret)":""}`);return`variables declared this session \u2014 fill their values before running:
364
+ `)})}let G=null,V={current:n},ee={detach:null},te=()=>{let s=ee.detach;ee.detach=null,s&&s()},a=(s,d)=>{let u=i;if(!u)return{};let c=s.ask,p=Qe({contextDir:s.contextDir,cwd:ae(s.contextDir),handle:u,note:y=>s.chat?s.chat.note(y):s.out(y),graphSlot:d,...s.now?{now:s.now}:{}});if(s.chat?.attachIngest){let y=s.chat;ee.detach=y.attachIngest(async A=>{try{u.save({ingest_registry:ge(u.state.ingest_registry,A,s.now?.()??new Date)});let B=await p({id:`attach-${u.state.sid}-${(u.state.ingest_registry??[]).length}`,ref:A,purpose:null});return B.ok?(y.deferBatch({source_id:B.result.source_id,cid:B.result.cid}),{ok:!0}):{ok:!1,error:B.error.message}}catch(B){return{ok:!1,error:B instanceof Error?B.message:String(B)}}})}return{ask:async y=>{let A=await c(y);if(Array.isArray(A)){let B=A.filter(F=>{if(F.free_text==null||F.free_text.trim()==="")return!1;let oe=y.find($t=>$t.id===F.id);return F.selected_index!=null&&oe?.options[F.selected_index]?.input===!0}).map(F=>F.free_text.trim());if(B.length>0){let F=u.state.ingest_registry;for(let oe of B)F=ge(F,oe,s.now?.()??new Date);u.save({ingest_registry:F})}}return A},ingest:p}};e.nested||e.chat?.attachOnCommitted?.(s=>{V.current=s});let m="";if(e.chat&&!t.plan&&!e.nested){let s=He({contextDir:e.contextDir,graph:U(e.contextDir),sessionStamp:f.session_id,by:e.by??{kind:"human",id:"owner"}});s.errors===null||s.errors[0]?.code==="CONV_SOURCE_EXISTS"?(m=s.sourceId,e.chat.attachConversationSource?.(m),V.current=U(e.contextDir)):e.out(`warning: notes you add in chat can't be saved to the context this session (${s.errors[0]?.detail})`)}let _=U(e.contextDir),b;if(!t.plan){let s=Be(_,r);if(T&&s!==null&&s.live){let d=_.resolve(r);b={uc_root:Me(_,d.cid),next_gen:s.gen,expected_prev_gen:s.gen}}else{let d=Fe(_,r,{...w?{force:!0}:{},because:t.because??(w?"forced redesign (--force)":void 0)});if("error"in d)return e.out(`design: ${d.error.detail}`),e.emit?.({type:"gate_refused",message:d.error.detail,code:d.error.code}),i?.release(),2;b=d}}let I=Ae(e.contextDir,f.session_id),k=null,O=()=>{try{k?.release()}catch{}};if(!t.plan)try{k=I.acquire([Te(_,r).key],{hold:"session",verb:"design"})}catch(s){if(s instanceof Ce&&s.code==="UC_HELD"){let d=s.holder,u=`design: ${r} is being designed by another session${d?.alive===!1?` \u2014 that session looks stopped; resume it with kane-cli design tests --resume ${d?.owner_sid??"<session>"}`:""} \u2014 pick another use-case (kane-cli design tests) or wait for it to finish`;return e.out(u),e.emit?.({type:"error",code:"UC_HELD",message:u}),i?.release(),2}throw s}let H={contextDir:e.contextDir,rootSid:f.session_id,locks:I,probe:{batchSimilar:async()=>({hits:[],degraded:!1,probeBasis:null}),recheckLocal:()=>({hits:[],uncachedNewNodes:[]})}},L=!t.plan&&E!=="ci",z=()=>Object.fromEntries((n.resolve(r)?n.edgesInto(n.resolve(r).tip):[]).filter(s=>s.type==="DERIVES"&&typeof s.props.source_id=="string").map(s=>[String(s.props.source_id),n.heads.get(String(s.props.source_id))??null])),W=!1;L&&!i&&(W=!0,i=le(e.contextDir,{sid:f.session_id,mode:"agent",created_at:P.toISOString(),expires_at:new Date(P.getTime()+1440*60*1e3).toISOString(),agent_state:{schema:2,items:[],provider_state:""},pending:{questions:[],proposals:[]},read_basis:z(),assumed:[],corpus_cursor:{remaining:[]},conv_source:m,target_pins:n.resolve(r)?[{ref:r,cid:n.resolve(r).tip}]:[],verb:"design",use_case:r,...n.resolve(r)?.tip?{uc_tip:n.resolve(r).tip}:{},...w?{force:!0}:{},...g?{user_session_id:g.ids.session_id}:{}}));let j;if(L&&i){let{resume:s,...d}=f;Le(e.contextDir,f.session_id,{schema:qe,kind:"base",sid:f.session_id,verb:"design",mode:E,created_at:P.toISOString(),run_config:d,conv_source:m||i.state.conv_source||"",...r?{use_case:r}:{},...n.resolve(r)?.tip?{uc_tip:n.resolve(r).tip}:{},store_watermark:Ie(e.contextDir)}),f.checkpoints=!0,t.resume&&S("resume_kind",{kind:o?o.view.pointer===null?"bare-base":o.view.pointer.at==="final"?"pause":"crash":"v1-shim"},f.session_id);let u=o?0:i.state.checkpoint?.seq??0,c=i;j=Xe({contextDir:e.contextDir,handle:c,seqBase:()=>u,peekHeldReceipts:()=>e.chat?.peekHeldReceipts?.()??[],readBasis:()=>z(),corpusCursor:()=>({remaining:[]}),onSoftCap:y=>e.out(y),onStat:y=>S("ckpt_stat",y,f.session_id),...e.now?{now:e.now}:{}});let p=j;j={...p,persist:y=>{let A=y.binding?.template_version;return typeof A=="string"&&A&&(l.current=A),p.persist(y)}}}!L&&!t.plan&&(f.checkpoints=!0,j={persist:s=>{let d=s.binding?.template_version;return typeof d=="string"&&d&&(l.current=d),{seq:s.seq,turn_id:s.turn_id,at:s.at,ts:new Date().toISOString(),full_seq:null}}});let J=()=>{if(!i)return;let s=i.state.checkpoint;if(s){let d=E!=="interactive"?` --mode ${E}`:"";e.out(`session ${i.state.sid} kept its last checkpoint (seq ${s.seq}, ${s.ts}) \u2014 resume with: kane-cli design tests --resume ${i.state.sid}${d}`),i.release()}else if(W){try{i.complete()}catch{i.release()}try{St(ve(e.contextDir,"sessions"))}catch{}}else i.release();i=null},ne=t.plan?Wt(e.out,e.emit,S,h):kt({templateVersion:()=>l.current,contextDir:e.contextDir,ucRef:r,by:{kind:"ai",id:"design-agent"},force:w,engine:"design@1",note:s=>e.chat?e.chat.note(s):e.out(s),commitLine:s=>e.chat?e.chat.ledger({kind:"commit",ok:!0,line:s}):e.out(s),steer:e.chat?s=>e.chat.submit(s):void 0,event:e.emit,variablesIndex:()=>C,onVariablesDeclared:s=>{M.push(...s);for(let d of s)C.set(d.name,{has_value:!1,source:d.file})},resuming:T,...i?.state.force_scope?.length?{forceScope:i.state.force_scope}:{},onForceScope:s=>{G=s},...t.because?{because:t.because}:{},aliases:e.chat?s=>e.chat.registerAliases?.(s):void 0,onCommitted:s=>{V.current=s},protocol:H,...b?{generationTicket:b}:{},...T?{generationStamped:!0}:{}});e.chat||(S("design_budget",{max_pairs:R.budget.max_pairs??null,strength:R.budget.strength_override??null}),e.out(`designing: ${R.usecase.logical_id??r}`)),e.chat?.setWorking?.(`designing ${R.usecase.logical_id??r}\u2026`);let D;try{D=await pe(f,{...e,graphSlot:V,...a(e,V),...j?{checkpoint:j}:{}},new Map,n,S,ne)}catch(s){throw S("error",{message:s instanceof Error?s.message:String(s),stack:s instanceof Error?s.stack:void 0},f.session_id),J(),s}finally{e.chat?.setWorking?.(null),te()}if(D.errorCode==="binding_mismatch"&&o){let s=await e.ask([{id:"binding-mismatch",text:"this session's saved conversation is no longer accepted by the service \u2014 start the conversation fresh (committed work is kept), or stop and keep the session?",risk:"high",rationale:"the service refused the saved conversation on the first turn after resume",options:[{label:"start fresh",detail:"continue with a fresh conversation \u2014 earlier answers may be re-asked"},{label:"stop",detail:"stop here; the session stays resumable"}],recommended_index:1,allow_free_text:!1}]);if((Array.isArray(s)?s.find(c=>c.id==="binding-mismatch"):void 0)?.selected_index!==0){let c=`resume abandoned: binding mismatch on session ${f.session_id} \u2014 the session is preserved`;return e.out(c),e.emit?.({type:"error",message:c,code:"BINDING_MISMATCH"}),i?.release(),2}S("binding_migrate",{sid:f.session_id},f.session_id);let u=f.resume&&"schema"in f.resume?{...f.resume,binding:{}}:void 0;try{D=await pe({...f,...u?{resume:u}:{}},{...e,graphSlot:V,...a(e,V),...j?{checkpoint:j}:{}},new Map,n,S,ne)}catch(c){throw S("error",{message:c instanceof Error?c.message:String(c),stack:c instanceof Error?c.stack:void 0},f.session_id),J(),c}finally{e.chat?.setWorking?.(null),te()}}if(D.highRisk)return e.out(`error: ${D.highRisk.length} high-risk decision${D.highRisk.length===1?"":"s"} need a human \u2014 ci mode won't guess. Re-run with --mode agent to pause for review.`),e.emit?.({type:"error",message:`error: high-risk question(s) in ci mode (fail-closed): ${D.highRisk.map(s=>s.id).join(", ")}`,code:"HIGH_RISK_CI"}),J(),O(),1;if(D.paused){let s=i;s||(s=le(e.contextDir,{sid:f.session_id,mode:"agent",created_at:P.toISOString(),expires_at:new Date(P.getTime()+1440*60*1e3).toISOString(),agent_state:D.paused.agent_state,pending:{questions:[],proposals:[]},read_basis:Object.fromEntries((n.resolve(r)?n.edgesInto(n.resolve(r).tip):[]).filter(c=>c.type==="DERIVES"&&typeof c.props.source_id=="string").map(c=>[String(c.props.source_id),n.heads.get(String(c.props.source_id))??null])),assumed:[],corpus_cursor:{remaining:[]},conv_source:m,target_pins:n.resolve(r)?[{ref:r,cid:n.resolve(r).tip}]:[],verb:"design",use_case:r,...n.resolve(r)?.tip?{uc_tip:n.resolve(r).tip}:{},...w?{force:!0}:{},...g?{user_session_id:g.ids.session_id}:{}}));try{w&&!s.state.force&&s.save({force:!0}),g&&s.state.user_session_id!==g.ids.session_id&&s.save({user_session_id:g.ids.session_id}),m&&s.state.conv_source!==m&&s.save({conv_source:m});let c=e.chat?.drainHeldReceipts?.()??[];(c.length>0||(s.state.held_receipts?.length??0)>0)&&s.save({held_receipts:c}),G!==null&&s.save({force_scope:G}),Ye(s,D.paused)}catch(c){let p=s.state.checkpoint,y=`error: couldn't persist the pause for session ${s.state.sid}`+(p?` \u2014 last durable checkpoint: seq ${p.seq} @ ${p.ts}`:" \u2014 no durable checkpoint exists")+` (${c instanceof Error?c.message:String(c)})`;return e.out(y),e.emit?.({type:"error",message:y,code:"PAUSE_PERSIST_FAILED",sid:s.state.sid}),1}S("session_paused",{sid:s.state.sid},f.session_id);let d=E!=="interactive"?` --mode ${E}`:"",u=`kane-cli design tests --resume ${s.state.sid}${d}`;if(q||e.out(`paused \u2014 resume with: ${u}`),e.emit?.({type:"session_paused",sid:s.state.sid,mode:E,resume:u,expires_at:s.state.expires_at,pending_questions:D.paused.pending.questions}),q){let c=e.chat?.state.credits?.total;e.onSummary?.({state:"paused",reason:"ctrl+c",facts:[`session ${s.state.sid} saved \u2014 designing ${R.usecase.logical_id??r}`,...s.state.expires_at?[`expires: ${s.state.expires_at}`]:[],...c!==void 0?[`credits used: ${c.toFixed(1)}`]:[]],resume:u,resumeMessage:`${u} --message "<your words>"`,tracePath:Z(h)})}return O(),3}if(D.crashed&&i?.state.checkpoint){let s=i.state.checkpoint,d=E!=="interactive"?` --mode ${E}`:"",u=`kane-cli design tests --resume ${i.state.sid}${d}`;if(S("agent_crashed_resumable",{sid:i.state.sid,seq:s.seq},f.session_id),q||e.out(`agent crashed \u2014 session ${i.state.sid} is resumable at checkpoint seq ${s.seq} (at most the in-flight turn lost); resume with: ${u}`),e.emit?.({type:"session_paused",sid:i.state.sid,mode:E,resume:u,expires_at:i.state.expires_at,crashed:!0}),q){let c=e.chat?.state.credits?.total;e.onSummary?.({state:"crashed",facts:[`agent crashed \u2014 session ${i.state.sid} is resumable at checkpoint seq ${s.seq}`,"at most the in-flight turn was lost",...c!==void 0?[`credits used: ${c.toFixed(1)}`]:[]],resume:u,resumeMessage:`${u} --message "<your words>"`,tracePath:Z(h)})}return i.release(),i=null,3}if(D.error)return e.out(`error: design agent failed: ${D.error}`),e.emit?.({type:"error",message:`error: design agent failed: ${D.error}`}),J(),O(),1;if(D.proposal==null&&E!=="interactive")return e.out(`error: the design session stopped before saving anything \u2014 nothing committed (trace: ${h})`),e.emit?.({type:"error",message:`error: the design session stopped before saving anything \u2014 nothing committed (trace: ${h})`}),J(),O(),1;let K=0;if(D.proposal==null)try{let{readRecords:s}=await import("./records-TJJJWBUD.js"),d=t.resume??f.session_id;K=s(e.contextDir).records.filter(u=>u.sid===d).reduce((u,c)=>u+c.nodes.filter(p=>p.label!=="source").length,0)}catch{}if(D.proposal==null&&e.out(K>0?`done \u2014 ${K} item(s) committed in this session (earlier legs included); nothing new since the resume`:"done \u2014 nothing designed this session (no finalize before the session ended)"),D.assumedDefaults&&e.out(`assumed: ${D.assumedDefaults} default(s) taken while unattended`),i&&e.emit?.({type:"session_complete",sid:t.resume??f.session_id}),g?.event("ASR_SESSION_COMPLETE",{}),i?.complete(),W)try{St(ve(e.contextDir,"sessions"))}catch{}if(M.length>0){let s=Kt(M,ae(e.contextDir));e.chat?e.chat.note(s):e.out(s),e.emit?.({type:"variables_summary",file:M[0].file,variables:M.map(({name:d,description:u,secret:c})=>({name:d,description:u,secret:c}))})}if(q){let s=e.chat.state.ledger.filter(c=>c.kind==="answer"&&c.receipt.form==="assumed").length??0,d=(D.assumedDefaults??0)+s,u=e.chat.state.credits?.total??D.creditsTotal;e.onSummary?.({state:"complete",facts:[`designed: ${R.usecase.logical_id??r}${D.proposal==null?K>0?` (${K} item(s) committed across this session)`:" (nothing committed this session)":""}`,...M.length>0?[`${M.length} variable(s) need values \u2014 see .testmuai/variables/assurance.json`]:[],...d>0?[`${d} assumed default(s)`]:[],...u!==void 0?[`credits used: ${u.toFixed(1)}`]:[]],tracePath:Z(h)})}return t.plan||et(e.contextDir),O(),0}function Kt(t,e){if(t.length===0)return"";let n=zt(e,t[0].file)||t[0].file,i=Math.max(...t.map(r=>r.name.length))+3,o=t.slice().sort((r,v)=>r.name<v.name?-1:1).map(r=>` ${r.name.padEnd(i)}${r.description}${r.secret?" (secret)":""}`);return`variables declared this session \u2014 fill their values before running:
365
365
  ${n}
366
366
  ${o.join(`
367
367
  `)}
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as g}from"./chunk-BPMSNGXQ.js";import{b as f,c as j}from"./chunk-VE3SUJMA.js";import{a as m}from"./chunk-7KAPHA56.js";var _="KaneAI Generated",E="Untitled";async function p(e){let r=e.config.load(),d=new g(m(e.env).tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key),n=e.projectName??_,o=e.folderName??E,t=r.project_id??null,s=r.project_name??null;if(!t){let a=(await d.listProjects()).find(l=>l.name===n);if(a)t=a.project_id,s=a.name,e.log("info","ENSURE_PROJECT_FOUND","Found default project",{project_id:t,name:s});else{let l=await d.createProject(n);t=l.id,s=l.name,e.log("info","ENSURE_PROJECT_CREATED","Created default project",{project_id:t,name:s})}f(e.creds,e.config,e.profile,e.env,{projectId:t,projectName:s})}let c=r.folder_id??null,i=r.folder_name??null,u=!r.project_id;if(!c||u){let a=(await d.listFolders(t)).find(l=>l.name===o);if(a)c=a.id,i=a.name,e.log("info","ENSURE_FOLDER_FOUND","Found default folder",{folder_id:c,name:i});else{let l=await d.createFolder(t,o);c=l.id,i=l.name,e.log("info","ENSURE_FOLDER_CREATED","Created default folder",{folder_id:c,name:i})}f(e.creds,e.config,e.profile,e.env,{folderId:c,folderName:i})}return{projectId:t,projectName:s??n,folderId:c,folderName:i??o}}function A(e,r,d){let n=e.loadProfileConfig(r,d)??{};return{projectId:n.project_id??null,folderId:n.folder_id??null}}function N(e,r){return e.projectId===null||e.folderId===null||r===null?"needs-picker":r.project==="ok"&&r.folder==="ok"?"ok":r.project==="error"&&r.folder==="error"?"ok-tms-degraded":"needs-picker"}var k=(e,r)=>`error: profile "${e}" (${r}) has no project/folder configured AND no TMS credentials were available to auto-configure one.
2
+ import{a as g}from"./chunk-BPMSNGXQ.js";import{b as f,c as j}from"./chunk-VE3SUJMA.js";import{a as m}from"./chunk-OH2NSBO6.js";var _="KaneAI Generated",E="Untitled";async function p(e){let r=e.config.load(),d=new g(m(e.env).tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key),n=e.projectName??_,o=e.folderName??E,t=r.project_id??null,s=r.project_name??null;if(!t){let a=(await d.listProjects()).find(l=>l.name===n);if(a)t=a.project_id,s=a.name,e.log("info","ENSURE_PROJECT_FOUND","Found default project",{project_id:t,name:s});else{let l=await d.createProject(n);t=l.id,s=l.name,e.log("info","ENSURE_PROJECT_CREATED","Created default project",{project_id:t,name:s})}f(e.creds,e.config,e.profile,e.env,{projectId:t,projectName:s})}let c=r.folder_id??null,i=r.folder_name??null,u=!r.project_id;if(!c||u){let a=(await d.listFolders(t)).find(l=>l.name===o);if(a)c=a.id,i=a.name,e.log("info","ENSURE_FOLDER_FOUND","Found default folder",{folder_id:c,name:i});else{let l=await d.createFolder(t,o);c=l.id,i=l.name,e.log("info","ENSURE_FOLDER_CREATED","Created default folder",{folder_id:c,name:i})}f(e.creds,e.config,e.profile,e.env,{folderId:c,folderName:i})}return{projectId:t,projectName:s??n,folderId:c,folderName:i??o}}function A(e,r,d){let n=e.loadProfileConfig(r,d)??{};return{projectId:n.project_id??null,folderId:n.folder_id??null}}function N(e,r){return e.projectId===null||e.folderId===null||r===null?"needs-picker":r.project==="ok"&&r.folder==="ok"?"ok":r.project==="error"&&r.folder==="error"?"ok-tms-degraded":"needs-picker"}var k=(e,r)=>`error: profile "${e}" (${r}) has no project/folder configured AND no TMS credentials were available to auto-configure one.
3
3
 
4
4
  discover IDs:
5
5
  kane-cli projects list --search "<keyword>" --limit 10
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as v,b as A,d as G}from"./chunk-OS4VSIHT.js";import{b as x}from"./chunk-KAZGHWGK.js";import{a as w}from"./chunk-BZAGVBCX.js";import{a as S}from"./chunk-JUJ4SAGH.js";import{a as U,b as C}from"./chunk-UJZZDPDY.js";import{C as E,D as $}from"./chunk-W3Z7AZNT.js";import{d,e as m}from"./chunk-AKX4VRRR.js";var k=new Set([d.USECASE,d.SCENARIO,d.AC,d.TEST]);function b(e,t){return!e.superseded.has(t)&&e.trust.get(t)!=="archived"}function h(e,t,n){let s=e.edgesFrom(t).find(o=>o.type===n);return s?e.tipOf(s.dst):null}function O(e,t,n){if(n===d.USECASE)return t;if(n===d.SCENARIO)return h(e,t,m.BELONGS_TO);if(n===d.AC){let s=h(e,t,m.SCOPED_TO);return s?e.nodeLabel.get(s)===d.USECASE?s:h(e,s,m.BELONGS_TO):null}if(n===d.TEST){let s=h(e,t,m.AUTOMATES);return s?h(e,s,m.BELONGS_TO):null}return null}function L(e,t){let n=e.nameOf.get(t);if(n)return n;for(let[s,o]of e.names)if(e.tipOf(o)===t)return s;return t}function F(e,t){return{ucTip:t,display:L(e,t),seamRef:e.nameOf.get(t)??t}}function N(e,t){let n=e.resolve(t);if(!n)return{ok:!1,message:`unknown ref '${t}' \u2014 no test/scenario/ac/use-case by that id or cid`};let s=n.tip,o=e.nodeLabel.get(s);if(!o||!k.has(o))return{ok:!1,message:`'${t}' is a ${o??"missing node"} \u2014 evolve takes a test, scenario, acceptance criterion, or use-case`};let a=O(e,s,o);return!a||e.nodeLabel.get(a)!==d.USECASE?{ok:!1,message:`cannot resolve '${t}' to a parent use-case \u2014 its ${o} chain is broken`}:e.superseded.has(a)?{ok:!1,message:`use-case ${L(e,a)} was removed \u2014 nothing to evolve`}:{ok:!0,target:F(e,a)}}function Z(e,t){return D(e,t)}function D(e,t){let n=[];for(let{cid:o}of e.byLabel(d.SCENARIO)){if(!b(e,o)||!e.edgesFrom(o).some(r=>r.type===m.BELONGS_TO&&e.tipOf(r.dst)===t))continue;let a=e.edgesInto(o).filter(r=>r.type===m.AUTOMATES&&b(e,r.src));if(a.length===0)n.push({scenario:o,test:null});else for(let r of a)n.push({scenario:o,test:r.src})}let s=new Map;for(let{cid:o}of e.byLabel(d.AC)){if(!b(e,o)||O(e,o,d.AC)!==t)continue;let a=e.edgesInto(o).filter(r=>r.type===m.VERIFIES&&b(e,r.src)).map(r=>r.src).sort();s.set(o,a)}return{pairs:n,verifies:s}}function B(e,t){let n=r=>`${r.scenario}\0${r.test??""}`,s=new Set(e.pairs.map(n)),o=new Set(t.pairs.map(n)),a=[];for(let[r,i]of e.verifies){let u=t.verifies.get(r);u&&(i.length===u.length&&i.every((l,g)=>l===u[g])||a.push({ac:r,before:i,after:u}))}return{superseded:e.pairs.filter(r=>!o.has(n(r))),minted:t.pairs.filter(r=>!s.has(n(r))),retained:t.pairs.filter(r=>s.has(n(r))),moves:a}}function _(e,t,n,s,o){let a=i=>t.nameOf.get(i)??i,r=i=>` - ${a(i.scenario)} \xB7 ${i.test?a(i.test):"(no test)"}`;e.out(`evolved: use-case ${n} \u2014 design record ${s.before} \u2192 ${s.after}`),e.out(` superseded ${o.superseded.length} pair(s)`);for(let i of o.superseded)e.out(r(i));e.out(` minted ${o.minted.length} pair(s)`);for(let i of o.minted)e.out(r(i));e.out(` retained ${o.retained.length} pair(s)`);for(let i of o.retained)e.out(r(i));if(o.moves.length===0)e.out(" verifies none moved");else{e.out(" verifies moved:");for(let i of o.moves){let u=l=>l.length>0?l.map(a).join(" + "):"(none)";e.out(` - ${a(i.ac)}: ${u(i.before)} \u2192 ${u(i.after)}`)}}}async function R(e,t,n,s,o,a,r){let i=E(e),u=S(i,t.ucTip);if(!u)return a==="batch"?(s.out(`note: ${t.display} has no design output \u2014 nothing to evolve; run kane-cli design tests --use-case ${t.display} first`),{code:0,outcome:"no-design"}):(v(s,`nothing to evolve \u2014 run kane-cli design tests --use-case ${t.display} first (no design output)`),{code:2,outcome:"no-design"});let l=D(i,t.ucTip),g=[`evolve ${t.display}`,` re-designs use-case ${t.display}`,` affects ${l.pairs.length} pair(s)`,...n.because?[` because ${n.because}`]:[]];if(n.yes)for(let y of g)s.out(y);else{for(let I of g)s.out(I);if(!await s.confirm(`proceed with the re-design of ${t.display}?`))return s.out(a==="batch"?`skipped ${t.display}`:"declined \u2014 nothing evolved"),{code:0,outcome:"declined"}}let p=x(e,i,t.ucTip,n.because),c=await U(r,{verb:"evolve",subject:t.display},()=>o(t.seamRef,{yes:!!n.yes,...n.mode?{mode:n.mode}:{},...n.because?{because:n.because}:{},...p!==void 0?{changeDelta:p.change_delta,priorDesign:p.prior_design}:{}}),y=>({ok:y===0,exitCode:y}));if(c===3)return s.out(`design session for ${t.display} paused \u2014 resume with \`kane-cli design tests --resume\`, then re-run evolve for the diff`),{code:c,outcome:"paused"};if(c!==0)return v(s,`design run for ${t.display} ended with exit code ${c} \u2014 no diff to report`),{code:c,outcome:"failed"};let f=E(e),T=f.tipOf(t.ucTip),P=S(f,T)?.seq;return _(s,f,t.display,{before:u.seq,after:P??"?"},B(l,D(f,T))),{code:0,outcome:"evolved"}}function j(e){let t=new Map,n=0;for(let{cid:o,state:a}of e.staleList()){if(a==="superseded")continue;let r=e.nodeLabel.get(o);if(!r||!k.has(r)||!b(e,o)||!$(e,o))continue;let i=O(e,o,r);!i||e.nodeLabel.get(i)!==d.USECASE||e.superseded.has(i)||(n++,t.has(i)||t.set(i,F(e,i)))}return{targets:[...t.values()].sort((o,a)=>o.display<a.display?-1:o.display>a.display?1:0),staleCount:n}}function M(e,t){for(let{cid:n,state:s}of e.staleList()){if(s==="superseded")continue;let o=e.nodeLabel.get(n);if(!(!o||!k.has(o)||!b(e,n))&&$(e,n)&&O(e,n,o)===t)return!0}return!1}async function q(e,t,n,s={},o=process.cwd()){if(e&&t.fromStale)return v(n,"pass a <ref> OR --from-stale, not both"),2;if(!e&&!t.fromStale)return v(n,"evolve needs a <ref> or --from-stale"),2;let a=A(o,n);if(!a)return 2;let r=s.runDesignForUc??Y,i=s.onChild??(n.isTTY?V(n):void 0);n.out(`evolving ${e??"stale use-cases"}: reading the graph\u2026`);let u=E(a),l,g=null;if(e){let c=N(u,e);if(!c.ok)return v(n,c.message),2;if(!t.because&&S(u,c.target.ucTip)&&!M(u,c.target.ucTip))return v(n,`nothing changed underneath ${e} \u2014 its sources and requirements are current; use --because "<reason>" to re-design anyway`),2;l=[c.target]}else{let{targets:c,staleCount:f}=j(u);if(c.length===0)return n.out("nothing stale \u2014 nothing to evolve"),0;g=`from-stale: ${f} stale node(s) \u2192 ${c.length} use-case(s)`,l=c}if(!t.yes&&!n.isTTY)return v(n,"evolve needs a TTY \u2014 the blast-radius confirm is the point; headless evolution rides `kane-cli maintain reconcile`"),2;if(g&&n.out(g),e){let c=await R(a,l[0],t,n,r,"single",i);return c.outcome==="evolved"&&t.because&&w(a,{ts:new Date().toISOString(),command:"evolve",id:e,verdict:"gap-resolved-evolve",polarity:"preference",by:{kind:"human",id:process.env.USER??"operator"},target:e,reason:t.because}),c.code}let p=0;for(let c of l){let{code:f}=await R(a,c,t,n,r,"batch",i);f!==0&&p===0&&(p=f)}return p}function V(e){let t="",n="evolve";return s=>{s.kind==="start"?(t=s.subject,n=s.verb,e.out(`\u25CF ${C(s.verb).ing} ${s.subject}`)):s.kind==="end"&&e.out(s.ok?`\u25CF ${C(n).ed} ${t} \u2014 ${s.durS}s`:`\u25CF ${n} failed \u2014 ${s.exitCode!=null?`exited ${s.exitCode}`:"error"}${s.fixCmd?` \xB7 ${s.fixCmd}`:""}`)}}var Y=async(e,t)=>{let{designTestsCommand:n}=await import("./bind-A3M4PV4V.js"),s=()=>n({useCase:e,force:!0,...t.mode?{mode:t.mode}:t.yes?{mode:"override"}:{},...t.because?{because:t.because}:{},...t.changeDelta!==void 0?{changeDelta:t.changeDelta}:{},...t.priorDesign!==void 0?{priorDesign:t.priorDesign}:{}});if(t.mode!=="agent")return s();let o=process.stdout.write;process.stdout.write=((...a)=>!0);try{return await s()}finally{process.stdout.write=o}};async function ee(e,t){return q(e,t,G(),{})}export{N as a,Z as b,R as c,j as d,q as e,Y as f,ee as g};
2
+ import{b as G}from"./chunk-O3XBIURC.js";import{a as A,b as C}from"./chunk-UJZZDPDY.js";import{a as x}from"./chunk-BZAGVBCX.js";import{a as S}from"./chunk-JUJ4SAGH.js";import{P as v,Q as w,S as U}from"./chunk-6LGED4FC.js";import{C as E,E as $}from"./chunk-GP7WD4UY.js";import{d,e as m}from"./chunk-AKX4VRRR.js";var k=new Set([d.USECASE,d.SCENARIO,d.AC,d.TEST]);function b(e,t){return!e.superseded.has(t)&&e.trust.get(t)!=="archived"}function h(e,t,n){let s=e.edgesFrom(t).find(o=>o.type===n);return s?e.tipOf(s.dst):null}function O(e,t,n){if(n===d.USECASE)return t;if(n===d.SCENARIO)return h(e,t,m.BELONGS_TO);if(n===d.AC){let s=h(e,t,m.SCOPED_TO);return s?e.nodeLabel.get(s)===d.USECASE?s:h(e,s,m.BELONGS_TO):null}if(n===d.TEST){let s=h(e,t,m.AUTOMATES);return s?h(e,s,m.BELONGS_TO):null}return null}function L(e,t){let n=e.nameOf.get(t);if(n)return n;for(let[s,o]of e.names)if(e.tipOf(o)===t)return s;return t}function F(e,t){return{ucTip:t,display:L(e,t),seamRef:e.nameOf.get(t)??t}}function N(e,t){let n=e.resolve(t);if(!n)return{ok:!1,message:`unknown ref '${t}' \u2014 no test/scenario/ac/use-case by that id or cid`};let s=n.tip,o=e.nodeLabel.get(s);if(!o||!k.has(o))return{ok:!1,message:`'${t}' is a ${o??"missing node"} \u2014 evolve takes a test, scenario, acceptance criterion, or use-case`};let a=O(e,s,o);return!a||e.nodeLabel.get(a)!==d.USECASE?{ok:!1,message:`cannot resolve '${t}' to a parent use-case \u2014 its ${o} chain is broken`}:e.superseded.has(a)?{ok:!1,message:`use-case ${L(e,a)} was removed \u2014 nothing to evolve`}:{ok:!0,target:F(e,a)}}function Z(e,t){return D(e,t)}function D(e,t){let n=[];for(let{cid:o}of e.byLabel(d.SCENARIO)){if(!b(e,o)||!e.edgesFrom(o).some(r=>r.type===m.BELONGS_TO&&e.tipOf(r.dst)===t))continue;let a=e.edgesInto(o).filter(r=>r.type===m.AUTOMATES&&b(e,r.src));if(a.length===0)n.push({scenario:o,test:null});else for(let r of a)n.push({scenario:o,test:r.src})}let s=new Map;for(let{cid:o}of e.byLabel(d.AC)){if(!b(e,o)||O(e,o,d.AC)!==t)continue;let a=e.edgesInto(o).filter(r=>r.type===m.VERIFIES&&b(e,r.src)).map(r=>r.src).sort();s.set(o,a)}return{pairs:n,verifies:s}}function B(e,t){let n=r=>`${r.scenario}\0${r.test??""}`,s=new Set(e.pairs.map(n)),o=new Set(t.pairs.map(n)),a=[];for(let[r,i]of e.verifies){let u=t.verifies.get(r);u&&(i.length===u.length&&i.every((l,g)=>l===u[g])||a.push({ac:r,before:i,after:u}))}return{superseded:e.pairs.filter(r=>!o.has(n(r))),minted:t.pairs.filter(r=>!s.has(n(r))),retained:t.pairs.filter(r=>s.has(n(r))),moves:a}}function _(e,t,n,s,o){let a=i=>t.nameOf.get(i)??i,r=i=>` - ${a(i.scenario)} \xB7 ${i.test?a(i.test):"(no test)"}`;e.out(`evolved: use-case ${n} \u2014 design record ${s.before} \u2192 ${s.after}`),e.out(` superseded ${o.superseded.length} pair(s)`);for(let i of o.superseded)e.out(r(i));e.out(` minted ${o.minted.length} pair(s)`);for(let i of o.minted)e.out(r(i));e.out(` retained ${o.retained.length} pair(s)`);for(let i of o.retained)e.out(r(i));if(o.moves.length===0)e.out(" verifies none moved");else{e.out(" verifies moved:");for(let i of o.moves){let u=l=>l.length>0?l.map(a).join(" + "):"(none)";e.out(` - ${a(i.ac)}: ${u(i.before)} \u2192 ${u(i.after)}`)}}}async function R(e,t,n,s,o,a,r){let i=E(e),u=S(i,t.ucTip);if(!u)return a==="batch"?(s.out(`note: ${t.display} has no design output \u2014 nothing to evolve; run kane-cli design tests --use-case ${t.display} first`),{code:0,outcome:"no-design"}):(v(s,`nothing to evolve \u2014 run kane-cli design tests --use-case ${t.display} first (no design output)`),{code:2,outcome:"no-design"});let l=D(i,t.ucTip),g=[`evolve ${t.display}`,` re-designs use-case ${t.display}`,` affects ${l.pairs.length} pair(s)`,...n.because?[` because ${n.because}`]:[]];if(n.yes)for(let y of g)s.out(y);else{for(let I of g)s.out(I);if(!await s.confirm(`proceed with the re-design of ${t.display}?`))return s.out(a==="batch"?`skipped ${t.display}`:"declined \u2014 nothing evolved"),{code:0,outcome:"declined"}}let p=G(e,i,t.ucTip,n.because),c=await A(r,{verb:"evolve",subject:t.display},()=>o(t.seamRef,{yes:!!n.yes,...n.mode?{mode:n.mode}:{},...n.because?{because:n.because}:{},...p!==void 0?{changeDelta:p.change_delta,priorDesign:p.prior_design}:{}}),y=>({ok:y===0,exitCode:y}));if(c===3)return s.out(`design session for ${t.display} paused \u2014 resume with \`kane-cli design tests --resume\`, then re-run evolve for the diff`),{code:c,outcome:"paused"};if(c!==0)return v(s,`design run for ${t.display} ended with exit code ${c} \u2014 no diff to report`),{code:c,outcome:"failed"};let f=E(e),T=f.tipOf(t.ucTip),P=S(f,T)?.seq;return _(s,f,t.display,{before:u.seq,after:P??"?"},B(l,D(f,T))),{code:0,outcome:"evolved"}}function j(e){let t=new Map,n=0;for(let{cid:o,state:a}of e.staleList()){if(a==="superseded")continue;let r=e.nodeLabel.get(o);if(!r||!k.has(r)||!b(e,o)||!$(e,o))continue;let i=O(e,o,r);!i||e.nodeLabel.get(i)!==d.USECASE||e.superseded.has(i)||(n++,t.has(i)||t.set(i,F(e,i)))}return{targets:[...t.values()].sort((o,a)=>o.display<a.display?-1:o.display>a.display?1:0),staleCount:n}}function M(e,t){for(let{cid:n,state:s}of e.staleList()){if(s==="superseded")continue;let o=e.nodeLabel.get(n);if(!(!o||!k.has(o)||!b(e,n))&&$(e,n)&&O(e,n,o)===t)return!0}return!1}async function q(e,t,n,s={},o=process.cwd()){if(e&&t.fromStale)return v(n,"pass a <ref> OR --from-stale, not both"),2;if(!e&&!t.fromStale)return v(n,"evolve needs a <ref> or --from-stale"),2;let a=w(o,n);if(!a)return 2;let r=s.runDesignForUc??Y,i=s.onChild??(n.isTTY?V(n):void 0);n.out(`evolving ${e??"stale use-cases"}: reading the graph\u2026`);let u=E(a),l,g=null;if(e){let c=N(u,e);if(!c.ok)return v(n,c.message),2;if(!t.because&&S(u,c.target.ucTip)&&!M(u,c.target.ucTip))return v(n,`nothing changed underneath ${e} \u2014 its sources and requirements are current; use --because "<reason>" to re-design anyway`),2;l=[c.target]}else{let{targets:c,staleCount:f}=j(u);if(c.length===0)return n.out("nothing stale \u2014 nothing to evolve"),0;g=`from-stale: ${f} stale node(s) \u2192 ${c.length} use-case(s)`,l=c}if(!t.yes&&!n.isTTY)return v(n,"evolve needs a TTY \u2014 the blast-radius confirm is the point; headless evolution rides `kane-cli maintain reconcile`"),2;if(g&&n.out(g),e){let c=await R(a,l[0],t,n,r,"single",i);return c.outcome==="evolved"&&t.because&&x(a,{ts:new Date().toISOString(),command:"evolve",id:e,verdict:"gap-resolved-evolve",polarity:"preference",by:{kind:"human",id:process.env.USER??"operator"},target:e,reason:t.because}),c.code}let p=0;for(let c of l){let{code:f}=await R(a,c,t,n,r,"batch",i);f!==0&&p===0&&(p=f)}return p}function V(e){let t="",n="evolve";return s=>{s.kind==="start"?(t=s.subject,n=s.verb,e.out(`\u25CF ${C(s.verb).ing} ${s.subject}`)):s.kind==="end"&&e.out(s.ok?`\u25CF ${C(n).ed} ${t} \u2014 ${s.durS}s`:`\u25CF ${n} failed \u2014 ${s.exitCode!=null?`exited ${s.exitCode}`:"error"}${s.fixCmd?` \xB7 ${s.fixCmd}`:""}`)}}var Y=async(e,t)=>{let{designTestsCommand:n}=await import("./bind-62AZYFAY.js"),s=()=>n({useCase:e,force:!0,...t.mode?{mode:t.mode}:t.yes?{mode:"override"}:{},...t.because?{because:t.because}:{},...t.changeDelta!==void 0?{changeDelta:t.changeDelta}:{},...t.priorDesign!==void 0?{priorDesign:t.priorDesign}:{}});if(t.mode!=="agent")return s();let o=process.stdout.write;process.stdout.write=((...a)=>!0);try{return await s()}finally{process.stdout.write=o}};async function ee(e,t){return q(e,t,U(),{})}export{N as a,Z as b,R as c,j as d,q as e,Y as f,ee as g};