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.
- package/LIESMICH.txt +32 -13
- package/README.md +39 -20
- package/bin/blun.js +248 -160
- package/bin/core-bootstrap.js +47 -0
- package/bin/king.js +277 -1
- package/bin/launcher-mode.js +15 -3
- package/bin/launcher-runtime.js +293 -0
- package/bin/plugin-bootstrap.js +11 -4
- package/bin/private-paths.js +1577 -10
- package/bin/update-lease.js +399 -0
- package/bin/update-notice.js +1245 -0
- package/blun.mjs +26606 -25239
- package/dist-web/assets/{CodeBlockNode-Bsvp6ZEy.js → CodeBlockNode-CXnTLMNr.js} +1 -1
- 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
- package/dist-web/assets/{DesignSystemView-BmDDe28A.js → DesignSystemView-BbMOu-XO.js} +1 -1
- package/dist-web/assets/{Tooltip-nEEfaYVY.js → Tooltip-CFQEzqC-.js} +1 -1
- package/dist-web/assets/abnfDiagram-N423BO3Z-CsByy-GW.js +1 -0
- package/dist-web/assets/abnfDiagram-N423BO3Z-Z1APZG5m.js +1 -0
- package/dist-web/assets/arc-C-LXCaja.js +1 -0
- package/dist-web/assets/arc-C4VyWloT.js +1 -0
- package/dist-web/assets/architectureDiagram-T3A2C74G-DZq4L18e.js +36 -0
- package/dist-web/assets/architectureDiagram-T3A2C74G-DpddbUcM.js +36 -0
- package/dist-web/assets/blockDiagram-VBNYF7ZC-BV4sIf98.js +132 -0
- package/dist-web/assets/blockDiagram-VBNYF7ZC-BqccOSMr.js +132 -0
- package/dist-web/assets/{c4Diagram-AAUBKEIU-DtzacMnD.js → c4Diagram-5PPSVZJV-0MRkZlgP.js} +1 -1
- package/dist-web/assets/{c4Diagram-AAUBKEIU-D1VdMx8d.js → c4Diagram-5PPSVZJV-OHAcJrTy.js} +1 -1
- package/dist-web/assets/channel-B2VOQOI-.js +1 -0
- package/dist-web/assets/channel-DKjwM05G.js +1 -0
- package/dist-web/assets/{chunk-ND2GUHAM-DJoY9wNJ.js → chunk-2GRJ4B5K-DqJHs8Fw.js} +1 -1
- package/dist-web/assets/{chunk-ND2GUHAM-C4-rwdcv.js → chunk-2GRJ4B5K-oO6nqeLA.js} +1 -1
- package/dist-web/assets/{chunk-QZHKN3VN-C7YGaShq.js → chunk-2Q5K7J3B-B1nCd91o.js} +1 -1
- package/dist-web/assets/{chunk-QZHKN3VN-_Rz9_NuS.js → chunk-2Q5K7J3B-BC0Hsfqy.js} +1 -1
- package/dist-web/assets/chunk-5RXB4S5H-BfZa4yDH.js +231 -0
- package/dist-web/assets/chunk-5RXB4S5H-neG70kZx.js +231 -0
- package/dist-web/assets/{chunk-FMBD7UC4-DlLNDUx6.js → chunk-5VM5RSS4-l7biGqeH.js} +1 -1
- package/dist-web/assets/{chunk-FMBD7UC4-B2zs_Y-d.js → chunk-5VM5RSS4-u00AcpiJ.js} +1 -1
- package/dist-web/assets/chunk-6Q2QTUOP-BO-F11Gs.js +88 -0
- package/dist-web/assets/chunk-6Q2QTUOP-RUVRPBzG.js +88 -0
- package/dist-web/assets/{chunk-727SXJPM-Dn5wkDO_.js → chunk-GF5L2VYU-Ba-86KTd.js} +5 -5
- package/dist-web/assets/{chunk-727SXJPM-Dk2Xa3bA.js → chunk-GF5L2VYU-BtC69fw0.js} +5 -5
- package/dist-web/assets/{chunk-4BX2VUAB-DxZViaHS.js → chunk-JWPE2WC7-DIOubEqr.js} +1 -1
- package/dist-web/assets/{chunk-4BX2VUAB-WqrE2gaw.js → chunk-JWPE2WC7-u8Pcfhwh.js} +1 -1
- package/dist-web/assets/{chunk-2J33WTMH-Dm_s0_4f.js → chunk-KBJHAD2P-DDUeH_Ba.js} +1 -1
- package/dist-web/assets/{chunk-2J33WTMH-w4sdiKFO.js → chunk-KBJHAD2P-DS3BL64y.js} +1 -1
- package/dist-web/assets/chunk-RYQCIY6F-B9gFMVbS.js +1 -0
- package/dist-web/assets/chunk-RYQCIY6F-xg3EO0le.js +1 -0
- package/dist-web/assets/{chunk-55IACEB6-B5dE1-Um.js → chunk-XXDRQBXY-B60H0rRC.js} +1 -1
- package/dist-web/assets/{chunk-55IACEB6-B12zGIFz.js → chunk-XXDRQBXY-Bn1Xz6TQ.js} +1 -1
- package/dist-web/assets/classDiagram-JCYQIIEL-BA1TjAxj.js +1 -0
- package/dist-web/assets/classDiagram-JCYQIIEL-BNU7Qn4k.js +1 -0
- package/dist-web/assets/classDiagram-v2-OCEON4UE-BA1TjAxj.js +1 -0
- package/dist-web/assets/classDiagram-v2-OCEON4UE-BNU7Qn4k.js +1 -0
- package/dist-web/assets/{cose-bilkent-S5V4N54A-Bi19n8m-.js → cose-bilkent-JH36ORCC-4Ybddg08.js} +1 -1
- package/dist-web/assets/{cose-bilkent-S5V4N54A-c8o8NFp5.js → cose-bilkent-JH36ORCC-DqigO3T4.js} +1 -1
- package/dist-web/assets/cynefin-VYW2F7L2-C-EfYT07.js +178 -0
- package/dist-web/assets/cynefin-VYW2F7L2-rpD93tQ-.js +178 -0
- package/dist-web/assets/cynefinDiagram-MW4NZA55-DWZPLJcD.js +62 -0
- package/dist-web/assets/cynefinDiagram-MW4NZA55-DbTqnkVJ.js +62 -0
- package/dist-web/assets/dagre-VZM6K2ZE-DcM8aEVY.js +4 -0
- package/dist-web/assets/dagre-VZM6K2ZE-M_HVNtqP.js +4 -0
- package/dist-web/assets/diagram-7IWD3JNH-DoNximNF.js +30 -0
- package/dist-web/assets/diagram-7IWD3JNH-UymgsBNa.js +30 -0
- package/dist-web/assets/{diagram-KO2AKTUF-CFQs13i5.js → diagram-B4RE2ZJO-BVA2EhnC.js} +3 -3
- package/dist-web/assets/{diagram-KO2AKTUF-agFIuPJW.js → diagram-B4RE2ZJO-BiYu5WPF.js} +3 -3
- package/dist-web/assets/{diagram-LMA3HP47-TMIXizxR.js → diagram-LBJQPF4R-BD3kkgOO.js} +2 -2
- package/dist-web/assets/{diagram-LMA3HP47-He5zlyMt.js → diagram-LBJQPF4R-m3a1Euj3.js} +2 -2
- package/dist-web/assets/diagram-Q27KOJAE-D1mYQ_cI.js +24 -0
- package/dist-web/assets/diagram-Q27KOJAE-hy_T73PK.js +24 -0
- package/dist-web/assets/diagram-UB23O5K3-BWkoQZ4A.js +41 -0
- package/dist-web/assets/diagram-UB23O5K3-BtX8u6HG.js +41 -0
- package/dist-web/assets/ebnfDiagram-BXEA7PRR-BKs9JUHW.js +1 -0
- package/dist-web/assets/ebnfDiagram-BXEA7PRR-CBAnFkRF.js +1 -0
- package/dist-web/assets/erDiagram-JOGREHBK-3vKcWsxm.js +85 -0
- package/dist-web/assets/erDiagram-JOGREHBK-BIpd6dTf.js +85 -0
- package/dist-web/assets/flowDiagram-UKHOOZJN-D9wBbHm2.js +156 -0
- package/dist-web/assets/flowDiagram-UKHOOZJN-Z83i2UWI.js +156 -0
- package/dist-web/assets/ganttDiagram-PKOTCBZU-Cd_dViF-.js +292 -0
- package/dist-web/assets/ganttDiagram-PKOTCBZU-DFrb_S1d.js +292 -0
- package/dist-web/assets/{gitGraphDiagram-PVQCEYII-BSDFfwdY.js → gitGraphDiagram-DS77QQ5N-BiEEtTo7.js} +3 -3
- package/dist-web/assets/{gitGraphDiagram-PVQCEYII-DMbTATyw.js → gitGraphDiagram-DS77QQ5N-Dp3Ar-hi.js} +3 -3
- package/dist-web/assets/{graph-BwjfAU3j.js → graph-CAUpWmoK.js} +1 -1
- package/dist-web/assets/{graph--OzhPTMs.js → graph-DOmOIIwC.js} +1 -1
- package/dist-web/assets/{index-W6VnSrkB.js → index-Ba1OvLjf.js} +2 -2
- package/dist-web/assets/{index-CkVgGDpx.js → index-CiPA8Kex.js} +4 -4
- package/dist-web/assets/{index-BzK4vJBu.js → index-DdEakFJM.js} +1 -1
- package/dist-web/assets/{index10-Czg_oF-W.js → index10-CNr4U-Nw.js} +1 -1
- package/dist-web/assets/{index11-BjzCZuCr.js → index11-Dto_yZNz.js} +1 -1
- package/dist-web/assets/{index5-DlVoNkCD.js → index5-B2PldaO2.js} +1 -1
- package/dist-web/assets/{index6-BxiXA2yo.js → index6-CBdZmmyx.js} +1 -1
- package/dist-web/assets/{index7-BPdza6d1.js → index7-Dz9oCsUF.js} +1 -1
- package/dist-web/assets/{index8-Q_XzGC1Z.js → index8-B6k25jtU.js} +2 -2
- package/dist-web/assets/{infoDiagram-5YYISTIA-2JF3XEdD.js → infoDiagram-6WML65LV-BSa2g04G.js} +1 -1
- package/dist-web/assets/{infoDiagram-5YYISTIA-UrQusrJq.js → infoDiagram-6WML65LV-D4ph2sIH.js} +1 -1
- package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-7RVUL-vB.js → ishikawaDiagram-WSZJBQD7-DjKjbMm9.js} +5 -5
- package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-C5OstRVV.js → ishikawaDiagram-WSZJBQD7-Hm36UOQe.js} +5 -5
- package/dist-web/assets/{journeyDiagram-JHISSGLW-B34fCMu9.js → journeyDiagram-NVQOT4AX-DttHDfPQ.js} +1 -1
- package/dist-web/assets/{journeyDiagram-JHISSGLW-yctdo4bX.js → journeyDiagram-NVQOT4AX-MvWWPNDV.js} +1 -1
- package/dist-web/assets/{kanban-definition-UN3LZRKU-BS4FBZsQ.js → kanban-definition-27J2QSJJ-C5gB-W0d.js} +7 -7
- package/dist-web/assets/{kanban-definition-UN3LZRKU-CxBCv27E.js → kanban-definition-27J2QSJJ-Cu-E_cXA.js} +5 -5
- package/dist-web/assets/layout-CvP6o9AK.js +1 -0
- package/dist-web/assets/layout-D-LzfAck.js +1 -0
- package/dist-web/assets/{linear-3mB6q2-g.js → linear-B3HWgQI2.js} +1 -1
- package/dist-web/assets/{linear-BKCnUo31.js → linear-BRGe4-d6.js} +1 -1
- package/dist-web/assets/map-CWKZqZjr.js +1 -0
- package/dist-web/assets/map-DxJ2ADlA.js +1 -0
- package/dist-web/assets/mermaid.core-D-9Sx1No.js +314 -0
- package/dist-web/assets/mermaidParser.worker-PTFfzpoB.js +318 -0
- package/dist-web/assets/{mindmap-definition-RKZ34NQL-BmJZpjh6.js → mindmap-definition-FAOFIHXS-C4vnms3i.js} +2 -2
- package/dist-web/assets/{mindmap-definition-RKZ34NQL-1mjWUcf6.js → mindmap-definition-FAOFIHXS-Cg_hoVIq.js} +1 -1
- package/dist-web/assets/pegDiagram-VL7TDLO6-B2fFEFUH.js +1 -0
- package/dist-web/assets/pegDiagram-VL7TDLO6-CSX9hitD.js +1 -0
- package/dist-web/assets/pieDiagram-7S7Q4E2Y-0L0mxahZ.js +39 -0
- package/dist-web/assets/pieDiagram-7S7Q4E2Y-C7T0Cmw1.js +39 -0
- package/dist-web/assets/{quadrantDiagram-W4KKPZXB-BmT_qM09.js → quadrantDiagram-CIZ2JOQS-BBy7w4kD.js} +3 -3
- package/dist-web/assets/{quadrantDiagram-W4KKPZXB-C0kPuyNP.js → quadrantDiagram-CIZ2JOQS-U483z0er.js} +3 -3
- package/dist-web/assets/railroadDiagram-AXF67PYL-D80a2_DJ.js +1 -0
- package/dist-web/assets/railroadDiagram-AXF67PYL-DX8y0MzW.js +1 -0
- package/dist-web/assets/{requirementDiagram-4Y6WPE33-C0YP_Amt.js → requirementDiagram-LRYGKXZP-CeyHfq8t.js} +3 -3
- package/dist-web/assets/{requirementDiagram-4Y6WPE33-CZrxH1Y2.js → requirementDiagram-LRYGKXZP-DGD5J_4k.js} +3 -3
- package/dist-web/assets/sankeyDiagram-W5VNT64P-CCISkkrR.js +40 -0
- package/dist-web/assets/sankeyDiagram-W5VNT64P-CT5PdZz2.js +40 -0
- package/dist-web/assets/sequenceDiagram-SI44F4Z6-BeMzHWXI.js +162 -0
- package/dist-web/assets/sequenceDiagram-SI44F4Z6-jQfm2XS7.js +162 -0
- package/dist-web/assets/sizeCapture-X5ZJPWSS-BQsTdtrv.js +1 -0
- package/dist-web/assets/sizeCapture-X5ZJPWSS-lRZsmCoS.js +1 -0
- package/dist-web/assets/stateDiagram-OKZ733FA-ClCgTdUm.js +1 -0
- package/dist-web/assets/stateDiagram-OKZ733FA-Cv59z5YT.js +1 -0
- package/dist-web/assets/stateDiagram-v2-UEYNNEHI-R8jTc--F.js +1 -0
- package/dist-web/assets/stateDiagram-v2-UEYNNEHI-fi_lrTAx.js +1 -0
- package/dist-web/assets/swimlanes-SLNWSIFB-BCdOUN05.js +2 -0
- package/dist-web/assets/swimlanes-SLNWSIFB-Cu5l7SuR.js +1 -0
- package/dist-web/assets/swimlanesDiagram-ULZ7WXOC-BUd_uYK3.js +8 -0
- package/dist-web/assets/swimlanesDiagram-ULZ7WXOC-CalrsgPK.js +8 -0
- package/dist-web/assets/{timeline-definition-PNZ67QCA-DsVZdrZa.js → timeline-definition-Z64GVDOM-CMjnh4bu.js} +4 -4
- package/dist-web/assets/{timeline-definition-PNZ67QCA-DnB6Usl0.js → timeline-definition-Z64GVDOM-DpWutSKa.js} +4 -4
- package/dist-web/assets/vennDiagram-T6HMQDX7-DKJW_8oU.js +34 -0
- package/dist-web/assets/vennDiagram-T6HMQDX7-DVC5JVsc.js +34 -0
- package/dist-web/assets/{vue.runtime.esm-bundler-pgHGheCW.js → vue.runtime.esm-bundler-BwwRtQwQ.js} +1 -1
- package/dist-web/assets/{wardleyDiagram-YWT4CUSO-oBauTCEw.js → wardleyDiagram-T6FBY63Y-BK2mrq7L.js} +3 -3
- package/dist-web/assets/{wardleyDiagram-YWT4CUSO-DCiyDQNB.js → wardleyDiagram-T6FBY63Y-oUvgepFn.js} +3 -3
- package/dist-web/assets/xychartDiagram-ELKLHX3M-DI6n79q0.js +7 -0
- package/dist-web/assets/xychartDiagram-ELKLHX3M-DUJu9F7-.js +7 -0
- package/dist-web/index.html +1 -1
- package/dist-web/vis/index.html.gz +0 -0
- package/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
- package/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
- package/package.json +9 -11
- package/skills/screenshot-lesen/SKILL.md +0 -1
- package/skills/web-lesen/SKILL.md +0 -1
- package/telegram-plugin/dist/bridge.mjs +7 -25
- package/telegram-plugin/dist/mcp-server.mjs +236 -71
- package/dist-web/assets/arc-4xPfymbf.js +0 -1
- package/dist-web/assets/arc-Doj0wRZ0.js +0 -1
- package/dist-web/assets/architectureDiagram-3BPJPVTR-BGih283a.js +0 -36
- package/dist-web/assets/architectureDiagram-3BPJPVTR-CQ09RrbH.js +0 -36
- package/dist-web/assets/blockDiagram-GPEHLZMM-3ShMf1gu.js +0 -132
- package/dist-web/assets/blockDiagram-GPEHLZMM-CAtDjkJt.js +0 -132
- package/dist-web/assets/channel-DNkUo9e6.js +0 -1
- package/dist-web/assets/channel-DcnUTIGB.js +0 -1
- package/dist-web/assets/chunk-AQP2D5EJ-FS8-f8lF.js +0 -231
- package/dist-web/assets/chunk-AQP2D5EJ-UKhb4V4r.js +0 -231
- package/dist-web/assets/classDiagram-4FO5ZUOK-B1ZO8EbE.js +0 -1
- package/dist-web/assets/classDiagram-4FO5ZUOK-xk6cM9Kq.js +0 -1
- package/dist-web/assets/classDiagram-v2-Q7XG4LA2-B1ZO8EbE.js +0 -1
- package/dist-web/assets/classDiagram-v2-Q7XG4LA2-xk6cM9Kq.js +0 -1
- package/dist-web/assets/dagre-BM42HDAG-CmUO9qKN.js +0 -4
- package/dist-web/assets/dagre-BM42HDAG-DLMfLCoV.js +0 -4
- package/dist-web/assets/diagram-2AECGRRQ-DQTst0OH.js +0 -43
- package/dist-web/assets/diagram-2AECGRRQ-L74iLMqd.js +0 -43
- package/dist-web/assets/diagram-5GNKFQAL-BiBm7CJR.js +0 -10
- package/dist-web/assets/diagram-5GNKFQAL-DoE6q7H1.js +0 -10
- package/dist-web/assets/diagram-OG6HWLK6-BHCt1E0n.js +0 -24
- package/dist-web/assets/diagram-OG6HWLK6-DRyxjFMa.js +0 -24
- package/dist-web/assets/erDiagram-TEJ5UH35-BoDczjGG.js +0 -85
- package/dist-web/assets/erDiagram-TEJ5UH35-yd6SOv_7.js +0 -85
- package/dist-web/assets/flowDiagram-I6XJVG4X-DHoceI7r.js +0 -162
- package/dist-web/assets/flowDiagram-I6XJVG4X-DkYNQv0R.js +0 -162
- package/dist-web/assets/ganttDiagram-6RSMTGT7-Cg1TQBc0.js +0 -292
- package/dist-web/assets/ganttDiagram-6RSMTGT7-Z6klo7KK.js +0 -292
- package/dist-web/assets/layout-C1ojF0zw.js +0 -1
- package/dist-web/assets/layout-SsrduOYp.js +0 -1
- package/dist-web/assets/mermaid.core-D_lKT0dR.js +0 -309
- package/dist-web/assets/mermaidParser.worker-Dx4jPi9z.js +0 -313
- package/dist-web/assets/pieDiagram-4H26LBE5-BU41t2A_.js +0 -30
- package/dist-web/assets/pieDiagram-4H26LBE5-BkwDAvbt.js +0 -30
- package/dist-web/assets/sankeyDiagram-5OEKKPKP-De_o7hDr.js +0 -40
- package/dist-web/assets/sankeyDiagram-5OEKKPKP-Dvuj6bMA.js +0 -40
- package/dist-web/assets/sequenceDiagram-3UESZ5HK-DuCrgPyA.js +0 -162
- package/dist-web/assets/sequenceDiagram-3UESZ5HK-VAxffBe7.js +0 -162
- package/dist-web/assets/stateDiagram-AJRCARHV-CYLupxM7.js +0 -1
- package/dist-web/assets/stateDiagram-AJRCARHV-nDExQydZ.js +0 -1
- package/dist-web/assets/stateDiagram-v2-BHNVJYJU-BhEc7Thx.js +0 -1
- package/dist-web/assets/stateDiagram-v2-BHNVJYJU-BzwD_BIl.js +0 -1
- package/dist-web/assets/vennDiagram-CIIHVFJN-BBHQmCFf.js +0 -34
- package/dist-web/assets/vennDiagram-CIIHVFJN-Cfj-K9NW.js +0 -34
- package/dist-web/assets/wardley-L42UT6IY-BJFn8eDD.js +0 -173
- package/dist-web/assets/wardley-L42UT6IY-BSu8-4hg.js +0 -173
- package/dist-web/assets/xychartDiagram-2RQKCTM6-C2iZpl9I.js +0 -7
- package/dist-web/assets/xychartDiagram-2RQKCTM6-Db_VoDBV.js +0 -7
- package/mnemo/access_routes.js +0 -692
- package/mnemo/agent_governance.js +0 -4242
- package/mnemo/agent_mail.js +0 -901
- package/mnemo/bootstrap_auto.js +0 -137
- package/mnemo/brief_coordination.js +0 -226
- package/mnemo/code_read_tools.js +0 -375
- package/mnemo/context_preview_tools.js +0 -603
- package/mnemo/embeddings.js +0 -66
- package/mnemo/external_repo_ops.js +0 -575
- package/mnemo/facts/example-project-rules.json +0 -90
- package/mnemo/facts/example.json +0 -34
- package/mnemo/identity_schema.sql +0 -139
- package/mnemo/journal_schema.js +0 -561
- package/mnemo/loop_doctor_tools.js +0 -661
- package/mnemo/mail_secret_refs.js +0 -150
- package/mnemo/mcp.js +0 -9309
- package/mnemo/memory_consolidation.js +0 -1914
- package/mnemo/memory_health_tools.js +0 -165
- package/mnemo/package.json +0 -79
- package/mnemo/protected_scope_gate.js +0 -627
- package/mnemo/resource_access_control.js +0 -684
- package/mnemo/runtime_governance.js +0 -1256
- package/mnemo/runtime_turn_gate.js +0 -862
- package/mnemo/sandbox.js +0 -143
- package/mnemo/schema.sql +0 -389
- package/mnemo/shared_utils.js +0 -763
- package/mnemo/skills/agent-auto-resume/SKILL.md +0 -56
- package/mnemo/skills/agent_hand/SKILL.md +0 -43
- package/mnemo/skills/agent_hand/run.js +0 -63
- package/mnemo/skills/book_flight/SKILL.md +0 -34
- package/mnemo/skills/external_repo_review/SKILL.md +0 -43
- package/mnemo/skills/external_repo_review/run.js +0 -73
- package/mnemo/skills/pay_invoice/SKILL.md +0 -34
- package/mnemo/team_quality_ops.js +0 -944
- package/mnemo/timeline_report_tools.js +0 -810
- package/mnemo/write_gate_risk.js +0 -80
- package/mnemo/writer_health.js +0 -152
- package/skills/doku-ingestion/SKILL.md +0 -48
- 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
|
-
);
|