chainlesschain 0.159.0 → 0.161.2

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 (331) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/AIOps-Cchx1iXI.css +1 -0
  4. package/src/assets/web-panel/assets/AIOps-CoZ9bIqF.js +1 -0
  5. package/src/assets/web-panel/assets/ActionButton-BvMi4awy.js +1 -0
  6. package/src/assets/web-panel/assets/Analytics-C1-TXmTC.css +1 -0
  7. package/src/assets/web-panel/assets/Analytics-hRk2ziup.js +3 -0
  8. package/src/assets/web-panel/assets/AppLayout-CtGprHSx.css +1 -0
  9. package/src/assets/web-panel/assets/AppLayout-_JR3Gko8.js +1 -0
  10. package/src/assets/web-panel/assets/Audit-6ZMsXmrO.css +1 -0
  11. package/src/assets/web-panel/assets/Audit-D8WmaHdX.js +1 -0
  12. package/src/assets/web-panel/assets/Backup-CY9QozR7.css +1 -0
  13. package/src/assets/web-panel/assets/Backup-CogYVeiE.js +1 -0
  14. package/src/assets/web-panel/assets/BaseInput-NAp5_OPY.js +1 -0
  15. package/src/assets/web-panel/assets/{Chat-DmX5bWvL.css → Chat-ByiYUboW.css} +1 -1
  16. package/src/assets/web-panel/assets/Chat-DkQnhjfk.js +2 -0
  17. package/src/assets/web-panel/assets/Checkbox-C9dkWb-7.js +1 -0
  18. package/src/assets/web-panel/assets/Codegen-BHyJ3j-p.js +1 -0
  19. package/src/assets/web-panel/assets/Codegen-BLP7id2a.css +1 -0
  20. package/src/assets/web-panel/assets/Col-JyQOivHb.js +1 -0
  21. package/src/assets/web-panel/assets/Community-C2RejeOY.css +1 -0
  22. package/src/assets/web-panel/assets/Community-UMq5QuBA.js +1 -0
  23. package/src/assets/web-panel/assets/Compact-DGlwooBJ.js +1 -0
  24. package/src/assets/web-panel/assets/Compliance-2rWGO55k.js +1 -0
  25. package/src/assets/web-panel/assets/Compliance-DOys4Ov1.css +1 -0
  26. package/src/assets/web-panel/assets/{Cowork-CFkkMMDK.js → Cowork-V-tDxtrt.js} +4 -4
  27. package/src/assets/web-panel/assets/Cron-YgEeQvdV.js +2 -0
  28. package/src/assets/web-panel/assets/Crosschain-C7Le4Pte.css +1 -0
  29. package/src/assets/web-panel/assets/Crosschain-Cgd5cRKn.js +1 -0
  30. package/src/assets/web-panel/assets/DID-BX6k3jZi.css +1 -0
  31. package/src/assets/web-panel/assets/DID-swdBCdMZ.js +2 -0
  32. package/src/assets/web-panel/assets/Dashboard-ClnWtxsT.js +3 -0
  33. package/src/assets/web-panel/assets/Dashboard-MFDcsVcM.css +1 -0
  34. package/src/assets/web-panel/assets/Dropdown-mlITwb7d.js +1 -0
  35. package/src/assets/web-panel/assets/Federation-CgmfLbx1.css +1 -0
  36. package/src/assets/web-panel/assets/Federation-DtUN3wQa.js +1 -0
  37. package/src/assets/web-panel/assets/{FormItemContext-Be6TSNxz.js → FormItemContext-BYmWDwAT.js} +1 -1
  38. package/src/assets/web-panel/assets/{Git-DGcuBXST.css → Git-DPuaGtg7.css} +1 -1
  39. package/src/assets/web-panel/assets/Git-Du1k1iHz.js +2 -0
  40. package/src/assets/web-panel/assets/Governance-B2TFaWsf.js +1 -0
  41. package/src/assets/web-panel/assets/Governance-BoipmXaM.css +1 -0
  42. package/src/assets/web-panel/assets/Inference-BWxYJF9-.css +1 -0
  43. package/src/assets/web-panel/assets/Inference-Cm_hmXla.js +1 -0
  44. package/src/assets/web-panel/assets/KnowledgeGraph-CztPDA96.css +1 -0
  45. package/src/assets/web-panel/assets/KnowledgeGraph-DLaLMo4r.js +1 -0
  46. package/src/assets/web-panel/assets/Logs-CElvIBBJ.js +2 -0
  47. package/src/assets/web-panel/assets/Marketplace-BlR3RCDV.js +1 -0
  48. package/src/assets/web-panel/assets/Marketplace-Djp5q9dS.css +1 -0
  49. package/src/assets/web-panel/assets/McpTools-BpHkrlka.js +5 -0
  50. package/src/assets/web-panel/assets/McpTools-CDjHmzxH.css +1 -0
  51. package/src/assets/web-panel/assets/Memory-Bcc2hxOA.css +1 -0
  52. package/src/assets/web-panel/assets/Memory-DeU9ys_m.js +2 -0
  53. package/src/assets/web-panel/assets/Mtc-CCJZpnJo.js +6 -0
  54. package/src/assets/web-panel/assets/Mtc-Cc8OJxe_.css +1 -0
  55. package/src/assets/web-panel/assets/NLProgramming-B_Tie6j1.js +1 -0
  56. package/src/assets/web-panel/assets/NLProgramming-CLOvy-35.css +1 -0
  57. package/src/assets/web-panel/assets/Notes-BcpuirPj.js +7 -0
  58. package/src/assets/web-panel/assets/Organization-BX-cIO8M.css +1 -0
  59. package/src/assets/web-panel/assets/Organization-B_SHESSc.js +4 -0
  60. package/src/assets/web-panel/assets/Overflow-R2SOGT0l.js +1 -0
  61. package/src/assets/web-panel/assets/{OverrideContext-GHsJf9ok.js → OverrideContext-Nubhv68k.js} +1 -1
  62. package/src/assets/web-panel/assets/P2P-Cx88UaiD.css +1 -0
  63. package/src/assets/web-panel/assets/P2P-IYYy3cEd.js +2 -0
  64. package/src/assets/web-panel/assets/Permissions-CR1N42yW.js +4 -0
  65. package/src/assets/web-panel/assets/Pipeline-DxkXqrH2.css +1 -0
  66. package/src/assets/web-panel/assets/Pipeline-nwFpKsU_.js +1 -0
  67. package/src/assets/web-panel/assets/Privacy-BGpz72PX.js +1 -0
  68. package/src/assets/web-panel/assets/Privacy-CrsfSFKd.css +1 -0
  69. package/src/assets/web-panel/assets/ProjectSettings-CEDhpgbs.js +2 -0
  70. package/src/assets/web-panel/assets/Projects-B5IgXt-x.css +1 -0
  71. package/src/assets/web-panel/assets/Projects-DABi6ylb.js +2 -0
  72. package/src/assets/web-panel/assets/Providers-HzrcE8ma.js +2 -0
  73. package/src/assets/web-panel/assets/QuickAsk-6FgX9DC6.js +1 -0
  74. package/src/assets/web-panel/assets/Recommend-BPhQwye7.js +1 -0
  75. package/src/assets/web-panel/assets/Recommend-CH6wKzGo.css +1 -0
  76. package/src/assets/web-panel/assets/Reputation-BL6hTN1s.js +1 -0
  77. package/src/assets/web-panel/assets/Reputation-D6VPNEd0.css +1 -0
  78. package/src/assets/web-panel/assets/Row-2akLU3YS.js +1 -0
  79. package/src/assets/web-panel/assets/RssFeed-D6qNq6Ht.js +3 -0
  80. package/src/assets/web-panel/assets/Search-B6RalzTB.css +1 -0
  81. package/src/assets/web-panel/assets/Search-R_b-u9oL.js +1 -0
  82. package/src/assets/web-panel/assets/Security-13K57V_v.css +1 -0
  83. package/src/assets/web-panel/assets/Security-DdW4hu_4.js +4 -0
  84. package/src/assets/web-panel/assets/Services-CnzEzGFN.js +2 -0
  85. package/src/assets/web-panel/assets/Skeleton-D6RevdW2.js +8 -0
  86. package/src/assets/web-panel/assets/Skills-DD5ReHH7.js +1 -0
  87. package/src/assets/web-panel/assets/Sla-CaQOOsjD.js +1 -0
  88. package/src/assets/web-panel/assets/Sla-K19oOyQc.css +1 -0
  89. package/src/assets/web-panel/assets/SpeechSettings-D-pGIn9Z.js +1 -0
  90. package/src/assets/web-panel/assets/SpeechSettings-DYPJTDKz.css +1 -0
  91. package/src/assets/web-panel/assets/Tasks-BbdO_i4Q.js +1 -0
  92. package/src/assets/web-panel/assets/Templates-BWTV8-2E.css +1 -0
  93. package/src/assets/web-panel/assets/Templates-CupAugDn.js +1 -0
  94. package/src/assets/web-panel/assets/Tenant-D3zkSAV0.css +1 -0
  95. package/src/assets/web-panel/assets/Tenant-rseAzHcY.js +1 -0
  96. package/src/assets/web-panel/assets/Tokens-BBOdNRHQ.css +1 -0
  97. package/src/assets/web-panel/assets/Tokens-DXMokNbR.js +1 -0
  98. package/src/assets/web-panel/assets/Trigger-DkSZjOlY.js +1 -0
  99. package/src/assets/web-panel/assets/Trust-CKb7QDH1.js +1 -0
  100. package/src/assets/web-panel/assets/Trust-DeOo0xAh.css +1 -0
  101. package/src/assets/web-panel/assets/UkeySign-Cux8_Ib_.js +1 -0
  102. package/src/assets/web-panel/assets/VideoEditing-CSOjdBZg.js +1 -0
  103. package/src/assets/web-panel/assets/VideoEditing-DksiizfS.css +1 -0
  104. package/src/assets/web-panel/assets/Wallet-DHbi5dHt.js +4 -0
  105. package/src/assets/web-panel/assets/Wallet-gR0ZvZbK.css +1 -0
  106. package/src/assets/web-panel/assets/WebAuthn-BkGDI33-.js +5 -0
  107. package/src/assets/web-panel/assets/WebAuthn-SSh5VhVO.css +1 -0
  108. package/src/assets/web-panel/assets/WorkflowEditor-BFZ3RYva.js +1 -0
  109. package/src/assets/web-panel/assets/WorkflowEditor-IiwsD8Kh.css +1 -0
  110. package/src/assets/web-panel/assets/{chat-DY27mJje.js → chat-BQ-Nk2XY.js} +1 -1
  111. package/src/assets/web-panel/assets/{collapseMotion-CyadT_6x.js → collapseMotion-BIjDVXtT.js} +1 -1
  112. package/src/assets/web-panel/assets/{colors-B7fDvuJc.js → colors-D2tTvuDI.js} +1 -1
  113. package/src/assets/web-panel/assets/{compact-item-DgthOVXi.js → compact-item-CqCEUZiy.js} +1 -1
  114. package/src/assets/web-panel/assets/{createContext-Blw2vgkG.js → createContext-C6HFlAQP.js} +1 -1
  115. package/src/assets/web-panel/assets/echarts-DmBLM6YO.js +19 -0
  116. package/src/assets/web-panel/assets/{hasIn-BfL1HJZl.js → hasIn-yp2CbhYc.js} +1 -1
  117. package/src/assets/web-panel/assets/icons-DvZE-RKs.js +57 -0
  118. package/src/assets/web-panel/assets/index-4cn1LmJ9.js +1 -0
  119. package/src/assets/web-panel/assets/index-B0jkl2Zb.js +1 -0
  120. package/src/assets/web-panel/assets/{index-BHnaIQEm.js → index-B2qFUwGb.js} +2 -2
  121. package/src/assets/web-panel/assets/index-B74gWYqD.js +1 -0
  122. package/src/assets/web-panel/assets/index-B8Qxu0q2.js +1 -0
  123. package/src/assets/web-panel/assets/index-B9b_mz4I.js +55 -0
  124. package/src/assets/web-panel/assets/index-BAA1SFp1.js +1 -0
  125. package/src/assets/web-panel/assets/index-BJeE7n_I.js +12 -0
  126. package/src/assets/web-panel/assets/index-BJoK7MkB.js +13 -0
  127. package/src/assets/web-panel/assets/{index-DyRzaN4b.js → index-BTL2yIvT.js} +3 -3
  128. package/src/assets/web-panel/assets/index-BlVnFOFL.js +1 -0
  129. package/src/assets/web-panel/assets/{index-x8iHfZRd.js → index-Blq49aTW.js} +3 -3
  130. package/src/assets/web-panel/assets/{index-BsleJWGy.js → index-BxSsO6Sm.js} +2 -2
  131. package/src/assets/web-panel/assets/index-CA3g3EpL.js +1 -0
  132. package/src/assets/web-panel/assets/{index-BuEOhTAw.js → index-CFoFkVUt.js} +5 -5
  133. package/src/assets/web-panel/assets/index-CWhXxdyo.js +1 -0
  134. package/src/assets/web-panel/assets/index-CXf0zL5i.js +13 -0
  135. package/src/assets/web-panel/assets/index-CcwZodUl.js +1 -0
  136. package/src/assets/web-panel/assets/index-Cd6m6ynF.js +1 -0
  137. package/src/assets/web-panel/assets/index-CfX1DEtk.css +1 -0
  138. package/src/assets/web-panel/assets/index-Cfy9l115.js +1 -0
  139. package/src/assets/web-panel/assets/index-CijiVpfO.js +1 -0
  140. package/src/assets/web-panel/assets/index-Cpfx7-LN.js +12 -0
  141. package/src/assets/web-panel/assets/index-CrEEL63u.js +1 -0
  142. package/src/assets/web-panel/assets/index-CucxAdwN.js +6 -0
  143. package/src/assets/web-panel/assets/index-CvuBD5TK.js +3 -0
  144. package/src/assets/web-panel/assets/index-Cw4v7ezB.js +65 -0
  145. package/src/assets/web-panel/assets/{index-00RNC3ZQ.js → index-D34iabcS.js} +8 -8
  146. package/src/assets/web-panel/assets/index-DEKuiAPQ.js +3 -0
  147. package/src/assets/web-panel/assets/index-Dj4P0iWm.js +1 -0
  148. package/src/assets/web-panel/assets/index-DjeNNVwu.js +1 -0
  149. package/src/assets/web-panel/assets/index-DlgMVieO.js +1 -0
  150. package/src/assets/web-panel/assets/{index-CiN4NEAa.js → index-DnehXcB-.js} +2 -2
  151. package/src/assets/web-panel/assets/index-JszcDpsT.js +7 -0
  152. package/src/assets/web-panel/assets/index-KdFFI-p3.js +1 -0
  153. package/src/assets/web-panel/assets/index-NNymVAza.js +3 -0
  154. package/src/assets/web-panel/assets/index-aw2DwKj-.js +21 -0
  155. package/src/assets/web-panel/assets/index-nzDx0JAR.js +1 -0
  156. package/src/assets/web-panel/assets/index-w1xShUDf.js +1 -0
  157. package/src/assets/web-panel/assets/{initDefaultProps-BeWIEzBr.js → initDefaultProps-DfdVxwz6.js} +1 -1
  158. package/src/assets/web-panel/assets/motion-CL0bdvJg.js +11 -0
  159. package/src/assets/web-panel/assets/move-Bo9Fgzv7.js +4 -0
  160. package/src/assets/web-panel/assets/mtc-parser-pGMSt10g.js +1 -0
  161. package/src/assets/web-panel/assets/{omit-BS0H_YEP.js → omit-C-cc6wHr.js} +1 -1
  162. package/src/assets/web-panel/assets/{pickAttrs-BOGgGau8.js → pickAttrs-CjLp5RN-.js} +1 -1
  163. package/src/assets/web-panel/assets/{placementArrow--c5TQkDQ.js → placementArrow-CJa8gsqa.js} +1 -1
  164. package/src/assets/web-panel/assets/{responsiveObserve-CrHOX7jp.js → responsiveObserve-CcDj3P-p.js} +1 -1
  165. package/src/assets/web-panel/assets/slide-CpvbHO26.js +4 -0
  166. package/src/assets/web-panel/assets/statusUtils-BK69kP1U.js +1 -0
  167. package/src/assets/web-panel/assets/{styleChecker-CiDrXnbi.js → styleChecker-CDvBRzsG.js} +1 -1
  168. package/src/assets/web-panel/assets/useFlexGapSupport-CRN_hzJt.js +1 -0
  169. package/src/assets/web-panel/assets/useFs-BD-YRwbU.js +1 -0
  170. package/src/assets/web-panel/assets/{useMergedState-CLY-UHry.js → useMergedState-TP9VIF2K.js} +1 -1
  171. package/src/assets/web-panel/assets/{useRefs-HzOoMkZk.js → useRefs-BhIz_lC3.js} +1 -1
  172. package/src/assets/web-panel/assets/{useState-yWVBuz1S.js → useState-CpKsyozn.js} +1 -1
  173. package/src/assets/web-panel/assets/vendor-B6ToihkA.js +1 -0
  174. package/src/assets/web-panel/assets/vnode-Bzp-FsbB.js +1 -0
  175. package/src/assets/web-panel/assets/{ws-4ur1fGsk.js → ws-D_5-FRIb.js} +1 -1
  176. package/src/assets/web-panel/assets/zoom-BHqpWXJV.js +4 -0
  177. package/src/assets/web-panel/index.html +4 -4
  178. package/src/commands/audit.js +296 -0
  179. package/src/commands/crosschain.js +564 -8
  180. package/src/commands/init.js +16 -1
  181. package/src/commands/mtc.js +2735 -86
  182. package/src/lib/audit-mtc.js +504 -0
  183. package/src/lib/cross-chain-mtc.js +904 -0
  184. package/src/assets/web-panel/assets/AIOps-Bfzpnnlg.css +0 -1
  185. package/src/assets/web-panel/assets/AIOps-ztGJppiG.js +0 -1
  186. package/src/assets/web-panel/assets/ActionButton-DCuat-R-.js +0 -1
  187. package/src/assets/web-panel/assets/Analytics-BFI7jbwM.css +0 -1
  188. package/src/assets/web-panel/assets/Analytics-m_EtU-RR.js +0 -3
  189. package/src/assets/web-panel/assets/AppLayout-8HizVjee.css +0 -1
  190. package/src/assets/web-panel/assets/AppLayout-Crz8jbEC.js +0 -1
  191. package/src/assets/web-panel/assets/Audit-CNLWjMXN.js +0 -1
  192. package/src/assets/web-panel/assets/Audit-kU7vbN-D.css +0 -1
  193. package/src/assets/web-panel/assets/Backup-CggaSq9O.js +0 -1
  194. package/src/assets/web-panel/assets/Backup-DxLiJzmk.css +0 -1
  195. package/src/assets/web-panel/assets/BaseInput-BssiYvl6.js +0 -1
  196. package/src/assets/web-panel/assets/Chat-tuVfpQUO.js +0 -2
  197. package/src/assets/web-panel/assets/Checkbox-BUUkXdQg.js +0 -1
  198. package/src/assets/web-panel/assets/Codegen-AVAcL7NA.css +0 -1
  199. package/src/assets/web-panel/assets/Codegen-CHu-7YGr.js +0 -1
  200. package/src/assets/web-panel/assets/Col-2IaMFwmX.js +0 -1
  201. package/src/assets/web-panel/assets/Community-CYL7Fvjq.js +0 -1
  202. package/src/assets/web-panel/assets/Community-DqDfLQui.css +0 -1
  203. package/src/assets/web-panel/assets/Compact-5yRVELhA.js +0 -1
  204. package/src/assets/web-panel/assets/Compliance-CKuIDJHK.js +0 -1
  205. package/src/assets/web-panel/assets/Compliance-CKxw6vIq.css +0 -1
  206. package/src/assets/web-panel/assets/Cron-DIfkI7vf.js +0 -2
  207. package/src/assets/web-panel/assets/Crosschain-BkjY-lst.js +0 -1
  208. package/src/assets/web-panel/assets/Crosschain-DThGgQk8.css +0 -1
  209. package/src/assets/web-panel/assets/DID-BDvsVa08.css +0 -1
  210. package/src/assets/web-panel/assets/DID-ChzRkgNy.js +0 -2
  211. package/src/assets/web-panel/assets/Dashboard-Cviwdc26.css +0 -1
  212. package/src/assets/web-panel/assets/Dashboard-DKrbXVNn.js +0 -3
  213. package/src/assets/web-panel/assets/Dropdown-BYGoxH1z.js +0 -1
  214. package/src/assets/web-panel/assets/Federation-B8QX-IaA.js +0 -1
  215. package/src/assets/web-panel/assets/Federation-BftELHDw.css +0 -1
  216. package/src/assets/web-panel/assets/Git-BBnGgbBR.js +0 -2
  217. package/src/assets/web-panel/assets/Governance-BfmfQBGB.css +0 -1
  218. package/src/assets/web-panel/assets/Governance-CxUHZMsp.js +0 -1
  219. package/src/assets/web-panel/assets/Inference-BlnOG71q.js +0 -1
  220. package/src/assets/web-panel/assets/Inference-EFFc7eNZ.css +0 -1
  221. package/src/assets/web-panel/assets/Keyframes-C7fCrnlS.js +0 -1
  222. package/src/assets/web-panel/assets/KnowledgeGraph-U8ps3aGJ.css +0 -1
  223. package/src/assets/web-panel/assets/KnowledgeGraph-vkVq38kC.js +0 -19
  224. package/src/assets/web-panel/assets/Logs-Bxx7WARH.js +0 -2
  225. package/src/assets/web-panel/assets/Marketplace-B-4uYu_j.css +0 -1
  226. package/src/assets/web-panel/assets/Marketplace-Bh8ExT9_.js +0 -1
  227. package/src/assets/web-panel/assets/McpTools-CTQrNVAQ.css +0 -1
  228. package/src/assets/web-panel/assets/McpTools-Djj_a3ko.js +0 -5
  229. package/src/assets/web-panel/assets/Memory-DRghrGJr.css +0 -1
  230. package/src/assets/web-panel/assets/Memory-DlgNgAov.js +0 -2
  231. package/src/assets/web-panel/assets/NLProgramming-BN3jaoen.js +0 -1
  232. package/src/assets/web-panel/assets/NLProgramming-jURs-f-a.css +0 -1
  233. package/src/assets/web-panel/assets/Notes-De7mIkkV.js +0 -7
  234. package/src/assets/web-panel/assets/Organization-B-98mdK2.js +0 -4
  235. package/src/assets/web-panel/assets/Organization-DdOOM4ic.css +0 -1
  236. package/src/assets/web-panel/assets/Overflow-G0I8IlY3.js +0 -1
  237. package/src/assets/web-panel/assets/P2P-DIUgHZ1z.js +0 -2
  238. package/src/assets/web-panel/assets/P2P-OEzOeMZX.css +0 -1
  239. package/src/assets/web-panel/assets/Permissions-B8XycCVk.js +0 -4
  240. package/src/assets/web-panel/assets/Pipeline-DyqCLFVr.css +0 -1
  241. package/src/assets/web-panel/assets/Pipeline-cUpETlXS.js +0 -1
  242. package/src/assets/web-panel/assets/Portal-SsPhn64D.js +0 -1
  243. package/src/assets/web-panel/assets/Privacy-B6J89UBw.js +0 -1
  244. package/src/assets/web-panel/assets/Privacy-B_cAicd1.css +0 -1
  245. package/src/assets/web-panel/assets/ProjectSettings-2Ftw0zt_.js +0 -2
  246. package/src/assets/web-panel/assets/Projects-CcOdFpgr.js +0 -2
  247. package/src/assets/web-panel/assets/Projects-DxKelI5h.css +0 -1
  248. package/src/assets/web-panel/assets/Providers-D0r2qSf-.js +0 -2
  249. package/src/assets/web-panel/assets/QuickAsk-CwsPpfkq.js +0 -1
  250. package/src/assets/web-panel/assets/Recommend-BYEDetJm.js +0 -1
  251. package/src/assets/web-panel/assets/Recommend-DgNSCgRX.css +0 -1
  252. package/src/assets/web-panel/assets/Reputation-Bli4hBGH.js +0 -1
  253. package/src/assets/web-panel/assets/Reputation-y-46ThW8.css +0 -1
  254. package/src/assets/web-panel/assets/Row-DTW9_BYi.js +0 -1
  255. package/src/assets/web-panel/assets/RssFeed-kwj_himl.js +0 -3
  256. package/src/assets/web-panel/assets/Search-BTk9rglb.css +0 -1
  257. package/src/assets/web-panel/assets/Search-DymcqASO.js +0 -1
  258. package/src/assets/web-panel/assets/Security-Bh3yvyNN.js +0 -4
  259. package/src/assets/web-panel/assets/Security-Dwxw7rfP.css +0 -1
  260. package/src/assets/web-panel/assets/Services-O4UZaYur.js +0 -2
  261. package/src/assets/web-panel/assets/Skeleton-B82oQZTz.js +0 -8
  262. package/src/assets/web-panel/assets/Skills-BfkrC05g.js +0 -1
  263. package/src/assets/web-panel/assets/Sla-C1WYuQKf.css +0 -1
  264. package/src/assets/web-panel/assets/Sla-DEs5XCIf.js +0 -1
  265. package/src/assets/web-panel/assets/SpeechSettings-BWMhb10j.js +0 -1
  266. package/src/assets/web-panel/assets/SpeechSettings-CiKvsIyV.css +0 -1
  267. package/src/assets/web-panel/assets/Tasks-CIBUb9M1.js +0 -1
  268. package/src/assets/web-panel/assets/Templates-DAkzr0xS.css +0 -1
  269. package/src/assets/web-panel/assets/Templates-iqSuJY-O.js +0 -1
  270. package/src/assets/web-panel/assets/Tenant-BJr-h-_0.css +0 -1
  271. package/src/assets/web-panel/assets/Tenant-CLqZjkVq.js +0 -1
  272. package/src/assets/web-panel/assets/Tokens-Bwz8aQtK.js +0 -1
  273. package/src/assets/web-panel/assets/Tokens-KvJRHQcl.css +0 -1
  274. package/src/assets/web-panel/assets/Trigger-CxnChVoS.js +0 -1
  275. package/src/assets/web-panel/assets/Trust-BLI308Ik.css +0 -1
  276. package/src/assets/web-panel/assets/Trust-Bp23lyZl.js +0 -1
  277. package/src/assets/web-panel/assets/UkeySign-_VAMquoh.js +0 -1
  278. package/src/assets/web-panel/assets/VideoEditing-BA1N-5kq.css +0 -1
  279. package/src/assets/web-panel/assets/VideoEditing-Bxqwg4zW.js +0 -1
  280. package/src/assets/web-panel/assets/Wallet-Cvht6Yrh.js +0 -4
  281. package/src/assets/web-panel/assets/Wallet-DnIumafl.css +0 -1
  282. package/src/assets/web-panel/assets/WebAuthn-CNPl2VQR.css +0 -1
  283. package/src/assets/web-panel/assets/WebAuthn-DD4EomJu.js +0 -5
  284. package/src/assets/web-panel/assets/WorkflowEditor-CEKNTS5G.css +0 -1
  285. package/src/assets/web-panel/assets/WorkflowEditor-CJy5e0fl.js +0 -1
  286. package/src/assets/web-panel/assets/_plugin-vue_export-helper-DlAUqK2U.js +0 -1
  287. package/src/assets/web-panel/assets/icons-CJACPYXu.js +0 -57
  288. package/src/assets/web-panel/assets/index-B9B9Zbf3.js +0 -1
  289. package/src/assets/web-panel/assets/index-BAsMNMbh.js +0 -1
  290. package/src/assets/web-panel/assets/index-BB5y5Y0z.js +0 -14
  291. package/src/assets/web-panel/assets/index-BVjDIZQ4.js +0 -1
  292. package/src/assets/web-panel/assets/index-BZeRnzuY.js +0 -55
  293. package/src/assets/web-panel/assets/index-BZfoAtZC.js +0 -1
  294. package/src/assets/web-panel/assets/index-Bl2nXm2J.js +0 -13
  295. package/src/assets/web-panel/assets/index-Bw1dwHWm.js +0 -1
  296. package/src/assets/web-panel/assets/index-Bw_UV2ez.js +0 -13
  297. package/src/assets/web-panel/assets/index-C8GYpC65.js +0 -1
  298. package/src/assets/web-panel/assets/index-CBHlKa-J.js +0 -3
  299. package/src/assets/web-panel/assets/index-CL-7KCFI.js +0 -3
  300. package/src/assets/web-panel/assets/index-CqjUUbil.js +0 -12
  301. package/src/assets/web-panel/assets/index-Cqtt1N0F.js +0 -1
  302. package/src/assets/web-panel/assets/index-CyGyEIVX.css +0 -1
  303. package/src/assets/web-panel/assets/index-D1QP9Ue1.js +0 -1
  304. package/src/assets/web-panel/assets/index-D6BUjL6I.js +0 -1
  305. package/src/assets/web-panel/assets/index-DN7ywgBJ.js +0 -1
  306. package/src/assets/web-panel/assets/index-DasW8LIs.js +0 -1
  307. package/src/assets/web-panel/assets/index-Dd9McFt_.js +0 -1
  308. package/src/assets/web-panel/assets/index-DdzLEdL6.js +0 -7
  309. package/src/assets/web-panel/assets/index-DhML6F3z.js +0 -1
  310. package/src/assets/web-panel/assets/index-DjN0nHiV.js +0 -1
  311. package/src/assets/web-panel/assets/index-DjhWpiZW.js +0 -1
  312. package/src/assets/web-panel/assets/index-DouFuKIR.js +0 -1
  313. package/src/assets/web-panel/assets/index-DzWwjWYN.js +0 -21
  314. package/src/assets/web-panel/assets/index-Dza_w3kG.js +0 -1
  315. package/src/assets/web-panel/assets/index-Q4qgOtOe.js +0 -12
  316. package/src/assets/web-panel/assets/index-U4Zd5IK6.js +0 -8
  317. package/src/assets/web-panel/assets/index-Vit9TJBu.js +0 -36
  318. package/src/assets/web-panel/assets/index-lkJllVbJ.js +0 -6
  319. package/src/assets/web-panel/assets/index-uMWaXVtR.js +0 -3
  320. package/src/assets/web-panel/assets/index-uwh_ikIt.js +0 -1
  321. package/src/assets/web-panel/assets/motion-CIQOKmi6.js +0 -11
  322. package/src/assets/web-panel/assets/move-ZgRPlBji.js +0 -4
  323. package/src/assets/web-panel/assets/slide-Dd2mJUD0.js +0 -4
  324. package/src/assets/web-panel/assets/statusUtils-5QFvAofV.js +0 -1
  325. package/src/assets/web-panel/assets/transition-CVd2ueaJ.js +0 -1
  326. package/src/assets/web-panel/assets/useConfigInject-DIkkDpt1.js +0 -2
  327. package/src/assets/web-panel/assets/useFlexGapSupport-rrtj6f1h.js +0 -1
  328. package/src/assets/web-panel/assets/useFs-CK8VYPus.js +0 -1
  329. package/src/assets/web-panel/assets/vendor-D0Qjn73K.js +0 -1
  330. package/src/assets/web-panel/assets/vnode-xRp-KMjS.js +0 -1
  331. package/src/assets/web-panel/assets/zoom-CrI_kdTW.js +0 -4
@@ -0,0 +1,504 @@
1
+ /**
2
+ * Audit MTC double-track scaffolding (Phase 2 audit, off-by-default).
3
+ *
4
+ * Design ref: docs/design/默克尔树证书_MTC_落地方案.md §6.3 + 评审清单 §7.
5
+ * Compliance status (2026-05-01): Q-COMP-1 (等保三级最终性窗口) + Q-COMP-2
6
+ * (T/ZGCMCA 023—2025 条款摘要) legal sign-off received. This module still
7
+ * ships `enabled=false` so each tenant decides when to switch on for their
8
+ * own org via explicit `cc audit mtc enable`. See landing plan §14.2.
9
+ *
10
+ * Layout under <configDir>/audit-mtc/:
11
+ * config.json enabled, batch_interval_seconds, namespace_prefix, issuer, ...
12
+ * keys/issuer.hex Ed25519 secret key (0o600)
13
+ * staging/<event-id>.json one Ed25519-signed event per file (track 1: realtime)
14
+ * batches/<batch-id>/ one closed batch:
15
+ * manifest.json schema=audit-batch-manifest/v1, batch_id, tree_head_id, event_ids, ...
16
+ * landmark.json MTC landmark (track 2: batch finality)
17
+ * envelope-<event-id>.json one per event with inclusion_proof
18
+ */
19
+
20
+ import fs from "node:fs";
21
+ import path from "node:path";
22
+ import crypto from "node:crypto";
23
+ import { ed25519 as nobleEd25519 } from "@noble/curves/ed25519";
24
+ import mtcLib from "@chainlesschain/core-mtc";
25
+
26
+ const { sha256, jcs, encodeHashStr, ed25519, assembleBatch } = mtcLib;
27
+
28
+ const CONFIG_DEFAULTS = Object.freeze({
29
+ enabled: false,
30
+ // 3600 = Q-COMP-1 lenient path (approved unless legal requires sub-minute finality);
31
+ // 60 = strict path; both fully supported, just flip the number.
32
+ batch_interval_seconds: 3600,
33
+ namespace_prefix: "mtc/v1/audit/local",
34
+ issuer: "mtca:cc:audit-local",
35
+ });
36
+
37
+ const SCHEMA_EVENT = "audit-event/v1";
38
+ const SCHEMA_MANIFEST = "audit-batch-manifest/v1";
39
+
40
+ // ─────────────────────────────────────────────────────────────────────
41
+ // Path helpers
42
+ // ─────────────────────────────────────────────────────────────────────
43
+
44
+ export function getAuditMtcDir(configDir) {
45
+ if (!configDir) throw new Error("getAuditMtcDir: configDir required");
46
+ return path.join(configDir, "audit-mtc");
47
+ }
48
+
49
+ function configPath(dir) {
50
+ return path.join(dir, "config.json");
51
+ }
52
+ function stagingDir(dir) {
53
+ return path.join(dir, "staging");
54
+ }
55
+ function batchesDir(dir) {
56
+ return path.join(dir, "batches");
57
+ }
58
+ function keyPath(dir) {
59
+ return path.join(dir, "keys", "issuer.hex");
60
+ }
61
+
62
+ function ensureDirs(dir) {
63
+ for (const p of [
64
+ dir,
65
+ stagingDir(dir),
66
+ batchesDir(dir),
67
+ path.dirname(keyPath(dir)),
68
+ ]) {
69
+ if (!fs.existsSync(p)) fs.mkdirSync(p, { recursive: true });
70
+ }
71
+ }
72
+
73
+ // ─────────────────────────────────────────────────────────────────────
74
+ // Config
75
+ // ─────────────────────────────────────────────────────────────────────
76
+
77
+ export function loadAuditMtcConfig(dir) {
78
+ ensureDirs(dir);
79
+ const p = configPath(dir);
80
+ if (!fs.existsSync(p)) return { ...CONFIG_DEFAULTS };
81
+ try {
82
+ const raw = JSON.parse(fs.readFileSync(p, "utf-8"));
83
+ return { ...CONFIG_DEFAULTS, ...raw };
84
+ } catch (err) {
85
+ throw new Error(`audit-mtc config malformed at ${p}: ${err.message}`);
86
+ }
87
+ }
88
+
89
+ export function saveAuditMtcConfig(dir, patch) {
90
+ ensureDirs(dir);
91
+ const merged = { ...loadAuditMtcConfig(dir), ...patch };
92
+ // Validate
93
+ if (typeof merged.enabled !== "boolean") {
94
+ throw new TypeError("config.enabled must be boolean");
95
+ }
96
+ if (
97
+ !Number.isInteger(merged.batch_interval_seconds) ||
98
+ merged.batch_interval_seconds < 1
99
+ ) {
100
+ throw new RangeError(
101
+ "config.batch_interval_seconds must be positive integer",
102
+ );
103
+ }
104
+ if (typeof merged.namespace_prefix !== "string" || !merged.namespace_prefix) {
105
+ throw new TypeError("config.namespace_prefix must be non-empty string");
106
+ }
107
+ if (typeof merged.issuer !== "string" || !merged.issuer) {
108
+ throw new TypeError("config.issuer must be non-empty string");
109
+ }
110
+ fs.writeFileSync(configPath(dir), JSON.stringify(merged, null, 2), "utf-8");
111
+ return merged;
112
+ }
113
+
114
+ // ─────────────────────────────────────────────────────────────────────
115
+ // Key management — Ed25519 issuer key for tree-head signing.
116
+ // SLH-DSA swap-out is a one-line change here when @noble/post-quantum lands.
117
+ // ─────────────────────────────────────────────────────────────────────
118
+
119
+ function readIssuerKeyFile(p) {
120
+ const secretKey = Buffer.from(fs.readFileSync(p, "utf-8").trim(), "hex");
121
+ if (secretKey.length !== 32) {
122
+ throw new Error(
123
+ `issuer key file ${p} must contain 32 bytes (64 hex chars)`,
124
+ );
125
+ }
126
+ const publicKey = Buffer.from(nobleEd25519.getPublicKey(secretKey));
127
+ return { secretKey, publicKey, pubkeyId: ed25519.pubkeyId(publicKey) };
128
+ }
129
+
130
+ export function loadOrCreateIssuerKey(dir) {
131
+ ensureDirs(dir);
132
+ const p = keyPath(dir);
133
+ if (fs.existsSync(p)) {
134
+ return readIssuerKeyFile(p);
135
+ }
136
+ // Race-safe create: 'wx' flag fails with EEXIST if another writer beat us;
137
+ // in that case re-read what they wrote so all callers agree on one key.
138
+ // audit-mtc stays on Ed25519 for both realtime and tree-head signatures
139
+ // (small/fast sig is the realtime track's value prop). SLH-DSA opt-in
140
+ // is exposed at the cc mtc batch* / publish-skills surfaces only.
141
+ const keys = ed25519.generateKeyPair();
142
+ try {
143
+ fs.writeFileSync(p, keys.secretKey.toString("hex"), {
144
+ mode: 0o600,
145
+ flag: "wx",
146
+ });
147
+ return keys;
148
+ } catch (err) {
149
+ if (err.code !== "EEXIST") throw err;
150
+ return readIssuerKeyFile(p);
151
+ }
152
+ }
153
+
154
+ // ─────────────────────────────────────────────────────────────────────
155
+ // Track 1: emit — write event with realtime Ed25519 signature
156
+ // ─────────────────────────────────────────────────────────────────────
157
+
158
+ function makeEventId() {
159
+ // Time-prefixed so listing by name = chronological order within a batch.
160
+ const ts = new Date().toISOString().replace(/[-:T]/g, "").slice(0, 14);
161
+ const rand = crypto.randomBytes(6).toString("hex");
162
+ return `${ts}-${rand}`;
163
+ }
164
+
165
+ /**
166
+ * Submit one audit event. Always writes an Ed25519-signed staging file
167
+ * (so the event is queryable + cryptographically pinned within milliseconds).
168
+ * The event will land in a Merkle batch on the next reconcile() call.
169
+ *
170
+ * @param {string} dir - audit-mtc root
171
+ * @param {object} body - { event_type, operation, actor?, target?, details?, risk_level?, occurred_at? }
172
+ * @param {object} [opts]
173
+ * @param {boolean} [opts.requireEnabled=true] - when false, allow emit even if config.enabled=false (for tests/admin)
174
+ */
175
+ export function emitEvent(dir, body, opts = {}) {
176
+ ensureDirs(dir);
177
+ const cfg = loadAuditMtcConfig(dir);
178
+ const requireEnabled = opts.requireEnabled !== false;
179
+ if (requireEnabled && !cfg.enabled) {
180
+ const e = new Error(
181
+ "audit-mtc disabled: run `cc audit mtc enable` to activate (or pass --force for one-off admin/CI use)",
182
+ );
183
+ e.code = "AUDIT_MTC_DISABLED";
184
+ throw e;
185
+ }
186
+ if (!body || typeof body !== "object") {
187
+ throw new TypeError("emitEvent: body must be an object");
188
+ }
189
+ if (!body.event_type || !body.operation) {
190
+ throw new TypeError(
191
+ "emitEvent: body.event_type and body.operation required",
192
+ );
193
+ }
194
+
195
+ const keys = loadOrCreateIssuerKey(dir);
196
+ const eventId = makeEventId();
197
+ const occurredAt = body.occurred_at || new Date().toISOString();
198
+
199
+ const normalizedBody = {
200
+ event_type: body.event_type,
201
+ operation: body.operation,
202
+ actor: body.actor || null,
203
+ target: body.target || null,
204
+ details: body.details || null,
205
+ risk_level: body.risk_level || "low",
206
+ occurred_at: occurredAt,
207
+ };
208
+ const contentHash = encodeHashStr(sha256(jcs(normalizedBody)));
209
+
210
+ const signingInput = Buffer.concat([
211
+ Buffer.from("audit-event/v1\n", "utf-8"),
212
+ Buffer.from(contentHash, "utf-8"),
213
+ ]);
214
+ const sig = ed25519.signRaw(signingInput, keys.secretKey);
215
+
216
+ const record = {
217
+ schema: SCHEMA_EVENT,
218
+ event_id: eventId,
219
+ body: normalizedBody,
220
+ content_hash: contentHash,
221
+ ed25519_sig: {
222
+ alg: "Ed25519",
223
+ pubkey_id: ed25519.pubkeyId(keys.publicKey),
224
+ sig: sig.toString("base64url"),
225
+ },
226
+ queued_at: new Date().toISOString(),
227
+ };
228
+
229
+ const filePath = path.join(stagingDir(dir), `${eventId}.json`);
230
+ fs.writeFileSync(filePath, JSON.stringify(record, null, 2), "utf-8");
231
+ return { eventId, path: filePath, record };
232
+ }
233
+
234
+ // ─────────────────────────────────────────────────────────────────────
235
+ // Track 2: reconcile — close current batch, build tree, write envelopes.
236
+ // Idempotent: re-running with no staging events is a no-op; caller can
237
+ // drive it on a timer (config.batch_interval_seconds) without coordination.
238
+ // ─────────────────────────────────────────────────────────────────────
239
+
240
+ function nextBatchId(dir) {
241
+ const existing = fs.existsSync(batchesDir(dir))
242
+ ? fs.readdirSync(batchesDir(dir)).filter((n) => /^\d{6}$/.test(n))
243
+ : [];
244
+ if (existing.length === 0) return "000001";
245
+ const max = existing
246
+ .map((n) => parseInt(n, 10))
247
+ .reduce((a, b) => Math.max(a, b), 0);
248
+ return String(max + 1).padStart(6, "0");
249
+ }
250
+
251
+ function listStagingEvents(dir) {
252
+ const sd = stagingDir(dir);
253
+ if (!fs.existsSync(sd)) return [];
254
+ return fs
255
+ .readdirSync(sd)
256
+ .filter((n) => n.endsWith(".json"))
257
+ .sort() // event_id is time-prefixed → sort = chronological
258
+ .map((n) => {
259
+ const full = path.join(sd, n);
260
+ const expectedId = n.slice(0, -".json".length);
261
+ try {
262
+ const obj = JSON.parse(fs.readFileSync(full, "utf-8"));
263
+ if (obj.schema !== SCHEMA_EVENT) {
264
+ return {
265
+ eventId: null,
266
+ file: full,
267
+ error: `unexpected schema: ${obj.schema}`,
268
+ };
269
+ }
270
+ if (obj.event_id !== expectedId) {
271
+ return {
272
+ eventId: null,
273
+ file: full,
274
+ error: `filename/event_id mismatch (file=${expectedId}, body=${obj.event_id})`,
275
+ };
276
+ }
277
+ return { eventId: obj.event_id, file: full, record: obj };
278
+ } catch (err) {
279
+ return { eventId: null, file: full, error: err.message };
280
+ }
281
+ });
282
+ }
283
+
284
+ /**
285
+ * Close the current batch: scan staging, build Merkle tree, emit landmark +
286
+ * one envelope per event, write manifest, and remove staging files.
287
+ *
288
+ * Returns `{ skipped: true }` when staging is empty (Q-OPS-1 idempotency).
289
+ *
290
+ * @param {string} dir
291
+ * @param {object} [opts]
292
+ * @param {string} [opts.namespace] - override config.namespace_prefix
293
+ * @param {string} [opts.issuer] - override config.issuer
294
+ */
295
+ export function closeBatch(dir, opts = {}) {
296
+ ensureDirs(dir);
297
+ const cfg = loadAuditMtcConfig(dir);
298
+ const events = listStagingEvents(dir);
299
+
300
+ // Skip malformed entries — collected so caller can surface them
301
+ const malformed = events.filter((e) => e.error);
302
+ const valid = events.filter((e) => !e.error);
303
+
304
+ if (valid.length === 0) {
305
+ return { skipped: true, reason: "no staged events", malformed };
306
+ }
307
+
308
+ const batchId = nextBatchId(dir);
309
+ const namespacePrefix = opts.namespace || cfg.namespace_prefix;
310
+ const namespace = `${namespacePrefix}/${batchId}`;
311
+ const issuer = opts.issuer || cfg.issuer;
312
+ const keys = loadOrCreateIssuerKey(dir);
313
+
314
+ // Leaves: hash the realtime event record (already Ed25519-signed) so the
315
+ // inclusion proof simultaneously proves "this event existed" + "in this batch".
316
+ const rawLeaves = valid.map((e) => ({
317
+ kind: "audit-event",
318
+ subject: e.eventId,
319
+ content_hash: e.record.content_hash,
320
+ queued_at: e.record.queued_at,
321
+ realtime_sig: e.record.ed25519_sig,
322
+ }));
323
+
324
+ const { landmark, envelopes, treeHeadId } = assembleBatch(rawLeaves, keys, {
325
+ namespace,
326
+ issuer,
327
+ });
328
+
329
+ // Atomic-ish write: stage in tmp dir under batches/, rename in.
330
+ const finalDir = path.join(batchesDir(dir), batchId);
331
+ if (fs.existsSync(finalDir)) {
332
+ // Defensive: nextBatchId already ensures this is a fresh number;
333
+ // if we're here it means a previous close crashed mid-rename — clean up.
334
+ fs.rmSync(finalDir, { recursive: true, force: true });
335
+ }
336
+ const tmpDir = path.join(batchesDir(dir), `.${batchId}.tmp`);
337
+ if (fs.existsSync(tmpDir))
338
+ fs.rmSync(tmpDir, { recursive: true, force: true });
339
+ fs.mkdirSync(tmpDir, { recursive: true });
340
+
341
+ fs.writeFileSync(
342
+ path.join(tmpDir, "landmark.json"),
343
+ JSON.stringify(landmark, null, 2),
344
+ "utf-8",
345
+ );
346
+ for (let i = 0; i < envelopes.length; i++) {
347
+ const env = envelopes[i];
348
+ const eventId = valid[i].eventId;
349
+ fs.writeFileSync(
350
+ path.join(tmpDir, `envelope-${eventId}.json`),
351
+ JSON.stringify(env, null, 2),
352
+ "utf-8",
353
+ );
354
+ }
355
+
356
+ const manifest = {
357
+ schema: SCHEMA_MANIFEST,
358
+ batch_id: batchId,
359
+ namespace,
360
+ issuer,
361
+ tree_head_id: treeHeadId,
362
+ tree_size: valid.length,
363
+ closed_at: new Date().toISOString(),
364
+ event_ids: valid.map((e) => e.eventId),
365
+ envelope_files: valid.map((e) => `envelope-${e.eventId}.json`),
366
+ malformed_skipped: malformed.map((m) => ({ file: m.file, error: m.error })),
367
+ };
368
+ fs.writeFileSync(
369
+ path.join(tmpDir, "manifest.json"),
370
+ JSON.stringify(manifest, null, 2),
371
+ "utf-8",
372
+ );
373
+
374
+ fs.renameSync(tmpDir, finalDir);
375
+
376
+ // Remove staging files only AFTER the rename succeeds (so a crash before
377
+ // rename leaves staging intact and the next reconcile can retry).
378
+ for (const e of valid) {
379
+ try {
380
+ fs.unlinkSync(e.file);
381
+ } catch (_err) {
382
+ /* file may have been removed concurrently — non-fatal */
383
+ }
384
+ }
385
+
386
+ return {
387
+ skipped: false,
388
+ batchId,
389
+ namespace,
390
+ treeHeadId,
391
+ treeSize: valid.length,
392
+ eventIds: valid.map((e) => e.eventId),
393
+ batchDir: finalDir,
394
+ malformed: manifest.malformed_skipped,
395
+ };
396
+ }
397
+
398
+ /**
399
+ * Find which closed batch contains the given event id.
400
+ * Returns { found: false } if event is still in staging or unknown.
401
+ *
402
+ * @param {string} dir
403
+ * @param {string} eventId
404
+ * @returns {{ found: boolean, batchId?: string, treeHeadId?: string, namespace?: string, leafIndex?: number, envelopePath?: string, staging?: boolean }}
405
+ */
406
+ export function reconcileCheck(dir, eventId) {
407
+ ensureDirs(dir);
408
+ if (!eventId || typeof eventId !== "string") {
409
+ throw new TypeError("reconcileCheck: eventId required");
410
+ }
411
+
412
+ // Still in staging?
413
+ const stagingFile = path.join(stagingDir(dir), `${eventId}.json`);
414
+ if (fs.existsSync(stagingFile)) {
415
+ return { found: false, staging: true };
416
+ }
417
+
418
+ const bd = batchesDir(dir);
419
+ if (!fs.existsSync(bd)) return { found: false };
420
+ const batches = fs
421
+ .readdirSync(bd)
422
+ .filter((n) => /^\d{6}$/.test(n))
423
+ .sort();
424
+ for (const batchId of batches) {
425
+ const manifestPath = path.join(bd, batchId, "manifest.json");
426
+ if (!fs.existsSync(manifestPath)) continue;
427
+ let manifest;
428
+ try {
429
+ manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
430
+ } catch (_err) {
431
+ continue;
432
+ }
433
+ const idx = (manifest.event_ids || []).indexOf(eventId);
434
+ if (idx >= 0) {
435
+ return {
436
+ found: true,
437
+ batchId,
438
+ treeHeadId: manifest.tree_head_id,
439
+ namespace: manifest.namespace,
440
+ leafIndex: idx,
441
+ envelopePath: path.join(bd, batchId, `envelope-${eventId}.json`),
442
+ };
443
+ }
444
+ }
445
+ return { found: false };
446
+ }
447
+
448
+ /**
449
+ * Snapshot of queue + last-batch state. Cheap to compute, suitable for `cc audit mtc status`.
450
+ */
451
+ export function getStatus(dir) {
452
+ ensureDirs(dir);
453
+ const cfg = loadAuditMtcConfig(dir);
454
+ const staging = listStagingEvents(dir);
455
+ const bd = batchesDir(dir);
456
+ const batches = fs.existsSync(bd)
457
+ ? fs
458
+ .readdirSync(bd)
459
+ .filter((n) => /^\d{6}$/.test(n))
460
+ .sort()
461
+ : [];
462
+ let lastBatch = null;
463
+ if (batches.length > 0) {
464
+ const lastId = batches[batches.length - 1];
465
+ const manifestPath = path.join(bd, lastId, "manifest.json");
466
+ if (fs.existsSync(manifestPath)) {
467
+ try {
468
+ lastBatch = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
469
+ } catch (_err) {
470
+ /* malformed — treat as no-last-batch */
471
+ }
472
+ }
473
+ }
474
+ // Find oldest queued_at across valid records — guard against the
475
+ // alphabetically-first staging entry being malformed.
476
+ const oldestValid = staging.find((e) => e.record && e.record.queued_at);
477
+ return {
478
+ config: cfg,
479
+ staging: {
480
+ count: staging.length,
481
+ malformed: staging.filter((e) => e.error).length,
482
+ oldest_queued_at: oldestValid ? oldestValid.record.queued_at : null,
483
+ },
484
+ batches: {
485
+ count: batches.length,
486
+ last_batch_id: batches.length ? batches[batches.length - 1] : null,
487
+ last_closed_at: lastBatch ? lastBatch.closed_at : null,
488
+ last_tree_size: lastBatch ? lastBatch.tree_size : null,
489
+ last_tree_head_id: lastBatch ? lastBatch.tree_head_id : null,
490
+ },
491
+ };
492
+ }
493
+
494
+ export const _internals = {
495
+ CONFIG_DEFAULTS,
496
+ SCHEMA_EVENT,
497
+ SCHEMA_MANIFEST,
498
+ configPath,
499
+ stagingDir,
500
+ batchesDir,
501
+ keyPath,
502
+ nextBatchId,
503
+ listStagingEvents,
504
+ };