blun-king-cli 9.0.0 → 9.1.0

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 (238) hide show
  1. package/LIESMICH.txt +32 -13
  2. package/README.md +39 -20
  3. package/bin/blun.js +248 -160
  4. package/bin/core-bootstrap.js +47 -0
  5. package/bin/king.js +277 -1
  6. package/bin/launcher-mode.js +15 -3
  7. package/bin/launcher-runtime.js +293 -0
  8. package/bin/plugin-bootstrap.js +11 -4
  9. package/bin/private-paths.js +1577 -10
  10. package/bin/update-lease.js +399 -0
  11. package/bin/update-notice.js +1245 -0
  12. package/blun.mjs +26606 -25239
  13. package/dist-web/assets/{CodeBlockNode-Bsvp6ZEy.js → CodeBlockNode-CXnTLMNr.js} +1 -1
  14. package/dist-web/assets/{CodeBlockShell.vue_vue_type_style_index_0_lang-ta7hLjia.js → CodeBlockShell.vue_vue_type_style_index_0_lang-CCF8Ntnq.js} +1 -1
  15. package/dist-web/assets/{DesignSystemView-BmDDe28A.js → DesignSystemView-BbMOu-XO.js} +1 -1
  16. package/dist-web/assets/{Tooltip-nEEfaYVY.js → Tooltip-CFQEzqC-.js} +1 -1
  17. package/dist-web/assets/abnfDiagram-N423BO3Z-CsByy-GW.js +1 -0
  18. package/dist-web/assets/abnfDiagram-N423BO3Z-Z1APZG5m.js +1 -0
  19. package/dist-web/assets/arc-C-LXCaja.js +1 -0
  20. package/dist-web/assets/arc-C4VyWloT.js +1 -0
  21. package/dist-web/assets/architectureDiagram-T3A2C74G-DZq4L18e.js +36 -0
  22. package/dist-web/assets/architectureDiagram-T3A2C74G-DpddbUcM.js +36 -0
  23. package/dist-web/assets/blockDiagram-VBNYF7ZC-BV4sIf98.js +132 -0
  24. package/dist-web/assets/blockDiagram-VBNYF7ZC-BqccOSMr.js +132 -0
  25. package/dist-web/assets/{c4Diagram-AAUBKEIU-DtzacMnD.js → c4Diagram-5PPSVZJV-0MRkZlgP.js} +1 -1
  26. package/dist-web/assets/{c4Diagram-AAUBKEIU-D1VdMx8d.js → c4Diagram-5PPSVZJV-OHAcJrTy.js} +1 -1
  27. package/dist-web/assets/channel-B2VOQOI-.js +1 -0
  28. package/dist-web/assets/channel-DKjwM05G.js +1 -0
  29. package/dist-web/assets/{chunk-ND2GUHAM-DJoY9wNJ.js → chunk-2GRJ4B5K-DqJHs8Fw.js} +1 -1
  30. package/dist-web/assets/{chunk-ND2GUHAM-C4-rwdcv.js → chunk-2GRJ4B5K-oO6nqeLA.js} +1 -1
  31. package/dist-web/assets/{chunk-QZHKN3VN-C7YGaShq.js → chunk-2Q5K7J3B-B1nCd91o.js} +1 -1
  32. package/dist-web/assets/{chunk-QZHKN3VN-_Rz9_NuS.js → chunk-2Q5K7J3B-BC0Hsfqy.js} +1 -1
  33. package/dist-web/assets/chunk-5RXB4S5H-BfZa4yDH.js +231 -0
  34. package/dist-web/assets/chunk-5RXB4S5H-neG70kZx.js +231 -0
  35. package/dist-web/assets/{chunk-FMBD7UC4-DlLNDUx6.js → chunk-5VM5RSS4-l7biGqeH.js} +1 -1
  36. package/dist-web/assets/{chunk-FMBD7UC4-B2zs_Y-d.js → chunk-5VM5RSS4-u00AcpiJ.js} +1 -1
  37. package/dist-web/assets/chunk-6Q2QTUOP-BO-F11Gs.js +88 -0
  38. package/dist-web/assets/chunk-6Q2QTUOP-RUVRPBzG.js +88 -0
  39. package/dist-web/assets/{chunk-727SXJPM-Dn5wkDO_.js → chunk-GF5L2VYU-Ba-86KTd.js} +5 -5
  40. package/dist-web/assets/{chunk-727SXJPM-Dk2Xa3bA.js → chunk-GF5L2VYU-BtC69fw0.js} +5 -5
  41. package/dist-web/assets/{chunk-4BX2VUAB-DxZViaHS.js → chunk-JWPE2WC7-DIOubEqr.js} +1 -1
  42. package/dist-web/assets/{chunk-4BX2VUAB-WqrE2gaw.js → chunk-JWPE2WC7-u8Pcfhwh.js} +1 -1
  43. package/dist-web/assets/{chunk-2J33WTMH-Dm_s0_4f.js → chunk-KBJHAD2P-DDUeH_Ba.js} +1 -1
  44. package/dist-web/assets/{chunk-2J33WTMH-w4sdiKFO.js → chunk-KBJHAD2P-DS3BL64y.js} +1 -1
  45. package/dist-web/assets/chunk-RYQCIY6F-B9gFMVbS.js +1 -0
  46. package/dist-web/assets/chunk-RYQCIY6F-xg3EO0le.js +1 -0
  47. package/dist-web/assets/{chunk-55IACEB6-B5dE1-Um.js → chunk-XXDRQBXY-B60H0rRC.js} +1 -1
  48. package/dist-web/assets/{chunk-55IACEB6-B12zGIFz.js → chunk-XXDRQBXY-Bn1Xz6TQ.js} +1 -1
  49. package/dist-web/assets/classDiagram-JCYQIIEL-BA1TjAxj.js +1 -0
  50. package/dist-web/assets/classDiagram-JCYQIIEL-BNU7Qn4k.js +1 -0
  51. package/dist-web/assets/classDiagram-v2-OCEON4UE-BA1TjAxj.js +1 -0
  52. package/dist-web/assets/classDiagram-v2-OCEON4UE-BNU7Qn4k.js +1 -0
  53. package/dist-web/assets/{cose-bilkent-S5V4N54A-Bi19n8m-.js → cose-bilkent-JH36ORCC-4Ybddg08.js} +1 -1
  54. package/dist-web/assets/{cose-bilkent-S5V4N54A-c8o8NFp5.js → cose-bilkent-JH36ORCC-DqigO3T4.js} +1 -1
  55. package/dist-web/assets/cynefin-VYW2F7L2-C-EfYT07.js +178 -0
  56. package/dist-web/assets/cynefin-VYW2F7L2-rpD93tQ-.js +178 -0
  57. package/dist-web/assets/cynefinDiagram-MW4NZA55-DWZPLJcD.js +62 -0
  58. package/dist-web/assets/cynefinDiagram-MW4NZA55-DbTqnkVJ.js +62 -0
  59. package/dist-web/assets/dagre-VZM6K2ZE-DcM8aEVY.js +4 -0
  60. package/dist-web/assets/dagre-VZM6K2ZE-M_HVNtqP.js +4 -0
  61. package/dist-web/assets/diagram-7IWD3JNH-DoNximNF.js +30 -0
  62. package/dist-web/assets/diagram-7IWD3JNH-UymgsBNa.js +30 -0
  63. package/dist-web/assets/{diagram-KO2AKTUF-CFQs13i5.js → diagram-B4RE2ZJO-BVA2EhnC.js} +3 -3
  64. package/dist-web/assets/{diagram-KO2AKTUF-agFIuPJW.js → diagram-B4RE2ZJO-BiYu5WPF.js} +3 -3
  65. package/dist-web/assets/{diagram-LMA3HP47-TMIXizxR.js → diagram-LBJQPF4R-BD3kkgOO.js} +2 -2
  66. package/dist-web/assets/{diagram-LMA3HP47-He5zlyMt.js → diagram-LBJQPF4R-m3a1Euj3.js} +2 -2
  67. package/dist-web/assets/diagram-Q27KOJAE-D1mYQ_cI.js +24 -0
  68. package/dist-web/assets/diagram-Q27KOJAE-hy_T73PK.js +24 -0
  69. package/dist-web/assets/diagram-UB23O5K3-BWkoQZ4A.js +41 -0
  70. package/dist-web/assets/diagram-UB23O5K3-BtX8u6HG.js +41 -0
  71. package/dist-web/assets/ebnfDiagram-BXEA7PRR-BKs9JUHW.js +1 -0
  72. package/dist-web/assets/ebnfDiagram-BXEA7PRR-CBAnFkRF.js +1 -0
  73. package/dist-web/assets/erDiagram-JOGREHBK-3vKcWsxm.js +85 -0
  74. package/dist-web/assets/erDiagram-JOGREHBK-BIpd6dTf.js +85 -0
  75. package/dist-web/assets/flowDiagram-UKHOOZJN-D9wBbHm2.js +156 -0
  76. package/dist-web/assets/flowDiagram-UKHOOZJN-Z83i2UWI.js +156 -0
  77. package/dist-web/assets/ganttDiagram-PKOTCBZU-Cd_dViF-.js +292 -0
  78. package/dist-web/assets/ganttDiagram-PKOTCBZU-DFrb_S1d.js +292 -0
  79. package/dist-web/assets/{gitGraphDiagram-PVQCEYII-BSDFfwdY.js → gitGraphDiagram-DS77QQ5N-BiEEtTo7.js} +3 -3
  80. package/dist-web/assets/{gitGraphDiagram-PVQCEYII-DMbTATyw.js → gitGraphDiagram-DS77QQ5N-Dp3Ar-hi.js} +3 -3
  81. package/dist-web/assets/{graph-BwjfAU3j.js → graph-CAUpWmoK.js} +1 -1
  82. package/dist-web/assets/{graph--OzhPTMs.js → graph-DOmOIIwC.js} +1 -1
  83. package/dist-web/assets/{index-W6VnSrkB.js → index-Ba1OvLjf.js} +2 -2
  84. package/dist-web/assets/{index-CkVgGDpx.js → index-CiPA8Kex.js} +4 -4
  85. package/dist-web/assets/{index-BzK4vJBu.js → index-DdEakFJM.js} +1 -1
  86. package/dist-web/assets/{index10-Czg_oF-W.js → index10-CNr4U-Nw.js} +1 -1
  87. package/dist-web/assets/{index11-BjzCZuCr.js → index11-Dto_yZNz.js} +1 -1
  88. package/dist-web/assets/{index5-DlVoNkCD.js → index5-B2PldaO2.js} +1 -1
  89. package/dist-web/assets/{index6-BxiXA2yo.js → index6-CBdZmmyx.js} +1 -1
  90. package/dist-web/assets/{index7-BPdza6d1.js → index7-Dz9oCsUF.js} +1 -1
  91. package/dist-web/assets/{index8-Q_XzGC1Z.js → index8-B6k25jtU.js} +2 -2
  92. package/dist-web/assets/{infoDiagram-5YYISTIA-2JF3XEdD.js → infoDiagram-6WML65LV-BSa2g04G.js} +1 -1
  93. package/dist-web/assets/{infoDiagram-5YYISTIA-UrQusrJq.js → infoDiagram-6WML65LV-D4ph2sIH.js} +1 -1
  94. package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-7RVUL-vB.js → ishikawaDiagram-WSZJBQD7-DjKjbMm9.js} +5 -5
  95. package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-C5OstRVV.js → ishikawaDiagram-WSZJBQD7-Hm36UOQe.js} +5 -5
  96. package/dist-web/assets/{journeyDiagram-JHISSGLW-B34fCMu9.js → journeyDiagram-NVQOT4AX-DttHDfPQ.js} +1 -1
  97. package/dist-web/assets/{journeyDiagram-JHISSGLW-yctdo4bX.js → journeyDiagram-NVQOT4AX-MvWWPNDV.js} +1 -1
  98. package/dist-web/assets/{kanban-definition-UN3LZRKU-BS4FBZsQ.js → kanban-definition-27J2QSJJ-C5gB-W0d.js} +7 -7
  99. package/dist-web/assets/{kanban-definition-UN3LZRKU-CxBCv27E.js → kanban-definition-27J2QSJJ-Cu-E_cXA.js} +5 -5
  100. package/dist-web/assets/layout-CvP6o9AK.js +1 -0
  101. package/dist-web/assets/layout-D-LzfAck.js +1 -0
  102. package/dist-web/assets/{linear-3mB6q2-g.js → linear-B3HWgQI2.js} +1 -1
  103. package/dist-web/assets/{linear-BKCnUo31.js → linear-BRGe4-d6.js} +1 -1
  104. package/dist-web/assets/map-CWKZqZjr.js +1 -0
  105. package/dist-web/assets/map-DxJ2ADlA.js +1 -0
  106. package/dist-web/assets/mermaid.core-D-9Sx1No.js +314 -0
  107. package/dist-web/assets/mermaidParser.worker-PTFfzpoB.js +318 -0
  108. package/dist-web/assets/{mindmap-definition-RKZ34NQL-BmJZpjh6.js → mindmap-definition-FAOFIHXS-C4vnms3i.js} +2 -2
  109. package/dist-web/assets/{mindmap-definition-RKZ34NQL-1mjWUcf6.js → mindmap-definition-FAOFIHXS-Cg_hoVIq.js} +1 -1
  110. package/dist-web/assets/pegDiagram-VL7TDLO6-B2fFEFUH.js +1 -0
  111. package/dist-web/assets/pegDiagram-VL7TDLO6-CSX9hitD.js +1 -0
  112. package/dist-web/assets/pieDiagram-7S7Q4E2Y-0L0mxahZ.js +39 -0
  113. package/dist-web/assets/pieDiagram-7S7Q4E2Y-C7T0Cmw1.js +39 -0
  114. package/dist-web/assets/{quadrantDiagram-W4KKPZXB-BmT_qM09.js → quadrantDiagram-CIZ2JOQS-BBy7w4kD.js} +3 -3
  115. package/dist-web/assets/{quadrantDiagram-W4KKPZXB-C0kPuyNP.js → quadrantDiagram-CIZ2JOQS-U483z0er.js} +3 -3
  116. package/dist-web/assets/railroadDiagram-AXF67PYL-D80a2_DJ.js +1 -0
  117. package/dist-web/assets/railroadDiagram-AXF67PYL-DX8y0MzW.js +1 -0
  118. package/dist-web/assets/{requirementDiagram-4Y6WPE33-C0YP_Amt.js → requirementDiagram-LRYGKXZP-CeyHfq8t.js} +3 -3
  119. package/dist-web/assets/{requirementDiagram-4Y6WPE33-CZrxH1Y2.js → requirementDiagram-LRYGKXZP-DGD5J_4k.js} +3 -3
  120. package/dist-web/assets/sankeyDiagram-W5VNT64P-CCISkkrR.js +40 -0
  121. package/dist-web/assets/sankeyDiagram-W5VNT64P-CT5PdZz2.js +40 -0
  122. package/dist-web/assets/sequenceDiagram-SI44F4Z6-BeMzHWXI.js +162 -0
  123. package/dist-web/assets/sequenceDiagram-SI44F4Z6-jQfm2XS7.js +162 -0
  124. package/dist-web/assets/sizeCapture-X5ZJPWSS-BQsTdtrv.js +1 -0
  125. package/dist-web/assets/sizeCapture-X5ZJPWSS-lRZsmCoS.js +1 -0
  126. package/dist-web/assets/stateDiagram-OKZ733FA-ClCgTdUm.js +1 -0
  127. package/dist-web/assets/stateDiagram-OKZ733FA-Cv59z5YT.js +1 -0
  128. package/dist-web/assets/stateDiagram-v2-UEYNNEHI-R8jTc--F.js +1 -0
  129. package/dist-web/assets/stateDiagram-v2-UEYNNEHI-fi_lrTAx.js +1 -0
  130. package/dist-web/assets/swimlanes-SLNWSIFB-BCdOUN05.js +2 -0
  131. package/dist-web/assets/swimlanes-SLNWSIFB-Cu5l7SuR.js +1 -0
  132. package/dist-web/assets/swimlanesDiagram-ULZ7WXOC-BUd_uYK3.js +8 -0
  133. package/dist-web/assets/swimlanesDiagram-ULZ7WXOC-CalrsgPK.js +8 -0
  134. package/dist-web/assets/{timeline-definition-PNZ67QCA-DsVZdrZa.js → timeline-definition-Z64GVDOM-CMjnh4bu.js} +4 -4
  135. package/dist-web/assets/{timeline-definition-PNZ67QCA-DnB6Usl0.js → timeline-definition-Z64GVDOM-DpWutSKa.js} +4 -4
  136. package/dist-web/assets/vennDiagram-T6HMQDX7-DKJW_8oU.js +34 -0
  137. package/dist-web/assets/vennDiagram-T6HMQDX7-DVC5JVsc.js +34 -0
  138. package/dist-web/assets/{vue.runtime.esm-bundler-pgHGheCW.js → vue.runtime.esm-bundler-BwwRtQwQ.js} +1 -1
  139. package/dist-web/assets/{wardleyDiagram-YWT4CUSO-oBauTCEw.js → wardleyDiagram-T6FBY63Y-BK2mrq7L.js} +3 -3
  140. package/dist-web/assets/{wardleyDiagram-YWT4CUSO-DCiyDQNB.js → wardleyDiagram-T6FBY63Y-oUvgepFn.js} +3 -3
  141. package/dist-web/assets/xychartDiagram-ELKLHX3M-DI6n79q0.js +7 -0
  142. package/dist-web/assets/xychartDiagram-ELKLHX3M-DUJu9F7-.js +7 -0
  143. package/dist-web/index.html +1 -1
  144. package/dist-web/vis/index.html.gz +0 -0
  145. package/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  146. package/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  147. package/package.json +9 -11
  148. package/skills/screenshot-lesen/SKILL.md +0 -1
  149. package/skills/web-lesen/SKILL.md +0 -1
  150. package/telegram-plugin/dist/bridge.mjs +7 -25
  151. package/telegram-plugin/dist/mcp-server.mjs +236 -71
  152. package/dist-web/assets/arc-4xPfymbf.js +0 -1
  153. package/dist-web/assets/arc-Doj0wRZ0.js +0 -1
  154. package/dist-web/assets/architectureDiagram-3BPJPVTR-BGih283a.js +0 -36
  155. package/dist-web/assets/architectureDiagram-3BPJPVTR-CQ09RrbH.js +0 -36
  156. package/dist-web/assets/blockDiagram-GPEHLZMM-3ShMf1gu.js +0 -132
  157. package/dist-web/assets/blockDiagram-GPEHLZMM-CAtDjkJt.js +0 -132
  158. package/dist-web/assets/channel-DNkUo9e6.js +0 -1
  159. package/dist-web/assets/channel-DcnUTIGB.js +0 -1
  160. package/dist-web/assets/chunk-AQP2D5EJ-FS8-f8lF.js +0 -231
  161. package/dist-web/assets/chunk-AQP2D5EJ-UKhb4V4r.js +0 -231
  162. package/dist-web/assets/classDiagram-4FO5ZUOK-B1ZO8EbE.js +0 -1
  163. package/dist-web/assets/classDiagram-4FO5ZUOK-xk6cM9Kq.js +0 -1
  164. package/dist-web/assets/classDiagram-v2-Q7XG4LA2-B1ZO8EbE.js +0 -1
  165. package/dist-web/assets/classDiagram-v2-Q7XG4LA2-xk6cM9Kq.js +0 -1
  166. package/dist-web/assets/dagre-BM42HDAG-CmUO9qKN.js +0 -4
  167. package/dist-web/assets/dagre-BM42HDAG-DLMfLCoV.js +0 -4
  168. package/dist-web/assets/diagram-2AECGRRQ-DQTst0OH.js +0 -43
  169. package/dist-web/assets/diagram-2AECGRRQ-L74iLMqd.js +0 -43
  170. package/dist-web/assets/diagram-5GNKFQAL-BiBm7CJR.js +0 -10
  171. package/dist-web/assets/diagram-5GNKFQAL-DoE6q7H1.js +0 -10
  172. package/dist-web/assets/diagram-OG6HWLK6-BHCt1E0n.js +0 -24
  173. package/dist-web/assets/diagram-OG6HWLK6-DRyxjFMa.js +0 -24
  174. package/dist-web/assets/erDiagram-TEJ5UH35-BoDczjGG.js +0 -85
  175. package/dist-web/assets/erDiagram-TEJ5UH35-yd6SOv_7.js +0 -85
  176. package/dist-web/assets/flowDiagram-I6XJVG4X-DHoceI7r.js +0 -162
  177. package/dist-web/assets/flowDiagram-I6XJVG4X-DkYNQv0R.js +0 -162
  178. package/dist-web/assets/ganttDiagram-6RSMTGT7-Cg1TQBc0.js +0 -292
  179. package/dist-web/assets/ganttDiagram-6RSMTGT7-Z6klo7KK.js +0 -292
  180. package/dist-web/assets/layout-C1ojF0zw.js +0 -1
  181. package/dist-web/assets/layout-SsrduOYp.js +0 -1
  182. package/dist-web/assets/mermaid.core-D_lKT0dR.js +0 -309
  183. package/dist-web/assets/mermaidParser.worker-Dx4jPi9z.js +0 -313
  184. package/dist-web/assets/pieDiagram-4H26LBE5-BU41t2A_.js +0 -30
  185. package/dist-web/assets/pieDiagram-4H26LBE5-BkwDAvbt.js +0 -30
  186. package/dist-web/assets/sankeyDiagram-5OEKKPKP-De_o7hDr.js +0 -40
  187. package/dist-web/assets/sankeyDiagram-5OEKKPKP-Dvuj6bMA.js +0 -40
  188. package/dist-web/assets/sequenceDiagram-3UESZ5HK-DuCrgPyA.js +0 -162
  189. package/dist-web/assets/sequenceDiagram-3UESZ5HK-VAxffBe7.js +0 -162
  190. package/dist-web/assets/stateDiagram-AJRCARHV-CYLupxM7.js +0 -1
  191. package/dist-web/assets/stateDiagram-AJRCARHV-nDExQydZ.js +0 -1
  192. package/dist-web/assets/stateDiagram-v2-BHNVJYJU-BhEc7Thx.js +0 -1
  193. package/dist-web/assets/stateDiagram-v2-BHNVJYJU-BzwD_BIl.js +0 -1
  194. package/dist-web/assets/vennDiagram-CIIHVFJN-BBHQmCFf.js +0 -34
  195. package/dist-web/assets/vennDiagram-CIIHVFJN-Cfj-K9NW.js +0 -34
  196. package/dist-web/assets/wardley-L42UT6IY-BJFn8eDD.js +0 -173
  197. package/dist-web/assets/wardley-L42UT6IY-BSu8-4hg.js +0 -173
  198. package/dist-web/assets/xychartDiagram-2RQKCTM6-C2iZpl9I.js +0 -7
  199. package/dist-web/assets/xychartDiagram-2RQKCTM6-Db_VoDBV.js +0 -7
  200. package/mnemo/access_routes.js +0 -692
  201. package/mnemo/agent_governance.js +0 -4242
  202. package/mnemo/agent_mail.js +0 -901
  203. package/mnemo/bootstrap_auto.js +0 -137
  204. package/mnemo/brief_coordination.js +0 -226
  205. package/mnemo/code_read_tools.js +0 -375
  206. package/mnemo/context_preview_tools.js +0 -603
  207. package/mnemo/embeddings.js +0 -66
  208. package/mnemo/external_repo_ops.js +0 -575
  209. package/mnemo/facts/example-project-rules.json +0 -90
  210. package/mnemo/facts/example.json +0 -34
  211. package/mnemo/identity_schema.sql +0 -139
  212. package/mnemo/journal_schema.js +0 -561
  213. package/mnemo/loop_doctor_tools.js +0 -661
  214. package/mnemo/mail_secret_refs.js +0 -150
  215. package/mnemo/mcp.js +0 -9309
  216. package/mnemo/memory_consolidation.js +0 -1914
  217. package/mnemo/memory_health_tools.js +0 -165
  218. package/mnemo/package.json +0 -79
  219. package/mnemo/protected_scope_gate.js +0 -627
  220. package/mnemo/resource_access_control.js +0 -684
  221. package/mnemo/runtime_governance.js +0 -1256
  222. package/mnemo/runtime_turn_gate.js +0 -862
  223. package/mnemo/sandbox.js +0 -143
  224. package/mnemo/schema.sql +0 -389
  225. package/mnemo/shared_utils.js +0 -763
  226. package/mnemo/skills/agent-auto-resume/SKILL.md +0 -56
  227. package/mnemo/skills/agent_hand/SKILL.md +0 -43
  228. package/mnemo/skills/agent_hand/run.js +0 -63
  229. package/mnemo/skills/book_flight/SKILL.md +0 -34
  230. package/mnemo/skills/external_repo_review/SKILL.md +0 -43
  231. package/mnemo/skills/external_repo_review/run.js +0 -73
  232. package/mnemo/skills/pay_invoice/SKILL.md +0 -34
  233. package/mnemo/team_quality_ops.js +0 -944
  234. package/mnemo/timeline_report_tools.js +0 -810
  235. package/mnemo/write_gate_risk.js +0 -80
  236. package/mnemo/writer_health.js +0 -152
  237. package/skills/doku-ingestion/SKILL.md +0 -48
  238. package/skills/doku-ingestion/ingest_docs.py +0 -133
@@ -1,561 +0,0 @@
1
- /**
2
- * Shared journal schema DDL — single source of truth for tables, indexes,
3
- * and triggers used by ensureUniversalJournalSchema in daemon.js and mcp.js.
4
- *
5
- * Usage: const { ensureUniversalJournalSchema } = require("./journal_schema");
6
- * ensureUniversalJournalSchema(db);
7
- */
8
-
9
- const { ensureTeamQualityTables } = require("./team_quality_ops");
10
- const { ensureRuntimeGovernanceSchema } = require("./runtime_governance");
11
-
12
- function ensureUniversalJournalSchema(db) {
13
- db.exec(`
14
- CREATE TABLE IF NOT EXISTS transcript (
15
- id INTEGER PRIMARY KEY AUTOINCREMENT,
16
- source TEXT NOT NULL,
17
- channel TEXT,
18
- direction TEXT NOT NULL,
19
- speaker TEXT,
20
- content TEXT NOT NULL,
21
- meta_json TEXT,
22
- occurred_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
23
- ref_kind TEXT,
24
- ref_id TEXT
25
- );
26
- CREATE INDEX IF NOT EXISTS idx_transcript_occurred ON transcript(occurred_at DESC);
27
- CREATE INDEX IF NOT EXISTS idx_transcript_speaker ON transcript(speaker, occurred_at DESC);
28
- CREATE INDEX IF NOT EXISTS idx_transcript_source_channel ON transcript(source, channel, occurred_at DESC);
29
-
30
- CREATE TABLE IF NOT EXISTS mnemo_event_journal (
31
- id INTEGER PRIMARY KEY AUTOINCREMENT,
32
- source TEXT NOT NULL,
33
- channel TEXT,
34
- direction TEXT NOT NULL DEFAULT 'internal',
35
- actor TEXT,
36
- actor_id TEXT,
37
- event_kind TEXT NOT NULL,
38
- ref_kind TEXT,
39
- ref_id TEXT,
40
- thread_id TEXT,
41
- status TEXT,
42
- content TEXT,
43
- payload_json TEXT,
44
- meta_json TEXT,
45
- occurred_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
46
- ingested_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
47
- );
48
- CREATE INDEX IF NOT EXISTS idx_event_journal_occurred ON mnemo_event_journal(occurred_at DESC);
49
- CREATE INDEX IF NOT EXISTS idx_event_journal_source_channel ON mnemo_event_journal(source, channel, occurred_at DESC);
50
- CREATE INDEX IF NOT EXISTS idx_event_journal_actor ON mnemo_event_journal(actor, occurred_at DESC);
51
- CREATE INDEX IF NOT EXISTS idx_event_journal_kind ON mnemo_event_journal(event_kind, occurred_at DESC);
52
- CREATE INDEX IF NOT EXISTS idx_event_journal_ref ON mnemo_event_journal(ref_kind, ref_id);
53
-
54
- CREATE TABLE IF NOT EXISTS capture_receipt (
55
- dedupe_key TEXT PRIMARY KEY,
56
- source TEXT NOT NULL,
57
- channel TEXT,
58
- direction TEXT NOT NULL DEFAULT 'internal',
59
- actor TEXT,
60
- actor_id TEXT,
61
- event_kind TEXT NOT NULL,
62
- ref_kind TEXT,
63
- ref_id TEXT,
64
- thread_id TEXT,
65
- occurred_at TEXT NOT NULL,
66
- content_hash TEXT,
67
- content_preview TEXT,
68
- event_id INTEGER,
69
- transcript_id INTEGER,
70
- memory_id INTEGER,
71
- status TEXT NOT NULL DEFAULT 'captured',
72
- seen_count INTEGER NOT NULL DEFAULT 1,
73
- first_seen_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
74
- last_seen_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
75
- meta_json TEXT
76
- );
77
- CREATE INDEX IF NOT EXISTS idx_capture_source_channel ON capture_receipt(source, channel, occurred_at DESC);
78
- CREATE INDEX IF NOT EXISTS idx_capture_ref ON capture_receipt(ref_kind, ref_id);
79
- CREATE INDEX IF NOT EXISTS idx_capture_actor ON capture_receipt(actor, occurred_at DESC);
80
- CREATE INDEX IF NOT EXISTS idx_capture_status ON capture_receipt(status, last_seen_at DESC);
81
-
82
- CREATE TABLE IF NOT EXISTS media_asset (
83
- id INTEGER PRIMARY KEY AUTOINCREMENT,
84
- dedupe_key TEXT UNIQUE,
85
- source TEXT NOT NULL,
86
- channel TEXT,
87
- thread_id TEXT,
88
- actor TEXT,
89
- event_kind TEXT,
90
- media_kind TEXT NOT NULL,
91
- media_type TEXT,
92
- title TEXT NOT NULL,
93
- file_name TEXT,
94
- original_file_name TEXT,
95
- canonical_name TEXT,
96
- file_ext TEXT,
97
- media_path TEXT,
98
- storage_path TEXT,
99
- content_ref TEXT,
100
- page_url TEXT,
101
- route TEXT,
102
- project TEXT,
103
- labels_json TEXT,
104
- notes TEXT,
105
- ref_kind TEXT,
106
- ref_id TEXT,
107
- occurred_at TEXT NOT NULL,
108
- status TEXT NOT NULL DEFAULT 'captured',
109
- meta_json TEXT,
110
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
111
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
112
- );
113
- CREATE INDEX IF NOT EXISTS idx_media_occurred ON media_asset(occurred_at DESC);
114
- CREATE INDEX IF NOT EXISTS idx_media_project ON media_asset(project, occurred_at DESC);
115
- CREATE INDEX IF NOT EXISTS idx_media_kind ON media_asset(media_kind, occurred_at DESC);
116
- CREATE INDEX IF NOT EXISTS idx_media_thread ON media_asset(thread_id, occurred_at DESC);
117
-
118
- CREATE TABLE IF NOT EXISTS access_inventory (
119
- id INTEGER PRIMARY KEY AUTOINCREMENT,
120
- scope TEXT NOT NULL DEFAULT 'default',
121
- project TEXT,
122
- system_name TEXT NOT NULL,
123
- access_kind TEXT NOT NULL,
124
- entrypoint TEXT,
125
- account_hint TEXT,
126
- secret_ref TEXT,
127
- allowed_agents TEXT,
128
- status TEXT NOT NULL DEFAULT 'active',
129
- route_kind TEXT NOT NULL DEFAULT 'direct',
130
- direct_allowed INTEGER NOT NULL DEFAULT 1,
131
- jump_host TEXT,
132
- jump_user TEXT,
133
- jump_secret_ref TEXT,
134
- proxy_command TEXT,
135
- canonical_command TEXT,
136
- route_steps_json TEXT,
137
- preflight_required INTEGER NOT NULL DEFAULT 1,
138
- last_route_check_at TEXT,
139
- last_verified_at TEXT,
140
- verification_method TEXT,
141
- notes TEXT,
142
- updated_by TEXT,
143
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
144
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
145
- UNIQUE(scope, system_name, access_kind, entrypoint)
146
- );
147
- CREATE INDEX IF NOT EXISTS idx_access_project ON access_inventory(project, status);
148
- CREATE INDEX IF NOT EXISTS idx_access_system ON access_inventory(system_name, access_kind);
149
- CREATE INDEX IF NOT EXISTS idx_access_status ON access_inventory(status, updated_at DESC);
150
-
151
- CREATE TABLE IF NOT EXISTS access_event (
152
- id INTEGER PRIMARY KEY AUTOINCREMENT,
153
- access_id INTEGER REFERENCES access_inventory(id) ON DELETE SET NULL,
154
- event_kind TEXT NOT NULL,
155
- actor TEXT,
156
- status TEXT,
157
- notes TEXT,
158
- meta_json TEXT,
159
- occurred_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
160
- );
161
- CREATE INDEX IF NOT EXISTS idx_access_event_access ON access_event(access_id, occurred_at DESC);
162
- CREATE INDEX IF NOT EXISTS idx_access_event_actor ON access_event(actor, occurred_at DESC);
163
-
164
- CREATE TABLE IF NOT EXISTS connector_registry (
165
- id INTEGER PRIMARY KEY AUTOINCREMENT,
166
- scope TEXT NOT NULL DEFAULT 'default',
167
- project TEXT,
168
- system_name TEXT NOT NULL,
169
- owner_agent TEXT,
170
- auth_type TEXT,
171
- secret_ref TEXT,
172
- rate_limit TEXT,
173
- allowed_agents_json TEXT,
174
- read_enabled INTEGER NOT NULL DEFAULT 1,
175
- write_enabled INTEGER NOT NULL DEFAULT 0,
176
- live_write_enabled INTEGER NOT NULL DEFAULT 0,
177
- lifecycle_status TEXT NOT NULL DEFAULT 'planned',
178
- approval_class TEXT NOT NULL DEFAULT 'normal_fix',
179
- endpoint TEXT,
180
- health_status TEXT NOT NULL DEFAULT 'unknown',
181
- health_summary TEXT,
182
- last_health_at TEXT,
183
- last_verified_at TEXT,
184
- runbook_json TEXT,
185
- dependency_json TEXT,
186
- rollback_json TEXT,
187
- notes TEXT,
188
- meta_json TEXT,
189
- updated_by TEXT,
190
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
191
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
192
- UNIQUE(scope, system_name)
193
- );
194
- CREATE INDEX IF NOT EXISTS idx_connector_project ON connector_registry(project, lifecycle_status);
195
- CREATE INDEX IF NOT EXISTS idx_connector_owner ON connector_registry(owner_agent, lifecycle_status);
196
- CREATE INDEX IF NOT EXISTS idx_connector_health ON connector_registry(health_status, last_health_at DESC);
197
-
198
- CREATE TABLE IF NOT EXISTS agent_passport (
199
- agent_name TEXT PRIMARY KEY,
200
- display_name TEXT,
201
- department_name TEXT,
202
- lane TEXT,
203
- allowed_projects_json TEXT,
204
- allowed_systems_json TEXT,
205
- allowed_environments_json TEXT,
206
- capability_matrix_json TEXT,
207
- live_write INTEGER NOT NULL DEFAULT 0,
208
- review_required INTEGER NOT NULL DEFAULT 1,
209
- needs_handoff INTEGER NOT NULL DEFAULT 1,
210
- can_deploy INTEGER NOT NULL DEFAULT 0,
211
- can_touch_auth INTEGER NOT NULL DEFAULT 0,
212
- can_touch_billing INTEGER NOT NULL DEFAULT 0,
213
- can_manage_production INTEGER NOT NULL DEFAULT 0,
214
- approval_class TEXT NOT NULL DEFAULT 'read_only',
215
- source_kind TEXT NOT NULL DEFAULT 'manual',
216
- status TEXT NOT NULL DEFAULT 'active',
217
- meta_json TEXT,
218
- updated_by TEXT,
219
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
220
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
221
- );
222
- CREATE INDEX IF NOT EXISTS idx_passport_department ON agent_passport(department_name, status);
223
- CREATE INDEX IF NOT EXISTS idx_passport_lane ON agent_passport(lane, status);
224
-
225
- CREATE TABLE IF NOT EXISTS drift_check_result (
226
- id INTEGER PRIMARY KEY AUTOINCREMENT,
227
- scope TEXT NOT NULL DEFAULT 'default',
228
- project TEXT,
229
- system_name TEXT,
230
- drift_kind TEXT NOT NULL,
231
- severity TEXT NOT NULL DEFAULT 'M',
232
- status TEXT NOT NULL DEFAULT 'open',
233
- freshness_status TEXT NOT NULL DEFAULT 'fresh',
234
- expected TEXT,
235
- actual TEXT,
236
- details_json TEXT,
237
- source_ref TEXT,
238
- checked_by TEXT,
239
- checked_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
240
- );
241
- CREATE INDEX IF NOT EXISTS idx_drift_project_status ON drift_check_result(project, status, checked_at DESC);
242
- CREATE INDEX IF NOT EXISTS idx_drift_system_status ON drift_check_result(system_name, status, checked_at DESC);
243
- CREATE INDEX IF NOT EXISTS idx_drift_kind_status ON drift_check_result(drift_kind, status, checked_at DESC);
244
-
245
- CREATE TABLE IF NOT EXISTS maintenance_window (
246
- id INTEGER PRIMARY KEY AUTOINCREMENT,
247
- scope TEXT NOT NULL DEFAULT 'default',
248
- project TEXT,
249
- system_name TEXT,
250
- title TEXT NOT NULL,
251
- window_kind TEXT NOT NULL DEFAULT 'maintenance',
252
- risk_class TEXT NOT NULL DEFAULT 'normal_fix',
253
- starts_at TEXT NOT NULL,
254
- ends_at TEXT NOT NULL,
255
- status TEXT NOT NULL DEFAULT 'approved',
256
- notes TEXT,
257
- approved_by TEXT,
258
- updated_by TEXT,
259
- meta_json TEXT,
260
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
261
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
262
- );
263
- CREATE INDEX IF NOT EXISTS idx_maintenance_scope_time ON maintenance_window(scope, starts_at, ends_at);
264
- CREATE INDEX IF NOT EXISTS idx_maintenance_project_status ON maintenance_window(project, status, starts_at DESC);
265
-
266
- CREATE TABLE IF NOT EXISTS override_log (
267
- id INTEGER PRIMARY KEY AUTOINCREMENT,
268
- scope TEXT NOT NULL DEFAULT 'default',
269
- project TEXT,
270
- system_name TEXT,
271
- agent_name TEXT,
272
- gate_kind TEXT NOT NULL,
273
- reason TEXT NOT NULL,
274
- approved_by TEXT,
275
- starts_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
276
- expires_at TEXT,
277
- status TEXT NOT NULL DEFAULT 'active',
278
- notes TEXT,
279
- meta_json TEXT,
280
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
281
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
282
- );
283
- CREATE INDEX IF NOT EXISTS idx_override_scope_status ON override_log(scope, status, starts_at DESC);
284
- CREATE INDEX IF NOT EXISTS idx_override_project_gate ON override_log(project, gate_kind, status);
285
-
286
- CREATE TABLE IF NOT EXISTS artifact_lock (
287
- id INTEGER PRIMARY KEY AUTOINCREMENT,
288
- scope TEXT NOT NULL DEFAULT 'default',
289
- project TEXT,
290
- system_name TEXT,
291
- artifact_kind TEXT NOT NULL DEFAULT 'url',
292
- artifact_key TEXT NOT NULL,
293
- artifact_label TEXT,
294
- reason TEXT NOT NULL,
295
- status TEXT NOT NULL DEFAULT 'active',
296
- locked_by TEXT,
297
- approved_by TEXT,
298
- started_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
299
- expires_at TEXT,
300
- notes TEXT,
301
- meta_json TEXT,
302
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
303
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
304
- );
305
- CREATE INDEX IF NOT EXISTS idx_artifact_lock_scope_status ON artifact_lock(scope, status, started_at DESC);
306
- CREATE INDEX IF NOT EXISTS idx_artifact_lock_project_status ON artifact_lock(project, status, started_at DESC);
307
- CREATE INDEX IF NOT EXISTS idx_artifact_lock_key_status ON artifact_lock(artifact_kind, artifact_key, status);
308
-
309
- CREATE TABLE IF NOT EXISTS secret_rotation_log (
310
- id INTEGER PRIMARY KEY AUTOINCREMENT,
311
- scope TEXT NOT NULL DEFAULT 'default',
312
- system_name TEXT NOT NULL,
313
- secret_ref TEXT,
314
- project TEXT,
315
- rotated_by TEXT,
316
- verified_by TEXT,
317
- rotation_kind TEXT NOT NULL DEFAULT 'manual',
318
- status TEXT NOT NULL DEFAULT 'rotated',
319
- rotated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
320
- verified_at TEXT,
321
- notes TEXT,
322
- meta_json TEXT
323
- );
324
- CREATE INDEX IF NOT EXISTS idx_secret_rotation_system ON secret_rotation_log(system_name, rotated_at DESC);
325
- CREATE INDEX IF NOT EXISTS idx_secret_rotation_secret_ref ON secret_rotation_log(secret_ref, rotated_at DESC);
326
-
327
- CREATE TABLE IF NOT EXISTS dependency_freeze (
328
- id INTEGER PRIMARY KEY AUTOINCREMENT,
329
- scope TEXT NOT NULL DEFAULT 'default',
330
- project TEXT,
331
- system_name TEXT,
332
- freeze_kind TEXT NOT NULL DEFAULT 'dependency_freeze',
333
- reason TEXT NOT NULL,
334
- started_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
335
- expires_at TEXT,
336
- status TEXT NOT NULL DEFAULT 'active',
337
- approved_by TEXT,
338
- updated_by TEXT,
339
- meta_json TEXT,
340
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
341
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
342
- );
343
- CREATE INDEX IF NOT EXISTS idx_dependency_freeze_scope_status ON dependency_freeze(scope, status, started_at DESC);
344
- CREATE INDEX IF NOT EXISTS idx_dependency_freeze_project ON dependency_freeze(project, status);
345
-
346
- CREATE TABLE IF NOT EXISTS ops_incident (
347
- id INTEGER PRIMARY KEY AUTOINCREMENT,
348
- scope TEXT NOT NULL DEFAULT 'default',
349
- project TEXT,
350
- system_name TEXT,
351
- title TEXT NOT NULL,
352
- severity TEXT NOT NULL DEFAULT 'M',
353
- status TEXT NOT NULL DEFAULT 'open',
354
- cause TEXT,
355
- fix_summary TEXT,
356
- prevention TEXT,
357
- source_agent TEXT,
358
- decision_id INTEGER,
359
- quality_finding_id INTEGER,
360
- scar_pattern_id INTEGER,
361
- evidence_json TEXT,
362
- meta_json TEXT,
363
- opened_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
364
- closed_at TEXT,
365
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
366
- );
367
- CREATE INDEX IF NOT EXISTS idx_ops_incident_project_status ON ops_incident(project, status, opened_at DESC);
368
- CREATE INDEX IF NOT EXISTS idx_ops_incident_system_status ON ops_incident(system_name, status, opened_at DESC);
369
-
370
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_access_ai AFTER INSERT ON access_inventory BEGIN
371
- INSERT INTO mnemo_event_journal
372
- (source, channel, direction, actor, event_kind, ref_kind, ref_id, status, content, payload_json, meta_json, occurred_at)
373
- VALUES
374
- ('access_inventory', NEW.project, 'internal', NEW.updated_by, 'access_inventory_insert', 'access_inventory', CAST(NEW.id AS TEXT), NEW.status, COALESCE(NEW.system_name, '') || ' ' || COALESCE(NEW.access_kind, '') || ' ' || COALESCE(NEW.entrypoint, ''), NULL, json_object('scope', NEW.scope, 'secret_ref', NEW.secret_ref, 'allowed_agents', NEW.allowed_agents), NEW.updated_at);
375
- END;
376
-
377
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_access_au AFTER UPDATE ON access_inventory BEGIN
378
- INSERT INTO mnemo_event_journal
379
- (source, channel, direction, actor, event_kind, ref_kind, ref_id, status, content, payload_json, meta_json, occurred_at)
380
- VALUES
381
- ('access_inventory', NEW.project, 'internal', NEW.updated_by, 'access_inventory_update', 'access_inventory', CAST(NEW.id AS TEXT), NEW.status, COALESCE(NEW.system_name, '') || ' ' || COALESCE(NEW.access_kind, '') || ' ' || COALESCE(NEW.entrypoint, ''), NULL, json_object('scope', NEW.scope, 'secret_ref', NEW.secret_ref, 'allowed_agents', NEW.allowed_agents), NEW.updated_at);
382
- END;
383
-
384
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_access_event_ai AFTER INSERT ON access_event BEGIN
385
- INSERT INTO mnemo_event_journal
386
- (source, direction, actor, event_kind, ref_kind, ref_id, status, content, payload_json, meta_json, occurred_at)
387
- VALUES
388
- ('access_event', 'internal', NEW.actor, 'access_event_insert', 'access_event', CAST(NEW.id AS TEXT), NEW.status, NEW.notes, NULL, NEW.meta_json, COALESCE(NEW.occurred_at, strftime('%Y-%m-%dT%H:%M:%fZ','now')));
389
- END;
390
-
391
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_connector_ai AFTER INSERT ON connector_registry BEGIN
392
- INSERT INTO mnemo_event_journal
393
- (source, channel, direction, actor, event_kind, ref_kind, ref_id, status, content, payload_json, meta_json, occurred_at)
394
- VALUES
395
- ('connector_registry', NEW.project, 'internal', NEW.updated_by, 'connector_insert', 'connector_registry', CAST(NEW.id AS TEXT), NEW.lifecycle_status, COALESCE(NEW.system_name, ''), NULL, json_object('scope', NEW.scope, 'approval_class', NEW.approval_class, 'owner_agent', NEW.owner_agent, 'health_status', NEW.health_status), NEW.updated_at);
396
- END;
397
-
398
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_connector_au AFTER UPDATE ON connector_registry BEGIN
399
- INSERT INTO mnemo_event_journal
400
- (source, channel, direction, actor, event_kind, ref_kind, ref_id, status, content, payload_json, meta_json, occurred_at)
401
- VALUES
402
- ('connector_registry', NEW.project, 'internal', NEW.updated_by, 'connector_update', 'connector_registry', CAST(NEW.id AS TEXT), NEW.lifecycle_status, COALESCE(NEW.system_name, ''), NULL, json_object('scope', NEW.scope, 'approval_class', NEW.approval_class, 'owner_agent', NEW.owner_agent, 'health_status', NEW.health_status), NEW.updated_at);
403
- END;
404
-
405
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_passport_ai AFTER INSERT ON agent_passport BEGIN
406
- INSERT INTO mnemo_event_journal
407
- (source, channel, direction, actor, event_kind, ref_kind, ref_id, status, content, payload_json, meta_json, occurred_at)
408
- VALUES
409
- ('agent_passport', NEW.department_name, 'internal', NEW.updated_by, 'agent_passport_insert', 'agent_passport', NEW.agent_name, NEW.status, COALESCE(NEW.lane, ''), NULL, json_object('approval_class', NEW.approval_class, 'live_write', NEW.live_write, 'can_deploy', NEW.can_deploy), NEW.updated_at);
410
- END;
411
-
412
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_passport_au AFTER UPDATE ON agent_passport BEGIN
413
- INSERT INTO mnemo_event_journal
414
- (source, channel, direction, actor, event_kind, ref_kind, ref_id, status, content, payload_json, meta_json, occurred_at)
415
- VALUES
416
- ('agent_passport', NEW.department_name, 'internal', NEW.updated_by, 'agent_passport_update', 'agent_passport', NEW.agent_name, NEW.status, COALESCE(NEW.lane, ''), NULL, json_object('approval_class', NEW.approval_class, 'live_write', NEW.live_write, 'can_deploy', NEW.can_deploy), NEW.updated_at);
417
- END;
418
-
419
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_drift_ai AFTER INSERT ON drift_check_result BEGIN
420
- INSERT INTO mnemo_event_journal
421
- (source, channel, direction, actor, event_kind, ref_kind, ref_id, status, content, payload_json, meta_json, occurred_at)
422
- VALUES
423
- ('drift_check', NEW.project, 'internal', NEW.checked_by, 'drift_check_insert', 'drift_check_result', CAST(NEW.id AS TEXT), NEW.status, COALESCE(NEW.drift_kind, '') || CASE WHEN NEW.system_name IS NULL THEN '' ELSE ' ' || NEW.system_name END, NULL, json_object('scope', NEW.scope, 'severity', NEW.severity, 'freshness_status', NEW.freshness_status), NEW.checked_at);
424
- END;
425
-
426
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_memory_ai AFTER INSERT ON memory BEGIN
427
- INSERT INTO mnemo_event_journal
428
- (source, channel, direction, actor, actor_id, event_kind, ref_kind, ref_id, thread_id, status, content, payload_json, meta_json, occurred_at)
429
- VALUES
430
- (COALESCE(NEW.source, 'memory'), NULL, 'internal', NEW.actor, NEW.actor_id, 'memory_insert', 'memory', CAST(NEW.id AS TEXT), NEW.source_ref, 'inserted', NEW.text, NULL, NEW.meta_json, COALESCE(NEW.occurred_at, strftime('%Y-%m-%dT%H:%M:%fZ','now')));
431
- END;
432
-
433
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_transcript_ai AFTER INSERT ON transcript BEGIN
434
- INSERT INTO mnemo_event_journal
435
- (source, channel, direction, actor, event_kind, ref_kind, ref_id, thread_id, status, content, payload_json, meta_json, occurred_at)
436
- VALUES
437
- (COALESCE(NEW.source, 'transcript'), NEW.channel, COALESCE(NEW.direction, 'internal'), NEW.speaker, 'transcript_insert', 'transcript', CAST(NEW.id AS TEXT), NEW.ref_id, 'inserted', NEW.content, NULL, NEW.meta_json, COALESCE(NEW.occurred_at, strftime('%Y-%m-%dT%H:%M:%fZ','now')));
438
- END;
439
-
440
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_brief_ai AFTER INSERT ON agent_brief BEGIN
441
- INSERT INTO mnemo_event_journal
442
- (source, channel, direction, actor, event_kind, ref_kind, ref_id, status, content, payload_json, meta_json, occurred_at)
443
- VALUES
444
- ('agent_brief', NEW.channel, 'internal', NEW.source_agent, 'brief_insert', 'agent_brief', CAST(NEW.id AS TEXT), NEW.status, NEW.content, NULL, NEW.meta_json, COALESCE(NEW.created_at, strftime('%Y-%m-%dT%H:%M:%fZ','now')));
445
- END;
446
-
447
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_brief_au AFTER UPDATE ON agent_brief BEGIN
448
- INSERT INTO mnemo_event_journal
449
- (source, channel, direction, actor, event_kind, ref_kind, ref_id, status, content, payload_json, meta_json, occurred_at)
450
- VALUES
451
- ('agent_brief', NEW.channel, 'internal', NEW.source_agent, 'brief_update', 'agent_brief', CAST(NEW.id AS TEXT), NEW.status, COALESCE(NEW.outcome, 'status=' || COALESCE(NEW.status, 'unknown')), NULL, NEW.meta_json, strftime('%Y-%m-%dT%H:%M:%fZ','now'));
452
- END;
453
-
454
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_action_ai AFTER INSERT ON agent_action BEGIN
455
- INSERT INTO mnemo_event_journal
456
- (source, channel, direction, actor, event_kind, ref_kind, ref_id, thread_id, status, content, payload_json, meta_json, occurred_at)
457
- VALUES
458
- ('agent_action', NEW.topic, 'internal', NEW.agent_name, 'action_insert', 'agent_action', CAST(NEW.id AS TEXT), NEW.session_id, NEW.status, COALESCE(NEW.action_kind, '') || CASE WHEN NEW.target IS NULL THEN '' ELSE ' ' || NEW.target END, NEW.payload_json, NEW.meta_json, COALESCE(NEW.started_at, strftime('%Y-%m-%dT%H:%M:%fZ','now')));
459
- END;
460
-
461
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_action_au AFTER UPDATE ON agent_action BEGIN
462
- INSERT INTO mnemo_event_journal
463
- (source, channel, direction, actor, event_kind, ref_kind, ref_id, thread_id, status, content, payload_json, meta_json, occurred_at)
464
- VALUES
465
- ('agent_action', NEW.topic, 'internal', NEW.agent_name, 'action_update', 'agent_action', CAST(NEW.id AS TEXT), NEW.session_id, NEW.status, COALESCE(NEW.action_kind, '') || CASE WHEN NEW.target IS NULL THEN '' ELSE ' ' || NEW.target END, NEW.result_json, NEW.meta_json, strftime('%Y-%m-%dT%H:%M:%fZ','now'));
466
- END;
467
- `);
468
- }
469
-
470
- function ensureProjectRegistryTable(db) {
471
- try {
472
- db.exec("CREATE TABLE IF NOT EXISTS project_registry (name TEXT PRIMARY KEY, domain TEXT, repo TEXT, server TEXT, pm2_processes TEXT, nginx_files TEXT, admin_url TEXT, auth_system TEXT, stripe_account TEXT, stripe_product_ids TEXT, vat_status TEXT, vat_id TEXT, langs TEXT, live_status TEXT, live_url TEXT, staging_url TEXT, last_deploy_at TEXT, missing_blocks TEXT, health_checklist TEXT, notes TEXT, updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')), updated_by TEXT)");
473
- } catch {}
474
- }
475
-
476
- function ensureFirmOpsTables(db) {
477
- db.exec(`
478
- CREATE TABLE IF NOT EXISTS project_rules (
479
- project TEXT PRIMARY KEY,
480
- canonical_nav TEXT,
481
- allowed_domains TEXT,
482
- auth_matrix TEXT,
483
- language_matrix TEXT,
484
- pricing_rules TEXT,
485
- checkout_rules TEXT,
486
- vat_rules TEXT,
487
- deploy_rules TEXT,
488
- design_rules TEXT,
489
- required_gates TEXT,
490
- notes TEXT,
491
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
492
- updated_by TEXT
493
- );
494
- CREATE TABLE IF NOT EXISTS quality_finding (
495
- id INTEGER PRIMARY KEY AUTOINCREMENT,
496
- project TEXT NOT NULL,
497
- category TEXT NOT NULL,
498
- severity TEXT NOT NULL DEFAULT 'M',
499
- title TEXT NOT NULL,
500
- url TEXT,
501
- expected TEXT,
502
- actual TEXT,
503
- status TEXT NOT NULL DEFAULT 'open',
504
- source_agent TEXT,
505
- evidence_json TEXT,
506
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
507
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
508
- resolved_at TEXT,
509
- resolved_by TEXT,
510
- fix_summary TEXT
511
- );
512
- CREATE INDEX IF NOT EXISTS idx_quality_project_status ON quality_finding(project, status, severity);
513
- CREATE INDEX IF NOT EXISTS idx_quality_category ON quality_finding(category, status);
514
- CREATE TABLE IF NOT EXISTS session_handoff (
515
- id INTEGER PRIMARY KEY AUTOINCREMENT,
516
- agent_name TEXT NOT NULL,
517
- project TEXT,
518
- summary TEXT NOT NULL,
519
- changed_files TEXT,
520
- tests TEXT,
521
- deploys TEXT,
522
- blockers TEXT,
523
- next_actions TEXT,
524
- claims_released TEXT,
525
- meta_json TEXT,
526
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
527
- );
528
- CREATE INDEX IF NOT EXISTS idx_handoff_agent_project ON session_handoff(agent_name, project, created_at DESC);
529
- `);
530
- try {
531
- const accessCols = db.prepare("PRAGMA table_info(access_inventory)").all().map((c) => c.name);
532
- const accessAdds = [
533
- ["route_kind", "TEXT NOT NULL DEFAULT 'direct'"],
534
- ["direct_allowed", "INTEGER NOT NULL DEFAULT 1"],
535
- ["jump_host", "TEXT"],
536
- ["jump_user", "TEXT"],
537
- ["jump_secret_ref", "TEXT"],
538
- ["proxy_command", "TEXT"],
539
- ["canonical_command", "TEXT"],
540
- ["route_steps_json", "TEXT"],
541
- ["preflight_required", "INTEGER NOT NULL DEFAULT 1"],
542
- ["last_route_check_at", "TEXT"],
543
- ];
544
- for (const [name, ddl] of accessAdds) {
545
- if (!accessCols.includes(name)) db.exec(`ALTER TABLE access_inventory ADD COLUMN ${name} ${ddl}`);
546
- }
547
- db.exec("CREATE INDEX IF NOT EXISTS idx_access_route_kind ON access_inventory(route_kind, direct_allowed, status)");
548
- } catch {}
549
- try {
550
- const mediaCols = db.prepare("PRAGMA table_info(media_asset)").all().map((c) => c.name);
551
- if (!mediaCols.includes("original_file_name")) db.exec("ALTER TABLE media_asset ADD COLUMN original_file_name TEXT");
552
- if (!mediaCols.includes("canonical_name")) db.exec("ALTER TABLE media_asset ADD COLUMN canonical_name TEXT");
553
- if (!mediaCols.includes("storage_path")) db.exec("ALTER TABLE media_asset ADD COLUMN storage_path TEXT");
554
- if (!mediaCols.includes("content_ref")) db.exec("ALTER TABLE media_asset ADD COLUMN content_ref TEXT");
555
- db.exec("CREATE INDEX IF NOT EXISTS idx_media_canonical ON media_asset(canonical_name)");
556
- } catch {}
557
- ensureTeamQualityTables(db);
558
- ensureRuntimeGovernanceSchema(db);
559
- }
560
-
561
- module.exports = { ensureUniversalJournalSchema, ensureProjectRegistryTable, ensureFirmOpsTables };