ocean-brain 0.8.2 → 0.11.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/README.md +2 -0
- package/dist/mcp.js +103 -105
- package/package.json +3 -2
- package/server/client/dist/assets/{ArrowRight.es-g2YZTklZ.js → ArrowRight.es-BEhnlwfe.js} +1 -1
- package/server/client/dist/assets/AuxiliaryPanelHeader-B1k7pZpn.js +1 -0
- package/server/client/dist/assets/Calendar-D7QJsAlg.js +25 -0
- package/server/client/dist/assets/{Callout-B_IPSF_5.js → Callout-BTd1BYtV.js} +1 -1
- package/server/client/dist/assets/{Copy.es-CNxe4ujr.js → Copy.es-BoLjilxv.js} +1 -1
- package/server/client/dist/assets/File.es-Ct7fscBg.js +1 -0
- package/server/client/dist/assets/Graph-DYUb7gQb.js +46 -0
- package/server/client/dist/assets/{Graph-D9GeO71k.js → Graph-LY_IgMYy.js} +1 -1
- package/server/client/dist/assets/{Image.es-DnON8cv2.js → Image.es-OYyN3BYt.js} +1 -1
- package/server/client/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/server/client/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/server/client/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/server/client/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/server/client/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/server/client/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/server/client/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/server/client/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/server/client/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/server/client/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/server/client/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/server/client/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/server/client/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/server/client/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/server/client/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/server/client/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/server/client/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/server/client/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/server/client/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/server/client/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/server/client/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/server/client/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/server/client/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/server/client/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/server/client/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/server/client/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/server/client/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/server/client/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/server/client/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/server/client/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/server/client/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/server/client/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/server/client/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/server/client/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/server/client/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/server/client/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/server/client/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/server/client/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/server/client/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/server/client/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/server/client/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/server/client/dist/assets/Note-DsMhwrHw.js +25 -0
- package/server/client/dist/assets/NotePropertiesPanel-aCKXAe5F.js +2 -0
- package/server/client/dist/assets/PencilLine.es-0JpEgxFY.js +1 -0
- package/server/client/dist/assets/{Plus.es-CQ8wn2is.js → Plus.es-DRfLW_bI.js} +1 -1
- package/server/client/dist/assets/Reminders-COr1OHvF.js +1 -0
- package/server/client/dist/assets/Search-Ctkx0BQk.js +31 -0
- package/server/client/dist/assets/SurfaceCard-t7pdfhEe.js +1 -0
- package/server/client/dist/assets/Tag-BjxtrIQW.js +1 -0
- package/server/client/dist/assets/TagNotes-DV_fdRbg.js +1 -0
- package/server/client/dist/assets/{Trash.es-0aPpA-3S.js → Trash.es-Bo1VyK9Q.js} +1 -1
- package/server/client/dist/assets/ViewChip-DlCkL4z4.js +1 -0
- package/server/client/dist/assets/ViewNotes-wWWeFJyU.js +1 -0
- package/server/client/dist/assets/ViewSectionDialog-DhH8harC.js +102 -0
- package/server/client/dist/assets/Views-CWE99SnI.js +1 -0
- package/server/client/dist/assets/abnfDiagram-VRR7QNED-CWlV5dXw.js +1 -0
- package/server/client/dist/assets/app-B9WZRrAH.css +1 -0
- package/server/client/dist/assets/app-BpSMjzET.js +26 -0
- package/server/client/dist/assets/arc-BV-n6RUX.js +1 -0
- package/server/client/dist/assets/architectureDiagram-ZJ3FMSHR-CekzMXdu.js +36 -0
- package/server/client/dist/assets/blockDiagram-677ZJIJ3-B49yHoxq.js +132 -0
- package/server/client/dist/assets/c4Diagram-LMCZKHZV-0AfB9NBC.js +10 -0
- package/server/client/dist/assets/channel-CigOulR-.js +1 -0
- package/server/client/dist/assets/chunk-2Q5K7J3B-DaPQAU1q.js +1 -0
- package/server/client/dist/assets/chunk-32BRIVSS-CfL3kZAg.js +1 -0
- package/server/client/dist/assets/chunk-5VM5RSS4-DeOwWPE_.js +15 -0
- package/server/client/dist/assets/chunk-EX3LRPZG-C3W1oc9y.js +231 -0
- package/server/client/dist/assets/chunk-JWPE2WC7-_Oqh79OY.js +1 -0
- package/server/client/dist/assets/chunk-MOJQB5TN-DDKNNzI6.js +88 -0
- package/server/client/dist/assets/chunk-RYQCIY6F-DCHah7CC.js +1 -0
- package/server/client/dist/assets/chunk-V7JOEXUC-uUOIzgxj.js +206 -0
- package/server/client/dist/assets/chunk-VR4S4FIN-DDVw2WPs.js +1 -0
- package/server/client/dist/assets/chunk-XXDRQBXY-Coo4UFm2.js +1 -0
- package/server/client/dist/assets/classDiagram-OUVF2IWQ-D13ISIOW.js +1 -0
- package/server/client/dist/assets/classDiagram-v2-EOCWNBFH-D13ISIOW.js +1 -0
- package/server/client/dist/assets/colors-Cc3OSVma.js +1 -0
- package/server/client/dist/assets/cose-bilkent-JH36ORCC-C3pHmHpD.js +1 -0
- package/server/client/dist/assets/cynefin-VYW2F7L2-DU_G4Atc.js +166 -0
- package/server/client/dist/assets/cynefinDiagram-TSTJHNR4-DZ6iiJFo.js +62 -0
- package/server/client/dist/assets/cytoscape.esm-D3_iZ_3b.js +321 -0
- package/server/client/dist/assets/dagre-VKFMJZFB-DNELbhwC.js +4 -0
- package/server/client/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/server/client/dist/assets/diagram-FQU43EPY-CMEvZJ61.js +3 -0
- package/server/client/dist/assets/diagram-G47NLZAW-BYDtf6j9.js +24 -0
- package/server/client/dist/assets/diagram-NH7WQ7WH-CmXfcCQA.js +24 -0
- package/server/client/dist/assets/diagram-OA4YK3LP-BflTKJxU.js +30 -0
- package/server/client/dist/assets/diagram-WEI45ONY-KW3fKqna.js +41 -0
- package/server/client/dist/assets/ebnfDiagram-CCIWWBDH-CbyhY5Nj.js +1 -0
- package/server/client/dist/assets/erDiagram-Q63AITRT-CC2eZV8g.js +85 -0
- package/server/client/dist/assets/{floating-ui.react-dom-wWLZ1CdM.js → floating-ui.react-dom-BWTnA00G.js} +1 -1
- package/server/client/dist/assets/flowDiagram-23GEKE2U-unplo7Qm.js +156 -0
- package/server/client/dist/assets/ganttDiagram-NO4QXBWP-BcBK5HcZ.js +292 -0
- package/server/client/dist/assets/gitGraphDiagram-IHSO6WYX-DgVbbb5k.js +106 -0
- package/server/client/dist/assets/graph-C5DFNLrC.js +1 -0
- package/server/client/dist/assets/image-delete-confirmation-D7xrODQV.js +1 -0
- package/server/client/dist/assets/image.api-CyQisInP.js +17 -0
- package/server/client/dist/assets/index-B-E1Ilh9.js +1 -0
- package/server/client/dist/assets/infoDiagram-FWYZ7A6U-N_D9RdfG.js +2 -0
- package/server/client/dist/assets/init-Gi6I4Gst.js +1 -0
- package/server/client/dist/assets/isObject-U9U2HXiq.js +1 -0
- package/server/client/dist/assets/ishikawaDiagram-FXEZZL3T-BBKrzmB2.js +70 -0
- package/server/client/dist/assets/journeyDiagram-5HDEW3XC-NdCxLmQB.js +139 -0
- package/server/client/dist/assets/kanban-definition-HUTT4EX6-Ck7t4-tt.js +89 -0
- package/server/client/dist/assets/katex-DywYRkvg.css +1 -0
- package/server/client/dist/assets/katex-HP8lGamR.js +257 -0
- package/server/client/dist/assets/katex-x288kqHd.js +257 -0
- package/server/client/dist/assets/layout-Cz0MDlGi.js +1 -0
- package/server/client/dist/assets/linear-D6yRgDLq.js +1 -0
- package/server/client/dist/assets/manage-image-azmo5iVw.js +1 -0
- package/server/client/dist/assets/manage-image-detail-BF-uSqb_.js +1 -0
- package/server/client/dist/assets/map-Mm1V-_Na.js +1 -0
- package/server/client/dist/assets/{mcp-CT_9IV2c.js → mcp-CCaFd0zm.js} +4 -4
- package/server/client/dist/assets/{mcp-admin-adapter-xAuyZc_M.js → mcp-admin-adapter-PMmgPupc.js} +1 -1
- package/server/client/dist/assets/mermaid.core-B14ZAmWA.js +308 -0
- package/server/client/dist/assets/min-tv6RD-6E.js +1 -0
- package/server/client/dist/assets/mindmap-definition-LN4V7U3C-BTUqSdcP.js +96 -0
- package/server/client/dist/assets/{note-core-Buwzyxi7.js → note-core-DUTqUh5N.js} +2 -2
- package/server/client/dist/assets/{note-runtime-CPDVOFEo.js → note-runtime-zN5ddTba.js} +1 -1
- package/server/client/dist/assets/{note-ui-CHI-tzj-.js → note-ui-CtijppHK.js} +1 -1
- package/server/client/dist/assets/{note.api-D_00ZzJC.js → note.api-D3oJmG3q.js} +6 -6
- package/server/client/dist/assets/ordinal-Cboi1Yqb.js +1 -0
- package/server/client/dist/assets/pegDiagram-2B236MQR-Cjcu3mVz.js +1 -0
- package/server/client/dist/assets/pieDiagram-ENE6RG2P-BxI_c22Z.js +39 -0
- package/server/client/dist/assets/{placeholder-DbdGiYGL.js → placeholder-AusSo8p9.js} +4 -4
- package/server/client/dist/assets/properties-BrNJLkxR.js +1 -0
- package/server/client/dist/assets/quadrantDiagram-ABIIQ3AL-DGm0a-yR.js +7 -0
- package/server/client/dist/assets/railroadDiagram-RFXS5EU6-DmCDu89O.js +1 -0
- package/server/client/dist/assets/requirementDiagram-TGXJPOKE-CBpUt7Ig.js +84 -0
- package/server/client/dist/assets/route-preload.js +2 -2
- package/server/client/dist/assets/sankeyDiagram-HTMAVEWB-BjGnDZlp.js +40 -0
- package/server/client/dist/assets/search-D-xKTPdO.js +1 -0
- package/server/client/dist/assets/search-admin-adapter-CJnJmL6w.js +1 -0
- package/server/client/dist/assets/sequenceDiagram-DBY2YBRQ-B7rpCfS6.js +162 -0
- package/server/client/dist/assets/sizeCapture-X5ZJPWSS-CUJhD0uW.js +1 -0
- package/server/client/dist/assets/stateDiagram-2N3HPSRC-Y9-3XqRX.js +1 -0
- package/server/client/dist/assets/stateDiagram-v2-6OUMAXLB-DbHXhT02.js +1 -0
- package/server/client/dist/assets/swimlanes-5IMT3BWC-Cs1NO9ng.js +2 -0
- package/server/client/dist/assets/swimlanesDiagram-G3AALYLV-DQnrq2ZC.js +8 -0
- package/server/client/dist/assets/{tag.api-CX0SE06J.js → tag.api-DNSQpqwk.js} +3 -3
- package/server/client/dist/assets/time-D5LRMumI.js +9 -0
- package/server/client/dist/assets/timeline-definition-FHXFAJF6-8fqD4WNL.js +120 -0
- package/server/client/dist/assets/toNumber-DE3J3kMD.js +1 -0
- package/server/client/dist/assets/transform-BUB79_za.js +1 -0
- package/server/client/dist/assets/trash-D4-9sv8q.js +1 -0
- package/server/client/dist/assets/url-9nrbQs7Z.js +1 -0
- package/server/client/dist/assets/{useReminderMutate-CLK1tHvT.js → useReminderMutate-BrGO9M0o.js} +4 -4
- package/server/client/dist/assets/vennDiagram-L72KCM5P-BPqKkd5a.js +34 -0
- package/server/client/dist/assets/wardleyDiagram-EHGQE667-Cq11kU2M.js +78 -0
- package/server/client/dist/assets/xychartDiagram-FW5EYKEG-DJ6UzFj-.js +7 -0
- package/server/client/dist/index.html +7 -7
- package/server/dist/features/image/services/delete.js +25 -1
- package/server/dist/features/note/graphql/note.field.resolver.js +2 -0
- package/server/dist/features/note/graphql/note.mutation.resolver.js +54 -23
- package/server/dist/features/note/graphql/note.query.resolver.js +15 -5
- package/server/dist/features/note/graphql/note.type-defs.js +2 -1
- package/server/dist/features/note/http/mcp.js +1 -60
- package/server/dist/features/note/services/authoring.js +17 -80
- package/server/dist/features/note/services/markdown-patch.js +80 -8
- package/server/dist/features/note/services/note-reference-index.js +98 -0
- package/server/dist/features/note/services/properties.js +21 -1
- package/server/dist/features/note/services/property-restore.js +26 -0
- package/server/dist/features/note/services/search.js +5 -0
- package/server/dist/features/note/services/snapshot.js +82 -58
- package/server/dist/features/note/services/trash.js +18 -31
- package/server/dist/features/note/services/write.js +10 -3
- package/server/dist/features/search/embedding-api-key-store.js +57 -0
- package/server/dist/features/search/embedding-client.js +179 -0
- package/server/dist/features/search/graphql/index.js +6 -0
- package/server/dist/features/search/graphql/resolver.js +32 -0
- package/server/dist/features/search/graphql/type-defs.js +37 -0
- package/server/dist/features/search/http/handlers.js +108 -0
- package/server/dist/features/search/hybrid-ranking.js +57 -0
- package/server/dist/features/search/hybrid-search.js +176 -0
- package/server/dist/features/search/note-change.js +16 -0
- package/server/dist/features/search/note-chunking.js +75 -0
- package/server/dist/features/search/related-notes.js +186 -0
- package/server/dist/features/search/search-config.js +150 -0
- package/server/dist/features/search/search-manager.js +431 -0
- package/server/dist/features/search/semantic-indexer.js +138 -0
- package/server/dist/features/search/sqlite-vector-index.js +636 -0
- package/server/dist/features/search/url-normalization.js +10 -0
- package/server/dist/features/tag/services/organization.js +3 -0
- package/server/dist/features/view/services/workspace.js +1 -1
- package/server/dist/main.js +12 -3
- package/server/dist/modules/blocknote.js +4 -5
- package/server/dist/paths.js +7 -2
- package/server/dist/routes/api.js +37 -0
- package/server/dist/routes/mcp.js +0 -5
- package/server/dist/schema/index.js +3 -0
- package/server/prisma/migrations/20260728090000_0019_note_reference_index/migration.sql +15 -0
- package/server/prisma/schema.prisma +16 -0
- package/server/client/dist/assets/Calendar-BP6HTuSn.js +0 -25
- package/server/client/dist/assets/Graph-Xha3fwhp.js +0 -46
- package/server/client/dist/assets/Image-BLEjLUqd.js +0 -1
- package/server/client/dist/assets/Note-DjrCYtat.js +0 -24
- package/server/client/dist/assets/NotePropertiesPanel-2DgXEM4B.js +0 -2
- package/server/client/dist/assets/Reminders-B4l3KdlK.js +0 -1
- package/server/client/dist/assets/Search-BN5sf7bE.js +0 -1
- package/server/client/dist/assets/SurfaceCard-BZm73nyS.js +0 -1
- package/server/client/dist/assets/Tag-oSnmViVp.js +0 -1
- package/server/client/dist/assets/TagNotes-BDTCcJcL.js +0 -1
- package/server/client/dist/assets/ViewNotes-CiZtGJNE.js +0 -1
- package/server/client/dist/assets/ViewSectionDialog-Ctl_694Y.js +0 -102
- package/server/client/dist/assets/Views-D-zlatYD.js +0 -1
- package/server/client/dist/assets/app-DmqIOMWF.css +0 -1
- package/server/client/dist/assets/app-cTRcKMGc.js +0 -26
- package/server/client/dist/assets/image.api-CVuuvTBk.js +0 -17
- package/server/client/dist/assets/index-DKJChPr4.js +0 -1
- package/server/client/dist/assets/manage-image-BZjaxp-f.js +0 -1
- package/server/client/dist/assets/manage-image-detail-DPv0FQ2m.js +0 -1
- package/server/client/dist/assets/properties-D447wsWk.js +0 -1
- package/server/client/dist/assets/time-B3pt8vt4.js +0 -9
- package/server/client/dist/assets/trash-8sH7EZgc.js +0 -1
- package/server/client/dist/assets/url-BSnWpmJx.js +0 -1
package/README.md
CHANGED
|
@@ -61,6 +61,8 @@ npx -y ocean-brain serve \
|
|
|
61
61
|
|
|
62
62
|
By default, notes are stored in `~/.ocean-brain/data/db.sqlite3` and uploaded images in `~/.ocean-brain/assets/images`. The CLI creates the directories and applies bundled database migrations at startup. Stop Ocean Brain and back up both paths together; restore them while the server remains stopped.
|
|
63
63
|
|
|
64
|
+
Configure the embedding API URL and optional API key under `Settings > Search`. The saved key stays on the server and is not returned to the browser.
|
|
65
|
+
|
|
64
66
|
Deleted notes remain in Trash for 30 days. Note snapshots are retained for up to 7 days, with at most 10 snapshots per note. These recovery tools and individual exports do not replace a full backup.
|
|
65
67
|
|
|
66
68
|
For a long-lived installation, replace `ocean-brain` in the commands with an exact version such as `ocean-brain@X.Y.Z`.
|
package/dist/mcp.js
CHANGED
|
@@ -6,7 +6,7 @@ import path from "path";
|
|
|
6
6
|
import { fileURLToPath } from "url";
|
|
7
7
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
8
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
9
|
-
import { z as
|
|
9
|
+
import { z as z3 } from "zod";
|
|
10
10
|
|
|
11
11
|
// src/mcp-note-output.ts
|
|
12
12
|
var formatBackReferenceLink = (backReference) => {
|
|
@@ -211,7 +211,7 @@ var registerIntentWriteTools = (server, {
|
|
|
211
211
|
id: z2.string().describe("Note ID to append to"),
|
|
212
212
|
...markdownWriteBaselineFields,
|
|
213
213
|
intent: z2.string().describe("Human-readable reason for the append."),
|
|
214
|
-
insertion: z2.string().describe("Markdown to append. Tags are body tokens such as [@tag]
|
|
214
|
+
insertion: z2.string().describe("Markdown to append. Tags are body tokens such as [@tag]."),
|
|
215
215
|
placement: markdownAppendPlacementSchema.optional().describe("Default is end. after_heading requires one unique matching heading."),
|
|
216
216
|
separator: z2.enum(["\n\n", "\n"]).optional().describe("Separator inserted around appended markdown. Defaults to a blank line."),
|
|
217
217
|
policy: markdownWritePolicySchema
|
|
@@ -262,7 +262,7 @@ var registerIntentWriteTools = (server, {
|
|
|
262
262
|
id: z2.string().describe("Note ID to replace"),
|
|
263
263
|
...markdownWriteBaselineFields,
|
|
264
264
|
intent: z2.string().describe("Human-readable reason for the full replace."),
|
|
265
|
-
replacement: z2.string().describe("Complete replacement markdown body. Tags are body tokens such as [@tag]
|
|
265
|
+
replacement: z2.string().describe("Complete replacement markdown body. Tags are body tokens such as [@tag]."),
|
|
266
266
|
policy: markdownWritePolicySchema
|
|
267
267
|
},
|
|
268
268
|
async ({ id, expectedUpdatedAt, baseMarkdownSha256, intent, replacement, policy }) => {
|
|
@@ -281,32 +281,6 @@ var registerIntentWriteTools = (server, {
|
|
|
281
281
|
);
|
|
282
282
|
};
|
|
283
283
|
|
|
284
|
-
// src/mcp-legacy-write-tools.ts
|
|
285
|
-
import { z as z3 } from "zod";
|
|
286
|
-
var LEGACY_UPDATE_NOTE_DESCRIPTION = "Legacy full-field note update kept for backward compatibility. Prefer ocean_brain_patch_note_markdown for localized body edits, ocean_brain_append_note_markdown for additions, ocean_brain_replace_note_markdown for whole-body rewrites, and ocean_brain_update_note_metadata for title/layout/properties. Use this only when a legacy client needs combined field updates.";
|
|
287
|
-
var registerLegacyWriteTools = (server, { jsonRequest: jsonRequest2, requireWriteToken: requireWriteToken2, serverUrl, token, tools }) => {
|
|
288
|
-
server.tool(
|
|
289
|
-
tools.updateNote,
|
|
290
|
-
LEGACY_UPDATE_NOTE_DESCRIPTION,
|
|
291
|
-
{
|
|
292
|
-
id: z3.string().describe("Note ID to update"),
|
|
293
|
-
title: z3.string().optional().describe("New note title"),
|
|
294
|
-
markdown: z3.string().optional().describe("Replacement markdown body. In MCP markdown, tags must use [@tag] or [#tag]."),
|
|
295
|
-
layout: noteLayoutSchema.optional().describe("Optional note layout: narrow, wide, or full. Prefer wide for most notes unless the user explicitly wants narrow or full.")
|
|
296
|
-
},
|
|
297
|
-
async ({ id, title, markdown, layout }) => {
|
|
298
|
-
const writeToken = requireWriteToken2(token, tools.updateNote);
|
|
299
|
-
const result = await jsonRequest2(serverUrl, writeToken, "/api/mcp/notes/update", {
|
|
300
|
-
id,
|
|
301
|
-
...title !== void 0 ? { title } : {},
|
|
302
|
-
...markdown !== void 0 ? { markdown } : {},
|
|
303
|
-
...layout ? { layout } : {}
|
|
304
|
-
});
|
|
305
|
-
return createMcpJsonToolResult(result);
|
|
306
|
-
}
|
|
307
|
-
);
|
|
308
|
-
};
|
|
309
|
-
|
|
310
284
|
// src/mcp-property-query-output.ts
|
|
311
285
|
var formatPropertyQueryResponse = ({
|
|
312
286
|
result,
|
|
@@ -355,7 +329,6 @@ var OCEAN_BRAIN_MCP_TOOLS = {
|
|
|
355
329
|
searchNotes: "ocean_brain_search_notes",
|
|
356
330
|
readNote: "ocean_brain_read_note",
|
|
357
331
|
createNote: "ocean_brain_create_note",
|
|
358
|
-
updateNote: "ocean_brain_update_note",
|
|
359
332
|
patchNoteMarkdown: "ocean_brain_patch_note_markdown",
|
|
360
333
|
appendNoteMarkdown: "ocean_brain_append_note_markdown",
|
|
361
334
|
updateNoteMetadata: "ocean_brain_update_note_metadata",
|
|
@@ -370,11 +343,17 @@ var OCEAN_BRAIN_MCP_TOOLS = {
|
|
|
370
343
|
createTag: "ocean_brain_create_tag",
|
|
371
344
|
deleteNote: "ocean_brain_delete_note"
|
|
372
345
|
};
|
|
373
|
-
var tagMatchModeSchema =
|
|
374
|
-
var propertyValueTypeSchema =
|
|
375
|
-
var propertyFilterOperatorSchema =
|
|
376
|
-
var viewSortBySchema =
|
|
377
|
-
var viewSortOrderSchema =
|
|
346
|
+
var tagMatchModeSchema = z3.enum(["and", "or"]);
|
|
347
|
+
var propertyValueTypeSchema = z3.enum(["text", "url", "number", "date", "boolean", "select"]);
|
|
348
|
+
var propertyFilterOperatorSchema = z3.enum(["equals", "before", "after", "exists", "notExists"]);
|
|
349
|
+
var viewSortBySchema = z3.enum(["updatedAt", "createdAt", "title"]);
|
|
350
|
+
var viewSortOrderSchema = z3.enum(["asc", "desc"]);
|
|
351
|
+
var searchModeSchema = z3.enum(["hybrid", "lexical", "semantic"]);
|
|
352
|
+
var graphqlSearchModes = {
|
|
353
|
+
hybrid: "HYBRID",
|
|
354
|
+
lexical: "LEXICAL",
|
|
355
|
+
semantic: "SEMANTIC"
|
|
356
|
+
};
|
|
378
357
|
var formatMcpGraphqlError = (error) => {
|
|
379
358
|
const suffix = [];
|
|
380
359
|
if (error.extensions?.code) {
|
|
@@ -388,17 +367,20 @@ var formatMcpGraphqlError = (error) => {
|
|
|
388
367
|
}
|
|
389
368
|
return `GraphQL error: ${error.message} (${suffix.join(", ")})`;
|
|
390
369
|
};
|
|
391
|
-
var propertyFilterSchema =
|
|
392
|
-
key:
|
|
370
|
+
var propertyFilterSchema = z3.object({
|
|
371
|
+
key: z3.string().describe("Property key from ocean_brain_list_properties, e.g. state"),
|
|
393
372
|
valueType: propertyValueTypeSchema.describe("Property value type from the property definition"),
|
|
394
373
|
operator: propertyFilterOperatorSchema.describe("Filter operator. before/after are only valid for date or number properties."),
|
|
395
|
-
value:
|
|
374
|
+
value: z3.string().nullable().optional().describe("Filter value. Required unless operator is exists or notExists. select=option.value, date=YYYY-MM-DD, boolean=true/false, number=finite, url=http(s).")
|
|
396
375
|
});
|
|
397
376
|
var normalizeOceanBrainTagName = (name) => {
|
|
398
377
|
const trimmedName = name.trim();
|
|
399
378
|
if (!trimmedName) {
|
|
400
379
|
throw new Error("Tag name is required.");
|
|
401
380
|
}
|
|
381
|
+
if (trimmedName.startsWith("#")) {
|
|
382
|
+
throw new Error("Ocean Brain tags use @, not #. Example: @project");
|
|
383
|
+
}
|
|
402
384
|
const normalizedName = trimmedName.startsWith("@") ? trimmedName : `@${trimmedName}`;
|
|
403
385
|
if (normalizedName === "@" || /\s/.test(normalizedName.slice(1))) {
|
|
404
386
|
throw new Error("Ocean Brain tag names must be a single token. Example: @project");
|
|
@@ -410,8 +392,8 @@ var normalizeOceanBrainTagNames = (names) => {
|
|
|
410
392
|
new Set(names.map(normalizeOceanBrainTagName))
|
|
411
393
|
);
|
|
412
394
|
};
|
|
413
|
-
var fetchOceanBrainTags = async (serverUrl, token, query) => {
|
|
414
|
-
const data = await
|
|
395
|
+
var fetchOceanBrainTags = async (serverUrl, token, query, graphqlRequest = graphql) => {
|
|
396
|
+
const data = await graphqlRequest(serverUrl, token, `
|
|
415
397
|
query ($searchFilter: SearchFilterInput, $pagination: PaginationInput) {
|
|
416
398
|
allTags(searchFilter: $searchFilter, pagination: $pagination) {
|
|
417
399
|
totalCount
|
|
@@ -464,52 +446,71 @@ var requireWriteToken = (token, toolName) => {
|
|
|
464
446
|
}
|
|
465
447
|
throw new Error(`${toolName} requires an MCP bearer token. Set --token or --token-file.`);
|
|
466
448
|
};
|
|
467
|
-
var
|
|
449
|
+
var formatMcpSearchNotes = (notes) => notes.map((note) => ({
|
|
450
|
+
id: note.id,
|
|
451
|
+
title: note.title,
|
|
452
|
+
updatedAt: note.updatedAt,
|
|
453
|
+
tags: note.tags.map((t) => t.name),
|
|
454
|
+
preview: note.contentPreview
|
|
455
|
+
}));
|
|
456
|
+
var registerMcpTools = (server, serverUrl, token, options = {}) => {
|
|
457
|
+
const graphqlRequest = options.graphqlRequest ?? graphql;
|
|
468
458
|
server.tool(
|
|
469
459
|
OCEAN_BRAIN_MCP_TOOLS.searchNotes,
|
|
470
|
-
"Search Ocean Brain notes by keyword.
|
|
460
|
+
"Search Ocean Brain notes by keyword or meaning. Lexical uses words only, hybrid combines words and meaning, and semantic uses meaning only. Results use one ranked result shape with match and semantic-search status. Use ocean_brain_read_note to get full content for a specific note.",
|
|
471
461
|
{
|
|
472
|
-
query:
|
|
473
|
-
limit:
|
|
462
|
+
query: z3.string().describe("Search words or a natural-language description"),
|
|
463
|
+
limit: z3.number().optional().default(10).describe("Results per page. Search returns at most 50 per page. (default: 10)"),
|
|
464
|
+
offset: z3.number().int().min(0).optional().default(0).describe("Results to skip for pagination (default: 0)"),
|
|
465
|
+
mode: searchModeSchema.default("hybrid").describe("Search mode. Defaults to hybrid.")
|
|
474
466
|
},
|
|
475
|
-
async ({ query, limit }) => {
|
|
476
|
-
const data = await
|
|
477
|
-
query ($
|
|
478
|
-
|
|
467
|
+
async ({ query, limit, offset, mode }) => {
|
|
468
|
+
const data = await graphqlRequest(serverUrl, token, `
|
|
469
|
+
query ($query: String!, $mode: SearchMode!, $pagination: PaginationInput!) {
|
|
470
|
+
searchNotes(query: $query, mode: $mode, pagination: $pagination) {
|
|
479
471
|
totalCount
|
|
472
|
+
semanticAvailable
|
|
473
|
+
semanticUsed
|
|
474
|
+
semanticError
|
|
475
|
+
matches {
|
|
476
|
+
noteId
|
|
477
|
+
lexical
|
|
478
|
+
semantic
|
|
479
|
+
}
|
|
480
480
|
notes {
|
|
481
481
|
id
|
|
482
482
|
title
|
|
483
483
|
updatedAt
|
|
484
484
|
tags { id name }
|
|
485
|
-
|
|
485
|
+
contentPreview
|
|
486
486
|
}
|
|
487
487
|
}
|
|
488
488
|
}
|
|
489
489
|
`, {
|
|
490
|
-
|
|
491
|
-
|
|
490
|
+
query,
|
|
491
|
+
mode: graphqlSearchModes[mode],
|
|
492
|
+
pagination: { limit, offset }
|
|
493
|
+
});
|
|
494
|
+
const result = data?.searchNotes;
|
|
495
|
+
return createMcpJsonToolResult({
|
|
496
|
+
totalCount: result.totalCount,
|
|
497
|
+
semanticAvailable: result.semanticAvailable,
|
|
498
|
+
semanticUsed: result.semanticUsed,
|
|
499
|
+
semanticError: result.semanticError,
|
|
500
|
+
matches: result.matches,
|
|
501
|
+
notes: formatMcpSearchNotes(result.notes)
|
|
492
502
|
});
|
|
493
|
-
const result = data?.allNotes;
|
|
494
|
-
const notes = result.notes.map((note) => ({
|
|
495
|
-
id: note.id,
|
|
496
|
-
title: note.title,
|
|
497
|
-
updatedAt: note.updatedAt,
|
|
498
|
-
tags: note.tags.map((t) => t.name),
|
|
499
|
-
preview: note.contentAsMarkdown.slice(0, 100)
|
|
500
|
-
}));
|
|
501
|
-
return createMcpJsonToolResult({ totalCount: result.totalCount, notes });
|
|
502
503
|
}
|
|
503
504
|
);
|
|
504
505
|
server.tool(
|
|
505
506
|
OCEAN_BRAIN_MCP_TOOLS.readNote,
|
|
506
507
|
"Read an Ocean Brain note by ID. Returns properties, tags, truncated content by default (1000 chars), and a back-reference summary. Set maxLength to 0 only when full content is necessary.",
|
|
507
508
|
{
|
|
508
|
-
id:
|
|
509
|
-
maxLength:
|
|
509
|
+
id: z3.string().describe("Note ID"),
|
|
510
|
+
maxLength: z3.number().optional().default(1e3).describe("Max content length in characters. 0 for full content. (default: 1000)")
|
|
510
511
|
},
|
|
511
512
|
async ({ id, maxLength }) => {
|
|
512
|
-
const data = await
|
|
513
|
+
const data = await graphqlRequest(serverUrl, token, `
|
|
513
514
|
query ($id: ID!) {
|
|
514
515
|
note(id: $id) {
|
|
515
516
|
id
|
|
@@ -540,8 +541,8 @@ var registerMcpTools = (server, serverUrl, token) => {
|
|
|
540
541
|
OCEAN_BRAIN_MCP_TOOLS.createNote,
|
|
541
542
|
"Create an Ocean Brain note from markdown. Search/read first to avoid duplicates; prefer patching an existing note when the intent is a local change.",
|
|
542
543
|
{
|
|
543
|
-
title:
|
|
544
|
-
markdown:
|
|
544
|
+
title: z3.string().describe("Note title"),
|
|
545
|
+
markdown: z3.string().optional().default("").describe("Markdown body for the new note. In MCP markdown, tags must use [@tag]. Defaults to an empty note body."),
|
|
545
546
|
layout: noteLayoutSchema.optional().describe("Optional note layout: narrow, wide, or full. Prefer wide for most notes unless the user explicitly wants narrow or full.")
|
|
546
547
|
},
|
|
547
548
|
async ({ title, markdown, layout }) => {
|
|
@@ -554,13 +555,6 @@ var registerMcpTools = (server, serverUrl, token) => {
|
|
|
554
555
|
return createMcpJsonToolResult(result);
|
|
555
556
|
}
|
|
556
557
|
);
|
|
557
|
-
registerLegacyWriteTools(server, {
|
|
558
|
-
jsonRequest,
|
|
559
|
-
requireWriteToken,
|
|
560
|
-
serverUrl,
|
|
561
|
-
token,
|
|
562
|
-
tools: OCEAN_BRAIN_MCP_TOOLS
|
|
563
|
-
});
|
|
564
558
|
registerIntentWriteTools(server, {
|
|
565
559
|
jsonRequest,
|
|
566
560
|
requireWriteToken,
|
|
@@ -573,7 +567,7 @@ var registerMcpTools = (server, serverUrl, token) => {
|
|
|
573
567
|
"List Ocean Brain tags with their note counts.",
|
|
574
568
|
{},
|
|
575
569
|
async () => {
|
|
576
|
-
const data = await
|
|
570
|
+
const data = await graphqlRequest(serverUrl, token, `
|
|
577
571
|
query ($searchFilter: SearchFilterInput, $pagination: PaginationInput) {
|
|
578
572
|
allTags(searchFilter: $searchFilter, pagination: $pagination) {
|
|
579
573
|
totalCount
|
|
@@ -596,12 +590,12 @@ var registerMcpTools = (server, serverUrl, token) => {
|
|
|
596
590
|
OCEAN_BRAIN_MCP_TOOLS.listProperties,
|
|
597
591
|
"List shared Ocean Brain property definitions. Use this before property queries so keys, value types, and select option values are valid.",
|
|
598
592
|
{
|
|
599
|
-
query:
|
|
600
|
-
limit:
|
|
601
|
-
offset:
|
|
593
|
+
query: z3.string().optional().default("").describe("Optional property key/name search query"),
|
|
594
|
+
limit: z3.number().optional().default(50).describe("Max results (default: 50, server max: 100)"),
|
|
595
|
+
offset: z3.number().optional().default(0).describe("Pagination offset (default: 0)")
|
|
602
596
|
},
|
|
603
597
|
async ({ query, limit, offset }) => {
|
|
604
|
-
const data = await
|
|
598
|
+
const data = await graphqlRequest(serverUrl, token, `
|
|
605
599
|
query ($query: String, $pagination: PaginationInput) {
|
|
606
600
|
notePropertyKeys(query: $query, pagination: $pagination) {
|
|
607
601
|
totalCount
|
|
@@ -630,13 +624,13 @@ var registerMcpTools = (server, serverUrl, token) => {
|
|
|
630
624
|
OCEAN_BRAIN_MCP_TOOLS.listNotesByTag,
|
|
631
625
|
"List Ocean Brain notes for a specific tag name. The tool accepts either @tag or tag and resolves it to the canonical Ocean Brain tag name first.",
|
|
632
626
|
{
|
|
633
|
-
tag:
|
|
634
|
-
limit:
|
|
635
|
-
offset:
|
|
627
|
+
tag: z3.string().describe("Tag name to inspect. You can pass @project or project."),
|
|
628
|
+
limit: z3.number().optional().default(20).describe("Max results (default: 20)"),
|
|
629
|
+
offset: z3.number().optional().default(0).describe("Pagination offset (default: 0)")
|
|
636
630
|
},
|
|
637
631
|
async ({ tag, limit, offset }) => {
|
|
638
632
|
const normalizedTag = normalizeOceanBrainTagName(tag);
|
|
639
|
-
const tagResult = await fetchOceanBrainTags(serverUrl, token, normalizedTag);
|
|
633
|
+
const tagResult = await fetchOceanBrainTags(serverUrl, token, normalizedTag, graphqlRequest);
|
|
640
634
|
const exactMatches = tagResult.tags.filter((item) => item.name === normalizedTag);
|
|
641
635
|
if (exactMatches.length === 0) {
|
|
642
636
|
return createMcpJsonToolResult({
|
|
@@ -648,7 +642,7 @@ var registerMcpTools = (server, serverUrl, token) => {
|
|
|
648
642
|
});
|
|
649
643
|
}
|
|
650
644
|
const selectedTag = exactMatches[0];
|
|
651
|
-
const notesData = await
|
|
645
|
+
const notesData = await graphqlRequest(serverUrl, token, `
|
|
652
646
|
query ($searchFilter: SearchFilterInput, $pagination: PaginationInput) {
|
|
653
647
|
tagNotes(searchFilter: $searchFilter, pagination: $pagination) {
|
|
654
648
|
totalCount
|
|
@@ -685,16 +679,16 @@ var registerMcpTools = (server, serverUrl, token) => {
|
|
|
685
679
|
OCEAN_BRAIN_MCP_TOOLS.listNotesByTags,
|
|
686
680
|
"List Ocean Brain notes for multiple tag names. Supports AND/OR matching and resolves each input tag to the canonical Ocean Brain tag name first.",
|
|
687
681
|
{
|
|
688
|
-
tags:
|
|
682
|
+
tags: z3.array(z3.string()).min(1).describe("Tag names to inspect. You can pass @project or project values."),
|
|
689
683
|
mode: tagMatchModeSchema.optional().default("and").describe("Tag match mode. Use and for intersection, or for union. Defaults to and."),
|
|
690
|
-
limit:
|
|
691
|
-
offset:
|
|
684
|
+
limit: z3.number().optional().default(20).describe("Max results (default: 20)"),
|
|
685
|
+
offset: z3.number().optional().default(0).describe("Pagination offset (default: 0)")
|
|
692
686
|
},
|
|
693
687
|
async ({ tags, mode, limit, offset }) => {
|
|
694
688
|
const normalizedTags = normalizeOceanBrainTagNames(tags);
|
|
695
689
|
const tagResults = await Promise.all(
|
|
696
690
|
normalizedTags.map(async (normalizedTag) => {
|
|
697
|
-
const result = await fetchOceanBrainTags(serverUrl, token, normalizedTag);
|
|
691
|
+
const result = await fetchOceanBrainTags(serverUrl, token, normalizedTag, graphqlRequest);
|
|
698
692
|
const exactMatches = result.tags.filter((item) => item.name === normalizedTag);
|
|
699
693
|
return {
|
|
700
694
|
normalizedTag,
|
|
@@ -717,7 +711,7 @@ var registerMcpTools = (server, serverUrl, token) => {
|
|
|
717
711
|
notes: []
|
|
718
712
|
};
|
|
719
713
|
if (mode === "and" && missingTags.length === 0 || mode === "or" && matchedTags.length > 0) {
|
|
720
|
-
const notesData = await
|
|
714
|
+
const notesData = await graphqlRequest(serverUrl, token, `
|
|
721
715
|
query ($tagNames: [String!]!, $mode: TagMatchMode!, $pagination: PaginationInput) {
|
|
722
716
|
notesByTagNames(tagNames: $tagNames, mode: $mode, pagination: $pagination) {
|
|
723
717
|
totalCount
|
|
@@ -757,19 +751,20 @@ var registerMcpTools = (server, serverUrl, token) => {
|
|
|
757
751
|
OCEAN_BRAIN_MCP_TOOLS.queryNotesByProperties,
|
|
758
752
|
"Call ocean_brain_list_properties first. Requires >=1 propertyFilter; use search/recent for broad lists. Use key/valueType from the property definition. Values are strings: select=option.value, date=YYYY-MM-DD, boolean=true/false, number=finite, url=http(s). exists/notExists need no value. Property filters use AND; tagNames use mode. Summaries are returned by default; use propertyKeys for needed property details.",
|
|
759
753
|
{
|
|
760
|
-
propertyFilters:
|
|
761
|
-
tagNames:
|
|
754
|
+
propertyFilters: z3.array(propertyFilterSchema).min(1).max(10).describe("Required property filters. Multiple property filters are combined with AND."),
|
|
755
|
+
tagNames: z3.array(z3.string()).optional().default([]).describe("Optional tag filters. You can pass @project or project."),
|
|
762
756
|
mode: tagMatchModeSchema.optional().default("and").describe("Tag match mode for tagNames only. Property filters are always combined with AND."),
|
|
763
757
|
sortBy: viewSortBySchema.optional().default("updatedAt").describe("Sort field (default: updatedAt)"),
|
|
764
758
|
sortOrder: viewSortOrderSchema.optional().default("desc").describe("Sort order (default: desc)"),
|
|
765
|
-
includeProperties:
|
|
766
|
-
propertyKeys:
|
|
767
|
-
limit:
|
|
768
|
-
offset:
|
|
759
|
+
includeProperties: z3.boolean().optional().default(false).describe("Include returned note properties. Defaults to false to reduce tokens."),
|
|
760
|
+
propertyKeys: z3.array(z3.string()).optional().default([]).describe("Property keys to include in output; automatically includes properties."),
|
|
761
|
+
limit: z3.number().optional().default(20).describe("Max results (default: 20, server max: 50)"),
|
|
762
|
+
offset: z3.number().optional().default(0).describe("Pagination offset (default: 0)")
|
|
769
763
|
},
|
|
770
764
|
async ({ propertyFilters, tagNames, mode, sortBy, sortOrder, includeProperties, propertyKeys, limit, offset }) => {
|
|
771
765
|
const shouldIncludeProperties = includeProperties || propertyKeys.length > 0;
|
|
772
|
-
const
|
|
766
|
+
const normalizedTagNames = normalizeOceanBrainTagNames(tagNames);
|
|
767
|
+
const data = await graphqlRequest(serverUrl, token, `
|
|
773
768
|
query ($input: NotesByPropertiesInput!, $pagination: PaginationInput, $includeProperties: Boolean!) {
|
|
774
769
|
notesByProperties(input: $input, pagination: $pagination) {
|
|
775
770
|
totalCount
|
|
@@ -785,7 +780,7 @@ var registerMcpTools = (server, serverUrl, token) => {
|
|
|
785
780
|
}
|
|
786
781
|
`, {
|
|
787
782
|
input: {
|
|
788
|
-
tagNames,
|
|
783
|
+
tagNames: normalizedTagNames,
|
|
789
784
|
mode,
|
|
790
785
|
propertyFilters,
|
|
791
786
|
sortBy,
|
|
@@ -799,7 +794,7 @@ var registerMcpTools = (server, serverUrl, token) => {
|
|
|
799
794
|
result,
|
|
800
795
|
query: {
|
|
801
796
|
propertyFilters,
|
|
802
|
-
tagNames,
|
|
797
|
+
tagNames: normalizedTagNames,
|
|
803
798
|
mode,
|
|
804
799
|
sortBy,
|
|
805
800
|
sortOrder,
|
|
@@ -815,10 +810,10 @@ var registerMcpTools = (server, serverUrl, token) => {
|
|
|
815
810
|
OCEAN_BRAIN_MCP_TOOLS.listRecentNotes,
|
|
816
811
|
"List recently updated Ocean Brain notes. Returns titles and tags only. Use ocean_brain_read_note to get full content for a specific note.",
|
|
817
812
|
{
|
|
818
|
-
limit:
|
|
813
|
+
limit: z3.number().optional().default(10).describe("Max results (default: 10)")
|
|
819
814
|
},
|
|
820
815
|
async ({ limit }) => {
|
|
821
|
-
const data = await
|
|
816
|
+
const data = await graphqlRequest(serverUrl, token, `
|
|
822
817
|
query ($searchFilter: SearchFilterInput, $pagination: PaginationInput) {
|
|
823
818
|
allNotes(searchFilter: $searchFilter, pagination: $pagination) {
|
|
824
819
|
totalCount
|
|
@@ -848,13 +843,13 @@ var registerMcpTools = (server, serverUrl, token) => {
|
|
|
848
843
|
OCEAN_BRAIN_MCP_TOOLS.findNoteCleanupCandidates,
|
|
849
844
|
"Find Ocean Brain note cleanup candidates for temporary or draft notes before deletion. This is optional discovery; ocean_brain_delete_note moves a single note to trash directly.",
|
|
850
845
|
{
|
|
851
|
-
keywords:
|
|
852
|
-
limit:
|
|
853
|
-
offset:
|
|
846
|
+
keywords: z3.string().optional().default("temp tmp draft test wip").describe("Keywords that mark a note as a cleanup candidate. Comma or space separated."),
|
|
847
|
+
limit: z3.number().optional().default(20).describe("Max results (default: 20)"),
|
|
848
|
+
offset: z3.number().optional().default(0).describe("Pagination offset (default: 0)")
|
|
854
849
|
},
|
|
855
850
|
async ({ keywords, limit, offset }) => {
|
|
856
851
|
const normalizedKeywords = keywords.split(/[,\s]+/).map((keyword) => keyword.trim()).filter(Boolean);
|
|
857
|
-
const data = await
|
|
852
|
+
const data = await graphqlRequest(serverUrl, token, `
|
|
858
853
|
query ($query: String, $pagination: PaginationInput) {
|
|
859
854
|
noteCleanupCandidates(query: $query, pagination: $pagination) {
|
|
860
855
|
id
|
|
@@ -888,12 +883,13 @@ var registerMcpTools = (server, serverUrl, token) => {
|
|
|
888
883
|
OCEAN_BRAIN_MCP_TOOLS.createTag,
|
|
889
884
|
"Create an Ocean Brain tag through the MCP write path. The tool accepts either @tag or tag and creates the canonical Ocean Brain tag if it does not already exist.",
|
|
890
885
|
{
|
|
891
|
-
name:
|
|
886
|
+
name: z3.string().describe("Tag name to create. You can pass @project or project.")
|
|
892
887
|
},
|
|
893
888
|
async ({ name }) => {
|
|
894
889
|
const writeToken = requireWriteToken(token, OCEAN_BRAIN_MCP_TOOLS.createTag);
|
|
890
|
+
const normalizedName = normalizeOceanBrainTagName(name);
|
|
895
891
|
const result = await jsonRequest(serverUrl, writeToken, "/api/mcp/tags/create", {
|
|
896
|
-
name
|
|
892
|
+
name: normalizedName
|
|
897
893
|
});
|
|
898
894
|
return createMcpJsonToolResult(result);
|
|
899
895
|
}
|
|
@@ -902,7 +898,7 @@ var registerMcpTools = (server, serverUrl, token) => {
|
|
|
902
898
|
OCEAN_BRAIN_MCP_TOOLS.deleteNote,
|
|
903
899
|
"Move an Ocean Brain note to trash, like `mv note.md trash/`. This is a recoverable trash move, not permanent deletion. Deleted-note tag names are kept as restore metadata; orphan tags are not a blocking condition.",
|
|
904
900
|
{
|
|
905
|
-
id:
|
|
901
|
+
id: z3.string().describe("Note ID to move to trash")
|
|
906
902
|
},
|
|
907
903
|
async ({ id }) => {
|
|
908
904
|
const writeToken = requireWriteToken(token, OCEAN_BRAIN_MCP_TOOLS.deleteNote);
|
|
@@ -932,5 +928,7 @@ export {
|
|
|
932
928
|
OCEAN_BRAIN_MCP_TOOLS,
|
|
933
929
|
OCEAN_BRAIN_MCP_VERSION_HEADER,
|
|
934
930
|
createMcpRequestHeaders,
|
|
931
|
+
normalizeOceanBrainTagName,
|
|
932
|
+
registerMcpTools,
|
|
935
933
|
startMcpServer
|
|
936
934
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ocean-brain",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -40,11 +40,12 @@
|
|
|
40
40
|
"lusca": "^1.7.0",
|
|
41
41
|
"prisma": "^6.19.3",
|
|
42
42
|
"sqlite3": "^6.0.1",
|
|
43
|
+
"sqlite-vec": "0.1.9",
|
|
43
44
|
"winston": "^3.19.0",
|
|
44
45
|
"zod": "^3.25.76"
|
|
45
46
|
},
|
|
46
47
|
"oceanBrain": {
|
|
47
|
-
"mcpCompatibilityVersion": "0.
|
|
48
|
+
"mcpCompatibilityVersion": "0.11.0"
|
|
48
49
|
},
|
|
49
50
|
"scripts": {
|
|
50
51
|
"dev": "tsx src/index.ts",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./floating-ui.react-dom-
|
|
1
|
+
import{r as e}from"./floating-ui.react-dom-BWTnA00G.js";import{A as r}from"./note.api-D3oJmG3q.js";const n=new Map([["bold",e.createElement(e.Fragment,null,e.createElement("path",{d:"M224.49,136.49l-72,72a12,12,0,0,1-17-17L187,140H40a12,12,0,0,1,0-24H187L135.51,64.48a12,12,0,0,1,17-17l72,72A12,12,0,0,1,224.49,136.49Z"}))],["duotone",e.createElement(e.Fragment,null,e.createElement("path",{d:"M216,128l-72,72V56Z",opacity:"0.2"}),e.createElement("path",{d:"M221.66,122.34l-72-72A8,8,0,0,0,136,56v64H40a8,8,0,0,0,0,16h96v64a8,8,0,0,0,13.66,5.66l72-72A8,8,0,0,0,221.66,122.34ZM152,180.69V75.31L204.69,128Z"}))],["fill",e.createElement(e.Fragment,null,e.createElement("path",{d:"M221.66,133.66l-72,72A8,8,0,0,1,136,200V136H40a8,8,0,0,1,0-16h96V56a8,8,0,0,1,13.66-5.66l72,72A8,8,0,0,1,221.66,133.66Z"}))],["light",e.createElement(e.Fragment,null,e.createElement("path",{d:"M220.24,132.24l-72,72a6,6,0,0,1-8.48-8.48L201.51,134H40a6,6,0,0,1,0-12H201.51L139.76,60.24a6,6,0,0,1,8.48-8.48l72,72A6,6,0,0,1,220.24,132.24Z"}))],["regular",e.createElement(e.Fragment,null,e.createElement("path",{d:"M221.66,133.66l-72,72a8,8,0,0,1-11.32-11.32L196.69,136H40a8,8,0,0,1,0-16H196.69L138.34,61.66a8,8,0,0,1,11.32-11.32l72,72A8,8,0,0,1,221.66,133.66Z"}))],["thin",e.createElement(e.Fragment,null,e.createElement("path",{d:"M218.83,130.83l-72,72a4,4,0,0,1-5.66-5.66L206.34,132H40a4,4,0,0,1,0-8H206.34L141.17,58.83a4,4,0,0,1,5.66-5.66l72,72A4,4,0,0,1,218.83,130.83Z"}))]]),t=e.forwardRef((a,l)=>e.createElement(r,{ref:l,...a,weights:n}));t.displayName="ArrowRightIcon";const o=t;export{o as s};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as a,j as t}from"./floating-ui.react-dom-BWTnA00G.js";import{A as m,T as c,c as s}from"./note.api-D3oJmG3q.js";const i=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M87.5,151.52l64-64a12,12,0,0,1,17,17l-64,64a12,12,0,0,1-17-17Zm131-114a60.08,60.08,0,0,0-84.87,0L103.51,67.61a12,12,0,0,0,17,17l30.07-30.06a36,36,0,0,1,50.93,50.92L171.4,135.52a12,12,0,1,0,17,17l30.08-30.06A60.09,60.09,0,0,0,218.45,37.55ZM135.52,171.4l-30.07,30.08a36,36,0,0,1-50.92-50.93l30.06-30.07a12,12,0,0,0-17-17L37.55,133.58a60,60,0,0,0,84.88,84.87l30.06-30.07a12,12,0,0,0-17-17Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M209.94,113.94l-96,96a48,48,0,0,1-67.88-67.88l96-96a48,48,0,0,1,67.88,67.88Z",opacity:"0.2"}),a.createElement("path",{d:"M165.66,90.34a8,8,0,0,1,0,11.32l-64,64a8,8,0,0,1-11.32-11.32l64-64A8,8,0,0,1,165.66,90.34ZM215.6,40.4a56,56,0,0,0-79.2,0L106.34,70.45a8,8,0,0,0,11.32,11.32l30.06-30a40,40,0,0,1,56.57,56.56l-30.07,30.06a8,8,0,0,0,11.31,11.32L215.6,119.6a56,56,0,0,0,0-79.2ZM138.34,174.22l-30.06,30.06a40,40,0,1,1-56.56-56.57l30.05-30.05a8,8,0,0,0-11.32-11.32L40.4,136.4a56,56,0,0,0,79.2,79.2l30.06-30.07a8,8,0,0,0-11.32-11.31Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM144.56,173.66l-21.45,21.45a44,44,0,0,1-62.22-62.22l21.45-21.46a8,8,0,0,1,11.32,11.31L72.2,144.2a28,28,0,0,0,39.6,39.6l21.45-21.46a8,8,0,0,1,11.31,11.32Zm-34.9-16a8,8,0,0,1-11.32-11.32l48-48a8,8,0,0,1,11.32,11.32Zm85.45-34.55-21.45,21.45a8,8,0,0,1-11.32-11.31L183.8,111.8a28,28,0,0,0-39.6-39.6L122.74,93.66a8,8,0,0,1-11.31-11.32l21.46-21.45a44,44,0,0,1,62.22,62.22Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M164.25,91.75a6,6,0,0,1,0,8.49l-64,64a6,6,0,0,1-8.49-8.48l64-64A6,6,0,0,1,164.25,91.75ZM214.2,41.8a54.07,54.07,0,0,0-76.38,0L107.75,71.85a6,6,0,0,0,8.49,8.49l30.07-30.06a42,42,0,0,1,59.41,59.41l-30.08,30.07a6,6,0,1,0,8.49,8.49l30.07-30.07A54,54,0,0,0,214.2,41.8ZM139.76,175.64l-30.07,30.08a42,42,0,0,1-59.41-59.41l30.06-30.07a6,6,0,0,0-8.49-8.49l-30,30.07a54,54,0,0,0,76.38,76.39l30.07-30.08a6,6,0,0,0-8.49-8.49Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M165.66,90.34a8,8,0,0,1,0,11.32l-64,64a8,8,0,0,1-11.32-11.32l64-64A8,8,0,0,1,165.66,90.34ZM215.6,40.4a56,56,0,0,0-79.2,0L106.34,70.45a8,8,0,0,0,11.32,11.32l30.06-30a40,40,0,0,1,56.57,56.56l-30.07,30.06a8,8,0,0,0,11.31,11.32L215.6,119.6a56,56,0,0,0,0-79.2ZM138.34,174.22l-30.06,30.06a40,40,0,1,1-56.56-56.57l30.05-30.05a8,8,0,0,0-11.32-11.32L40.4,136.4a56,56,0,0,0,79.2,79.2l30.06-30.07a8,8,0,0,0-11.32-11.31Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M162.84,93.16a4,4,0,0,1,0,5.66l-64,64a4,4,0,0,1-5.66-5.66l64-64A4,4,0,0,1,162.84,93.16Zm49.95-49.95a52.07,52.07,0,0,0-73.56,0L109.17,73.27a4,4,0,0,0,5.65,5.66l30.07-30.06a44,44,0,0,1,62.24,62.24l-30.07,30.06a4,4,0,0,0,5.66,5.66l30.07-30.06A52.07,52.07,0,0,0,212.79,43.21ZM141.17,177.06l-30.06,30.07a44,44,0,0,1-62.24-62.24l30.06-30.06a4,4,0,0,0-5.66-5.66L43.21,139.23a52,52,0,0,0,73.56,73.56l30.06-30.07a4,4,0,1,0-5.66-5.66Z"}))]]),n=a.forwardRef((e,l)=>a.createElement(m,{ref:l,...e,weights:i}));n.displayName="LinkSimpleIcon";const o=n;function d({icon:e,title:l,className:r}){return t.jsxs("div",{className:s("flex items-center gap-2",r),children:[t.jsx("div",{className:"flex h-3.5 w-3.5 shrink-0 items-center justify-center text-current",children:e}),t.jsx(c,{as:"span",variant:"label",weight:"semibold",className:"text-current",children:l})]})}export{d as A,o as p};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import{r as s,j as e}from"./floating-ui.react-dom-BWTnA00G.js";import{A as ae,T as b,F as re,c as _,M as w,x as ne,y as Y,B as Z,N as se,a0 as oe,q as P,g as Q,P as le,l as ie,h as ce}from"./note.api-D3oJmG3q.js";import{d as f,s as de,a as U}from"./time-D5LRMumI.js";import{N as me,C as he}from"./url-9nrbQs7Z.js";import{l as ue}from"./app-BpSMjzET.js";import{C as ge}from"./Callout-BTd1BYtV.js";import"./preload-helper-BXl3LOEh.js";import"./Graph-LY_IgMYy.js";const pe=new Map([["bold",s.createElement(s.Fragment,null,s.createElement("path",{d:"M216.49,79.52l-56-56A12,12,0,0,0,152,20H56A20,20,0,0,0,36,40V216a20,20,0,0,0,20,20H200a20,20,0,0,0,20-20V88A12,12,0,0,0,216.49,79.52ZM160,57l23,23H160ZM60,212V44h76V92a12,12,0,0,0,12,12h48V212Zm112-80a12,12,0,0,1-12,12H96a12,12,0,0,1,0-24h64A12,12,0,0,1,172,132Zm0,40a12,12,0,0,1-12,12H96a12,12,0,0,1,0-24h64A12,12,0,0,1,172,172Z"}))],["duotone",s.createElement(s.Fragment,null,s.createElement("path",{d:"M208,88H152V32Z",opacity:"0.2"}),s.createElement("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Zm-32-80a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,136Zm0,32a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,168Z"}))],["fill",s.createElement(s.Fragment,null,s.createElement("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,176H96a8,8,0,0,1,0-16h64a8,8,0,0,1,0,16Zm0-32H96a8,8,0,0,1,0-16h64a8,8,0,0,1,0,16Zm-8-56V44l44,44Z"}))],["light",s.createElement(s.Fragment,null,s.createElement("path",{d:"M212.24,83.76l-56-56A6,6,0,0,0,152,26H56A14,14,0,0,0,42,40V216a14,14,0,0,0,14,14H200a14,14,0,0,0,14-14V88A6,6,0,0,0,212.24,83.76ZM158,46.48,193.52,82H158ZM200,218H56a2,2,0,0,1-2-2V40a2,2,0,0,1,2-2h90V88a6,6,0,0,0,6,6h50V216A2,2,0,0,1,200,218Zm-34-82a6,6,0,0,1-6,6H96a6,6,0,0,1,0-12h64A6,6,0,0,1,166,136Zm0,32a6,6,0,0,1-6,6H96a6,6,0,0,1,0-12h64A6,6,0,0,1,166,168Z"}))],["regular",s.createElement(s.Fragment,null,s.createElement("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Zm-32-80a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,136Zm0,32a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,168Z"}))],["thin",s.createElement(s.Fragment,null,s.createElement("path",{d:"M210.83,85.17l-56-56A4,4,0,0,0,152,28H56A12,12,0,0,0,44,40V216a12,12,0,0,0,12,12H200a12,12,0,0,0,12-12V88A4,4,0,0,0,210.83,85.17ZM156,41.65,198.34,84H156ZM200,220H56a4,4,0,0,1-4-4V40a4,4,0,0,1,4-4h92V88a4,4,0,0,0,4,4h52V216A4,4,0,0,1,200,220Zm-36-84a4,4,0,0,1-4,4H96a4,4,0,0,1,0-8h64A4,4,0,0,1,164,136Zm0,32a4,4,0,0,1-4,4H96a4,4,0,0,1,0-8h64A4,4,0,0,1,164,168Z"}))]]),B=s.forwardRef((a,t)=>s.createElement(ae,{ref:t,...a,weights:pe}));B.displayName="FileTextIcon";const xe=B,ye=({day:a,cellClassName:t,dayNumberClassName:r,isCurrentMonth:i,items:l,overflowCount:c,onOpenOverflow:h})=>e.jsxs("div",{className:`min-h-[196px] rounded-[16px] border p-2.5 ${t}`.trim(),children:[e.jsx("div",{className:"mb-2.5 flex justify-end",children:e.jsx(b,{as:"span",variant:"label",className:`flex h-7 w-7 items-center justify-center rounded-[10px] ${r}`.trim(),children:a})}),i&&l.length>0?e.jsxs("div",{className:"flex flex-col gap-1.5",children:[l,c>0?e.jsxs("button",{type:"button",onClick:h,className:"focus-ring-soft w-full rounded-[10px] border border-dashed border-border-subtle/70 bg-subtle/70 py-1 text-center text-micro font-semibold text-fg-tertiary outline-none transition-colors hover:border-border-secondary/70 hover:bg-hover-subtle hover:text-fg-secondary",children:["+",c," more"]}):null]}):null]}),K=({params:a,toneClassName:t="",header:r,title:i,meta:l,titleClassName:c=""})=>e.jsx(re,{to:me,params:a,className:"focus-ring-soft group block rounded-[8px] outline-none",children:e.jsxs("div",{className:_("flex items-start gap-1.5 rounded-[8px] px-1.5 py-1 transition-colors group-hover:bg-hover-subtle",t),children:[r?e.jsx("span",{className:"mt-[2px] flex h-4 w-4 shrink-0 items-center justify-center text-fg-tertiary",children:r}):e.jsx("span",{"aria-hidden":"true",className:"mt-[6px] h-1.5 w-1.5 shrink-0 rounded-full bg-fg-placeholder"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx(b,{as:"div",variant:"label",weight:"medium",tone:"secondary",className:_("line-clamp-1",c),children:i}),l?e.jsx(b,{as:"div",variant:"micro",weight:"medium",tone:"tertiary",className:"mt-0.5",children:l}):null]})]})}),fe=({note:a,type:t})=>e.jsx(K,{params:{id:a.id},header:e.jsx(xe,{size:12}),title:a.title,meta:f(Number(t==="create"?a.createdAt:a.updatedAt)).format("HH:mm")}),be=({reminder:a})=>e.jsx(K,{params:{id:String(a.note?.id??a.noteId)},header:e.jsx(de,{size:12}),title:a.content||a.note?.title||"No title",titleClassName:a.completed?"line-through":"",meta:f(Number(a.reminderDate)).format("HH:mm")}),k=3,q=(a,t)=>a.map(r=>r.type==="note"?e.jsx(fe,{note:r.item,type:t},`note-${r.item.id}`):e.jsx(be,{reminder:r.item},`reminder-${r.item.id}`)),je=({year:a,month:t,day:r,isCurrentMonth:i,isSunday:l,isToday:c,isPast:h,notes:u,reminders:g,type:M})=>{const[v,N]=s.useState(!1),x=s.useMemo(()=>{const n=u.map(m=>({type:"note",item:m})),d=g.map(m=>({type:"reminder",item:m}));return h?[...n,...d]:[...d,...n]},[h,u,g]),D=x.length>k,C=s.useMemo(()=>q(x.slice(0,k),M),[x,M]),E=s.useMemo(()=>q(x,M),[x,M]),R=s.useCallback(()=>N(!0),[]),A=s.useCallback(()=>N(!1),[]),S=()=>i?c?"border-border-secondary/70 bg-[color:color-mix(in_srgb,var(--surface)_88%,var(--accent-soft-primary)_12%)]":"bg-surface border-border-subtle":"bg-muted/18 border-border-subtle/70",$=()=>c?"bg-cta text-fg-on-filled font-semibold":i?l?"text-fg-weekend font-bold":"text-fg-secondary font-bold":"text-fg-disabled opacity-55";return e.jsxs(e.Fragment,{children:[e.jsx(ye,{day:r,cellClassName:S(),dayNumberClassName:$(),isCurrentMonth:i,items:C,overflowCount:D?x.length-k:0,onOpenOverflow:R}),D&&e.jsxs(w,{isOpen:v,onClose:A,variant:"inspect",children:[e.jsx(w.Header,{title:`${a}/${String(t).padStart(2,"0")}/${String(r).padStart(2,"0")}`,onClose:A}),e.jsxs(w.Body,{children:[e.jsxs(w.Description,{className:"sr-only",children:["View all notes and reminders scheduled for day ",r,"."]}),e.jsx("div",{className:"flex max-h-[60vh] flex-col gap-2 overflow-y-auto",children:E})]})]})]})},Me=s.memo(je),Ne=["January","February","March","April","May","June","July","August","September","October","November","December"],ve=({month:a,year:t,type:r,onPrevMonth:i,onNextMonth:l,onToday:c,onTypeChange:h})=>e.jsxs("div",{className:"flex flex-col gap-4 lg:flex-row lg:items-end lg:justify-between",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("div",{className:"flex flex-wrap items-end gap-x-2.5 gap-y-1",children:[e.jsx(b,{as:"h1",variant:"display",weight:"bold",tracking:"tighter",className:"text-2xl leading-none sm:text-[2.15rem]",children:Ne[a-1]}),e.jsx(b,{as:"span",variant:"subheading",weight:"medium",tone:"secondary",tracking:"tight",className:"pb-0.5",children:t})]}),e.jsx(b,{as:"p",variant:"meta",weight:"medium",tone:"secondary",children:"Track note activity and reminders across the month"})]}),e.jsx("div",{className:"flex lg:justify-end",children:e.jsxs("div",{className:"surface-base inline-flex flex-wrap items-center gap-3 rounded-[16px] px-3.5 py-2.5",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ue,{className:"h-4 w-4 shrink-0 text-fg-tertiary"}),e.jsx(b,{id:"calendar-note-date-label",as:"span",variant:"label",weight:"medium",tone:"tertiary",children:"Note date"}),e.jsxs(ne,{value:r,"aria-labelledby":"calendar-note-date-label",onValueChange:g=>h(g),variant:"ghost",size:"sm",children:[e.jsx(Y,{value:"create",children:"Created"}),e.jsx(Y,{value:"update",children:"Updated"})]})]}),e.jsx("div",{className:"h-5 w-px bg-divider"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(Z,{variant:"ghost",size:"sm",onClick:c,children:"Today"}),e.jsx(Z,{variant:"ghost",size:"icon-sm","aria-label":"Previous month",onClick:i,children:e.jsx(se,{width:18,height:18})}),e.jsx(Z,{variant:"ghost",size:"icon-sm","aria-label":"Next month",onClick:l,children:e.jsx(oe,{width:18,height:18})})]})]})})]}),De=`
|
|
2
|
+
query NotesInDateRange($dateRange: DateRangeInput) {
|
|
3
|
+
notesInDateRange(dateRange: $dateRange) {
|
|
4
|
+
id
|
|
5
|
+
title
|
|
6
|
+
createdAt
|
|
7
|
+
updatedAt
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
`,Ae=`
|
|
11
|
+
query RemindersInDateRange($dateRange: DateRangeInput) {
|
|
12
|
+
remindersInDateRange(dateRange: $dateRange) {
|
|
13
|
+
id
|
|
14
|
+
noteId
|
|
15
|
+
reminderDate
|
|
16
|
+
completed
|
|
17
|
+
priority
|
|
18
|
+
content
|
|
19
|
+
note {
|
|
20
|
+
id
|
|
21
|
+
title
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
`,He=async a=>{const t=await Q(De,{dateRange:a});if(t.type==="error")throw t;return t.notesInDateRange},we=async a=>{const t=await Q(Ae,{dateRange:a});if(t.type==="error")throw t;return t.remindersInDateRange},Ce=({year:a,month:t})=>{const r=`${a}-${String(t).padStart(2,"0")}-01`,i=t===12?1:t+1,c=`${t===12?a+1:a}-${String(i).padStart(2,"0")}-01`,h={start:r,end:c},u=U({queryKey:P.calendar.notesInDateRange(a,t),queryFn:()=>He(h)}),g=U({queryKey:P.reminders.inDateRange(a,t),queryFn:()=>we(h)});return{notes:u.data??[],reminders:g.data??[],isLoading:u.isLoading||g.isLoading,isError:u.isError||g.isError}},Ee=["SUN","MON","TUE","WED","THU","FRI","SAT"],Re=[],Se=[],z=ce(he);function Le(){const a=z.useNavigate(),{year:t,month:r,type:i}=z.useSearch(),l=s.useRef(null),c=s.useRef(!1),h=s.useRef(0),u=s.useRef(0),g=s.useCallback(n=>{c.current=!0,h.current=n.pageX-(l.current?.offsetLeft??0),u.current=l.current?.scrollLeft??0,l.current&&(l.current.style.cursor="grabbing",l.current.style.userSelect="none")},[]),M=s.useCallback(n=>{if(!c.current||!l.current)return;n.preventDefault();const m=(n.pageX-l.current.offsetLeft-h.current)*1.2;l.current.scrollLeft=u.current-m},[]),v=s.useCallback(()=>{c.current=!1,l.current&&(l.current.style.cursor="grab",l.current.style.userSelect="")},[]),{notes:N,reminders:x,isLoading:D,isError:C}=Ce({year:t,month:r}),E=s.useMemo(()=>{const n=f(),d=`${n.year()}-${n.month()+1}-${n.date()}`,m=new Map;for(const o of N){const y=i==="create"?f(Number(o.createdAt)):f(Number(o.updatedAt)),p=`${y.year()}-${y.month()+1}-${y.date()}`,j=m.get(p)||[];j.push(o),m.set(p,j)}const V=new Map;for(const o of x){const y=f(Number(o.reminderDate)),p=`${y.year()}-${y.month()+1}-${y.date()}`,j=V.get(p)||[];j.push(o),V.set(p,j)}const W=new Date(t,r-1,1),X=new Date(t,r,0),I=W.getDay(),T=X.getDate(),H=[],O=r===1?12:r-1,F=r===1?t-1:t,J=new Date(F,O,0).getDate();for(let o=I-1;o>=0;o--)H.push({day:J-o,isCurrentMonth:!1,year:F,month:O});for(let o=1;o<=T;o++)H.push({day:o,isCurrentMonth:!0,year:t,month:r});const L=(I+T)%7,G=L===0?0:7-L,ee=r===12?1:r+1,te=r===12?t+1:t;for(let o=1;o<=G;o++)H.push({day:o,isCurrentMonth:!1,year:te,month:ee});return H.map((o,y)=>{const p=`${o.year}-${o.month}-${o.day}`,j=f(`${o.year}-${String(o.month).padStart(2,"0")}-${String(o.day).padStart(2,"0")}`);return{key:p,year:o.year,month:o.month,day:o.day,isCurrentMonth:o.isCurrentMonth,isSunday:y%7===0,isToday:p===d,isPast:j.isBefore(n,"day"),notes:m.get(p)||Re,reminders:V.get(p)||Se}})},[t,r,N,x,i]),R=()=>{const n=r===1?12:r-1,d=r===1?t-1:t;a({search:m=>({...m,month:n,year:d})})},A=()=>{const n=r===12?1:r+1,d=r===12?t+1:t;a({search:m=>({...m,month:n,year:d})})},S=()=>{a({search:n=>({...n,month:f().month()+1,year:f().year()})})},$=n=>{n&&a({search:d=>({...d,type:n})})};return e.jsx(le,{title:"Calendar",variant:"none",children:C?e.jsx(ge,{children:"Failed to load calendar data. Please try again later."}):e.jsxs("div",{className:"surface-base",children:[e.jsx("div",{className:"border-b border-border-subtle/80 px-4 py-4 sm:px-5",children:e.jsx(ve,{month:r,year:t,type:i,onPrevMonth:R,onNextMonth:A,onToday:S,onTypeChange:$})}),e.jsx("div",{ref:l,className:"cursor-grab overflow-x-auto px-4 pb-4 pt-3 sm:px-5",onMouseDown:g,onMouseMove:M,onMouseUp:v,onMouseLeave:v,children:e.jsxs("div",{className:"min-w-[1260px]",children:[e.jsx("div",{className:"mb-2.5 grid grid-cols-7 gap-1.5",children:Ee.map((n,d)=>e.jsx(b,{as:"div",variant:"label",weight:"semibold",tracking:"wider",transform:"uppercase",className:`py-2 text-center ${d===0?"text-fg-weekend":"text-fg-tertiary"}`,children:n},n))}),D?e.jsx("div",{className:"grid grid-cols-7 gap-1.5",children:Array.from({length:35}).map((n,d)=>e.jsx(ie,{height:180},d))}):e.jsx("div",{className:"grid grid-cols-7 gap-1.5",children:E.map(n=>e.jsx(Me,{year:n.year,month:n.month,day:n.day,isCurrentMonth:n.isCurrentMonth,isSunday:n.isSunday,isToday:n.isToday,isPast:n.isPast,notes:n.notes,reminders:n.reminders,type:i},n.key))})]})})]})})}export{Le as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e,j as n}from"./floating-ui.react-dom-
|
|
1
|
+
import{r as e,j as n}from"./floating-ui.react-dom-BWTnA00G.js";import{A as m,T as d}from"./note.api-D3oJmG3q.js";const p=new Map([["bold",e.createElement(e.Fragment,null,e.createElement("path",{d:"M108,84a16,16,0,1,1,16,16A16,16,0,0,1,108,84Zm128,44A108,108,0,1,1,128,20,108.12,108.12,0,0,1,236,128Zm-24,0a84,84,0,1,0-84,84A84.09,84.09,0,0,0,212,128Zm-72,36.68V132a20,20,0,0,0-20-20,12,12,0,0,0-4,23.32V168a20,20,0,0,0,20,20,12,12,0,0,0,4-23.32Z"}))],["duotone",e.createElement(e.Fragment,null,e.createElement("path",{d:"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",opacity:"0.2"}),e.createElement("path",{d:"M144,176a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176Zm88-48A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128ZM124,96a12,12,0,1,0-12-12A12,12,0,0,0,124,96Z"}))],["fill",e.createElement(e.Fragment,null,e.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm-4,48a12,12,0,1,1-12,12A12,12,0,0,1,124,72Zm12,112a16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40a8,8,0,0,1,0,16Z"}))],["light",e.createElement(e.Fragment,null,e.createElement("path",{d:"M142,176a6,6,0,0,1-6,6,14,14,0,0,1-14-14V128a2,2,0,0,0-2-2,6,6,0,0,1,0-12,14,14,0,0,1,14,14v40a2,2,0,0,0,2,2A6,6,0,0,1,142,176ZM124,94a10,10,0,1,0-10-10A10,10,0,0,0,124,94Zm106,34A102,102,0,1,1,128,26,102.12,102.12,0,0,1,230,128Zm-12,0a90,90,0,1,0-90,90A90.1,90.1,0,0,0,218,128Z"}))],["regular",e.createElement(e.Fragment,null,e.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z"}))],["thin",e.createElement(e.Fragment,null,e.createElement("path",{d:"M140,176a4,4,0,0,1-4,4,12,12,0,0,1-12-12V128a4,4,0,0,0-4-4,4,4,0,0,1,0-8,12,12,0,0,1,12,12v40a4,4,0,0,0,4,4A4,4,0,0,1,140,176ZM124,92a8,8,0,1,0-8-8A8,8,0,0,0,124,92Zm104,36A100,100,0,1,1,128,28,100.11,100.11,0,0,1,228,128Zm-8,0a92,92,0,1,0-92,92A92.1,92.1,0,0,0,220,128Z"}))]]),g=new Map([["bold",e.createElement(e.Fragment,null,e.createElement("path",{d:"M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20Zm0,192a84,84,0,1,1,84-84A84.09,84.09,0,0,1,128,212Zm-12-80V80a12,12,0,0,1,24,0v52a12,12,0,0,1-24,0Zm28,40a16,16,0,1,1-16-16A16,16,0,0,1,144,172Z"}))],["duotone",e.createElement(e.Fragment,null,e.createElement("path",{d:"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",opacity:"0.2"}),e.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm-8-80V80a8,8,0,0,1,16,0v56a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,172Z"}))],["fill",e.createElement(e.Fragment,null,e.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm-8,56a8,8,0,0,1,16,0v56a8,8,0,0,1-16,0Zm8,104a12,12,0,1,1,12-12A12,12,0,0,1,128,184Z"}))],["light",e.createElement(e.Fragment,null,e.createElement("path",{d:"M128,26A102,102,0,1,0,230,128,102.12,102.12,0,0,0,128,26Zm0,192a90,90,0,1,1,90-90A90.1,90.1,0,0,1,128,218Zm-6-82V80a6,6,0,0,1,12,0v56a6,6,0,0,1-12,0Zm16,36a10,10,0,1,1-10-10A10,10,0,0,1,138,172Z"}))],["regular",e.createElement(e.Fragment,null,e.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm-8-80V80a8,8,0,0,1,16,0v56a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,172Z"}))],["thin",e.createElement(e.Fragment,null,e.createElement("path",{d:"M128,28A100,100,0,1,0,228,128,100.11,100.11,0,0,0,128,28Zm0,192a92,92,0,1,1,92-92A92.1,92.1,0,0,1,128,220Zm-4-84V80a4,4,0,0,1,8,0v56a4,4,0,0,1-8,0Zm12,36a8,8,0,1,1-8-8A8,8,0,0,1,136,172Z"}))]]),l=e.forwardRef((a,t)=>e.createElement(m,{ref:t,...a,weights:p}));l.displayName="InfoIcon";const E=l,c=e.forwardRef((a,t)=>e.createElement(m,{ref:t,...a,weights:g}));c.displayName="WarningCircleIcon";const i=c,M=({children:a,className:t="",tone:r="info"})=>{const o=r==="danger"?i:E,Z=r==="danger"?"border-border-error/70 bg-accent-soft-danger/60":"border-border-subtle bg-hover-subtle/50",s=r==="danger"?"text-fg-error":"text-fg-tertiary",A=r==="danger"?"error":"secondary";return n.jsxs("div",{className:`flex items-center gap-2.5 rounded-[12px] border px-4 py-3 ${Z} ${t}`,children:[n.jsx(o,{className:`h-4 w-4 shrink-0 ${s}`}),n.jsx(d,{as:"div",variant:"meta",weight:"medium",tone:A,children:a})]})};export{M as C,E as c,i as m};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./floating-ui.react-dom-
|
|
1
|
+
import{r as e}from"./floating-ui.react-dom-BWTnA00G.js";import{A as V}from"./note.api-D3oJmG3q.js";const n=new Map([["bold",e.createElement(e.Fragment,null,e.createElement("path",{d:"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z"}))],["duotone",e.createElement(e.Fragment,null,e.createElement("path",{d:"M216,40V168H168V88H88V40Z",opacity:"0.2"}),e.createElement("path",{d:"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z"}))],["fill",e.createElement(e.Fragment,null,e.createElement("path",{d:"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32Zm-8,128H176V88a8,8,0,0,0-8-8H96V48H208Z"}))],["light",e.createElement(e.Fragment,null,e.createElement("path",{d:"M216,34H88a6,6,0,0,0-6,6V82H40a6,6,0,0,0-6,6V216a6,6,0,0,0,6,6H168a6,6,0,0,0,6-6V174h42a6,6,0,0,0,6-6V40A6,6,0,0,0,216,34ZM162,210H46V94H162Zm48-48H174V88a6,6,0,0,0-6-6H94V46H210Z"}))],["regular",e.createElement(e.Fragment,null,e.createElement("path",{d:"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z"}))],["thin",e.createElement(e.Fragment,null,e.createElement("path",{d:"M216,36H88a4,4,0,0,0-4,4V84H40a4,4,0,0,0-4,4V216a4,4,0,0,0,4,4H168a4,4,0,0,0,4-4V172h44a4,4,0,0,0,4-4V40A4,4,0,0,0,216,36ZM164,212H44V92H164Zm48-48H172V88a4,4,0,0,0-4-4H92V44H212Z"}))]]),a=e.forwardRef((t,H)=>e.createElement(V,{ref:H,...t,weights:n}));a.displayName="CopyIcon";const m=a;export{m as s};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./floating-ui.react-dom-BWTnA00G.js";import{A as n}from"./note.api-D3oJmG3q.js";const r=new Map([["bold",e.createElement(e.Fragment,null,e.createElement("path",{d:"M216.49,79.52l-56-56A12,12,0,0,0,152,20H56A20,20,0,0,0,36,40V216a20,20,0,0,0,20,20H200a20,20,0,0,0,20-20V88A12,12,0,0,0,216.49,79.52ZM160,57l23,23H160ZM60,212V44h76V92a12,12,0,0,0,12,12h48V212Z"}))],["duotone",e.createElement(e.Fragment,null,e.createElement("path",{d:"M208,88H152V32Z",opacity:"0.2"}),e.createElement("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Z"}))],["fill",e.createElement(e.Fragment,null,e.createElement("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM152,88V44l44,44Z"}))],["light",e.createElement(e.Fragment,null,e.createElement("path",{d:"M212.24,83.76l-56-56A6,6,0,0,0,152,26H56A14,14,0,0,0,42,40V216a14,14,0,0,0,14,14H200a14,14,0,0,0,14-14V88A6,6,0,0,0,212.24,83.76ZM158,46.48,193.52,82H158ZM200,218H56a2,2,0,0,1-2-2V40a2,2,0,0,1,2-2h90V88a6,6,0,0,0,6,6h50V216A2,2,0,0,1,200,218Z"}))],["regular",e.createElement(e.Fragment,null,e.createElement("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Z"}))],["thin",e.createElement(e.Fragment,null,e.createElement("path",{d:"M210.83,85.17l-56-56A4,4,0,0,0,152,28H56A12,12,0,0,0,44,40V216a12,12,0,0,0,12,12H200a12,12,0,0,0,12-12V88A4,4,0,0,0,210.83,85.17ZM156,41.65,198.34,84H156ZM200,220H56a4,4,0,0,1-4-4V40a4,4,0,0,1,4-4h92V88a4,4,0,0,0,4,4h52V216A4,4,0,0,1,200,220Z"}))]]),a=e.forwardRef((t,l)=>e.createElement(n,{ref:l,...t,weights:r}));a.displayName="FileIcon";const H=a;export{H as s};
|