@testmuai/kane-cli 0.8.7 → 0.8.9

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 (236) hide show
  1. package/bin/kane-cli.cjs +5 -1
  2. package/dist/{ChatSurface-3PEXML4X.js → ChatSurface-HXCRGPSE.js} +1 -1
  3. package/dist/{ChromeProfilePicker-E3CZ52RH.js → ChromeProfilePicker-PJS4NGEC.js} +1 -1
  4. package/dist/{CliFeedbackPrompt-BEVZRLQA.js → CliFeedbackPrompt-Q56VKWKM.js} +1 -1
  5. package/dist/{CliUploadProgress-V2FLLVR6.js → CliUploadProgress-TMVTKNOT.js} +1 -1
  6. package/dist/{ConfigView-ZOGKVFQT.js → ConfigView-Y7ZVYT2C.js} +1 -1
  7. package/dist/EvidenceViewOffer-XV3WF2EC.js +2 -0
  8. package/dist/FolderPicker-UGHFCPUL.js +2 -0
  9. package/dist/{InfoBox-4TNE7QMG.js → InfoBox-IDJYGPXF.js} +1 -1
  10. package/dist/{LinksBox-TXO5X5UD.js → LinksBox-5XNJ3UJJ.js} +1 -1
  11. package/dist/{ProfilesView-S4YPEZEF.js → ProfilesView-U73QBC5W.js} +1 -1
  12. package/dist/{ProjectPicker-LWFX2QT2.js → ProjectPicker-KCE2VZCO.js} +1 -1
  13. package/dist/{SaveSessionPrompt-MJTCIQIZ.js → SaveSessionPrompt-3FHLIRLS.js} +1 -1
  14. package/dist/SingleShotApp-ECA24PKW.js +2 -0
  15. package/dist/{SummaryBox-UIVK3QDR.js → SummaryBox-GKHU4C4H.js} +1 -1
  16. package/dist/TestMdRunView-KLMMXQCN.js +2 -0
  17. package/dist/{TestrunEvidenceTable-GYGVNCYW.js → TestrunEvidenceTable-INNZCGTM.js} +1 -1
  18. package/dist/{WhoamiView-NRGMMLL4.js → WhoamiView-PSL7PUVT.js} +1 -1
  19. package/dist/{app-download-HTQOD3YF.js → app-download-MBUJGT3R.js} +1 -1
  20. package/dist/{auth-5URO2XJU.js → auth-TYG473Z4.js} +1 -1
  21. package/dist/{binary-2U4YTTFS.js → binary-QQXWA35Q.js} +1 -1
  22. package/dist/{bind-NO4TMSHJ.js → bind-WJ5UEMMZ.js} +3 -3
  23. package/dist/{bootstrap-UOEW3VZM.js → bootstrap-MYG4TJVF.js} +1 -1
  24. package/dist/bridge-S3WZ4TH2.js +2 -0
  25. package/dist/{changelog-7BPYLUDK.js → changelog-N4L5ZUGF.js} +1 -1
  26. package/dist/{chat-committer-GUK6IBCL.js → chat-committer-K3NOTLOU.js} +1 -1
  27. package/dist/chat-controller-YJCNU76T.js +2 -0
  28. package/dist/{chunk-DJC6MLO4.js → chunk-22HCCSL7.js} +1 -1
  29. package/dist/{chunk-Z7HUW3L4.js → chunk-27P7PJAL.js} +1 -1
  30. package/dist/{chunk-K7VX6YIT.js → chunk-2DKJZPIH.js} +1 -1
  31. package/dist/{chunk-IQBKCLLR.js → chunk-34VSIQNO.js} +1 -1
  32. package/dist/{chunk-VMRP44MN.js → chunk-367NASYK.js} +1 -1
  33. package/dist/chunk-4PMZ5FCD.js +2 -0
  34. package/dist/{chunk-C4OVX65Q.js → chunk-54JZ6VEW.js} +1 -1
  35. package/dist/{chunk-GAO6ZMCT.js → chunk-5G22NOZK.js} +1 -1
  36. package/dist/{chunk-ILKSL4PI.js → chunk-6FCPS2VT.js} +1 -1
  37. package/dist/{chunk-76ILJPZF.js → chunk-6MJGCETZ.js} +1 -1
  38. package/dist/{chunk-T4LAHU57.js → chunk-6S426ODE.js} +3 -3
  39. package/dist/{chunk-LRZXVDPY.js → chunk-6UNXON3J.js} +1 -1
  40. package/dist/{chunk-7VAE7WXF.js → chunk-6ZNRPDLP.js} +2 -2
  41. package/dist/{chunk-YDEK2FJQ.js → chunk-7RAIRUXO.js} +1 -1
  42. package/dist/{chunk-YKYZKBMH.js → chunk-AARF24Z3.js} +17 -17
  43. package/dist/chunk-AKX4VRRR.js +2 -0
  44. package/dist/{chunk-VHA7UNDW.js → chunk-AOB2ZX45.js} +1 -1
  45. package/dist/{chunk-GJ6RJVXH.js → chunk-AROBXG66.js} +1 -1
  46. package/dist/{chunk-3BY7MX3D.js → chunk-BOZODWIZ.js} +1 -1
  47. package/dist/{chunk-GYTZLUFV.js → chunk-BVON52QL.js} +1 -1
  48. package/dist/{chunk-3IM5QGVV.js → chunk-CCEXSCTN.js} +1 -1
  49. package/dist/{chunk-E5C3HUIY.js → chunk-CJD3EEPT.js} +1 -1
  50. package/dist/{chunk-IJABR5SX.js → chunk-COJGXGKZ.js} +1 -1
  51. package/dist/chunk-D5MK4WTK.js +26 -0
  52. package/dist/{chunk-72J4V3DA.js → chunk-DGNVKMGN.js} +1 -1
  53. package/dist/{chunk-QQ67Z4IW.js → chunk-DKUD2D5Y.js} +1 -1
  54. package/dist/{chunk-HHQ67JCU.js → chunk-DUEROGOF.js} +1 -1
  55. package/dist/{chunk-N2N5T5JN.js → chunk-DWHXXPDX.js} +1 -1
  56. package/dist/{chunk-HEWWWMUN.js → chunk-EEFZXZTZ.js} +1 -1
  57. package/dist/{chunk-F43KOMVB.js → chunk-EV64VI66.js} +1 -1
  58. package/dist/{chunk-TKQSIKMR.js → chunk-F5BI3ALG.js} +1 -1
  59. package/dist/{chunk-BISBPWN3.js → chunk-FC6DEFUP.js} +1 -1
  60. package/dist/{chunk-E6AF53HZ.js → chunk-FT23VFSR.js} +48 -47
  61. package/dist/{chunk-7CU5EBC6.js → chunk-GWSGTZMK.js} +1 -1
  62. package/dist/{chunk-IMR64OCZ.js → chunk-GX3FPJUG.js} +1 -1
  63. package/dist/chunk-H4WIA4IP.js +26 -0
  64. package/dist/{chunk-ZFRWVWUR.js → chunk-H5TNYYZW.js} +1 -1
  65. package/dist/{chunk-HAGJA7KG.js → chunk-H6KL3FSB.js} +1 -1
  66. package/dist/{chunk-QZB7CBRO.js → chunk-HKCZ67AT.js} +1 -1
  67. package/dist/{chunk-NM6PEYED.js → chunk-HPBI3P6I.js} +3 -3
  68. package/dist/{chunk-UOLERTKE.js → chunk-IANCFSSL.js} +1 -1
  69. package/dist/{chunk-C5ZIKKIB.js → chunk-IBPF5IM5.js} +1 -1
  70. package/dist/{chunk-SZTUZZEA.js → chunk-IDQBMC3B.js} +1 -1
  71. package/dist/{chunk-46HYKID6.js → chunk-IJYV3KKD.js} +2 -2
  72. package/dist/chunk-IPEA7ZOF.js +8 -0
  73. package/dist/{chunk-R2JRQD4I.js → chunk-IPZFZUJX.js} +1 -1
  74. package/dist/{chunk-WNHLKDOT.js → chunk-IVQX3AKL.js} +1 -1
  75. package/dist/{chunk-5ZV64NAG.js → chunk-IWVA37B6.js} +1 -1
  76. package/dist/{chunk-P4JUY54O.js → chunk-JPZHCB4Z.js} +1 -1
  77. package/dist/{chunk-B2KXIFZD.js → chunk-JQW2QFSX.js} +1 -1
  78. package/dist/{chunk-JZ26R6UL.js → chunk-JUJ4SAGH.js} +1 -1
  79. package/dist/chunk-KAZGHWGK.js +5 -0
  80. package/dist/{chunk-Q4CTSXDM.js → chunk-KGKJU27A.js} +1 -1
  81. package/dist/{chunk-OADHU5HL.js → chunk-KKBID6TD.js} +1 -1
  82. package/dist/{chunk-LOMPRMG3.js → chunk-LRHSWJDR.js} +1 -1
  83. package/dist/{chunk-UFYIQ4E3.js → chunk-M7D7EHNN.js} +1 -1
  84. package/dist/{chunk-2RO2BWCZ.js → chunk-ME3DGP7G.js} +2 -2
  85. package/dist/{chunk-EU5ZH334.js → chunk-MJHLQKQC.js} +1 -1
  86. package/dist/chunk-N7Z7BQYO.js +3 -0
  87. package/dist/{chunk-X7R2JWOJ.js → chunk-NTEI2O3O.js} +1 -1
  88. package/dist/{chunk-U35Y7SGB.js → chunk-NVNPXOOC.js} +1 -1
  89. package/dist/{chunk-DSNB7EI6.js → chunk-O3RRCPIU.js} +1 -1
  90. package/dist/{chunk-SWXEBLKX.js → chunk-O5U6EAL3.js} +1 -1
  91. package/dist/{chunk-HL4UXOHV.js → chunk-OEH4LU5L.js} +1 -1
  92. package/dist/{chunk-XAQ3Y63J.js → chunk-OLKHUNSQ.js} +18 -18
  93. package/dist/{chunk-TMFFHGCT.js → chunk-OME5EJ5X.js} +4 -4
  94. package/dist/{chunk-ZH2ROVHE.js → chunk-OR6M5HCV.js} +2 -2
  95. package/dist/{chunk-BPHQNTUD.js → chunk-P2VERPOP.js} +1 -1
  96. package/dist/{chunk-DMOZM22N.js → chunk-PH4RABYU.js} +1 -1
  97. package/dist/{chunk-A66ZGHO2.js → chunk-QDE2BBAK.js} +1 -1
  98. package/dist/chunk-QHUNFH5P.js +363 -0
  99. package/dist/{chunk-5DBK6QNS.js → chunk-QQ5MHSSY.js} +1 -1
  100. package/dist/{chunk-VOXDZS4N.js → chunk-QS3DXKZN.js} +2 -2
  101. package/dist/{chunk-YGVY63PE.js → chunk-R5PIIYN2.js} +1 -1
  102. package/dist/{chunk-6AUSG5SB.js → chunk-R7GMVPAF.js} +1 -1
  103. package/dist/chunk-RSSOJ3L2.js +21 -0
  104. package/dist/{chunk-T3DVIDBA.js → chunk-SJBIXLL3.js} +1 -1
  105. package/dist/{chunk-F7RR24BL.js → chunk-SV5ZTCQA.js} +1 -1
  106. package/dist/{chunk-IRPAWAK7.js → chunk-TJLGHGUO.js} +3 -3
  107. package/dist/{chunk-AUERMBX5.js → chunk-TJR4R45C.js} +1 -1
  108. package/dist/{chunk-MROHDW4W.js → chunk-TN4SXGAP.js} +1 -1
  109. package/dist/{chunk-YYSWJU6H.js → chunk-UEIQTXB6.js} +1 -1
  110. package/dist/{chunk-CUM23TLF.js → chunk-UH2ZTX4E.js} +1 -1
  111. package/dist/{chunk-3YKNJIVB.js → chunk-VDKGMVXZ.js} +1 -1
  112. package/dist/{chunk-6YVVTYVO.js → chunk-VQFJM7VP.js} +7 -7
  113. package/dist/{chunk-4EFDEDTL.js → chunk-VSEWQEM5.js} +1 -1
  114. package/dist/{chunk-AJXOJF2X.js → chunk-W3Z7AZNT.js} +1 -1
  115. package/dist/{chunk-C765HUXU.js → chunk-W5BTYVZD.js} +1 -1
  116. package/dist/{chunk-YC6HYBLN.js → chunk-WH5RVDD6.js} +2 -2
  117. package/dist/chunk-WHEWZR2C.js +15 -0
  118. package/dist/{chunk-DTBKKC2R.js → chunk-WHMMOMUY.js} +1 -1
  119. package/dist/{chunk-Z3EEMIVV.js → chunk-WIAZN7G4.js} +1 -1
  120. package/dist/{chunk-HLXOYLZV.js → chunk-XMTSHHYQ.js} +1 -1
  121. package/dist/{chunk-OHD4CZXT.js → chunk-XPFFH2PC.js} +1 -1
  122. package/dist/{chunk-XWKUZJCP.js → chunk-YMLC55J4.js} +1 -1
  123. package/dist/{chunk-NQFAZM2D.js → chunk-Z2DT2QMX.js} +1 -1
  124. package/dist/{chunk-HO3T5LJH.js → chunk-ZAKX5BN6.js} +1 -1
  125. package/dist/{chunk-B27X3C2E.js → chunk-ZBJAYCPS.js} +1 -1
  126. package/dist/chunk-ZDAO5D6D.js +16 -0
  127. package/dist/{chunk-44PZPNXJ.js → chunk-ZHB7V3NY.js} +1 -1
  128. package/dist/{committer-JC6BIBNR.js → committer-C6UCDYMC.js} +1 -1
  129. package/dist/{config-XNDP425N.js → config-ZDGCZZT3.js} +1 -1
  130. package/dist/{cover-cmd-HREOYWWD.js → cover-cmd-5LPHIOSI.js} +1 -1
  131. package/dist/{credentials-ZTBWB3LK.js → credentials-YEWA7HXA.js} +1 -1
  132. package/dist/{deps-bundle-OHCYH5KL.js → deps-bundle-JQUW73W5.js} +1 -1
  133. package/dist/{deps-resolve-K2NX2W3K.js → deps-resolve-RXF3JWAP.js} +1 -1
  134. package/dist/descriptor-PWUUNYV7.js +2 -0
  135. package/dist/design-committer-UPC6NZUF.js +2 -0
  136. package/dist/dispatch-TRYJZWJE.js +2 -0
  137. package/dist/{doctor-XXOGVMAI.js → doctor-F7R4WUSI.js} +1 -1
  138. package/dist/{dossier-2M62K2PA.js → dossier-Y6TJWFZU.js} +1 -1
  139. package/dist/evidence-F3CQJQIB.js +2 -0
  140. package/dist/{evolve-cmd-WQB7E2B5.js → evolve-cmd-ICTXNYU4.js} +1 -1
  141. package/dist/exit-manager-ZLDO54S4.js +2 -0
  142. package/dist/{explain-AOZNHWMB.js → explain-3HAZY7Q6.js} +1 -1
  143. package/dist/{explain-cmd-7VTWRROR.js → explain-cmd-RMJPXD4U.js} +1 -1
  144. package/dist/{explain-cmd-2SCD5T6U.js → explain-cmd-XCRO4AS6.js} +1 -1
  145. package/dist/{extract-bind-3YXY7ZU2.js → extract-bind-PH3VB7PY.js} +3 -3
  146. package/dist/{extract-cmd-WGXEJ54C.js → extract-cmd-HSESPCTL.js} +2 -2
  147. package/dist/{feeder-GVZSWX6Q.js → feeder-IOR3XRNF.js} +1 -1
  148. package/dist/gaps-cmd-JIUM5YDY.js +3 -0
  149. package/dist/{gate-54BRAE7N.js → gate-E3BLIUEA.js} +1 -1
  150. package/dist/{generate-headless-PCNAJ2LS.js → generate-headless-Z5YF7UHX.js} +2 -2
  151. package/dist/index.js +91 -91
  152. package/dist/ingest-TTUQ7UDK.js +2 -0
  153. package/dist/ingest-cmd-SNPNVPIO.js +2 -0
  154. package/dist/install-VBUDO2YW.js +2 -0
  155. package/dist/{interactive-bind-ZFMG2JIX.js → interactive-bind-HZG2KCTX.js} +4 -4
  156. package/dist/{lifecycle-cmd-5FRGYY3M.js → lifecycle-cmd-KSMETBPP.js} +1 -1
  157. package/dist/{list-cmd-DD4WYJSH.js → list-cmd-V3HJ5K4O.js} +1 -1
  158. package/dist/{list-commands-64THS67Y.js → list-commands-BHQHPHOH.js} +1 -1
  159. package/dist/{logical-ids-U2OUMYCP.js → logical-ids-MLXAH45L.js} +1 -1
  160. package/dist/login-flow-TWGSFMWW.js +2 -0
  161. package/dist/{maintenance-cmd-7V44VGL4.js → maintenance-cmd-VFYGKY3X.js} +1 -1
  162. package/dist/{mobile-prompts-RITBS32L.js → mobile-prompts-ELBW35KK.js} +1 -1
  163. package/dist/persist-recorded-session-DXUJXHC5.js +3 -0
  164. package/dist/{phase-seed-ATH337WF.js → phase-seed-BMOSAA74.js} +1 -1
  165. package/dist/pipeline-ULKJX3FG.js +2 -0
  166. package/dist/prepare-target-M656XQLU.js +2 -0
  167. package/dist/readmodel-TDRFVDVI.js +2 -0
  168. package/dist/reconcile-cmd-DBOUGUEB.js +2 -0
  169. package/dist/{reconcile-deps-XEUZHUQX.js → reconcile-deps-RX66LB4B.js} +2 -2
  170. package/dist/reconcile-engine-OEDO57U7.js +2 -0
  171. package/dist/{recording-banner-NLS7K2RV.js → recording-banner-COX2HBLL.js} +1 -1
  172. package/dist/{records-XWF6KDQH.js → records-JLS63SDI.js} +1 -1
  173. package/dist/registry-PAVGNBIB.js +2 -0
  174. package/dist/{require-project-folder-V4F74R4A.js → require-project-folder-XFUJYJEA.js} +1 -1
  175. package/dist/resolve-run-intent-24D3BV2J.js +2 -0
  176. package/dist/{resolver-7EAM4A6O.js → resolver-ITA6TGPJ.js} +1 -1
  177. package/dist/{revert-2UCOMQ4J.js → revert-PRR3D4XM.js} +1 -1
  178. package/dist/{review-cmd-VN6VGUWJ.js → review-cmd-SAGIKWEW.js} +1 -1
  179. package/dist/run-IHELHWA2.js +2 -0
  180. package/dist/run-OTSAYPBQ.js +2 -0
  181. package/dist/{run-test-md-CPGKD3DD.js → run-test-md-U5PSCPZU.js} +2 -2
  182. package/dist/{sessions-cmd-ME7NM6ES.js → sessions-cmd-VDQGRBEM.js} +1 -1
  183. package/dist/{skill-installer-WEV2M32J.js → skill-installer-STKFBIY4.js} +1 -1
  184. package/dist/{spawner-GG6YQB4A.js → spawner-R76ROCR2.js} +1 -1
  185. package/dist/{structured-answers-2WOTULBQ.js → structured-answers-YAVW65G4.js} +1 -1
  186. package/dist/tcg-generate-VJARWDD4.js +2 -0
  187. package/dist/testmd-actions-PXGLZV5L.js +2 -0
  188. package/dist/token-refresh-ZFT457VI.js +2 -0
  189. package/dist/{validate-basic-QJL4DCKY.js → validate-basic-BPJVV64Y.js} +1 -1
  190. package/dist/verdicts-56ZZN3E4.js +2 -0
  191. package/dist/{version-check-KONSQ4M3.js → version-check-PWHLDMPD.js} +1 -1
  192. package/dist/{view-cmd-ZSMU4I4J.js → view-cmd-SXXNDZIC.js} +1 -1
  193. package/dist/{walk-session-X2N4XHLU.js → walk-session-OMUB7DPJ.js} +1 -1
  194. package/dist/with-telemetry-WI5FZFEK.js +2 -0
  195. package/package.json +11 -14
  196. package/dist/EvidenceViewOffer-KWX27WNZ.js +0 -2
  197. package/dist/FolderPicker-EIKQSSF6.js +0 -2
  198. package/dist/SingleShotApp-5LCIH6DQ.js +0 -2
  199. package/dist/TestMdRunView-RE5GX5QX.js +0 -2
  200. package/dist/bridge-P2EBLXPY.js +0 -2
  201. package/dist/chat-controller-6GUUMUVP.js +0 -2
  202. package/dist/chunk-56PAQAX5.js +0 -19
  203. package/dist/chunk-7EFG27IZ.js +0 -355
  204. package/dist/chunk-E5Q5CDOX.js +0 -2
  205. package/dist/chunk-FVKLNQ4T.js +0 -26
  206. package/dist/chunk-GDB2V6QA.js +0 -21
  207. package/dist/chunk-LWZ7EIXX.js +0 -2
  208. package/dist/chunk-Q3S5EKX5.js +0 -21
  209. package/dist/chunk-UASEGQ7B.js +0 -11
  210. package/dist/chunk-WXHQYYD5.js +0 -2
  211. package/dist/chunk-YC2TFACE.js +0 -5
  212. package/dist/descriptor-OEUZZCOK.js +0 -2
  213. package/dist/design-committer-IIHKNEYF.js +0 -2
  214. package/dist/dispatch-JZWIFKRB.js +0 -2
  215. package/dist/evidence-FN2SQB6Z.js +0 -2
  216. package/dist/exit-manager-3FVBTNYR.js +0 -2
  217. package/dist/gaps-cmd-MFZ52DC7.js +0 -3
  218. package/dist/ingest-TTSDUMH5.js +0 -2
  219. package/dist/ingest-cmd-D2MD6EAK.js +0 -2
  220. package/dist/install-RHINEFR5.js +0 -2
  221. package/dist/login-flow-B5J6JXQN.js +0 -2
  222. package/dist/persist-recorded-session-Z5SCYWXR.js +0 -3
  223. package/dist/pipeline-HMFLLUZJ.js +0 -2
  224. package/dist/prepare-target-HOEFIKXN.js +0 -2
  225. package/dist/readmodel-UZETCXV6.js +0 -2
  226. package/dist/reconcile-cmd-Q7CBNPRX.js +0 -2
  227. package/dist/reconcile-engine-ES2INERY.js +0 -2
  228. package/dist/registry-E5RSXYQJ.js +0 -2
  229. package/dist/resolve-run-intent-WSOCGJUN.js +0 -2
  230. package/dist/run-45ODACZR.js +0 -2
  231. package/dist/run-ZYARNPAS.js +0 -2
  232. package/dist/tcg-generate-DASCY23M.js +0 -2
  233. package/dist/testmd-actions-X6HEL5NH.js +0 -2
  234. package/dist/token-refresh-ZTQFC3Q3.js +0 -2
  235. package/dist/verdicts-CRNN765C.js +0 -2
  236. package/dist/with-telemetry-Y6MVROKX.js +0 -2
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as f}from"./chunk-GJ6RJVXH.js";import{x as t}from"./chunk-N2N5T5JN.js";import{a as x}from"./chunk-HCBYKLMW.js";import{a,b as n}from"./chunk-C44QQJR4.js";import{a as R}from"./chunk-6YGTRKDT.js";import{e as c}from"./chunk-UR6MHSHU.js";var p=c(R(),1);var e=c(x(),1);function v(){return[{name:"convert",label:"Converting session data",status:"pending"},{name:"zip",label:"Compressing artifacts",status:"pending"},{name:"presign",label:"Requesting upload URLs",status:"pending"},{name:"upload",label:"Uploading to KaneAI",status:"pending"},{name:"atomic_replace",label:"Replacing local output",status:"pending"},{name:"commit_lock",label:"Committing to TMS",status:"pending"},{name:"finalize",label:"Finalizing test case",status:"pending"},{name:"code_export",label:"Downloading test code",status:"pending"}]}function U(s,o,d,i){return s.map(l=>l.name===o?{...l,status:d,detail:i}:l)}function D(s){let o=s/1e3;if(o<60)return`${o.toFixed(1)}s`;let d=Math.floor(o/60),i=Math.round(o%60);return`${d}m ${i}s`}function w(s){let[o,d]=(0,p.useState)(0),i=p.default.useRef(Date.now());return(0,p.useEffect)(()=>{if(!s)return;i.current=Date.now();let l=setInterval(()=>{d(Date.now()-i.current)},100);return()=>clearInterval(l)},[s]),o}function h({steps:s,status:o,testUrl:d,error:i}){let l=w(o==="uploading");return o==="uploading"?(0,e.jsxs)(a,{flexDirection:"column",paddingX:1,paddingY:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(n,{color:t.orange,children:"\u2601 "}),(0,e.jsx)(n,{color:t.orange,bold:!0,children:"Saving to KaneAI"}),(0,e.jsxs)(n,{color:t.dim,children:[" ",D(l)]})]}),(0,e.jsx)(a,{flexDirection:"column",marginTop:1,children:s.filter(r=>r.status!=="skipped"||r.detail).map((r,S,T)=>{let b=S===T.length-1?"\u2514\u2500":"\u251C\u2500",u=r.status==="done",m=r.status==="running",g=r.status==="failed",B=r.status==="skipped";return(0,e.jsxs)(a,{children:[(0,e.jsxs)(n,{color:t.dim,children:[" ",b," "]}),(0,e.jsx)(a,{width:3,children:m?(0,e.jsx)(f,{}):u?(0,e.jsx)(n,{color:t.green,children:"\u2713"}):g?(0,e.jsx)(n,{color:t.red,children:"\u2717"}):B?(0,e.jsx)(n,{color:t.muted,children:"\u2013"}):(0,e.jsx)(n,{color:t.muted,children:"\u25CB"})}),(0,e.jsx)(n,{color:u?t.dim:m?void 0:g?t.red:t.muted,children:r.label}),r.detail&&(0,e.jsxs)(n,{color:t.dim,children:[" ",r.detail]})]},r.name)})}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(n,{color:t.muted,children:" press Ctrl+C twice to force exit"})})]}):o==="success"?(0,e.jsx)(e.Fragment,{}):(0,e.jsxs)(a,{flexDirection:"column",paddingX:1,paddingY:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(n,{color:t.red,children:"\u2601 "}),(0,e.jsx)(n,{color:t.red,bold:!0,children:"Save failed"})]}),i&&(0,e.jsxs)(a,{marginTop:0,children:[(0,e.jsx)(n,{color:t.dim,children:" "}),(0,e.jsx)(n,{color:t.dim,children:i})]})]})}export{v as a,U as b,h as c};
2
+ import{a as f}from"./chunk-AROBXG66.js";import{x as t}from"./chunk-DWHXXPDX.js";import{a as x}from"./chunk-HCBYKLMW.js";import{a,b as n}from"./chunk-C44QQJR4.js";import{a as R}from"./chunk-6YGTRKDT.js";import{e as c}from"./chunk-UR6MHSHU.js";var p=c(R(),1);var e=c(x(),1);function v(){return[{name:"convert",label:"Converting session data",status:"pending"},{name:"zip",label:"Compressing artifacts",status:"pending"},{name:"presign",label:"Requesting upload URLs",status:"pending"},{name:"upload",label:"Uploading to KaneAI",status:"pending"},{name:"atomic_replace",label:"Replacing local output",status:"pending"},{name:"commit_lock",label:"Committing to TMS",status:"pending"},{name:"finalize",label:"Finalizing test case",status:"pending"},{name:"code_export",label:"Downloading test code",status:"pending"}]}function U(s,o,d,i){return s.map(l=>l.name===o?{...l,status:d,detail:i}:l)}function D(s){let o=s/1e3;if(o<60)return`${o.toFixed(1)}s`;let d=Math.floor(o/60),i=Math.round(o%60);return`${d}m ${i}s`}function w(s){let[o,d]=(0,p.useState)(0),i=p.default.useRef(Date.now());return(0,p.useEffect)(()=>{if(!s)return;i.current=Date.now();let l=setInterval(()=>{d(Date.now()-i.current)},100);return()=>clearInterval(l)},[s]),o}function h({steps:s,status:o,testUrl:d,error:i}){let l=w(o==="uploading");return o==="uploading"?(0,e.jsxs)(a,{flexDirection:"column",paddingX:1,paddingY:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(n,{color:t.orange,children:"\u2601 "}),(0,e.jsx)(n,{color:t.orange,bold:!0,children:"Saving to KaneAI"}),(0,e.jsxs)(n,{color:t.dim,children:[" ",D(l)]})]}),(0,e.jsx)(a,{flexDirection:"column",marginTop:1,children:s.filter(r=>r.status!=="skipped"||r.detail).map((r,S,T)=>{let b=S===T.length-1?"\u2514\u2500":"\u251C\u2500",u=r.status==="done",m=r.status==="running",g=r.status==="failed",B=r.status==="skipped";return(0,e.jsxs)(a,{children:[(0,e.jsxs)(n,{color:t.dim,children:[" ",b," "]}),(0,e.jsx)(a,{width:3,children:m?(0,e.jsx)(f,{}):u?(0,e.jsx)(n,{color:t.green,children:"\u2713"}):g?(0,e.jsx)(n,{color:t.red,children:"\u2717"}):B?(0,e.jsx)(n,{color:t.muted,children:"\u2013"}):(0,e.jsx)(n,{color:t.muted,children:"\u25CB"})}),(0,e.jsx)(n,{color:u?t.dim:m?void 0:g?t.red:t.muted,children:r.label}),r.detail&&(0,e.jsxs)(n,{color:t.dim,children:[" ",r.detail]})]},r.name)})}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(n,{color:t.muted,children:" press Ctrl+C twice to force exit"})})]}):o==="success"?(0,e.jsx)(e.Fragment,{}):(0,e.jsxs)(a,{flexDirection:"column",paddingX:1,paddingY:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(n,{color:t.red,children:"\u2601 "}),(0,e.jsx)(n,{color:t.red,bold:!0,children:"Save failed"})]}),i&&(0,e.jsxs)(a,{marginTop:0,children:[(0,e.jsx)(n,{color:t.dim,children:" "}),(0,e.jsx)(n,{color:t.dim,children:i})]})]})}export{v as a,U as b,h as c};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as t}from"./chunk-427OQS2N.js";import{a,b as s,c as n}from"./chunk-WXHQYYD5.js";function y(o="extract"){let i=new Set(t(o)),c=Object.fromEntries(Object.keys(s).map(r=>{let e=s[r];return[r,{hashed:[...e.hashed],unhashed:[...e.unhashed??[]],required:[...e.required],enums:Object.fromEntries(Object.entries(e.enums).map(([p,g])=>[p,[...g]])),mintable:i.has(r)}]})),d=Object.fromEntries(Object.keys(n).map(r=>{let e=n[r];return[r,{src:[...e.src],dst:[...e.dst],salient:[...e.salient],props:[...e.props],cardinality:e.cardinality,acyclic:e.acyclic,direction:"dependent->dependency"}]}));return{schema_version:a,nodes:c,edges:d,mint_gate:t(o),blob_fingerprint:{algo:"sha256",domain:"assurance.blob\0",prefix:"sha256:"}}}export{y as a};
2
+ import{a as t}from"./chunk-427OQS2N.js";import{a,b as s,c as n}from"./chunk-AKX4VRRR.js";function y(o="extract"){let i=new Set(t(o)),c=Object.fromEntries(Object.keys(s).map(r=>{let e=s[r];return[r,{hashed:[...e.hashed],unhashed:[...e.unhashed??[]],required:[...e.required],enums:Object.fromEntries(Object.entries(e.enums).map(([p,g])=>[p,[...g]])),mintable:i.has(r)}]})),d=Object.fromEntries(Object.keys(n).map(r=>{let e=n[r];return[r,{src:[...e.src],dst:[...e.dst],salient:[...e.salient],props:[...e.props],cardinality:e.cardinality,acyclic:e.acyclic,direction:"dependent->dependency"}]}));return{schema_version:a,nodes:c,edges:d,mint_gate:t(o),blob_fingerprint:{algo:"sha256",domain:"assurance.blob\0",prefix:"sha256:"}}}export{y as a};
@@ -0,0 +1,26 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{d as w}from"./chunk-IPEA7ZOF.js";import{b as h,c as b}from"./chunk-VZ7KXRXB.js";import{b as $}from"./chunk-IAHKTEET.js";var j=new Set(["delta","state-transition"]),K=/^capture baseline:/i;function I(e){return typeof e=="string"?e:e.text}function S(e){return typeof e=="object"&&e.baseline===!0||K.test(I(e).trim())}function T(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)&&"derived"in e}function B(e,r){if(e.check_prose)return e.check_prose;let t=r.find(o=>o.ref===e.check.verified_against),n=t?.text?` \u2014 the stated promise: ${t.text}`:"",s=String(e.check.operand??e.check.within??e.check.metric??"");return e.check.kind==="forbidden-presence"?`Confirm '${s}' does NOT appear (forbidden-presence)${n}`:`Confirm ${e.check.kind} check: ${s} (${e.check.operator})${n}`}var N=/^## Step \d+ — assert\s*$/;function X(e,r){let t=e.split(`
3
+ `),n=!1;for(let s=0;s<t.length;s++){let o=/^(##\s.*?)\s@verifies\s+(.+?)\s*$/.exec(t[s]);if(!o)continue;n=!0;let c=o[2].split(",").map(a=>a.trim()).filter(Boolean).map(a=>{let i=r(a)??(a.startsWith("ac-")?a:null);if(!i)throw new Error(`@verifies ref '${a}' does not resolve to a committed AC`);return i});t[s]=`${o[1]} @verifies ${c.join(", ")}`}return{md:t.join(`
4
+ `),tagged:n}}function Y(e,r){if(r.length!==0&&!e.split(`
5
+ `).some(t=>/^##\s/.test(t)&&w.test(t)))throw new Error("generated body has no @verifies binding for its ACs \u2014 the emitter contract is broken")}function ee(e){let r=e.split(`
6
+ `);if(r[0]?.trim()!=="---")return{};let t=r.slice(1).findIndex(n=>n.trim()==="---");if(t<0)return{};try{return h(r.slice(1,t+1).join(`
7
+ `))??{}}catch{return{}}}function te(e,r){if(r.length===0)return e;let t=e.split(`
8
+ `);for(let n=t.length-1;n>=0;n--){if(/^## Step \d+ — assert @verifies /.test(t[n]))return e;if(N.test(t[n]))return t[n]=`${t[n].trimEnd()} @verifies ${r.join(", ")}`,t.join(`
9
+ `)}return e}function ne(e,r){return r.size===0?e:e.split(`
10
+ `).map(t=>{let n=t.match(/^@import\s+(\S+)\s*$/);if(n&&r.has(n[1]))return`@import ${r.get(n[1])}`;let s=t.match(/^## Import: (\S+)\s*$/);return s&&r.has(s[1])?`## Import: ${r.get(s[1])}`:t}).join(`
11
+ `)}function E(e){let r=e.expected_mode??(T(e.operand)?"runtime-derived":"inferred");return{kind:e.kind,operator:e.operator,...e.operand!==void 0?{operand:e.operand}:{},...j.has(e.kind)?{baseline:e.baseline??null}:{},...e.within!==void 0?{within:e.within}:{},...e.metric!==void 0?{metric:e.metric}:{},...e.threshold!==void 0?{threshold:e.threshold}:{},...e.unit!==void 0?{unit:e.unit}:{},verified_against:e.verified_against,expected_mode:r,review_required:e.review_required??r==="runtime-derived"}}function re(e,r,t){if(j.has(e.check.kind)&&!e.steps.some(S))throw new Error(`emitTestMd: check kind '${e.check.kind}' needs a baseline-capture step before the action (a step starting 'capture baseline: <metric>' or { baseline: true }) \u2014 the validator should have caught this`);let n=[];if(e.target){let i=u=>/^[A-Za-z0-9._/@-]+$/.test(u)?u:JSON.stringify(u);n.push("---",`target: ${e.target}`),e.app&&n.push(`app: ${i(e.app)}`),n.push("---","")}n.push(`# ${e.title}`,""),r.intent&&n.push(`> ${r.intent}`,"");for(let i of e.reuses??[])n.push(`## Import: ${i}`,"",`@import ${i}`,"");let s=[],o=e.steps.some(i=>typeof i=="object"&&(i.verifies?.length??0)>0),c=0;for(let i of e.steps){c++;let u=I(i).trim(),l=typeof i=="object"&&i.verifies?.length?` @verifies ${i.verifies.join(", ")}`:"";n.push(`## Step ${c}${l}`,"",u,""),s.push({step:c,objective:u,...S(i)?{baseline:!0}:{},...typeof i=="object"&&i.verifies?.length?{verifies:[...i.verifies]}:{}})}if(o){let i=-1;if(e.steps.forEach((u,l)=>{typeof u=="object"&&u.verifies?.includes(e.check.verified_against)&&(i=l)}),i<0)throw new Error(`emitTestMd: no tagged step claims check.verified_against (${String(e.check.verified_against)}) \u2014 the check would be dropped`);s[i].check=E(e.check)}else{c++;let i=B(e,t);n.push(`## Step ${c} \u2014 assert`,"",i,""),s.push({step:c,objective:i,check:E(e.check)})}let a=b({title:e.title,...r.title?{scenario:r.title}:{},objectives:s},{sortKeys:!0,lineWidth:-1});return{test_md:n.join(`
12
+ `),objectives_yaml:a}}function ie(e){let t=e.replace(/\r\n/g,`
13
+ `).split(`
14
+ `).map(o=>o.replace(/[ \t]+$/,""));if(t[0]?.trim()==="---"){let o=t.slice(1).findIndex(c=>c.trim()==="---");if(o>=0){let c=h(t.slice(1,o+1).join(`
15
+ `))??{},a="assurance"in c;delete c.assurance,Object.keys(c).length===0&&a?t=t.slice(o+2):t=["---",...b(c,{sortKeys:!0,lineWidth:-1}).trimEnd().split(`
16
+ `),"---",...t.slice(o+2)]}}let n=[];for(let o of t)o===""&&n[n.length-1]===""||n.push(o);for(;n[0]==="";)n.shift();for(;n[n.length-1]==="";)n.pop();let s=n.join(`
17
+ `)+`
18
+ `;return"sha256:"+$(Buffer.from("assurance.testdef\0"+s,"utf8"))}import{existsSync as M,readFileSync as O}from"fs";import{dirname as W,isAbsolute as z,resolve as D}from"path";var _=/^@import\s+(\S+)\s*$/;function F(e){let r=new Set;for(let t=0;t<e.length;t++)if(_.test(e[t].trim()))for(let n=t-1;n>=0;n--){let s=e[n].trim();if(s!==""){s==="```"&&r.add(t);break}}return r}function G(e,r,t=new Set,n=0){if(n>10)return e;let s=e.split(`
19
+ `),o=F(s);return s.map((c,a)=>{let i=_.exec(c.trim());if(!i||o.has(a))return c;let u=r(i[1]);if(!u||t.has(u.cycleKey))return c;let l=new Set(t);return l.add(u.cycleKey),G(u.body.trimEnd(),u.next,l,n+1)}).join(`
20
+ `)}function q(e){return r=>{let t=e.resolve(r);if(!t)return null;let n=e.getNode(t.tip)?.content.test_md_blob;return n?{body:n,cycleKey:t.tip,next:q(e)}:null}}function V(e,r){return t=>{let n=z(t)?t:D(e,t);if(!M(n))return null;let s=O(n,"utf8"),o=P(s);return!o||!r.resolve(o)?null:{body:J(s),cycleKey:n,next:V(W(n),r)}}}function R(e,r){let t=-1;for(let d=1;d<r;d++)if(/^assurance\s*:\s*$/.test(e[d])){t=d;break}if(t<0)return null;let n=r;for(let d=t+1;d<r;d++)if(/^[^\s#]/.test(e[d])){n=d;break}let s,o=t,c,a,i,u,l,f=!1;for(let d=t+1;d<n;d++){let p=e[d].endsWith("\r")?e[d].slice(0,-1):e[d];if(p.trim()===""||/^\s*#/.test(p))continue;o=d;let v=/^(\s+)([^\s:#][^:]*):\s*(.*)$/.exec(p);if(!v){/^\s*["']?base["']?\s*:/.test(p)&&(f=!0);continue}let[,x,L,C]=v,m=L.trimEnd();s===void 0&&(s=x);let g=x===s,k=/^([^#\s]\S*)?\s*(#.*)?$/.exec(C.trim()),y=k?.[1];m==="id"&&g&&c===void 0&&(c=d,a=y),m==="base"&&(g&&i===void 0?(i=d,u=y,l=k?.[2]):g||(f=!0)),m!=="base"&&/^["']base["']$/.test(m)&&(f=!0)}return{start:t,lastChild:o,childIndent:s,idLine:c,id:a,baseLine:i,base:u,baseComment:l,strayBase:f}}function H(e){let r=A(e);if(!r)return null;let t=e.split(`
21
+ `),n=R(t,r.endLine);return n?.id?{id:n.id,...n.base!==void 0?{base:n.base}:{}}:null}function P(e){return H(e)?.id??null}function A(e){let r=e.split(`
22
+ `);if(r[0]?.trim()!=="---")return null;for(let t=1;t<r.length;t++)if(r[t].trim()==="---")return{text:r.slice(1,t).join(`
23
+ `),endLine:t};return null}function J(e){let r=A(e);if(!r)return e;let t=e.split(`
24
+ `),n=R(t,r.endLine),s=[],o=!1;for(let a=1;a<r.endLine;a++){let i=t[a];if(n&&a>=n.start&&a<=n.lastChild){o=!1;continue}if(/^assurance\s*:\s*\{/.test(i)){o=!0;continue}o&&/^\s+\S/.test(i)||(o=!1,s.push(i))}let c=t.slice(r.endLine+1).join(`
25
+ `);return s.every(a=>a.trim()==="")?c:["---",...s,"---",c].join(`
26
+ `)}export{T as a,X as b,Y as c,ee as d,te as e,ne as f,re as g,ie as h,_ as i,F as j,G as k,q as l,V as m,R as n,H as o,J as p};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as f}from"./chunk-YDEK2FJQ.js";import{x as r}from"./chunk-N2N5T5JN.js";import{a as g}from"./chunk-HCBYKLMW.js";import{a as i,b as n,i as p}from"./chunk-C44QQJR4.js";import{a as x}from"./chunk-6YGTRKDT.js";import{e as d}from"./chunk-UR6MHSHU.js";var b=d(x(),1);var e=d(g(),1),v=[{value:"desktop",label:"Desktop",hint:"Chrome on this machine"},{value:"emulator",label:"Emulator",hint:"a virtual Android device"},{value:"simulator",label:"Simulator",hint:"a virtual iOS device"}];function T(a){return a==="all"?v:v.filter(l=>l.value!=="desktop")}function B({mode:a="all",onSelect:l,onCancel:c}){let u=T(a),[h,m]=(0,b.useState)(0);return p((s,o)=>{if(o.escape&&c){c();return}o.upArrow&&m(t=>Math.max(0,t-1)),o.downArrow&&m(t=>Math.min(u.length-1,t+1)),o.return&&l(u[h].value)}),(0,e.jsxs)(i,{flexDirection:"column",borderStyle:"round",borderColor:r.orange,paddingX:2,paddingY:1,children:[(0,e.jsx)(n,{color:r.orange,bold:!0,children:a==="all"?"Where should tests run?":"Which kind of device?"}),(0,e.jsx)(i,{marginTop:1,flexDirection:"column",children:u.map((s,o)=>{let t=o===h;return(0,e.jsxs)(i,{children:[(0,e.jsxs)(n,{color:t?r.orange:void 0,children:[t?"\u276F ":" ",s.label]}),(0,e.jsxs)(n,{color:r.dim,children:[" ",s.hint]})]},s.value)})}),(0,e.jsx)(i,{marginTop:1,children:(0,e.jsx)(n,{color:r.dim,children:"You can change this any time with /desktop or /mobile."})}),(0,e.jsx)(f,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"select"}],suppressEscBack:!c,escBackLabel:"skip"})]})}export{B as a};
2
+ import{a as f}from"./chunk-7RAIRUXO.js";import{x as r}from"./chunk-DWHXXPDX.js";import{a as g}from"./chunk-HCBYKLMW.js";import{a as i,b as n,i as p}from"./chunk-C44QQJR4.js";import{a as x}from"./chunk-6YGTRKDT.js";import{e as d}from"./chunk-UR6MHSHU.js";var b=d(x(),1);var e=d(g(),1),v=[{value:"desktop",label:"Desktop",hint:"Chrome on this machine"},{value:"emulator",label:"Emulator",hint:"a virtual Android device"},{value:"simulator",label:"Simulator",hint:"a virtual iOS device"}];function T(a){return a==="all"?v:v.filter(l=>l.value!=="desktop")}function B({mode:a="all",onSelect:l,onCancel:c}){let u=T(a),[h,m]=(0,b.useState)(0);return p((s,o)=>{if(o.escape&&c){c();return}o.upArrow&&m(t=>Math.max(0,t-1)),o.downArrow&&m(t=>Math.min(u.length-1,t+1)),o.return&&l(u[h].value)}),(0,e.jsxs)(i,{flexDirection:"column",borderStyle:"round",borderColor:r.orange,paddingX:2,paddingY:1,children:[(0,e.jsx)(n,{color:r.orange,bold:!0,children:a==="all"?"Where should tests run?":"Which kind of device?"}),(0,e.jsx)(i,{marginTop:1,flexDirection:"column",children:u.map((s,o)=>{let t=o===h;return(0,e.jsxs)(i,{children:[(0,e.jsxs)(n,{color:t?r.orange:void 0,children:[t?"\u276F ":" ",s.label]}),(0,e.jsxs)(n,{color:r.dim,children:[" ",s.hint]})]},s.value)})}),(0,e.jsx)(i,{marginTop:1,children:(0,e.jsx)(n,{color:r.dim,children:"You can change this any time with /desktop or /mobile."})}),(0,e.jsx)(f,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"select"}],suppressEscBack:!c,escBackLabel:"skip"})]})}export{B as a};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{w as s}from"./chunk-N2N5T5JN.js";function n(r="prod"){let e=s[r];return r!=="stage"?e:{authBaseUrl:process.env.KANE_STAGE_AUTH_URL??e.authBaseUrl,consentUrl:process.env.KANE_STAGE_CONSENT_URL??e.consentUrl,controllerBaseUrl:process.env.TESTMUAI_BASE_URL??e.controllerBaseUrl,tmsBaseUrl:process.env.KANE_STAGE_TMS_URL??e.tmsBaseUrl,testGeneratorBaseUrl:process.env.KANE_STAGE_TCG_URL??e.testGeneratorBaseUrl,secretsBaseUrl:process.env.KANE_STAGE_SECRETS_URL??e.secretsBaseUrl,testManagerUiUrl:process.env.KANE_STAGE_TEST_MANAGER_UI_URL??e.testManagerUiUrl,shareApiBaseUrl:process.env.KANE_STAGE_SHARE_API_URL??e.shareApiBaseUrl,v16ServerHost:process.env.KANE_STAGE_V16_SERVER_HOST??e.v16ServerHost,evidenceViewerUrl:process.env.KANE_STAGE_EVIDENCE_VIEWER_URL??e.evidenceViewerUrl,mediaArtefactsHost:process.env.KANE_STAGE_MEDIA_ARTEFACTS_HOST??e.mediaArtefactsHost,mobileAppBaseUrl:process.env.KANE_STAGE_MOBILE_APP_URL??e.mobileAppBaseUrl}}export{n as a};
2
+ import{w as s}from"./chunk-DWHXXPDX.js";function n(r="prod"){let e=s[r];return r!=="stage"?e:{authBaseUrl:process.env.KANE_STAGE_AUTH_URL??e.authBaseUrl,consentUrl:process.env.KANE_STAGE_CONSENT_URL??e.consentUrl,controllerBaseUrl:process.env.TESTMUAI_BASE_URL??e.controllerBaseUrl,tmsBaseUrl:process.env.KANE_STAGE_TMS_URL??e.tmsBaseUrl,testGeneratorBaseUrl:process.env.KANE_STAGE_TCG_URL??e.testGeneratorBaseUrl,secretsBaseUrl:process.env.KANE_STAGE_SECRETS_URL??e.secretsBaseUrl,testManagerUiUrl:process.env.KANE_STAGE_TEST_MANAGER_UI_URL??e.testManagerUiUrl,shareApiBaseUrl:process.env.KANE_STAGE_SHARE_API_URL??e.shareApiBaseUrl,v16ServerHost:process.env.KANE_STAGE_V16_SERVER_HOST??e.v16ServerHost,evidenceViewerUrl:process.env.KANE_STAGE_EVIDENCE_VIEWER_URL??e.evidenceViewerUrl,mediaArtefactsHost:process.env.KANE_STAGE_MEDIA_ARTEFACTS_HOST??e.mediaArtefactsHost,mobileAppBaseUrl:process.env.KANE_STAGE_MOBILE_APP_URL??e.mobileAppBaseUrl}}export{n as a};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as u,b as x}from"./chunk-T3DVIDBA.js";import{x as m}from"./chunk-N2N5T5JN.js";import{a as f}from"./chunk-HCBYKLMW.js";import{a as r,b as i}from"./chunk-C44QQJR4.js";import{e as n}from"./chunk-UR6MHSHU.js";var e=n(f(),1);function C({title:B,titleColor:c,borderColor:d,variant:p,rows:s,footer:t,labelWidth:l=14,marginBottom:b=1}){return(0,e.jsxs)(u,{title:B,titleColor:c,borderColor:d,variant:p,marginBottom:b,children:[s.map((o,a)=>typeof o.value=="string"?(0,e.jsx)(x,{label:o.label,value:o.value,valueColor:o.valueColor,labelWidth:l},`${o.label}-${a}`):(0,e.jsxs)(r,{children:[(0,e.jsx)(r,{width:l,children:(0,e.jsx)(i,{color:m.dim,children:o.label})}),o.value]},`${o.label}-${a}`)),t&&(0,e.jsx)(r,{marginTop:1,children:t})]})}export{C as a};
2
+ import{a as u,b as x}from"./chunk-SJBIXLL3.js";import{x as m}from"./chunk-DWHXXPDX.js";import{a as f}from"./chunk-HCBYKLMW.js";import{a as r,b as i}from"./chunk-C44QQJR4.js";import{e as n}from"./chunk-UR6MHSHU.js";var e=n(f(),1);function C({title:B,titleColor:c,borderColor:d,variant:p,rows:s,footer:t,labelWidth:l=14,marginBottom:b=1}){return(0,e.jsxs)(u,{title:B,titleColor:c,borderColor:d,variant:p,marginBottom:b,children:[s.map((o,a)=>typeof o.value=="string"?(0,e.jsx)(x,{label:o.label,value:o.value,valueColor:o.valueColor,labelWidth:l},`${o.label}-${a}`):(0,e.jsxs)(r,{children:[(0,e.jsx)(r,{width:l,children:(0,e.jsx)(i,{color:m.dim,children:o.label})}),o.value]},`${o.label}-${a}`)),t&&(0,e.jsx)(r,{marginTop:1,children:t})]})}export{C as a};
@@ -1,6 +1,6 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as G,c as P,e as J,h as q,i as z,j as Q,m as V,o as X,p as T}from"./chunk-Q3S5EKX5.js";import{e as U}from"./chunk-EHN5HTUD.js";import{copyFileSync as ae,cpSync as le,existsSync as w,mkdirSync as ue,readFileSync as Oe,readdirSync as pe,rmSync as Te,writeFileSync as _e}from"fs";import{dirname as Ae,isAbsolute as Le,join as R,relative as Ee,resolve as Ne}from"path";import{writeFileSync as ge,mkdirSync as Se,readFileSync as Re}from"fs";import{dirname as Ie,basename as Y}from"path";function ee(e){let t=e.outPath??P(e.sourcePath);Se(Ie(t),{recursive:!0});let s=[];s.push("---"),s.push(`test: ../${Y(e.sourcePath)}`),s.push(`status: ${e.overallStatus}`),s.push(`started: ${e.startedISO}`),s.push(`duration_s: ${e.durationS}`),s.push(`session_id: ${e.sessionId}`),s.push("---",""),s.push(`# ${e.title??Y(e.sourcePath)} \u2014 Result`,"");for(let l=0;l<e.rootSteps.length;l++){let a=e.rootSteps[l],i=e.outcomes.find(p=>p.rootStepIndex===l+1);if(s.push(ye(a,i)),i?.stepMd5&&s.push(`md5: ${i.stepMd5}`),i?.status==="failed"&&i.reason&&s.push(`Reason: ${i.reason}`),i?.softFailures?.length)for(let p of i.softFailures){let o=p.reason?`: ${p.reason}`:"";s.push(`\u26A0 optional sub-step ${p.subStepIndex} failed${o}`)}a.body.kind==="objective"&&i?.status!=="skipped"&&s.push(a.body.text),s.push("")}return ge(t,s.join(`
2
+ import{b as J,c as P,e as q,h as z,i as Q,j as V,m as X,n as T}from"./chunk-WHEWZR2C.js";import{e as U}from"./chunk-EHN5HTUD.js";import{a as G}from"./chunk-IPEA7ZOF.js";import{copyFileSync as ae,cpSync as le,existsSync as w,mkdirSync as ue,readFileSync as Oe,readdirSync as pe,rmSync as Te,writeFileSync as _e}from"fs";import{dirname as Ae,isAbsolute as Le,join as R,relative as Ee,resolve as Ne}from"path";import{writeFileSync as ge,mkdirSync as Se,readFileSync as Re}from"fs";import{dirname as Ie,basename as Y}from"path";function ee(e){let t=e.outPath??P(e.sourcePath);Se(Ie(t),{recursive:!0});let s=[];s.push("---"),s.push(`test: ../${Y(e.sourcePath)}`),s.push(`status: ${e.overallStatus}`),s.push(`started: ${e.startedISO}`),s.push(`duration_s: ${e.durationS}`),s.push(`session_id: ${e.sessionId}`),s.push("---",""),s.push(`# ${e.title??Y(e.sourcePath)} \u2014 Result`,"");for(let l=0;l<e.rootSteps.length;l++){let a=e.rootSteps[l],i=e.outcomes.find(p=>p.rootStepIndex===l+1);if(s.push(ye(a,i)),i?.stepMd5&&s.push(`md5: ${i.stepMd5}`),i?.status==="failed"&&i.reason&&s.push(`Reason: ${i.reason}`),i?.softFailures?.length)for(let p of i.softFailures){let o=p.reason?`: ${p.reason}`:"";s.push(`\u26A0 optional sub-step ${p.subStepIndex} failed${o}`)}a.body.kind==="objective"&&i?.status!=="skipped"&&s.push(a.body.text),s.push("")}return ge(t,s.join(`
3
3
  `),"utf8"),t}function ye(e,t){if(!t)return`## ${e.heading} (no outcome)`;let s=t.duration_s!=null?`${t.duration_s}s`:"\u2014";if(t.status==="skipped")return`## ${e.heading} \u23ED skipped`;let l=t.softFailed?" (optional)":"";if(t.refKind&&t.status==="passed"){let a=t.helperResultRelPath?` \u2192 ${t.helperResultRelPath}`:"";return`## ${e.heading} \u2713 passed (via @${t.refKind} ${t.refLabel} \u2014 ${t.inlinedCount} inlined steps, ${s}${a})`}if(t.refKind&&t.status==="failed"){let a=t.failedSubStepIndex&&t.failedSubStepIndex.length>0?` \u2014 at sub-step ${t.failedSubStepIndex.join(" \u2192 sub-step ")}`:"",i=t.helperResultRelPath?` \u2192 ${t.helperResultRelPath}`:"";return`## ${e.heading} \u2717 failed${l} (via @${t.refKind} ${t.refLabel}${a}, ${s}${i})`}return t.status==="passed"?`## ${e.heading} \u2713 passed (${s})`:`## ${e.heading} \u2717 failed${l} (${s})`}var xe=/^##\s+(.+?)\s+(✓ passed|✗ failed(?:\s+\(optional\))?|⏭ skipped)(?:\s+\((.*)\))?\s*$/,be=/via\s+@\w+\s+(\S+).*?(?:→\s+(\S+))?\s*$/,ke=/^md5:\s+([a-f0-9]{32})\s*$/;function Z(e,t){for(let s=t;s<e.length&&!/^##\s/.test(e[s]);s++){if(e[s].trim()==="")continue;let l=ke.exec(e[s]);return l?l[1]:null}return null}function $(e){let s=Re(e,"utf8").split(`
4
- `),l="passed";if(s[0]?.trim()==="---")for(let i=1;i<s.length&&s[i].trim()!=="---";i++){let p=/^status:\s+(passed|failed|interrupted)\s*$/.exec(s[i]);p&&(l=p[1])}let a=[];for(let i=0;i<s.length;i++){let p=xe.exec(s[i]);if(!p)continue;let o=p[1],r=p[2],c=p[3]??"",m=r.startsWith("\u2713")?"passed":r.startsWith("\u23ED")?"skipped":"failed";if(/via\s+@/.test(c)){let f=be.exec(c),b=f?.[1]??"",g=f?.[2]??null;a.push({kind:"import",heading:o,status:m,md5:Z(s,i+1),importPath:b,helperResultRelPath:g})}else a.push({kind:"objective",heading:o,status:m,md5:Z(s,i+1)})}return{overallStatus:l,steps:a}}import{copyFileSync as te,existsSync as K,mkdirSync as ve,writeFileSync as se,promises as Ge}from"fs";import{join as D,dirname as re,basename as Pe}from"path";async function ne(e){for(let t=0;t<e.totalRunDirs;t++){let s=e.runIndex+t,l=D(e.sessionDir,"runs",String(s)),a=D(e.stagingStepDir,"flows",String(t));ve(a,{recursive:!0});let i=D(a,"actions.ndjson");if(e.packTestDir){let r=D(e.packTestDir,"logs",`${s}-actions.ndjson`);if(K(r)){te(r,i);continue}let c=re(re(e.packTestDir)),m=Pe(e.packTestDir),I=K(c)?await U(c,`tests/${m}/logs/${s}-actions.ndjson`).catch(()=>null):null;se(i,I??"");continue}let p=[D(l,"run-test","actions.ndjson"),D(l,"actions.ndjson")],o=!1;for(let r of p)if(K(r)){te(r,i),o=!0;break}o||se(i,"")}}import{existsSync as _,readdirSync as we}from"fs";import{dirname as $e,join as M,basename as C}from"path";function et(e){let t=[],s=new Set,l=new Map;function a(r){if(l.has(r))return l.get(r);let c=P(r),m=_(c)?$(c):null;return l.set(r,m),m}let i=new Map;function p(r){if(i.has(r))return i.get(r);let c=M(r,"Result.md"),m=_(c)?$(c):null;return i.set(r,m),m}function o(r){for(let c=1;c<r.trace.length;c++){let m=r.trace[c-1],I=a(m.file);if(!I)continue;let f=I.steps[m.stepIndex-1];if(f){if(f.kind!=="import")return{kind:"author",reason:"structure-mismatch"};if(C(f.importPath)!==C(r.trace[c].file))return{kind:"author",reason:"structure-mismatch"};if(f.md5!=null&&f.md5!==m.rowMd5)return{kind:"author",reason:"structure-mismatch"}}}return null}for(let r of e.steps){let c=r.trace[r.trace.length-1].stepIndex,m=s.has(r.owningFile);for(let g=0;g<r.trace.length-1&&!m;g++)s.has(r.trace[g].file)&&(m=!0);if(m){t.push({kind:"author",reason:a(r.owningFile)===null?"no-result-md":"downstream-of-divergence"});continue}let I=o(r);if(I){t.push(I);for(let g=0;g<r.trace.length;g++)s.add(r.trace[g].file);continue}let f=a(r.owningFile),b;if(f===null&&r.trace.length>1){let g=H(r.trace);b=ie(r,p(g),c,g)}else b=ie(r,f,c);if(t.push(b),b.kind==="author"){s.add(r.owningFile);for(let g=0;g<r.trace.length-1;g++)s.add(r.trace[g].file)}}return t}function ie(e,t,s,l=null){if(!t)return{kind:"author",reason:"no-result-md"};let a=t.steps[s-1];if(!a)return{kind:"author",reason:"no-result-md"};if(a.kind!=="objective")return{kind:"author",reason:"structure-mismatch"};if(a.status!=="passed")return{kind:"author",reason:"recorded-failed"};let i=T(e);if(i!==a.md5)return{kind:"author",reason:"md5-mismatch"};let p=l===null?Q(e.owningFile,s,i.slice(0,8)):M(l,".internal","steps",`${s}-${i.slice(0,8)}`),o=De(p);return o===0?{kind:"author",reason:"missing-recording"}:{kind:"replay",recordingDir:p,flowCount:o}}function De(e){let t=M(e,"flows");if(!_(t))return 0;let s;try{s=we(t,{withFileTypes:!0}).filter(a=>a.isDirectory()&&/^\d+$/.test(a.name)).map(a=>parseInt(a.name,10))}catch{return 0}if(s.length===0)return 0;let l=Math.max(...s);for(let a=0;a<=l;a++)if(!_(M(t,String(a),"actions.ndjson")))return 0;return l+1}function tt(e){return e.some(t=>t.kind==="author")}function st(e){for(let t=0;t<e.length;t++)if(e[t].kind==="author")return t;return e.length}function H(e){let t=i=>{let p=C(i);return p.endsWith("_test.md")?p.slice(0,-8):p.endsWith(".md")?p.slice(0,-3):p},s=t(e[0].file),l=t(e[e.length-1].file),a=e.slice(0,-1).map(i=>String(i.stepIndex));return M($e(e[e.length-1].file),`helper-output-${l}-${s}-${a.join("-")}`)}function rt(e){return Array.from({length:e.flowCount},(t,s)=>M(e.recordingDir,"flows",String(s),"actions.ndjson"))}import{existsSync as oe,mkdirSync as Me,rmSync as je,cpSync as Fe}from"fs";function de(e,t){oe(e)&&(oe(t)&&je(t,{recursive:!0,force:!0}),Me(t,{recursive:!0}),Fe(e,t,{recursive:!0}))}async function gt(e){let t=new Map;for(let o of e.stepRunRecords)t.set(o.testmdStepIndex,o);let s=e.authoredFlatIdx??new Set,l=[],a=[],i=new Map,p=o=>{if(i.has(o))return i.get(o);let r=R(o,"Result.md"),c=w(r)?$(r):null;return i.set(o,c),c};for(let o of e.resolvedTest.unitFiles){let r=o.file===e.resolvedTest.rootPath,c=V(o.file,Oe(o.file,"utf8")),m=P(o.file),I=w(m)?$(m):null,f=[],b=[],g=[],j=[];if(!r)for(let d of e.resolvedTest.steps){if(d.owningFile!==o.file||d.trace.length<2)continue;let n=H(d.trace);j.includes(n)||j.push(n)}let F=d=>{if(I!==null)return null;for(let n of j){let v=p(n)?.steps[d-1];if(v)return{row:v,dir:n}}return null},W=[],A=!1,B=!1,L=!1,E=!1;for(let d of c.steps){let n=d.index,u=I?.steps[n-1];if(d.body.kind==="objective"){let h=e.resolvedTest.steps.filter(S=>S.owningFile===o.file&&S.trace[S.trace.length-1].stepIndex===n&&t.has(S.flatIndex)),y=h.length>0?h[h.length-1]:null;if(y){A=!0,s.has(y.flatIndex)&&(B=!0);let S=T(y),x;r?x=e.outcomes.find(he=>he.rootStepIndex===n)??{rootStepIndex:n,status:"skipped"}:x={rootStepIndex:n,status:ce(y,e.outcomes)},x.status==="failed"&&(L=!0),x.stepMd5==null&&(x.stepMd5=S),f.push(x),b.push({stepIndex:n,md5:S,rec:t.get(y.flatIndex)}),(!u||u.kind!=="objective"||u.status!==x.status||x.status==="passed"&&u.md5!==S)&&(E=!0)}else if(u&&u.kind==="objective")f.push({rootStepIndex:n,status:u.status,...u.md5?{stepMd5:u.md5}:{}}),g.push(n);else if(!r&&F(n)?.row.kind==="objective"){let S=F(n),x=S.row;f.push({rootStepIndex:n,status:x.status,...x.md5?{stepMd5:x.md5}:{}}),W.push({psIdx:n,dir:S.dir})}else r?f.push(e.outcomes.find(S=>S.rootStepIndex===n)??{rootStepIndex:n,status:"skipped"}):f.push({rootStepIndex:n,status:"skipped"});continue}let v=Le(d.body.path)?d.body.path:Ne(Ae(o.file),d.body.path),O=X({path:d.body.path,bindings:d.body.bindings,optional:d.optional??!1}),me=Ee(G(o.file),P(v)),N=e.resolvedTest.steps.filter(h=>h.trace.some((y,S)=>S<h.trace.length-1&&y.file===o.file&&y.stepIndex===n)&&t.has(h.flatIndex));if(N.length>0){A=!0;let h;if(r)h=e.outcomes.find(y=>y.rootStepIndex===n)??{rootStepIndex:n,status:"passed",refKind:"import",refLabel:d.body.path};else{let y=N.some(S=>ce(S,e.outcomes)==="failed");h={rootStepIndex:n,status:y?"failed":"passed",refKind:"import",refLabel:d.body.path,inlinedCount:N.length}}h.status==="failed"&&(L=!0),h.stepMd5==null&&(h.stepMd5=O),h.helperResultRelPath==null&&(h.helperResultRelPath=me),f.push(h),(!u||u.kind!=="import"||u.status!==h.status||u.md5!==O)&&(E=!0)}else if(u&&u.kind==="import")f.push({rootStepIndex:n,status:u.status,refKind:"import",refLabel:u.importPath,...u.md5?{stepMd5:u.md5}:{},...u.helperResultRelPath?{helperResultRelPath:u.helperResultRelPath}:{}});else if(!r&&F(n)?.row.kind==="import"){let h=F(n).row;f.push({rootStepIndex:n,status:h.status,refKind:"import",refLabel:d.body.path})}else r?f.push(e.outcomes.find(h=>h.rootStepIndex===n)??{rootStepIndex:n,status:"skipped",refKind:"import",refLabel:d.body.path}):f.push({rootStepIndex:n,status:"skipped",refKind:"import",refLabel:d.body.path})}if(!(r||A&&(B||L||I===null||E)))continue;l.push(o.file);let k=q(o.file);ue(R(k,".internal"),{recursive:!0});for(let d of b){let n=R(k,".internal","steps",`${d.stepIndex}-${d.md5.slice(0,8)}`);ue(n,{recursive:!0}),await ne({sessionDir:e.sessionDir,runIndex:d.rec.runIndex,totalRunDirs:d.rec.totalRunDirs,stagingStepDir:n,packTestDir:e.packTestDir})}if(g.length>0){let d=z(o.file);if(w(d))for(let n of pe(d)){let u=parseInt(n.split("-")[0]??"",10);!Number.isNaN(u)&&g.includes(u)&&le(R(d,n),R(k,".internal","steps",n),{recursive:!0})}}for(let d of W){let n=R(d.dir,".internal","steps");if(w(n))for(let u of pe(n))parseInt(u.split("-")[0]??"",10)===d.psIdx&&le(R(n,u),R(k,".internal","steps",u),{recursive:!0})}let fe=f.some(d=>d.status==="failed");if(ee({sourcePath:o.file,title:c.title,rootSteps:c.steps,outcomes:f,overallStatus:r?e.overallStatus:fe?"failed":"passed",startedISO:e.startedISO,durationS:r?e.durationS:0,sessionId:e.sessionId,outPath:R(k,"Result.md")}),r){let d={};e.commitId&&(d.commit_id=e.commitId),e.tmsIds.testId&&(d.test_id=e.tmsIds.testId),e.tmsIds.testcaseId&&(d.testcase_id=e.tmsIds.testcaseId),e.tmsIds.projectId&&(d.project_id=e.tmsIds.projectId),e.tmsIds.folderId&&(d.folder_id=e.tmsIds.folderId),e.tmsIds.orgId&&(d.org_id=e.tmsIds.orgId),e.tmsIds.sessionName&&(d.session_name=e.tmsIds.sessionName),_e(R(k,".internal","meta.json"),JSON.stringify(d,null,2)+`
4
+ `),l="passed";if(s[0]?.trim()==="---")for(let i=1;i<s.length&&s[i].trim()!=="---";i++){let p=/^status:\s+(passed|failed|interrupted)\s*$/.exec(s[i]);p&&(l=p[1])}let a=[];for(let i=0;i<s.length;i++){let p=xe.exec(s[i]);if(!p)continue;let o=p[1],r=p[2],c=p[3]??"",m=r.startsWith("\u2713")?"passed":r.startsWith("\u23ED")?"skipped":"failed";if(/via\s+@/.test(c)){let f=be.exec(c),b=f?.[1]??"",g=f?.[2]??null;a.push({kind:"import",heading:o,status:m,md5:Z(s,i+1),importPath:b,helperResultRelPath:g})}else a.push({kind:"objective",heading:o,status:m,md5:Z(s,i+1)})}return{overallStatus:l,steps:a}}import{copyFileSync as te,existsSync as K,mkdirSync as ve,writeFileSync as se,promises as Ge}from"fs";import{join as D,dirname as re,basename as Pe}from"path";async function ne(e){for(let t=0;t<e.totalRunDirs;t++){let s=e.runIndex+t,l=D(e.sessionDir,"runs",String(s)),a=D(e.stagingStepDir,"flows",String(t));ve(a,{recursive:!0});let i=D(a,"actions.ndjson");if(e.packTestDir){let r=D(e.packTestDir,"logs",`${s}-actions.ndjson`);if(K(r)){te(r,i);continue}let c=re(re(e.packTestDir)),m=Pe(e.packTestDir),I=K(c)?await U(c,`tests/${m}/logs/${s}-actions.ndjson`).catch(()=>null):null;se(i,I??"");continue}let p=[D(l,"run-test","actions.ndjson"),D(l,"actions.ndjson")],o=!1;for(let r of p)if(K(r)){te(r,i),o=!0;break}o||se(i,"")}}import{existsSync as _,readdirSync as we}from"fs";import{dirname as $e,join as M,basename as C}from"path";function et(e){let t=[],s=new Set,l=new Map;function a(r){if(l.has(r))return l.get(r);let c=P(r),m=_(c)?$(c):null;return l.set(r,m),m}let i=new Map;function p(r){if(i.has(r))return i.get(r);let c=M(r,"Result.md"),m=_(c)?$(c):null;return i.set(r,m),m}function o(r){for(let c=1;c<r.trace.length;c++){let m=r.trace[c-1],I=a(m.file);if(!I)continue;let f=I.steps[m.stepIndex-1];if(f){if(f.kind!=="import")return{kind:"author",reason:"structure-mismatch"};if(C(f.importPath)!==C(r.trace[c].file))return{kind:"author",reason:"structure-mismatch"};if(f.md5!=null&&f.md5!==m.rowMd5)return{kind:"author",reason:"structure-mismatch"}}}return null}for(let r of e.steps){let c=r.trace[r.trace.length-1].stepIndex,m=s.has(r.owningFile);for(let g=0;g<r.trace.length-1&&!m;g++)s.has(r.trace[g].file)&&(m=!0);if(m){t.push({kind:"author",reason:a(r.owningFile)===null?"no-result-md":"downstream-of-divergence"});continue}let I=o(r);if(I){t.push(I);for(let g=0;g<r.trace.length;g++)s.add(r.trace[g].file);continue}let f=a(r.owningFile),b;if(f===null&&r.trace.length>1){let g=H(r.trace);b=ie(r,p(g),c,g)}else b=ie(r,f,c);if(t.push(b),b.kind==="author"){s.add(r.owningFile);for(let g=0;g<r.trace.length-1;g++)s.add(r.trace[g].file)}}return t}function ie(e,t,s,l=null){if(!t)return{kind:"author",reason:"no-result-md"};let a=t.steps[s-1];if(!a)return{kind:"author",reason:"no-result-md"};if(a.kind!=="objective")return{kind:"author",reason:"structure-mismatch"};if(a.status!=="passed")return{kind:"author",reason:"recorded-failed"};let i=T(e);if(i!==a.md5)return{kind:"author",reason:"md5-mismatch"};let p=l===null?V(e.owningFile,s,i.slice(0,8)):M(l,".internal","steps",`${s}-${i.slice(0,8)}`),o=De(p);return o===0?{kind:"author",reason:"missing-recording"}:{kind:"replay",recordingDir:p,flowCount:o}}function De(e){let t=M(e,"flows");if(!_(t))return 0;let s;try{s=we(t,{withFileTypes:!0}).filter(a=>a.isDirectory()&&/^\d+$/.test(a.name)).map(a=>parseInt(a.name,10))}catch{return 0}if(s.length===0)return 0;let l=Math.max(...s);for(let a=0;a<=l;a++)if(!_(M(t,String(a),"actions.ndjson")))return 0;return l+1}function tt(e){return e.some(t=>t.kind==="author")}function st(e){for(let t=0;t<e.length;t++)if(e[t].kind==="author")return t;return e.length}function H(e){let t=i=>{let p=C(i);return p.endsWith("_test.md")?p.slice(0,-8):p.endsWith(".md")?p.slice(0,-3):p},s=t(e[0].file),l=t(e[e.length-1].file),a=e.slice(0,-1).map(i=>String(i.stepIndex));return M($e(e[e.length-1].file),`helper-output-${l}-${s}-${a.join("-")}`)}function rt(e){return Array.from({length:e.flowCount},(t,s)=>M(e.recordingDir,"flows",String(s),"actions.ndjson"))}import{existsSync as oe,mkdirSync as Me,rmSync as je,cpSync as Fe}from"fs";function de(e,t){oe(e)&&(oe(t)&&je(t,{recursive:!0,force:!0}),Me(t,{recursive:!0}),Fe(e,t,{recursive:!0}))}async function gt(e){let t=new Map;for(let o of e.stepRunRecords)t.set(o.testmdStepIndex,o);let s=e.authoredFlatIdx??new Set,l=[],a=[],i=new Map,p=o=>{if(i.has(o))return i.get(o);let r=R(o,"Result.md"),c=w(r)?$(r):null;return i.set(o,c),c};for(let o of e.resolvedTest.unitFiles){let r=o.file===e.resolvedTest.rootPath,c=G(o.file,Oe(o.file,"utf8")),m=P(o.file),I=w(m)?$(m):null,f=[],b=[],g=[],j=[];if(!r)for(let d of e.resolvedTest.steps){if(d.owningFile!==o.file||d.trace.length<2)continue;let n=H(d.trace);j.includes(n)||j.push(n)}let F=d=>{if(I!==null)return null;for(let n of j){let v=p(n)?.steps[d-1];if(v)return{row:v,dir:n}}return null},W=[],A=!1,B=!1,L=!1,E=!1;for(let d of c.steps){let n=d.index,u=I?.steps[n-1];if(d.body.kind==="objective"){let h=e.resolvedTest.steps.filter(S=>S.owningFile===o.file&&S.trace[S.trace.length-1].stepIndex===n&&t.has(S.flatIndex)),y=h.length>0?h[h.length-1]:null;if(y){A=!0,s.has(y.flatIndex)&&(B=!0);let S=T(y),x;r?x=e.outcomes.find(he=>he.rootStepIndex===n)??{rootStepIndex:n,status:"skipped"}:x={rootStepIndex:n,status:ce(y,e.outcomes)},x.status==="failed"&&(L=!0),x.stepMd5==null&&(x.stepMd5=S),f.push(x),b.push({stepIndex:n,md5:S,rec:t.get(y.flatIndex)}),(!u||u.kind!=="objective"||u.status!==x.status||x.status==="passed"&&u.md5!==S)&&(E=!0)}else if(u&&u.kind==="objective")f.push({rootStepIndex:n,status:u.status,...u.md5?{stepMd5:u.md5}:{}}),g.push(n);else if(!r&&F(n)?.row.kind==="objective"){let S=F(n),x=S.row;f.push({rootStepIndex:n,status:x.status,...x.md5?{stepMd5:x.md5}:{}}),W.push({psIdx:n,dir:S.dir})}else r?f.push(e.outcomes.find(S=>S.rootStepIndex===n)??{rootStepIndex:n,status:"skipped"}):f.push({rootStepIndex:n,status:"skipped"});continue}let v=Le(d.body.path)?d.body.path:Ne(Ae(o.file),d.body.path),O=X({path:d.body.path,bindings:d.body.bindings,optional:d.optional??!1}),me=Ee(J(o.file),P(v)),N=e.resolvedTest.steps.filter(h=>h.trace.some((y,S)=>S<h.trace.length-1&&y.file===o.file&&y.stepIndex===n)&&t.has(h.flatIndex));if(N.length>0){A=!0;let h;if(r)h=e.outcomes.find(y=>y.rootStepIndex===n)??{rootStepIndex:n,status:"passed",refKind:"import",refLabel:d.body.path};else{let y=N.some(S=>ce(S,e.outcomes)==="failed");h={rootStepIndex:n,status:y?"failed":"passed",refKind:"import",refLabel:d.body.path,inlinedCount:N.length}}h.status==="failed"&&(L=!0),h.stepMd5==null&&(h.stepMd5=O),h.helperResultRelPath==null&&(h.helperResultRelPath=me),f.push(h),(!u||u.kind!=="import"||u.status!==h.status||u.md5!==O)&&(E=!0)}else if(u&&u.kind==="import")f.push({rootStepIndex:n,status:u.status,refKind:"import",refLabel:u.importPath,...u.md5?{stepMd5:u.md5}:{},...u.helperResultRelPath?{helperResultRelPath:u.helperResultRelPath}:{}});else if(!r&&F(n)?.row.kind==="import"){let h=F(n).row;f.push({rootStepIndex:n,status:h.status,refKind:"import",refLabel:d.body.path})}else r?f.push(e.outcomes.find(h=>h.rootStepIndex===n)??{rootStepIndex:n,status:"skipped",refKind:"import",refLabel:d.body.path}):f.push({rootStepIndex:n,status:"skipped",refKind:"import",refLabel:d.body.path})}if(!(r||A&&(B||L||I===null||E)))continue;l.push(o.file);let k=z(o.file);ue(R(k,".internal"),{recursive:!0});for(let d of b){let n=R(k,".internal","steps",`${d.stepIndex}-${d.md5.slice(0,8)}`);ue(n,{recursive:!0}),await ne({sessionDir:e.sessionDir,runIndex:d.rec.runIndex,totalRunDirs:d.rec.totalRunDirs,stagingStepDir:n,packTestDir:e.packTestDir})}if(g.length>0){let d=Q(o.file);if(w(d))for(let n of pe(d)){let u=parseInt(n.split("-")[0]??"",10);!Number.isNaN(u)&&g.includes(u)&&le(R(d,n),R(k,".internal","steps",n),{recursive:!0})}}for(let d of W){let n=R(d.dir,".internal","steps");if(w(n))for(let u of pe(n))parseInt(u.split("-")[0]??"",10)===d.psIdx&&le(R(n,u),R(k,".internal","steps",u),{recursive:!0})}let fe=f.some(d=>d.status==="failed");if(ee({sourcePath:o.file,title:c.title,rootSteps:c.steps,outcomes:f,overallStatus:r?e.overallStatus:fe?"failed":"passed",startedISO:e.startedISO,durationS:r?e.durationS:0,sessionId:e.sessionId,outPath:R(k,"Result.md")}),r){let d={};e.commitId&&(d.commit_id=e.commitId),e.tmsIds.testId&&(d.test_id=e.tmsIds.testId),e.tmsIds.testcaseId&&(d.testcase_id=e.tmsIds.testcaseId),e.tmsIds.projectId&&(d.project_id=e.tmsIds.projectId),e.tmsIds.folderId&&(d.folder_id=e.tmsIds.folderId),e.tmsIds.orgId&&(d.org_id=e.tmsIds.orgId),e.tmsIds.sessionName&&(d.session_name=e.tmsIds.sessionName),_e(R(k,".internal","meta.json"),JSON.stringify(d,null,2)+`
5
5
  `,"utf8");let n=R(e.sessionDir,"execution.json");if(w(n))try{ae(n,R(k,".internal","execution.json"))}catch{}if(e.codeExportDir){let u=e.codeExportLanguage??"python",v=R(k,`playwright-${u}-code`);try{de(e.codeExportDir,v)}catch(O){process.stderr.write(`warn: codegen copy failed: ${O.message}
6
- `)}}}else if(o.kind==="test"){let d=J(o.file);if(w(d))try{ae(d,R(k,".internal","meta.json"))}catch{}}!r&&j.length>0&&f.every(n=>n.status!=="skipped")&&a.push({unitFile:o.file,dirs:j.filter(n=>w(n))})}return{changedUnitFiles:l,legacySweep:a}}function St(e){for(let t of e)try{Te(t,{recursive:!0,force:!0})}catch{}}function ce(e,t){let s=e.trace[0].stepIndex,l=t.find(o=>o.rootStepIndex===s);if(!l)return"skipped";if(l.status==="passed")return"passed";if(l.status==="skipped")return"skipped";let a=e.trace.slice(1).map(o=>o.stepIndex),i=l.failedSubStepIndex??[],p=Math.min(a.length,i.length);for(let o=0;o<p;o++)if(a[o]!==i[o])return a[o]<i[o]?"passed":"skipped";return a.length===i.length?"failed":a.length<i.length?"passed":"skipped"}export{ee as a,et as b,tt as c,st as d,rt as e,de as f,gt as g,St as h};
6
+ `)}}}else if(o.kind==="test"){let d=q(o.file);if(w(d))try{ae(d,R(k,".internal","meta.json"))}catch{}}!r&&j.length>0&&f.every(n=>n.status!=="skipped")&&a.push({unitFile:o.file,dirs:j.filter(n=>w(n))})}return{changedUnitFiles:l,legacySweep:a}}function St(e){for(let t of e)try{Te(t,{recursive:!0,force:!0})}catch{}}function ce(e,t){let s=e.trace[0].stepIndex,l=t.find(o=>o.rootStepIndex===s);if(!l)return"skipped";if(l.status==="passed")return"passed";if(l.status==="skipped")return"skipped";let a=e.trace.slice(1).map(o=>o.stepIndex),i=l.failedSubStepIndex??[],p=Math.min(a.length,i.length);for(let o=0;o<p;o++)if(a[o]!==i[o])return a[o]<i[o]?"passed":"skipped";return a.length===i.length?"failed":a.length<i.length?"passed":"skipped"}export{ee as a,et as b,tt as c,st as d,rt as e,de as f,gt as g,St as h};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as C}from"./chunk-GJ6RJVXH.js";import{h as Z}from"./chunk-EU5ZH334.js";import{a as D}from"./chunk-YCCUBQY4.js";import{a as M}from"./chunk-E5C3HUIY.js";import{a as z}from"./chunk-YGVY63PE.js";import{b as W}from"./chunk-TKQSIKMR.js";import{a as B}from"./chunk-YDEK2FJQ.js";import{e as V}from"./chunk-Z7S3IWUX.js";import{x as o}from"./chunk-N2N5T5JN.js";import{a as A}from"./chunk-HCBYKLMW.js";import{a as n,b as t,i as L}from"./chunk-C44QQJR4.js";import{a as N}from"./chunk-6YGTRKDT.js";import{e as g}from"./chunk-UR6MHSHU.js";var T=g(A(),1);function te(e){let i=e.kind==="simulator";switch(e.state){case"ready":return i?"Booted":"Running";case"stopped":return i?"Shutdown":"Stopped";case"unauthorized":return"UNAUTHORIZED";case"offline":return"Offline"}}function re(e){switch(e.state){case"unauthorized":return"accept the authorisation prompt on the device, then reopen this list";case"offline":return e.kind==="simulator"?"not responding \u2014 open Simulator.app to inspect it":"not responding \u2014 reconnect it, or restart the emulator";default:return}}function ne(e,i){let m=i.id!==void 0?{...i,id:z(i.id)}:i,c=e.virtualName!==void 0?{...e,virtualName:z(e.virtualName)}:e;return V(c,m)}function ie(e){return e.virtualName??e.displayName}function ae(e,i){let m=e.state==="ready"||e.state==="stopped",c=re(e),b=e.osVersion?` (${e.osVersion})`:"";return{id:e.id,label:`${ie(e)}${b} \xB7 ${te(e)}`,...i&&ne(e,i)?{isActive:!0}:{},...m?{}:{disabled:!0},...!m&&c?{disabledHint:c}:{}}}function le(e){return e==="emulator"?"No Android emulator found. Make sure an emulator exists on this machine (Android Studio \u2192 Device Manager), then reopen this list.":e==="simulator"?"No iOS simulator found. Make sure a simulator exists on this machine (Xcode \u2192 Windows \u2192 Devices and Simulators), then reopen this list.":"No emulator or simulator found. Make sure one exists on this machine, then reopen this list."}function he({targets:e,preselectedTarget:i,preselectedId:m,busyMessage:c,onSelect:b,onCancel:f,kind:l}){if(c)return(0,T.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,T.jsx)(t,{color:o.orange,bold:!0,children:"Device"}),(0,T.jsxs)(n,{marginTop:1,children:[(0,T.jsx)(C,{}),(0,T.jsxs)(t,{color:o.secondary,children:[" ",c]})]})]});if(e.length===0)return(0,T.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,T.jsx)(t,{color:o.orange,bold:!0,children:"Device"}),(0,T.jsx)(n,{marginTop:1,children:(0,T.jsx)(t,{color:o.dim,children:le(l)})})]});let d=e.map(r=>ae(r,i)),p=i?d.find(r=>r.isActive)?.id??null:m?e.find(r=>r.id===m||r.virtualName===m)?.id??null:null,a=new Map(e.map(r=>[r.id,r]));return(0,T.jsx)(M,{title:"Device",items:d,itemNoun:"devices",defaultActiveId:p,preserveSelectionById:!0,onSelect:r=>{let y=a.get(r.id);y&&b(y)},onCancel:f})}var x=g(N(),1);var u=g(A(),1),q=50,G=500;function pe(e){return`${e.name} (${e.appId})`}function Pe({kind:e,listApps:i,onSelect:m,onManualEntry:c,onCancel:b,busyMessage:f}){let[l,d]=(0,x.useState)([]),[p,a]=(0,x.useState)(!0),[r,y]=(0,x.useState)(!1),[Q,O]=(0,x.useState)(!1),[E,H]=(0,x.useState)(null),[w,J]=(0,x.useState)(""),[j,U]=(0,x.useState)(!1),$=(0,x.useRef)(!0),R=(0,x.useRef)(0);if((0,x.useEffect)(()=>{let h=++R.current,k=w.trim();$.current?a(!0):k&&O(!0),y(!0),H(null),U(!1),(async()=>{let I=[];try{for(let P=0;;P+=q){let X=await i({limit:q,offset:P,search:k});if(h!==R.current)return;if(I.push(...X.apps),d([...I]),$.current&&(a(!1),$.current=!1),O(!1),X.apps.length===0||I.length>=X.total)break;if(I.length>=G){U(!0);break}}}catch(P){if(h!==R.current)return;H(P instanceof Error?P.message:String(P)),a(!1),O(!1)}finally{h===R.current&&y(!1)}})()},[w,i]),L((h,k)=>{if(k.tab){c();return}k.escape&&b()},{isActive:!!E&&!f}),f)return(0,u.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,u.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,u.jsxs)(n,{marginTop:1,children:[(0,u.jsx)(C,{}),(0,u.jsxs)(t,{color:o.secondary,children:[" ",f]})]})]});if(E)return(0,u.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.red,paddingX:2,paddingY:1,children:[(0,u.jsx)(t,{color:o.red,bold:!0,children:"App under test"}),(0,u.jsx)(n,{marginTop:1,children:(0,u.jsx)(t,{color:o.red,children:"Could not load your uploads."})}),(0,u.jsx)(n,{marginTop:1,children:(0,u.jsx)(t,{color:o.dim,children:E})}),(0,u.jsx)(B,{bindings:[{keys:"tab",label:"tab to enter an app id"}],escBackLabel:"back to chat"})]});let ee=new Map(l.map(h=>[h.appId,h])),oe=l.map(h=>({id:h.appId,label:pe(h)})),_=!p&&!r&&l.length===0&&!w.trim()?e==="simulator"?"No simulator builds uploaded to this account yet \u2014 press Tab to enter an app id.":"No emulator builds uploaded to this account yet \u2014 press Tab to enter an app id.":null;return(0,u.jsx)(M,{title:"App under test",items:oe,loading:p,loadingText:"Loading your uploads\u2026",loadingMore:r,searching:Q,itemNoun:"uploads",preserveSelectionById:!0,onSearch:J,onTab:c,extraHint:"tab to enter an id",footer:_?(0,u.jsx)(t,{color:o.dim,children:_}):j?(0,u.jsx)(t,{color:o.dim,children:`Showing the first ${G} \u2014 type to search the rest.`}):void 0,onSelect:h=>{let k=ee.get(h.id);k&&m({appId:k.appId,name:k.name})},onCancel:b})}var Y=g(N(),1);var S=g(A(),1),se={emulator:["apk"],simulator:["zip"]};function ce(e){return Z(e.trim())}function Oe({kind:e,onBack:i,onSelect:m,onCancel:c}){let[b,f]=(0,Y.useState)(""),[l,d]=(0,Y.useState)(null),p=e==="emulator"?".apk":".zip";return(0,S.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,S.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,S.jsx)(n,{marginTop:1,children:(0,S.jsx)(t,{color:o.dim,children:`Path to a build (${p}): `})}),(0,S.jsxs)(n,{marginTop:1,children:[(0,S.jsx)(t,{color:o.dim,children:" "}),(0,S.jsx)(D,{value:b,onChange:a=>{f(a),l&&d(null)},onSubmit:a=>{let r=ce(a);if(!r){d(a.trim()?`Not a build \u2014 expected ${p}.`:"Enter the path to a build.");return}if(!se[e].includes(r.kind)){d(`${r.kind} builds don't run on a ${e} \u2014 expected ${p}.`);return}d(null),m(r).then(y=>{!y.ok&&y.error&&d(y.error)})},onCancel:i,placeholder:e==="emulator"?"/path/to/app-debug.apk":"/path/to/MyApp.zip"})]}),l&&(0,S.jsx)(n,{marginTop:1,children:(0,S.jsx)(t,{color:o.red,children:l})}),(0,S.jsx)(B,{bindings:[{keys:"\u21B5",label:"use this build"}],escBackLabel:"back"})]})}var F=g(N(),1);var v=g(A(),1);function de(e){return[{value:"local",label:"Local build",hint:e==="emulator"?".apk":".zip",available:!0},{value:"uploaded",label:"Uploaded app",hint:"an app id from your cloud uploads",available:!0}]}function Ye({kind:e,onSelect:i,onCancel:m}){let c=de(e),[b,f]=(0,F.useState)(0),[l,d]=(0,F.useState)(null);return L((p,a)=>{if(a.escape){m();return}if(a.upArrow&&f(r=>Math.max(0,r-1)),a.downArrow&&f(r=>Math.min(c.length-1,r+1)),a.return){let r=c[b];if(!r.available){d("That source isn't available \u2014 choose a local build for now.");return}d(null),i(r.value)}}),(0,v.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,v.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,v.jsx)(n,{marginTop:1,flexDirection:"column",children:c.map((p,a)=>{let r=a===b,y=p.available?r?o.orange:void 0:o.muted;return(0,v.jsxs)(n,{children:[(0,v.jsxs)(t,{color:y,children:[r?"\u276F ":" ",p.label]}),(0,v.jsxs)(t,{color:o.dim,children:[" ",p.hint]})]},p.value)})}),l&&(0,v.jsx)(n,{marginTop:1,children:(0,v.jsx)(t,{color:o.red,children:l})}),(0,v.jsx)(B,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"select"}],escBackLabel:"back"})]})}var K=g(N(),1);var s=g(A(),1);function qe({busyMessage:e,onSubmit:i,onBack:m}){let[c,b]=(0,K.useState)(""),[f,l]=(0,K.useState)(null);return e?(0,s.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,s.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,s.jsxs)(n,{marginTop:1,children:[(0,s.jsx)(C,{}),(0,s.jsxs)(t,{color:o.secondary,children:[" ",e]})]})]}):(0,s.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,s.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,s.jsx)(n,{marginTop:1,children:(0,s.jsx)(t,{color:o.dim,children:"App id from your cloud uploads:"})}),(0,s.jsxs)(n,{marginTop:1,children:[(0,s.jsx)(t,{color:o.dim,children:" "}),(0,s.jsx)(D,{value:c,onChange:d=>{b(d),f&&l(null)},onSubmit:d=>{let p=d.trim();if(!p){l("Enter an app id.");return}if(!W(p)){l("That doesn't look like an app id \u2014 they start with APP.");return}l(null),i(p).then(a=>{!a.ok&&a.error&&l(a.error)})},onCancel:m,placeholder:"APP1016032231178585590501450"})]}),f&&(0,s.jsxs)(n,{marginTop:1,flexDirection:"column",children:[(0,s.jsx)(t,{color:o.red,children:f}),(0,s.jsx)(t,{color:o.dim,children:"Enter a valid app id \u2014 copy it from your cloud uploads."})]}),(0,s.jsx)(B,{bindings:[{keys:"\u21B5",label:"use this app"}],escBackLabel:"back"})]})}export{he as a,Pe as b,Oe as c,Ye as d,qe as e};
2
+ import{a as C}from"./chunk-AROBXG66.js";import{h as Z}from"./chunk-MJHLQKQC.js";import{a as D}from"./chunk-YCCUBQY4.js";import{a as M}from"./chunk-CJD3EEPT.js";import{a as z}from"./chunk-R5PIIYN2.js";import{b as W}from"./chunk-F5BI3ALG.js";import{a as B}from"./chunk-7RAIRUXO.js";import{e as V}from"./chunk-Z7S3IWUX.js";import{x as o}from"./chunk-DWHXXPDX.js";import{a as A}from"./chunk-HCBYKLMW.js";import{a as n,b as t,i as L}from"./chunk-C44QQJR4.js";import{a as N}from"./chunk-6YGTRKDT.js";import{e as g}from"./chunk-UR6MHSHU.js";var T=g(A(),1);function te(e){let i=e.kind==="simulator";switch(e.state){case"ready":return i?"Booted":"Running";case"stopped":return i?"Shutdown":"Stopped";case"unauthorized":return"UNAUTHORIZED";case"offline":return"Offline"}}function re(e){switch(e.state){case"unauthorized":return"accept the authorisation prompt on the device, then reopen this list";case"offline":return e.kind==="simulator"?"not responding \u2014 open Simulator.app to inspect it":"not responding \u2014 reconnect it, or restart the emulator";default:return}}function ne(e,i){let m=i.id!==void 0?{...i,id:z(i.id)}:i,c=e.virtualName!==void 0?{...e,virtualName:z(e.virtualName)}:e;return V(c,m)}function ie(e){return e.virtualName??e.displayName}function ae(e,i){let m=e.state==="ready"||e.state==="stopped",c=re(e),b=e.osVersion?` (${e.osVersion})`:"";return{id:e.id,label:`${ie(e)}${b} \xB7 ${te(e)}`,...i&&ne(e,i)?{isActive:!0}:{},...m?{}:{disabled:!0},...!m&&c?{disabledHint:c}:{}}}function le(e){return e==="emulator"?"No Android emulator found. Make sure an emulator exists on this machine (Android Studio \u2192 Device Manager), then reopen this list.":e==="simulator"?"No iOS simulator found. Make sure a simulator exists on this machine (Xcode \u2192 Windows \u2192 Devices and Simulators), then reopen this list.":"No emulator or simulator found. Make sure one exists on this machine, then reopen this list."}function he({targets:e,preselectedTarget:i,preselectedId:m,busyMessage:c,onSelect:b,onCancel:f,kind:l}){if(c)return(0,T.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,T.jsx)(t,{color:o.orange,bold:!0,children:"Device"}),(0,T.jsxs)(n,{marginTop:1,children:[(0,T.jsx)(C,{}),(0,T.jsxs)(t,{color:o.secondary,children:[" ",c]})]})]});if(e.length===0)return(0,T.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,T.jsx)(t,{color:o.orange,bold:!0,children:"Device"}),(0,T.jsx)(n,{marginTop:1,children:(0,T.jsx)(t,{color:o.dim,children:le(l)})})]});let d=e.map(r=>ae(r,i)),p=i?d.find(r=>r.isActive)?.id??null:m?e.find(r=>r.id===m||r.virtualName===m)?.id??null:null,a=new Map(e.map(r=>[r.id,r]));return(0,T.jsx)(M,{title:"Device",items:d,itemNoun:"devices",defaultActiveId:p,preserveSelectionById:!0,onSelect:r=>{let y=a.get(r.id);y&&b(y)},onCancel:f})}var x=g(N(),1);var u=g(A(),1),q=50,G=500;function pe(e){return`${e.name} (${e.appId})`}function Pe({kind:e,listApps:i,onSelect:m,onManualEntry:c,onCancel:b,busyMessage:f}){let[l,d]=(0,x.useState)([]),[p,a]=(0,x.useState)(!0),[r,y]=(0,x.useState)(!1),[Q,O]=(0,x.useState)(!1),[E,H]=(0,x.useState)(null),[w,J]=(0,x.useState)(""),[j,U]=(0,x.useState)(!1),$=(0,x.useRef)(!0),R=(0,x.useRef)(0);if((0,x.useEffect)(()=>{let h=++R.current,k=w.trim();$.current?a(!0):k&&O(!0),y(!0),H(null),U(!1),(async()=>{let I=[];try{for(let P=0;;P+=q){let X=await i({limit:q,offset:P,search:k});if(h!==R.current)return;if(I.push(...X.apps),d([...I]),$.current&&(a(!1),$.current=!1),O(!1),X.apps.length===0||I.length>=X.total)break;if(I.length>=G){U(!0);break}}}catch(P){if(h!==R.current)return;H(P instanceof Error?P.message:String(P)),a(!1),O(!1)}finally{h===R.current&&y(!1)}})()},[w,i]),L((h,k)=>{if(k.tab){c();return}k.escape&&b()},{isActive:!!E&&!f}),f)return(0,u.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,u.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,u.jsxs)(n,{marginTop:1,children:[(0,u.jsx)(C,{}),(0,u.jsxs)(t,{color:o.secondary,children:[" ",f]})]})]});if(E)return(0,u.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.red,paddingX:2,paddingY:1,children:[(0,u.jsx)(t,{color:o.red,bold:!0,children:"App under test"}),(0,u.jsx)(n,{marginTop:1,children:(0,u.jsx)(t,{color:o.red,children:"Could not load your uploads."})}),(0,u.jsx)(n,{marginTop:1,children:(0,u.jsx)(t,{color:o.dim,children:E})}),(0,u.jsx)(B,{bindings:[{keys:"tab",label:"tab to enter an app id"}],escBackLabel:"back to chat"})]});let ee=new Map(l.map(h=>[h.appId,h])),oe=l.map(h=>({id:h.appId,label:pe(h)})),_=!p&&!r&&l.length===0&&!w.trim()?e==="simulator"?"No simulator builds uploaded to this account yet \u2014 press Tab to enter an app id.":"No emulator builds uploaded to this account yet \u2014 press Tab to enter an app id.":null;return(0,u.jsx)(M,{title:"App under test",items:oe,loading:p,loadingText:"Loading your uploads\u2026",loadingMore:r,searching:Q,itemNoun:"uploads",preserveSelectionById:!0,onSearch:J,onTab:c,extraHint:"tab to enter an id",footer:_?(0,u.jsx)(t,{color:o.dim,children:_}):j?(0,u.jsx)(t,{color:o.dim,children:`Showing the first ${G} \u2014 type to search the rest.`}):void 0,onSelect:h=>{let k=ee.get(h.id);k&&m({appId:k.appId,name:k.name})},onCancel:b})}var Y=g(N(),1);var S=g(A(),1),se={emulator:["apk"],simulator:["zip"]};function ce(e){return Z(e.trim())}function Oe({kind:e,onBack:i,onSelect:m,onCancel:c}){let[b,f]=(0,Y.useState)(""),[l,d]=(0,Y.useState)(null),p=e==="emulator"?".apk":".zip";return(0,S.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,S.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,S.jsx)(n,{marginTop:1,children:(0,S.jsx)(t,{color:o.dim,children:`Path to a build (${p}): `})}),(0,S.jsxs)(n,{marginTop:1,children:[(0,S.jsx)(t,{color:o.dim,children:" "}),(0,S.jsx)(D,{value:b,onChange:a=>{f(a),l&&d(null)},onSubmit:a=>{let r=ce(a);if(!r){d(a.trim()?`Not a build \u2014 expected ${p}.`:"Enter the path to a build.");return}if(!se[e].includes(r.kind)){d(`${r.kind} builds don't run on a ${e} \u2014 expected ${p}.`);return}d(null),m(r).then(y=>{!y.ok&&y.error&&d(y.error)})},onCancel:i,placeholder:e==="emulator"?"/path/to/app-debug.apk":"/path/to/MyApp.zip"})]}),l&&(0,S.jsx)(n,{marginTop:1,children:(0,S.jsx)(t,{color:o.red,children:l})}),(0,S.jsx)(B,{bindings:[{keys:"\u21B5",label:"use this build"}],escBackLabel:"back"})]})}var F=g(N(),1);var v=g(A(),1);function de(e){return[{value:"local",label:"Local build",hint:e==="emulator"?".apk":".zip",available:!0},{value:"uploaded",label:"Uploaded app",hint:"an app id from your cloud uploads",available:!0}]}function Ye({kind:e,onSelect:i,onCancel:m}){let c=de(e),[b,f]=(0,F.useState)(0),[l,d]=(0,F.useState)(null);return L((p,a)=>{if(a.escape){m();return}if(a.upArrow&&f(r=>Math.max(0,r-1)),a.downArrow&&f(r=>Math.min(c.length-1,r+1)),a.return){let r=c[b];if(!r.available){d("That source isn't available \u2014 choose a local build for now.");return}d(null),i(r.value)}}),(0,v.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,v.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,v.jsx)(n,{marginTop:1,flexDirection:"column",children:c.map((p,a)=>{let r=a===b,y=p.available?r?o.orange:void 0:o.muted;return(0,v.jsxs)(n,{children:[(0,v.jsxs)(t,{color:y,children:[r?"\u276F ":" ",p.label]}),(0,v.jsxs)(t,{color:o.dim,children:[" ",p.hint]})]},p.value)})}),l&&(0,v.jsx)(n,{marginTop:1,children:(0,v.jsx)(t,{color:o.red,children:l})}),(0,v.jsx)(B,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"select"}],escBackLabel:"back"})]})}var K=g(N(),1);var s=g(A(),1);function qe({busyMessage:e,onSubmit:i,onBack:m}){let[c,b]=(0,K.useState)(""),[f,l]=(0,K.useState)(null);return e?(0,s.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,s.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,s.jsxs)(n,{marginTop:1,children:[(0,s.jsx)(C,{}),(0,s.jsxs)(t,{color:o.secondary,children:[" ",e]})]})]}):(0,s.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,s.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,s.jsx)(n,{marginTop:1,children:(0,s.jsx)(t,{color:o.dim,children:"App id from your cloud uploads:"})}),(0,s.jsxs)(n,{marginTop:1,children:[(0,s.jsx)(t,{color:o.dim,children:" "}),(0,s.jsx)(D,{value:c,onChange:d=>{b(d),f&&l(null)},onSubmit:d=>{let p=d.trim();if(!p){l("Enter an app id.");return}if(!W(p)){l("That doesn't look like an app id \u2014 they start with APP.");return}l(null),i(p).then(a=>{!a.ok&&a.error&&l(a.error)})},onCancel:m,placeholder:"APP1016032231178585590501450"})]}),f&&(0,s.jsxs)(n,{marginTop:1,flexDirection:"column",children:[(0,s.jsx)(t,{color:o.red,children:f}),(0,s.jsx)(t,{color:o.dim,children:"Enter a valid app id \u2014 copy it from your cloud uploads."})]}),(0,s.jsx)(B,{bindings:[{keys:"\u21B5",label:"use this app"}],escBackLabel:"back"})]})}export{he as a,Pe as b,Oe as c,Ye as d,qe as e};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as l}from"./chunk-DPUV6OSP.js";import{a as c}from"./chunk-NLCCBXXV.js";import{a}from"./chunk-RZ4F3BHX.js";var h=class{constructor(e,t,r,s){this.controllerBaseUrl=e;this.getOAuthToken=t;this.directBasicAuth=r;this.log=s}_cached=null;_revoked=!1;_lastError=null;revoke(){this._revoked=!0,this._cached=null}prime(e){this._revoked||(this._cached=e)}get revoked(){return this._revoked}get cached(){return this._cached}get lastError(){return this._lastError}async resolve(e=!1){if(this._cached&&!e)return this._cached;try{let t;if(this.directBasicAuth)t=new l(this.controllerBaseUrl,{username:this.directBasicAuth.username,accessKey:this.directBasicAuth.access_key});else{let s=await this.getOAuthToken();if(!s)return null;t=new l(this.controllerBaseUrl,s)}let r=await t.getTmsCredentials();this.directBasicAuth&&!r.access_key&&(r.access_key=this.directBasicAuth.access_key),this._cached=r,this._lastError=null;try{let[{refreshIdentitySnapshot:s},{telemetryEnvName:n}]=await Promise.all([import("./identity-ADZ4PAJF.js"),import("./bootstrap-UOEW3VZM.js")]);await s(n(),r)}catch{}return this.log?.("info","AUTH_RESOLVE_OK","Auth resolved",{username:r.username,org_id:r.org_id,user_id:r.user_id}),r}catch(t){return this._lastError=t instanceof Error?t:new Error(String(t)),this.log?.("warn","AUTH_RESOLVE_FAILED","Auth resolve failed",{error:this._lastError.message}),null}}async fetch(e,t={}){if(this._revoked)throw new Error("Resolver has been revoked \u2014 identity changed");let r=await this.resolve();if(!r)throw new Error("Not authenticated \u2014 no credentials resolved");let s=i=>({...t,headers:{...t.headers,Authorization:c(i.username,i.access_key)}}),n=await a(e,s(r));if(n.status===401){if(this._revoked)throw new Error("Resolver has been revoked \u2014 identity changed");this.log?.("warn","AUTH_RESOLVE_401","Got 401, re-resolving",{url:e});let i=await this.resolve(!0);if(!i)throw new Error("Re-authentication failed after 401");return a(e,s(i))}return n}};function _(o){if(!o)return"network";let e=/failed:\s*(\d{3})\b/.exec(o.message)?.[1];return e==="401"||e==="403"?"auth":e?"server":"network"}export{h as a,_ as b};
2
+ import{a as l}from"./chunk-DPUV6OSP.js";import{a as c}from"./chunk-NLCCBXXV.js";import{a}from"./chunk-RZ4F3BHX.js";var h=class{constructor(e,t,r,s){this.controllerBaseUrl=e;this.getOAuthToken=t;this.directBasicAuth=r;this.log=s}_cached=null;_revoked=!1;_lastError=null;revoke(){this._revoked=!0,this._cached=null}prime(e){this._revoked||(this._cached=e)}get revoked(){return this._revoked}get cached(){return this._cached}get lastError(){return this._lastError}async resolve(e=!1){if(this._cached&&!e)return this._cached;try{let t;if(this.directBasicAuth)t=new l(this.controllerBaseUrl,{username:this.directBasicAuth.username,accessKey:this.directBasicAuth.access_key});else{let s=await this.getOAuthToken();if(!s)return null;t=new l(this.controllerBaseUrl,s)}let r=await t.getTmsCredentials();this.directBasicAuth&&!r.access_key&&(r.access_key=this.directBasicAuth.access_key),this._cached=r,this._lastError=null;try{let[{refreshIdentitySnapshot:s},{telemetryEnvName:n}]=await Promise.all([import("./identity-ADZ4PAJF.js"),import("./bootstrap-MYG4TJVF.js")]);await s(n(),r)}catch{}return this.log?.("info","AUTH_RESOLVE_OK","Auth resolved",{username:r.username,org_id:r.org_id,user_id:r.user_id}),r}catch(t){return this._lastError=t instanceof Error?t:new Error(String(t)),this.log?.("warn","AUTH_RESOLVE_FAILED","Auth resolve failed",{error:this._lastError.message}),null}}async fetch(e,t={}){if(this._revoked)throw new Error("Resolver has been revoked \u2014 identity changed");let r=await this.resolve();if(!r)throw new Error("Not authenticated \u2014 no credentials resolved");let s=i=>({...t,headers:{...t.headers,Authorization:c(i.username,i.access_key)}}),n=await a(e,s(r));if(n.status===401){if(this._revoked)throw new Error("Resolver has been revoked \u2014 identity changed");this.log?.("warn","AUTH_RESOLVE_401","Got 401, re-resolving",{url:e});let i=await this.resolve(!0);if(!i)throw new Error("Re-authentication failed after 401");return a(e,s(i))}return n}};function _(o){if(!o)return"network";let e=/failed:\s*(\d{3})\b/.exec(o.message)?.[1];return e==="401"||e==="403"?"auth":e?"server":"network"}export{h as a,_ as b};
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{c as u,d as p}from"./chunk-44PZPNXJ.js";import{spawn as h}from"child_process";var k=new Set(["progress","ask_user","graph_query","ingest_request","proposal","design","error","done","reasoning_delta","reasoning_done","tool_activity","decision_activity","text_delta","usage","receipt","chat_ops","session_paused","session_complete","state_checkpoint"]);function v(g,n={}){let a=n.spawnCmd!==void 0?n.spawnCmd:u();if(!a)throw new Error("assurance agent not found \u2014 your platform package may be missing; reinstall kane-cli (npm i -g @testmuai/kane-cli)");let f=g.source.images?.length??0;a.tier==="dev-python"&&f>0&&n.onWarn?.("warn: development agent in use \u2014 if image citations are missing, update the agent package");let t=h(a.cmd,a.args,{stdio:["pipe","pipe","pipe"],env:p(g.session_id,n.auth)});if(t.stdin.write(JSON.stringify(g)+`
2
+ import{c as u,d as p}from"./chunk-ZHB7V3NY.js";import{spawn as h}from"child_process";var k=new Set(["progress","ask_user","graph_query","ingest_request","proposal","design","error","done","reasoning_delta","reasoning_done","tool_activity","decision_activity","text_delta","usage","receipt","chat_ops","session_paused","session_complete","state_checkpoint"]);function v(g,n={}){let a=n.spawnCmd!==void 0?n.spawnCmd:u();if(!a)throw new Error("assurance agent not found \u2014 your platform package may be missing; reinstall kane-cli (npm i -g @testmuai/kane-cli)");let f=g.source.images?.length??0;a.tier==="dev-python"&&f>0&&n.onWarn?.("warn: development agent in use \u2014 if image citations are missing, update the agent package");let t=h(a.cmd,a.args,{stdio:["pipe","pipe","pipe"],env:p(g.session_id,n.auth)});if(t.stdin.write(JSON.stringify(g)+`
3
3
  `),n.onStderr){let e="";t.stderr.on("data",r=>{e+=r.toString("utf8");let i;for(;(i=e.indexOf(`
4
4
  `))>=0;){let o=e.slice(0,i);e=e.slice(i+1),o.trim()&&n.onStderr(o)}})}let d=new Promise(e=>{t.on("exit",(r,i)=>e({code:r,signal:i}))});async function*m(){let e="",r=!1;for await(let i of t.stdout){e+=i.toString("utf8");let o;for(;(o=e.indexOf(`
5
5
  `))>=0;){let l=e.slice(0,o).trim();if(e=e.slice(o+1),!l)continue;let c;try{c=JSON.parse(l)}catch{n.onWarn?.(`agent: skipping malformed line: ${l.slice(0,120)}`);continue}let s=c;if(!s||typeof s!="object"||!k.has(s.type)){n.onWarn?.(`agent: skipping unknown event type "${s&&typeof s=="object"?String(s.type??"?"):"?"}"`);continue}if(yield s,s.type==="done"){r=!0;break}}if(r)break}await d.catch(()=>{})}return{events:m(),send:e=>{t.stdin&&!t.stdin.destroyed&&t.stdin.write(JSON.stringify(e)+`
@@ -1,7 +1,7 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as k}from"./chunk-C5ZIKKIB.js";import{a as m}from"./chunk-BPMSNGXQ.js";import{p as a}from"./chunk-56PAQAX5.js";import{a as y}from"./chunk-HAGJA7KG.js";import{a as h}from"./chunk-76ILJPZF.js";var $=10,u=200,N=1e4,S=1e6;function T(t,e,r="streaming"){let n=r==="full-fetch"?S:N,o=$,i=0;if(t!==void 0){let s=Number(t);if(!Number.isInteger(s)||s<1||s>u)return{error:`--limit must be an integer in [1, ${u}] (got "${t}")`};o=s}if(e!==void 0){let s=Number(e);if(!Number.isInteger(s)||s<0||s>n)return{error:`--offset must be an integer in [0, ${n}] (got "${e}")`};i=s}return{limit:o,offset:i}}function C(t,e){if(!e)return t;let r=e.toLowerCase();return t.filter(n=>n.name.toLowerCase().includes(r))}function j(t,{limit:e,offset:r}){let n=t.slice(r,r+e),o=t.length>r+e;return{slice:n,hasMore:o}}function v(t,e,r=n=>process.stdout.write(`${n}
2
+ import{a as k}from"./chunk-IBPF5IM5.js";import{a as m}from"./chunk-BPMSNGXQ.js";import{r as a}from"./chunk-RSSOJ3L2.js";import{a as y}from"./chunk-H6KL3FSB.js";import{a as h}from"./chunk-6MJGCETZ.js";var $=10,u=200,N=1e4,S=1e6;function T(t,e,r="streaming"){let n=r==="full-fetch"?S:N,o=$,i=0;if(t!==void 0){let s=Number(t);if(!Number.isInteger(s)||s<1||s>u)return{error:`--limit must be an integer in [1, ${u}] (got "${t}")`};o=s}if(e!==void 0){let s=Number(e);if(!Number.isInteger(s)||s<0||s>n)return{error:`--offset must be an integer in [0, ${n}] (got "${e}")`};i=s}return{limit:o,offset:i}}function C(t,e){if(!e)return t;let r=e.toLowerCase();return t.filter(n=>n.name.toLowerCase().includes(r))}function j(t,{limit:e,offset:r}){let n=t.slice(r,r+e),o=t.length>r+e;return{slice:n,hasMore:o}}function v(t,e,r=n=>process.stdout.write(`${n}
3
3
  `)){for(let n of t)r(JSON.stringify(n));r(JSON.stringify({_meta:"page",limit:e.limit,offset:e.offset,returned:t.length,has_more:e.has_more}))}function b(t,e,r=n=>process.stdout.write(`${n}
4
- `)){if(t.length===0){r("(no results)");return}let n=Math.max(2,...t.map(s=>s.id.length)),o=`${"ID".padEnd(n)} NAME`;r(o),r(`${"-".repeat(n)} ----`);for(let s of t)r(`${s.id.padEnd(n)} ${s.name}`);r("");let i=e.offset+t.length;if(e.hasMore){let s=e.totalIsLowerBound?`${e.total}+`:`${e.total}`;r(`${i} of ${s} \u2014 next: --offset ${e.offset+e.limit}`)}else r(`${t.length} shown (${e.total} total)`)}async function B(t,e,r){if(r.username&&r.accessKey)return{ok:!0,creds:{username:r.username,access_key:r.accessKey}};let n=new h,o=n.loadBasicAuth(t,e);if(o)return{ok:!0,creds:{username:o.username,access_key:o.access_key}};let i=n.loadCredentials(t,e);if(!i)return{ok:!1,reason:"no_credentials"};let s=i.access_token;try{let{refreshOAuthToken:d}=await import("./token-refresh-ZTQFC3Q3.js"),w=await d({creds:n,profile:t,env:e,credentials:i});w&&(s=w.accessToken)}catch(d){return{ok:!1,reason:"refresh_failed",detail:d instanceof Error?d.message:String(d)}}let c=y(e),f=await new k(c.controllerBaseUrl,async()=>s,null).resolve();return f?{ok:!0,creds:{username:f.username,access_key:f.access_key}}:{ok:!1,reason:"exchange_failed"}}function E(t,e,r){switch(r.reason){case"no_credentials":return{message:`error: no credentials for profile "${t}" [${e}]. Run \`kane-cli login\` or pass --username/--access-key.
4
+ `)){if(t.length===0){r("(no results)");return}let n=Math.max(2,...t.map(s=>s.id.length)),o=`${"ID".padEnd(n)} NAME`;r(o),r(`${"-".repeat(n)} ----`);for(let s of t)r(`${s.id.padEnd(n)} ${s.name}`);r("");let i=e.offset+t.length;if(e.hasMore){let s=e.totalIsLowerBound?`${e.total}+`:`${e.total}`;r(`${i} of ${s} \u2014 next: --offset ${e.offset+e.limit}`)}else r(`${t.length} shown (${e.total} total)`)}async function B(t,e,r){if(r.username&&r.accessKey)return{ok:!0,creds:{username:r.username,access_key:r.accessKey}};let n=new h,o=n.loadBasicAuth(t,e);if(o)return{ok:!0,creds:{username:o.username,access_key:o.access_key}};let i=n.loadCredentials(t,e);if(!i)return{ok:!1,reason:"no_credentials"};let s=i.access_token;try{let{refreshOAuthToken:d}=await import("./token-refresh-ZFT457VI.js"),w=await d({creds:n,profile:t,env:e,credentials:i});w&&(s=w.accessToken)}catch(d){return{ok:!1,reason:"refresh_failed",detail:d instanceof Error?d.message:String(d)}}let c=y(e),f=await new k(c.controllerBaseUrl,async()=>s,null).resolve();return f?{ok:!0,creds:{username:f.username,access_key:f.access_key}}:{ok:!1,reason:"exchange_failed"}}function E(t,e,r){switch(r.reason){case"no_credentials":return{message:`error: no credentials for profile "${t}" [${e}]. Run \`kane-cli login\` or pass --username/--access-key.
5
5
  `,exitCode:2};case"refresh_failed":return{message:`error: OAuth token refresh failed for profile "${t}" [${e}]${r.detail?`: ${r.detail}`:""}. Run \`kane-cli login\` to re-auth.
6
6
  `,exitCode:2};case"exchange_failed":return{message:`error: TMS credential exchange failed for profile "${t}" [${e}]. Token may be revoked \u2014 try \`kane-cli login\`; if the problem persists, TMS may be down.
7
7
  `,exitCode:2}}}function O(t){return{id:t.project_id,name:t.name}}function M(t){return{id:t.id,name:t.name}}async function P(t,e,r,n){let o=r+n+1,i=[],s=!0;for await(let c of t.listProjectsStream({name:e})){if(i.push(...c.projects),c.done){s=!0;break}if(i.length>=o){s=!1;break}}return{items:i,doneStreaming:s}}function g(t){return!!t.agent||!process.stdin.isTTY||!process.stdout.isTTY}function _(t,e=r=>process.stdout.write(`${r}
@@ -0,0 +1,8 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{b as y}from"./chunk-VZ7KXRXB.js";import{c as h}from"./chunk-EYOCNMUM.js";import{dirname as $,isAbsolute as A,resolve as E}from"path";var i=class extends Error{constructor(r,o,e){super(`[${o}${e!=null?`:${e}`:""}] ${r}`);this.file=o;this.line=e;this.name="TestMdParseError"}},R=new Set(["username","access_key","oauth","profile","project_id","folder_id"]),_=new Set(["mode","max_steps","timeout","global_context","local_context","variables","session_context","code_export","code_language","url","target","chrome_profile","cdp_endpoint","ws_endpoint","headless","app","no_reset","os_version","device_name","on_lock_conflict","tags","assurance"]),v=new Set(["optional"]),L=new Set(["optional","variables"]),j=new Set(["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"]),O=new Set(["app","no_reset","os_version","device_name"]),T=new Set(["mode","on_lock_conflict","tags","assurance"]);function U(t,n){let r=n.split(`
3
+ `),{global:o,bodyStartLine:e}=C(t,r),{title:s,steps:a}=q(t,r,e);return{path:t,title:s,global:o,steps:a}}function C(t,n){if(n[0]?.trim()!=="---")return{global:{},bodyStartLine:0};let r=-1;for(let l=1;l<n.length;l++)if(n[l].trim()==="---"){r=l;break}if(r===-1)throw new i("frontmatter is missing closing '---'",t,1);let o=n.slice(1,r).join(`
4
+ `),e;try{e=y(o)??{}}catch(l){throw new i(`invalid YAML in frontmatter: ${l.message}`,t,1)}if(S(t,e,"frontmatter",1),e.on_lock_conflict!==void 0){let l=e.on_lock_conflict;if(l!=="readonly"&&l!=="fail"&&l!=="wait")throw new i(`on_lock_conflict must be 'readonly' | 'fail' | 'wait', got: ${JSON.stringify(l)}`,t,1)}if(k(t,e,1),e.assurance!==void 0){let l=e.assurance;if(l===null||typeof l!="object"||Array.isArray(l))throw new i("assurance must be a mapping with sub-keys {id, base}",t,1);let c=l;for(let d of Object.keys(c))if(d!=="id"&&d!=="base")throw new i(`unknown assurance sub-key '${d}' \u2014 the engine block allows only {id, base}`,t,1);if(typeof c.id!="string"||c.id.length===0)throw new i("assurance.id must be a non-empty string (logical id)",t,1);if(c.base!==void 0&&!(typeof c.base=="string"&&/^sha256:[0-9a-f]+$/.test(c.base)))throw new i("assurance.base must be a 'sha256:<hex>' string",t,1)}if(e.tags!==void 0){let l=e.tags,c=Array.isArray(l)?l.map(d=>String(d)).join(","):String(l);e.tags=P(c,t,1)}if(e.target!==void 0&&(e.target=K(e.target,t,1)),e.app!==void 0&&(e.app=B(e.app,t,1)),e.no_reset!==void 0&&typeof e.no_reset!="boolean")throw new i(`no_reset must be boolean: got ${typeof e.no_reset}`,t,1);if(e.os_version!==void 0&&typeof e.os_version!="string")if(typeof e.os_version=="number")e.os_version=String(e.os_version);else throw new i(`os_version must be a string: got ${typeof e.os_version}`,t,1);let s=e.target,a=s==="emulator"||s==="simulator";if(a&&e.app===void 0)throw new i(`target: ${String(s)} needs an app \u2014 add \`app: <path-to-build | AppId>\``,t,1);if(!a&&e.app!==void 0)throw new i("app requires a mobile target \u2014 add `target: emulator` or `target: simulator`",t,1);if(!a&&e.no_reset!==void 0)throw new i("no_reset requires a mobile target \u2014 add `target: emulator` or `target: simulator`",t,1);if(!a&&e.os_version!==void 0)throw new i("os_version requires a mobile target \u2014 add `target: emulator` or `target: simulator`",t,1);if(e.device_name!==void 0&&typeof e.device_name!="string")throw new i(`device_name must be a string: got ${typeof e.device_name}`,t,1);if(!a&&e.device_name!==void 0)throw new i("device_name requires a mobile target \u2014 add `target: emulator` or `target: simulator`",t,1);return{global:e,bodyStartLine:r+1}}function P(t,n,r){let e=t.trim().replace(/^\[/,"").replace(/\]$/,"").split(",").map(s=>s.trim().toLowerCase());if(e.length===0||e.some(s=>s.length===0))throw new i("tags must be a non-empty list of non-empty strings",n,r);return[...new Set(e)]}var Y=new Set(["chrome","cdp","ws","emulator","simulator"]),I="target must be one of 'chrome' | 'cdp' | 'ws' (web) or 'emulator' | 'simulator' (mobile, with a root `app:` key)";function K(t,n,r){if(typeof t=="string"&&Y.has(t))return t;throw t!==null&&typeof t=="object"&&!Array.isArray(t)?new i(`the mapping form of target is no longer accepted \u2014 write flat keys:
5
+ target: emulator | simulator
6
+ app: <path-to-build | AppId>`,n,r):new i(`${I} \u2014 got: ${JSON.stringify(t)}`,n,r)}function B(t,n,r){if(typeof t!="string"||t.trim().length===0)throw new i("app must be a build (e.g. ./builds/app-debug.apk) or an app id from your cloud uploads",n,r);let o=t.trim();if(!/\.(apk|zip)$/i.test(o)&&!/^APP\d{6,}$/.test(o))throw new i(`app '${o}' is not a build \u2014 expected a path ending in .apk or .zip, or an app id from your cloud uploads.`,n,r);return G(o,n)}function G(t,n){return/^APP[0-9A-Za-z_-]+$/.test(t)||A(t)?t:E($(n),t)}function W(t){let n=t.target;if(!(n!=="emulator"&&n!=="simulator"))return{platform:h(n)??"",app:t.app??"",...t.no_reset!==void 0?{no_reset:t.no_reset}:{}}}function Z(t){let n=t.target;return n==="chrome"||n==="cdp"||n==="ws"?n:void 0}var V=/\s@verifies\s+(ac-[\w.:\/-]+(?:\s*,\s*ac-[\w.:\/-]+)*)\s*$/;function M(t,n,r){let o=V.exec(n);if(o)return{label:n.slice(0,o.index).trim(),verifies:o[1].split(",").map(s=>s.trim())};let e=n.lastIndexOf("@verifies");if(e>0&&/\s/.test(n[e-1])){let s=n.slice(e+9).split(/[\s,]+/).filter(a=>a.length>0);if(s.length===0||s.every(a=>a.startsWith("ac-")))throw new i("malformed @verifies directive \u2014 expected '@verifies ac-<id>[, ac-<id>\u2026]' at the end of the heading",t,r)}return{label:n,verifies:[]}}function q(t,n,r){let o,e=r;for(;e<n.length&&n[e].trim()==="";)e++;let s=e<n.length?/^#\s+(.+?)\s*$/.exec(n[e]):null;s&&(o=s[1],e++);let a=[];for(let c=e;c<n.length;c++)/^##\s/.test(n[c])&&a.push(c);let l=[];for(let c=0;c<a.length;c++){let d=a[c],u=a[c+1]??n.length,p=n[d].replace(/^##\s+/,"").trim(),{label:w,verifies:f}=M(t,p,d+1),g=n.slice(d+1,u),{config:m,body:b,optional:x}=F(t,d+1,g);l.push({index:c+1,heading:w,verifies:f,config:m,body:b,headingLine:d+1,optional:x})}return{title:o,steps:l}}function F(t,n,r){let o=0;for(;o<r.length&&r[o].trim()==="";)o++;let e,s=n;if(o<r.length&&/^```yaml\s*$/.test(r[o])){let f=o;s=n+f,o++;let g=-1;for(;o<r.length;){if(/^```\s*$/.test(r[o])){g=o;break}o++}if(g===-1)throw new i("step-config fenced ```yaml block is not closed",t,s);let m=r.slice(f+1,g).join(`
7
+ `);try{e=y(m)??{}}catch(b){throw new i(`invalid YAML in step config: ${b.message}`,t,s)}o=g+1}let a=z(r.slice(o)),l=a.filter(f=>f.trim()!=="");if(l.length>0&&/^@session\s+/.test(l[0].trim()))throw new i("@session is no longer supported (iteration 3); use @import instead",t,n);let c=/^@import\s+(\S.*)$/,u=a.filter(f=>c.test(f.trim())).length>0;if(u&&l.length!==1)throw new i("step body must be exactly one of prose / @import",t,n);let p=!1,w;if(e){if(S(t,e,u?"step config (ref)":"step config (objective)",s),k(t,e,s),typeof e.optional=="boolean")p=e.optional;else if(e.optional!==void 0)throw new i(`step config 'optional' must be boolean: got ${typeof e.optional}`,t,s);let f={...e};delete f.optional,u&&delete f.variables,!u&&Object.keys(f).length>0&&(w=f)}if(u){let g=c.exec(l[0].trim())[1].trim(),m=e?.variables;return{body:{kind:"import_ref",path:g,...m&&Object.keys(m).length>0?{bindings:m}:{}},optional:p}}return{body:{kind:"objective",text:a.join(`
8
+ `).trim()},config:w,optional:p}}function z(t){let n=0,r=t.length;for(;n<r&&t[n].trim()==="";)n++;for(;r>n&&t[r-1].trim()==="";)r--;return t.slice(n,r)}function k(t,n,r){let o=n.variables;if(o==null)return;if(typeof o!="object"||Array.isArray(o))throw new i("variables must be an object map",t,r);let e={};for(let[s,a]of Object.entries(o))if(typeof a=="string")e[s]={value:a};else if(a&&typeof a=="object"&&!Array.isArray(a)&&typeof a.value=="string")e[s]=a;else throw new i(`variable '${s}' must be a string or { value: ... } object`,t,r);n.variables=e}function S(t,n,r,o){for(let e of Object.keys(n)){if(R.has(e))throw new i(`auth/identity keys are CLI-only: ${e}`,t,o);if(r==="frontmatter"){if(v.has(e))throw new i(`step-only key in frontmatter: ${e}`,t,o);if(!_.has(e))throw new i(`unknown config key: ${e}`,t,o)}else if(r==="step config (objective)"){if(!_.has(e)&&!v.has(e))throw new i(`unknown config key: ${e}`,t,o);if(j.has(e))throw new i(`chrome config is global-only: ${e}`,t,o);if(O.has(e))throw new i(`'${e}' is global-only: the whole run drives one app`,t,o);if(T.has(e))throw new i(`'${e}' is run-level and cannot be set per-step`,t,o)}else if(!L.has(e))throw new i(`step config on @import may only contain 'optional' / 'variables': got ${e}`,t,o)}}export{U as a,W as b,Z as c,V as d};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as c}from"./chunk-HAGJA7KG.js";import{a as n}from"./chunk-RZ4F3BHX.js";import{u as s,v as a}from"./chunk-N2N5T5JN.js";import{createHash as h,randomBytes as g}from"crypto";var l=class{authBaseUrl;consentUrl;constructor(t="prod"){let e=c(t);this.authBaseUrl=e.authBaseUrl,this.consentUrl=e.consentUrl}static generatePkce(){let t=g(96).toString("base64url").slice(0,128),e=h("sha256").update(t).digest("base64url");return[t,e]}buildAuthorizationUrl(t,e,r,o){let i=new URLSearchParams({response_type:"code",client_id:t,redirect_uri:o,scope:a,code_challenge:e,code_challenge_method:"S256",state:r});return`${this.consentUrl}/oauth2?${i.toString()}`}async registerClient(t){let e=await n(`${this.authBaseUrl}/oauth2/register`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_name:s,redirect_uris:[t],grant_types:["authorization_code"],response_types:["code"],client_type:"public",application_type:"native"})});if(!e.ok)throw new Error(`DCR failed: ${e.status} ${await e.text()}`);return e.json()}async exchangeCode(t,e,r,o){let i=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"authorization_code",code:t,redirect_uri:o,client_id:e,code_verifier:r})});if(!i.ok)throw new Error(`Token exchange failed: ${i.status}`);return i.json()}async refreshToken(t,e){let r=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:t,client_id:e})});if(!r.ok)throw new Error(`Token refresh failed: ${r.status}`);return r.json()}async revokeToken(t,e,r="access_token"){await n(`${this.authBaseUrl}/oauth2/revoke`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:t,token_type_hint:r,client_id:e})})}async validateToken(t){let e=new AbortController,r=setTimeout(()=>e.abort(),1e4);try{let o=await n(`${this.authBaseUrl}/api/user`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/json","Content-Type":"application/json"},signal:e.signal});return clearTimeout(r),o.ok}catch{return clearTimeout(r),!1}}};export{l as a};
2
+ import{a as c}from"./chunk-H6KL3FSB.js";import{a as n}from"./chunk-RZ4F3BHX.js";import{u as s,v as a}from"./chunk-DWHXXPDX.js";import{createHash as h,randomBytes as g}from"crypto";var l=class{authBaseUrl;consentUrl;constructor(t="prod"){let e=c(t);this.authBaseUrl=e.authBaseUrl,this.consentUrl=e.consentUrl}static generatePkce(){let t=g(96).toString("base64url").slice(0,128),e=h("sha256").update(t).digest("base64url");return[t,e]}buildAuthorizationUrl(t,e,r,o){let i=new URLSearchParams({response_type:"code",client_id:t,redirect_uri:o,scope:a,code_challenge:e,code_challenge_method:"S256",state:r});return`${this.consentUrl}/oauth2?${i.toString()}`}async registerClient(t){let e=await n(`${this.authBaseUrl}/oauth2/register`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_name:s,redirect_uris:[t],grant_types:["authorization_code"],response_types:["code"],client_type:"public",application_type:"native"})});if(!e.ok)throw new Error(`DCR failed: ${e.status} ${await e.text()}`);return e.json()}async exchangeCode(t,e,r,o){let i=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"authorization_code",code:t,redirect_uri:o,client_id:e,code_verifier:r})});if(!i.ok)throw new Error(`Token exchange failed: ${i.status}`);return i.json()}async refreshToken(t,e){let r=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:t,client_id:e})});if(!r.ok)throw new Error(`Token refresh failed: ${r.status}`);return r.json()}async revokeToken(t,e,r="access_token"){await n(`${this.authBaseUrl}/oauth2/revoke`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:t,token_type_hint:r,client_id:e})})}async validateToken(t){let e=new AbortController,r=setTimeout(()=>e.abort(),1e4);try{let o=await n(`${this.authBaseUrl}/api/user`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/json","Content-Type":"application/json"},signal:e.signal});return clearTimeout(r),o.ok}catch{return clearTimeout(r),!1}}};export{l as a};
@@ -1,4 +1,4 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{c as b,d as _}from"./chunk-NVGBE2DR.js";import{a as g,c as h}from"./chunk-CUM23TLF.js";import{j as S}from"./chunk-HLXOYLZV.js";import{d as f,f as v}from"./chunk-WXHQYYD5.js";var V=n=>`conv#turn=${n}`;function E(n,o){for(let t of n.split(`
2
+ import{c as b,d as _}from"./chunk-NVGBE2DR.js";import{a as g,c as h}from"./chunk-UH2ZTX4E.js";import{j as S}from"./chunk-XMTSHHYQ.js";import{d as f,f as v}from"./chunk-AKX4VRRR.js";var V=n=>`conv#turn=${n}`;function E(n,o){for(let t of n.split(`
3
3
  `))if(t.trim())try{let r=JSON.parse(t);if(r.turn===o)return r.text}catch{}return null}var y={format:"conversation",media_type:"text/x-conversation",anchors_supported:["#turn="]};function $(n){let{contextDir:o,graph:t,sessionStamp:r}=n,e=`su-conv-${r}`,u=t.heads.get(e);if(typeof u=="string")return{record:null,errors:[{code:"CONV_SOURCE_EXISTS",detail:`${e} already exists \u2014 resume it`}],sourceId:e,cid:u};let i=b(o,Buffer.from("","utf8")),c=h(e,i),a=v("source",c);if(a.length>0)return{record:null,errors:a.map(s=>({code:s.code,detail:s.detail})),sourceId:e,cid:""};let d=g("source",c);return{record:S(o,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:d,label:f.SOURCE,content:c}],edges:[],review:[],supersessions:[],source_head_moves:{[e]:d},media:{[e]:y},conv:{source_id:e,turn:0,append_of:null}},{expectPrev:t.latestHash}).record,errors:null,sourceId:e,cid:d}}function G(n){let{contextDir:o,graph:t,sourceId:r,text:e,force:u}=n,i=t.heads.get(r),c=t.convChains.get(r);if(typeof i!="string"||!c)return{record:null,errors:[{code:"CONV_SOURCE_MISSING",detail:`${r} is not a live conversation source`}]};let d=t.getNode(i)?.content?.blob;if(typeof d!="string")return{record:null,errors:[{code:"CONV_SOURCE_MISSING",detail:`${r} head node unreadable`}]};let l=_(o,d)?.toString("utf8")??"",s=c.turns;if(!u&&s>0&&E(l,s)===e)return{record:null,errors:null,turn:s,cid:i,idempotent:!0};let p=s+1,C=`${l}${JSON.stringify({turn:p,text:e})}
4
4
  `,O=b(o,Buffer.from(C,"utf8")),x=h(r,O),m=g("source",x);return{record:S(o,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:m,label:f.SOURCE,content:x}],edges:[],review:[],supersessions:[],source_head_moves:{[r]:m},media:{[r]:y},conv:{source_id:r,turn:p,append_of:i}},{expectPrev:t.latestHash}).record,errors:null,turn:p,cid:m,idempotent:!1}}export{V as a,E as b,$ as c,G as d};
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{d as ae,e as ce}from"./chunk-AXTPNZPX.js";import{a as oe}from"./chunk-L2TV4G56.js";import{b as V,d as se}from"./chunk-WNHLKDOT.js";import{d as ie}from"./chunk-NVGBE2DR.js";var pe=new Set(["approve","edit","reject"]),de=new Set(["approve","edit","reject","add","enhance","retract"]);function fe(i,t){return`chatop:${t}:${i.target??"new"}:${i.op}:${i.seq}`}function me(i,t,w,y){let l=fe(i,t),g=i.payload;switch(i.op){case"approve":return{kind:"approve",target:i.target,expectedCid:i.expected_cid,eventId:l};case"edit":{let{reason:s,...x}=g;return{kind:"edit",target:i.target,expectedCid:i.expected_cid,edit:x,reason:s,eventId:l}}case"enhance":return{kind:"enhance",target:i.target,expectedCid:i.expected_cid,edges:g.edges??[],eventId:l};case"retract":{let s=typeof g.reason=="string"?g.reason.trim():"";if(!s)throw new Error("INVALID_RETRACT: a retract needs a non-empty reason");let x=g.edge_ecid!==void 0&&g.edge_ecid!==null,a=g.edge!==void 0&&g.edge!==null;if(x&&a)throw new Error("INVALID_RETRACT: both edge_ecid and edge were sent \u2014 give exactly one");if(!x&&!a)throw new Error("INVALID_RETRACT: neither edge {type, dst, src?} (display refs) nor edge_ecid was sent \u2014 give exactly one");let f={kind:"retract",target:i.target,expectedCid:i.expected_cid,reason:s};if(x){if(typeof g.edge_ecid!="string"||!g.edge_ecid)throw new Error("INVALID_RETRACT: edge_ecid must be a non-empty string");return{...f,edgeEcid:g.edge_ecid,eventId:`chatop:${t}:${i.target}:retract:e:${g.edge_ecid}:${i.seq}`}}let p=g.edge;if(typeof p!="object"||typeof p.type!="string"||!p.type||typeof p.dst!="string"||!p.dst)throw new Error("INVALID_RETRACT: edge needs {type, dst} (src optional), all display refs");if(p.src!==void 0&&p.src!==null&&(typeof p.src!="string"||!p.src))throw new Error("INVALID_RETRACT: edge.src, when given, must be a non-empty display ref");let v=typeof p.src=="string"?p.src:void 0;return{...f,edgeRef:{type:p.type,dst:p.dst,...v!==void 0?{src:v}:{}},eventId:`chatop:${t}:${i.target}:retract:t:${p.type}:${p.dst}:${v??"-"}:${i.seq}`}}case"reject":return{kind:"reject",target:i.target,expectedCid:i.expected_cid,reason:g.reason??"",redirectTo:g.redirect_to,eventId:l};case"add":{let s=g.proposal_item??{},x=String(s.label??"");if(!w.mint_gate.includes(x))throw new Error(`GATED_LABEL: cannot mint "${x}" (gate: ${w.mint_gate.join(", ")})`);let a=s.cite??{},f=s.conv_source_id??y;if(!f||typeof a.turn!="number"||!a.quote)throw new Error("INVALID_ADD: a chat add requires a conversation cite {turn, quote} and conv_source_id");let p=s.content,v=p&&typeof p=="object"&&!Array.isArray(p)&&Object.keys(p).length>0?p:null,C=new Set(["label","cite","conv_source_id","content","rationale","edges"]),_=v??Object.fromEntries(Object.entries(s).filter(([$])=>!C.has($)));return{kind:"add",label:x,content:_,cite:{turn:a.turn,quote:a.quote},convSourceId:f,rationale:s.rationale,eventId:l}}}}function le(i,t,w={}){let y=w.turn??0,l=[],g=[];for(let a of i){if(!de.has(a.op))throw new Error(`UNKNOWN_OP: "${a.op}" is not a chat op (accepted: ${[...de].join(", ")})`);if(a.op!=="add"&&!a.target)throw new Error(`MISSING_TARGET: a ${a.op} op needs a target ref`)}for(let a of i)(a.op==="add"||a.op==="enhance"||a.op==="retract")&&g.push(a);let s=new Map;for(let a of i){if(!pe.has(a.op)||!a.target)continue;let f=s.get(a.target)??[];f.push(a),s.set(a.target,f)}for(let[a,f]of s){let p=Math.max(...f.map(C=>C.seq)),v=f.filter(C=>C.seq===p);if(v.length>1){l.push({target:a,seq:p,kinds:v.map(C=>C.op)});continue}g.push(v[0])}return{chatOps:g.sort((a,f)=>a.seq-f.seq).map(a=>me(a,y,t,w.convSourceId)),ambiguous:l}}function he(i){let t=[];return i.questions.forEach((w,y)=>{if(i.resolution[y])return;let l=w.recommended_index!=null?w.options[w.recommended_index]?.label:void 0;l!=null&&t.push(w.risk==="high"?`${l} \u203C`:l)}),t.length>3?`${t.slice(0,3).join(" \xB7 ")} \xB7 +${t.length-3} more`:t.join(" \xB7 ")}function ue(i){let t=i.text.replace(/\?+\s*$/,"");return t.length<=36?t:`${t.slice(0,33)}\u2026`}function ke(i){return i.use_cases??[]}var be={acs:"acceptance criteria",scenarios:"scenarios",exercises:"exercises",tests:"tests",gaps:"gaps"};function xe(i){let t=[],w=[],y=(s,x)=>{x.length!==0&&(w.push(s),t.push(...x))},l=s=>typeof s=="string"&&/^[a-z]{1,4}\d{1,4}$/i.test(s)?s:null,g=s=>{let x=l(s.automates)??"1 scenario",a=s.verifies??[],f=a.map(l).filter(C=>C!==null).slice(0,2),p=a.length-f.length,v=f.length?`${f.join(" ")}${p>0?` +${p}`:""}`:`${a.length} ACs`;return`covers ${x} \xB7 verifies ${v}`};return y("acs",(i.acs??[]).map(s=>({temp_ref:s.temp_ref,title:s.text,kind:"ac",badge:String(s.kind),extra:{...s.expected_answer?{expects:`${String(s.expected_answer.operator??"")} \xB7 ${String(s.expected_answer.operand??"")}`}:{},"scoped to":s.scoped_to??"(use-case)"}}))),y("scenarios",(i.scenarios??[]).map(s=>({temp_ref:s.temp_ref,title:s.title,kind:"scenario",badge:s.case_type,why:s.intent,depends_on_hint:s.depends_on??[],extra:{technique:s.technique_notes}}))),y("exercises",(i.exercises??[]).map(s=>({temp_ref:l(s.scenario)??"wiring",title:`${l(s.scenario)??"scenario"} exercises ${l(s.ac)??"1 AC"}`,kind:"exercise",badge:"wires",why:s.rationale}))),y("tests",(i.tests??[]).map(s=>({temp_ref:s.temp_ref,title:s.title,kind:"test",why:g(s),depends_on_hint:s.reuses??[],extra:{automates:String(s.automates??"?"),verifies:(s.verifies??[]).join(", "),check:s.check?`${String(s.check.kind)} vs ${String(s.check.verified_against)}`:"?"}}))),y("gaps",(i.gaps??[]).map(s=>({temp_ref:s.temp_ref??s.ref??"?",title:String(s.question?.header??s.kind),kind:"gap",badge:s.kind,why:s.risk_rationale}))),{items:t,heading:w.join(" + ")||"design"}}function Ae(i={}){let t={turns:[],thinking:ae(),pending:null,confirm:null,status:"idle",ledger:[],activeTurn:null,stream:null,checkpoint:!1},w=e=>{let n=[],r=e.minted.map(c=>c.slug).filter(Boolean);r.length&&n.push(`added ${r.join(", ")}`);let o=e.applied.length-e.minted.length;return o>0&&n.push(`${o} change${o===1?"":"s"} applied`),e.staleDelta.length&&n.push(`stales ${e.staleDelta.length}`),n.join(" \xB7 ")||"no changes"},y=[];i.onRender&&y.push(i.onRender);let l=0,g=0,s=null,x=null,a=null,f=[],p=0,v=e=>{if(!(!a||!i.contextDir||!e.trim()))try{let n=i.refreshGraph?.()??i.graph;if(!n)return;se({contextDir:i.contextDir,graph:n,sourceId:a,text:e,by:i.by??{kind:"human",id:"owner"}})}catch{}},C=e=>{if(!a||!i.contextDir)return;let n=i.refreshGraph?.()??i.graph,r=n?.heads.get(a),o=n?.convChains.get(a);if(!n||typeof r!="string"||!o)return;let c=n.getNode(r)?.content?.blob,d=typeof c=="string"?ie(i.contextDir,c)?.toString("utf8")??"":"";if(d)for(let b of e){if(b.kind!=="add"||b.convSourceId!==a)continue;let F=V(d,b.cite.turn);if(!(F!==null&&F.includes(b.cite.quote)))for(let R=o.turns;R>=1;R--){let G=V(d,R);if(G!==null&&G.includes(b.cite.quote)){b.cite={...b.cite,turn:R};break}}}},_={startedAt:null,thinkMs:0,toolCalls:0,tools:new Map},$=()=>{_.startedAt??=Date.now()},A=()=>{if(_.toolCalls>0){let e=_.startedAt!=null?Math.max(1,Math.round((Date.now()-_.startedAt)/1e3)):Math.max(1,Math.round(_.thinkMs/1e3));m({kind:"worked",durS:e,toolCalls:_.toolCalls,tools:[..._.tools.entries()].map(([n,r])=>({name:n,n:r}))})}_.startedAt=null,_.thinkMs=0,_.toolCalls=0,_.tools.clear()},E=null,U=new Map,K=e=>JSON.stringify([e.id,e.text,e.options.map(n=>n.label)]),O=null,J=new Map,z=new Map,Y=null,h=()=>{q&&(clearTimeout(q),q=null);for(let e of y)e()},q=null,X=()=>{q||(q=setTimeout(()=>{q=null;for(let e of y)e()},80))},Q=0,m=e=>{e.kind==="childClose"&&Q>0&&(Q-=1),Q>0&&e.kind!=="childOpen"&&e.kind!=="childBack"&&(e.era=Q),e.kind==="childOpen"&&(Q+=1),t.ledger.push(e)},j=null,B=!1,N=(e=!1)=>{j?m({kind:"agent",text:j}):e&&B&&m({kind:"note",text:'chat to refine ("looks good" approves; /done finishes)'}),j=null,B=!1},ge=()=>{j=null,B=!1},L=null,H=e=>{if(L){if(e)for(let n of L.items){let r=e.get(n.temp_ref);r&&(n.logical_id=r)}m({kind:"turn",...L}),L=null}},T=()=>{H(),t.activeTurn&&(t.activeTurn=null)},Z=(e,n)=>n.choice||(n.selected_index!=null?e.options[n.selected_index]?.label??"?":"?"),P=()=>{let e=t.pending;if(!e)return;if(!e.resolution.every(Boolean)){e.cursor=e.resolution.findIndex(o=>o===null);return}let n=e.questions.map((o,c)=>{let d=e.resolution[c];return d.form==="deferred"?{id:o.id,selected_index:null,free_text:null}:{id:o.id,selected_index:d.selected_index,free_text:d.free_text}});t.pending=null,t.status=t.status==="pausing"?"pausing":"streaming",t.status==="streaming"&&(t.busySince=Date.now());let r=E;E=null,r?.(n)},D=(e,n)=>{let r=t.pending,o=r.questions[e],c=r.resolution[e];r.resolution[e]=n;let d=ue(o);c?m({kind:"answer",receipt:{form:"changed",qNum:e+1,stub:d,choice:Z(o,n),prev:c.choice}}):n.form==="deferred"?m({kind:"answer",receipt:{form:"deferred",qNum:e+1,stub:d}}):m({kind:"answer",receipt:{form:n.form,qNum:e+1,stub:d,choice:Z(o,n)}})},ee=()=>{let e=t.pending;e&&(e.questions.forEach((n,r)=>{e.resolution[r]||D(r,{form:"deferred",selected_index:null,free_text:null,choice:""})}),P())},W=new Map,te=e=>{W.clear();let n={high:0,med:1,low:2};return e=e.map((r,o)=>({q:r,i:o})).sort((r,o)=>(n[r.q.risk]??3)-(n[o.q.risk]??3)||r.i-o.i).map(({q:r})=>r),{questions:e,cursor:0,resolution:e.map(()=>null)}};return{state:t,explainLines(e){if(!i.explain||!i.graph||i.contextDir===void 0)return null;let n=i.explain(i.contextDir,i.graph,e);return n.target?[`${n.target.label} ${n.target.slug??n.target.cid.slice(0,19)}:`,...n.entries.map(r=>` [${r.kind}] ${r.rationale??r.detail}`)]:null},explainRef(e){if(!i.explain||!i.graph||i.contextDir===void 0){m({kind:"note",text:"explain isn't available here"}),h();return}let n=i.explain(i.contextDir,i.graph,e),r=n.target?[`${n.target.label} ${n.target.slug??n.target.cid.slice(0,19)}:`,...n.entries.map(o=>` [${o.kind}] ${o.rationale??o.detail}`)].join(`
2
+ import{d as ae,e as ce}from"./chunk-AXTPNZPX.js";import{a as oe}from"./chunk-L2TV4G56.js";import{b as V,d as se}from"./chunk-IVQX3AKL.js";import{d as ie}from"./chunk-NVGBE2DR.js";var pe=new Set(["approve","edit","reject"]),de=new Set(["approve","edit","reject","add","enhance","retract"]);function fe(i,t){return`chatop:${t}:${i.target??"new"}:${i.op}:${i.seq}`}function me(i,t,w,y){let l=fe(i,t),g=i.payload;switch(i.op){case"approve":return{kind:"approve",target:i.target,expectedCid:i.expected_cid,eventId:l};case"edit":{let{reason:s,...x}=g;return{kind:"edit",target:i.target,expectedCid:i.expected_cid,edit:x,reason:s,eventId:l}}case"enhance":return{kind:"enhance",target:i.target,expectedCid:i.expected_cid,edges:g.edges??[],eventId:l};case"retract":{let s=typeof g.reason=="string"?g.reason.trim():"";if(!s)throw new Error("INVALID_RETRACT: a retract needs a non-empty reason");let x=g.edge_ecid!==void 0&&g.edge_ecid!==null,a=g.edge!==void 0&&g.edge!==null;if(x&&a)throw new Error("INVALID_RETRACT: both edge_ecid and edge were sent \u2014 give exactly one");if(!x&&!a)throw new Error("INVALID_RETRACT: neither edge {type, dst, src?} (display refs) nor edge_ecid was sent \u2014 give exactly one");let f={kind:"retract",target:i.target,expectedCid:i.expected_cid,reason:s};if(x){if(typeof g.edge_ecid!="string"||!g.edge_ecid)throw new Error("INVALID_RETRACT: edge_ecid must be a non-empty string");return{...f,edgeEcid:g.edge_ecid,eventId:`chatop:${t}:${i.target}:retract:e:${g.edge_ecid}:${i.seq}`}}let p=g.edge;if(typeof p!="object"||typeof p.type!="string"||!p.type||typeof p.dst!="string"||!p.dst)throw new Error("INVALID_RETRACT: edge needs {type, dst} (src optional), all display refs");if(p.src!==void 0&&p.src!==null&&(typeof p.src!="string"||!p.src))throw new Error("INVALID_RETRACT: edge.src, when given, must be a non-empty display ref");let v=typeof p.src=="string"?p.src:void 0;return{...f,edgeRef:{type:p.type,dst:p.dst,...v!==void 0?{src:v}:{}},eventId:`chatop:${t}:${i.target}:retract:t:${p.type}:${p.dst}:${v??"-"}:${i.seq}`}}case"reject":return{kind:"reject",target:i.target,expectedCid:i.expected_cid,reason:g.reason??"",redirectTo:g.redirect_to,eventId:l};case"add":{let s=g.proposal_item??{},x=String(s.label??"");if(!w.mint_gate.includes(x))throw new Error(`GATED_LABEL: cannot mint "${x}" (gate: ${w.mint_gate.join(", ")})`);let a=s.cite??{},f=s.conv_source_id??y;if(!f||typeof a.turn!="number"||!a.quote)throw new Error("INVALID_ADD: a chat add requires a conversation cite {turn, quote} and conv_source_id");let p=s.content,v=p&&typeof p=="object"&&!Array.isArray(p)&&Object.keys(p).length>0?p:null,C=new Set(["label","cite","conv_source_id","content","rationale","edges"]),_=v??Object.fromEntries(Object.entries(s).filter(([$])=>!C.has($)));return{kind:"add",label:x,content:_,cite:{turn:a.turn,quote:a.quote},convSourceId:f,rationale:s.rationale,eventId:l}}}}function le(i,t,w={}){let y=w.turn??0,l=[],g=[];for(let a of i){if(!de.has(a.op))throw new Error(`UNKNOWN_OP: "${a.op}" is not a chat op (accepted: ${[...de].join(", ")})`);if(a.op!=="add"&&!a.target)throw new Error(`MISSING_TARGET: a ${a.op} op needs a target ref`)}for(let a of i)(a.op==="add"||a.op==="enhance"||a.op==="retract")&&g.push(a);let s=new Map;for(let a of i){if(!pe.has(a.op)||!a.target)continue;let f=s.get(a.target)??[];f.push(a),s.set(a.target,f)}for(let[a,f]of s){let p=Math.max(...f.map(C=>C.seq)),v=f.filter(C=>C.seq===p);if(v.length>1){l.push({target:a,seq:p,kinds:v.map(C=>C.op)});continue}g.push(v[0])}return{chatOps:g.sort((a,f)=>a.seq-f.seq).map(a=>me(a,y,t,w.convSourceId)),ambiguous:l}}function he(i){let t=[];return i.questions.forEach((w,y)=>{if(i.resolution[y])return;let l=w.recommended_index!=null?w.options[w.recommended_index]?.label:void 0;l!=null&&t.push(w.risk==="high"?`${l} \u203C`:l)}),t.length>3?`${t.slice(0,3).join(" \xB7 ")} \xB7 +${t.length-3} more`:t.join(" \xB7 ")}function ue(i){let t=i.text.replace(/\?+\s*$/,"");return t.length<=36?t:`${t.slice(0,33)}\u2026`}function ke(i){return i.use_cases??[]}var be={acs:"acceptance criteria",scenarios:"scenarios",exercises:"exercises",tests:"tests",gaps:"gaps"};function xe(i){let t=[],w=[],y=(s,x)=>{x.length!==0&&(w.push(s),t.push(...x))},l=s=>typeof s=="string"&&/^[a-z]{1,4}\d{1,4}$/i.test(s)?s:null,g=s=>{let x=l(s.automates)??"1 scenario",a=s.verifies??[],f=a.map(l).filter(C=>C!==null).slice(0,2),p=a.length-f.length,v=f.length?`${f.join(" ")}${p>0?` +${p}`:""}`:`${a.length} ACs`;return`covers ${x} \xB7 verifies ${v}`};return y("acs",(i.acs??[]).map(s=>({temp_ref:s.temp_ref,title:s.text,kind:"ac",badge:String(s.kind),extra:{...s.expected_answer?{expects:`${String(s.expected_answer.operator??"")} \xB7 ${String(s.expected_answer.operand??"")}`}:{},"scoped to":s.scoped_to??"(use-case)"}}))),y("scenarios",(i.scenarios??[]).map(s=>({temp_ref:s.temp_ref,title:s.title,kind:"scenario",badge:s.case_type,why:s.intent,depends_on_hint:s.depends_on??[],extra:{technique:s.technique_notes}}))),y("exercises",(i.exercises??[]).map(s=>({temp_ref:l(s.scenario)??"wiring",title:`${l(s.scenario)??"scenario"} exercises ${l(s.ac)??"1 AC"}`,kind:"exercise",badge:"wires",why:s.rationale}))),y("tests",(i.tests??[]).map(s=>({temp_ref:s.temp_ref,title:s.title,kind:"test",why:g(s),depends_on_hint:s.reuses??[],extra:{automates:String(s.automates??"?"),verifies:(s.verifies??[]).join(", "),check:s.check?`${String(s.check.kind)} vs ${String(s.check.verified_against)}`:"?"}}))),y("gaps",(i.gaps??[]).map(s=>({temp_ref:s.temp_ref??s.ref??"?",title:String(s.question?.header??s.kind),kind:"gap",badge:s.kind,why:s.risk_rationale}))),{items:t,heading:w.join(" + ")||"design"}}function Ae(i={}){let t={turns:[],thinking:ae(),pending:null,confirm:null,status:"idle",ledger:[],activeTurn:null,stream:null,checkpoint:!1},w=e=>{let n=[],r=e.minted.map(c=>c.slug).filter(Boolean);r.length&&n.push(`added ${r.join(", ")}`);let o=e.applied.length-e.minted.length;return o>0&&n.push(`${o} change${o===1?"":"s"} applied`),e.staleDelta.length&&n.push(`stales ${e.staleDelta.length}`),n.join(" \xB7 ")||"no changes"},y=[];i.onRender&&y.push(i.onRender);let l=0,g=0,s=null,x=null,a=null,f=[],p=0,v=e=>{if(!(!a||!i.contextDir||!e.trim()))try{let n=i.refreshGraph?.()??i.graph;if(!n)return;se({contextDir:i.contextDir,graph:n,sourceId:a,text:e,by:i.by??{kind:"human",id:"owner"}})}catch{}},C=e=>{if(!a||!i.contextDir)return;let n=i.refreshGraph?.()??i.graph,r=n?.heads.get(a),o=n?.convChains.get(a);if(!n||typeof r!="string"||!o)return;let c=n.getNode(r)?.content?.blob,d=typeof c=="string"?ie(i.contextDir,c)?.toString("utf8")??"":"";if(d)for(let b of e){if(b.kind!=="add"||b.convSourceId!==a)continue;let F=V(d,b.cite.turn);if(!(F!==null&&F.includes(b.cite.quote)))for(let R=o.turns;R>=1;R--){let G=V(d,R);if(G!==null&&G.includes(b.cite.quote)){b.cite={...b.cite,turn:R};break}}}},_={startedAt:null,thinkMs:0,toolCalls:0,tools:new Map},$=()=>{_.startedAt??=Date.now()},A=()=>{if(_.toolCalls>0){let e=_.startedAt!=null?Math.max(1,Math.round((Date.now()-_.startedAt)/1e3)):Math.max(1,Math.round(_.thinkMs/1e3));m({kind:"worked",durS:e,toolCalls:_.toolCalls,tools:[..._.tools.entries()].map(([n,r])=>({name:n,n:r}))})}_.startedAt=null,_.thinkMs=0,_.toolCalls=0,_.tools.clear()},E=null,U=new Map,K=e=>JSON.stringify([e.id,e.text,e.options.map(n=>n.label)]),O=null,J=new Map,z=new Map,Y=null,h=()=>{q&&(clearTimeout(q),q=null);for(let e of y)e()},q=null,X=()=>{q||(q=setTimeout(()=>{q=null;for(let e of y)e()},80))},Q=0,m=e=>{e.kind==="childClose"&&Q>0&&(Q-=1),Q>0&&e.kind!=="childOpen"&&e.kind!=="childBack"&&(e.era=Q),e.kind==="childOpen"&&(Q+=1),t.ledger.push(e)},j=null,B=!1,N=(e=!1)=>{j?m({kind:"agent",text:j}):e&&B&&m({kind:"note",text:'chat to refine ("looks good" approves; /done finishes)'}),j=null,B=!1},ge=()=>{j=null,B=!1},L=null,H=e=>{if(L){if(e)for(let n of L.items){let r=e.get(n.temp_ref);r&&(n.logical_id=r)}m({kind:"turn",...L}),L=null}},T=()=>{H(),t.activeTurn&&(t.activeTurn=null)},Z=(e,n)=>n.choice||(n.selected_index!=null?e.options[n.selected_index]?.label??"?":"?"),P=()=>{let e=t.pending;if(!e)return;if(!e.resolution.every(Boolean)){e.cursor=e.resolution.findIndex(o=>o===null);return}let n=e.questions.map((o,c)=>{let d=e.resolution[c];return d.form==="deferred"?{id:o.id,selected_index:null,free_text:null}:{id:o.id,selected_index:d.selected_index,free_text:d.free_text}});t.pending=null,t.status=t.status==="pausing"?"pausing":"streaming",t.status==="streaming"&&(t.busySince=Date.now());let r=E;E=null,r?.(n)},D=(e,n)=>{let r=t.pending,o=r.questions[e],c=r.resolution[e];r.resolution[e]=n;let d=ue(o);c?m({kind:"answer",receipt:{form:"changed",qNum:e+1,stub:d,choice:Z(o,n),prev:c.choice}}):n.form==="deferred"?m({kind:"answer",receipt:{form:"deferred",qNum:e+1,stub:d}}):m({kind:"answer",receipt:{form:n.form,qNum:e+1,stub:d,choice:Z(o,n)}})},ee=()=>{let e=t.pending;e&&(e.questions.forEach((n,r)=>{e.resolution[r]||D(r,{form:"deferred",selected_index:null,free_text:null,choice:""})}),P())},W=new Map,te=e=>{W.clear();let n={high:0,med:1,low:2};return e=e.map((r,o)=>({q:r,i:o})).sort((r,o)=>(n[r.q.risk]??3)-(n[o.q.risk]??3)||r.i-o.i).map(({q:r})=>r),{questions:e,cursor:0,resolution:e.map(()=>null)}};return{state:t,explainLines(e){if(!i.explain||!i.graph||i.contextDir===void 0)return null;let n=i.explain(i.contextDir,i.graph,e);return n.target?[`${n.target.label} ${n.target.slug??n.target.cid.slice(0,19)}:`,...n.entries.map(r=>` [${r.kind}] ${r.rationale??r.detail}`)]:null},explainRef(e){if(!i.explain||!i.graph||i.contextDir===void 0){m({kind:"note",text:"explain isn't available here"}),h();return}let n=i.explain(i.contextDir,i.graph,e),r=n.target?[`${n.target.label} ${n.target.slug??n.target.cid.slice(0,19)}:`,...n.entries.map(o=>` [${o.kind}] ${o.rationale??o.detail}`)].join(`
3
3
  `):`unknown ref: ${e}`;m({kind:"note",text:r}),h()},subscribe(e){return y.push(e),()=>{let n=y.indexOf(e);n>=0&&y.splice(n,1)}},submit(e){if(t.confirm&&(t.confirm=null),!t.pending){if(!s){t.turns.push({role:"user",text:e}),m({kind:"user",text:e}),t.notice="the agent isn't running \u2014 nothing sent",h();return}for(t.notice=void 0,t.checkpoint=!1,N(),t.turns.push({role:"user",text:e}),m({kind:"user",text:e}),v(e),t.status="streaming",t.busySince=Date.now(),$(),t.error=void 0,g+=1;f.length>0;)g+=1,s({type:"user_message",message_id:`u${g}-receipt`,text:f.shift()});s({type:"user_message",message_id:`u${g}`,text:e}),h()}},attachSender(e){let n=s;return s=e,()=>{s=n}},attachOnCommitted(e){x=e},attachConversationSource(e){a=e},attachSession(e){i.session=e},holdReceipt(e){f.push(e),t.checkpoint=!0,h()},drainHeldReceipts(){return f.splice(0,f.length)},peekHeldReceipts(){return[...f]},submitAnswer(e,n){let r=t.pending,o=r?.questions[e],c=o?.options[n]?.label;!r||!o||c==null||(D(e,{form:"answered",selected_index:n,free_text:null,choice:c}),P(),h())},submitFreeText(e,n){let r=t.pending,o=r?.questions[e],c=n.trim();!r||!o||!c||(D(e,{form:"answered",selected_index:null,free_text:c,choice:c}),P(),h())},deferBatch(e){let n=t.pending;if(!n||!E)return;n.questions.forEach((o,c)=>{let d=n.resolution[c];d&&d.form==="answered"&&U.set(K(o),d)}),t.pending=null,t.status=t.status==="pausing"?"pausing":"streaming",t.status==="streaming"&&(t.busySince=Date.now()),m({kind:"note",text:`questions set aside \u2014 source ${e.source_id} landed; the agent reads it next`});let r=E;E=null,r({deferred:!0,ingested:e}),h()},submitAnswerWithText(e,n,r){let o=t.pending,c=o?.questions[e],d=c?.options[n]?.label;if(!o||!c||d==null)return;let b=r.trim();D(e,{form:"answered",selected_index:n,free_text:b||null,choice:b?`${d} \u2014 ${b}`:d}),P(),h()},toggleOption(e,n){let r=t.pending?.questions[e];if(!r||r.options[n]==null)return;let o=W.get(e)??new Set;o.has(n)?o.delete(n):o.add(n),W.set(e,o),h()},multiSelection(e){return[...W.get(e)??[]].sort((n,r)=>n-r)},confirmMulti(e){let n=t.pending,r=n?.questions[e];if(!n||!r)return;let o=[...W.get(e)??[]].sort((d,b)=>d-b).map(d=>r.options[d]?.label).filter(d=>d!=null);if(o.length===0)return;W.delete(e);let c=o.join(", ");D(e,{form:"answered",selected_index:null,free_text:c,choice:c}),P(),h()},goWithRecommendations(){let e=t.pending;if(!e)return{picks:""};let n=he(e),r=null;return e.questions.forEach((o,c)=>{if(e.resolution[c])return;let d=o.recommended_index,b=d!=null?o.options[d]?.label:void 0;if(b==null){r===null&&(r=c);return}D(c,{form:"assumed",selected_index:d,free_text:null,choice:b})}),r!==null?(e.cursor=r,h(),{blocked:r}):(P(),h(),{picks:n})},reopenQuestion(){let e=t.pending;if(!e)return;let n=e.cursor<0?e.questions.length:e.cursor;for(let r=n-1;r>=0;r--)if(e.resolution[r]){e.cursor=r,h();return}},continueParked(){if(s){for(t.checkpoint=!1,m({kind:"continued"});f.length>0;)g+=1,s({type:"user_message",message_id:`u${g}-receipt`,text:f.shift()});g+=1,s({type:"user_message",message_id:`u${g}`,text:"continue"}),t.status="streaming",t.busySince=Date.now(),$(),h()}},note(e){m({kind:"note",text:e}),h()},finalizeForExit(){T(),A(),N(),t.stream=null,h()},aliasOf(e){return z.get(e)},registerAliases(e){for(let n of e)z.set(n.ref,n.cid);H(new Map(e.filter(n=>n.id).map(n=>[n.ref,n.id]))),h()},setWorking(e){if(e!=null){if(t.status!=="idle"&&t.status!=="working")return;t.status==="idle"&&(t.busySince=Date.now()),$(),t.status="working",t.workingLabel=e}else{if(t.status!=="working")return;t.status="idle",t.workingLabel=void 0,t.busySince=void 0}h()},ledger(e){e.kind==="commit"&&H(),e.kind==="error"&&(T(),A(),N()),m(e),e.kind==="commit"&&(e.ok?N(!0):ge()),h()},senderAlive(){return s!=null},completeSession(){ee(),s?.({type:"session_complete"}),t.status="idle",t.busySince=void 0,h()},requestPause(){ee(),t.status="pausing",t.busySince=void 0;let e=s;Promise.resolve().then(()=>e?.({type:"pause"})),h()},ask(e){t.pending=te(e),J=new Map(e.map((r,o)=>[r.id,o+1])),t.status="awaiting-input",t.busySince=void 0;let n=new Promise(r=>{E=r});if(U.size>0){let r=0;e.forEach((o,c)=>{let d=K(o),b=U.get(d);b&&(U.delete(d),D(c,{...b}),r+=1)}),r>0&&m({kind:"note",text:`your earlier answer${r>1?"s are":" is"} pre-filled \u2014 press enter to send, or pick a different answer`})}return h(),n},attachIngest(e){let n=O;return O=e,()=>{O===e&&(O=n)}},canIngest(){return O!==null},async ingestAttach(e){let n=O,r=e.trim();if(!n||!r)return;let o;try{o=await n(r)}catch(c){o={ok:!1,error:c instanceof Error?c.message:String(c)}}o.ok||(m({kind:"note",text:o.error??"the source could not be ingested"}),h())},noteCoercion(e,n){m({kind:"answer",receipt:{form:"assumed",qNum:J.get(e.id)??0,stub:ue(e),choice:n,note:"your typed answer couldn't be used here"}}),h()},onAgentEvent(e){switch(e.type){case"reasoning_delta":case"reasoning_done":case"tool_activity":case"decision_activity":{let n=t.thinking;if(t.thinking=ce(n,e),t.thinking!==n&&(e.type==="reasoning_done"&&e.present?($(),_.thinkMs+=e.took_ms):e.type==="tool_activity"&&e.status!=="started"&&($(),_.toolCalls+=1,_.tools.set(e.name,(_.tools.get(e.name)??0)+1))),e.type==="reasoning_delta"){X();return}break}case"usage":t.credits={turn:e.credits,total:e.total_credits};break;case"text_delta":{let n=Y;if(n&&(e.turn_id<n.turn_id||e.turn_id===n.turn_id&&e.attempt<n.attempt))return;(!n||n.turn_id!==e.turn_id||n.attempt!==e.attempt)&&(Y={turn_id:e.turn_id,attempt:e.attempt},t.stream={text:""}),t.stream={text:(t.stream?.text??"")+e.text},X();return}case"progress":break;case"proposal":{l+=1,T(),t.stream=null,t.busySince=void 0,A();let n=ke(e.proposal),r=i.dedupFlags?.(e.proposal);if(r)for(let o of n){let c=r.get(o.temp_ref);c&&(o.matches_existing=c)}t.turns.push({role:"agent",turnIndex:l,items:n,text:e.narrative}),j=e.narrative??null,B=!0,t.activeTurn={turnIndex:l,heading:"use-cases",items:n},L={turnIndex:l,heading:"use-cases",items:n},(t.status==="streaming"||t.status==="working")&&(t.status="idle"),t.workingLabel=void 0;break}case"design":{l+=1,T(),t.stream=null,t.busySince=void 0,A();let{items:n,heading:r}=xe(e.design),o=e.design.phase==="wiring"?"acceptance criteria + exercises":r.split(" + ").map(c=>be[c]??c).join(" + ");m({kind:"banner",text:`designing: ${o}`}),t.turns.push({role:"agent",turnIndex:l,items:n,itemsHeading:r,text:e.narrative}),j=e.narrative??null,B=!0,t.activeTurn={turnIndex:l,heading:r,items:n},L={turnIndex:l,heading:r,items:n},(t.status==="streaming"||t.status==="working")&&(t.status="idle"),t.workingLabel=void 0;break}case"ask_user":A(),t.pending=te(e.questions),t.status="awaiting-input",t.busySince=void 0;break;case"chat_ops":{l+=1,T(),A(),t.stream=null,(t.status==="streaming"||t.status==="working")&&(t.status="idle",t.busySince=void 0,t.workingLabel=void 0);let n=e.chat_ops??e,r=Array.isArray(n.ops)?n.ops:[],o=n.text??e.text??"",c=i.refreshGraph?.()??i.graph,d=u=>z.get(u)??u,b=r.map(u=>{if(!u.target)return u;let k=d(u.target),S=u.expected_cid;if(S==null&&c){let re=c.resolve(k);re&&(S=c.tipOf(re.cid))}let I=u.payload?.redirect_to,M=I&&d(I);return k===u.target&&S===u.expected_cid&&M===I?u:{...u,target:k,expected_cid:S,...M!==I?{payload:{...u.payload,redirect_to:M}}:{}}}),F;try{if(!Array.isArray(n.ops))throw new Error("the agent sent an unreadable change set (no ops array) \u2014 say it again in different words");F=le(b,i.descriptor??{mint_gate:[]},{turn:l,...a?{convSourceId:a}:{}})}catch(u){t.error=u instanceof Error?u.message:String(u),t.turns.push({role:"agent",turnIndex:l,text:o,narration:t.error}),o&&m({kind:"agent",text:o}),m({kind:"error",title:t.error,detail:[]}),f.push(`OPS REJECTED (did not compile) \u2014 nothing landed; do not assume any of your last ops applied.
4
4
  - `+t.error);break}let{chatOps:R,ambiguous:G}=F;if(G.length>0){let u=G[0];t.confirm={kind:"ambiguity-confirm",prompt:`did you mean edit or ${u.kinds.filter(k=>k!=="edit").join("/")} on ${u.target}?`},t.turns.push({role:"agent",turnIndex:l,text:o}),o&&m({kind:"agent",text:o});break}if(C(R),i.commitChatTurn&&R.length>0){let u;try{u=i.commitChatTurn({contextDir:i.contextDir??"",graph:i.refreshGraph?.()??i.graph,ops:R,by:i.by??{kind:"human",id:"owner"},...i.descriptor?.mint_gate?{mintable:i.descriptor.mint_gate}:{},...i.session?.state?.sid?{sid:i.session.state.sid}:{}})}catch(k){u={record:null,errors:[{code:"COMMIT_THREW",detail:k instanceof Error?k.message:String(k)}]}}if(u.errors)t.error=u.errors.map(k=>k.detail).join("; "),t.turns.push({role:"agent",turnIndex:l,text:o}),m({kind:"commit",ok:!1,line:"commit failed \u2014 nothing landed",warnings:u.errors.map(k=>`${k.code}: ${k.detail}`)}),f.push(["COMMIT FAILED (chat turn) \u2014 nothing landed; do not assume any of your last ops applied.",...u.errors.map(k=>`- ${k.code}: ${k.detail}`),...u.errors.some(k=>k.code==="UNKNOWN_FIELD")?["If you were changing citations or matched-existing content, that is proposal territory (approve/re-propose) \u2014 a chat edit can only replace a node's own schema fields."]:[]].join(`
5
5
  `)),o&&m({kind:"agent",text:o});else{u.applied.length>0&&i.session?.markApplied(u.applied);let k=w(u);t.turns.push({role:"agent",turnIndex:l,text:o,narration:k}),m({kind:"commit",ok:!0,line:k});let S=i.refreshGraph?.();if(S&&x&&x(S),S)try{p+=1;let ne=i.descriptor?.mint_gate?.includes("usecase")?"extract":"design",I=oe({verb:ne,commitN:p,phase:"chat",committed:u.minted.map(M=>({cid:M.cid,...M.slug?{logical_id:M.slug}:{}}))},S);f.push(I.text)}catch{}o&&m({kind:"agent",text:o})}}else t.turns.push({role:"agent",turnIndex:l,text:o}),o&&m({kind:"agent",text:o});v(o);break}case"done":case"session_complete":T(),A(),N(),t.status="idle",t.busySince=void 0,s=null;break;case"error":T(),A(),N(),t.stream=null,t.status="idle",t.busySince=void 0,t.error=e.message,s=null,m({kind:"error",title:e.message,detail:[]});break;case"session_paused":break;default:break}h()}}}export{he as a,ue as b,Ae as c};
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as $}from"./chunk-QQ67Z4IW.js";import{f as D}from"./chunk-3IM5QGVV.js";import{a as E}from"./chunk-NLCCBXXV.js";function U(e){return["completed","failed","ended","stopped"].includes(e.trim().toLowerCase())}function je(e){return["ended","stopped"].includes(e.trim().toLowerCase())}function q(e){return{requestId:e.requestId,objective:e.objective,status:"",turnActive:!1,scenarios:[],thinking:"",thinkingLog:[],chatLog:[],progress:0}}function Re(e){return e.pendingClarification===void 0?e:{...e,pendingClarification:void 0}}function Ce(e){return{...e,turnActive:!0,error:void 0,thinking:"",thinkingLog:[]}}function P(e,t){switch(t.type){case"thinking":return{...e,status:"thinking",thinking:e.thinking+t.delta};case"thinking_done":return{...e,thinkingLog:[...e.thinkingLog,{text:e.thinking,tookMs:t.tookMs}],thinking:""};case"progress":return{...e,progress:t.pct};case"snapshot":return{...e,scenarios:t.data.scenarios,status:t.data.status,headline:t.data.headline??e.headline};case"chat":return{...e,turnActive:!1,chatLog:[...e.chatLog,{role:"model",text:t.text}]};case"clarification":return{...e,turnActive:!1,chatLog:[...e.chatLog,{role:"model",text:t.text}],pendingClarification:t.text};case"limit":return{...e,limits:{scenarioLimit:t.scenarioLimit,perScenarioLimit:t.perScenarioLimit}};case"error":return{...e,error:t.message};case"done":return{...e,status:t.status,turnActive:!1,error:t.status==="failed"&&!e.error?"generation failed":e.error}}}function H(e,t){let n=[],i=e.type??"",d=e.status??"";if(i==="ping")return n;switch(i){case"thinking_token":typeof e.data=="string"&&n.push({type:"thinking",delta:e.data});break;case"thinking_stopped":{let r=e.data??{},o=se(r.time_taken);n.push({type:"thinking_done",text:typeof e.data=="string"?e.data:r.message??"",tookMs:o});break}case"progress":{let r=e.data??{};typeof r.progress=="number"&&n.push({type:"progress",pct:r.progress});break}case"clarification":{let r=e.data??{};typeof r.message=="string"&&n.push({type:"clarification",text:r.message});break}case"chatting_stopped":{let r=e.data??{};typeof r.message=="string"&&r.message.length>0&&n.push({type:"chat",text:r.message});break}case"limit_update":{let r=e.data??{},o=r.test_cases_limit??e.test_cases_limit,p=r.per_scenario_test_cases_limit??e.per_scenario_test_cases_limit;n.push({type:"limit",scenarioLimit:o,perScenarioLimit:p});break}case"error":{let r=typeof e.data=="string"?e.data:e.data?.message??"generation error";n.push({type:"error",message:r});break}case"request_cancelled":return n.push({type:"done",status:"stopped"}),n;case"session_ended":return n.push({type:"done",status:"ended"}),n;default:break}if(Array.isArray(e.scenarios)&&n.push({type:"snapshot",data:{requestId:t,status:d,headline:e.headline,scenarios:e.scenarios}}),d&&U(d)){let r=d.trim().toLowerCase();n.push({type:"done",status:r})}return n}function se(e){if(!e)return;let t=/^([\d.]+)(ms|s)?$/.exec(e.trim());if(!t)return;let n=Number(t[1]);if(Number.isFinite(n))return t[2]==="ms"?Math.round(n):Math.round(n*1e3)}var v=class extends Error{constructor(t){super(t),this.name="AuthError"}},M=class extends Error{constructor(t){super(t),this.name="ForbiddenError"}},I=class extends Error{constructor(t){super(t),this.name="InsufficientCreditsError"}},k=class extends Error{constructor(n,i){super(n);this.cause=i;this.name="TransportError"}};function x(e,t){let n=t?.message??t?.error??`HTTP ${e}`;return e===401?new v(n):e===403?t?.key==="insufficient_credits"?new I(n):new M(n):new k(n)}async function*J(e){let t=e.fetchImpl??fetch,n=e.maxRetries??5,i=e.maxBackoffMs??3e4,d=e.connectTimeoutMs??1e4,r=0,o=!1;for(;;){if(e.signal.aborted)return;let p=new AbortController,a=()=>p.abort();e.signal.addEventListener("abort",a,{once:!0});let c=setTimeout(()=>p.abort(),d),g;try{g=await t(e.url,{method:"GET",headers:{Authorization:await e.authHeader(),Accept:"text/event-stream"},signal:p.signal})}catch(w){if(clearTimeout(c),e.signal.removeEventListener("abort",a),e.signal.aborted)return;if(++r>n)throw new k("SSE connect failed",w);await O(F(r,i));continue}if(clearTimeout(c),!g.ok){e.signal.removeEventListener("abort",a);let w=await oe(g);if(g.status===401&&o){if(++r>n)throw x(401,w);await O(F(r,i));continue}throw x(g.status,w)}if(!g.body)throw e.signal.removeEventListener("abort",a),new k("SSE response had no body");o=!0,r=0;let m=g.body.getReader(),h=new TextDecoder("utf-8"),b="";try{for(;;){if(e.signal.aborted){await m.cancel().catch(()=>{});return}let{done:w,value:s}=await m.read();if(w)break;b+=h.decode(s,{stream:!0});let f;for(;(f=b.indexOf(`
2
+ import{a as $}from"./chunk-DKUD2D5Y.js";import{f as D}from"./chunk-CCEXSCTN.js";import{a as E}from"./chunk-NLCCBXXV.js";function U(e){return["completed","failed","ended","stopped"].includes(e.trim().toLowerCase())}function je(e){return["ended","stopped"].includes(e.trim().toLowerCase())}function q(e){return{requestId:e.requestId,objective:e.objective,status:"",turnActive:!1,scenarios:[],thinking:"",thinkingLog:[],chatLog:[],progress:0}}function Re(e){return e.pendingClarification===void 0?e:{...e,pendingClarification:void 0}}function Ce(e){return{...e,turnActive:!0,error:void 0,thinking:"",thinkingLog:[]}}function P(e,t){switch(t.type){case"thinking":return{...e,status:"thinking",thinking:e.thinking+t.delta};case"thinking_done":return{...e,thinkingLog:[...e.thinkingLog,{text:e.thinking,tookMs:t.tookMs}],thinking:""};case"progress":return{...e,progress:t.pct};case"snapshot":return{...e,scenarios:t.data.scenarios,status:t.data.status,headline:t.data.headline??e.headline};case"chat":return{...e,turnActive:!1,chatLog:[...e.chatLog,{role:"model",text:t.text}]};case"clarification":return{...e,turnActive:!1,chatLog:[...e.chatLog,{role:"model",text:t.text}],pendingClarification:t.text};case"limit":return{...e,limits:{scenarioLimit:t.scenarioLimit,perScenarioLimit:t.perScenarioLimit}};case"error":return{...e,error:t.message};case"done":return{...e,status:t.status,turnActive:!1,error:t.status==="failed"&&!e.error?"generation failed":e.error}}}function H(e,t){let n=[],i=e.type??"",d=e.status??"";if(i==="ping")return n;switch(i){case"thinking_token":typeof e.data=="string"&&n.push({type:"thinking",delta:e.data});break;case"thinking_stopped":{let r=e.data??{},o=se(r.time_taken);n.push({type:"thinking_done",text:typeof e.data=="string"?e.data:r.message??"",tookMs:o});break}case"progress":{let r=e.data??{};typeof r.progress=="number"&&n.push({type:"progress",pct:r.progress});break}case"clarification":{let r=e.data??{};typeof r.message=="string"&&n.push({type:"clarification",text:r.message});break}case"chatting_stopped":{let r=e.data??{};typeof r.message=="string"&&r.message.length>0&&n.push({type:"chat",text:r.message});break}case"limit_update":{let r=e.data??{},o=r.test_cases_limit??e.test_cases_limit,p=r.per_scenario_test_cases_limit??e.per_scenario_test_cases_limit;n.push({type:"limit",scenarioLimit:o,perScenarioLimit:p});break}case"error":{let r=typeof e.data=="string"?e.data:e.data?.message??"generation error";n.push({type:"error",message:r});break}case"request_cancelled":return n.push({type:"done",status:"stopped"}),n;case"session_ended":return n.push({type:"done",status:"ended"}),n;default:break}if(Array.isArray(e.scenarios)&&n.push({type:"snapshot",data:{requestId:t,status:d,headline:e.headline,scenarios:e.scenarios}}),d&&U(d)){let r=d.trim().toLowerCase();n.push({type:"done",status:r})}return n}function se(e){if(!e)return;let t=/^([\d.]+)(ms|s)?$/.exec(e.trim());if(!t)return;let n=Number(t[1]);if(Number.isFinite(n))return t[2]==="ms"?Math.round(n):Math.round(n*1e3)}var v=class extends Error{constructor(t){super(t),this.name="AuthError"}},M=class extends Error{constructor(t){super(t),this.name="ForbiddenError"}},I=class extends Error{constructor(t){super(t),this.name="InsufficientCreditsError"}},k=class extends Error{constructor(n,i){super(n);this.cause=i;this.name="TransportError"}};function x(e,t){let n=t?.message??t?.error??`HTTP ${e}`;return e===401?new v(n):e===403?t?.key==="insufficient_credits"?new I(n):new M(n):new k(n)}async function*J(e){let t=e.fetchImpl??fetch,n=e.maxRetries??5,i=e.maxBackoffMs??3e4,d=e.connectTimeoutMs??1e4,r=0,o=!1;for(;;){if(e.signal.aborted)return;let p=new AbortController,a=()=>p.abort();e.signal.addEventListener("abort",a,{once:!0});let c=setTimeout(()=>p.abort(),d),g;try{g=await t(e.url,{method:"GET",headers:{Authorization:await e.authHeader(),Accept:"text/event-stream"},signal:p.signal})}catch(w){if(clearTimeout(c),e.signal.removeEventListener("abort",a),e.signal.aborted)return;if(++r>n)throw new k("SSE connect failed",w);await O(F(r,i));continue}if(clearTimeout(c),!g.ok){e.signal.removeEventListener("abort",a);let w=await oe(g);if(g.status===401&&o){if(++r>n)throw x(401,w);await O(F(r,i));continue}throw x(g.status,w)}if(!g.body)throw e.signal.removeEventListener("abort",a),new k("SSE response had no body");o=!0,r=0;let m=g.body.getReader(),h=new TextDecoder("utf-8"),b="";try{for(;;){if(e.signal.aborted){await m.cancel().catch(()=>{});return}let{done:w,value:s}=await m.read();if(w)break;b+=h.decode(s,{stream:!0});let f;for(;(f=b.indexOf(`
3
3
 
4
4
  `))>=0;){let u=b.slice(0,f);b=b.slice(f+2);let l=ie(u);l&&(yield l)}}}catch(w){if(e.signal.aborted)return;if(++r>n)throw new k("SSE stream dropped",w);await O(F(r,i));continue}finally{e.signal.removeEventListener("abort",a)}return}}function ie(e){let t="message",n="";for(let i of e.split(`
5
5
  `))i.startsWith("event:")?t=i.slice(6).trim():i.startsWith("data:")&&(n+=i.slice(5).trim());if(t!=="message"||!n)return null;try{let i=Buffer.from(n,"base64").toString("utf-8");return JSON.parse(i)}catch{return null}}function F(e,t){return Math.min(t,1e3*2**(e-1))}function O(e){return new Promise(t=>setTimeout(t,e))}async function oe(e){try{return await e.clone().json()}catch{return}}function W(e,t){t?.length&&(e.append("files",t.map(n=>n.fileKey).join(",")),e.append("gemini_metadata",JSON.stringify(t.map(n=>({fileData:{fileUri:n.geminiUri,mimeType:n.mimeType}})))))}function Ue(e,t={}){let n=t.fetchImpl??fetch,i=new Map,d=!0;async function r(){let s=await e.authResolver.resolve();if(!s)throw new v("unauthorized; run `kane-cli login`");return E(s.username,s.access_key)}function o(s){return`${e.baseUrl}${s}`}async function p(s){if(!s.ok){let f;try{f=await s.clone().json()}catch{f=void 0}throw x(s.status,f)}return s.json()}function a(s){let f=s?.data??s;return{request_id:f.request_id??f.id,status:f.status??""}}function c(s,f,u,l){let y=q({requestId:s,objective:f});l&&(y=P(y,{type:"snapshot",data:l}),l.status==="cleaned_up"&&(y={...y,error:"session was reaped (cleaned_up) \u2014 continuing will destructively regenerate"}));let S=new AbortController;u&&(u.aborted?S.abort():u.addEventListener("abort",()=>S.abort(),{once:!0})),i.set(s,S);let A={requestId:s,state:y,events:void 0};return A.events=(async function*(){try{let C=J({url:o(`/requests/${s}/sse`),authHeader:r,signal:S.signal,log:e.log,fetchImpl:n});for await(let L of C)for(let z of H(L,s))A.state=P(A.state,z),yield z}finally{i.delete(s)}})(),A}async function g(s,f){let u=new FormData;u.append("prompt",s.prompt),d=s.memoryEnhancement??!0,u.append("memory_enhancement",String(d)),s.scenarioLimit!==void 0&&u.append("test_scenario_limit",String(s.scenarioLimit)),s.perScenarioLimit!==void 0&&u.append("per_scenario_test_cases_limit",String(s.perScenarioLimit));let l=s.projectId??e.projectId,y=s.folderId??e.folderId;l&&u.append("project_id",l),y&&u.append("folder_id",y),W(u,s.attachments);let S=await n(o("/requests"),{method:"POST",headers:{Authorization:await r()},body:u}),A=await p(S),{request_id:C}=a(A),L=String(C);return c(L,s.prompt,f)}async function m(s,f){let u=await n(o(`/requests/${s}`),{method:"GET",headers:{Authorization:await r()}}),l=await p(u),y=l?.data??l,S={requestId:s,status:y.status??"",headline:y.headline,scenarios:Array.isArray(y.scenarios)?y.scenarios:[]};return c(s,"",f,S)}async function h(s,f,u){let l=new FormData;l.append("prompt",f),l.append("chat_enabled","true"),l.append("memory_enhancement",String(d)),u?.mappings&&l.append("mappings",JSON.stringify(u.mappings)),W(l,u?.attachments);let y=await n(o(`/requests/${s}`),{method:"PUT",headers:{Authorization:await r()},body:l});if(!y.ok){let S;try{S=await y.clone().json()}catch{}throw x(y.status,S)}}async function b(s){i.get(s)?.abort();let u=await n(o(`/requests/${s}/stop`),{method:"DELETE",headers:{Authorization:await r()}});if(!u.ok&&u.status!==404){let l;try{l=await u.clone().json()}catch{}throw x(u.status,l)}}async function w(s){i.get(s)?.abort();let u=await n(o(`/requests/${s}/end`),{method:"DELETE",headers:{Authorization:await r()}});if(!u.ok&&u.status!==404){let l;try{l=await u.clone().json()}catch{}throw x(u.status,l)}}return{start:g,attach:m,chat:h,cancel:b,end:w}}import{statSync as ae,realpathSync as G,existsSync as ce}from"fs";import{extname as ue,resolve as j,isAbsolute as pe}from"path";import{homedir as V}from"os";var de=new Set([".txt",".md",".json",".xml",".jpg",".jpeg",".png",".gif",".bmp",".webp",".pdf",".docx",".csv",".xlsx",".mp3",".wav",".m4a",".webm",".mpeg",".mpga",".mp4",".mov"]),le=50*1024*1024,X=10;function fe(e){return e==="~"?V():e.startsWith("~/")?j(V(),e.slice(2)):e}function Ge(e,t){let n=[],i=[],d=new Set,r=[],o=(()=>{try{return G(j(t))}catch{return j(t)}})(),p=o.endsWith("/")?o:o+"/";for(let a of e){let c=fe(a),g=pe(c)?c:j(t,c);if(!ce(g)){n.push(`Not found: ${a}`);continue}let m;try{m=G(g)}catch{n.push(`Cannot resolve: ${a}`);continue}if(d.has(m))continue;let h;try{h=ae(m)}catch{n.push(`Cannot read: ${a}`);continue}if(!h.isFile()){n.push(`Not a file: ${a}`);continue}if(h.size===0){n.push(`Empty file: ${a}`);continue}let b=ue(m).toLowerCase();if(!de.has(b)){n.push(`Unsupported type ${b||"(none)"}: ${a}`);continue}if(h.size>le){n.push(`Too large (>50MB): ${a}`);continue}m!==o&&!m.startsWith(p)&&i.push(`Outside working dir: ${a}`),d.add(m),r.push(m)}return r.length>X&&n.push(`Too many files: ${r.length} (max ${X})`),{ok:n.length?[]:r,errors:n,warnings:i}}var B=class extends Error{constructor(n){super(n.join("; "));this.errors=n;this.name="AttachmentValidationError"}};async function Xe(e){let{promptText:t,filePaths:n,cwd:i,scenarios:d,isRefine:r,conn:o,deps:p}=e,{ok:a,errors:c,warnings:g}=p.validate(n,i);if(c.length)throw new B(c);e.onValidated?.();let m=a.length?await p.upload(o,a,p.onUpload):[],h=r?p.buildMappings(t,d):void 0;return{promptText:t,mappings:h,attachments:m,warnings:g}}import{readFile as me}from"fs/promises";import{basename as K}from"path";async function ge(e){let t=await e.authResolver.resolve();if(!t)throw new v("unauthorized; run `kane-cli login`");return E(t.username,t.access_key)}async function he(e,t,n={}){let i=n.fetchImpl??fetch,d=await me(t),r=K(t),o=new FormData;o.append("file",new Blob([d]),r),o.append("source","omniBox"),o.append("geminiFileUpload","true");let p=await i(`${e.tmsBaseUrl}/v1/attachment`,{method:"POST",headers:{Authorization:await ge(e)},body:o,signal:n.signal});if(!p.ok){let h;try{h=await p.clone().json()}catch{}throw x(p.status,h)}let a=await p.json(),c=a?.data??a,g=c?.gemini_response?.uri,m=c?.gemini_response?.mimeType;if(!c?.file_key||!g){let h=c&&typeof c=="object"?Object.keys(c).join(","):typeof c,b=(()=>{try{return JSON.stringify(c).slice(0,500)}catch{return"<unserializable>"}})();throw new Error(`attachment upload for ${r} returned no file_key/gemini uri \u2014 status ${p.status}, body keys: [${h}], raw: ${b}`)}return{fileName:c.file_name??r,fileKey:c.file_key,geminiUri:g,mimeType:m??"application/octet-stream"}}async function tt(e,t,n,i={}){let d=[];for(let r=0;r<t.length;r++){if(i.signal?.aborted)throw Object.assign(new Error("upload aborted"),{name:"AbortError"});let o=K(t[r]);n?.({file:o,index:r+1,total:t.length,status:"uploading"});try{d.push(await he(e,t[r],i)),n?.({file:o,index:r+1,total:t.length,status:"done"})}catch(p){throw n?.({file:o,index:r+1,total:t.length,status:"failed"}),p}}return d}var ye=/@([sS])(\d+)\.([cC])(\d+)/g,be=/@([sS])(\d+)(?!\d)(?!\.[cC]\d)/g;function rt(e,t){let n={},i={};for(let d of e.matchAll(ye)){let r=Number(d[2]),o=Number(d[4]),p=t[r-1];if(!p)continue;n[`s${r}`]=String(p.id);let a=p.test_cases??[];if(a[o-1])for(let c=0;c<o;c++){let g=a[c];g&&(i[`s${r}.c${c+1}`]=String(g.id))}}for(let d of e.matchAll(be)){let r=Number(d[2]),o=t[r-1];o&&(n[`s${r}`]=String(o.id))}if(!(Object.keys(n).length===0&&Object.keys(i).length===0))return{scenario:n,testcase:i}}function R(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(n==null||typeof n!="object")return[];let i=n;if(typeof i.step!="string")return[];let d=typeof i.expected_result=="string"?i.expected_result:typeof i.outcome=="string"?i.outcome:"";t.push({step:i.step,expected:d})}return t}var we=30,Se=300;function Z(){return{mode:"testing",max_steps:we,timeout:Se,variables:{}}}function Q(e){return e.title??`Test case ${e.id}`}function ct(e,t){return $({frontmatter:Z(),heading:Q(t),steps:e.sub_objectives.map(n=>n.objective)})}function Y(e){let t=R(e.manual_steps).map(n=>n.step);return $({frontmatter:Z(),heading:Q(e),steps:t})}import{mkdtempSync as xe,mkdirSync as N,writeFileSync as ee,rmSync as te,renameSync as _e,existsSync as ne,readFileSync as ve}from"fs";import{join as _,resolve as ke}from"path";async function ft(e,t,n,i=Y){(n.redirectBareCwd??!0)&&ke(t)===process.cwd()&&(t=_(t,".testmuai","tests"));let d=T(e.objective)??e.headline,r=T(n.suiteName)??`${T(re(d,4))??"tcg"}-${e.requestId}`,o=r,p=_(t,r);ne(p)&&!Te(p,e.requestId)&&(o=`${r}-${e.requestId}`);let a=_(t,o),c=[],g=new Map;for(let h of e.scenarios){let b=(h.test_cases??[]).filter(Ae);if(b.length===0)continue;let w=T(Ee(h.scode))??T(h.sid)??`s${h.id}`,s=g.get(w)??new Set;g.set(w,s);for(let f of b){let u=T(re(f.title,5))??"case",l=`${u}_test.md`;for(let y=2;s.has(l);y++)l=`${u}-${y}_test.md`;s.add(l),c.push({dir:w,file:l,tc:f})}}if(c.length===0)return{suiteDir:a,paths:[],warning:"no functional test cases generated"};N(t,{recursive:!0});let m=xe(_(t,".tcg-tmp-"));try{N(_(m,"helpers"),{recursive:!0}),ee(_(m,".tcg-suite.json"),JSON.stringify({requestId:e.requestId,suiteName:o}));let h=[],b=new Set;for(let s of c){let f=_(m,s.dir);b.has(f)||(N(f,{recursive:!0}),b.add(f));let u=_(f,s.file);ee(u,i(s.tc)),h.push(u)}ne(a)&&te(a,{recursive:!0,force:!0}),_e(m,a);let w=h.map(s=>s.replace(m,a));return{suiteDir:a,paths:w}}catch(h){try{te(m,{recursive:!0,force:!0})}catch{}throw h}}function Ae(e){return(e.category??"").trim().toLowerCase()==="functional"}function Te(e,t){try{return JSON.parse(ve(_(e,".tcg-suite.json"),"utf-8"))?.requestId===t}catch{return!1}}function T(e){return e&&e.length>0?e:void 0}function re(e,t){return e?e.toLowerCase().replace(/[^a-z0-9]+/g," ").trim().split(/\s+/).filter(Boolean).slice(0,t).join("-"):""}function Ee(e){return e?e.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,""):""}function ht(e){let t=[];e.title&&t.push(e.title),e.description&&t.push("",e.description);let n=R(e.manual_steps);return n.length>0&&(t.push("","Steps:"),n.forEach((i,d)=>{t.push(`${d+1}. ${i.step}`)})),t.join(`
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{g as a}from"./chunk-WXHQYYD5.js";function l(e,r,i,c){let n=a(r.type)?.cardinality;if(n!=="one-live-per-src"&&n!=="one-live-per-src-and-dst")return null;let o=t=>i.freed?.has(t)??!1,d=e.edgesFrom(r.src).find(t=>t.type===r.type&&!i.retracted.has(t.ecid)&&!e.superseded.has(t.dst)&&!o(t.dst))??i.pending.find(t=>t.type===r.type&&t.src===r.src);if(d){let t="ecid"in d?` (${d.ecid})`:" in this record";return{code:"CARDINALITY_VIOLATION",detail:`${c}: ${r.type} from ${r.src} already has a live edge${t} \u2014 supersede or retract it first`}}if(n==="one-live-per-src-and-dst"){let t=e.edgesInto(r.dst).find(s=>s.type===r.type&&s.src!==r.src&&!i.retracted.has(s.ecid)&&!e.superseded.has(s.src)&&!o(s.src))??i.pending.find(s=>s.type===r.type&&s.dst===r.dst&&s.src!==r.src);if(t){let s="ecid"in t?` (${t.ecid})`:" in this record";return{code:"CARDINALITY_VIOLATION",detail:`${c}: ${r.type} onto ${r.dst} already has a live edge${s} \u2014 strict 1:1, supersede or retract it first`}}}return null}export{l as a};
2
+ import{g as a}from"./chunk-AKX4VRRR.js";function l(e,r,i,c){let n=a(r.type)?.cardinality;if(n!=="one-live-per-src"&&n!=="one-live-per-src-and-dst")return null;let o=t=>i.freed?.has(t)??!1,d=e.edgesFrom(r.src).find(t=>t.type===r.type&&!i.retracted.has(t.ecid)&&!e.superseded.has(t.dst)&&!o(t.dst))??i.pending.find(t=>t.type===r.type&&t.src===r.src);if(d){let t="ecid"in d?` (${d.ecid})`:" in this record";return{code:"CARDINALITY_VIOLATION",detail:`${c}: ${r.type} from ${r.src} already has a live edge${t} \u2014 supersede or retract it first`}}if(n==="one-live-per-src-and-dst"){let t=e.edgesInto(r.dst).find(s=>s.type===r.type&&s.src!==r.src&&!i.retracted.has(s.ecid)&&!e.superseded.has(s.src)&&!o(s.src))??i.pending.find(s=>s.type===r.type&&s.dst===r.dst&&s.src!==r.src);if(t){let s="ecid"in t?` (${t.ecid})`:" in this record";return{code:"CARDINALITY_VIOLATION",detail:`${c}: ${r.type} onto ${r.dst} already has a live edge${s} \u2014 strict 1:1, supersede or retract it first`}}}return null}export{l as a};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{d as f}from"./chunk-WXHQYYD5.js";function k(s,n){let t=null;for(let[i,e]of s.designOf)i!==n&&s.tipOf(i)!==n||(t==null||e.seq>t.seq)&&(t={...e,designed_at_cid:i});return t}function $(s,n){let t=new Map;for(let[d,o]of s.superseded)o!=null&&t.set(o,d);let i=[n],e=n;for(;t.has(e);)e=t.get(e),i.unshift(e);return i}function w(s,n,t){let i=s.resolve(n);if(!i){let r=[...s.names.keys()].filter(m=>m.startsWith("uc-")).sort().slice(0,6);return{ok:!1,code:2,message:`unknown use-case '${n}' \u2014 no live node by that logical id or cid${r.length?` (known: ${r.join(", ")})`:""}`}}let e=i.tip;if(s.superseded.has(e)&&s.superseded.get(e)===null)return{ok:!1,code:2,message:`use-case '${n}' was removed (tombstoned) \u2014 nothing to design`};let d=s.nodeLabel.get(e);if(d!==f.USECASE)return{ok:!1,code:2,message:`'${n}' is a ${d??"missing node"}, not a use-case \u2014 design runs per use-case`};let o=s.nameOf.get(e)??s.nameOf.get(i.cid)??e.slice(0,19);if(s.trust.get(e)==="archived"){let r=s.archivedReason.get(e);return{ok:!1,code:2,message:`use-case '${o}' is archived${r?` (${r})`:""} \u2014 design runs only over live use-cases`}}let c=k(s,e);if(c==null||t)return{ok:!0};let l=$(s,e),a=l.length;if(c.designed_at_cid===e)return{ok:!1,code:2,message:`'${o}' is already designed @ v${a} \u2014 current; use --force to redesign`,wall:{kind:"already-designed",display:o,currentV:a}};let u=l.indexOf(c.designed_at_cid),g=u>=0?`v${u+1}`:"an earlier version";return{ok:!1,code:2,message:`'${o}' was designed @ ${g} \u2014 the use-case is now @ v${a} (STALE); use --force to redesign`,wall:{kind:"designed-stale",display:o,currentV:a,designedV:g}}}export{k as a,w as b};
2
+ import{d as f}from"./chunk-AKX4VRRR.js";function k(s,n){let t=null;for(let[i,e]of s.designOf)i!==n&&s.tipOf(i)!==n||(t==null||e.seq>t.seq)&&(t={...e,designed_at_cid:i});return t}function $(s,n){let t=new Map;for(let[d,o]of s.superseded)o!=null&&t.set(o,d);let i=[n],e=n;for(;t.has(e);)e=t.get(e),i.unshift(e);return i}function w(s,n,t){let i=s.resolve(n);if(!i){let r=[...s.names.keys()].filter(m=>m.startsWith("uc-")).sort().slice(0,6);return{ok:!1,code:2,message:`unknown use-case '${n}' \u2014 no live node by that logical id or cid${r.length?` (known: ${r.join(", ")})`:""}`}}let e=i.tip;if(s.superseded.has(e)&&s.superseded.get(e)===null)return{ok:!1,code:2,message:`use-case '${n}' was removed (tombstoned) \u2014 nothing to design`};let d=s.nodeLabel.get(e);if(d!==f.USECASE)return{ok:!1,code:2,message:`'${n}' is a ${d??"missing node"}, not a use-case \u2014 design runs per use-case`};let o=s.nameOf.get(e)??s.nameOf.get(i.cid)??e.slice(0,19);if(s.trust.get(e)==="archived"){let r=s.archivedReason.get(e);return{ok:!1,code:2,message:`use-case '${o}' is archived${r?` (${r})`:""} \u2014 design runs only over live use-cases`}}let c=k(s,e);if(c==null||t)return{ok:!0};let l=$(s,e),a=l.length;if(c.designed_at_cid===e)return{ok:!1,code:2,message:`'${o}' is already designed @ v${a} \u2014 current; use --force to redesign`,wall:{kind:"already-designed",display:o,currentV:a}};let u=l.indexOf(c.designed_at_cid),g=u>=0?`v${u+1}`:"an earlier version";return{ok:!1,code:2,message:`'${o}' was designed @ ${g} \u2014 the use-case is now @ v${a} (STALE); use --force to redesign`,wall:{kind:"designed-stale",display:o,currentV:a,designedV:g}}}export{k as a,w as b};
@@ -0,0 +1,5 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as k}from"./chunk-DNNZ353O.js";import{b as w}from"./chunk-W3Z7AZNT.js";import{d as E,e as h}from"./chunk-AKX4VRRR.js";var g=(e,t,r=new Set)=>{let s=e.nameOf.get(t);if(s!==void 0)return s;if(r.has(t))return t;r.add(t);for(let[o,n]of e.superseded){if(n!==t)continue;let d=g(e,o,r);if(d!==o)return d}return t};function b(e,t){let r=e.stale(t);if(r==="fresh")return;if(r==="orphaned")return"orphaned \u2014 no live source evidences this item";let s=[],o=new Map;for(let n of e.derivesInto(t))o.set(String(n.props.source_id),n);for(let[n,d]of o){let i=e.heads.get(n);if(i==null||i===d.props.source_cid)continue;let a=e.convChains.get(n)?.chain;a&&a.includes(String(d.props.source_cid))||s.push(`DERIVES pin ${n}@${String(d.props.source_cid).slice(0,19)} broke \u2014 the source head moved`)}for(let n of e.edgesFrom(t)){if(n.type===h.DERIVES||!e.superseded.has(n.dst))continue;let d=e.tipOf(n.dst);if(e.superseded.has(d)){s.push(`${n.type} pin \u2192 ${g(e,n.dst)} \u2014 target retired`);continue}let i=C(e,n.dst,d);s.push(i.length>0?`${g(e,n.dst)} updated: ${i.map(a=>a.field).join(", ")}`:`${n.type} pin \u2192 ${g(e,n.dst)} \u2014 target superseded`)}return s.length>0?s.join("; "):"stale \u2014 a pinned dependency moved"}function C(e,t,r){let s=e.getNode(t)?.content??{},o=e.getNode(r)?.content??{},n=i=>i===void 0?"":Array.isArray(i)?i.map(String).join(" \xB7 "):typeof i=="object"?JSON.stringify(i):String(i),d=[];for(let i of[...new Set([...Object.keys(s),...Object.keys(o)])].sort())JSON.stringify(s[i])!==JSON.stringify(o[i])&&d.push({field:i,old:n(s[i]),new:n(o[i])});return d}function P(e,t){let r=[];for(let{cid:s}of e.byLabel(E.SCENARIO))e.superseded.has(s)||e.edgesFrom(s).some(o=>o.type===h.BELONGS_TO&&e.tipOf(o.dst)===t)&&r.push(s);return r}function O(e,t){let r=[],s=[],o=[],n=[],d=[],i=[],a=P(e,t),y=new Set(a),l=(c,f)=>{let u=b(e,f);return u===void 0?c:{...c,stale:!0,stale_reason:u}};for(let c of a){let f=e.getNode(c)?.content??{};r.push(l({ref:g(e,c),title:String(f.title??""),case_type:String(f.case_type??""),intent:String(f.intent??"")},c));for(let u of e.edgesInto(c)){if(u.type!==h.AUTOMATES||e.superseded.has(u.src))continue;let p=e.getNode(u.src)?.content??{},S=e.edgesFrom(u.src).filter(x=>x.type===h.VERIFIES&&!e.superseded.has(x.dst)).map(x=>g(e,x.dst));s.push(l({ref:g(e,u.src),title:String(p.title??""),automates:g(e,c),check:p.check,verifies:S,...typeof p.target=="string"?{target:p.target}:{},...typeof p.app=="string"?{app:p.app}:{}},u.src)),d.push(u.src)}for(let u of e.edgesFrom(c))u.type!==h.EXERCISES||e.superseded.has(u.dst)||n.push({scenario:g(e,c),ac:g(e,u.dst)})}for(let{cid:c}of e.byLabel(E.AC)){if(e.superseded.has(c))continue;let f=e.edgesFrom(c).find(x=>x.type===h.SCOPED_TO);if(!f)continue;let u=e.tipOf(f.dst);if(!(u===t||y.has(u)))continue;let S=e.getNode(c)?.content??{};o.push(l({ref:g(e,c),text:String(S.text??""),kind:String(S.kind??""),scope:u===t?"use-case":g(e,u)},c)),i.push(c)}let _=[],m=new Set;for(let c of[t,...a,...d,...i])for(let f of e.retractedEdgesTouching(c))m.has(f.ecid)||(m.add(f.ecid),_.push({type:f.type,src:g(e,f.src),dst:g(e,f.dst),at:f.retraction.at,...f.retraction.reason?{reason:f.retraction.reason}:{}}));return{scenarios:r,tests:s,acs:o,exercises:n,retracted_edges:_}}function D(e,t,r){let s=k(e,t,r);return s===null?null:s.toString("utf8")}function v(e,t){let r=t.split(`
3
+ `).map(o=>o.replace(/^\d+\| /,"")),s=[];for(let o of e.split(`
4
+ `)){let n=o.trim();if(n.length===0)continue;let d=r.find(i=>i.includes(n));d!==void 0&&!s.includes(d.trim())&&s.push(d.trim())}return s.length>0?s.join(`
5
+ `):{removed:!0}}function G(e,t,r,s){if(s!==void 0&&s.trim().length>0)return{kind:"user-directive",text:s.trim()};let o=[r,...O(t,r).acs.map(a=>t.resolve(a.ref)?.cid??"")].filter(Boolean),n=[],d=new Set;for(let a of o){let y=new Map;for(let l of t.derivesInto(a))y.set(String(l.props.source_id),l);for(let[l,_]of y){let m=t.heads.get(l);if(m==null||m===_.props.source_cid)continue;let c=String(_.props.anchor),f=`${l}\0${c}`;if(d.has(f)||c==="img#whole")continue;d.add(f);let u=D(e,t,String(_.props.source_cid)),p=u===null?null:w(u,c);if(p===null)continue;let S=D(e,t,m);n.push({source_id:l,anchor:c,old_anchor_text:p,new_anchor_text:S===null?{removed:!0}:v(p,S)})}}let i;for(let[a,y]of t.superseded){if(y!==r||t.nodeLabel.get(a)!==E.USECASE)continue;let l=C(t,a,r);l.length>0&&(i=l);break}return{kind:"source-change",changes:n,...i?{uc_updated:i}:{}}}function $(e,t,r,s){let o=O(t,r);if(o.scenarios.length===0&&o.tests.length===0&&o.acs.length===0)return;let n=G(e,t,r,s);if(!(n.kind==="source-change"&&n.changes.length===0&&!n.uc_updated))return{prior_design:o,change_delta:n}}export{O as a,$ as b};
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as b,b as $}from"./chunk-AJXOJF2X.js";function C(n){return n.replace(/\n$/,"").split(`
2
+ import{a as b,b as $}from"./chunk-W3Z7AZNT.js";function C(n){return n.replace(/\n$/,"").split(`
3
3
  `).map((l,o)=>`${String(o+1).padStart(4,"0")}| ${l}`).join(`
4
4
  `)}function S(n,d,l){if(!n.quote)return n;let o=$(l,n.anchor);if(o!==null&&o.includes(n.quote))return n;let a=d.indexOf(n.quote);if(a===-1||d.indexOf(n.quote,a+1)!==-1)return"gone-or-ambiguous";let t=d.slice(0,a).split(`
5
5
  `).length,r=t+n.quote.replace(/\n$/,"").split(`
@@ -1,3 +1,3 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{d as X}from"./chunk-BB2W35TW.js";import{a as $}from"./chunk-YKTYVJBN.js";import{C as T,n as z,o as Y,p as H}from"./chunk-AJXOJF2X.js";import{b as q,h as N}from"./chunk-HLXOYLZV.js";import{a as W,d as S,f as L}from"./chunk-DBIBROYW.js";import{c as C}from"./chunk-UD7KKHPW.js";import{a as K,b as J}from"./chunk-N2N5T5JN.js";var ce=3,de=1e4,Q=()=>new Promise(r=>setTimeout(r,25+Math.floor(Math.random()*50))),Z=r=>r==="design"||r==="maintain"?"session":r==="revert"||r==="shape-op"?"exclusive":"commit";function le(r,e,o){for(let s of r){for(let t of s.supersessions)if(t.kind==="node"&&(o.has(t.old)||t.new!==null&&o.has(t.new)))return!0;for(let t of s.nodes)if(t.label==="usecase"&&e.newBuCandidates.length>0||o.has(t.cid))return!0;if(s.design_generation&&e.generationTicket&&s.design_generation.uc_root===e.generationTicket.uc_root)return!0;for(let t of e.sourcePins)if(Object.prototype.hasOwnProperty.call(s.source_head_moves,t.source_id))return!0}return!1}async function De(r,e,o){let{contextDir:s,locks:t,probe:a}=r,m=r.sid??r.rootSid,f=e.newBuCandidates.map(b=>({tempRef:b.tempRef,probeText:b.probeText})),k=0,g=!0,p={hits:[],degraded:!1,probeBasis:null};for(;;){g&&(f.length>0&&(p=await a.batchSimilar(T(s),f)),g=!1);let b=T(s),_={seq:b.lastSeq,hash:b.latestHash},P=new Map,w=[],v=[],R=new Set;for(let d of e.ucTargets){let c=H(b,d.ref);if(c===null)return{ok:!1,kind:"validation",errors:[{code:"UNKNOWN_REF",detail:`${d.ref}: names no living node (unknown or tombstoned chain)`}]};d.expectedTip!==void 0&&d.expectedTip!==c.cid&&P.set(d.expectedTip,c.cid),R.add(c.cid),v.push(L(b,d.ref).key)}(e.verb==="revert"||e.verb==="shape-op")&&(v.length=0,v.push({kind:"context",mode:"exclusive"}));let y;try{y=t.acquire(S(v),{hold:Z(e.verb),verb:e.verb})}catch(d){if(d instanceof W&&(d.code==="UC_HELD"||d.code==="CONTEXT_HELD"))return{ok:!1,kind:"contended",err:d};throw d}let V=!1,M=!1;try{let d=await t.withKeySerialized(v,async()=>{let c=T(s),O=_.hash===c.latestHash?[]:N(s,_.seq,_.hash).records;for(let n of e.ucTargets){let i=H(c,n.ref);if(i===null){w.push({kind:"supersession",ref:n.ref,detail:`${n.ref} was retired while this commit staged \u2014 re-ground or abandon`});continue}for(let l of R)c.superseded.has(l)&&c.tipOf(l)===i.cid&&P.set(l,i.cid)}for(let n of e.sourcePins){let i=c.heads.get(n.source_id);i!=null&&i!==n.source_cid&&w.push({kind:"pin",ref:n.source_id,detail:`source '${n.source_id}' moved (pinned ${n.source_cid.slice(0,19)}, head ${i.slice(0,19)}) \u2014 re-ground or abandon`})}if(w.length>0)return{ok:!1,kind:"drifted",asks:w};if(e.generationTicket){let n=X(c,e.generationTicket);if(n!==null)return{ok:!1,kind:"validation",errors:[n]}}if(f.length>0&&O.length>0){let n=new Set(p.hits.map(u=>u.candidateCid)),i=a.recheckLocal(c,f,p.probeBasis,O);if(i.hits.some(u=>!n.has(u.candidateCid))||i.uncachedNewNodes.length>0)return M=!0,"restart"}if(e.verb!=="revert"&&e.verb!=="shape-op"){let n=S(e.ucTargets.map(u=>L(c,u.ref).key)),i=S(v);if(!(n.length===i.length&&n.every((u,h)=>JSON.stringify(u)===JSON.stringify(i[h]))))return"restart"}if(e.eventIds&&e.eventIds.length>0&&e.eventIds.every(n=>c.appliedEvents.has(n)))return{ok:!0,skipped:"already-applied"};let ae=Date.now()+de,j=c.latestHash,E=c;for(;;){let n={graph:E,expectPrev:j,redirects:P,probeHits:p.hits,degradedProbe:p.degraded,sid:m,eventIds:(l,u)=>{if(e.eventIds&&e.eventIds.length>0)return e.eventIds.slice(0,u);let h=Y(E,r.rootSid,l,u),U=r.reservedEventIds??[];if(U.length===0)return h;let D=`${r.rootSid}:${l}:`,A=0;for(let F of U){if(!F.startsWith(D))continue;let x=F.slice(D.length);/^\d+$/.test(x)&&(A=Math.max(A,Number.parseInt(x,10)))}if(A===0)return h;let G=Number.parseInt(h[0].slice(D.length),10);return!Number.isInteger(G)||G>A?h:Array.from({length:u},(F,x)=>z(r.rootSid,l,A+1+x))},assertLocks:()=>y.assertHeld()};if(r.revalidate){let l=r.revalidate(n);if(l.length>0)return{ok:!1,kind:"validation",errors:l}}y.assertHeld();let i;try{i=o(n)}catch(l){if(l instanceof q){let u=T(s),h=N(s,E.lastSeq,E.latestHash).records;if(!le(h,e,R)&&Date.now()<ae){await Q(),E=u,j=u.latestHash;continue}return"restart"}throw l}return"errors"in i?{ok:!1,kind:"validation",errors:i.errors}:(Z(e.verb)==="session"&&y.touch(),{ok:!0,result:i.result,record:i.record})}});if(d==="restart")V=!0;else return d}finally{y.release()}if(V){if(k+=1,k>=ce)return{ok:!1,kind:"unsettled",attempts:k};M&&(g=!0),await Q();continue}}}import{readFileSync as ue,writeFileSync as fe,renameSync as me,mkdirSync as pe}from"fs";import{dirname as he,join as ge}from"path";var B=1,be=720*60*1e3;function I(r){return ge(J,"embeddings",`alias-${r}.json`)}function ee(r,e=Date.now()){return r!==null&&e-r.fetchedAt<be}function re(r){try{let e=JSON.parse(ue(r,"utf-8"));return e.wrapperVersion!==B||typeof e.purposes!="object"||e.purposes===null?null:{wrapperVersion:B,writtenByVersion:String(e.writtenByVersion??""),purposes:e.purposes}}catch{return null}}function te(r,e,o=I(r)){let t=re(o)?.purposes?.[e];return!t||typeof t.alias!="string"||typeof t.dims!="number"||typeof t.fetchedAt!="number"?null:{alias:t.alias,dims:t.dims,fetchedAt:t.fetchedAt}}function se(r,e,o,s=I(r)){try{pe(he(s),{recursive:!0});let a=re(s)?.purposes??{};a[e]={alias:o.alias,dims:o.dims,fetchedAt:Date.now()};let m={wrapperVersion:B,writtenByVersion:K,purposes:a},f=`${s}.tmp`;fe(f,JSON.stringify(m,null,2)+`
2
+ import{d as X}from"./chunk-BB2W35TW.js";import{a as $}from"./chunk-YKTYVJBN.js";import{C as T,n as z,o as Y,p as H}from"./chunk-W3Z7AZNT.js";import{b as q,h as N}from"./chunk-XMTSHHYQ.js";import{a as W,d as S,f as L}from"./chunk-DBIBROYW.js";import{c as C}from"./chunk-UD7KKHPW.js";import{a as K,b as J}from"./chunk-DWHXXPDX.js";var ce=3,de=1e4,Q=()=>new Promise(r=>setTimeout(r,25+Math.floor(Math.random()*50))),Z=r=>r==="design"||r==="maintain"?"session":r==="revert"||r==="shape-op"?"exclusive":"commit";function le(r,e,o){for(let s of r){for(let t of s.supersessions)if(t.kind==="node"&&(o.has(t.old)||t.new!==null&&o.has(t.new)))return!0;for(let t of s.nodes)if(t.label==="usecase"&&e.newBuCandidates.length>0||o.has(t.cid))return!0;if(s.design_generation&&e.generationTicket&&s.design_generation.uc_root===e.generationTicket.uc_root)return!0;for(let t of e.sourcePins)if(Object.prototype.hasOwnProperty.call(s.source_head_moves,t.source_id))return!0}return!1}async function De(r,e,o){let{contextDir:s,locks:t,probe:a}=r,m=r.sid??r.rootSid,f=e.newBuCandidates.map(b=>({tempRef:b.tempRef,probeText:b.probeText})),k=0,g=!0,p={hits:[],degraded:!1,probeBasis:null};for(;;){g&&(f.length>0&&(p=await a.batchSimilar(T(s),f)),g=!1);let b=T(s),_={seq:b.lastSeq,hash:b.latestHash},P=new Map,w=[],v=[],R=new Set;for(let d of e.ucTargets){let c=H(b,d.ref);if(c===null)return{ok:!1,kind:"validation",errors:[{code:"UNKNOWN_REF",detail:`${d.ref}: names no living node (unknown or tombstoned chain)`}]};d.expectedTip!==void 0&&d.expectedTip!==c.cid&&P.set(d.expectedTip,c.cid),R.add(c.cid),v.push(L(b,d.ref).key)}(e.verb==="revert"||e.verb==="shape-op")&&(v.length=0,v.push({kind:"context",mode:"exclusive"}));let y;try{y=t.acquire(S(v),{hold:Z(e.verb),verb:e.verb})}catch(d){if(d instanceof W&&(d.code==="UC_HELD"||d.code==="CONTEXT_HELD"))return{ok:!1,kind:"contended",err:d};throw d}let V=!1,M=!1;try{let d=await t.withKeySerialized(v,async()=>{let c=T(s),O=_.hash===c.latestHash?[]:N(s,_.seq,_.hash).records;for(let n of e.ucTargets){let i=H(c,n.ref);if(i===null){w.push({kind:"supersession",ref:n.ref,detail:`${n.ref} was retired while this commit staged \u2014 re-ground or abandon`});continue}for(let l of R)c.superseded.has(l)&&c.tipOf(l)===i.cid&&P.set(l,i.cid)}for(let n of e.sourcePins){let i=c.heads.get(n.source_id);i!=null&&i!==n.source_cid&&w.push({kind:"pin",ref:n.source_id,detail:`source '${n.source_id}' moved (pinned ${n.source_cid.slice(0,19)}, head ${i.slice(0,19)}) \u2014 re-ground or abandon`})}if(w.length>0)return{ok:!1,kind:"drifted",asks:w};if(e.generationTicket){let n=X(c,e.generationTicket);if(n!==null)return{ok:!1,kind:"validation",errors:[n]}}if(f.length>0&&O.length>0){let n=new Set(p.hits.map(u=>u.candidateCid)),i=a.recheckLocal(c,f,p.probeBasis,O);if(i.hits.some(u=>!n.has(u.candidateCid))||i.uncachedNewNodes.length>0)return M=!0,"restart"}if(e.verb!=="revert"&&e.verb!=="shape-op"){let n=S(e.ucTargets.map(u=>L(c,u.ref).key)),i=S(v);if(!(n.length===i.length&&n.every((u,h)=>JSON.stringify(u)===JSON.stringify(i[h]))))return"restart"}if(e.eventIds&&e.eventIds.length>0&&e.eventIds.every(n=>c.appliedEvents.has(n)))return{ok:!0,skipped:"already-applied"};let ae=Date.now()+de,j=c.latestHash,E=c;for(;;){let n={graph:E,expectPrev:j,redirects:P,probeHits:p.hits,degradedProbe:p.degraded,sid:m,eventIds:(l,u)=>{if(e.eventIds&&e.eventIds.length>0)return e.eventIds.slice(0,u);let h=Y(E,r.rootSid,l,u),U=r.reservedEventIds??[];if(U.length===0)return h;let D=`${r.rootSid}:${l}:`,A=0;for(let F of U){if(!F.startsWith(D))continue;let x=F.slice(D.length);/^\d+$/.test(x)&&(A=Math.max(A,Number.parseInt(x,10)))}if(A===0)return h;let G=Number.parseInt(h[0].slice(D.length),10);return!Number.isInteger(G)||G>A?h:Array.from({length:u},(F,x)=>z(r.rootSid,l,A+1+x))},assertLocks:()=>y.assertHeld()};if(r.revalidate){let l=r.revalidate(n);if(l.length>0)return{ok:!1,kind:"validation",errors:l}}y.assertHeld();let i;try{i=o(n)}catch(l){if(l instanceof q){let u=T(s),h=N(s,E.lastSeq,E.latestHash).records;if(!le(h,e,R)&&Date.now()<ae){await Q(),E=u,j=u.latestHash;continue}return"restart"}throw l}return"errors"in i?{ok:!1,kind:"validation",errors:i.errors}:(Z(e.verb)==="session"&&y.touch(),{ok:!0,result:i.result,record:i.record})}});if(d==="restart")V=!0;else return d}finally{y.release()}if(V){if(k+=1,k>=ce)return{ok:!1,kind:"unsettled",attempts:k};M&&(g=!0),await Q();continue}}}import{readFileSync as ue,writeFileSync as fe,renameSync as me,mkdirSync as pe}from"fs";import{dirname as he,join as ge}from"path";var B=1,be=720*60*1e3;function I(r){return ge(J,"embeddings",`alias-${r}.json`)}function ee(r,e=Date.now()){return r!==null&&e-r.fetchedAt<be}function re(r){try{let e=JSON.parse(ue(r,"utf-8"));return e.wrapperVersion!==B||typeof e.purposes!="object"||e.purposes===null?null:{wrapperVersion:B,writtenByVersion:String(e.writtenByVersion??""),purposes:e.purposes}}catch{return null}}function te(r,e,o=I(r)){let t=re(o)?.purposes?.[e];return!t||typeof t.alias!="string"||typeof t.dims!="number"||typeof t.fetchedAt!="number"?null:{alias:t.alias,dims:t.dims,fetchedAt:t.fetchedAt}}function se(r,e,o,s=I(r)){try{pe(he(s),{recursive:!0});let a=re(s)?.purposes??{};a[e]={alias:o.alias,dims:o.dims,fetchedAt:Date.now()};let m={wrapperVersion:B,writtenByVersion:K,purposes:a},f=`${s}.tmp`;fe(f,JSON.stringify(m,null,2)+`
3
3
  `),me(f,s)}catch(t){C(`[embed] Failed to save alias cache: ${t instanceof Error?t.message:String(t)}`,"EMBED_CACHE_WRITE_FAILED")}}function ve(r){return r.TESTMUAI_ENV==="stage"?"stage":"prod"}function oe(r){let e=r.env??process.env,o=r.auth?.TESTMUAI_BASIC_AUTH||e.TESTMUAI_BASIC_AUTH;if(o)return{authorization:`Basic ${o}`};let s=r.auth?.TESTMUAI_API_KEY||e.TESTMUAI_API_KEY;return s?{authorization:`Bearer ${s}`}:{}}async function Oe(r,e={}){let o=e.env??process.env,s=ve(o),t=e.aliasCacheFile??I(s),a=e.now??Date.now,m=te(s,r,t);if(ee(m,a()))return{alias:m.alias,dims:m.dims};let k=`${$(o)}/assurance/embed/alias?purpose=${encodeURIComponent(r)}`,g=await(e.fetchImpl??fetch)(k,{method:"GET",headers:oe(e)});if(!g.ok)throw new Error(`embed alias resolve failed: ${g.status}`);let p=await g.json();return se(s,r,{alias:p.alias,dims:p.dims},t),{alias:p.alias,dims:p.dims}}async function je(r,e,o={}){let s=o.env??process.env,t=$(s),a=await(o.fetchImpl??fetch)(`${t}/assurance/embed`,{method:"POST",headers:{...oe(o),"content-type":"application/json"},body:JSON.stringify({purpose:r,input:e})});if(!a.ok)throw new Error(`embed failed: ${a.status}`);return await a.json()}import{readFileSync as ke,writeFileSync as ye,renameSync as Ee,mkdirSync as Ae}from"fs";import{dirname as Te,join as ne}from"path";function we(r){return ne(r,"embeddings")}function xe(r){let e=r.indexOf(":");return e>=0?r.slice(e+1):r}function ie(r,e,o){let s=xe(o);return ne(we(r),e,s.slice(0,2),`${s.slice(2)}.f32`)}function We(r,e,o){try{let s=ke(ie(r,e,o)),t=new Float32Array(Math.floor(s.length/4));for(let a=0;a<t.length;a++)t[a]=s.readFloatLE(a*4);return t}catch{return null}}function qe(r,e,o,s){try{let t=ie(r,e,o);Ae(Te(t),{recursive:!0});let a=Buffer.alloc(s.length*4);for(let f=0;f<s.length;f++)a.writeFloatLE(s[f],f*4);let m=`${t}.tmp`;ye(m,a),Ee(m,t)}catch(t){C(`[embed] Failed to cache vector: ${t instanceof Error?t.message:String(t)}`,"EMBED_CACHE_WRITE_FAILED")}}export{De as a,Oe as b,je as c,We as d,qe as e};