@testmuai/kane-cli 0.8.13 → 0.8.15

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 (304) hide show
  1. package/dist/{ChatSurface-B6ZIO3JL.js → ChatSurface-2GPR4S7I.js} +3 -3
  2. package/dist/{ChromeProfilePicker-QSICCUMV.js → ChromeProfilePicker-XAZGCJKR.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-LLLNSKW2.js → CliFeedbackPrompt-4SILDU7S.js} +1 -1
  4. package/dist/{CliUploadProgress-N5IY66T2.js → CliUploadProgress-OAQBY55Y.js} +1 -1
  5. package/dist/{ConfigView-UQIRPENS.js → ConfigView-FDBMJC26.js} +1 -1
  6. package/dist/EvidenceViewOffer-YSNRKKPC.js +2 -0
  7. package/dist/FolderPicker-XCTJ5447.js +2 -0
  8. package/dist/{InfoBox-ZGSLEOPE.js → InfoBox-ZPUBB7J4.js} +1 -1
  9. package/dist/{LinksBox-JFT44YUK.js → LinksBox-MNNNOH23.js} +1 -1
  10. package/dist/{ProfilesView-WZSPK3HF.js → ProfilesView-GY5QCIT3.js} +1 -1
  11. package/dist/{ProjectPicker-SBBGVF4L.js → ProjectPicker-UCHMCNFV.js} +1 -1
  12. package/dist/{SaveSessionPrompt-F3563T3C.js → SaveSessionPrompt-ATVHKAHN.js} +1 -1
  13. package/dist/ScrollbackTap-QHJOFYMC.js +2 -0
  14. package/dist/SingleShotApp-IPNZBFXB.js +2 -0
  15. package/dist/{SummaryBox-6N6NESLI.js → SummaryBox-2DTNE25L.js} +1 -1
  16. package/dist/TestMdRunView-2FQIEI5W.js +2 -0
  17. package/dist/{TestrunEvidenceTable-JLJBJ76Q.js → TestrunEvidenceTable-6UE5EMON.js} +1 -1
  18. package/dist/{WhoamiView-PNVUCWLB.js → WhoamiView-TFCHIOW5.js} +1 -1
  19. package/dist/agent-parse-XMWVKCRD.js +2 -0
  20. package/dist/{app-download-NNB52ZRJ.js → app-download-N7MLJQ42.js} +1 -1
  21. package/dist/attach-target-V6LECVES.js +2 -0
  22. package/dist/{auth-JIDDELKY.js → auth-IQPCVCZK.js} +1 -1
  23. package/dist/{binary-LXYAW7WQ.js → binary-VML7EGV4.js} +1 -1
  24. package/dist/bind-YV6V5AI6.js +15 -0
  25. package/dist/{bootstrap-THOC3SS7.js → bootstrap-KCPWDBLX.js} +1 -1
  26. package/dist/bridge-5UKX7YIO.js +2 -0
  27. package/dist/{changelog-BSMZXLTG.js → changelog-CJFWGRIL.js} +1 -1
  28. package/dist/chat-committer-HDE3TP5I.js +2 -0
  29. package/dist/chat-controller-3EPK7UZG.js +2 -0
  30. package/dist/chunk-27ERHOW3.js +2 -0
  31. package/dist/{chunk-RN5ERSV2.js → chunk-2WRBCTNM.js} +1 -1
  32. package/dist/chunk-3D5MKSG3.js +5 -0
  33. package/dist/{chunk-FNIL4G3V.js → chunk-3GELV4IN.js} +3 -3
  34. package/dist/{chunk-EEFZXZTZ.js → chunk-3IXEARDX.js} +1 -1
  35. package/dist/chunk-3N6IAVD5.js +7 -0
  36. package/dist/{chunk-DXFMELKC.js → chunk-4TMQTSIO.js} +1 -1
  37. package/dist/chunk-52WM3XYO.js +4 -0
  38. package/dist/{chunk-R7QAS6LZ.js → chunk-55YDTPB7.js} +1 -1
  39. package/dist/{chunk-477DYMXZ.js → chunk-5HTSKF5K.js} +1 -1
  40. package/dist/{chunk-IDX3TOPY.js → chunk-5LJRZI7S.js} +1 -1
  41. package/dist/chunk-66MOZKD2.js +2 -0
  42. package/dist/chunk-6DHEOPXX.js +9 -0
  43. package/dist/{chunk-NU45ROHH.js → chunk-6GLFQHSW.js} +2 -2
  44. package/dist/chunk-6K4FDYMH.js +89 -0
  45. package/dist/{chunk-7GUFVQOQ.js → chunk-6L5RV62W.js} +1 -1
  46. package/dist/{chunk-TDNM22BQ.js → chunk-74FHTDEE.js} +1 -1
  47. package/dist/chunk-7EGIX6Y4.js +8 -0
  48. package/dist/chunk-7O54QURK.js +2 -0
  49. package/dist/chunk-7WDPU33M.js +2 -0
  50. package/dist/{chunk-BTBUIL4Q.js → chunk-7X4R6464.js} +1 -1
  51. package/dist/{chunk-FUP4AP6J.js → chunk-A557OSRS.js} +1 -1
  52. package/dist/chunk-AHXOKBVE.js +7 -0
  53. package/dist/{chunk-DNNZ353O.js → chunk-ALCE5RLK.js} +1 -1
  54. package/dist/{chunk-I75FRXKE.js → chunk-AYJ2YZP5.js} +1 -1
  55. package/dist/chunk-BMVE73M7.js +21 -0
  56. package/dist/chunk-CAOZKSQ3.js +8 -0
  57. package/dist/{chunk-BJAHVN2F.js → chunk-CNPIJFZM.js} +1 -1
  58. package/dist/{chunk-EV64VI66.js → chunk-CRZUBDJ3.js} +1 -1
  59. package/dist/{chunk-PUM5J56E.js → chunk-D6GBOFK5.js} +1 -1
  60. package/dist/{chunk-YEZYO5QH.js → chunk-DMCEGMGB.js} +1 -1
  61. package/dist/{chunk-TMRLBSIA.js → chunk-DMT3W26F.js} +1 -1
  62. package/dist/{chunk-XS3HIVNS.js → chunk-EDQZIEPJ.js} +1 -1
  63. package/dist/{chunk-VJ3ES3RR.js → chunk-EFTRH35G.js} +1 -1
  64. package/dist/{chunk-Q4YAJJPP.js → chunk-EJXBKCNF.js} +1 -1
  65. package/dist/{chunk-NUWOQS6L.js → chunk-EPE2ELDH.js} +1 -1
  66. package/dist/{chunk-WIAZN7G4.js → chunk-FFVNISYH.js} +1 -1
  67. package/dist/chunk-FQNQVC5O.js +5 -0
  68. package/dist/chunk-FXO7JKMZ.js +4 -0
  69. package/dist/chunk-GP7WD4UY.js +4 -0
  70. package/dist/{chunk-K2UEVCIJ.js → chunk-GSDXZS4U.js} +1 -1
  71. package/dist/{chunk-J2UN2AHO.js → chunk-GZ65ZA4C.js} +1 -1
  72. package/dist/chunk-H6TNBKGR.js +5 -0
  73. package/dist/{chunk-GILD6RGH.js → chunk-HLCETZ73.js} +1 -1
  74. package/dist/chunk-HOA4VWSD.js +5 -0
  75. package/dist/{chunk-33GXXC2L.js → chunk-HYTBEPC2.js} +1 -1
  76. package/dist/{chunk-PWRIG6UB.js → chunk-IAHOLH5W.js} +1 -1
  77. package/dist/chunk-IE3OO5GI.js +2 -0
  78. package/dist/{chunk-UF4JZXEE.js → chunk-JCMHB4KH.js} +1 -1
  79. package/dist/{chunk-KV5BOFPK.js → chunk-JFUFWICY.js} +2 -2
  80. package/dist/{chunk-FE6XRABM.js → chunk-JGAMMOUC.js} +1 -1
  81. package/dist/{chunk-CAO3XRA2.js → chunk-JL3L6KOG.js} +1 -1
  82. package/dist/chunk-JQCOKL6U.js +15 -0
  83. package/dist/{chunk-IZU5ND2C.js → chunk-JSS22MFY.js} +9 -9
  84. package/dist/chunk-JVEZBJJ7.js +2 -0
  85. package/dist/{chunk-3SP4JVDN.js → chunk-KALEPJAV.js} +2 -2
  86. package/dist/{chunk-AIVOYTYQ.js → chunk-KUS324VE.js} +1 -1
  87. package/dist/chunk-KZG4E5RM.js +2 -0
  88. package/dist/{chunk-KSLJOUH4.js → chunk-LJGAXIDU.js} +1 -1
  89. package/dist/chunk-M36MOFJW.js +9 -0
  90. package/dist/{chunk-ZOSY2PJM.js → chunk-MLYNVJNH.js} +1 -1
  91. package/dist/{chunk-XL6HDWM3.js → chunk-N3CVR4Z2.js} +1 -1
  92. package/dist/{chunk-2X3TANEV.js → chunk-NLEA6NPU.js} +1 -1
  93. package/dist/{chunk-4PARDPK2.js → chunk-NUJVYAI4.js} +1 -1
  94. package/dist/{chunk-3M2D7UUI.js → chunk-NWNG5UWD.js} +1 -1
  95. package/dist/{chunk-IWVA37B6.js → chunk-O25AL4B7.js} +1 -1
  96. package/dist/{chunk-KAZGHWGK.js → chunk-O3XBIURC.js} +1 -1
  97. package/dist/chunk-O66WXOOC.js +5 -0
  98. package/dist/{chunk-W2UYUV47.js → chunk-OFWJBOGT.js} +2 -2
  99. package/dist/{chunk-DMLYUTS4.js → chunk-OGDAWNFY.js} +1 -1
  100. package/dist/chunk-OPL2MIQG.js +2 -0
  101. package/dist/{chunk-F5AI3UVS.js → chunk-ORQGQSWG.js} +2 -2
  102. package/dist/{chunk-7KIIM6H7.js → chunk-OWGFFJKK.js} +1 -1
  103. package/dist/{chunk-6AZNGOLH.js → chunk-PGXJ275T.js} +1 -1
  104. package/dist/chunk-Q77QO3PC.js +17 -0
  105. package/dist/{chunk-XH2KDLZO.js → chunk-QVLYK5JL.js} +1 -1
  106. package/dist/{chunk-UZCSVEWP.js → chunk-QXRT6HSV.js} +1 -1
  107. package/dist/{chunk-LWQNRZH3.js → chunk-R7QMZBBH.js} +1 -1
  108. package/dist/{chunk-DIM5X2FR.js → chunk-RI4ILZZC.js} +1 -1
  109. package/dist/{chunk-D4G3SEBU.js → chunk-RQILLYSP.js} +1 -1
  110. package/dist/chunk-S4JUCBCT.js +7 -0
  111. package/dist/{chunk-VYMMGWVO.js → chunk-SHSXOYKT.js} +1 -1
  112. package/dist/{chunk-XAM5E27U.js → chunk-SIYSKT6I.js} +1 -1
  113. package/dist/chunk-SWTJMTBY.js +29 -0
  114. package/dist/chunk-T4R26WER.js +9 -0
  115. package/dist/{chunk-O5U6EAL3.js → chunk-TCAHDVII.js} +1 -1
  116. package/dist/{chunk-LAQBCZ5A.js → chunk-TEHZUSUY.js} +1 -1
  117. package/dist/chunk-TNBF5OMZ.js +2 -0
  118. package/dist/chunk-TU6IMGWO.js +2 -0
  119. package/dist/{chunk-NM76SG3S.js → chunk-TVELOH5A.js} +1 -1
  120. package/dist/chunk-UHSNUUX3.js +35 -0
  121. package/dist/{chunk-5G22NOZK.js → chunk-UHT5SVP5.js} +1 -1
  122. package/dist/{chunk-KXUTO5WC.js → chunk-UZIMYV5U.js} +1 -1
  123. package/dist/chunk-VOTIGXQ4.js +16 -0
  124. package/dist/{chunk-MXDWS7S4.js → chunk-VZDLRJ5N.js} +7 -7
  125. package/dist/{chunk-3FXNQTCE.js → chunk-W77SZLFC.js} +1 -1
  126. package/dist/{chunk-OHK6V7JX.js → chunk-WFBJNVMQ.js} +1 -1
  127. package/dist/{chunk-N2I23ANS.js → chunk-WNB2IYHY.js} +1 -1
  128. package/dist/chunk-XSUJJB7Z.js +11 -0
  129. package/dist/{chunk-TXZ66K4Q.js → chunk-XUJXGE42.js} +1 -1
  130. package/dist/{chunk-AQWTK6IN.js → chunk-XXE7W5AV.js} +1 -1
  131. package/dist/{chunk-EXLXV5OU.js → chunk-YAAQER2L.js} +1 -1
  132. package/dist/{chunk-XS2LZFCH.js → chunk-YCH7H7JX.js} +1 -1
  133. package/dist/{chunk-SEKJZOKW.js → chunk-YGMUNNKH.js} +1 -1
  134. package/dist/{chunk-ARU6KAGY.js → chunk-YKYKOV6U.js} +1 -1
  135. package/dist/chunk-YLQHY4A7.js +2 -0
  136. package/dist/{chunk-KGKJU27A.js → chunk-YYYQ5MVD.js} +1 -1
  137. package/dist/chunk-YZVR7ESF.js +2 -0
  138. package/dist/{chunk-PYQS5ST6.js → chunk-Z3YYMZHT.js} +2 -2
  139. package/dist/{chunk-QD2BUO5M.js → chunk-Z73ZYROU.js} +1 -1
  140. package/dist/{chunk-JX2CAVX6.js → chunk-ZCSEBT2W.js} +1 -1
  141. package/dist/{chunk-MCKBJIBB.js → chunk-ZEVU2OT3.js} +1 -1
  142. package/dist/{chunk-K4SULRBL.js → chunk-ZKCCG3GK.js} +1 -1
  143. package/dist/chunk-ZUZ6QJRA.js +23 -0
  144. package/dist/committer-IYQPXG6C.js +2 -0
  145. package/dist/{config-BCGD2FEX.js → config-UGCWZGH5.js} +1 -1
  146. package/dist/cover-cmd-SWJ2NZUZ.js +3 -0
  147. package/dist/{credentials-YNH5BU2Z.js → credentials-GWLYYRTL.js} +1 -1
  148. package/dist/{deps-bundle-LOFI4DAJ.js → deps-bundle-VNGC2UG6.js} +1 -1
  149. package/dist/{deps-resolve-GA6IPHVZ.js → deps-resolve-YLCEU6I7.js} +1 -1
  150. package/dist/design-committer-J57IAAA5.js +2 -0
  151. package/dist/dispatch-OMQCT7WO.js +2 -0
  152. package/dist/{doctor-W5TQBYB5.js → doctor-B4Z6RPKQ.js} +1 -1
  153. package/dist/docx-convert-WPZS6OIC.js +2 -0
  154. package/dist/{dossier-Y6TJWFZU.js → dossier-UGJMYYAB.js} +1 -1
  155. package/dist/evidence-XJGXVLO5.js +2 -0
  156. package/dist/evolve-cmd-QQQPPGL3.js +2 -0
  157. package/dist/explain-H5HJEDEF.js +2 -0
  158. package/dist/{explain-cmd-XCRO4AS6.js → explain-cmd-R45I5MT7.js} +1 -1
  159. package/dist/explain-cmd-XVE6Z67Q.js +9 -0
  160. package/dist/extract-bind-7IDQS4QP.js +14 -0
  161. package/dist/{extract-cmd-7FKQJNS7.js → extract-cmd-KIEOBRIT.js} +3 -3
  162. package/dist/feeder-RSHMGW6B.js +2 -0
  163. package/dist/gaps-cmd-RGIPUSIR.js +3 -0
  164. package/dist/{generate-headless-OBMB5CSB.js → generate-headless-XGRIDD6O.js} +2 -2
  165. package/dist/headless-io-3A3BZVQ5.js +2 -0
  166. package/dist/index.js +187 -206
  167. package/dist/ingest-QGLVY7ND.js +2 -0
  168. package/dist/ingest-cmd-R5H5SF5K.js +2 -0
  169. package/dist/install-W3VPVPAQ.js +2 -0
  170. package/dist/interactive-bind-X5DVLRRW.js +26 -0
  171. package/dist/lifecycle-cmd-6R2PR2HM.js +2 -0
  172. package/dist/{list-cmd-V3HJ5K4O.js → list-cmd-QCIYKWYQ.js} +1 -1
  173. package/dist/{list-commands-SH4HPFI4.js → list-commands-VRRCVWKO.js} +1 -1
  174. package/dist/{locks-cmd-CSVSWY2Y.js → locks-cmd-67OHQZNV.js} +1 -1
  175. package/dist/logical-ids-DN6IZSUM.js +2 -0
  176. package/dist/login-flow-5HL2QYEL.js +2 -0
  177. package/dist/maintenance-cmd-GZ4EMT3V.js +2 -0
  178. package/dist/{mobile-prompts-UZTRJ3L7.js → mobile-prompts-CMIVWDHQ.js} +1 -1
  179. package/dist/objective-variable-gate-EEYJ6B3X.js +2 -0
  180. package/dist/open-provider-UFSCTIQQ.js +2 -0
  181. package/dist/pdf-convert-5H4HQNN3.js +2 -0
  182. package/dist/{persist-recorded-session-QMRY4DOF.js → persist-recorded-session-JXL5E53A.js} +1 -1
  183. package/dist/phase-seed-HKJ2EF7R.js +2 -0
  184. package/dist/pipeline-RSCRNNPW.js +2 -0
  185. package/dist/prepare-target-XZ3FTVBW.js +2 -0
  186. package/dist/readmodel-IBFRM6EO.js +2 -0
  187. package/dist/reconcile-cmd-4VRTUM2D.js +2 -0
  188. package/dist/reconcile-deps-ZCJ2QCK5.js +4 -0
  189. package/dist/reconcile-engine-IVLZCYZB.js +2 -0
  190. package/dist/{recording-banner-7E75ERQJ.js → recording-banner-SRLPSTFP.js} +1 -1
  191. package/dist/records-TJJJWBUD.js +2 -0
  192. package/dist/registry-CPQHW2L2.js +2 -0
  193. package/dist/{require-project-folder-LBUYWQOF.js → require-project-folder-SKEZMSN7.js} +1 -1
  194. package/dist/{resolve-run-intent-GHISMXLZ.js → resolve-run-intent-THC3EPAX.js} +1 -1
  195. package/dist/{resolver-7JC5VZ4S.js → resolver-2NUNLK7N.js} +1 -1
  196. package/dist/revert-6BBBK3I4.js +2 -0
  197. package/dist/review-cmd-BMJQZ6XJ.js +5 -0
  198. package/dist/run-TURFDLC6.js +2 -0
  199. package/dist/run-UDP5VPYS.js +2 -0
  200. package/dist/{run-test-md-5LPCKCW7.js → run-test-md-MRYNFNPO.js} +2 -2
  201. package/dist/sessions-NH7WQWMX.js +2 -0
  202. package/dist/{sessions-cmd-VDQGRBEM.js → sessions-cmd-DV442ZCY.js} +1 -1
  203. package/dist/{skill-installer-YQPZZB7I.js → skill-installer-CVJ5VTEJ.js} +1 -1
  204. package/dist/{spawner-X2FOOONV.js → spawner-7FUA3JXA.js} +1 -1
  205. package/dist/store-guard-XQ5MSUB2.js +2 -0
  206. package/dist/structured-answers-NADW6D44.js +5 -0
  207. package/dist/sync-cmd-5INKTZN2.js +2 -0
  208. package/dist/sync-setup-4R54VRAO.js +2 -0
  209. package/dist/sync-setup-ui-RC727VK6.js +3 -0
  210. package/dist/tcg-generate-2BOPGRM6.js +2 -0
  211. package/dist/testmd-actions-2CPJZAC2.js +2 -0
  212. package/dist/testmd-sync-HYZI6NRM.js +2 -0
  213. package/dist/token-refresh-NTE4LQRN.js +2 -0
  214. package/dist/{validate-basic-GTSVZFQI.js → validate-basic-OKLJLDML.js} +1 -1
  215. package/dist/{variable-receipt-IHQAYWMZ.js → variable-receipt-CMCDUJI2.js} +1 -1
  216. package/dist/verdicts-EMCYGQWM.js +2 -0
  217. package/dist/{version-check-IPEPJZDX.js → version-check-4DQJBSXW.js} +1 -1
  218. package/dist/{view-cmd-SXXNDZIC.js → view-cmd-P3XRFORJ.js} +1 -1
  219. package/dist/walk-session-MUGS6CZY.js +2 -0
  220. package/dist/with-telemetry-3T53GIQC.js +2 -0
  221. package/package.json +12 -11
  222. package/dist/EvidenceViewOffer-AZRAILJQ.js +0 -2
  223. package/dist/FolderPicker-OJFR7AKZ.js +0 -2
  224. package/dist/ScrollbackTap-Q3IOKNMS.js +0 -2
  225. package/dist/SingleShotApp-72D5VVLE.js +0 -2
  226. package/dist/TestMdRunView-4OA52DA2.js +0 -2
  227. package/dist/bind-F36JFHUK.js +0 -12
  228. package/dist/bridge-KMDML2NB.js +0 -2
  229. package/dist/chat-committer-RAOIL2T6.js +0 -2
  230. package/dist/chat-controller-YJCNU76T.js +0 -2
  231. package/dist/chunk-4WOVHRI2.js +0 -15
  232. package/dist/chunk-54JZ6VEW.js +0 -4
  233. package/dist/chunk-5DT7PIGB.js +0 -5
  234. package/dist/chunk-6FCPS2VT.js +0 -4
  235. package/dist/chunk-6IAA644J.js +0 -9
  236. package/dist/chunk-6J635CRI.js +0 -5
  237. package/dist/chunk-AGRUULPT.js +0 -4
  238. package/dist/chunk-BZTWTYQQ.js +0 -6
  239. package/dist/chunk-CUSTYILP.js +0 -2
  240. package/dist/chunk-DBIBROYW.js +0 -5
  241. package/dist/chunk-I27YRAGO.js +0 -7
  242. package/dist/chunk-IAHKTEET.js +0 -2
  243. package/dist/chunk-IVQX3AKL.js +0 -4
  244. package/dist/chunk-J3Q63NFG.js +0 -2
  245. package/dist/chunk-K6RAOZHP.js +0 -4
  246. package/dist/chunk-KO3FL2XW.js +0 -26
  247. package/dist/chunk-L32DKFRQ.js +0 -16
  248. package/dist/chunk-LPDBTGO5.js +0 -21
  249. package/dist/chunk-N7Z7BQYO.js +0 -3
  250. package/dist/chunk-NVGBE2DR.js +0 -2
  251. package/dist/chunk-OS4VSIHT.js +0 -4
  252. package/dist/chunk-OTMAFCZK.js +0 -8
  253. package/dist/chunk-P5MJMM3X.js +0 -85
  254. package/dist/chunk-QQ5MHSSY.js +0 -2
  255. package/dist/chunk-T7DGNWI2.js +0 -17
  256. package/dist/chunk-UH2ZTX4E.js +0 -2
  257. package/dist/chunk-W3Z7AZNT.js +0 -4
  258. package/dist/chunk-WUV3FJ7C.js +0 -11
  259. package/dist/chunk-XMTSHHYQ.js +0 -4
  260. package/dist/committer-C6UCDYMC.js +0 -2
  261. package/dist/cover-cmd-5LPHIOSI.js +0 -3
  262. package/dist/design-committer-UPC6NZUF.js +0 -2
  263. package/dist/dispatch-FRCPK3AZ.js +0 -2
  264. package/dist/docx-convert-BIV5T7F5.js +0 -2
  265. package/dist/evidence-FHO36EEV.js +0 -2
  266. package/dist/evolve-cmd-6RXLKERE.js +0 -2
  267. package/dist/explain-3HAZY7Q6.js +0 -2
  268. package/dist/explain-cmd-RMJPXD4U.js +0 -9
  269. package/dist/extract-bind-BFJPRNPQ.js +0 -10
  270. package/dist/feeder-IOR3XRNF.js +0 -2
  271. package/dist/gaps-cmd-FDJ3PT4C.js +0 -3
  272. package/dist/headless-io-66RG5NN5.js +0 -2
  273. package/dist/ingest-TTUQ7UDK.js +0 -2
  274. package/dist/ingest-cmd-AV66Q5LC.js +0 -2
  275. package/dist/install-SFJ2FFQ6.js +0 -2
  276. package/dist/interactive-bind-N5AQB26T.js +0 -25
  277. package/dist/lifecycle-cmd-KSMETBPP.js +0 -2
  278. package/dist/logical-ids-MLXAH45L.js +0 -2
  279. package/dist/login-flow-ODVWEPRU.js +0 -2
  280. package/dist/maintenance-cmd-VFYGKY3X.js +0 -2
  281. package/dist/objective-variable-gate-3VUXNDCZ.js +0 -2
  282. package/dist/pdf-convert-OZIRUADA.js +0 -2
  283. package/dist/phase-seed-BMOSAA74.js +0 -2
  284. package/dist/pipeline-5FHWZAXK.js +0 -2
  285. package/dist/prepare-target-UJEY2FSR.js +0 -2
  286. package/dist/readmodel-TDRFVDVI.js +0 -2
  287. package/dist/reconcile-cmd-2QHZML2L.js +0 -2
  288. package/dist/reconcile-deps-ZBWUY3SM.js +0 -4
  289. package/dist/reconcile-engine-YC4RQYF2.js +0 -2
  290. package/dist/records-JLS63SDI.js +0 -2
  291. package/dist/registry-JJTRUPH7.js +0 -2
  292. package/dist/revert-PRR3D4XM.js +0 -2
  293. package/dist/review-cmd-SAGIKWEW.js +0 -4
  294. package/dist/run-43ACVPJK.js +0 -2
  295. package/dist/run-EOTOXNQO.js +0 -2
  296. package/dist/sessions-GIEXOCE4.js +0 -2
  297. package/dist/structured-answers-YAVW65G4.js +0 -5
  298. package/dist/tcg-generate-V4QRNEZV.js +0 -2
  299. package/dist/testmd-actions-2UMU3QMV.js +0 -2
  300. package/dist/testmd-sync-UBXDLWYD.js +0 -2
  301. package/dist/token-refresh-NL5AM446.js +0 -2
  302. package/dist/verdicts-QU6W3TUF.js +0 -2
  303. package/dist/walk-session-7JVB4Z5S.js +0 -2
  304. package/dist/with-telemetry-LRI7H6DH.js +0 -2
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{b as V}from"./chunk-HYTBEPC2.js";import{existsSync as R,readdirSync as D,readFileSync as S}from"fs";import{join as b}from"path";var T="--variables",E=["global","smart","environment","secrets","totp"],F=/^[a-z][a-z0-9_]*$/;function M(e){return typeof e=="string"?e.trim().length>0:typeof e=="number"&&Number.isFinite(e)}function p(e,t,n){let r=JSON.parse(e);if(!(!r||typeof r!="object")){for(let[o,i]of Object.entries(r))if(i&&typeof i=="object"&&"value"in i){let c={has_value:M(i.value),source:t};n.set(u(o),c)}}}function w(e,t){if(!R(e))return;let n;try{n=D(e).filter(r=>r.endsWith(".json")).sort()}catch{return}for(let r of n){let o=b(e,r);try{p(S(o,"utf-8"),o,t)}catch{}}}function W(e){return{globalDir:b(V,"variables"),localDir:b(e,".testmuai","variables")}}function q(e){let t=new Map;if(w(e.globalDir,t),w(e.localDir,t),e.file&&R(e.file))try{p(S(e.file,"utf-8"),e.file,t)}catch{}if(e.inline)try{p(e.inline,T,t)}catch{}return t}function m(e){let t=e.trim();if(!t)return null;let n=t.split(/[.[]/).map(r=>r.trim()).filter(Boolean);return n.length===0||E.includes(n[0])?null:n[0]}function u(e){let t=/^(?:global|secrets\.user|environment)\.(.+)$/.exec(e);return t?t[1]:e}function H(e){if(!e||!e.trim())return"variable name is empty";let t=e.split(".")[0];return E.includes(t)?`'${e}' starts with a runtime namespace (global/secrets/smart/environment/totp) \u2014 declare the bare name`:F.test(e)?null:`'${e}' is not lower_snake_case (letters, digits, underscores; starts with a letter)`}import{basename as z}from"path";var ee="objective",C=/(\\?)\{\{\s*([^{}]+?)\s*\}\}/g;function v(e){let t=[];if(!e)return t;for(let n of e.matchAll(C)){if(n[1])continue;let r=m(n[2]??"");r&&!t.includes(r)&&t.push(r)}return t}var $=/(\\?)\$\{\s*([^{}]+?)\s*\}/g;function B(e){let t=[];if(!e)return t;for(let n of e.matchAll($)){if(n[1])continue;let r=(n[2]??"").split(/[.[]/)[0]?.trim()??"";r&&!t.includes(r)&&t.push(r)}return t}function te(e,t,n){return U(e.map(({text:r,usedBy:o})=>B(r).filter(i=>!t.has(i)).map(i=>({name:i,reason:"not_a_dataset_column",dataset:n,used_by:[o]}))))}var P=/\b(?:store|save|extract|remember|capture)\b/i,Z=/\bas\s+(?:['"`]([A-Za-z_][A-Za-z0-9_]*)['"`]|([A-Za-z_][A-Za-z0-9_]*)(?=\s*(?:,|$)))/gi,J=new Set(["a","an","the"]);function I(e){let t=[];if(!e)return t;for(let n of e.split(/[.;\n]/))if(P.test(n))for(let r of n.matchAll(Z)){let o=r[1]??r[2];!o||J.has(o.toLowerCase())||t.includes(o)||t.push(o)}return t}function A(e,t,n){let r=t.get(e);return r?r.has_value?null:{name:e,reason:"value_missing",file:r.source,used_by:[n]}:{name:e,reason:"not_declared",used_by:[n]}}function re(e,t,n,r=[]){let o=new Set([...r,...I(e)]),i=[];for(let c of v(e)){if(o.has(c))continue;let l=A(c,t,n);l&&i.push(l)}return i}function ne(e,t,n={}){let r=e.rootGlobal.variables??{},o=new Set(n.produced??[]),i=n.authorFrom??0,c=[];for(let l of e.steps){let k=l.flatIndex-1>=i,f=I(l.objective);if(!k){for(let s of f)o.add(s);continue}let j={file:z(l.sourceFile),step:l.flatIndex},N=l.config.variables??{},d=new Map,_=s=>m(u(s))??u(s);for(let[s,a]of Object.entries(r))d.set(_(s),a.value);for(let[s,a]of Object.entries(N))d.set(_(s),a.value);let g=new Set,y=(s,a)=>{if(o.has(s)||f.includes(s))return;let h=d.get(s);if(h===void 0){g.add(s);return}if(a.has(s)){g.add(s);return}a.add(s);for(let O of v(h))y(O,a);a.delete(s)};for(let s of v(l.objective))y(s,new Set);let x=[];for(let s of g){let a=A(s,t,j);a&&x.push(a)}c.push(x);for(let s of f)o.add(s)}return U(c)}function se(e){let t=new Set,n=e&&typeof e=="object"?e:null;for(let r of n?.prior_runs??[])for(let o of Object.keys(r.variables??{}))t.add(o);return[...t]}function U(e){let t=new Map;for(let n of e)for(let r of n){let o=t.get(r.name);o?o.used_by.push(...r.used_by):t.set(r.name,{...r,used_by:[...r.used_by]})}return[...t.values()].sort((n,r)=>n.name<r.name?-1:1)}export{T as a,W as b,q as c,H as d,ee as e,v as f,te as g,re as h,ne as i,se as j,U as k};
@@ -1,6 +1,6 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as y}from"./chunk-WD52ZNQY.js";import{b as l,d,e as m,g,h as S}from"./chunk-4WOVHRI2.js";import{a as f}from"./chunk-ZOSY2PJM.js";import{r as u,s as p}from"./chunk-RSSOJ3L2.js";import{existsSync as s,mkdirSync as h,readFileSync as C,renameSync as w,writeFileSync as R}from"fs";import{join as x}from"path";function G(e){y(l(e));let r=l(e);if(!s(r))return;let n=x(r,"meta.json"),o=m(e);if(s(n)&&!s(o))try{h(d(e),{recursive:!0}),w(n,o)}catch(t){process.stderr.write(`warn: meta.json migration failed: ${t.message}
2
+ import{b as y}from"./chunk-WD52ZNQY.js";import{b as l,d,e as m,g,h as S}from"./chunk-JQCOKL6U.js";import{a as f}from"./chunk-MLYNVJNH.js";import{r as u,s as p}from"./chunk-RSSOJ3L2.js";import{existsSync as s,mkdirSync as h,readFileSync as C,renameSync as w,writeFileSync as R}from"fs";import{join as x}from"path";function G(e){y(l(e));let r=l(e);if(!s(r))return;let n=x(r,"meta.json"),o=m(e);if(s(n)&&!s(o))try{h(d(e),{recursive:!0}),w(n,o)}catch(t){process.stderr.write(`warn: meta.json migration failed: ${t.message}
3
3
  `)}let a=S(e);if(s(a)){let t="python";try{let i=new f().load();i.code_export?.language&&(t=i.code_export.language)}catch{}let c=g(e,"playwright",t);if(!s(c))try{w(a,c)}catch(i){process.stderr.write(`warn: generated-code migration failed: ${i.message}
4
4
  `)}}if(s(o))try{let t=JSON.parse(C(o,"utf8"));"md5sum"in t&&(delete t.md5sum,R(o,JSON.stringify(t,null,2)+`
5
5
  `,"utf8"))}catch(t){process.stderr.write(`warn: meta.json md5sum strip failed: ${t.message}
6
- `)}}async function O(e){if(!e.isInteractive)return{recovered:!1};if(E(e.creds))return{recovered:!1};let{SingleShotApp:r}=await import("./SingleShotApp-72D5VVLE.js"),{ScrollbackProvider:n}=await import("./scrollback-JLPJR25X.js"),{render:o}=await import("./build-JIKYOZUH.js"),a=await import("./react-QWOAB3TB.js"),t={current:null},c={current:!1},{waitUntilExit:i,unmount:v}=o(a.default.createElement(n,null,a.default.createElement(r,{resultRef:t,mode:"login",loginCompleteRef:c})),{exitOnCtrlC:!1});p(()=>v()),await i();try{process.stdin.setRawMode?.(!1)}catch{}return process.stdout.write("\x1B[?25h"),c.current?{recovered:!0}:(u(0,"Startup gate cancelled"),{recovered:!1})}function E(e){let r=e.getActiveProfile(),n=e.getDefaultEnv();if(!r||!!!(e.loadBasicAuth(r,n)||e.loadCredentials(r,n)))return!1;let a=e.loadProfileConfig(r,n)??{};return!!a.project_id&&!!a.folder_id}export{G as a,O as b};
6
+ `)}}async function O(e){if(!e.isInteractive)return{recovered:!1};if(E(e.creds))return{recovered:!1};let{SingleShotApp:r}=await import("./SingleShotApp-IPNZBFXB.js"),{ScrollbackProvider:n}=await import("./scrollback-JLPJR25X.js"),{render:o}=await import("./build-JIKYOZUH.js"),a=await import("./react-QWOAB3TB.js"),t={current:null},c={current:!1},{waitUntilExit:i,unmount:v}=o(a.default.createElement(n,null,a.default.createElement(r,{resultRef:t,mode:"login",loginCompleteRef:c})),{exitOnCtrlC:!1});p(()=>v()),await i();try{process.stdin.setRawMode?.(!1)}catch{}return process.stdout.write("\x1B[?25h"),c.current?{recovered:!0}:(u(0,"Startup gate cancelled"),{recovered:!1})}function E(e){let r=e.getActiveProfile(),n=e.getDefaultEnv();if(!r||!!!(e.loadBasicAuth(r,n)||e.loadCredentials(r,n)))return!1;let a=e.loadProfileConfig(r,n)??{};return!!a.project_id&&!!a.folder_id}export{G as a,O as b};
@@ -1,3 +1,3 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as w,b as O}from"./chunk-4PMZ5FCD.js";import{a as I}from"./chunk-KBM3XHAM.js";import{e as L}from"./chunk-IDX3TOPY.js";import{a as N,b as k}from"./chunk-BKM2LWU2.js";import{a as R,b as y,c as T,d as m,e as A,g as b,h as r}from"./chunk-RSSOJ3L2.js";import{b as x}from"./chunk-5EOX4MEY.js";import{a as E}from"./chunk-RZ4F3BHX.js";import{a as g,i as v}from"./chunk-33GXXC2L.js";import{platform as X,arch as Y}from"os";import P from"fs";import M from"fs";import D from"path";var V=1e3,d=0,j=new Set([130,3]),a=class t{ids;logger;opts;ended=!1;createdAt=Date.now();errorState;constructor(e,n={emitted:!1}){this.ids=e.envelope,this.logger=e.logger,this.opts=e,this.errorState=n}get enabled(){return this.logger!==null}event(e,n={}){if(!this.logger)return;e==="ASR_ERROR"&&(this.errorState.emitted=!0);let i=m(this.ids,e,n);this.logger.log(R[e],e,e,C(i))}error(e,n={}){this.logger&&(this.logger.escalate(d),this.event("ASR_ERROR",{...n,error_code:e}))}child(e,n){return new t({...this.opts,envelope:{...this.ids,operation_id:n,parent_operation_id:this.ids.operation_id,verb:"design"}},this.errorState)}async lateBindContext(e){if(!(!this.logger||this.ids.context_instance_id))try{let{ensureStoreIds:n}=await import("./store-id-EOSGEKVK.js"),{ids:i,cloned:s}=n(e);this.ids.context_lineage_id=i.context_lineage_id,this.ids.context_instance_id=i.context_instance_id,s&&this.event("ASR_CONTEXT_CLONED")}catch{}}agentSession(e){this.ids.agent_session_id=e}spawnEnv(){if(!this.opts.telemetryEnabled)return{};let e={TESTMUAI_USER_SESSION_ID:this.ids.session_id,TESTMUAI_OPERATION_ID:this.ids.operation_id,TESTMUAI_CLIENT_VERSION:this.opts.clientVersion,TESTMUAI_TELEMETRY_PROXY_URL:this.opts.proxyUrl};return this.ids.context_instance_id&&(e.TESTMUAI_CONTEXT_INSTANCE_ID=this.ids.context_instance_id),e}traceTee(){return e=>{if(!this.logger)return;let n=typeof e.kind=="string"?e.kind.slice(0,64):"trace",i={...C(m(this.ids,"ASR_CMD_START",{})),trace_kind:n};typeof e.code=="string"&&(i.trace_code=e.code.slice(0,64)),delete i.event,this.logger.logStep(d,`trace_${n}`,n,i)}}wireTrace(e,n,i){if(!this.logger)return;i&&this.agentSession(i);let s=n&&typeof n=="object"?n:{};switch(e){case"spawn":this.event("ASR_AGENT_SPAWN",{tier:s.tier});break;case"session_paused":this.event("ASR_SESSION_PAUSED",s);break;case"commit":this.event("ASR_COMMIT",s);break;default:this.traceTee()({kind:e,code:typeof s.code=="string"?s.code:void 0})}}banner(){return`session: ${this.ids.session_id}`}supportFooter(){return`if this keeps failing, share this id with support: ${this.ids.session_id}`}async end(e){if(!this.ended){if(this.ended=!0,e.duration_ms===void 0&&(e={...e,duration_ms:Date.now()-this.createdAt}),this.logger)if(e.exit_code===0?this.logger.discardSteps(d):this.logger.escalate(d),e.exit_code>0&&!j.has(e.exit_code)&&!this.errorState.emitted&&this.event("ASR_ERROR",{error_code:e.exit_code===2?"usage_exit_unattributed":`exit_${e.exit_code}_unattributed`,exit_code:e.exit_code}),this.event("ASR_CMD_END",e),this.opts.longSession)await this.logger.shutdown();else{let n=await this.logger.flushOnce(V);(n==="failed"||n==="timeout")&&A(this.logger.drainBuffer())}this.logger&&this.writeManifestLine(e.exit_code),r(null)}}writeManifestLine(e){try{let n=x(this.ids.context_instance_id??null);M.mkdirSync(D.dirname(n),{recursive:!0});let i={ts:new Date().toISOString(),session_id:this.ids.session_id,operation_id:this.ids.operation_id,agent_session_id:this.ids.agent_session_id,verb:this.ids.verb,mode:this.ids.mode,exit_code:e};M.appendFileSync(n,JSON.stringify(i)+`
2
+ import{a as w,b as O}from"./chunk-4PMZ5FCD.js";import{a as I}from"./chunk-KBM3XHAM.js";import{f as L}from"./chunk-5LJRZI7S.js";import{a as N,b as k}from"./chunk-BKM2LWU2.js";import{a as R,b as y,c as T,d as m,e as A,g as b,h as r}from"./chunk-RSSOJ3L2.js";import{b as x}from"./chunk-5EOX4MEY.js";import{a as E}from"./chunk-RZ4F3BHX.js";import{a as g,i as v}from"./chunk-HYTBEPC2.js";import{platform as X,arch as Y}from"os";import P from"fs";import M from"fs";import D from"path";var V=1e3,d=0,j=new Set([130,3]),a=class t{ids;logger;opts;ended=!1;createdAt=Date.now();errorState;constructor(e,n={emitted:!1}){this.ids=e.envelope,this.logger=e.logger,this.opts=e,this.errorState=n}get enabled(){return this.logger!==null}event(e,n={}){if(!this.logger)return;e==="ASR_ERROR"&&(this.errorState.emitted=!0);let i=m(this.ids,e,n);this.logger.log(R[e],e,e,C(i))}error(e,n={}){this.logger&&(this.logger.escalate(d),this.event("ASR_ERROR",{...n,error_code:e}))}child(e,n){return new t({...this.opts,envelope:{...this.ids,operation_id:n,parent_operation_id:this.ids.operation_id,verb:"design"}},this.errorState)}async lateBindContext(e){if(!(!this.logger||this.ids.context_instance_id))try{let{ensureStoreIds:n}=await import("./store-id-EOSGEKVK.js"),{ids:i,cloned:s}=n(e);this.ids.context_lineage_id=i.context_lineage_id,this.ids.context_instance_id=i.context_instance_id,s&&this.event("ASR_CONTEXT_CLONED")}catch{}}agentSession(e){this.ids.agent_session_id=e}spawnEnv(){if(!this.opts.telemetryEnabled)return{};let e={TESTMUAI_USER_SESSION_ID:this.ids.session_id,TESTMUAI_OPERATION_ID:this.ids.operation_id,TESTMUAI_CLIENT_VERSION:this.opts.clientVersion,TESTMUAI_TELEMETRY_PROXY_URL:this.opts.proxyUrl};return this.ids.context_instance_id&&(e.TESTMUAI_CONTEXT_INSTANCE_ID=this.ids.context_instance_id),e}traceTee(){return e=>{if(!this.logger)return;let n=typeof e.kind=="string"?e.kind.slice(0,64):"trace",i={...C(m(this.ids,"ASR_CMD_START",{})),trace_kind:n};typeof e.code=="string"&&(i.trace_code=e.code.slice(0,64)),delete i.event,this.logger.logStep(d,`trace_${n}`,n,i)}}wireTrace(e,n,i){if(!this.logger)return;i&&this.agentSession(i);let s=n&&typeof n=="object"?n:{};switch(e){case"spawn":this.event("ASR_AGENT_SPAWN",{tier:s.tier});break;case"session_paused":this.event("ASR_SESSION_PAUSED",s);break;case"commit":this.event("ASR_COMMIT",s);break;default:this.traceTee()({kind:e,code:typeof s.code=="string"?s.code:void 0})}}banner(){return`session: ${this.ids.session_id}`}supportFooter(){return`if this keeps failing, share this id with support: ${this.ids.session_id}`}async end(e){if(!this.ended){if(this.ended=!0,e.duration_ms===void 0&&(e={...e,duration_ms:Date.now()-this.createdAt}),this.logger)if(e.exit_code===0?this.logger.discardSteps(d):this.logger.escalate(d),e.exit_code>0&&!j.has(e.exit_code)&&!this.errorState.emitted&&this.event("ASR_ERROR",{error_code:e.exit_code===2?"usage_exit_unattributed":`exit_${e.exit_code}_unattributed`,exit_code:e.exit_code}),this.event("ASR_CMD_END",e),this.opts.longSession)await this.logger.shutdown();else{let n=await this.logger.flushOnce(V);(n==="failed"||n==="timeout")&&A(this.logger.drainBuffer())}this.logger&&this.writeManifestLine(e.exit_code),r(null)}}writeManifestLine(e){try{let n=x(this.ids.context_instance_id??null);M.mkdirSync(D.dirname(n),{recursive:!0});let i={ts:new Date().toISOString(),session_id:this.ids.session_id,operation_id:this.ids.operation_id,agent_session_id:this.ids.agent_session_id,verb:this.ids.verb,mode:this.ids.mode,exit_code:e};M.appendFileSync(n,JSON.stringify(i)+`
3
3
  `,{flag:"a",mode:384})}catch{}}};function C(t){let e={event:t.event,session_id:t.session_id,operation_id:t.operation_id,verb:t.verb,mode:t.mode,component:t.component,seq:t.seq,context_lineage_id:t.context_lineage_id,context_instance_id:t.context_instance_id};t.parent_operation_id&&(e.parent_operation_id=t.parent_operation_id),t.agent_session_id&&(e.agent_session_id=t.agent_session_id);for(let[n,i]of Object.entries(t.context))e[n]=i;return e}var u=process.env.KANE_TELEMETRY_URL||v;function B(){return process.env.TESTMUAI_BASE_URL?"custom":process.env.TESTMUAI_ENV==="stage"?"stage":"prod"}function _e(t){let e=process.env.KANE_TELEMETRY!=="0"&&(!process.env.VITEST||process.env.KANE_TELEMETRY==="1"),n=t.env??B(),i=null;if(t.resumeSid&&t.contextRoot)try{let o=L(t.contextRoot,t.resumeSid);o?.user_session_id&&(i=o.user_session_id)}catch{}if(!i&&t.applyPlanPath)try{let o=JSON.parse(P.readFileSync(t.applyPlanPath,"utf8"));o.telemetry?.user_session_id&&(i=o.telemetry.user_session_id)}catch{}let s=i!==null;i||(i=y());let l=null,c=null,f=!1;if(t.contextRoot&&P.existsSync(t.contextRoot))if(t.write&&e){let o=k(t.contextRoot);l=o.ids.context_lineage_id,c=o.ids.context_instance_id,f=o.cloned}else{let o=N(t.contextRoot);l=o?.context_lineage_id??null,c=o?.context_instance_id??null}let h={session_id:i,operation_id:T(),context_lineage_id:l,context_instance_id:c,verb:t.verb,mode:t.mode,component:"kane-cli"},_=null;if(e){let o=I(n),S={org_id:o.org_id??"",user_id:o.user_id??"",machine_id:o.machine_id,email:null,email_domain:"",user_type:o.user_type??"unknown",env:o.env,plan:o.plan??"unknown"},U=t.mode==="interactive"||t.mode==="cli"?"cli":"agent";_=new w({proxyUrl:u,sessionId:i,identity:S,device:{cli_version:g,platform:X(),arch:Y(),host_agent:O(),invocation_mode:U},getToken:async()=>null}),t.longSession&&_.start()}let p=new a({envelope:h,logger:_,longSession:!!t.longSession,proxyUrl:u,clientVersion:`kane-cli/${g}`,telemetryEnabled:e});return e&&(r(h),p.event("ASR_CMD_START",{resumed:s,applied_plan:!!t.applyPlanPath}),f&&p.event("ASR_CONTEXT_CLONED"),b(async o=>{try{return(await E(u,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})).ok}catch{return!1}}).catch(()=>{})),p}export{B as a,_e as b};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{d as b}from"./chunk-BZAGVBCX.js";import{B as S}from"./chunk-GP7WD4UY.js";import{M as N,c as k,m as w}from"./chunk-3N6IAVD5.js";import{d as _,f as $}from"./chunk-AKX4VRRR.js";var j=3,F={edit:"edit",reject:"mistake",dedup_dropped:"mistake",approve:"usage",enhance:"directed-edit",add:"directed-edit",default_accepted:"usage",default_overridden:"edit",gap_resolution:"usage",dedup_kept:"usage"};function z(m){let{contextDir:u,graph:o,watermark:v,by:f}=m,{signals:E}=b(u,v),D=E.filter(e=>e.event_id===void 0||o.appliedEvents.has(e.event_id)),s=new Map;for(let e of D){let t=e.event_id??`${e.ts}|${e.id}|${e.verdict}|${e.polarity}`;s.has(`${t}|${e.polarity}|${e.verdict}`)||s.set(`${t}|${e.polarity}|${e.verdict}`,e)}let R=[...s.values()].sort((e,t)=>(e.event_id??e.ts)<(t.event_id??t.ts)?-1:1),i=new Map;for(let e of R){let t=`${e.verdict}|${e.tag??""}`,r=i.get(t)??{verdict:e.verdict,tag:e.tag,events:new Set};r.events.add(e.event_id??e.ts),i.set(t,r)}let d=[],a=[],g=new Set,c=[],y=0;for(let[,e]of[...i.entries()].sort(([t],[r])=>t<r?-1:1)){if(e.events.size<j)continue;let r={derived:!0,statement:`${e.verdict}${e.tag?`/${e.tag}`:""} recurs (${e.events.size} distinct events) \u2014 bias future proposals ${e.verdict==="approve"?"toward":"away from"} this pattern`,learned_from_kind:F[e.verdict]??"usage",learned_from:[...e.events].sort()},h=$("stylenote",r);if(h.length>0)return{record:null,errors:h.map(n=>({code:n.code,detail:n.detail})),minted:0};let p=k("stylenote",r);if(o.hasNode(p))continue;d.push({cid:p,label:_.STYLENOTE,content:r});for(let n of r.learned_from)c.includes(n)||c.push(n);let l=S("stylenote",n=>g.has(n),o.names.keys());l!==null&&(g.add(l),a.push({cid:p,slug:l,by:f})),y+=1}return d.length===0?{record:null,errors:null,minted:0}:{record:N(u,{ts:new Date().toISOString(),proposal_id:null,nodes:d,edges:[],review:[],supersessions:[],source_head_moves:{},...a.length>0?{names:a}:{}},{expectPrev:o.latestHash,intent:{v:1,verb:"distill",args:w({watermark:v,by:f}),pins:{events:c}},provenance:m.provenance}).record,errors:null,minted:y}}export{z as a};
@@ -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-J2UN2AHO.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-GZ65ZA4C.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)+`
@@ -0,0 +1,9 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as br}from"./chunk-OPL2MIQG.js";import{a as yr}from"./chunk-TU6IMGWO.js";import{a as hr}from"./chunk-TNBF5OMZ.js";import{a as gr,b as mr}from"./chunk-HOA4VWSD.js";import{a as fr}from"./chunk-KZG4E5RM.js";import{c as pr,d as ur}from"./chunk-52WM3XYO.js";import{a as cr,d as lr}from"./chunk-BB2W35TW.js";import{a as or,g as xt,h as ir,n as ar,p as dr}from"./chunk-AHXOKBVE.js";import{e as ct,f as jt,g as Tt,h as Le}from"./chunk-BMVE73M7.js";import{A as er,B as qt,C as te,D as it,E as fe,F as tr,G as ne,H as _e,I as at,J as nr,K as Y,L as Fe,M as dt,N as Re,O as rr,P as sr,S as Be,a as Bn,b as Dn,c as Ae,d as Pe,e as le,f as st,g as Hn,h as Gn,i as pe,j as Un,k as qe,l as je,m as Kn,n as ot,o as ue,p as Yn,q as zn,r as Qn,s as Zn,t as At,u as Pt,v as X,w as Te,x as Xn,y as Nt,z as xe}from"./chunk-UHSNUUX3.js";import{b as Fn,d as Ln,g as Ct,h as K}from"./chunk-H6TNBKGR.js";import{a as R,b as Mn,d as ee,e as Ne,h as Jn,i as Vn,k as Wn}from"./chunk-YLQHY4A7.js";import{a as jn,b as Tn,e as xn}from"./chunk-VOTIGXQ4.js";import{b as sn,f as on,h as an,k as dn,l as cn}from"./chunk-SWTJMTBY.js";import{b as Ot,d as ce}from"./chunk-IE3OO5GI.js";import{a as qn}from"./chunk-CH273NAE.js";import{b as ve}from"./chunk-BKM2LWU2.js";import{A as tt,B as nt,C as rt,D as Nn,q as In,r as Sn,s as En,t as On,u as Cn,v as An,w as Pn}from"./chunk-GP7WD4UY.js";import{B as oe,C as wn,D as vn,F as $e,G as Xe,J as $n,K as Ce,O as kn,P as et,U as _n,W as Rn,X as ke,b as rn,c as de,f as Et,h as ln,l as pn,m as un,o as Oe,p as O,q as fn,t as hn,v as gn,x as mn,y as yn,z as bn}from"./chunk-3N6IAVD5.js";import{d as Qe,e as Ze}from"./chunk-AKX4VRRR.js";import{existsSync as Ue,readdirSync as ss,readFileSync as os,realpathSync as Do,statSync as Mo,writeFileSync as Ho}from"fs";import{basename as Rt,join as Ke,relative as Go,resolve as tn}from"path";import{randomBytes as ks}from"crypto";var wr=8,De=()=>Wn(ks(8).toString("hex")),vr=(e,t)=>e!==null&&Buffer.from(e).equals(Buffer.from(t)),_s=[["P1 exclusive create",async e=>{for(let t=1;t<=2;t++){let n=De(),r=Buffer.from(`probe ${t} first`);if(await e.putIfAbsent(n,r)!=="created")return"a fresh key was reported as existing";if(await e.putIfAbsent(n,Buffer.from(`probe ${t} second`))!=="exists")return"the second write to one key was not refused";if(!vr(await e.get(n),r))return"the second write replaced the first"}return null}],["P2 contention",async e=>{let t=De(),r=(await Promise.all(Array.from({length:wr},(o,i)=>e.putIfAbsent(t,Buffer.from(`contender ${i}`))))).filter(o=>o==="created").length;return r===1?null:`${r} of ${wr} concurrent writers were told "created"`}],["P3 read-after-write",async e=>{let t=De(),n=Buffer.from("visible");return await e.putIfAbsent(t,n),await e.head(t)?vr(await e.get(t),n)?(await e.list(t)).includes(t)?null:"list does not show a key just created":"get does not return the bytes just created":"head does not see a key just created"}],["P4 definitive absence",async e=>await e.head(De())?"a never-written key was reported present":null]];async function lt(e){if(e.probe){let r=await e.probe();return{tier:Math.max(r.tier,e.ceilingTier),detail:r.detail}}let t=1,n="all probes passed";for(let[r,o]of _s){let i;try{i=await o(e)}catch(s){if(s instanceof R){if(!(s.code==="SYNC_LOCATION_REFUSED_WRITE"&&r.startsWith("P1")&&await $r(e)))throw s;n=`${r}: ${s.message}`,t=3;break}n=`${r}: ${s instanceof Error?s.message:String(s)}`,t=r.startsWith("P1")&&await $r(e)?3:2;break}if(i!==null){n=`${r}: ${i}`,t=2;break}}return{tier:Math.max(t,e.ceilingTier),detail:n}}async function $r(e){try{return!await e.head(De())}catch(t){if(t instanceof R)throw t;return!1}}import{existsSync as Rs,readFileSync as Rr}from"fs";import{join as Is}from"path";async function Ft(e,t,n,r){let i=le(e).entries[n];if(!i)throw new Error(`no sync state for ${n} \u2014 run kane-cli context sync add ${n} <descriptor> first`);if(i.tier!==1)throw new R("SYNC_READ_ONLY",`${n} is a tier ${i.tier} location: it can be cloned and pulled, never pushed`,"push to a location whose probe reached tier 1, or pull from this one");let s=await qe(e,t,i.witness);switch(s.kind){case"empty-storage":case"ahead":case"up-to-date":break;case"behind":case"empty-local":throw new R("SYNC_BEHIND",`${n} holds ${s.storage.seq} records, this store ${s.local?.seq??0}: it has records this store has not seen`,`kane-cli context pull ${n}`);case"diverged":throw new R("SYNC_DIVERGED",`you and ${n} both added work after position ${s.at-1}; nothing was pushed`,`run kane-cli context pull ${n} --rebase to save your local work, take the team version from ${n}, and then reapply yours`);case"foreign-lineage":throw new R("SYNC_FOREIGN_LINEAGE",`${n} holds a different history (its first record is not this store's)`,`to work on it, clone it: kane-cli context clone <descriptor of ${n}> <dir>; to share this store, add an empty location`)}let d=s.storage,c=bn(e),a;try{gn(e),a=Ss(e,d)}catch(F){throw F instanceof hn?new R("SYNC_REBASE_PENDING",`${F.message.split(";")[0]}; nothing was pushed`,F.remedy):F}finally{c()}let l=a.map(F=>Es(e,F)),g=0,p=0,f=0,u=0,y=d,b=null,h=null,m=t.beginTransaction?await t.beginTransaction():void 0,w=m?{...t,head:m.head,get:m.get,list:t.list.bind(t),putIfAbsent:t.putIfAbsent.bind(t)}:t,v=m?m.stageIfAbsent.bind(m):t.putIfAbsent.bind(t),x=[],ae=F=>m?x.push(F):r(F);try{let F=new Set;for(let A of l){for(let $ of A.blobs)if(await v($.key,$.bytes)!=="exists")p++,F.add($.key);else if(!F.has($.key)){let M=await w.get($.key);if(M===null||Ot(Buffer.from(M))!==$.fp){h=new R("SYNC_OBJECT_CORRUPT",`the blob ${$.fp} ${n} already holds does not hash to its name (named by record ${A.seq}); the record was not pushed`,"the storage object needs a human look before anything more is pushed to it");break}F.add($.key)}if(h)break;A.proposal&&await v(A.proposal.key,A.proposal.bytes)!=="exists"&&f++;let Q=Ne(A.seq);if(await v(Q,A.raw)!=="exists")g++;else if((await pe(w,A.seq)).hash===A.hash)ae(`position ${A.seq} is already on ${n}`),u++;else{b=A.seq;break}y={seq:A.seq,hash:A.hash}}if(m||await _r(t,y,d,n),y&&!await w.head(ee)){let A=await pe(w,1),Q={layout:1,canonicalizer:"v1",genesis_hash:A.hash};await v(ee,Buffer.from(JSON.stringify(Q)+`
3
+ `,"utf8"))!=="exists"&&ae(`wrote ${ee} on ${n}`)}if(m){if(y){let M=await w.get(ee),T=await pe(w,1),be={};try{let Z=JSON.parse(Buffer.from(M??[]).toString("utf8"));Z&&typeof Z=="object"&&!Array.isArray(Z)&&(be=Z)}catch{}if(be.layout!==1||be.canonicalizer!=="v1"||be.genesis_hash!==T.hash)throw new R("SYNC_OBJECT_CORRUPT",`${ee} does not describe this context's verified genesis and format.`,"Ask the location owner to inspect the metadata before publishing.")}if(h)throw h;if(b!==null)throw new R("SYNC_POSITION_TAKEN",`position ${b} on ${n} was taken by another writer; this batch was not published`,kr(n,b));let A=await m.commit(),Q=new Set(A.created),$=l.filter(M=>Q.has(Ne(M.seq))).length;u+=g-$,g=$,p=new Set(l.flatMap(M=>M.blobs.map(T=>T.key)).filter(M=>Q.has(M))).size,f=new Set(l.flatMap(M=>M.proposal?[M.proposal.key]:[]).filter(M=>Q.has(M))).size}m&&await _r(t,y,d,n);for(let A of x)r(A);let U="";if(y)try{Kn(e,n,y,{forwardOnly:!0})}catch(A){if(b===null||!(A instanceof O))throw A;U=" (the witness was not saved; the next pull records it)"}if(h)throw h;if(b!==null)throw new R("SYNC_POSITION_TAKEN",`position ${b} on ${n} was taken by another writer while this push ran; this store's history through position ${y?.seq??0} is confirmed on ${n}${U}`,kr(n,b))}finally{await m?.abort()}return{pushed:g,from:d?.seq??0,to:y?.seq??0,blobs:p,proposals:f,alreadyThere:u}}function kr(e,t){return t===1?`${e} holds a different history: to work on it, clone it with kane-cli context clone <descriptor of ${e}> <dir>; to share this store, add an empty location`:`kane-cli context pull ${e} --rebase`}async function _r(e,t,n,r){if(!t||t.seq<=(n?.seq??0))return;let o=await pe(e,t.seq);if(o.hash!==t.hash)throw new R("SYNC_OBJECT_CORRUPT",`${r} answered "created" for position ${t.seq} but serves a record hashing ${o.hash}, not ${t.hash}`,"The location needs inspection before publishing more context.")}function Ss(e,t){let{records:n,hashes:r}=Ce(e,t?.seq??0,t?.hash??null);return n.map((o,i)=>{let s=r[i],d=Rr(Is(e,"commits",`${String(o.seq).padStart(6,"0")}-${s.slice(7,19)}.json`));if(oe(JSON.parse(d.toString("utf8")))!==s)throw new Error(`record ${o.seq} changed on disk while it was being read \u2014 run kane-cli context fsck`);return{rec:o,hash:s,raw:d}})}function Es(e,{rec:t,hash:n,raw:r}){{let o=Bn(t),i=o.blobs.map(s=>{let d=ce(e,s);if(d===null)throw new R("SYNC_CLOSURE_MISSING",`record ${t.seq} names blob ${s}, which this store does not hold`,"restore the blob from a copy of this store, or run kane-cli context fsck");if(Ot(d)!==s)throw new R("SYNC_LOCAL_BLOB_CORRUPT",`record ${t.seq} names blob ${s}, but the local file does not hash to that: it is torn`,"restore the blob from a copy of this store, or run kane-cli context fsck");return{key:Jn(s),fp:s,bytes:d}});return{seq:t.seq,hash:n,raw:new Uint8Array(r),blobs:i,proposal:Os(e,o.proposalId)}}}function Os(e,t){if(t===null)return null;let n=ln(e,t);if(!Rs(n))return null;let r=Rr(n);return{key:Vn(t,Dn(r.toString("utf8"))),bytes:r}}import{existsSync as Cs,readdirSync as As,readFileSync as Ir}from"fs";import{basename as Ps,join as Lt}from"path";var Ns=/^\d{6}-[0-9a-f]{12}\.json$/;function Bt(e,t){let n=Lt(e,"commits"),r=Cs(n)?As(n).filter(s=>Ns.test(s)).sort():[],o=t.hash,i=t.seq;return r.map(s=>{let d;try{d=JSON.parse(Ir(Lt(n,s),"utf8"))}catch(a){throw new O(`backup record ${s} is not JSON: ${String(a)}`)}if(i+=1,d.seq!==i||d.prev_hash!==o)throw new O(`backup record ${s} does not continue the chain at ${i} from ${String(o)}`);let c=oe(d);if(!c.slice(7).startsWith(s.slice(7,19)))throw new O(`backup record ${s} does not match its name`);return o=c,{seq:i,hash:c,body:d}})}function pt(e,t){let n=JSON.parse(Ir(Lt(t,"base-witness.json"),"utf8")),r=$e(e),o=r.records.slice(0,n.base.seq),i=Bt(t,n.base),s=[...o,...i.map(f=>f.body)],d=[...r.hashes.slice(0,n.base.seq),...i.map(f=>f.hash)],c=new Map;for(let f of s)for(let u of f.nodes)c.set(u.cid,{label:u.label,content:u.content});let a=_n();Rn(e,a,s,d,{writeNodeFiles:!1});let l=Nn(e,a,c),g=new Map(i.map(f=>[f.seq,f])),p=f=>l.displayNameOf(f)??f.slice(0,19);return{backupDir:t,backupId:Ps(t),from:n.from,base:n.base,index:a,graph:l,records:i,chain:s,recordAt:f=>g.get(f),resolveName:f=>l.resolve(f)?.cid,nameOf:f=>l.displayNameOf(f)??void 0,displayNameFor:f=>{let u=Dt(t,f),y=Object.keys(f.source_head_moves),b=u==="revert"?String(qs(t,f)??""):u==="names"?(f.names??[]).map(h=>h.slug).join(", "):y.length>0?y.join(", "):f.nodes.length>0?[...new Set(f.nodes.map(h=>p(h.cid)))].join(", "):(f.executions?.length??0)>0?[...new Set(f.executions.map(h=>p(h.about)))].join(", "):f.review.length>0?[...new Set(f.review.map(h=>p(h.id)))].join(", "):f.supersessions.length>0?[...new Set(f.supersessions.map(h=>h.kind==="node"?p(h.old):h.ecid.slice(0,19)))].join(", "):y.join(", ");return b?`${u} ${b}`:u}}}function qs(e,t){try{let r=Oe(e,oe(t))?.args?.seq;return typeof r=="number"?r:void 0}catch{return}}function Dt(e,t){let n=null;try{n=Oe(e,oe(t))}catch{n=null}if(n)return n.verb;if(t.intent_verb)return t.intent_verb;let r=Object.entries(t.source_head_moves);return(t.executions?.length??0)>0?"execution":t.design_of?"design":t.proposal_id!=null?"extract":t.conv?t.conv.turn===0?"conv-mint":"conv-turn":r.length===1&&r[0][1]===null&&t.supersessions.some(o=>o.kind==="node"&&o.new===null)?"retire":r.length===1&&typeof r[0][1]=="string"&&t.nodes.some(o=>o.label==="source")?"ingest":t.review.some(o=>o.resolution==="reset")||t.supersessions.some(o=>o.kind==="node"&&o.new===o.old||o.kind==="edge"&&o.revoke)?"revert":t.nodes.length===0&&t.edges.length===0&&t.supersessions.length===1&&t.supersessions[0].kind==="node"&&t.supersessions[0].new===null?"archive":t.nodes.length===0&&t.edges.length===0&&t.review.length===0&&(t.names?.length??0)>0?"names":t.nodes.length===0&&t.edges.length===0&&t.supersessions.length===0&&t.review.length>0?"review":"unknown"}import{existsSync as Sr,readdirSync as js,readFileSync as Mt}from"fs";import{isAbsolute as Ts,join as ut,normalize as xs,relative as Fs,sep as Ls}from"path";var Bs=e=>e===""||Ts(e)||e.includes("\\")||xs(e).split(Ls).some(t=>t==="..")||e.startsWith("./")||e.includes("\0");function He(e){let t=ut(e,"manifest.json");if(!Sr(t))throw new O(`backup ${e} has no manifest.json \u2014 it was never completed; kane-cli context sync doctor`);let n;try{n=JSON.parse(Mt(t,"utf8"))}catch(s){throw new O(`backup manifest ${t} is not JSON: ${s instanceof Error?s.message:String(s)}`)}if(!Array.isArray(n))throw new O(`backup manifest ${t} is not a list`);let r=new Set,o=[];for(let s of n){let d=typeof s?.name=="string"?s.name:"";if(Bs(d))throw new O(`backup manifest names an unsafe path ${JSON.stringify(s?.name)} \u2014 the backup is not trusted`);let c=ut(e,d);if(!Sr(c))throw new O(`backup file ${d} is missing from ${e}`);let a=Mt(c);if("sha256:"+rn(a)!==s.hash)throw new O(`backup file ${d} does not match its manifest hash \u2014 the backup was changed after it was written`);if(d.startsWith("commits/"))try{r.add(oe(JSON.parse(a.toString("utf8"))))}catch(l){throw new O(`backup record ${d} is not a record: ${l instanceof Error?l.message:String(l)}`)}d.startsWith("intents/")&&o.push(d)}let i=new Set(n.map(s=>s.name));for(let s of Er(e)){let d=Fs(e,s);if(d!=="manifest.json"&&!i.has(d))throw new O(`backup ${e} holds ${d}, which its manifest does not name \u2014 the backup was changed after it was written`)}for(let s of o){let d;try{d=JSON.parse(Mt(ut(e,s),"utf8"))}catch(a){throw new O(`backup envelope ${s} is not JSON: ${a instanceof Error?a.message:String(a)}`)}let c=pn(d);if(c!==null)throw new O(`backup envelope ${s} is not a valid intent: ${c}`);if(typeof d.born?.hash!="string"||!r.has(d.born.hash))throw new O(`backup envelope ${s} was born from a record the backup does not hold`)}}function Er(e){let t=[];for(let n of js(e,{withFileTypes:!0})){let r=ut(e,n.name);n.isDirectory()?t.push(...Er(r)):t.push(r)}return t}import{basename as co,join as lo}from"path";import{existsSync as po,readFileSync as uo}from"fs";var G=class extends Error{},B=(e,t)=>({kind:"apply",inputs:e,...t&&t.length>0?{aliases:t}:{}}),V=e=>({kind:"noop",reason:e}),Ht=e=>({kind:"dedupe",as:e}),k=(e,t,n,r,o={})=>({kind:"hold",hold:{kind:e,mine:t,theirs:n,answers:r,detail:o}}),Or=(e,t)=>{let n=ft(t.label,t.content);return e.graph.byLabel(t.label).filter(r=>!e.graph.superseded.has(r.cid)&&ft(t.label,r.content)===n).map(r=>r.cid)},re=e=>e?e.slice(0,19):"none",H=(e,t)=>e.maps.cid.rewrite(t);function I(e,t,n){if(typeof t!="string")throw new G(`${n} was not pinned`);let r=H(e,t);if(!e.graph.hasNode(r))throw new G(`${n} ${_(e,t)} has no counterpart on ${e.location}`);return r}var j=(e,t)=>e.graph.tipOf(t),Gt=(e,t)=>e.graph.superseded.has(e.graph.tipOf(t)),_=(e,t)=>e.fold.nameOf(t)??re(t),S=(e,t)=>e.graph.displayNameOf(t)??re(t);function Jt(e,t,n,r){let o=r==="fold"?e.fold.graph:e.graph,i=o.displayNameOf(t);if(i!==null&&i!==n)return i;let s=o.tipOf(t);for(let[a,l]of o.heads)if(l===t||l===s)return a;let d=o.getNode(t);if(d?.label==="source"&&typeof d.content.source_id=="string")return d.content.source_id;let c=d?.content.title??d?.content.text??d?.content.statement;return d&&typeof c=="string"&&c!==""?`${d.label} "${z(c,32)}"`:re(t)}var L=e=>e.created_by?.by?.id??e.review[0]?.by.id??e.supersessions[0]?.by.id??e.names?.[0]?.by.id??"someone",P=e=>e.ts;function z(e,t=48){let n=typeof e=="string"?e:JSON.stringify(e);return n.length>t?`${n.slice(0,t-1)}\u2026`:n}function he(e,t,n,r){return`${[...new Set([...Object.keys(e),...Object.keys(t)])].filter(s=>s!=="derived"&&JSON.stringify(e[s])!==JSON.stringify(t[s])).map(s=>`${s} "${z(e[s]??"")}" \u2192 "${z(t[s]??"")}"`).join(", ")||"no field changed"} by ${n} at ${r}`}function ie(e,t){for(let n of e.theirs)for(let r of n.supersessions)if(r.kind==="node"&&r.old===t)return{rec:n,next:r.new}}function Vt(e,t){let n=new Set([t]);for(let o=!0;o;){o=!1;for(let[i,s]of e.graph.superseded)typeof s=="string"&&n.has(s)&&!n.has(i)&&(n.add(i),o=!0)}let r=[];for(let o of e.theirs)for(let i of o.review)n.has(i.id)&&i.resolution!=="pending"&&r.push({rec:o,resolution:i.resolution});return r}var Ds=new Set(Object.values(Ze).filter(e=>e!==Ze.DERIVES&&e!==Ze.ANNOTATES));function Wt(e,t){let n=new Set,r=[],o=[t,e.graph.tipOf(t)];for(;o.length>0;){let i=o.pop();if(!n.has(i)){n.add(i);for(let s of e.graph.edgesInto(i))!Ds.has(s.type)||e.graph.superseded.has(s.src)||(!(s.src in e.fold.index.nodeLabel)&&!r.some(d=>d.cid===s.src)&&r.push({cid:s.src,label:e.graph.nodeLabel.get(s.src)??"node"}),o.push(s.src))}}return r}function Ut(e){let t=new Map;for(let n of e)t.set(n.label,(t.get(n.label)??0)+1);return[...t].map(([n,r])=>`${r} ${n}${r===1?"":"s"}`).join(", ")}function ht(e,t,n){if(!e.theirs.some(o=>o.edges.some(i=>i.type===t&&i.src===n)))return;let r=e.graph.edgesFrom(n).find(o=>o.type===t);return r?{live:r.dst}:void 0}function Ie(e,t){let n=t.event_ids??[],r=n.filter(i=>i in e.index.eventDigests);return n.length===0||r.length===0?void 0:r.every(i=>{let s=n.indexOf(i),d=t.event_digests?.[s];return d!==void 0&&d!==""&&e.index.eventDigests[i]===d})&&r.length===n.length?V("already applied: every event id is in the chain with the same intent"):k("ambiguous",`committed ${n.length} event id${n.length===1?"":"s"}`,`${r.length} of them already in the shared chain under another intent`,["keep-theirs"],{event_ids:n})}function Ms(e){return String(e??"").toLowerCase().trim().replace(/\s+/g," ")}function ft(e,t){let n=t.question;return`${e}\0${Ms(t.title??t.text??t.statement??n?.header??t.source_id??"")}`}function Cr(e,t){let n=[],r=new Set;for(let o of e.nodes){let i=ft(o.label,o.content),s=t.nodes.find(d=>!r.has(d.cid)&&ft(d.label,d.content)===i);s&&(r.add(s.cid),n.push([o.cid,s.cid]))}for(let o of e.nodes){if(n.some(([s])=>s===o.cid))continue;let i=t.nodes.find(s=>!r.has(s.cid)&&s.label===o.label);i&&(r.add(i.cid),n.push([o.cid,i.cid]))}return n}function Ar(e,t){let n=[],r=new Set;for(let o of t.names??[]){if(!tt.test(o.slug))continue;let i=t.nodes.find(d=>d.cid===o.cid);if(!i||e.graph.nameOf.has(H(e,o.cid)))continue;let s=nt(i.label,d=>r.has(d),e.graph.names.keys());s!==null&&(r.add(s),s!==o.slug&&n.push({from:o.slug,to:s}))}return n}function Pr(e,t,n){let r=[];for(let o of e.names??[]){let i=n.find(([d])=>d===o.cid)?.[1],s=t.names?.find(d=>d.cid===i);s&&s.slug!==o.slug&&r.push({from:o.slug,to:s.slug})}return r}function Nr(e,t,n){let r=e===void 0?void 0:e.split(`
4
+ `).map(s=>{let d=/^(##\s.*?)\s@verifies\s+(.+?)\s*$/.exec(s);if(d)return`${d[1]} @verifies ${d[2].split(",").map(l=>l.trim()).filter(Boolean).map(n).join(", ")}`;let c=/^(\s*)@import\s+(\S+)\s*$/.exec(s);if(c)return`${c[1]}@import ${n(c[2])}`;let a=/^## Import: (\S+)\s*$/.exec(s);return a?`## Import: ${n(a[1])}`:s}).join(`
5
+ `),o=!1,i=t===void 0?void 0:t.split(`
6
+ `).map(s=>{let d=/^(\s*verifies:\s*)\[(.*)\]\s*$/.exec(s);if(d)return`${d[1]}[${d[2].split(",").map(a=>a.trim()).filter(Boolean).map(n).join(", ")}]`;if(/^\s*verifies:\s*$/.test(s))return o=!0,s;let c=o?/^(\s*-\s+)(\S+)\s*$/.exec(s):null;return c?`${c[1]}${n(c[2])}`:(o=!1,s)}).join(`
7
+ `);return{md:r,objectives:i}}var N=e=>e.args,q=e=>e.pins,J=e=>e.by,C=["keep-theirs"],W=["keep-theirs","apply-mine"],Hs={verb:"extract",accepts:[1,1],rebind(e,t){let n=N(t),r=q(t),o=structuredClone(n.proposal);o.source.source_cid=I(e,o.source.source_cid,`source ${o.source.source_id}`);for(let a of o.sources??[])a.source_cid=I(e,a.source_cid,`source ${a.source_id}`);for(let a of o.use_cases)a.matches_existing&&(a.matches_existing={...a.matches_existing,cid:I(e,r.matches_existing[a.temp_ref]??a.matches_existing.cid,`${a.temp_ref} matches`)}),a.conflicts_with&&(a.conflicts_with=(r.conflicts_with[a.temp_ref]??[]).flatMap(l=>l?[H(e,l)]:[])),a.depends_on_hint=(r.depends_on_hint[a.temp_ref]??[]).map(l=>H(e,l));let i=new Map;for(let[a,l]of Object.entries(n.verdicts))i.set(a,l.resolution==="supersede"?{...l,supersedeTarget:I(e,r.supersedeTarget[a],`${a} supersede target`)}:l);let s=n.flags,d=n.judgements?.map(a=>({...a,about:H(e,a.about)})),c=n.probeHits?.map(a=>({...a,candidateCid:H(e,a.candidateCid)}));return{proposal:o,proposalId:n.proposalId,verdicts:i,by:J(n),autoName:s.autoName??!1,...s.extractorVersion?{extractorVersion:s.extractorVersion}:{},...s.sid?{sid:s.sid}:{},...d?{judgements:d}:{},...c?{probeHits:c}:{},...n.eventIds?{eventIds:n.eventIds}:{}}},precheck(e,t,n,r){let o=Ie(e,n.body);if(o)return o;let i=q(t).read_basis_heads;for(let[s,d]of Object.entries(i)){let c=e.graph.heads.get(s);if(c!==H(e,d)&&e.answer!=="apply-mine")return k("read-basis",`extracted from ${s} at ${re(d)}`,`${s} is at ${re(c)} on ${e.location}`,W,{source_id:s,mine:d,theirs:c??null})}for(let s of r.proposal.use_cases){let d=r.verdicts.get(s.temp_ref);if(s.matches_existing){let l=s.matches_existing.cid;if(Gt(e,l)){if(e.answer==="apply-mine-as-new"&&e.probe){let f=d?.edit?.title??s.title,u=e.probe(e,{label:Qe.USECASE,content:{title:f}}).filter(y=>y!==l);if(u.length>0)return k("duplicate",`add "${f}" as a new use case`,`${u.map(y=>S(e,y)).join(", ")} already on ${e.location} with the same title`,C,{hits:u});s.matches_existing=null;continue}let p=`${S(e,l)} was retired on ${e.location}`;return k("restore",`matched ${_(e,l)}`,e.probe?p:`${p}; no duplicate check is available here, so it can only be kept as theirs`,e.probe?["keep-theirs","apply-mine-as-new"]:C,{target:l})}let g=j(e,l);if(g!==l){let p=e.graph.getNode(l)?.content??{},f=(s.changed?s.updated:void 0)??{},u=Array.isArray(f.criteria)&&f.criteria.length>0&&typeof f.criteria[0].text=="string"?f.criteria.map(h=>h.text):void 0,y=Et({title:d?.edit?.title??f.title??String(p.title??s.title),...f.description??p.description?{description:f.description??p.description}:{},...d?.edit?.summary??f.summary??p.summary?{summary:d?.edit?.summary??f.summary??p.summary}:{},...f.actors??p.actors?{actors:f.actors??p.actors}:{},...f.value??p.value?{value:f.value??p.value}:{},risk:d?.edit?.risk??f.risk??String(p.risk??s.risk),...u?{criteria:u}:p.criteria?{criteria:p.criteria}:{}});if(de("usecase",y)===g||e.answer==="apply-mine"){s.matches_existing={...s.matches_existing,cid:g};continue}let b=ie(e,l);return k("edit",`${s.changed?"updated":"matched"} ${_(e,l)}: ${he(p,y,L(n.body),P(n.body))}`,he(p,e.graph.getNode(g)?.content??{},b?L(b.rec):"someone",b?P(b.rec):"since the fork"),W,{target:l,tip:g,mine:y,theirs:e.graph.getNode(g)?.content??null})}continue}let c=Et({title:d?.edit?.title??s.title,description:s.description,summary:d?.edit?.summary??s.summary,actors:s.actors,value:s.value,risk:d?.edit?.risk??s.risk,...s.criteria&&s.criteria.length>0?{criteria:s.criteria.map(l=>l.text)}:{}}),a=de("usecase",c);if(e.graph.superseded.get(a)===null)return k("restore",`extracted "${z(s.title)}"`,`the same use case was retired on ${e.location}`,C,{cid:a});if(d?.resolution==="supersede"&&d.supersedeTarget&&Gt(e,d.supersedeTarget))return k("edit",`replaced ${_(e,d.supersedeTarget)} with "${z(s.title)}"`,`${S(e,d.supersedeTarget)} was retired on ${e.location}`,C,{target:d.supersedeTarget})}return B(r)},replay(e,t,n){return In({contextDir:e.contextDir,graph:e.graph,...t,allowStaleBasis:!0,provenance:n})}},Gs={verb:"review",accepts:[1,1],rebind(e,t){let n=N(t),r=q(t),o=new Map;for(let[i,s]of Object.entries(n.verdicts)){if(s.resolution==="skipped")continue;let d=I(e,r.verdicts[i],`review target ${i}`);o.set(d,s.resolution==="supersede"?{...s,supersedeTarget:I(e,r.supersedeTarget[i],`${i} supersede target`)}:s)}return{verdicts:o,by:J(n),...n.holdArchives?{holdArchives:!0}:{}}},precheck(e,t,n,r){let o=new Map,i=P(n.body);for(let[s,d]of r.verdicts){let c=j(e,s);if(e.graph.superseded.has(c))return k("restore",`${d.resolution} ${_(e,s)} at ${i}`,`${S(e,s)} was retired on ${e.location}`,C,{target:s});if(d.resolution==="rejected"&&r.holdArchives){o.set(c,d);continue}if(d.resolution==="approved"||d.resolution==="rejected"){let a=d.resolution==="approved"?"trusted":"archived";if(e.graph.trust.get(c)===a)continue;let l=Vt(e,c).at(-1);if(l&&l.resolution!==d.resolution&&e.answer!=="apply-mine")return k("verdict",`${d.resolution} ${_(e,s)} by ${L(n.body)} at ${i}`,`${l.resolution} by ${L(l.rec)} at ${P(l.rec)}`,W,{target:c,mine:d.resolution,theirs:l.resolution});o.set(c,d)}else if(d.resolution==="edited"){let a=e.graph.getNode(s),l={...a?.content,...d.edit?.title!==void 0?{title:d.edit.title}:{},...d.edit?.summary!==void 0?{summary:d.edit.summary}:{},...d.edit?.risk!==void 0?{risk:d.edit.risk}:{}};if(a&&de(a.label,l)===c)continue;if(c!==s){if(e.answer!=="apply-mine"){let g=ie(e,s),p=e.graph.getNode(c)?.content??{};return k("edit",he(a?.content??{},l,L(n.body),i),g?he(a?.content??{},p,L(g.rec),P(g.rec)):`edited on ${e.location} to "${z(p.title??p.text)}"`,W,{target:s,was:a?.content??{},mine:l,theirs:p})}o.set(c,d);continue}o.set(s,d)}else if(d.resolution==="supersede"&&d.supersedeTarget){let a=d.supersedeTarget;if(e.graph.superseded.get(a)===c)continue;if(e.graph.superseded.has(a))return k("edit",`${_(e,s)} replaces ${_(e,a)}`,`${S(e,a)} was replaced on ${e.location}`,C,{target:a});o.set(c,d)}}return o.size===0?V(`already applied on ${e.location}`):B({...r,verdicts:o})},replay(e,t,n){return Sn({contextDir:e.contextDir,graph:e.graph,...t,provenance:n})}},Js={verb:"pair-merge",accepts:[1,1],rebind(e,t){let n=N(t),r=q(t);return{survivor:I(e,r.survivor,"survivor"),merged:I(e,r.merged,"merged"),...n.reason?{reason:String(n.reason)}:{},by:J(n)}},precheck(e,t,n,r){let o=j(e,r.survivor),i=r.merged;if(e.graph.superseded.get(i)===o||e.graph.superseded.get(i)===r.survivor)return V(`already merged on ${e.location}`);if(e.graph.superseded.has(i))return k("edit",`merged ${_(e,i)} into ${_(e,r.survivor)}`,`${S(e,i)} was changed on ${e.location}`,C,{merged:i});if(e.graph.superseded.has(o))return k("edit",`merged into ${_(e,r.survivor)}`,`${S(e,r.survivor)} was retired on ${e.location}`,C,{survivor:r.survivor});let s=Wt(e,i);return s.length>0?k("destructive",`merged ${_(e,i)} into ${_(e,r.survivor)} at ${P(n.body)}`,`${e.location} built on ${S(e,i)}: ${Ut(s)}`,C,{dependents:s}):B({...r,survivor:o})},replay:(e,t,n)=>En({contextDir:e.contextDir,graph:e.graph,...t,provenance:n})},Vs={verb:"names",accepts:[1,1],rebind(e,t){let n=N(t),r=q(t).refs;return{assignments:n.assignments.map(o=>({ref:I(e,r[o.ref],`name target ${o.ref}`),slug:o.slug})),by:J(n),...Array.isArray(n.reassign)?{reassign:n.reassign}:{}}},precheck(e,t,n,r){let o=[],i=[],s=new Set,d=new Set(r.reassign??[]),c=q(t).refs,a=N(t).assignments.map(l=>c[l.ref]);for(let[l,{ref:g,slug:p}]of r.assignments.entries()){let f=j(e,g);if(e.graph.superseded.has(f))return k("restore",`named ${_(e,g)} "${p}"`,`${S(e,g)} was retired on ${e.location}`,C,{target:g});let u=e.graph.names.get(p);if(u!==void 0&&j(e,u)===f)continue;let y=u!==void 0&&!e.graph.superseded.has(j(e,u));if(y||s.has(p)){if(!tt.test(p)){if(y&&!s.has(p)&&e.answer==="apply-mine"){d.add(p),s.add(p),o.push({ref:f,slug:p});continue}let h=e.theirs.find(m=>(m.names??[]).some(w=>w.slug===p));return k("slug",`named ${Jt(e,a[l]??g,p,"fold")} "${p}" at ${P(n.body)}`,`"${p}" names ${Jt(e,u,p,"live")} on ${e.location}${h?` (by ${L(h)} at ${P(h)})`:""}`,W,{slug:p,mine:g,theirs:u??null})}let b=nt(e.graph.nodeLabel.get(f)??"",h=>s.has(h),e.graph.names.keys());if(b===null)throw new G(`no sequential id for ${_(e,g)}`);s.add(b),i.push({from:p,to:b}),o.push({ref:f,slug:b});continue}s.add(p),o.push({ref:f,slug:p})}return o.length===0?V(`already named on ${e.location}`):B({...r,assignments:o,...d.size>0?{reassign:[...d]}:{}},i)},replay:(e,t,n)=>On({contextDir:e.contextDir,graph:e.graph,...t,provenance:n})},Ws={verb:"retire",accepts:[1,1],rebind(e,t){let n=N(t);return{sourceId:String(n.sourceId),...n.reason?{reason:String(n.reason)}:{},by:J(n)}},precheck(e,t,n,r){let o=e.graph.heads.get(r.sourceId);if(o===null)return V(`already retired: ${r.sourceId}`);if(o===void 0)throw new G(`source ${r.sourceId} is not on ${e.location}`);let i=H(e,String(q(t).head));if(o!==i&&e.answer!=="apply-mine"){let s=e.theirs.find(d=>d.source_head_moves[r.sourceId]===o);return k("head",`retired ${r.sourceId} at ${re(i)} (${P(n.body)})`,`${r.sourceId} was re-ingested on ${e.location}${s?` by ${L(s)} at ${P(s)}`:""}`,W,{source_id:r.sourceId,mine:i,theirs:o})}return B(r)},replay:(e,t,n)=>Cn({contextDir:e.contextDir,graph:e.graph,...t,provenance:n})},Us={verb:"archive",accepts:[1,1],rebind(e,t){let n=N(t);return{ref:I(e,String(q(t).ref),`archive target ${String(n.ref)}`),reason:String(n.reason),by:J(n)}},precheck(e,t,n,r){let o=j(e,r.ref);if(e.graph.superseded.has(o))return V(`already archived: ${S(e,r.ref)}`);if(o!==r.ref){let s=ie(e,r.ref);return k("edit",`archived ${_(e,r.ref)}: ${z(r.reason)} (${L(n.body)}, ${P(n.body)})`,`${S(e,r.ref)} was edited on ${e.location}${s?` by ${L(s.rec)} at ${P(s.rec)}`:""}`,C,{target:r.ref,tip:o})}let i=Wt(e,o);return i.length>0?k("destructive",`archived ${_(e,r.ref)}: ${z(r.reason)} (${L(n.body)}, ${P(n.body)})`,`${e.location} built on ${S(e,r.ref)}: ${Ut(i)}`,C,{target:o,dependents:i}):B({...r,ref:o})},replay:(e,t,n)=>yr(e.contextDir,e.graph,{...t,provenance:n})},Ks={verb:"gap",accepts:[1,1],rebind(e,t){let n=N(t),r=q(t).annotates;return{content:e.maps.cid.rewrite(n.content),...r?{annotates:j(e,I(e,r,"annotated node"))}:{}}},precheck(e,t,n,r){let o=de("gap",r.content);return e.graph.hasNode(o)?e.graph.superseded.has(o)?k("restore",`deferred a gap: ${z(r.content.text)}`,`the same gap was closed on ${e.location}`,C,{cid:o}):Ht(o):r.annotates&&e.graph.superseded.has(r.annotates)?k("restore",`deferred a gap on ${_(e,r.annotates)}`,`${S(e,r.annotates)} was retired on ${e.location}`,C,{target:r.annotates}):B(r)},replay(e,t,n){let r=An({contextDir:e.contextDir,...t,provenance:n});return r.ok?{landed:!0}:{errors:[{code:"GAP_REFUSED",detail:r.refusal}]}}},Ys={verb:"gap-close",accepts:[1,1],rebind(e,t){let n=N(t);return{targetTip:j(e,I(e,String(n.targetTip),"gap target")),resolvedBy:I(e,String(n.resolvedBy),"resolving node"),...n.sourceId?{sourceId:String(n.sourceId)}:{},by:J(n),gaps:q(t).gaps.map(r=>I(e,r,"gap"))}},precheck(e,t,n,r){let o=[];for(let i of r.gaps){let s=e.graph.superseded.get(i);if(s===void 0){o.push(i);continue}if(s!==null&&j(e,s)===j(e,r.resolvedBy))continue;let d=ie(e,i);return k("edit",`closed gap ${_(e,i)} by ${_(e,r.resolvedBy)}`,`closed on ${e.location} by ${s?S(e,s):"a retire"}${d?` (${L(d.rec)}, ${P(d.rec)})`:""}`,C,{gap:i,mine:r.resolvedBy,theirs:s})}return o.length===0?V(`already closed on ${e.location}`):B({...r,gaps:o})},replay(e,t,n){return Pn({contextDir:e.contextDir,graph:e.graph,...t,provenance:n}).resolved>0?{landed:!0}:{errors:[{code:"STALE_BASIS",detail:"concurrent appends kept moving the head \u2014 the gap close did not land"}]}}},zs={verb:"chat",accepts:[1,1],rebind(e,t){let n=N(t),r=q(t),o=structuredClone(n.ops).map(s=>{if("target"in s){let d=I(e,r.targets[s.eventId],`${s.kind} target ${s.target}`),c={...s,target:d,expectedCid:d};if(c.kind==="enhance"&&(c.edges=c.edges.map((a,l)=>({...a,src:I(e,r.enhance[s.eventId]?.[l]?.src,"enhance src"),dst:I(e,r.enhance[s.eventId]?.[l]?.dst,"enhance dst")}))),c.kind==="reject"&&c.redirectTo&&(c.redirectTo=I(e,r.redirectTo[s.eventId],"redirect target")),c.kind==="retract"){let a=r.retract[s.eventId];if(!a?.dst||!c.edgeRef)throw new G("retracted edge was not pinned by endpoints");c.edgeRef={type:c.edgeRef.type,dst:I(e,a.dst,"retract dst"),...a.src?{src:I(e,a.src,"retract src")}:{}},delete c.edgeEcid}return c}return s}),i=n.judgements?.map(s=>({...s,about:H(e,s.about)}));return{ops:o,...i?{judgements:i}:{},by:J(n),...n.mintable?{mintable:n.mintable}:{},...n.sid?{sid:String(n.sid)}:{}}},precheck(e,t,n,r){let o=Ie(e,n.body);if(o)return o;let i=q(t).conv,s=P(n.body),d=`chat turn at ${s}`,c=new Set,a=[],l=(f,u)=>r.ops.some(y=>y.kind==="enhance"&&y.edges.some(b=>b.type===f&&j(e,b.src)===u)),g=(f,u)=>r.ops.some(y=>y.kind==="retract"&&y.edgeRef?.type===f&&j(e,y.target)===u);for(let[f,u]of r.ops.entries()){let y=`op ${f+1} (${u.kind})`;if("target"in u){let b=j(e,u.target);if(e.graph.superseded.has(b))return k("chat",`${d}: ${y} on ${_(e,u.target)}`,`${S(e,u.target)} was retired on ${e.location}`,C,{op:f+1,target:u.target});if(b!==u.target){if(u.kind==="edit"){let h=e.graph.getNode(u.target),m=h?.content??{},w={...m};for(let[v,x]of Object.entries(u.edit))x!==void 0&&(w[v]=x);if(h&&de(h.label,w)===b){c.add(u.eventId);continue}if(e.answer!=="apply-mine"){let v=ie(e,u.target);return k("chat",`${d}: ${y} on ${_(e,u.target)}: ${he(m,w,L(n.body),s)}`,he(m,e.graph.getNode(b)?.content??{},v?L(v.rec):"someone",v?P(v.rec):"since the fork"),W,{op:f+1,target:u.target,tip:b})}}u.target=b,u.expectedCid=b}if(u.kind==="approve"||u.kind==="reject"){let h=u.kind==="approve"?"trusted":"archived";if(e.graph.trust.get(b)===h){c.add(u.eventId);continue}let m=Vt(e,b).at(-1);if(m!==void 0&&(u.kind==="approve"?m.resolution==="rejected":m.resolution==="approved"||m.resolution==="edited")&&e.answer!=="apply-mine")return k("verdict",`${d}: ${y} on ${_(e,u.target)} by ${L(n.body)}`,`${m.resolution} by ${L(m.rec)} at ${P(m.rec)}`,W,{op:f+1,target:b,mine:u.kind,theirs:m.resolution})}if(u.kind==="retract"&&u.edgeRef){let h=u.edgeRef,m=j(e,h.dst);if(!e.graph.edgesFrom(b).find(v=>v.type===h.type&&j(e,v.dst)===m)){let v=ht(e,h.type,b);if(v&&l(h.type,b)){if(e.answer!=="apply-mine")return k("repoint",`${d}: ${y} re-points ${h.type} of ${_(e,u.target)} away from ${_(e,h.dst)}`,`${h.type} of ${S(e,u.target)} now points at ${S(e,v.live)} on ${e.location}`,W,{op:f+1,theirs:v.live});u.edgeRef={...h,dst:v.live}}else c.add(u.eventId)}}if(u.kind==="enhance")for(let h of u.edges){let m=ht(e,h.type,h.src);if(!(!m||e.graph.tipOf(m.live)===e.graph.tipOf(h.dst)||g(h.type,j(e,h.src)))){if(e.answer!=="apply-mine")return k("repoint",`${d}: ${y} points ${h.type} of ${_(e,h.src)} at ${_(e,h.dst)}`,`${h.type} of ${S(e,h.src)} now points at ${S(e,m.live)} on ${e.location}`,W,{op:f+1,edge:h,theirs:m.live});a.push({kind:"retract",target:h.src,expectedCid:j(e,h.src),edgeRef:{type:h.type,dst:m.live},reason:"re-pointed on replay",eventId:`${u.eventId}:repoint`})}}}else if(u.kind==="add"){if(e.graph.heads.get(u.convSourceId)!==H(e,i[u.eventId]))return k("chat",`${d}: ${y} cites turn ${u.cite.turn} of ${u.convSourceId}`,`the conversation ${u.convSourceId} is at another turn on ${e.location}`,C,{op:f+1});let h=de(u.label,{...u.content,derived:!0});if(e.graph.superseded.get(h)===null)return k("restore",`${d}: ${y} adds "${z(u.content.title??u.content.text)}"`,`the same node was retired on ${e.location}`,C,{op:f+1,cid:h})}}let p=[...a,...r.ops.filter(f=>!c.has(f.eventId))];return p.length===0?V(`every op is already on ${e.location}`):B({...r,ops:p})},replay(e,t,n){let r=hr({contextDir:e.contextDir,graph:e.graph,...t,provenance:n});return r.errors?{errors:r.errors}:r.record?{record:r.record}:{reason:"every op already applied"}}},Qs={verb:"design",accepts:[1,1],rebind(e,t){let n=N(t),r=q(t),o=structuredClone(n.sections),i=new Set([...(o.scenarios??[]).map(a=>a.temp_ref),...(o.acs??[]).map(a=>a.temp_ref),...(o.tests??[]).map(a=>a.temp_ref),...(o.gaps??[]).flatMap(a=>a.temp_ref?[a.temp_ref]:[])]),s=(a,l,g)=>i.has(a)?a:I(e,l,g),d=I(e,r.ucRef,`use case ${String(n.ucRef)}`);for(let a of o.scenarios??[])a.depends_on&&(a.depends_on=a.depends_on.map((l,g)=>s(l,r.depends_on[a.temp_ref]?.[g],`${a.temp_ref}.depends_on`)));for(let a of o.acs??[])a.scope?.ref&&(a.scope={...a.scope,ref:s(a.scope.ref,r.scope[a.temp_ref],`${a.temp_ref}.scope`)});o.exercises=(o.exercises??[]).map((a,l)=>({scenario:s(a.scenario,r.exercises[l]?.scenario,"exercises.scenario"),ac:s(a.ac,r.exercises[l]?.ac,"exercises.ac")})),o.scoped_to_repoints=(o.scoped_to_repoints??[]).map((a,l)=>({ac:s(a.ac,r.scoped_to_repoints[l]?.ac,"repoint.ac"),to:s(a.to,r.scoped_to_repoints[l]?.to,"repoint.to")})),o.judgements=(o.judgements??[]).map((a,l)=>a.target&&!i.has(a.target)?{...a,target:I(e,r.judgements[l],"judgement target")}:a);for(let a of o.tests??[]){a.automates=s(a.automates,r.automates[a.temp_ref],`${a.temp_ref}.automates`),a.verifies=a.verifies.map((p,f)=>s(p,r.verifies[a.temp_ref]?.[f],`${a.temp_ref}.verifies`)),a.reuses&&(a.reuses=a.reuses.map((p,f)=>s(p,r.reuses[a.temp_ref]?.[f],`${a.temp_ref}.reuses`)));let l=r.body_tags[a.temp_ref]??{},g=Nr(a.test_md_blob,a.objectives_blob,p=>{if(i.has(p))return p;let f=I(e,l[p],`body tag ${p}`),u=e.graph.displayNameOf(j(e,f));if(!u)throw new G(`body tag ${p} has no name on ${e.location}`);return u});a.test_md_blob=g.md,a.objectives_blob=g.objectives}let c=n.generationTicket;return{ucRef:d,sections:o,by:J(n),engine:String(n.engine),force:!!n.force,...n.forceScope?{forceScope:r.forceScope.map(a=>H(e,a))}:{},...n.reason?{reason:String(n.reason)}:{},...c?{generationTicket:{...c,uc_root:cr(e.graph,d)}}:{},templateVersion:n.templateVersion??null,...n.phase?{phase:String(n.phase)}:{},...n.phaseCompleteness?{phaseCompleteness:n.phaseCompleteness}:{},...n.eventIds?{eventIds:n.eventIds}:{},...n.sid?{sid:String(n.sid)}:{}}},precheck(e,t,n,r){let o=Ie(e,n.body);if(o)return o;let i=c=>`${c.tests?.length??0} tests, ${c.scenarios?.length??0} scenarios, ${c.acs?.length??0} criteria`,s=`designed ${_(e,String(q(t).ucRef))} at ${P(n.body)}: ${i(r.sections)}`,d=j(e,r.ucRef);if(e.graph.superseded.has(d))return k("restore",s,`${S(e,r.ucRef)} was retired on ${e.location}`,C,{target:r.ucRef});if(d!==r.ucRef){let c=ie(e,r.ucRef);return k("edit",s,`${S(e,r.ucRef)} was edited on ${e.location}${c?` by ${L(c.rec)} at ${P(c.rec)}`:""}`,C,{target:r.ucRef,tip:d})}if(r.generationTicket&&lr(e.graph,r.generationTicket)!==null){let a=r.generationTicket.uc_root,l=e.graph.designGenerationOf.get(a)?.gen,g=e.theirs.filter(u=>{let y=u.design_phase;return u.design_generation?.uc_root===a&&u.design_generation.generation===l||y?.uc_root===a&&y.generation===l}),p=u=>g.reduce((y,b)=>y+b.nodes.filter(h=>h.label===u).length,0),f=g.length>0?`${p("test")} tests, ${p("scenario")} scenarios, ${p("ac")} criteria`:"another generation";return k("generation",s,`generation ${String(l)} of ${S(e,r.ucRef)} taken on ${e.location}: ${f}`,C,{uc:r.ucRef,ticket:r.generationTicket})}if(r.force||r.forceScope){let c=new Set(r.forceScope??q(t).forceScope.map(l=>H(e,l))),a=new Set(gr(e.graph,r.ucRef));if(c.size!==a.size||[...c].some(l=>!a.has(l)))return k("generation",`forced a redesign of ${_(e,r.ucRef)} over ${c.size} nodes`,`the scope of ${S(e,r.ucRef)} changed on ${e.location} (${a.size} nodes now)`,C,{mine:[...c],theirs:[...a]})}for(let c of r.sections.scoped_to_repoints??[]){if(!e.graph.hasNode(c.ac))continue;let a=ht(e,"scoped_to",c.ac);if(a&&e.graph.tipOf(a.live)!==(e.graph.hasNode(c.to)?e.graph.tipOf(c.to):c.to)&&e.answer!=="apply-mine")return k("repoint",`re-scoped ${_(e,c.ac)} to ${_(e,c.to)}`,`${S(e,c.ac)} was re-scoped to ${S(e,a.live)} on ${e.location}`,W,{ac:c.ac,mine:c.to,theirs:a.live})}return B(r)},replay(e,t,n){let r=new Map((t.sections.tests??[]).map(i=>[i.temp_ref,i])),o=mr({contextDir:e.contextDir,graph:e.graph,...t,strict:!0,provenance:n,finalizeTestBody:(i,s)=>{if(!i.test_md_blob)return null;let d=new Map;for(let l of i.reuses){let g=s(l);g!==null&&g!==l&&d.set(l,g)}let c=sn(on(i.test_md_blob,d),s).md;if(c===i.test_md_blob)return null;let a=l=>{for(let[g,p]of r)if(s(g)===l&&p.test_md_blob)return{body:p.test_md_blob,cycleKey:`batch:${l}`,next:a};return cn(e.graph)(l)};return{test_md_blob:c,definitionId:an(dn(c,a))}}});return o.errors?{errors:o.errors}:o.record?{record:o.record}:{reason:"everything in this phase is already current"}}},Zs={verb:"execution",accepts:[1,1],rebind(e,t){let n=N(t),r=q(t).facts;return{facts:n.facts.map((i,s)=>({...i,about_cid:I(e,r[s]?.about_cid,`test ${i.ref}`),...i.per_ac?{per_ac:i.per_ac.map((d,c)=>({...d,ac_cid:I(e,r[s]?.per_ac[c],`criterion ${d.ac_ref}`)}))}:{}})),by:J(n),...n.eventIds?{eventIds:n.eventIds}:{}}},precheck(e,t,n,r){let o=Ie(e,n.body);if(o)return o;let i=[];for(let[d,c]of r.facts.entries()){let a=(e.index.exec[c.about_cid]??[]).find(l=>l.execution_id===c.execution_id);if(!a){i.push(d);continue}return k("ambiguous",`run ${c.execution_id} of ${_(e,c.about_cid)}: ${c.verdict}`,`the same run id is on ${e.location} (${a.verdict}) under no matching intent digest`,C,{execution_id:c.execution_id,mine:c,theirs:a})}if(i.length===0)return V(`every run is already on ${e.location}`);let s=r.eventIds&&r.eventIds.length===r.facts.length?r.eventIds.filter((d,c)=>i.includes(c)):r.eventIds;return B({...r,facts:i.map(d=>r.facts[d]),...s?{eventIds:s}:{}})},replay:(e,t,n)=>jn(e.contextDir,e.graph,{...t,pinned:!0,provenance:n})},Xs={verb:"parked",accepts:[1,1],rebind(e,t){let n=structuredClone(N(t).line);return n.facts=n.facts.map(r=>({...r,about_cid:I(e,r.about_cid,`test ${r.ref}`),...r.per_ac?{per_ac:r.per_ac.map(o=>({...o,...o.ac_cid?{ac_cid:H(e,o.ac_cid)}:{}}))}:{}})),{line:n}},precheck:(e,t,n,r)=>Ie(e,n.body)??B(r),replay(e,t,n){let r=Tn(e.contextDir,t.line,{provenance:n});return r.errors?{errors:r.errors}:r.record?{record:r.record}:{reason:"every parked fact already applied"}}},eo={verb:"exec-supersede",accepts:[1,1],rebind(e,t){let n=N(t),r=q(t);return{tip:I(e,r.tip,"edited test"),raw:String(n.raw),fileId:String(n.fileId),by:J(n),imports:Object.fromEntries(Object.entries(r.imports).map(([o,i])=>[o,I(e,i,`import ${o}`)]))}},precheck(e,t,n,r){let o=j(e,r.tip);if(e.graph.superseded.has(o))return k("restore",`edited ${_(e,r.tip)} in its file`,`${S(e,r.tip)} was retired on ${e.location}`,C,{target:r.tip});if(o!==r.tip&&n.body.nodes.some(i=>i.cid===o))return V(`${e.location} has the same edit`);if(o!==r.tip&&e.answer!=="apply-mine"){let i=ie(e,r.tip);return k("edit",`edited ${_(e,r.tip)} in its file at ${P(n.body)}`,`${S(e,r.tip)} was edited on ${e.location}${i?` by ${L(i.rec)} at ${P(i.rec)}`:""}`,W,{target:r.tip,tip:o})}return B({...r,tip:o})},replay(e,t,n){let r=xn(e.contextDir,e.graph,t.tip,t.raw,t.fileId,e.contextDir,t.by,{provenance:n,imports:t.imports,throwTransient:!0});return r.error?{errors:[{code:"SUPERSEDE_REFUSED",detail:r.error}]}:r.newCid===t.tip?{reason:"the file content is already the tip"}:{landed:!0}}},to={verb:"ingest",accepts:[1,1],rebind(e,t){let n=N(t),r=ce(e.contextDir,String(n.blob));if(r===null)throw new G(`the bytes of ${String(n.source_id)} (${re(String(n.blob))}) are not in the blob store`);return{sourceId:String(n.source_id),blob:String(n.blob),bytes:r,label:String(n.label),media:n.media,derived:n.derived_blobs??[],...n.eventIds?{eventIds:n.eventIds}:{}}},precheck(e,t,n,r){let o=e.graph.heads.get(r.sourceId)??null;if(o!==null&&e.graph.getNode(o)?.content.blob===r.blob)return V(`already at that head: ${r.sourceId}`);let i=q(t).prior_head,s=i===null?null:H(e,i);if(o!==s&&e.answer!=="apply-mine"){let d=e.theirs.find(a=>a.source_head_moves[r.sourceId]===o),c=o?ce(e.contextDir,String(e.graph.getNode(o)?.content.blob??"")):null;return k("head",`ingested ${r.sourceId}: ${r.bytes.byteLength} bytes at ${P(n.body)}`,o?`${r.sourceId}: ${c?.byteLength??"?"} bytes ingested on ${e.location}${d?` by ${L(d)} at ${P(d)}`:""}`:`${r.sourceId} was retired on ${e.location}`,W,{source_id:r.sourceId,mine:r.blob,theirs:o})}return B(r)},async replay(e,t,n){let r=xt.find(s=>s.media_type===t.media.media_type&&s.kind===t.media.format)??xt.find(s=>s.kind===t.media.format);if(!r)return{errors:[{code:"MEDIA_UNKNOWN",detail:`no media for ${t.media.format} ${t.media.media_type}`}]};let o=ir[r.kind],i=async()=>{let s=t.media.text_blob?ce(e.contextDir,t.media.text_blob):null;if(s===null)throw new Error(`the projection of ${t.sourceId} is not in the blob store`);let d=new Map;for(let a of t.derived){let l=ce(e.contextDir,a);if(l===null)throw new Error(`derived blob ${re(a)} of ${t.sourceId} is not in the blob store`);d.set(a,l)}let c=t.media.images??[];return{projection:s.toString("utf8"),inventory:c,blobs:d,delivered:c.filter(a=>a.delivery==="selected").map(a=>a.ref),converter:t.media.converter??{name:"replay",version:"0",policy:"recorded"}}};return dr({contextDir:e.contextDir,bytes:t.bytes,media:r,sourceId:t.sourceId,label:t.label,...o?{converters:{[o]:i}}:{},...t.eventIds?{eventIds:t.eventIds}:{},provenance:n}).then(s=>s.status==="unchanged"?{reason:`already at that head: ${t.sourceId}`}:{landed:!0})}},no={verb:"distill",accepts:[1,1],rebind:(e,t)=>({watermark:Number(N(t).watermark),by:J(N(t))}),precheck(e,t,n,r){let o=q(t).events.filter(i=>!e.graph.appliedEvents.has(i));return o.length>0?k("dependency",`distilled ${q(t).events.length} events into style notes`,`${o.length} of those events are not on ${e.location}`,C,{missing:o}):B(r)},replay(e,t,n){let r=fr({contextDir:e.contextDir,graph:e.graph,...t,provenance:n});return r.errors?{errors:r.errors}:r.record?{record:r.record}:{reason:"nothing new to distill"}}},ro={verb:"conv-mint",accepts:[1,1],rebind:(e,t)=>({sessionStamp:String(N(t).sessionStamp),by:J(N(t))}),precheck(e,t,n,r){let o=e.graph.heads.get(`su-conv-${r.sessionStamp}`);return typeof o=="string"?Ht(o):B(r)},replay(e,t,n){let r=pr({contextDir:e.contextDir,graph:e.graph,...t,provenance:n});return r.errors?{errors:r.errors}:{record:r.record}}},so={verb:"conv-turn",accepts:[1,1],rebind:(e,t)=>({sourceId:String(N(t).sourceId),text:String(N(t).text),force:!!N(t).force,by:J(N(t))}),precheck(e,t,n,r){let o=e.graph.heads.get(r.sourceId);if(typeof o!="string")throw new G(`conversation ${r.sourceId} is not on ${e.location}`);let i=H(e,String(q(t).append_of));if(o===i)return B(r);let s=e.graph.convChains.get(r.sourceId)?.chain??[],d=n.body.source_head_moves[r.sourceId];return typeof d=="string"&&s.includes(H(e,d))?V("turn already in the conversation"):k("head",`turn ${n.body.conv?.turn??"?"} of ${r.sourceId}: "${z(r.text)}"`,`${r.sourceId} continued differently on ${e.location}`,C,{source_id:r.sourceId})},replay(e,t,n){let r=ur({contextDir:e.contextDir,graph:e.graph,...t,provenance:n});return r.errors?{errors:r.errors}:r.record?{record:r.record}:{reason:"turn already present"}}},oo={verb:"revert",accepts:[1,1],rebind(e,t){let n=N(t),r=q(t).target,o=e.maps.record.byHash(r.hash),i;if(o===void 0){if(r.seq>=e.fold.from)throw new G(`the reverted record ${r.seq} was not replayed`);let{hashes:s}=$e(e.contextDir);if(s[r.seq-1]!==r.hash)throw new G(`record ${r.seq} is not the one the revert targeted`);i=r.seq}else"dedupedAs"in o?i=-1:i=o.seq;return{seq:i,...n.reason?{reason:String(n.reason)}:{},by:J(n)}},precheck(e,t,n,r){let o=q(t).target;if(r.seq<0){let i=e.maps.record.byHash(o.hash).dedupedAs;return k("revert",`reverted record ${o.seq} (${e.fold.recordAt(o.seq)?e.fold.displayNameFor(e.fold.recordAt(o.seq).body):"moved record"})`,`that record's content is shared: ${S(e,i)} exists on ${e.location}`,C,{target:o,dedupedAs:i})}return B(r)},replay(e,t,n){let r=br({contextDir:e.contextDir,graph:e.graph,...t,provenance:n});return r.errors?r.errors[0]?.code==="NOTHING_TO_REVERT"?{reason:"nothing left to revert"}:{errors:r.errors}:{record:r.record}}},io=[Hs,Gs,Js,Vs,Ws,Ks,Ys,zs,Qs,Zs,Xs,eo,to,no,ro,so,Us,oo];function qr(e,t){let n=io.find(r=>r.verb===e);return n&&t>=n.accepts[0]&&t<=n.accepts[1]?n:void 0}var ao=(e,t)=>({seq:e.seq,hash:t,ts:e.ts,build:"era-0"});function jr(e,t,n){let r=Dt(e.backupDir,t),o=t.created_by?.by??t.review[0]?.by??t.supersessions[0]?.by??t.names?.[0]?.by??{kind:"human",id:"unknown"},i=(s,d,c)=>({envelope:{v:1,verb:s,args:un(d),pins:c,born:ao(t,n)}});switch(r){case"execution":{let s=(t.executions??[]).map(c=>({ref:e.nameOf(c.about)??c.about,definition_id_at_run:c.definition_id_at_run,verdict:c.verdict,...c.per_ac?{per_ac:c.per_ac.map(a=>({ac_ref:a.ac_ref,ac_cid:a.ac_cid??e.resolveName(a.ac_ref)??null,verdict:a.verdict}))}:{},drift_flag:c.drift_flag,oracle_mode:c.oracle_mode,stale_at_run:c.stale_at_run,...c.unresolved_acs?{unresolved_acs:c.unresolved_acs}:{},execution_id:c.execution_id,...c.evidence_id?{evidence_id:c.evidence_id}:{},...c.duration_ms!==void 0?{duration_ms:c.duration_ms}:{},started_at:c.started_at,mode:c.mode,local:c.local,...c.via_parent?{via_parent:c.via_parent}:{},about_cid:c.about})),d=(t.executions??[]).map(c=>({about_cid:c.about,per_ac:(c.per_ac??[]).map(a=>a.ac_cid??e.resolveName(a.ac_ref)??null)}));return d.some(c=>c.per_ac.some(a=>a===null))?{hold:"era-0 execution: a criterion name does not resolve on the pre-reset graph"}:i("execution",{facts:s,by:o,eventIds:t.event_ids??null},{facts:d})}case"review":{let s={},d={},c=new Set(t.nodes.map(a=>a.cid));for(let a of t.supersessions)if(!(a.kind!=="node"||a.new===null||a.new===a.old)){if(c.has(a.new)){let l=e.graph.getNode(a.old)?.content??{},g=t.nodes.find(f=>f.cid===a.new).content,p={};for(let f of["title","summary","risk"])JSON.stringify(l[f])!==JSON.stringify(g[f])&&(p[f]=g[f]);s[a.old]={resolution:"edited",edit:p,reason:a.reason}}else s[a.new]={resolution:"supersede",supersedeTarget:a.old,reason:a.reason},d[a.new]=a.new;d[a.old]=a.old}for(let a of t.review)c.has(a.id)||a.id in s||(a.resolution==="approved"||a.resolution==="rejected"?(s[a.id]={resolution:a.resolution,...a.reason?{reason:a.reason}:{}},d[a.id]=a.id):a.resolution==="pending"&&a.kind==="pending_archive"&&(s[a.id]={resolution:"rejected",...a.reason?{reason:a.reason}:{}},d[a.id]=a.id));return Object.keys(s).length===0?{hold:"era-0 review: no verdict can be read off the record"}:i("review",{verdicts:s,by:o,holdArchives:t.review.some(a=>a.kind==="pending_archive")},{verdicts:d,supersedeTarget:{}})}case"names":return i("names",{assignments:(t.names??[]).map(s=>({ref:s.cid,slug:s.slug})),by:o},{refs:Object.fromEntries((t.names??[]).map(s=>[s.cid,s.cid]))});case"retire":{let[s]=Object.keys(t.source_head_moves),d=t.supersessions.find(c=>c.kind==="node");return i("retire",{sourceId:s,reason:d.reason,by:o},{head:d.kind==="node"?d.old:null})}case"archive":{let s=t.supersessions[0];return s.kind!=="node"?{hold:"era-0 archive: no node tombstone"}:i("archive",{ref:s.old,reason:s.reason,by:o},{ref:s.old})}case"ingest":{let[s,d]=Object.entries(t.source_head_moves)[0],c=t.nodes.find(p=>p.cid===d),a=t.media?.[s];if(!c||!a)return{hold:"era-0 ingest: the record carries no source node or media fact"};let l=null;for(let p of e.chain){if(p.seq>=t.seq)break;s in p.source_head_moves&&(l=p.source_head_moves[s])}let g=[...a.text_blob?[a.text_blob]:[],...(a.images??[]).flatMap(p=>p.blob?[p.blob]:[])];return i("ingest",{source_id:s,blob:String(c.content.blob),label:s,media:a,derived_blobs:g,eventIds:t.event_ids??null},{prior_head:l})}case"revert":return{hold:"era-0 revert: the target record is not named without an envelope"};default:return{hold:`no intent envelope (written before stamps): ${r} holds whole`}}}var Tr=3,fo=/^sha256:[0-9a-f]{64}$/;function gt(e,t=new Set){if(typeof e=="string")fo.test(e)&&t.add(e);else if(Array.isArray(e))for(let n of e)gt(n,t);else if(e&&typeof e=="object")for(let n of Object.values(e))gt(n,t);return t}function xr(e,t){let n;try{n=Oe(e.backupDir,t.hash)}catch(r){return{hold:`unreadable envelope: ${r instanceof Error?r.message:String(r)}`}}return n?{envelope:n}:jr(e,t.body,t.hash)}var ho=e=>{let t=e.design_phase;return t?.uc_root&&typeof t.generation=="number"?`${t.uc_root}@${t.generation}`:e.design_generation?`${e.design_generation.uc_root}@${e.design_generation.generation}`:null};function go(e){let t=[],n=new Map,r=new Map,o=new Map;for(let i of e.records){let s=xr(e,i),d="envelope"in s?s.envelope.verb:e.displayNameFor(i.body).split(" ")[0],c="envelope"in s?gt(s.envelope.pins):gt([i.body.executions?.map(u=>u.about),i.body.supersessions,i.body.review.map(u=>u.id),i.body.names?.map(u=>u.cid)]),a=new Set;for(let u of c){let y=r.get(u);y&&a.add(y)}if("envelope"in s&&s.envelope.verb==="revert"){let u=s.envelope.pins.target?.hash;u&&e.records.some(y=>y.hash===u)&&a.add(u)}if("envelope"in s&&s.envelope.verb==="distill")for(let u of s.envelope.pins.events){let y=o.get(u);y&&a.add(y)}let l=d==="design"?ho(i.body):null,g=l?n.get(l):void 0,p={[i.hash]:i.seq};if(i.body.replayed_from&&(p[i.body.replayed_from.orig.hash]=i.seq),g){g.group.push({seq:i.seq,hash:i.hash}),Object.assign(g.origins,p);for(let u of a)u!==g.k&&!g.deps.includes(u)&&g.deps.push(u);for(let u of i.body.nodes)r.set(u.cid,g.k);continue}let f={k:i.hash,orig:{seq:i.seq,hash:i.hash},verb:d,label:e.displayNameFor(i.body),deps:[...a],origins:p};l&&(f.group=[{seq:i.seq,hash:i.hash}],n.set(l,f)),t.push(f);for(let u of i.body.nodes)r.set(u.cid,f.k);for(let u of i.body.event_ids??[])o.set(u,f.k)}return t}var mo=e=>e instanceof mn||e instanceof yn,Ge=class{constructor(t,n,r,o){this.contextDir=t;this.fold=n;this.ledger=r;this.opts=o;this.chain=it(t)}chain;freshCtx(t){let n=ke(this.contextDir),r=rt(this.contextDir),o=Ce(this.contextDir,this.fold.base.seq,this.fold.base.hash).records.filter(i=>i.replayed_from?.backup!==this.fold.backupId);return{contextDir:this.contextDir,backupDir:this.fold.backupDir,backupId:this.fold.backupId,location:this.ledger.location,fold:this.fold,maps:this.ledger.maps,graph:r,index:n,theirs:o,probe:this.opts.probe===void 0?Or:this.opts.probe,...t?{answer:t}:{}}}recordAt(t){let n=t===1?null:this.chain.hashAt(t-1),r=Ce(this.contextDir,t-1,n).records[0];if(!r)throw new Error(`record ${t} vanished after its append`);return r}emit(t){this.opts.onItem?.(t)}card(t,n){return{holdId:`h${t.orig.seq}`,kind:n.kind,verb:t.verb,orig:t.orig,label:t.label,mine:n.mine,theirs:n.theirs,answers:n.answers,detail:n.detail}}finish(t,n){this.ledger.endItem(t.k,n);let r=this.fold.backupId;if("held"in n){let o=n.held;this.emit({type:"sync_rebase_decision",...te(r,o,this.ledger.location)}),this.emit({type:"sync_rebase_item",rebase_id:r,seq:t.orig.seq,intent:t.verb,outcome:"decision",reason:`${o.kind}: ${o.theirs}`})}else if("applied"in n){let o=this.ledger.aliases.filter(i=>i.k===t.k).map(({from:i,to:s})=>({from:i,to:s}));this.emit({type:"sync_rebase_item",rebase_id:r,seq:t.orig.seq,intent:t.verb,outcome:"reapplied",...o.length>0?{aliases:o}:{}})}else"deduped"in n?this.emit({type:"sync_rebase_item",rebase_id:r,seq:t.orig.seq,intent:t.verb,outcome:"already-present",reason:`already present: ${n.deduped.as.slice(0,19)}`}):this.emit({type:"sync_rebase_item",rebase_id:r,seq:t.orig.seq,intent:t.verb,outcome:"not-reapplied",reason:n.skipped.reason})}async runItem(t,n,r=0){let o=(t.deps??[]).find(c=>{let a=this.ledger.item(c).outcome;return a!==void 0&&"held"in a});if(o){let c=this.ledger.item(o);this.ledger.beginItem(t.k,{seq:0,hash:null}),this.finish(t,{held:this.card(t,{kind:"dependency",mine:t.label,theirs:`depends on decision h${c.orig.seq} (${c.label})`,answers:["keep-theirs"],detail:{depends_on:c.orig.seq}})});return}let i=(t.group??[t.orig]).filter(c=>c.seq>r).map(c=>this.fold.recordAt(c.seq)),s=this.freshCtx(n);r===0&&this.ledger.beginItem(t.k,{seq:s.graph.lastSeq,hash:s.graph.latestHash});let d;for(let c of i){let a=await this.runRecord(s,t,c,n);if("held"in a){this.finish(t,a);return}d=a,s=this.freshCtx(n)}this.finish(t,d??{skipped:{reason:"nothing to replay"}})}async runRecord(t,n,r,o){let i=xr(this.fold,r);if("hold"in i)return{held:this.card(n,{kind:"unreadable",mine:n.label,theirs:i.hold,answers:["keep-theirs"],detail:{record:r.body}})};let s=i.envelope,d=this.opts.registry?.find(c=>c.verb===s.verb)??qr(s.verb,s.v);if(!d)return{held:this.card(n,{kind:"unknown-intent",mine:n.label,theirs:`intent ${s.verb} v${s.v} is not one this build replays`,answers:["keep-theirs"],detail:{envelope:s}})};for(let c=0;;c++){let a;try{a=d.precheck(t,s,r,d.rebind(t,s,r))}catch(u){if(u instanceof G)return{held:this.card(n,{kind:"unmapped",mine:n.label,theirs:u.message,answers:["keep-theirs"],detail:{}})};throw u}if(a.kind==="noop")return{skipped:{reason:a.reason}};if(a.kind==="hold")return{held:this.card(n,a.hold)};if(a.kind==="dedupe")return this.ledger.maps.record.set({seq:r.seq,hash:r.hash},{dedupedAs:a.as}),this.ledger.setMaps(this.ledger.maps),{deduped:{as:a.as}};let l=[...a.aliases??[],...Ar(t,r.body)],g=r.body.replayed_from,p={replayed_from:{backup:this.fold.backupId,orig:g?.orig??{seq:r.seq,hash:r.hash},orig_digests:g?.orig_digests??r.body.event_digests??[],aliases:l}},f;this.opts.failpoint?.("before-append",{seq:r.seq,verb:s.verb});try{f=await d.replay(t,a.inputs,p)}catch(u){if(mo(u)&&c<Tr){t=this.freshCtx(o);continue}let y=this.ledger.reconcile(n.k,this.chain);return y?this.applied(n,r,y):{held:this.card(n,{kind:"refused",mine:n.label,theirs:u instanceof Error?u.message:String(u),answers:["keep-theirs"],detail:{}})}}if(this.opts.failpoint?.("after-append",{seq:r.seq,verb:s.verb}),f.errors&&f.errors.length>0){if(f.errors[0].code==="STALE_BASIS"&&c<Tr){t=this.freshCtx(o);continue}return{held:this.card(n,{kind:"refused",mine:n.label,theirs:f.errors.map(u=>`${u.code}: ${u.detail}`).join("; "),answers:["keep-theirs"],detail:{errors:f.errors}})}}if(f.record)return this.applied(n,r,{seq:f.record.seq,hash:this.chain.hashAt(f.record.seq)},f.record);if(f.landed){let u=this.ledger.reconcile(n.k,this.chain);return u?this.applied(n,r,u):{held:this.card(n,{kind:"refused",mine:n.label,theirs:"the committer reported a write that is not in the chain",answers:["keep-theirs"],detail:{}})}}return{skipped:{reason:f.reason??"nothing to write"}}}}applied(t,n,r,o){let i=o??this.recordAt(r.seq),s=Cr(n.body,i);for(let[c,a]of s)c!==a&&this.ledger.maps.cid.set(c,a);let d=n.body.nodes.length>0&&i.nodes.length===0?this.ledger.maps.cid.rewrite(n.body.nodes[0].cid):null;this.ledger.maps.record.set({seq:n.seq,hash:n.hash},d?{dedupedAs:d}:r),this.ledger.setMaps(this.ledger.maps);for(let c of Pr(n.body,i,s))this.ledger.addAlias({...c,k:t.k});return d?{deduped:{as:d,newSeq:r.seq,newHash:r.hash}}:{applied:{newSeq:r.seq,newHash:r.hash}}}async reconcilePending(t,n){let r,o=0;for(let s of n){let d=this.fold.recordAt(s.member);r=this.applied(t,d,{seq:s.seq,hash:s.hash},this.recordAt(s.seq)),o=Math.max(o,d.seq)}(t.group??[]).some(s=>s.seq>o)?await this.runItem(t,t.answer,o):this.finish(t,r??{skipped:{reason:"nothing to replay"}})}async walk(){for(let t of this.ledger.items)t.outcome===void 0&&await this.runItem(t,t.answer)}async answer(t,n,r){let o=this.ledger.resolveHold(t,n);n==="keep-theirs"?(this.ledger.beginItem(o.k,{seq:0,hash:null}),this.finish(o,{skipped:{reason:`you kept ${this.ledger.location}'s version`}})):await this.runItem(o,n);let i=s=>{let d=this.ledger.item(s).outcome;return d!==void 0&&"held"in d};for(let s=!0;s;){s=!1;for(let d of this.ledger.items){let c=d.outcome;c===void 0||!("held"in c)||c.held.kind!=="dependency"||(d.deps??[]).some(i)||r?.has(c.held.holdId)||(this.ledger.reopenHold(c.held.holdId),await this.runItem(d),s=!0)}}}result(){let t={applied:0,skipped:0,held:0,deduped:0};for(let n of this.ledger.items){let r=n.outcome;r&&("applied"in r?t.applied++:"held"in r?t.held++:"deduped"in r?t.deduped++:t.skipped++)}return{...t,ledger:this.ledger}}async settle(){let t=new Set(Object.keys(this.opts.verdicts??{}));for(let[r,o]of Object.entries(this.opts.verdicts??{}))await this.answer(r,o,t);let n=this.result();return n.held===0&&this.ledger.close("done"),this.emit({type:"sync_rebase_done",rebase_id:this.fold.backupId,reapplied:n.applied,already_present:n.deduped,not_reapplied:n.skipped,decisions_open:n.held,status:n.held===0?"complete":"paused"}),n}};function Fr(e,t){let n=t.answersFor;if(!(n===void 0||e.backupId===n.rebaseId&&e.rev===n.rev))throw new R("SYNC_REBASE_PENDING",e.backupId===n.rebaseId?`rebase ${e.backupId} changed since your answers were checked (revision ${n.rev}, now ${e.rev}); nothing was written`:`your answers were checked against rebase ${n.rebaseId}, but rebase ${e.backupId} is the open one; nothing was written`,"run kane-cli context sync status to read the decisions again, then run the command again with your answers")}var Lr=e=>new O(`rebase ${e} is closed \u2014 kane-cli context sync doctor lists every rebase and what it reapplied`);function Kt(e){let t=lo(e,"base-witness.json");if(po(t))try{let n=JSON.parse(uo(t,"utf8")).name;return typeof n=="string"?n:void 0}catch{return}}async function Br(e,t,n={}){let r=fe(e,co(t));try{He(t);let o=Y(e);if(o)throw new O(`rebase ${o.backupId} is still open \u2014 run kane-cli context sync or kane-cli context pull to finish it, or kane-cli context sync doctor --abort to close it`);let i=pt(e,t),s=tr(e,t,go(i),i.from,n.location??Kt(t)),d=new Ge(e,i,s,n),c=it(e);for(let a of s.items){let l=s.reconcileFrom(a.k,c,i.base);l.length!==0&&(s.beginItem(a.k,{seq:i.base.seq,hash:i.base.hash}),await d.reconcilePending(a,l))}return await d.walk(),await d.settle()}finally{r()}}async function Dr(e,t,n={}){let r=fe(e,t);try{let o=ne(e,t);if(o.state!=="open")throw Lr(t);Fr(o,n),He(o.backup);let i=it(e);if(!o.lastAppliedInChain(i))throw new O(`the last reapplied record of ${t} is no longer in the chain: the store was reset or rebuilt underneath the rebase \u2014 kane-cli context sync doctor --abort closes it; kane-cli context sync doctor --export <dir> --from ${t} builds the saved store beside`);let s=new Ge(e,pt(e,o.backup),o,n),d=o.pendingItem();if(d){let c=o.reconcileAll(d.k,i);c.length>0?await s.reconcilePending(d,c):await s.runItem(d,d.answer)}return await s.walk(),await s.settle()}finally{r()}}function Mr(e,t){let n=fe(e,t);try{let r=ne(e,t);return r.state==="open"&&r.close("abort"),r}finally{n()}}function mt(e){return e.listHolds()}async function Hr(e,t,n,r,o={}){let i=fe(e,t);try{let s=ne(e,t);if(s.state!=="open")throw Lr(t);Fr(s,o);let d=new Ge(e,pt(e,s.backup),s,o);await d.answer(n,r);let c=d.result();return c.held===0&&s.close("done"),c}finally{i()}}import{constants as yo,copyFileSync as bo,existsSync as Ve,lstatSync as zt,mkdirSync as Gr,readdirSync as Jr,readFileSync as wt,realpathSync as Vr}from"fs";import{basename as Wr,dirname as Ur,join as D,relative as wo,resolve as vo,sep as $o}from"path";function Kr(e,t,n){He(t);let r=ko(t),o=JSON.parse(wt(D(t,"base-witness.json"),"utf8")),i=D(n,".context"),s=Vr(e),d=yt(n),c=yt(i),a=yt(ue(n));for(let[h,m]of[["the target",d],[".context there",c],["the tests directory there",a]]){if(bt(m,s))throw new Error(`${h} (${m}) is inside the live store ${e}; export into a directory outside it`);if(bt(m,yt(t)))throw new Error(`${h} (${m}) is inside the backup ${t}; export into a directory outside it`)}if(!bt(c,d))throw new Error(`${i} is a link that leaves ${n} (${c}); export into a directory whose .context is its own`);if(!bt(a,d))throw new Error(`${ue(n)} is a link that leaves ${n} (${a}); export into a directory whose tests directory is its own`);if(o.base.seq>0&&$n(e,o.base.seq)!==o.base.hash)throw new Error(`backup ${Wr(t)} continues position ${o.base.seq} of a chain this store no longer holds (a later rebase replaced it): export from the rebase whose base is current, or clone the location and export there`);if(Ve(i)&&Jr(i).length>0)throw new Error(`${i} already exists and is not empty; export into a fresh directory`);for(let{name:h}of r){if(!h.startsWith("tests/"))continue;let m=D(ue(n),h.slice(6));if(Yt(m))throw new Error(`${m} already exists; export into a fresh directory`)}if(Yt(i)&&zt(i).isSymbolicLink())throw new Error(`${i} is a link; export into a directory whose .context is its own`);Gr(i,{recursive:!0});let{records:l,hashes:g}=$e(e),p=0;for(let h of l){if(h.seq>=o.from)break;let m=g[h.seq-1].slice(7),w=`${String(h.seq).padStart(6,"0")}-${m.slice(0,12)}.json`;Je(D(e,"commits",w),D(i,"commits",w));let v=D("intents",m.slice(0,2),`${m}.json`);Ve(D(e,v))&&Je(D(e,v),D(i,v)),p++}for(let h of["blobs","proposals"])if(Ve(D(e,h)))for(let m of Yr(D(e,h)))Je(m,D(i,wo(e,m)));let f=0,u=0;for(let{name:h}of r){let m=D(t,h);if(h.startsWith("tests/"))Je(m,D(ue(n),h.slice(6))),f++;else{if(h==="base-witness.json"||h==="store.json")continue;h.startsWith("sessions/")&&u++,h.startsWith("commits/")&&p++,_o(m,D(i,h))}}et(D(i,"commits")),ve(i);let y=Xe(i),b=r.filter(h=>h.name.startsWith("commits/")).map(h=>h.name).sort().pop();if(!b||y===null||!b.includes(y.hash.slice(7,19)))throw new Error(`the materialized chain ends at ${y?.seq??0}, not at the backup's last record ${b??"(none)"}`);return ke(i),{contextDir:i,from:o.from,records:p,tests:f,sessions:u,gitignore:or(n)}}function yt(e){let t=vo(e),n=[];for(;!Ve(t);){n.unshift(Wr(t));let r=Ur(t);if(r===t)break;t=r}return D(Vr(t),...n)}var bt=(e,t)=>e===t||e.startsWith(t+$o);function ko(e){let t=D(e,"manifest.json");if(!Ve(t))throw new Error(`${e} has no manifest.json; it is not a complete backup`);return JSON.parse(wt(t,"utf8"))}function Yt(e){try{return zt(e),!0}catch{return!1}}function Je(e,t){Gr(Ur(t),{recursive:!0}),bo(e,t,yo.COPYFILE_EXCL)}function _o(e,t){if(!Yt(t))return Je(e,t);if(!(zt(t).isFile()&&wt(t).equals(wt(e))))throw new Error(`${t} already exists with other content; export into a fresh directory`)}function Yr(e){let t=[];for(let n of Jr(e,{withFileTypes:!0})){let r=D(e,n.name);n.isDirectory()?t.push(...Yr(r)):n.isFile()&&t.push(r)}return t}import{existsSync as Se,readdirSync as Xr,readFileSync as kt}from"fs";import{join as se}from"path";import{existsSync as zr,readdirSync as Ro,readFileSync as Io,rmSync as So}from"fs";import{join as vt}from"path";var Eo=/^@import\s+(\S+)\s*$/,Oo=/\.quarantined-[0-9TZ-]+$/;function Qr(e,t,n,r,o=new Map){let i=ue(t),s={restored:[],held:[],removed:[]},d=r.map(p=>n.nameOf.get(p)).filter(p=>typeof p=="string"),c=new Set,a=Yn(i);for(let p of d){let f=a.get(p)?.[0]??vt(i,`${ot(n,p)}_test.md`);zr(f)&&!(a.get(p)??[]).includes(f)&&(c.add(p),s.held.push({id:p,path:f,reason:`${f} exists with other content`}))}for(let p of d){if(c.has(p))continue;let f=Co(n,p).find(u=>c.has(u));f&&(c.add(p),s.held.push({id:p,path:vt(i,`${ot(n,p)}_test.md`),reason:`imports ${f}, which is held`}))}let l=d.filter(p=>!c.has(p)).map(p=>n.resolve(p).cid);if(l.length>0){let p=zn({graph:n,cids:l,cwd:t});for(let f of p.wrote)s.restored.push({id:f.id,path:f.path});for(let f of p.refused)s.held.push({id:f.id,path:vt(i,`${ot(n,f.id)}_test.md`),reason:f.reason})}let g=new Set(s.restored.map(p=>p.id));if(zr(i))for(let p of Ro(i)){if(!Oo.test(p))continue;let f=vt(i,p),u=$t(f),y=u?o.get(u)??u:null;if(!y||!g.has(y))continue;let b=s.restored.find(h=>h.id===y).path;$t(b)===y&&(So(f),s.removed.push(f))}return s}function Co(e,t){let n=e.resolve(t);return((n?e.getNode(n.tip)?.content.test_md_blob:void 0)??"").split(`
8
+ `).flatMap(o=>{let i=Eo.exec(o.trim());return i?[i[1]]:[]})}function $t(e){try{let t=/^---\n(?:[\s\S]*?\n)?assurance:\n\s+id:\s*(\S+)/.exec(Io(e,"utf8"));return t?t[1]:null}catch{return null}}function es(e,t){if(!t||t.length===0)return;let n=Y(e);if(!n)throw new Error(`no rebase is open, so there is no decision to answer (--answer ${t[0]})`);let r=new Map(n.listHolds().map(i=>[i.holdId,i])),o={};for(let i of t){let s=i.indexOf("=");if(s<=0)throw new Error(`--answer takes <decision id>=<choice>, got '${i}'`);let d=i.slice(0,s),c=i.slice(s+1),a=r.get(d);if(!a)throw new Error(`${d} is not an open decision of rebase ${n.backupId} \u2014 kane-cli context sync status lists them`);if(!qt.includes(c))throw new Error(`'${c}' is not a choice: use ${qt.join(", ")}`);if(!a.answers.includes(c))throw new Error(`${c} is not a choice ${d} accepts (${a.answers.join(", ")})`);o[d]=c}return{rebaseId:n.backupId,rev:n.rev,verdicts:o}}var Zr={reapplied:(e,t)=>`reapplied your ${e} from record ${t}`,"already-present":(e,t)=>`already present: your ${e} from record ${t}`,"not-reapplied":(e,t,n)=>`not reapplied: your ${e} from record ${t}${n?` (${n})`:""}`,decision:(e,t)=>`decision needed on your ${e} from record ${t}`};async function Qt(e,t,n,r,o,i,s,d,c){let a=X(o),l=Kt(o)??c??"the location",g=$=>{$.type==="sync_rebase_item"&&(e.event($),e.out(Zr[String($.outcome)](String($.intent),Number($.seq),$.reason===void 0?void 0:String($.reason))))};if(i&&i.rebaseId!==a)throw new R("SYNC_REBASE_PENDING",`your answers were checked against rebase ${i.rebaseId}, but rebase ${a} is the open one; nothing was written`,"run kane-cli context sync status to read the decisions again, then run the command again with your answers");let p=s==="continue"||Y(n)?.backupId===a?await Dr(n,a,{verdicts:i?.verdicts,answersFor:i?{rebaseId:i.rebaseId,rev:i.rev}:void 0,onItem:g}):await Br(n,o,{onItem:g,location:l}),f=We(n,r,o,p.ledger);Ee(n,p.ledger,f);let u=t.isTTY&&e.encoding!=="ndjson"&&t.walkUI?t.walkUI():null,y=!1,b=$=>y?u.note($):e.out($),h=$=>{$.type==="sync_rebase_item"&&(e.event($),b(Zr[String($.outcome)](String($.intent),Number($.seq),$.reason===void 0?void 0:String($.reason))))},m=new Set,w=new Set,v=new Set,x=new Set,ae=u?mt(ne(n,a)).length:0,F=0;try{for(;u;){let $=ne(n,a),M=mt($).filter(we=>!m.has(we.holdId)&&!w.has(we.holdId));if(M.length===0)break;let T=M[0],be=$.rev;e.event({type:"sync_rebase_decision",...te(a,T,l)}),v.add(T.holdId),F+=1,y=!0;let Z=await u.decide({card:T,index:F,total:Math.max(ae,F),rebaseId:a,location:l,record:Fe($,T.orig.seq)});if(Z==="later-all"){u.note(dt(T,Z,l));break}if(Z==="later"){u.note(dt(T,Z,l)),w.add(T.holdId);continue}await Hr(n,a,T.holdId,Z,{answersFor:{rebaseId:a,rev:be},onItem:h});let ze=ne(n,a),nn=ze.listHolds().find(we=>we.holdId===T.holdId);if(nn?(u.note(`decision ${T.holdId}: held again \u2014 ${nn.theirs}`),x.has(T.holdId)?m.add(T.holdId):(x.add(T.holdId),v.delete(T.holdId))):(u.note(dt(T,Z,l,ze.items.find(we=>we.orig.seq===T.orig.seq)?.outcome)),m.add(T.holdId)),f=We(n,r,o,ze,f),Ee(n,ze,f),u.interrupted?.())break}}finally{u&&await u.close(),y=!1}let U=ne(n,a),A=mt(U).filter($=>!v.has($.holdId));for(let $ of A)e.event({type:"sync_rebase_decision",...te(a,$,l)});if(!u)for(let $ of Zt(A))e.out($);let Q=U.listHolds().length;Q===0&&U.state==="open"&&U.close("done"),Ee(n,U,f);for(let $ of Ao(U,f,d))e.out($);return e.event(Xt(U,Q===0?"complete":"paused")),Q>0?3:0}var ge=(e,t)=>` ${e.padEnd(15)}${t}`;function Ao(e,t,n){let r=me(e),o=`${t.restored.length} restored${t.held.length>0?`, ${t.held.length} waiting: see kane-cli context sync status`:""}`,i=["",`rebase summary \u2014 ${r.decisions===0?"complete":"paused (decisions left)"}`,ge("rebase",e.backupId),ge("reapplied",String(r.reapplied)),ge("already there",String(r.alreadyPresent)),ge("not reapplied",String(r.notReapplied))];return r.decisions>0&&i.push(ge("undecided",String(r.decisions))),i.push(ge("test files",o)),r.decisions>0&&i.push(ge("resume",n)),i}function Zt(e){let t=Math.max(0,...e.map(r=>r.holdId.length)),n=Math.max(0,...e.map(r=>r.verb.length));return e.map(r=>` ${r.holdId.padEnd(t)} ${r.verb.padEnd(n)} ${r.mine} \xB7 ${r.answers.join(" | ")}`)}function Xt(e,t){let n=me(e);return{type:"sync_rebase_done",rebase_id:e.backupId,reapplied:n.reapplied,already_present:n.alreadyPresent,not_reapplied:n.notReapplied,decisions_open:n.decisions,status:t}}function me(e){let t={reapplied:0,alreadyPresent:0,notReapplied:0,decisions:0};for(let n of e.items){let r=n.outcome;r&&("applied"in r?t.reapplied++:"deduped"in r?t.alreadyPresent++:"held"in r?t.decisions++:t.notReapplied++)}return t}var Po=e=>e.items.filter(t=>t.outcome!==void 0&&"applied"in t.outcome),No=e=>e.items.filter(t=>t.outcome!==void 0&&"skipped"in t.outcome),qo=e=>({holdId:e.holdId,kind:e.kind,verb:e.verb,seq:e.orig.seq,label:e.label,mine:e.mine,theirs:e.theirs,answers:e.answers});function We(e,t,n,r,o){ke(e);let i=rt(e),s=new Map(r.aliases.map(h=>[h.from,h.to])),d=new Set(Object.values(r.maps.cid.toJSON())),c=JSON.parse(kt(se(n,"base-witness.json"),"utf8"));for(let h of Bt(n,c.base))for(let m of h.body.nodes)d.add(m.cid);let a=[],l=[],g=se(t,".testmuai","tests");for(let h of Se(g)?Xr(g):[]){if(!/\.quarantined-/.test(h))continue;let m=$t(se(g,h)),w=m?i.resolve(s.get(m)??m):null;!w||i.nodeLabel.get(w.tip)!==Qe.TEST||i.superseded.has(w.tip)||(d.has(w.tip)?a.push(w.tip):l.push({id:m,path:se(g,h),reason:`${m} now names ${r.location}'s test; your copy stays quarantined until its record is reapplied`}))}let p=a.length>0?Qr(e,t,i,a,s):{restored:[],held:[],removed:[]};p.held.push(...l);let f=new Set(i.nodeLabel.keys()),u=er(e,n,new Map(Object.entries(r.maps.cid.toJSON())),f),y=JSON.parse(kt(se(n,"manifest.json"),"utf8")),b=[...new Set(y.map(h=>h.name).filter(h=>h.startsWith("sessions/")).map(h=>h.split("/")[1]))];return{restored:[...o?.restored??[],...p.restored],held:p.held,removed:[...o?.removed??[],...p.removed],reparked:(o?.reparked??0)+u.reparked,unmapped:[...new Set([...o?.unmapped??[],...u.unmapped])],deadSessions:b}}function Ee(e,t,n){let r=Se(Te(e,t.backup))?JSON.parse(kt(Te(e,t.backup),"utf8")):{},o={version:1,backup:t.backupId,from:t.from,moved:t.items.map(i=>({seq:i.orig.seq,verb:i.verb,label:i.label})),applied:Po(t).map(i=>({orig:i.orig.seq,new:i.outcome.applied.newSeq})),held:t.listHolds().map(qo),declined:No(t).map(i=>({seq:i.orig.seq,reason:i.outcome.skipped.reason})),aliases:t.aliases.map(i=>({from:i.from,to:i.to})),quarantined:r.quarantinedTests??[],restored:n.restored,heldFiles:n.held,deadSessions:n.deadSessions,reparked:n.reparked,unmapped:n.unmapped,liveSideQueues:r.liveSideQueues??[],state:t.state};kn(Te(e,t.backup),JSON.stringify(o,null,2)+`
9
+ `),et(Pt(e))}function en(e,t){let n=Te(e,t);return Se(n)?JSON.parse(kt(n,"utf8")):null}function ts(e,t,n){let r=en(e,n.backup);if(!(r===null||r.state!=="closed"||(r.heldFiles??[]).length>0))return null;let i=fe(e,n.backupId);try{let s=We(e,t,n.backup,n);return Ee(e,n,s),s}finally{i()}}function _t(e){let t=se(e,"sync","backups");if(!Se(t))return;let n=xe(e)?.backup;return Xr(t).filter(o=>o.endsWith("-reset")&&Se(se(t,o,"manifest.json"))).sort().reverse().map(o=>se(t,o)).find(o=>o!==n&&!Se(se(Pt(e),`${X(o)}.json`)))}import{lstatSync as jo,realpathSync as To,rmSync as xo,statSync as Fo}from"fs";import{join as Lo}from"path";async function rs(e,t,n,r,o,i=()=>{}){let s=Lo(t,".context");if(ns(s))throw new Error(`${s} already exists \u2014 clone needs a directory without a store; to update this one run kane-cli context pull inside ${t}`);let d=Re(e,n),c=Le(d,"origin",o,{createRoot:!1});i();let a=await lt(c);if(await Bo(c),!await c.head(Ne(1)))throw await Un(c,0),new R("SYNC_LOCATION_EMPTY",`nothing to clone at ${d.location}: it holds no records`,"ask the teammate who shared this address to run kane-cli context push <name> first, then clone again");let l=!ns(t);try{let{gitignore:g}=ar(s),p=ve(s).ids,f=Fo(s);return Pe(s,{version:1,locations:[{name:"origin",kind:d.kind,location:d.location}]}),st(s,{version:1,entries:{origin:{tier:a.tier,probed_at:new Date().toISOString(),witness:null,binding:{instance_id:p.context_instance_id,realpath:To(s),dev:f.dev,ino:f.ino}}}}),r(`bound origin: ${d.kind} tier ${a.tier} (${a.detail})`),a.tier!==1&&r("pull-only: this location can be cloned and pulled, never pushed"),g?.outcome==="added"?r("added .context/ to .gitignore"):g?.outcome==="failed"&&r(`warning: could not add .context/ to .gitignore: ${g.reason}`),{...await je(s,c,"origin",r),probe:{name:"origin",kind:d.kind,tier:a.tier,detail:a.detail},...g?{gitignore:g}:{}}}catch(g){throw xo(l?t:s,{recursive:!0,force:!0}),g}}function ns(e){try{return jo(e),!0}catch{return!1}}async function Bo(e){let t=await e.get(ee);if(t===null)return;let n;try{n=JSON.parse(Buffer.from(t).toString("utf8"))}catch(o){throw new R("SYNC_OBJECT_CORRUPT",`${ee} on the storage is not JSON: ${o instanceof Error?o.message:String(o)}`,"the storage object needs a human look; nothing was created")}if(n.canonicalizer!=="v1")throw new R("SYNC_CLIENT_TOO_OLD",`the storage was written with canonicalizer ${String(n.canonicalizer)}; this kane-cli uses ${"v1"}`,"upgrade kane-cli to a release that uses that canonicalizer, then clone again");let r=await pe(e,1);if(r.hash!==n.genesis_hash)throw new R("SYNC_OBJECT_CORRUPT",`${ee} names genesis ${String(n.genesis_hash)}, but position 1 on the storage hashes ${r.hash}`,"the storage needs a human look; nothing was created")}var is=["interactive","agent","ci","override"],as="usage: kane-cli context sync [name] [--answer <id=choice>] | add <name> <descriptor> | list | remove <name> | status [name] [--show <n>] | doctor [--abort | --export <dir> [--from <rebase-id>]]";function Ye(e,t){return Ln(Fn(e.mode??""),"sync",{stdout:n=>t.out(n.replace(/\n$/,"")),stderr:n=>(t.err??t.out)(n.replace(/\n$/,""))})}function E(e,t,n,r){let o=n instanceof R?n:null,i=n instanceof K?n:null,s=o?Mn(o.code):i||n instanceof O?2:r,d=n instanceof Error?n.message:String(n);if(e.encoding==="ndjson")return o?e.event({type:"sync_error",code:o.code,detail:d,remedy:o.remedy,...o.diagnostic?{diagnostic:o.diagnostic}:{}}):i?e.event({type:"error",code:i.code,message:d,...i.remedy?{remedy:i.remedy}:{}}):e.event({type:"error",message:d}),e.done(s,s===1?"error":"refused");sr(t,d);let c=o?.remedy??i?.remedy;return c&&(t.err??t.out)(`next: ${c}`),s}function It(e,t){return e instanceof R||e instanceof O||e instanceof K||!(e instanceof Error)?e:new K("USAGE",e.message,t)}function ds(e,t){try{return Re(e,t)}catch(n){throw It(n,"check the address, then run the command again")}}function cs(e){let t=e instanceof Error?e.message:"";return t.startsWith("no locations yet")?"kane-cli context sync add <name> <descriptor>":t.startsWith("name a location")?"put the location's name after the command; kane-cli context sync list shows them":"kane-cli context sync list shows this store's locations"}async function ye(e,t,n,r=!0){if(e.mode!==void 0&&!is.includes(e.mode))return Ct(Ye({mode:"agent"},t),`sync: --mode must be interactive | agent | ci | override, got '${e.mode}'`,"MODE_USAGE");let o=Ye(e,t),i=qn(n);if(!Ue(i))return E(o,t,new Error("no context store here (run `kane-cli context ingest <files>` first)"),2);if(r){let s=await ls(o,t,i);if(s!==null)return s}return{hio:o,dir:i}}async function ls(e,t,n){try{let r=await Nt(n,"resume",o=>e.out(o));r.state==="resumed"&&e.event(us(r.result))}catch(r){return E(e,t,r,2)}return null}async function Jo(e,t,n,r,o,i,s){let d,c;try{d=Y(n),c=d?void 0:_t(n)}catch(l){return E(e,t,l,2)}let a=d?.backup??c;if(a){let l=X(a),g=d?.listHolds().length??0;e.out(d?`finishing rebase ${l} first: ${g} decision${g===1?"":"s"} waiting`:`finishing rebase ${l} first: its records were saved but not reapplied yet`);let p=`kane-cli context ${i}${s?` ${s}`:""}`,f;try{f=await Qt(e,t,n,r,a,o,d?"continue":"start",p,s)}catch(u){return E(e,t,u,1)}return f===0?null:(e.out(Vo(i,n,p)),3)}try{for(let l of _e(n).filter(g=>g.state==="closed")){let g=ts(n,r,l);g&&g.restored.length>0&&e.out(`rebase ${l.backupId}: ${g.restored.length} test file${g.restored.length===1?"":"s"} restored`)}}catch(l){return E(e,t,l,2)}return null}function Vo(e,t,n){let r=Y(t)?.listHolds()??[],o=r.length,i=r.length>0?`, or ${n} --answer ${r[0].holdId}=<choice>`:"";return`${e==="sync"?"not synced":"not pulled"}: ${o} decision${o===1?"":"s"} waiting \u2014 run ${n} to answer ${o===1?"it":"them"}${i}`}function ps(e,t){let n=Y(t);if(!n)return;let r=n.listHolds().length,o=n.items.filter(i=>i.outcome===void 0).length;throw e.event({type:"sync_rebase_open",rebase_id:n.backupId,decisions_open:r,pending:o}),new R("SYNC_REBASE_PENDING",`rebase ${n.backupId} is still open: ${r} decision${r===1?"":"s"} unresolved and ${o} local record${o===1?"":"s"} not yet processed; nothing was pushed`,fn)}function us(e){return{type:"sync_rebase_started",name:e.name,rebase_id:X(e.backup),from:e.pulled.from+1,backup_path:e.backup,moved:e.moved,quarantined_tests:e.quarantinedTests}}function fs(e,t){if(e.credentials)return e.credentials;if(e.credentialEnv!==void 0){let n=e.credentialEnv,r=process.env[`${n}_ID`],o=process.env[`${n}_SECRET`],i=r?o?null:`${n}_SECRET`:`${n}_ID`;if(i)throw new K("CREDENTIALS_MISSING",`--credential-env ${n}: ${i} is not set`,`set ${n}_ID and ${n}_SECRET in the environment, then run the command again`);return{accessKeyId:r,secretAccessKey:o}}if(e.credentialFile!==void 0){let n=tn(t,e.credentialFile),r=`write {"accessKeyId": "...", "secretAccessKey": "..."} to ${n}, or pass --credential-env <VAR>`,o;try{o=os(n,"utf-8")}catch(s){let d=s.code;throw d==="ENOENT"||d==="ENOTDIR"?new K("CREDENTIALS_MISSING",`no credential file at ${n}`,r):new K("CREDENTIALS_MISSING",`the credential file at ${n} could not be read`,"check its permissions, then run the command again")}let i;try{i=JSON.parse(o)}catch{i=null}if(typeof i!="object"||i===null||!("accessKeyId"in i)||!("secretAccessKey"in i)||typeof i.accessKeyId!="string"||typeof i.secretAccessKey!="string")throw new K("CREDENTIALS_MISSING",`the credential file at ${n} is not a JSON object with accessKeyId and secretAccessKey`,r);return{accessKeyId:i.accessKeyId,secretAccessKey:i.secretAccessKey}}return null}var hs=e=>`checking ${e}: read access and safe publishing\u2026`;async function Wo(e,t,n,r,o,i){let s=await ye(n,r,o,!1);if(typeof s=="number")return s;let{hio:d,dir:c}=s,a=null,l=null,g=!1;try{let p,f;try{ct(e),p=ds(t,o),p.kind==="s3"&&(a=fs(n,o),a&&(l=vs(e),jt(e,a))),f=Le(p,e,i)}catch(b){return E(d,r,b,2)}let u;try{d.out(hs(e)),d.event({type:"sync_probe_started",name:e,kind:p.kind}),u=await lt(f)}catch(b){return E(d,r,b,1)}let y=null;try{let b=Ae(c),h={name:e,kind:p.kind,location:p.location},m=b.locations.findIndex(U=>U.name===e),w=m===-1?null:b.locations[m].location;m===-1?b.locations.push(h):b.locations[m]=h,Pe(c,b);let v=le(c),x=v.entries[e]?.witness??null,ae=w!==null&&w!==p.location;ae&&x&&(y={witness:x,from:w});let F=Mo(c);v.entries[e]={tier:u.tier,probed_at:new Date().toISOString(),witness:ae?null:x,binding:{instance_id:ve(c).ids.context_instance_id,realpath:Do(c),dev:F.dev,ino:F.ino}},st(c,v),g=!0}catch(b){return E(d,r,b,2)}return d.out(`added ${e}: ${p.kind} tier ${u.tier} (${u.detail})`),y&&(d.out(`dropped the witness at position ${y.witness.seq}: the location changed from ${y.from} to ${p.location}`),d.event({type:"sync_witness_dropped",name:e,witness:y.witness,from:y.from,to:p.location})),u.tier===2&&d.out("pull-only: this storage did not prove atomic create"),u.tier===3&&d.out("read-only: this location can be cloned and pulled, never pushed"),d.event({type:"sync_probe",name:e,kind:p.kind,tier:u.tier,detail:u.detail}),d.done(0)}finally{a&&!g&&$s(e,l)}}async function Uo(e,t,n){let r=await ye(e,t,n,!1);if(typeof r=="number")return r;let{hio:o,dir:i}=r;try{let s=le(i),d=Ae(i).locations.map(c=>({...c,tier:s.entries[c.name]?.tier??null,witness:s.entries[c.name]?.witness??null}));if(e.json)o.out(JSON.stringify(d));else if(d.length===0)o.out("no locations yet \u2014 add one with kane-cli context sync add <name> <descriptor>");else for(let c of d)o.out(`${c.name} ${c.kind} tier ${c.tier??"?"} ${Yo(c.location,n)}`);return o.event({type:"sync_locations",locations:d}),o.done(0)}catch(s){return E(o,t,s,2)}}async function Ko(e,t,n,r){let o=await ye(t,n,r,!1);if(typeof o=="number")return o;let{hio:i,dir:s}=o;try{let d=Ae(s),c=le(s),a=d.locations.find(g=>g.name===e)?.kind,l;try{l=Gn(d,c,e)}catch(g){throw It(g,cs(g))}return Pe(s,d),a==="s3"&&Tt(e),i.out(`removed ${e}`),l&&i.out(`kept its witness at position ${l.seq}: re-adding the same storage keeps its rollback protection`),i.event({type:"sync_removed",name:e,witness:l}),i.done(0)}catch(d){return E(i,n,d,2)}}function Yo(e,t){try{return rr(Re(e,t))}catch{return e}}function zo(e,t,n){switch(n.kind){case"up-to-date":return`up to date with ${e}: position ${n.storage.seq} on both sides`;case"behind":return`behind ${e}: this store is at position ${n.local.seq}, ${e} at ${n.storage.seq} \u2014 run kane-cli context pull ${e}`;case"ahead":return`ahead of ${e}: this store is at position ${n.local.seq}, ${e} at ${n.storage.seq} \u2014 run kane-cli context push ${e}`;case"diverged":return`you and ${e} both added work after position ${n.at-1} \u2014 run kane-cli context pull ${e} --rebase to save your local work, take the team version from ${e}, and then reapply yours`;case"empty-storage":return`${e} is empty: nothing has been pushed there yet \u2014 run kane-cli context push ${e}`;case"empty-local":return`this store is empty; ${e} is at position ${n.storage.seq} \u2014 run kane-cli context pull ${e}`;case"foreign-lineage":return`${e} holds a different history (its first record is not this store's) \u2014 to work on it, clone it: kane-cli context clone ${t} <dir>`}}function Qo(e,t){let n=Y(e);if(t!==void 0){let d=Number(t);if(!Number.isInteger(d)||d<=0)throw new K("USAGE","--show takes the position of a moved record","kane-cli context sync status --show <n>");let c=n??_e(e)[0];if(!c)throw new K("USAGE","no rebase here: nothing to show","kane-cli context sync doctor lists the rebases this store has");if(!c.itemAt(d))throw new K("USAGE",`no record ${d} in rebase ${c.backupId}`,"run kane-cli context sync status to list the records that can be shown");let a=c.listHolds().find(l=>l.orig.seq===d);return{lines:Fe(c,d),rebaseId:n?.backupId??null,decisions:n?n.listHolds().map(l=>te(n.backupId,l,n.location)):[],decision:a?te(c.backupId,a,c.location):null}}if(!n){let d=_e(e)[0];return{lines:((d?en(e,d.backup):null)?.heldFiles??[]).map(l=>`test file waiting: ${l.path} \u2014 ${l.reason}`),rebaseId:null,decisions:[]}}let r=n.listHolds(),o=me(n),i=[`rebase ${n.backupId} open: ${o.decisions} decision${o.decisions===1?"":"s"} waiting`,...Zt(r)],s=r[0];return i.push(`next: kane-cli context sync${s?` \xB7 kane-cli context sync status --show ${s.orig.seq} (one record in full)`:""}`),{lines:i,rebaseId:n.backupId,decisions:r.map(d=>te(n.backupId,d,n.location))}}async function Zo(e,t,n,r,o){let i=await ye(t,n,r,!1);if(typeof i=="number")return i;let{hio:s,dir:d}=i,c=xe(d);if(c)return E(s,n,new O(`a rebase from ${c.name} was interrupted at '${c.state}' \u2014 run kane-cli context sync ${c.name} or kane-cli context pull ${c.name} to finish it, or kane-cli context sync doctor to look`),2);let a;try{a=Qo(d,t.show)}catch(p){return E(s,n,p,2)}if(t.show!==void 0){if(t.json)s.out(JSON.stringify({rebase_id:a.rebaseId,decisions:a.decisions,record:a.lines,decision:a.decision??null}));else for(let p of a.lines)s.out(p);return s.event({type:"sync_status",name:null,relation:null,rebase_id:a.rebaseId,decisions:a.decisions,record:a.lines,decision:a.decision??null}),s.done(0)}let l,g;try{l=St(d,e,r,o),g=await qe(d,l.provider,l.witness)}catch(p){if(!t.json)for(let f of a.lines)s.out(f);return E(s,n,p,p instanceof Error&&!(p instanceof R)&&!(p instanceof O)&&/no sync state|no location/.test(p.message)?2:1)}if(t.json)s.out(JSON.stringify({...g,rebase_id:a.rebaseId,decisions:a.decisions}));else{s.out(zo(l.name,l.location,g));for(let p of a.lines)s.out(p)}return s.event({type:"sync_status",name:l.name,relation:g,rebase_id:a.rebaseId,decisions:a.decisions}),s.done(0)}function St(e,t,n,r){let o;try{o=Hn(Ae(e),t)}catch(s){throw It(s,cs(s))}let i=le(e).entries[o.name];if(!i)throw new Error(`no sync state for ${o.name} \u2014 run kane-cli context sync add ${o.name} <descriptor> first`);return{name:o.name,location:o.location,provider:Le(Re(o.location,n),o.name,r),witness:i.witness}}function gs(e){return`${e.imported} records (${e.from+1}..${e.to}), ${e.blobs} blobs, ${e.proposals} proposals`}function ms(e,t,n){n.imported>0&&e.out(`pulled ${gs(n)}`),e.event({type:"sync_pull_done",name:t,...n})}function ys(e,t,n){e.out(n.pushed>0?`pushed ${n.pushed} records (${n.from+1}..${n.to}), ${n.blobs} blobs, ${n.proposals} proposals`:"up to date"),n.alreadyThere>0&&e.out(`already there: ${n.alreadyThere}`),e.event({type:"sync_push_done",name:t,from:n.from,to:n.to,pushed:n.pushed,blobs:n.blobs,proposals:n.proposals,already_there:n.alreadyThere})}async function bs(e,t,n,r,o){let i=await ye(e,t,n,!1);if(typeof i=="number")return i;let{hio:s,dir:d}=i,c;try{c=es(d,e.answer)}catch(g){return E(s,t,It(g,"kane-cli context sync status lists the open decisions and the choices each accepts"),2)}let a=await ls(s,t,d);if(a!==null)return a;let l=await Jo(s,t,d,n,c,r,o);return l!==null?s.done(l):{hio:s,dir:d,answers:c}}async function Xo(e,t,n,r,o){let i=await bs(t,n,r,"pull",e);if(typeof i=="number")return i;let{hio:s,dir:d}=i,c;try{c=St(d,e,r,o)}catch(y){return E(s,n,y,2)}let{name:a,provider:l,witness:g}=c,p=y=>s.out(y),f,u=null;try{if(t.rebase){let y=await qe(d,l,g);if(y.kind==="diverged"){let b=Zn(),h=y.local.seq-y.at+1,m=`${h} local record${h===1?"":"s"} from position ${y.at}`,w=Qn(d,b);if(!t.yes){if(s.encoding==="ndjson"||!n.isTTY)throw new R("SYNC_DIVERGED",`${m} must be saved in ${w} before this store can take ${a}'s records; no terminal is available`,`kane-cli context pull ${a} --rebase --yes`);if(!(n.walkUI?await n.walkUI().confirm({name:a,count:h,from:y.at,backupPath:Go(r,w),taking:{from:y.at,to:y.storage.seq}}):await n.confirm(`${m} will be saved in ${w}. This store will take ${a}'s records, then try to reapply yours on top; a disagreement may need your decision. No history on ${a} will be rewritten. Continue?`)))return s.out(`no rebase started \u2014 run kane-cli context pull ${a} --rebase when you are ready`),3}u=await Xn(d,l,a,y,p,{ts:b})}}f=u?u.pulled:await je(d,l,a,p)}catch(y){return E(s,n,y,1)}if(u&&s.event(us(u)),ms(s,a,f),!u)return s.done(0);try{return s.done(await Qt(s,n,d,r,u.backup,void 0,"start",`kane-cli context pull ${a}`,a))}catch(y){return E(s,n,y,1)}}async function ei(e,t,n,r,o){let i=await ye(t,n,r);if(typeof i=="number")return i;let{hio:s,dir:d}=i,c;try{c=St(d,e,r,o)}catch(l){return E(s,n,l,2)}let a;try{ps(s,d),a=await Ft(d,c.provider,c.name,l=>s.out(l))}catch(l){return E(s,n,l,1)}return ys(s,c.name,a),s.done(0)}async function ti(e,t,n,r,o){let i=await bs(t,n,r,"sync",e);if(typeof i=="number")return i;let{hio:s,dir:d}=i,c;try{c=St(d,e,r,o)}catch(p){return E(s,n,p,2)}let a=p=>s.out(p),l;try{l=await je(d,c.provider,c.name,p=>{p!=="up to date"&&a(p)},{quietAhead:!0})}catch(p){return E(s,n,p,1)}ms(s,c.name,l);let g;try{ps(s,d),g=await Ft(d,c.provider,c.name,a)}catch(p){return E(s,n,p,1)}return ys(s,c.name,g),s.done(0)}var ws=e=>e.replace(/-reset$/,"").replace(/^(\d{4}-\d{2}-\d{2})T(\d{2})-(\d{2})-(\d{2})-\d+Z$/,"$1 $2:$3:$4Z");function ni(e){let t=me(e),n=e.state==="open"?"open":e.closedBy==="abort"?"closed (aborted)":"closed";return`rebase ${e.backupId} (${ws(e.backupId)}): ${n}, ${t.reapplied} reapplied, ${t.alreadyPresent} already present, ${t.notReapplied} not reapplied, ${t.decisions} decision${t.decisions===1?"":"s"} open`}function ri(e,t){let n=Ke(e,"sync","backups");if(t!==void 0){let s=Ke(n,t);if(!Ue(Ke(s,"manifest.json")))throw new Error(`no rebase ${t} here \u2014 kane-cli context sync doctor lists them`);return s}let r=Y(e);if(r)return r.backup;let o=_e(e);if(o.length>1)throw new Error(`${o.length} rebases here: name one with --from <rebase-id> (kane-cli context sync doctor lists them)`);if(o.length===1)return o[0].backup;let i=_t(e);if(i)return i;throw new Error("no rebase here: nothing to export")}async function si(e,t,n){let r=await ye(e,t,n,!1);if(typeof r=="number")return r;let{hio:o,dir:i}=r;if(e.abort&&e.export!==void 0)return E(o,t,new Error(as),2);let s=null;if(e.abort)try{let m=await Nt(i,"abort");if(m.state==="refused")throw new R("SYNC_RESET_IMPORTED",m.detail,"run kane-cli context sync or kane-cli context pull to finish the interrupted rebase");if(m.state==="aborted")s={aborted:!0,detail:m.detail};else if(at(i).length>0){let w=at(i).map(v=>nr(i,v));s={aborted:!0,decisionsLeft:1,detail:`set aside ${w.length} unreadable ledger${w.length===1?"":"s"} (${w.map(v=>`sync/replay/${Rt(v)}`).join(", ")}); the backup${w.length===1?" stays":"s stay"} \u2014 the next kane-cli context sync reapplies ${w.length===1?"it":"them"} from the start`}}else{let w=Y(i);if(w){let v=Mr(i,w.backupId);Ee(i,v,We(i,n,v.backup,v));let x=me(v);s={aborted:!0,decisionsLeft:x.decisions,detail:`closed rebase ${v.backupId}: ${x.reapplied} reapplied stay, ${x.decisions} unresolved decision${x.decisions===1?"":"s"} left in the backup (receipt: sync/replay/${v.backupId}.receipt.json)`},o.event(Xt(v,"aborted"))}else s={aborted:!1,detail:"nothing to abort: no interrupted reset and no open rebase"}}e.json||o.out(s.detail)}catch(m){return E(o,t,m,2)}if(e.export!==void 0)try{let m=ri(i,e.from),w=Kr(i,m,tn(n,e.export)),v=X(m),x={type:"sync_rebase_exported",rebase_id:v,dir:w.contextDir,from:w.from,records:w.records,tests:w.tests,sessions:w.sessions};return e.json&&o.encoding!=="ndjson"?o.out(JSON.stringify(x)):o.out(`exported rebase ${v}: ${w.records} records (${w.tests} test files, ${w.sessions} session files) into ${w.contextDir}; it is its own store`),w.gitignore.outcome==="added"?(e.json||o.out("added .context/ to .gitignore"),o.event({type:"gitignore_updated",path:".gitignore"})):w.gitignore.outcome==="failed"&&(e.json||o.out(`warning: could not add .context/ to .gitignore: ${w.gitignore.reason}`),o.event({type:"warning",message:`could not add .context/ to .gitignore: ${w.gitignore.reason}`})),o.event(x),o.done(0)}catch(m){return E(o,t,m,2)}let d=xe(i),c=Ue(Ke(i,"commits",vn)),a=(Ue(At(i))?ss(At(i)):[]).filter(m=>m!==d?.nonce),l;try{l={state:"ok",tail:Xe(i)?.seq??0}}catch(m){l=m instanceof wn?{state:"forked",duplicates:m.duplicates}:{state:"unreadable",detail:m instanceof Error?m.message:String(m)}}let g=_e(i,{tolerant:!0}),p=at(i),f=g.find(m=>m.state==="open"),u=f?void 0:_t(i),y=Ke(i,"sync","backups"),b=Ue(y)?ss(y).filter(m=>m.endsWith(".aborted")):[],h={type:"sync_doctor",journal:d?{state:d.state,at:d.at,backup:d.backup}:null,sentinel:c,chain:l,orphan_incoming:a,rebases:[...u?[{rebase_id:X(u),state:"saved",closed_by:null,reapplied:0,alreadyPresent:0,notReapplied:0,decisions:0}]:[],...g.map(m=>({rebase_id:m.backupId,state:m.state,closed_by:m.closedBy??null,...me(m)}))],open_rebase:f?.backupId??u?.split("/").pop()??null,unreadable_ledgers:p,aborted_leftovers:b,aborted:s?.aborted??!1,...s?{detail:s.detail}:{}};if(e.json&&o.encoding!=="ndjson")return o.out(JSON.stringify(h)),o.event(h),o.done(s?.decisionsLeft?3:0);if(!s){o.out(d?`reset in progress, stopped at '${d.state}': from position ${d.at}, backup ${d.backup} \u2014 kane-cli context sync or kane-cli context pull finishes it; kane-cli context sync doctor --abort undoes it before the import`:"no reset in progress"),o.out(`sentinel: ${c?d?"present":"present with no journal \u2014 a reset lost its journal; the newest sync/backups/*-reset/ holds the moved records \u2014 run kane-cli context fsck and kane-cli context sync doctor --json and share both outputs":"absent"}`),l.state==="ok"?o.out(`chain: ok, tail at position ${l.tail}`):l.state==="forked"?o.out(`chain: FORKED \u2014 ${l.duplicates.join(", ")}; move the foreign files out of commits/, then run kane-cli context rebuild`):o.out(`chain: ${l.detail}`);for(let m of a)o.out(`orphan staging: sync/incoming/${m} \u2014 left by a reset that never wrote its journal; safe to delete`);u&&o.out(`rebase ${X(u)} (${ws(X(u))}): saved, not reapplied yet`);for(let m of g)o.out(ni(m));for(let m of b)o.out(`aborted backup: sync/backups/${m} \u2014 left by an abort that did not finish cleaning up; safe to delete`);for(let m of p)o.out(`unreadable ledger: sync/replay/${m}.json \u2014 every write refuses until it is set aside; its backup sync/backups/${m} stays`);p.length>0?o.out("next: kane-cli context sync doctor --abort sets the unreadable ledger aside; the next kane-cli context sync reapplies its backup from the start"):f?o.out(`next: kane-cli context sync (or kane-cli context pull) to finish rebase ${f.backupId}; kane-cli context sync doctor --abort to close it instead`):u&&o.out(`next: kane-cli context sync (or kane-cli context pull) to reapply the saved records of rebase ${X(u)}`)}return o.event(h),o.done(s?.decisionsLeft?3:0)}async function oi(e,t,n,r,o,i){if(n.mode!==void 0&&!is.includes(n.mode))return Ct(Ye({mode:"agent"},r),`clone: --mode must be interactive | agent | ci | override, got '${n.mode}'`,"MODE_USAGE");let s=Ye(n,r);if(e===void 0)return E(s,r,new K("USAGE","clone needs a location","kane-cli context clone <descriptor> [dir]"),2);let d,c;try{let p=ds(e,o),f=p.kind==="dir"?Rt(p.path):p.kind==="s3"?Rt(p.prefix)||p.bucket:p.kind==="git"?Rt(p.gitUrl).replace(/\.git$/,""):p.location.slice(7);d=tn(o,t??f);let u=p.kind==="s3"?fs(n,o):null,y=u?vs("origin"):null;u&&jt("origin",u);try{c=await rs(e,d,o,b=>s.out(b),i,()=>{s.out(hs("origin")),s.event({type:"sync_probe_started",name:"origin",kind:p.kind})})}catch(b){throw u&&$s("origin",y),b}}catch(p){return E(s,r,p,2)}let{probe:a,gitignore:l,...g}=c;return s.out(`cloned into ${d}: ${gs(c)}`),s.event({type:"sync_probe",...a}),l?.outcome==="added"?s.event({type:"gitignore_updated",path:".gitignore"}):l?.outcome==="failed"&&s.event({type:"warning",message:`could not add .context/ to .gitignore: ${l.reason}`}),s.event({type:"sync_pull_done",name:"origin",dir:d,...g}),s.done(0)}function vs(e,t){try{return os(ct(e,t),"utf-8")}catch{return null}}function $s(e,t,n){t===null?Tt(e,n):Ho(ct(e,n),t,{mode:384})}async function jd(e,t,n){let r=Be(),o=process.cwd();switch(e){case"add":if(t.length===2)return Wo(t[0],t[1],n,r,o);break;case"list":if(t.length===0)return Uo(n,r,o);break;case"remove":if(t.length===1)return Ko(t[0],n,r,o);break;case"status":if(t.length<=1)return Zo(t[0],n,r,o);break;case"doctor":if(t.length===0)return si(n,r,o);break;default:if(t.length===0)return ti(e,n,r,o)}return E(Ye(n,r),r,new Error(as),2)}function Td(e,t){return ei(e,t,Be(),process.cwd())}function xd(e,t){return Xo(e,t,Be(),process.cwd())}function Fd(e,t,n){return oi(e,t,n,Be(),process.cwd())}export{Ye as a,E as b,ye as c,ls as d,Jo as e,fs as f,Wo as g,Uo as h,Ko as i,Zo as j,Xo as k,ei as l,ti as m,si as n,oi as o,vs as p,$s as q,jd as r,Td as s,xd as t,Fd as u};
@@ -1,4 +1,4 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as m,c}from"./chunk-EYOCNMUM.js";import{c as b,j as h}from"./chunk-33GXXC2L.js";import{readFileSync as w,writeFileSync as y,mkdirSync as C,existsSync as k}from"fs";import{dirname as x}from"path";var f={window_size:{width:1920,height:1080},chrome_profile_path:"",default_url:h,model:"v16-alpha",project_id:null,project_name:null,folder_id:null,folder_name:null,mode:"testing",assertion_mode:"dom",network_ws:!1,network_sse:!1,bug_detection:"off",final_validation:!1,code_export:{enabled:!0,language:"python",skip_validation:!0},generate:{scenario_limit:2,per_scenario_limit:3,memory_enabled:!1},last_seen_version:"",hints_enabled:!0};function T(o){let{mobile:e,...i}=o,t={...i};delete t.target,delete t.device,delete t.device_name,delete t.os_version,delete t.app;let n=e??{};n.tui_target&&(t.target=n.tui_target);let s=n.default_target?.name?.trim(),l=n.default_target?.os_version?.trim();if(s||l)s&&(t.device_name=s),l&&(t.os_version=l);else{let r=n.default_target?.id?.trim();r&&(t.device=r)}n.default_app&&(t.app=n.default_app);let a={};return n.no_reset!==void 0&&(a.no_reset=n.no_reset),n.appium_url!==void 0&&(a.appium_url=n.appium_url),n.auto_grant_permissions!==void 0&&(a.auto_grant_permissions=n.auto_grant_permissions),n.auto_accept_alerts!==void 0&&(a.auto_accept_alerts=n.auto_accept_alerts),Object.keys(a).length>0&&(t.mobile=a),t}function S(o){let e=o.mobile??{},i=typeof o.target=="string"?o.target:void 0,t=typeof o.device=="string"&&o.device.trim()!==""?o.device.trim():void 0,n=g=>typeof g=="string"&&g.trim()!==""?g.trim():void 0,s=n(o.device_name),l=n(o.os_version),a=typeof o.app=="string"&&o.app!==""?o.app:void 0,r={},u=i??e.tui_target;u&&(r.tui_target=u);let _=m(u,void 0).kind,d=_==="emulator"||_==="simulator"?_:null;d&&(s||l)?r.default_target={platform:c(d),kind:d,...s?{name:s}:{},...l?{os_version:l}:{}}:d&&t?r.default_target={platform:c(d),kind:d,id:t}:(e.default_target?.id?.trim()||e.default_target?.name?.trim())&&(r.default_target=e.default_target);let p=a??e.default_app;return p&&(r.default_app=p),e.no_reset!==void 0&&(r.no_reset=e.no_reset),e.appium_url!==void 0&&(r.appium_url=e.appium_url),e.auto_grant_permissions!==void 0&&(r.auto_grant_permissions=e.auto_grant_permissions),e.auto_accept_alerts!==void 0&&(r.auto_accept_alerts=e.auto_accept_alerts),Object.keys(r).length>0?r:void 0}var v=class{constructor(e=b){this.path=e}exists(){return k(this.path)}load(){try{let e=w(this.path,"utf-8"),i=JSON.parse(e),t=S(i),{target:n,device:s,app:l,...a}=i;return{...f,...a,...t?{mobile:t}:{},code_export:{...f.code_export,...i.code_export??{}},generate:{...f.generate,...i.generate??{}}}}catch{return{...f,code_export:{...f.code_export},generate:{...f.generate}}}}write(e){try{C(x(this.path),{recursive:!0}),y(this.path,JSON.stringify(T(e),null,2)+`
2
+ import{a as m,c}from"./chunk-EYOCNMUM.js";import{c as b,j as h}from"./chunk-HYTBEPC2.js";import{readFileSync as w,writeFileSync as y,mkdirSync as C,existsSync as k}from"fs";import{dirname as x}from"path";var f={window_size:{width:1920,height:1080},chrome_profile_path:"",default_url:h,model:"v16-alpha",project_id:null,project_name:null,folder_id:null,folder_name:null,mode:"testing",assertion_mode:"dom",network_ws:!1,network_sse:!1,bug_detection:"off",final_validation:!1,code_export:{enabled:!0,language:"python",skip_validation:!0},generate:{scenario_limit:2,per_scenario_limit:3,memory_enabled:!1},last_seen_version:"",hints_enabled:!0};function T(o){let{mobile:e,...i}=o,t={...i};delete t.target,delete t.device,delete t.device_name,delete t.os_version,delete t.app;let n=e??{};n.tui_target&&(t.target=n.tui_target);let s=n.default_target?.name?.trim(),l=n.default_target?.os_version?.trim();if(s||l)s&&(t.device_name=s),l&&(t.os_version=l);else{let r=n.default_target?.id?.trim();r&&(t.device=r)}n.default_app&&(t.app=n.default_app);let a={};return n.no_reset!==void 0&&(a.no_reset=n.no_reset),n.appium_url!==void 0&&(a.appium_url=n.appium_url),n.auto_grant_permissions!==void 0&&(a.auto_grant_permissions=n.auto_grant_permissions),n.auto_accept_alerts!==void 0&&(a.auto_accept_alerts=n.auto_accept_alerts),Object.keys(a).length>0&&(t.mobile=a),t}function S(o){let e=o.mobile??{},i=typeof o.target=="string"?o.target:void 0,t=typeof o.device=="string"&&o.device.trim()!==""?o.device.trim():void 0,n=g=>typeof g=="string"&&g.trim()!==""?g.trim():void 0,s=n(o.device_name),l=n(o.os_version),a=typeof o.app=="string"&&o.app!==""?o.app:void 0,r={},u=i??e.tui_target;u&&(r.tui_target=u);let _=m(u,void 0).kind,d=_==="emulator"||_==="simulator"?_:null;d&&(s||l)?r.default_target={platform:c(d),kind:d,...s?{name:s}:{},...l?{os_version:l}:{}}:d&&t?r.default_target={platform:c(d),kind:d,id:t}:(e.default_target?.id?.trim()||e.default_target?.name?.trim())&&(r.default_target=e.default_target);let p=a??e.default_app;return p&&(r.default_app=p),e.no_reset!==void 0&&(r.no_reset=e.no_reset),e.appium_url!==void 0&&(r.appium_url=e.appium_url),e.auto_grant_permissions!==void 0&&(r.auto_grant_permissions=e.auto_grant_permissions),e.auto_accept_alerts!==void 0&&(r.auto_accept_alerts=e.auto_accept_alerts),Object.keys(r).length>0?r:void 0}var v=class{constructor(e=b){this.path=e}exists(){return k(this.path)}load(){try{let e=w(this.path,"utf-8"),i=JSON.parse(e),t=S(i),{target:n,device:s,app:l,...a}=i;return{...f,...a,...t?{mobile:t}:{},code_export:{...f.code_export,...i.code_export??{}},generate:{...f.generate,...i.generate??{}}}}catch{return{...f,code_export:{...f.code_export},generate:{...f.generate}}}}write(e){try{C(x(this.path),{recursive:!0}),y(this.path,JSON.stringify(T(e),null,2)+`
3
3
  `)}catch(i){let t=i instanceof Error?i.message:String(i);process.stderr.write(`[config] Failed to save config: ${t}
4
4
  `)}}set(e,i){let t=this.load();t[e]=i,this.write(t)}save(e){this.write({...this.load(),...e})}getMobile(){return this.load().mobile??{}}setMobile(e){let i={...this.getMobile()};for(let t of Object.keys(e)){let n=e[t];n===void 0?delete i[t]:i[t]=n}this.set("mobile",Object.keys(i).length>0?i:void 0)}writeRaw(e){this.write(e)}};export{v as a};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as B,c as S,d as T}from"./chunk-K2UEVCIJ.js";import{c as g}from"./chunk-RFHMDQXZ.js";import{a as E}from"./chunk-AQWTK6IN.js";import{y as n}from"./chunk-33GXXC2L.js";import{a as h}from"./chunk-HCBYKLMW.js";import{a as i,b as c,c as w,i as x}from"./chunk-C44QQJR4.js";import{a as L}from"./chunk-6YGTRKDT.js";import{e as u}from"./chunk-UR6MHSHU.js";var l=u(L(),1);var r=u(h(),1);function y(e){return new Map(e.map((o,s)=>[`${s}-${o.label}`,o.packPath]))}async function H(e){let o=e.deps?.viewerBase??S(e.env),s=e.deps?.startServer??B,a=e.deps?.openUrl??(m=>g(m).then(()=>{})),t=y(e.rows),d;try{d=await s({packs:t,allowedOrigins:[new URL(o).origin]});let m=d,D=async p=>{let v=[...t.keys()][p];await a(T(m.urlFor(v),o))};if(e.deps?.hold){await e.deps.hold();return}await new Promise(p=>{let v=w(l.default.createElement(P,{rows:e.rows,onOpen:D,onDone:()=>{v.unmount(),p()}}),{stdout:process.stderr,exitOnCtrlC:!1})})}finally{await d?.close()}}function I(e){return e==="passed"?n.green:e==="failed"||e==="broken"||e==="cancelled"?n.red:n.dim}var b=40,R=9,k=20;function f(e,o){return e.length>o?e.slice(0,o-1)+"\u2026":e.padEnd(o)}function O({row:e,selected:o}){let s=e.testId??e.commitId??"";return(0,r.jsxs)(i,{children:[(0,r.jsx)(i,{width:2,flexShrink:0,children:(0,r.jsx)(c,{color:n.orange,children:o?"\u25B8":" "})}),(0,r.jsx)(i,{width:2,flexShrink:0,children:(0,r.jsx)(c,{color:e.kind==="execution"?n.orange:n.muted,children:e.kind==="execution"?"\u25CF":"\u25CB"})}),(0,r.jsx)(i,{width:b,flexShrink:0,children:(0,r.jsx)(c,{color:o?n.orange:void 0,bold:o,wrap:"truncate-end",children:f(e.label,b)})}),(0,r.jsx)(i,{width:R,flexShrink:0,children:(0,r.jsx)(c,{color:I(e.status),bold:o,wrap:"truncate-end",children:f(e.status,R)})}),(0,r.jsx)(i,{width:k,flexShrink:0,children:(0,r.jsx)(c,{color:n.dim,wrap:"truncate-end",children:f(s,k)})})]})}function P(e){let[o,s]=(0,l.useState)(0);return x((a,t)=>{t.upArrow?s(d=>Math.max(0,d-1)):t.downArrow?s(d=>Math.min(e.rows.length-1,d+1)):t.return||a==="o"?e.onOpen(o):(a==="q"||t.escape)&&e.onDone()}),(0,r.jsx)(E,{title:"Evidence",borderColor:n.muted,children:(0,r.jsxs)(i,{flexDirection:"column",children:[e.rows.map((a,t)=>(0,r.jsx)(O,{row:a,selected:t===o},t)),(0,r.jsx)(i,{marginTop:1,children:(0,r.jsx)(c,{color:n.dim,children:"\u2191/\u2193 move \xB7 enter/o open \xB7 q quit"})})]})})}export{y as a,H as b};
2
+ import{b as B,c as S,d as T}from"./chunk-GSDXZS4U.js";import{c as g}from"./chunk-RFHMDQXZ.js";import{a as E}from"./chunk-XXE7W5AV.js";import{y as n}from"./chunk-HYTBEPC2.js";import{a as h}from"./chunk-HCBYKLMW.js";import{a as i,b as c,c as w,i as x}from"./chunk-C44QQJR4.js";import{a as L}from"./chunk-6YGTRKDT.js";import{e as u}from"./chunk-UR6MHSHU.js";var l=u(L(),1);var r=u(h(),1);function y(e){return new Map(e.map((o,s)=>[`${s}-${o.label}`,o.packPath]))}async function H(e){let o=e.deps?.viewerBase??S(e.env),s=e.deps?.startServer??B,a=e.deps?.openUrl??(m=>g(m).then(()=>{})),t=y(e.rows),d;try{d=await s({packs:t,allowedOrigins:[new URL(o).origin]});let m=d,D=async p=>{let v=[...t.keys()][p];await a(T(m.urlFor(v),o))};if(e.deps?.hold){await e.deps.hold();return}await new Promise(p=>{let v=w(l.default.createElement(P,{rows:e.rows,onOpen:D,onDone:()=>{v.unmount(),p()}}),{stdout:process.stderr,exitOnCtrlC:!1})})}finally{await d?.close()}}function I(e){return e==="passed"?n.green:e==="failed"||e==="broken"||e==="cancelled"?n.red:n.dim}var b=40,R=9,k=20;function f(e,o){return e.length>o?e.slice(0,o-1)+"\u2026":e.padEnd(o)}function O({row:e,selected:o}){let s=e.testId??e.commitId??"";return(0,r.jsxs)(i,{children:[(0,r.jsx)(i,{width:2,flexShrink:0,children:(0,r.jsx)(c,{color:n.orange,children:o?"\u25B8":" "})}),(0,r.jsx)(i,{width:2,flexShrink:0,children:(0,r.jsx)(c,{color:e.kind==="execution"?n.orange:n.muted,children:e.kind==="execution"?"\u25CF":"\u25CB"})}),(0,r.jsx)(i,{width:b,flexShrink:0,children:(0,r.jsx)(c,{color:o?n.orange:void 0,bold:o,wrap:"truncate-end",children:f(e.label,b)})}),(0,r.jsx)(i,{width:R,flexShrink:0,children:(0,r.jsx)(c,{color:I(e.status),bold:o,wrap:"truncate-end",children:f(e.status,R)})}),(0,r.jsx)(i,{width:k,flexShrink:0,children:(0,r.jsx)(c,{color:n.dim,wrap:"truncate-end",children:f(s,k)})})]})}function P(e){let[o,s]=(0,l.useState)(0);return x((a,t)=>{t.upArrow?s(d=>Math.max(0,d-1)):t.downArrow?s(d=>Math.min(e.rows.length-1,d+1)):t.return||a==="o"?e.onOpen(o):(a==="q"||t.escape)&&e.onDone()}),(0,r.jsx)(E,{title:"Evidence",borderColor:n.muted,children:(0,r.jsxs)(i,{flexDirection:"column",children:[e.rows.map((a,t)=>(0,r.jsx)(O,{row:a,selected:t===o},t)),(0,r.jsx)(i,{marginTop:1,children:(0,r.jsx)(c,{color:n.dim,children:"\u2191/\u2193 move \xB7 enter/o open \xB7 q quit"})})]})})}export{y as a,H as b};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{d as G,f as q,h as H}from"./chunk-7GUFVQOQ.js";import{a as j,b as z,c as K}from"./chunk-XH2KDLZO.js";import{d as B,f as O}from"./chunk-FUP4AP6J.js";import{a as N}from"./chunk-MMBBQ4OZ.js";import{b as F,c as $,j as R}from"./chunk-NU45ROHH.js";import{a as L}from"./chunk-TZXXJWHA.js";import{n as T}from"./chunk-RSSOJ3L2.js";import{a as Y,b as C,c as V}from"./chunk-PWRIG6UB.js";import{h as J}from"./chunk-TAOHYWEO.js";import{e as E}from"./chunk-Z7S3IWUX.js";import{b as M}from"./chunk-33GXXC2L.js";function X(e){return e.kind==="simulator"?e.id:e.virtualName??e.id}function Z(e,r,t={}){let o={platform:e.platform,udid:e.id,target_kind:e.kind};return r&&(o.app_package=r),t.noReset!==void 0&&(o.no_reset=t.noReset),t.appiumUrl&&(o.appium_url=t.appiumUrl),e.platform==="android"&&t.autoGrantPermissions!==void 0&&(o.auto_grant_permissions=t.autoGrantPermissions),e.platform==="ios"&&t.autoAcceptAlerts!==void 0&&(o.auto_accept_alerts=t.autoAcceptAlerts),o}function Q(e=process.env){let r=e.KANE_APPIUM_URL?.trim();return r||null}import{createHash as De}from"crypto";import{readdir as ke,stat as xe}from"fs/promises";import{basename as g,extname as Ie,join as Ue,relative as Se}from"path";import{createHash as ge}from"crypto";import{createReadStream as fe}from"fs";import{mkdir as me,readFile as he,rename as ve,writeFile as we}from"fs/promises";import{dirname as be,join as ye}from"path";var Pe=60,Te=5;function W(){return{entries:[]}}function ee(){return ye(M,"mobile","app-cache.json")}async function A(e){let r=ge("sha256");for await(let t of fe(e))r.update(t);return r.digest("hex")}function Ce(){return{readFile:e=>he(e,"utf8"),writeFile:async(e,r)=>{await me(be(e),{recursive:!0});let t=`${e}.tmp`;await we(t,r),await ve(t,e)},hashFile:A,now:()=>new Date}}function D(e){if(!e)return;let r=/\/(\d{4})\/(\d{2})\/(\d{2})\//.exec(e);if(!r)return;let[,t,o,a]=r,s=new Date(`${t}-${o}-${a}T00:00:00Z`);return Number.isNaN(s.getTime())?void 0:s.toISOString()}function Ae(e,r){if(!e.storedAt)return!0;let t=new Date(e.storedAt).getTime();return Number.isNaN(t)?!0:(r.getTime()-t)/864e5>=Pe-Te}var u=class{deps;constructor(r={}){this.deps={...Ce(),...r}}async read(){try{let r=JSON.parse(await this.deps.readFile(ee()));if(!r||typeof r!="object")return W();let t=r;return{entries:Array.isArray(t.entries)?t.entries:[]}}catch{return W()}}async write(r){await this.deps.writeFile(ee(),JSON.stringify(r,null,2))}async hashOf(r){return this.deps.hashFile(r)}async lookup(r){return(await this.read()).entries.find(o=>o.sha256===r.sha256&&o.env===r.env&&o.orgId===r.orgId&&o.type===r.type)}async remember(r){let t=await this.read();t.entries=[...t.entries.filter(o=>!(o.sha256===r.sha256&&o.env===r.env&&o.orgId===r.orgId&&o.type===r.type)),r],await this.write(t)}async forget(r){let t=await this.read(),o=t.entries.length;t.entries=t.entries.filter(a=>!(a.sha256===r.sha256&&a.env===r.env&&a.orgId===r.orgId&&a.type===r.type)),t.entries.length!==o&&await this.write(t)}isNearExpiry(r){return Ae(r,this.deps.now())}};var re={emulator:[".apk"],simulator:[".zip"]};function te(e){return e.skipped===!0}function _e(e,r){let t=Ie(e).toLowerCase();return t===".ipa"?`${g(e)} is a device build \u2014 .ipa is not accepted for ${r} runs.`:re[r].includes(t)?null:`${g(e)} cannot be uploaded for a ${r} run \u2014 expected one of ${re[r].join(", ")}.`}async function k(e,r){if(!(await xe(e)).isDirectory())return r.hashOf(e);let o=[],a=async p=>{for(let i of await ke(p,{withFileTypes:!0})){let n=Ue(p,i.name);i.isDirectory()?await a(n):i.isFile()&&o.push(n)}};await a(e),o.sort();let s=De("sha256");for(let p of o)s.update(Se(e,p)),s.update("\0"),s.update(await A(p)),s.update("\0");return s.digest("hex")}async function oe(e){let r=_e(e.path,e.type);if(r)return{skipped:!0,reason:r};let t=e.cache??new u,o=e.client??new J(e.baseUrl,{...e.auth,orgId:e.orgId}),a;try{a=await k(e.path,t)}catch(i){return{skipped:!0,reason:`could not read ${g(e.path)}: ${i.message}`}}let s={sha256:a,env:e.env,orgId:e.orgId,type:e.type},p=await t.lookup(s);if(p){if(await o.liveness(p.appId)!=="gone")return{appId:p.appId,...p.appUrl?{appUrl:p.appUrl}:{},fromCache:!0};e.onProgress?.(`${p.appId} is no longer in the cloud \u2014 uploading again`),await t.forget(s)}try{e.onProgress?.(`uploading ${g(e.path)}\u2026`);let i=await o.upload(e.path,e.type);return await t.remember({sha256:a,env:e.env,orgId:e.orgId,type:e.type,appId:i.appId,...i.appUrl?{appUrl:i.appUrl}:{},...D(i.url)?{storedAt:D(i.url)}:{},sourcePath:e.path}),e.onProgress?.(i.cached?`${g(e.path)} already in the cloud (${i.appId})`:`${g(e.path)} uploaded (${i.appId})`),{appId:i.appId,...i.appUrl?{appUrl:i.appUrl}:{},fromCache:!1}}catch(i){return{skipped:!0,reason:i.message}}}function v(e){return`${e.platform}|${X(e)}`}var m=new Map,ae=new Set;function ie(e){return ae.has(v(e))}function nr(e,r,t){r.state==="stopped"&&(m.has(v(r))||se(e,r,t))}async function ne(e,r,t){let o=m.get(v(r));return o?(t?.(`waiting for ${r.displayName} to finish booting\u2026`),o):se(e,r,t)}function se(e,r,t){let o=v(r),a=e.prepare(r,t);m.set(o,a),r.state==="stopped"&&a.then(()=>ae.add(o),()=>{});let s=()=>{m.get(o)===a&&m.delete(o)};return a.then(s,s),a.catch(()=>{}),a}import{basename as Me}from"path";import{spawnSync as Ee}from"child_process";async function Fe(e,r,t){if(!e.teardownPlan||!t.appPackage&&!t.shutdown)return;let o;try{o=await e.teardownPlan(r,t)}catch{return}o.length!==0&&T(`device:${r.id}`,()=>{G({udid:r.id,displayName:r.displayName});for(let a of o)try{Ee(a.file,a.args,{timeout:3e4,stdio:"ignore"})}catch{}})}var pe={emulator:[".apk"],simulator:[".zip"]};async function $e(e,r,t,o){if(e.kind==="package")return e;if(e.kind==="app_id"){let a=r.cloudUpload;if(!a)throw new Error(`${e.value} is an app id, which needs an account to download it. Log in, or pass a path to a local build instead.`);let s=await V({appId:e.value,baseUrl:a.baseUrl,auth:a.auth,...pe[t]?{accepts:pe[t]}:{},...o?{onProgress:o}:{}}),p=I(s.path);if(!p||p.kind==="app_id")throw new Error(`${s.name} is not a build this CLI can install (from ${e.value}).`);return p}try{let a=new u,s=await k(e.value,a),p=new Y;await p.find(s)||o?.(`copying ${Me(e.value)} into the local app store\u2026`);let n=await p.put({key:s,sourcePath:e.value,source:"local"});return{...e,value:n.path}}catch{return e}}function Re(e){T(`appium:${e}`,()=>{H({deviceClass:e,owner:process.pid})})}var x=class extends Error{constructor(r){super(r),this.name="MobileHostUnsupportedError"}},w=class extends Error{constructor(t,o){super(t);this.doctorText=o;this.name="MobilePreflightError"}};async function Ne(e,r,t){let o=t.cloudUpload,a=await oe({path:e,type:r,env:o.env,orgId:o.orgId,userId:o.userId,auth:o.auth,baseUrl:o.baseUrl,...t.onProgress?{onProgress:t.onProgress}:{}});if(te(a)){t.onProgress?.(`app not uploaded \u2014 ${a.reason}`);return}return a.appId}var Be="app must be a build (.apk for an emulator, .zip of the .app bundle for a simulator) or an app id from your cloud uploads \u2014 a package id names something already installed on one device, so it cannot be uploaded, exported as code, or run anywhere else.",de=/\.(apk|zip)$/i;function I(e){let r=e.trim();if(C(r))return{kind:"app_id",value:r};let t=de.exec(r)?.[1]?.toLowerCase();return t?{kind:t,value:r}:null}function Oe(e){return!!e&&(de.test(e)||C(e.trim()))}function Le(e){return e.filter(r=>r.required&&r.status==="fail")}function je(e,r){return!!r&&E(e,r)}async function Dr(e){let r=L();if(!r.supported)throw new x(r.reason);let t=Q()??e.appiumUrl??e.defaults?.appium_url,o=!!(e.agent||!e.interactive),a=R(),s=!!N();o&&e.platform?.toLowerCase()!=="ios"&&!s&&((await a.status("emulator")).installed||await a.ensure("emulator",{automatic:!0,onProgress:e.onProgress}));let p=await j(e.platform,{appiumUrl:t});if(K(p)){let d=p.sections.flatMap(P=>Le(P.checks)).map(P=>P.label).join(", ");throw new w(`Mobile toolchain not ready (${d}). Run \`kane-cli doctor --target ${e.platform?.toLowerCase()==="ios"?"simulator":e.platform?.toLowerCase()==="android"?"emulator":"<emulator|simulator>"}\` for details.`,z(p))}let i=await O({device:e.device,platform:e.platform,defaultTarget:e.defaults?.default_target,interactive:e.interactive}),n;if(i.ok)n=i.target;else if(i.reason==="needs-picker"&&e.pickTarget){let d=await e.pickTarget(i.candidates);if(!d)throw new Error("Target selection cancelled");n=d}else throw new Error(i.message);let f=B(n.platform);if(!f)throw new Error(`No provider for platform "${n.platform}"`);let l=F(n);if(!l)throw new Error(`No managed dependencies serve ${n.platform} ${n.kind} targets yet.`);if(!(s&&n.platform.toLowerCase()==="android"))try{await a.ensure(l,{automatic:o,onProgress:e.onProgress})}catch(d){throw d instanceof $?new w(d.message,d.message):d}let le=n.state!=="ready"||ie(n);n=await ne(f,n,e.onProgress);let ce=await q(l,{...t?{appiumUrl:t}:{},device:{udid:n.id,displayName:n.displayName},onProgress:e.onProgress});Re(l);let U=je(n,e.defaults?.default_target)?e.defaults?.default_app:void 0,h=e.app??(Oe(U)?U:void 0);if(e.app&&!I(e.app))throw new Error(`${e.app}: ${Be}`);let c=h?I(h):null,S=c?await $e(c,e,l,e.onProgress):null,b=S?await f.ensureApp(n,S,e.onProgress):void 0,y=c?.kind==="app_id"?c.value:e.cloudUpload&&c&&h?await Ne(c.value,l,e):void 0;await Fe(f,n,{shutdown:le,...b?{appPackage:b}:{}});let ue=Z(n,b,{noReset:e.noReset??e.defaults?.no_reset,appiumUrl:ce.url,autoGrantPermissions:e.defaults?.auto_grant_permissions,autoAcceptAlerts:e.defaults?.auto_accept_alerts}),_=y??h;return{device:ue,target:n,provider:f,...y?{appId:y}:{},..._?{appRef:_}:{}}}export{X as a,Z as b,te as c,_e as d,oe as e,nr as f,ne as g,x as h,w as i,Be as j,I as k,Oe as l,Dr as m};
2
+ import{d as G,f as q,h as H}from"./chunk-6L5RV62W.js";import{a as j,b as z,c as K}from"./chunk-QVLYK5JL.js";import{d as B,f as O}from"./chunk-A557OSRS.js";import{a as N}from"./chunk-MMBBQ4OZ.js";import{b as F,c as $,j as R}from"./chunk-6GLFQHSW.js";import{a as L}from"./chunk-TZXXJWHA.js";import{n as T}from"./chunk-RSSOJ3L2.js";import{a as Y,b as C,c as V}from"./chunk-IAHOLH5W.js";import{h as J}from"./chunk-TAOHYWEO.js";import{e as E}from"./chunk-Z7S3IWUX.js";import{b as M}from"./chunk-HYTBEPC2.js";function X(e){return e.kind==="simulator"?e.id:e.virtualName??e.id}function Z(e,r,t={}){let o={platform:e.platform,udid:e.id,target_kind:e.kind};return r&&(o.app_package=r),t.noReset!==void 0&&(o.no_reset=t.noReset),t.appiumUrl&&(o.appium_url=t.appiumUrl),e.platform==="android"&&t.autoGrantPermissions!==void 0&&(o.auto_grant_permissions=t.autoGrantPermissions),e.platform==="ios"&&t.autoAcceptAlerts!==void 0&&(o.auto_accept_alerts=t.autoAcceptAlerts),o}function Q(e=process.env){let r=e.KANE_APPIUM_URL?.trim();return r||null}import{createHash as De}from"crypto";import{readdir as ke,stat as xe}from"fs/promises";import{basename as g,extname as Ie,join as Ue,relative as Se}from"path";import{createHash as ge}from"crypto";import{createReadStream as fe}from"fs";import{mkdir as me,readFile as he,rename as ve,writeFile as we}from"fs/promises";import{dirname as be,join as ye}from"path";var Pe=60,Te=5;function W(){return{entries:[]}}function ee(){return ye(M,"mobile","app-cache.json")}async function A(e){let r=ge("sha256");for await(let t of fe(e))r.update(t);return r.digest("hex")}function Ce(){return{readFile:e=>he(e,"utf8"),writeFile:async(e,r)=>{await me(be(e),{recursive:!0});let t=`${e}.tmp`;await we(t,r),await ve(t,e)},hashFile:A,now:()=>new Date}}function D(e){if(!e)return;let r=/\/(\d{4})\/(\d{2})\/(\d{2})\//.exec(e);if(!r)return;let[,t,o,a]=r,s=new Date(`${t}-${o}-${a}T00:00:00Z`);return Number.isNaN(s.getTime())?void 0:s.toISOString()}function Ae(e,r){if(!e.storedAt)return!0;let t=new Date(e.storedAt).getTime();return Number.isNaN(t)?!0:(r.getTime()-t)/864e5>=Pe-Te}var u=class{deps;constructor(r={}){this.deps={...Ce(),...r}}async read(){try{let r=JSON.parse(await this.deps.readFile(ee()));if(!r||typeof r!="object")return W();let t=r;return{entries:Array.isArray(t.entries)?t.entries:[]}}catch{return W()}}async write(r){await this.deps.writeFile(ee(),JSON.stringify(r,null,2))}async hashOf(r){return this.deps.hashFile(r)}async lookup(r){return(await this.read()).entries.find(o=>o.sha256===r.sha256&&o.env===r.env&&o.orgId===r.orgId&&o.type===r.type)}async remember(r){let t=await this.read();t.entries=[...t.entries.filter(o=>!(o.sha256===r.sha256&&o.env===r.env&&o.orgId===r.orgId&&o.type===r.type)),r],await this.write(t)}async forget(r){let t=await this.read(),o=t.entries.length;t.entries=t.entries.filter(a=>!(a.sha256===r.sha256&&a.env===r.env&&a.orgId===r.orgId&&a.type===r.type)),t.entries.length!==o&&await this.write(t)}isNearExpiry(r){return Ae(r,this.deps.now())}};var re={emulator:[".apk"],simulator:[".zip"]};function te(e){return e.skipped===!0}function _e(e,r){let t=Ie(e).toLowerCase();return t===".ipa"?`${g(e)} is a device build \u2014 .ipa is not accepted for ${r} runs.`:re[r].includes(t)?null:`${g(e)} cannot be uploaded for a ${r} run \u2014 expected one of ${re[r].join(", ")}.`}async function k(e,r){if(!(await xe(e)).isDirectory())return r.hashOf(e);let o=[],a=async p=>{for(let i of await ke(p,{withFileTypes:!0})){let n=Ue(p,i.name);i.isDirectory()?await a(n):i.isFile()&&o.push(n)}};await a(e),o.sort();let s=De("sha256");for(let p of o)s.update(Se(e,p)),s.update("\0"),s.update(await A(p)),s.update("\0");return s.digest("hex")}async function oe(e){let r=_e(e.path,e.type);if(r)return{skipped:!0,reason:r};let t=e.cache??new u,o=e.client??new J(e.baseUrl,{...e.auth,orgId:e.orgId}),a;try{a=await k(e.path,t)}catch(i){return{skipped:!0,reason:`could not read ${g(e.path)}: ${i.message}`}}let s={sha256:a,env:e.env,orgId:e.orgId,type:e.type},p=await t.lookup(s);if(p){if(await o.liveness(p.appId)!=="gone")return{appId:p.appId,...p.appUrl?{appUrl:p.appUrl}:{},fromCache:!0};e.onProgress?.(`${p.appId} is no longer in the cloud \u2014 uploading again`),await t.forget(s)}try{e.onProgress?.(`uploading ${g(e.path)}\u2026`);let i=await o.upload(e.path,e.type);return await t.remember({sha256:a,env:e.env,orgId:e.orgId,type:e.type,appId:i.appId,...i.appUrl?{appUrl:i.appUrl}:{},...D(i.url)?{storedAt:D(i.url)}:{},sourcePath:e.path}),e.onProgress?.(i.cached?`${g(e.path)} already in the cloud (${i.appId})`:`${g(e.path)} uploaded (${i.appId})`),{appId:i.appId,...i.appUrl?{appUrl:i.appUrl}:{},fromCache:!1}}catch(i){return{skipped:!0,reason:i.message}}}function v(e){return`${e.platform}|${X(e)}`}var m=new Map,ae=new Set;function ie(e){return ae.has(v(e))}function nr(e,r,t){r.state==="stopped"&&(m.has(v(r))||se(e,r,t))}async function ne(e,r,t){let o=m.get(v(r));return o?(t?.(`waiting for ${r.displayName} to finish booting\u2026`),o):se(e,r,t)}function se(e,r,t){let o=v(r),a=e.prepare(r,t);m.set(o,a),r.state==="stopped"&&a.then(()=>ae.add(o),()=>{});let s=()=>{m.get(o)===a&&m.delete(o)};return a.then(s,s),a.catch(()=>{}),a}import{basename as Me}from"path";import{spawnSync as Ee}from"child_process";async function Fe(e,r,t){if(!e.teardownPlan||!t.appPackage&&!t.shutdown)return;let o;try{o=await e.teardownPlan(r,t)}catch{return}o.length!==0&&T(`device:${r.id}`,()=>{G({udid:r.id,displayName:r.displayName});for(let a of o)try{Ee(a.file,a.args,{timeout:3e4,stdio:"ignore"})}catch{}})}var pe={emulator:[".apk"],simulator:[".zip"]};async function $e(e,r,t,o){if(e.kind==="package")return e;if(e.kind==="app_id"){let a=r.cloudUpload;if(!a)throw new Error(`${e.value} is an app id, which needs an account to download it. Log in, or pass a path to a local build instead.`);let s=await V({appId:e.value,baseUrl:a.baseUrl,auth:a.auth,...pe[t]?{accepts:pe[t]}:{},...o?{onProgress:o}:{}}),p=I(s.path);if(!p||p.kind==="app_id")throw new Error(`${s.name} is not a build this CLI can install (from ${e.value}).`);return p}try{let a=new u,s=await k(e.value,a),p=new Y;await p.find(s)||o?.(`copying ${Me(e.value)} into the local app store\u2026`);let n=await p.put({key:s,sourcePath:e.value,source:"local"});return{...e,value:n.path}}catch{return e}}function Re(e){T(`appium:${e}`,()=>{H({deviceClass:e,owner:process.pid})})}var x=class extends Error{constructor(r){super(r),this.name="MobileHostUnsupportedError"}},w=class extends Error{constructor(t,o){super(t);this.doctorText=o;this.name="MobilePreflightError"}};async function Ne(e,r,t){let o=t.cloudUpload,a=await oe({path:e,type:r,env:o.env,orgId:o.orgId,userId:o.userId,auth:o.auth,baseUrl:o.baseUrl,...t.onProgress?{onProgress:t.onProgress}:{}});if(te(a)){t.onProgress?.(`app not uploaded \u2014 ${a.reason}`);return}return a.appId}var Be="app must be a build (.apk for an emulator, .zip of the .app bundle for a simulator) or an app id from your cloud uploads \u2014 a package id names something already installed on one device, so it cannot be uploaded, exported as code, or run anywhere else.",de=/\.(apk|zip)$/i;function I(e){let r=e.trim();if(C(r))return{kind:"app_id",value:r};let t=de.exec(r)?.[1]?.toLowerCase();return t?{kind:t,value:r}:null}function Oe(e){return!!e&&(de.test(e)||C(e.trim()))}function Le(e){return e.filter(r=>r.required&&r.status==="fail")}function je(e,r){return!!r&&E(e,r)}async function Dr(e){let r=L();if(!r.supported)throw new x(r.reason);let t=Q()??e.appiumUrl??e.defaults?.appium_url,o=!!(e.agent||!e.interactive),a=R(),s=!!N();o&&e.platform?.toLowerCase()!=="ios"&&!s&&((await a.status("emulator")).installed||await a.ensure("emulator",{automatic:!0,onProgress:e.onProgress}));let p=await j(e.platform,{appiumUrl:t});if(K(p)){let d=p.sections.flatMap(P=>Le(P.checks)).map(P=>P.label).join(", ");throw new w(`Mobile toolchain not ready (${d}). Run \`kane-cli doctor --target ${e.platform?.toLowerCase()==="ios"?"simulator":e.platform?.toLowerCase()==="android"?"emulator":"<emulator|simulator>"}\` for details.`,z(p))}let i=await O({device:e.device,platform:e.platform,defaultTarget:e.defaults?.default_target,interactive:e.interactive}),n;if(i.ok)n=i.target;else if(i.reason==="needs-picker"&&e.pickTarget){let d=await e.pickTarget(i.candidates);if(!d)throw new Error("Target selection cancelled");n=d}else throw new Error(i.message);let f=B(n.platform);if(!f)throw new Error(`No provider for platform "${n.platform}"`);let l=F(n);if(!l)throw new Error(`No managed dependencies serve ${n.platform} ${n.kind} targets yet.`);if(!(s&&n.platform.toLowerCase()==="android"))try{await a.ensure(l,{automatic:o,onProgress:e.onProgress})}catch(d){throw d instanceof $?new w(d.message,d.message):d}let le=n.state!=="ready"||ie(n);n=await ne(f,n,e.onProgress);let ce=await q(l,{...t?{appiumUrl:t}:{},device:{udid:n.id,displayName:n.displayName},onProgress:e.onProgress});Re(l);let U=je(n,e.defaults?.default_target)?e.defaults?.default_app:void 0,h=e.app??(Oe(U)?U:void 0);if(e.app&&!I(e.app))throw new Error(`${e.app}: ${Be}`);let c=h?I(h):null,S=c?await $e(c,e,l,e.onProgress):null,b=S?await f.ensureApp(n,S,e.onProgress):void 0,y=c?.kind==="app_id"?c.value:e.cloudUpload&&c&&h?await Ne(c.value,l,e):void 0;await Fe(f,n,{shutdown:le,...b?{appPackage:b}:{}});let ue=Z(n,b,{noReset:e.noReset??e.defaults?.no_reset,appiumUrl:ce.url,autoGrantPermissions:e.defaults?.auto_grant_permissions,autoAcceptAlerts:e.defaults?.auto_accept_alerts}),_=y??h;return{device:ue,target:n,provider:f,...y?{appId:y}:{},..._?{appRef:_}:{}}}export{X as a,Z as b,te as c,_e as d,oe as e,nr as f,ne as g,x as h,w as i,Be as j,I as k,Oe as l,Dr as m};
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as g}from"./chunk-BPMSNGXQ.js";import{b as f,c as j}from"./chunk-VE3SUJMA.js";import{a as m}from"./chunk-NUWOQS6L.js";var _="KaneAI Generated",E="Untitled";async function p(e){let r=e.config.load(),d=new g(m(e.env).tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key),n=e.projectName??_,o=e.folderName??E,t=r.project_id??null,s=r.project_name??null;if(!t){let a=(await d.listProjects()).find(l=>l.name===n);if(a)t=a.project_id,s=a.name,e.log("info","ENSURE_PROJECT_FOUND","Found default project",{project_id:t,name:s});else{let l=await d.createProject(n);t=l.id,s=l.name,e.log("info","ENSURE_PROJECT_CREATED","Created default project",{project_id:t,name:s})}f(e.creds,e.config,e.profile,e.env,{projectId:t,projectName:s})}let c=r.folder_id??null,i=r.folder_name??null,u=!r.project_id;if(!c||u){let a=(await d.listFolders(t)).find(l=>l.name===o);if(a)c=a.id,i=a.name,e.log("info","ENSURE_FOLDER_FOUND","Found default folder",{folder_id:c,name:i});else{let l=await d.createFolder(t,o);c=l.id,i=l.name,e.log("info","ENSURE_FOLDER_CREATED","Created default folder",{folder_id:c,name:i})}f(e.creds,e.config,e.profile,e.env,{folderId:c,folderName:i})}return{projectId:t,projectName:s??n,folderId:c,folderName:i??o}}function A(e,r,d){let n=e.loadProfileConfig(r,d)??{};return{projectId:n.project_id??null,folderId:n.folder_id??null}}function N(e,r){return e.projectId===null||e.folderId===null||r===null?"needs-picker":r.project==="ok"&&r.folder==="ok"?"ok":r.project==="error"&&r.folder==="error"?"ok-tms-degraded":"needs-picker"}var k=(e,r)=>`error: profile "${e}" (${r}) has no project/folder configured AND no TMS credentials were available to auto-configure one.
2
+ import{a as g}from"./chunk-BPMSNGXQ.js";import{b as f,c as j}from"./chunk-VE3SUJMA.js";import{a as m}from"./chunk-EPE2ELDH.js";var _="KaneAI Generated",E="Untitled";async function p(e){let r=e.config.load(),d=new g(m(e.env).tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key),n=e.projectName??_,o=e.folderName??E,t=r.project_id??null,s=r.project_name??null;if(!t){let a=(await d.listProjects()).find(l=>l.name===n);if(a)t=a.project_id,s=a.name,e.log("info","ENSURE_PROJECT_FOUND","Found default project",{project_id:t,name:s});else{let l=await d.createProject(n);t=l.id,s=l.name,e.log("info","ENSURE_PROJECT_CREATED","Created default project",{project_id:t,name:s})}f(e.creds,e.config,e.profile,e.env,{projectId:t,projectName:s})}let c=r.folder_id??null,i=r.folder_name??null,u=!r.project_id;if(!c||u){let a=(await d.listFolders(t)).find(l=>l.name===o);if(a)c=a.id,i=a.name,e.log("info","ENSURE_FOLDER_FOUND","Found default folder",{folder_id:c,name:i});else{let l=await d.createFolder(t,o);c=l.id,i=l.name,e.log("info","ENSURE_FOLDER_CREATED","Created default folder",{folder_id:c,name:i})}f(e.creds,e.config,e.profile,e.env,{folderId:c,folderName:i})}return{projectId:t,projectName:s??n,folderId:c,folderName:i??o}}function A(e,r,d){let n=e.loadProfileConfig(r,d)??{};return{projectId:n.project_id??null,folderId:n.folder_id??null}}function N(e,r){return e.projectId===null||e.folderId===null||r===null?"needs-picker":r.project==="ok"&&r.folder==="ok"?"ok":r.project==="error"&&r.folder==="error"?"ok-tms-degraded":"needs-picker"}var k=(e,r)=>`error: profile "${e}" (${r}) has no project/folder configured AND no TMS credentials were available to auto-configure one.
3
3
 
4
4
  discover IDs:
5
5
  kane-cli projects list --search "<keyword>" --limit 10
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as g}from"./chunk-33GXXC2L.js";import{readFileSync as o,writeFileSync as h,mkdirSync as u,readdirSync as a,unlinkSync as s,existsSync as l,chmodSync as f}from"fs";import{join as n,dirname as P}from"path";var d=class{baseDir;profilesDir;configFile;constructor(t=g){this.baseDir=t,this.profilesDir=n(t,"profiles"),this.configFile=n(t,"config.json")}readConfig(){try{return JSON.parse(o(this.configFile,"utf-8"))}catch{return{}}}writeConfig(t){u(this.baseDir,{recursive:!0,mode:448}),h(this.configFile,JSON.stringify(t,null,2)+`
2
+ import{b as g}from"./chunk-HYTBEPC2.js";import{readFileSync as o,writeFileSync as h,mkdirSync as u,readdirSync as a,unlinkSync as s,existsSync as l,chmodSync as f}from"fs";import{join as n,dirname as P}from"path";var d=class{baseDir;profilesDir;configFile;constructor(t=g){this.baseDir=t,this.profilesDir=n(t,"profiles"),this.configFile=n(t,"config.json")}readConfig(){try{return JSON.parse(o(this.configFile,"utf-8"))}catch{return{}}}writeConfig(t){u(this.baseDir,{recursive:!0,mode:448}),h(this.configFile,JSON.stringify(t,null,2)+`
3
3
  `),f(this.configFile,384)}getActiveProfile(){return this.readConfig().active_profile??null}setActiveProfile(t){let i=this.readConfig();i.active_profile=t,this.writeConfig(i)}getDefaultEnv(){return this.readConfig().default_env??"prod"}setDefaultEnv(t){let i=this.readConfig();i.default_env=t,this.writeConfig(i)}credentialsPath(t,i){return n(this.profilesDir,t,i,"credentials")}clientPath(t,i){return n(this.profilesDir,t,i,"client.json")}basicAuthPath(t,i){return n(this.profilesDir,t,i,"basic-auth")}profileConfigPath(t,i){return n(this.profilesDir,t,i,"profile-config.json")}saveProfileConfig(t,i,r){let e=this.loadProfileConfig(t,i)??{};this.writeSecure(this.profileConfigPath(t,i),{...e,...r})}loadProfileConfig(t,i){try{return JSON.parse(o(this.profileConfigPath(t,i),"utf-8"))}catch{return null}}writeSecure(t,i){try{u(P(t),{recursive:!0,mode:448}),h(t,JSON.stringify(i,null,2)+`
4
4
  `),f(t,384)}catch(r){let e=r instanceof Error?r.message:String(r);process.stderr.write(`[auth] Failed to save credentials: ${e}
5
5
  `)}}saveCredentials(t,i,r){this.writeSecure(this.credentialsPath(t,i),r)}loadCredentials(t,i){try{return JSON.parse(o(this.credentialsPath(t,i),"utf-8"))}catch{return null}}saveClient(t,i,r){this.writeSecure(this.clientPath(t,i),r)}loadClient(t,i){try{return JSON.parse(o(this.clientPath(t,i),"utf-8"))}catch{return null}}getActiveCredentials(){let t=this.getActiveProfile();if(!t)return{credentials:null,profile:null,env:null};let i=this.getDefaultEnv();return{credentials:this.loadCredentials(t,i),profile:t,env:i}}saveBasicAuth(t,i,r){this.writeSecure(this.basicAuthPath(t,i),r)}loadBasicAuth(t,i){try{return JSON.parse(o(this.basicAuthPath(t,i),"utf-8"))}catch{return null}}deleteBasicAuth(t,i){try{s(this.basicAuthPath(t,i))}catch{}}resolveAuth(){let t=this.getActiveProfile();if(!t)return null;let i=this.getDefaultEnv(),r=this.loadBasicAuth(t,i);return r?{method:"basic",...r,profile:t,env:i}:this.loadCredentials(t,i)?{method:"oauth",profile:t,env:i}:null}listProfiles(){let t=[];try{for(let i of a(this.profilesDir)){let r=n(this.profilesDir,i);try{for(let e of a(r)){let c=n(r,e),v=l(n(c,"credentials")),p=l(n(c,"client.json")),y=l(n(c,"basic-auth"));(v||p||y)&&t.push({profile:i,env:e})}}catch{}}}catch{}return t}deleteProfile(t,i){try{s(this.credentialsPath(t,i))}catch{}if(this.getActiveProfile()===t){let r=this.readConfig();delete r.active_profile,this.writeConfig(r)}}deleteProfileFull(t,i){if(i){try{s(this.credentialsPath(t,i))}catch{}try{s(this.clientPath(t,i))}catch{}try{s(this.basicAuthPath(t,i))}catch{}try{s(this.profileConfigPath(t,i))}catch{}}else try{let r=n(this.profilesDir,t);for(let e of a(r)){try{s(n(r,e,"credentials"))}catch{}try{s(n(r,e,"client.json"))}catch{}try{s(n(r,e,"basic-auth"))}catch{}try{s(n(r,e,"profile-config.json"))}catch{}}}catch{}}};export{d as a};
@@ -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-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(`
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-52WM3XYO.js";import{d as ie}from"./chunk-IE3OO5GI.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 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(`
2
+ import{a as k}from"./chunk-ALCE5RLK.js";import{b as w}from"./chunk-GP7WD4UY.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
3
  `).map(o=>o.replace(/^\d+\| /,"")),s=[];for(let o of e.split(`
4
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
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};