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
package/mnemo/sandbox.js DELETED
@@ -1,143 +0,0 @@
1
- "use strict";
2
- /**
3
- * sandbox.js — execute a skill in an isolated environment.
4
- *
5
- * Reads `needs_sandbox` (or the older `sandbox: docker`) field from a
6
- * SKILL.md frontmatter. Three execution modes:
7
- *
8
- * none → run inline in the current Node process
9
- * docker → docker run --rm --network=none, read-only mount of the skill folder
10
- * browser_only → forward to the upcoming PC-Agent browser tool (Phase 2)
11
- *
12
- * For Phase 1 the docker path is the load-bearing one. The wrapper:
13
- * 1. Mounts the skill folder read-only at /skill
14
- * 2. Mounts a writable scratch dir at /work
15
- * 3. Drops network capability via --network=none
16
- * 4. Pipes input.json on stdin, captures output.json + stderr
17
- * 5. Enforces a wall-clock timeout (default 60s)
18
- *
19
- * Image: node:22-alpine by default. Override via SKILL.md `runtime` field
20
- * or env MNEMO_SANDBOX_IMAGE.
21
- */
22
-
23
- const { spawn } = require("child_process");
24
- const fs = require("fs");
25
- const path = require("path");
26
- const os = require("os");
27
-
28
- const DEFAULT_IMAGE = process.env.MNEMO_SANDBOX_IMAGE || "node:22-alpine";
29
- const DEFAULT_TIMEOUT_SEC = 60;
30
- const SKILLS_DIR = process.env.MNEMO_SKILLS || path.join(__dirname, "skills");
31
-
32
- function parseFrontmatter(md) {
33
- const m = md.match(/^---\s*\n([\s\S]*?)\n---/);
34
- if (!m) return {};
35
- const out = {};
36
- for (const line of m[1].split("\n")) {
37
- const kv = line.match(/^\s*([a-z_]+):\s*(.*)$/i);
38
- if (!kv) continue;
39
- out[kv[1]] = kv[2].replace(/^['"]|['"]$/g, "").trim();
40
- }
41
- return out;
42
- }
43
-
44
- function loadSkill(name) {
45
- const dir = path.join(SKILLS_DIR, name);
46
- const skillFile = path.join(dir, "SKILL.md");
47
- if (!fs.existsSync(skillFile)) throw new Error(`skill '${name}' not found at ${skillFile}`);
48
- const md = fs.readFileSync(skillFile, "utf8");
49
- const fm = parseFrontmatter(md);
50
- return { name, dir, frontmatter: fm, raw: md };
51
- }
52
-
53
- function runInline(skill, input) {
54
- const runFile = path.join(skill.dir, "run.js");
55
- if (!fs.existsSync(runFile)) {
56
- return Promise.resolve({ ok: false, error: "no run.js for inline execution; skill is descriptive-only" });
57
- }
58
- return new Promise((resolve) => {
59
- const proc = spawn(process.execPath, [runFile], { stdio: ["pipe", "pipe", "pipe"] });
60
- let out = "", err = "";
61
- proc.stdout.on("data", d => out += d);
62
- proc.stderr.on("data", d => err += d);
63
- proc.on("close", code => {
64
- let parsed;
65
- try { parsed = JSON.parse(out); } catch { parsed = { raw: out }; }
66
- resolve({ ok: code === 0, exit: code, output: parsed, stderr: err.slice(0, 4000) });
67
- });
68
- proc.stdin.write(JSON.stringify(input || {}));
69
- proc.stdin.end();
70
- });
71
- }
72
-
73
- function runDocker(skill, input, opts = {}) {
74
- const image = skill.frontmatter.runtime || DEFAULT_IMAGE;
75
- const timeout = opts.timeout_sec || DEFAULT_TIMEOUT_SEC;
76
- const work = fs.mkdtempSync(path.join(os.tmpdir(), "mnemo-sandbox-"));
77
-
78
- return new Promise((resolve) => {
79
- const args = [
80
- "run", "--rm",
81
- "--network=none",
82
- "--memory=512m",
83
- "--cpus=1",
84
- "-v", `${skill.dir}:/skill:ro`,
85
- "-v", `${work}:/work`,
86
- "-w", "/work",
87
- "-i",
88
- image,
89
- "node", "/skill/run.js",
90
- ];
91
- const proc = spawn("docker", args, { stdio: ["pipe", "pipe", "pipe"] });
92
- let out = "", err = "";
93
- let killed = false;
94
- const t = setTimeout(() => { killed = true; proc.kill("SIGKILL"); }, timeout * 1000);
95
-
96
- proc.stdout.on("data", d => out += d);
97
- proc.stderr.on("data", d => err += d);
98
- proc.on("close", code => {
99
- clearTimeout(t);
100
- let parsed;
101
- try { parsed = JSON.parse(out); } catch { parsed = { raw: out }; }
102
- try { fs.rmSync(work, { recursive: true, force: true }); } catch {}
103
- if (killed) return resolve({ ok: false, error: "timeout", timeout_sec: timeout, stderr: err.slice(0, 4000) });
104
- resolve({ ok: code === 0, exit: code, output: parsed, stderr: err.slice(0, 4000), work_dir_cleaned: true });
105
- });
106
- proc.on("error", e => {
107
- clearTimeout(t);
108
- if (e.code === "ENOENT") return resolve({ ok: false, error: "docker not installed; install docker or set sandbox: none in SKILL.md", detail: e.message });
109
- resolve({ ok: false, error: String(e.message) });
110
- });
111
- proc.stdin.write(JSON.stringify(input || {}));
112
- proc.stdin.end();
113
- });
114
- }
115
-
116
- async function runSkill(name, input = {}, opts = {}) {
117
- const skill = loadSkill(name);
118
- const sandbox = (skill.frontmatter.needs_sandbox || skill.frontmatter.sandbox || "none").toLowerCase();
119
- switch (sandbox) {
120
- case "true": case "docker": return runDocker(skill, input, opts);
121
- case "browser_only": return { ok: false, error: "browser_only sandbox not yet supported (Phase 2 PC-Agent dependency)" };
122
- case "false": case "none": case "": return runInline(skill, input);
123
- default: return { ok: false, error: `unknown sandbox value '${sandbox}' in ${name}/SKILL.md` };
124
- }
125
- }
126
-
127
- if (require.main === module) {
128
- const [, , name, ...rest] = process.argv;
129
- if (!name) {
130
- console.error("usage: sandbox.js <skill_name> [json_input]");
131
- process.exit(2);
132
- }
133
- let input = {};
134
- if (rest.length) {
135
- try { input = JSON.parse(rest.join(" ")); } catch { console.error("input is not valid JSON"); process.exit(2); }
136
- }
137
- runSkill(name, input).then(r => {
138
- console.log(JSON.stringify(r, null, 2));
139
- process.exit(r.ok ? 0 : 1);
140
- });
141
- }
142
-
143
- module.exports = { runSkill, loadSkill };
package/mnemo/schema.sql DELETED
@@ -1,389 +0,0 @@
1
- -- Mnemo - Persistent Memory MCP
2
- -- SQLite schema with FTS5 + sqlite-vec for embeddings
3
- -- All write paths converge here. Single source of truth.
4
-
5
- PRAGMA journal_mode = WAL;
6
- PRAGMA foreign_keys = ON;
7
- PRAGMA synchronous = NORMAL;
8
-
9
- -- =========================================================================
10
- -- Core: every piece of memory is a "memory" row, polymorphic by `kind`.
11
- -- =========================================================================
12
- CREATE TABLE IF NOT EXISTS memory (
13
- id INTEGER PRIMARY KEY AUTOINCREMENT,
14
- kind TEXT NOT NULL, -- message | edit | tool_call | scar | decision | dream | memory_md | web_fetch | ssh_cmd | manual
15
- source TEXT NOT NULL, -- telegram | terminal | session_jsonl | hook | manual | hermes | scraper
16
- source_ref TEXT, -- session_id, telegram message_id, file path, etc.
17
- occurred_at TEXT NOT NULL, -- ISO8601 UTC timestamp
18
- ingested_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
19
- actor TEXT, -- "owner" | "agent" | "system" | tool name | agent name
20
- actor_id TEXT, -- telegram user_id, session id, etc.
21
- topic TEXT, -- optional clustering key (e.g. "project-a", "billing")
22
- importance INTEGER NOT NULL DEFAULT 5, -- 0=ephemeral 5=normal 9=must-remember 10=foundational
23
- text TEXT NOT NULL, -- canonical content (markdown/plain)
24
- meta_json TEXT, -- arbitrary JSON: original payload, file path, diff hash, etc.
25
- hash TEXT, -- sha256 of (kind|source_ref|occurred_at|text) for dedup
26
- embedding_id INTEGER, -- foreign key into memory_embedding when computed
27
- UNIQUE(hash)
28
- );
29
-
30
- CREATE INDEX IF NOT EXISTS idx_memory_kind ON memory(kind);
31
- CREATE INDEX IF NOT EXISTS idx_memory_source ON memory(source);
32
- CREATE INDEX IF NOT EXISTS idx_memory_occurred ON memory(occurred_at);
33
- CREATE INDEX IF NOT EXISTS idx_memory_actor ON memory(actor);
34
- CREATE INDEX IF NOT EXISTS idx_memory_topic ON memory(topic);
35
- CREATE INDEX IF NOT EXISTS idx_memory_importance ON memory(importance);
36
-
37
- -- =========================================================================
38
- -- FTS5 virtual table for full-text search (BM25 ranking)
39
- -- =========================================================================
40
- CREATE VIRTUAL TABLE IF NOT EXISTS memory_fts USING fts5(
41
- text,
42
- topic,
43
- actor,
44
- kind UNINDEXED,
45
- content='memory',
46
- content_rowid='id',
47
- tokenize="porter unicode61 remove_diacritics 2"
48
- );
49
-
50
- CREATE TRIGGER IF NOT EXISTS memory_ai AFTER INSERT ON memory BEGIN
51
- INSERT INTO memory_fts(rowid, text, topic, actor, kind)
52
- VALUES (new.id, new.text, COALESCE(new.topic,''), COALESCE(new.actor,''), new.kind);
53
- END;
54
- CREATE TRIGGER IF NOT EXISTS memory_ad AFTER DELETE ON memory BEGIN
55
- INSERT INTO memory_fts(memory_fts, rowid, text, topic, actor, kind)
56
- VALUES('delete', old.id, old.text, COALESCE(old.topic,''), COALESCE(old.actor,''), old.kind);
57
- END;
58
- CREATE TRIGGER IF NOT EXISTS memory_au AFTER UPDATE ON memory BEGIN
59
- INSERT INTO memory_fts(memory_fts, rowid, text, topic, actor, kind)
60
- VALUES('delete', old.id, old.text, COALESCE(old.topic,''), COALESCE(old.actor,''), old.kind);
61
- INSERT INTO memory_fts(rowid, text, topic, actor, kind)
62
- VALUES (new.id, new.text, COALESCE(new.topic,''), COALESCE(new.actor,''), new.kind);
63
- END;
64
-
65
- -- =========================================================================
66
- -- Embeddings (vector similarity). Loaded lazily — not all memory rows
67
- -- need embeddings. Use sqlite-vec extension at runtime.
68
- -- =========================================================================
69
- CREATE TABLE IF NOT EXISTS memory_embedding (
70
- id INTEGER PRIMARY KEY AUTOINCREMENT,
71
- memory_id INTEGER NOT NULL REFERENCES memory(id) ON DELETE CASCADE,
72
- model TEXT NOT NULL, -- e.g. "all-MiniLM-L6-v2", "text-embedding-3-small"
73
- dim INTEGER NOT NULL,
74
- vector BLOB NOT NULL, -- packed float32 vector
75
- computed_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
76
- );
77
- CREATE INDEX IF NOT EXISTS idx_emb_memory ON memory_embedding(memory_id);
78
- CREATE INDEX IF NOT EXISTS idx_emb_model ON memory_embedding(model);
79
-
80
- -- =========================================================================
81
- -- Knowledge graph: typed edges between memory rows
82
- -- =========================================================================
83
- CREATE TABLE IF NOT EXISTS memory_link (
84
- id INTEGER PRIMARY KEY AUTOINCREMENT,
85
- from_id INTEGER NOT NULL REFERENCES memory(id) ON DELETE CASCADE,
86
- to_id INTEGER NOT NULL REFERENCES memory(id) ON DELETE CASCADE,
87
- kind TEXT NOT NULL, -- replies_to | references | corrects | resolves | partOf | causedBy | similar
88
- weight REAL NOT NULL DEFAULT 1.0,
89
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
90
- UNIQUE(from_id, to_id, kind)
91
- );
92
- CREATE INDEX IF NOT EXISTS idx_link_from ON memory_link(from_id);
93
- CREATE INDEX IF NOT EXISTS idx_link_to ON memory_link(to_id);
94
-
95
- -- =========================================================================
96
- -- Health-monitor: which writers are alive?
97
- -- =========================================================================
98
- CREATE TABLE IF NOT EXISTS writer_health (
99
- writer TEXT PRIMARY KEY, -- "telegram-poller" | "session-jsonl-tail" | "memory-md-watcher" | etc.
100
- last_write_at TEXT, -- last successful insert from this source
101
- last_check_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
102
- rows_written INTEGER NOT NULL DEFAULT 0,
103
- status TEXT NOT NULL DEFAULT 'unknown',-- alive | stale | dead
104
- notes TEXT
105
- );
106
-
107
- -- =========================================================================
108
- -- Universal event journal: the append-only receipt layer.
109
- -- This is intentionally lower-level than memory/transcript/action. Every
110
- -- bridge, tool call, brief transition, action update, and raw channel event can
111
- -- leave a receipt here, even when it is too noisy to promote to semantic memory.
112
- -- =========================================================================
113
- CREATE TABLE IF NOT EXISTS mnemo_event_journal (
114
- id INTEGER PRIMARY KEY AUTOINCREMENT,
115
- source TEXT NOT NULL, -- http-tool | mcp-tool | telegram | trigger:agent_action | ...
116
- channel TEXT,
117
- direction TEXT NOT NULL DEFAULT 'internal', -- inbound | outbound | internal
118
- actor TEXT,
119
- actor_id TEXT,
120
- event_kind TEXT NOT NULL, -- tool_call | tool_result | brief_insert | message | ...
121
- ref_kind TEXT,
122
- ref_id TEXT,
123
- thread_id TEXT,
124
- status TEXT,
125
- content TEXT,
126
- payload_json TEXT,
127
- meta_json TEXT,
128
- occurred_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
129
- ingested_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
130
- );
131
-
132
- CREATE INDEX IF NOT EXISTS idx_event_journal_occurred ON mnemo_event_journal(occurred_at DESC);
133
- CREATE INDEX IF NOT EXISTS idx_event_journal_source_channel ON mnemo_event_journal(source, channel, occurred_at DESC);
134
- CREATE INDEX IF NOT EXISTS idx_event_journal_actor ON mnemo_event_journal(actor, occurred_at DESC);
135
- CREATE INDEX IF NOT EXISTS idx_event_journal_kind ON mnemo_event_journal(event_kind, occurred_at DESC);
136
- CREATE INDEX IF NOT EXISTS idx_event_journal_ref ON mnemo_event_journal(ref_kind, ref_id);
137
-
138
- -- =========================================================================
139
- -- Capture receipt ledger: idempotent front door for channel/session imports.
140
- -- Every source message gets a stable dedupe key. If a later importer sees the
141
- -- same source message again, transcript/memory promotion is skipped but the
142
- -- duplicate decision remains auditable in mnemo_event_journal.
143
- -- =========================================================================
144
- CREATE TABLE IF NOT EXISTS capture_receipt (
145
- dedupe_key TEXT PRIMARY KEY,
146
- source TEXT NOT NULL,
147
- channel TEXT,
148
- direction TEXT NOT NULL DEFAULT 'internal',
149
- actor TEXT,
150
- actor_id TEXT,
151
- event_kind TEXT NOT NULL,
152
- ref_kind TEXT,
153
- ref_id TEXT,
154
- thread_id TEXT,
155
- occurred_at TEXT NOT NULL,
156
- content_hash TEXT,
157
- content_preview TEXT,
158
- event_id INTEGER,
159
- transcript_id INTEGER,
160
- memory_id INTEGER,
161
- status TEXT NOT NULL DEFAULT 'captured',
162
- seen_count INTEGER NOT NULL DEFAULT 1,
163
- first_seen_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
164
- last_seen_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
165
- meta_json TEXT
166
- );
167
- CREATE INDEX IF NOT EXISTS idx_capture_source_channel ON capture_receipt(source, channel, occurred_at DESC);
168
- CREATE INDEX IF NOT EXISTS idx_capture_ref ON capture_receipt(ref_kind, ref_id);
169
- CREATE INDEX IF NOT EXISTS idx_capture_actor ON capture_receipt(actor, occurred_at DESC);
170
- CREATE INDEX IF NOT EXISTS idx_capture_status ON capture_receipt(status, last_seen_at DESC);
171
-
172
- -- =========================================================================
173
- -- Access inventory: how to reach systems without storing raw secrets.
174
- -- Store secret_ref/path/owner hints, not passwords or private keys.
175
- -- =========================================================================
176
- CREATE TABLE IF NOT EXISTS access_inventory (
177
- id INTEGER PRIMARY KEY AUTOINCREMENT,
178
- scope TEXT NOT NULL DEFAULT 'default',
179
- project TEXT,
180
- system_name TEXT NOT NULL,
181
- access_kind TEXT NOT NULL, -- ssh | admin | dashboard | repo | api | db | provider | other
182
- entrypoint TEXT, -- host/url/path/command hint
183
- account_hint TEXT,
184
- secret_ref TEXT, -- env name, vault path, key filename, password-manager label
185
- allowed_agents TEXT, -- JSON array or comma list
186
- status TEXT NOT NULL DEFAULT 'active',
187
- route_kind TEXT NOT NULL DEFAULT 'direct', -- direct | jump | proxy | vpn | tunnel | manual
188
- direct_allowed INTEGER NOT NULL DEFAULT 1,
189
- jump_host TEXT,
190
- jump_user TEXT,
191
- jump_secret_ref TEXT,
192
- proxy_command TEXT,
193
- canonical_command TEXT,
194
- route_steps_json TEXT,
195
- preflight_required INTEGER NOT NULL DEFAULT 1,
196
- last_route_check_at TEXT,
197
- last_verified_at TEXT,
198
- verification_method TEXT,
199
- notes TEXT,
200
- updated_by TEXT,
201
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
202
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
203
- UNIQUE(scope, system_name, access_kind, entrypoint)
204
- );
205
-
206
- CREATE INDEX IF NOT EXISTS idx_access_project ON access_inventory(project, status);
207
- CREATE INDEX IF NOT EXISTS idx_access_system ON access_inventory(system_name, access_kind);
208
- CREATE INDEX IF NOT EXISTS idx_access_status ON access_inventory(status, updated_at DESC);
209
-
210
- CREATE TABLE IF NOT EXISTS access_event (
211
- id INTEGER PRIMARY KEY AUTOINCREMENT,
212
- access_id INTEGER REFERENCES access_inventory(id) ON DELETE SET NULL,
213
- event_kind TEXT NOT NULL, -- created | updated | verified | failed | used | note
214
- actor TEXT,
215
- status TEXT,
216
- notes TEXT,
217
- meta_json TEXT,
218
- occurred_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
219
- );
220
-
221
- CREATE INDEX IF NOT EXISTS idx_access_event_access ON access_event(access_id, occurred_at DESC);
222
- CREATE INDEX IF NOT EXISTS idx_access_event_actor ON access_event(actor, occurred_at DESC);
223
-
224
- -- =========================================================================
225
- -- Agent mail: fixed ExampleCorp employee mailboxes for agents.
226
- -- Secrets are stored as references (env:/file:), not raw passwords.
227
- -- =========================================================================
228
- CREATE TABLE IF NOT EXISTS agent_mail_account (
229
- id INTEGER PRIMARY KEY AUTOINCREMENT,
230
- agent_name TEXT NOT NULL,
231
- employee_name TEXT,
232
- company_name TEXT NOT NULL DEFAULT 'ExampleCorp',
233
- employee_status TEXT NOT NULL DEFAULT 'active',
234
- department TEXT,
235
- role_title TEXT,
236
- email_address TEXT NOT NULL UNIQUE,
237
- inbound_enabled INTEGER NOT NULL DEFAULT 1,
238
- outbound_enabled INTEGER NOT NULL DEFAULT 1,
239
- imap_host TEXT,
240
- imap_port INTEGER,
241
- imap_secure INTEGER NOT NULL DEFAULT 1,
242
- imap_user_ref TEXT,
243
- imap_pass_ref TEXT,
244
- imap_mailbox TEXT NOT NULL DEFAULT 'INBOX',
245
- smtp_host TEXT,
246
- smtp_port INTEGER,
247
- smtp_secure INTEGER NOT NULL DEFAULT 1,
248
- smtp_user_ref TEXT,
249
- smtp_pass_ref TEXT,
250
- signature_text TEXT,
251
- handling_policy TEXT,
252
- send_policy TEXT NOT NULL DEFAULT 'agent_queue',
253
- status TEXT NOT NULL DEFAULT 'active',
254
- last_fetch_at TEXT,
255
- last_fetch_status TEXT,
256
- last_send_at TEXT,
257
- last_error TEXT,
258
- meta_json TEXT,
259
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
260
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
261
- );
262
-
263
- CREATE INDEX IF NOT EXISTS idx_agent_mail_account_agent ON agent_mail_account(agent_name, status);
264
- CREATE INDEX IF NOT EXISTS idx_agent_mail_account_email ON agent_mail_account(email_address);
265
-
266
- CREATE TABLE IF NOT EXISTS agent_mail_message (
267
- id INTEGER PRIMARY KEY AUTOINCREMENT,
268
- account_id INTEGER NOT NULL REFERENCES agent_mail_account(id) ON DELETE CASCADE,
269
- agent_name TEXT NOT NULL,
270
- direction TEXT NOT NULL,
271
- status TEXT NOT NULL DEFAULT 'new',
272
- provider_message_id TEXT,
273
- thread_key TEXT,
274
- from_addr TEXT,
275
- to_addr TEXT,
276
- cc_addr TEXT,
277
- bcc_addr TEXT,
278
- reply_to TEXT,
279
- subject TEXT,
280
- body_text TEXT,
281
- body_html TEXT,
282
- body_preview TEXT,
283
- received_at TEXT,
284
- queued_at TEXT,
285
- sent_at TEXT,
286
- processed_at TEXT,
287
- brief_id INTEGER,
288
- error TEXT,
289
- meta_json TEXT,
290
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
291
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
292
- UNIQUE(account_id, direction, provider_message_id)
293
- );
294
-
295
- CREATE INDEX IF NOT EXISTS idx_agent_mail_message_agent ON agent_mail_message(agent_name, direction, status, created_at DESC);
296
- CREATE INDEX IF NOT EXISTS idx_agent_mail_message_account ON agent_mail_message(account_id, direction, status, created_at DESC);
297
- CREATE INDEX IF NOT EXISTS idx_agent_mail_message_brief ON agent_mail_message(brief_id);
298
-
299
- -- Future-dated owner requests, appointments, and follow-up reminders.
300
- CREATE TABLE IF NOT EXISTS reminder (
301
- id INTEGER PRIMARY KEY AUTOINCREMENT,
302
- owner_name TEXT NOT NULL DEFAULT 'owner',
303
- agent_name TEXT,
304
- scope TEXT,
305
- title TEXT NOT NULL,
306
- details TEXT,
307
- due_at TEXT,
308
- due_text TEXT,
309
- due_precision TEXT,
310
- timezone TEXT,
311
- status TEXT NOT NULL DEFAULT 'open',
312
- source TEXT,
313
- source_ref TEXT,
314
- channel TEXT,
315
- actor TEXT,
316
- actor_id TEXT,
317
- created_by TEXT,
318
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
319
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
320
- completed_at TEXT,
321
- notified_at TEXT,
322
- notify_count INTEGER NOT NULL DEFAULT 0,
323
- dedupe_key TEXT UNIQUE,
324
- meta_json TEXT
325
- );
326
-
327
- CREATE INDEX IF NOT EXISTS idx_reminder_status_due ON reminder(status, due_at);
328
- CREATE INDEX IF NOT EXISTS idx_reminder_owner_due ON reminder(owner_name, due_at);
329
- CREATE INDEX IF NOT EXISTS idx_reminder_agent_due ON reminder(agent_name, due_at);
330
- CREATE INDEX IF NOT EXISTS idx_reminder_source_ref ON reminder(source, source_ref);
331
-
332
- -- Universal journal receipts for the base schema. Runtime services add the
333
- -- companion triggers for transcript, brief, and agent action tables.
334
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_memory_ai AFTER INSERT ON memory BEGIN
335
- INSERT INTO mnemo_event_journal
336
- (source, channel, direction, actor, actor_id, event_kind, ref_kind, ref_id, thread_id, status, content, payload_json, meta_json, occurred_at)
337
- VALUES
338
- (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')));
339
- END;
340
-
341
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_access_ai AFTER INSERT ON access_inventory BEGIN
342
- INSERT INTO mnemo_event_journal
343
- (source, channel, direction, actor, event_kind, ref_kind, ref_id, status, content, payload_json, meta_json, occurred_at)
344
- VALUES
345
- ('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);
346
- END;
347
-
348
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_access_au AFTER UPDATE ON access_inventory BEGIN
349
- INSERT INTO mnemo_event_journal
350
- (source, channel, direction, actor, event_kind, ref_kind, ref_id, status, content, payload_json, meta_json, occurred_at)
351
- VALUES
352
- ('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);
353
- END;
354
-
355
- CREATE TRIGGER IF NOT EXISTS mnemo_journal_access_event_ai AFTER INSERT ON access_event BEGIN
356
- INSERT INTO mnemo_event_journal
357
- (source, direction, actor, event_kind, ref_kind, ref_id, status, content, payload_json, meta_json, occurred_at)
358
- VALUES
359
- ('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')));
360
- END;
361
-
362
- -- =========================================================================
363
- -- Session log (agent sessions, threads, agents)
364
- -- =========================================================================
365
- CREATE TABLE IF NOT EXISTS session (
366
- id TEXT PRIMARY KEY, -- session uuid
367
- started_at TEXT NOT NULL,
368
- ended_at TEXT,
369
- jsonl_path TEXT,
370
- agent TEXT, -- "agent" | "ops_bot" | "coder" | etc.
371
- message_count INTEGER NOT NULL DEFAULT 0,
372
- meta_json TEXT
373
- );
374
-
375
- -- =========================================================================
376
- -- Backfill ledger (so we never re-import same source twice)
377
- -- =========================================================================
378
- CREATE TABLE IF NOT EXISTS backfill_run (
379
- id INTEGER PRIMARY KEY AUTOINCREMENT,
380
- source_path TEXT NOT NULL,
381
- source_kind TEXT NOT NULL, -- chat_json | stream_jsonl | session_jsonl | memory_md | telegram_export
382
- rows_added INTEGER NOT NULL DEFAULT 0,
383
- rows_skipped INTEGER NOT NULL DEFAULT 0,
384
- started_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
385
- finished_at TEXT,
386
- status TEXT NOT NULL DEFAULT 'running', -- running | done | failed
387
- error TEXT,
388
- UNIQUE(source_path, source_kind)
389
- );