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.
Files changed (244) hide show
  1. package/README.md +2 -0
  2. package/dist/mcp.js +103 -105
  3. package/package.json +3 -2
  4. package/server/client/dist/assets/{ArrowRight.es-g2YZTklZ.js → ArrowRight.es-BEhnlwfe.js} +1 -1
  5. package/server/client/dist/assets/AuxiliaryPanelHeader-B1k7pZpn.js +1 -0
  6. package/server/client/dist/assets/Calendar-D7QJsAlg.js +25 -0
  7. package/server/client/dist/assets/{Callout-B_IPSF_5.js → Callout-BTd1BYtV.js} +1 -1
  8. package/server/client/dist/assets/{Copy.es-CNxe4ujr.js → Copy.es-BoLjilxv.js} +1 -1
  9. package/server/client/dist/assets/File.es-Ct7fscBg.js +1 -0
  10. package/server/client/dist/assets/Graph-DYUb7gQb.js +46 -0
  11. package/server/client/dist/assets/{Graph-D9GeO71k.js → Graph-LY_IgMYy.js} +1 -1
  12. package/server/client/dist/assets/{Image.es-DnON8cv2.js → Image.es-OYyN3BYt.js} +1 -1
  13. package/server/client/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  14. package/server/client/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  15. package/server/client/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  16. package/server/client/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  17. package/server/client/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  18. package/server/client/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  19. package/server/client/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  20. package/server/client/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  21. package/server/client/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  22. package/server/client/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  23. package/server/client/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  24. package/server/client/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  25. package/server/client/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  26. package/server/client/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  27. package/server/client/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  28. package/server/client/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  29. package/server/client/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  30. package/server/client/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  31. package/server/client/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  32. package/server/client/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  33. package/server/client/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  34. package/server/client/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  35. package/server/client/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  36. package/server/client/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  37. package/server/client/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  38. package/server/client/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  39. package/server/client/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  40. package/server/client/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  41. package/server/client/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  42. package/server/client/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  43. package/server/client/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  44. package/server/client/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  45. package/server/client/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  46. package/server/client/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  47. package/server/client/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  48. package/server/client/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  49. package/server/client/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  50. package/server/client/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  51. package/server/client/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  52. package/server/client/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  53. package/server/client/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  54. package/server/client/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  55. package/server/client/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  56. package/server/client/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  57. package/server/client/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  58. package/server/client/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  59. package/server/client/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  60. package/server/client/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  61. package/server/client/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  62. package/server/client/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  63. package/server/client/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  64. package/server/client/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  65. package/server/client/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  66. package/server/client/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  67. package/server/client/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  68. package/server/client/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  69. package/server/client/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  70. package/server/client/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  71. package/server/client/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  72. package/server/client/dist/assets/Note-DsMhwrHw.js +25 -0
  73. package/server/client/dist/assets/NotePropertiesPanel-aCKXAe5F.js +2 -0
  74. package/server/client/dist/assets/PencilLine.es-0JpEgxFY.js +1 -0
  75. package/server/client/dist/assets/{Plus.es-CQ8wn2is.js → Plus.es-DRfLW_bI.js} +1 -1
  76. package/server/client/dist/assets/Reminders-COr1OHvF.js +1 -0
  77. package/server/client/dist/assets/Search-Ctkx0BQk.js +31 -0
  78. package/server/client/dist/assets/SurfaceCard-t7pdfhEe.js +1 -0
  79. package/server/client/dist/assets/Tag-BjxtrIQW.js +1 -0
  80. package/server/client/dist/assets/TagNotes-DV_fdRbg.js +1 -0
  81. package/server/client/dist/assets/{Trash.es-0aPpA-3S.js → Trash.es-Bo1VyK9Q.js} +1 -1
  82. package/server/client/dist/assets/ViewChip-DlCkL4z4.js +1 -0
  83. package/server/client/dist/assets/ViewNotes-wWWeFJyU.js +1 -0
  84. package/server/client/dist/assets/ViewSectionDialog-DhH8harC.js +102 -0
  85. package/server/client/dist/assets/Views-CWE99SnI.js +1 -0
  86. package/server/client/dist/assets/abnfDiagram-VRR7QNED-CWlV5dXw.js +1 -0
  87. package/server/client/dist/assets/app-B9WZRrAH.css +1 -0
  88. package/server/client/dist/assets/app-BpSMjzET.js +26 -0
  89. package/server/client/dist/assets/arc-BV-n6RUX.js +1 -0
  90. package/server/client/dist/assets/architectureDiagram-ZJ3FMSHR-CekzMXdu.js +36 -0
  91. package/server/client/dist/assets/blockDiagram-677ZJIJ3-B49yHoxq.js +132 -0
  92. package/server/client/dist/assets/c4Diagram-LMCZKHZV-0AfB9NBC.js +10 -0
  93. package/server/client/dist/assets/channel-CigOulR-.js +1 -0
  94. package/server/client/dist/assets/chunk-2Q5K7J3B-DaPQAU1q.js +1 -0
  95. package/server/client/dist/assets/chunk-32BRIVSS-CfL3kZAg.js +1 -0
  96. package/server/client/dist/assets/chunk-5VM5RSS4-DeOwWPE_.js +15 -0
  97. package/server/client/dist/assets/chunk-EX3LRPZG-C3W1oc9y.js +231 -0
  98. package/server/client/dist/assets/chunk-JWPE2WC7-_Oqh79OY.js +1 -0
  99. package/server/client/dist/assets/chunk-MOJQB5TN-DDKNNzI6.js +88 -0
  100. package/server/client/dist/assets/chunk-RYQCIY6F-DCHah7CC.js +1 -0
  101. package/server/client/dist/assets/chunk-V7JOEXUC-uUOIzgxj.js +206 -0
  102. package/server/client/dist/assets/chunk-VR4S4FIN-DDVw2WPs.js +1 -0
  103. package/server/client/dist/assets/chunk-XXDRQBXY-Coo4UFm2.js +1 -0
  104. package/server/client/dist/assets/classDiagram-OUVF2IWQ-D13ISIOW.js +1 -0
  105. package/server/client/dist/assets/classDiagram-v2-EOCWNBFH-D13ISIOW.js +1 -0
  106. package/server/client/dist/assets/colors-Cc3OSVma.js +1 -0
  107. package/server/client/dist/assets/cose-bilkent-JH36ORCC-C3pHmHpD.js +1 -0
  108. package/server/client/dist/assets/cynefin-VYW2F7L2-DU_G4Atc.js +166 -0
  109. package/server/client/dist/assets/cynefinDiagram-TSTJHNR4-DZ6iiJFo.js +62 -0
  110. package/server/client/dist/assets/cytoscape.esm-D3_iZ_3b.js +321 -0
  111. package/server/client/dist/assets/dagre-VKFMJZFB-DNELbhwC.js +4 -0
  112. package/server/client/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  113. package/server/client/dist/assets/diagram-FQU43EPY-CMEvZJ61.js +3 -0
  114. package/server/client/dist/assets/diagram-G47NLZAW-BYDtf6j9.js +24 -0
  115. package/server/client/dist/assets/diagram-NH7WQ7WH-CmXfcCQA.js +24 -0
  116. package/server/client/dist/assets/diagram-OA4YK3LP-BflTKJxU.js +30 -0
  117. package/server/client/dist/assets/diagram-WEI45ONY-KW3fKqna.js +41 -0
  118. package/server/client/dist/assets/ebnfDiagram-CCIWWBDH-CbyhY5Nj.js +1 -0
  119. package/server/client/dist/assets/erDiagram-Q63AITRT-CC2eZV8g.js +85 -0
  120. package/server/client/dist/assets/{floating-ui.react-dom-wWLZ1CdM.js → floating-ui.react-dom-BWTnA00G.js} +1 -1
  121. package/server/client/dist/assets/flowDiagram-23GEKE2U-unplo7Qm.js +156 -0
  122. package/server/client/dist/assets/ganttDiagram-NO4QXBWP-BcBK5HcZ.js +292 -0
  123. package/server/client/dist/assets/gitGraphDiagram-IHSO6WYX-DgVbbb5k.js +106 -0
  124. package/server/client/dist/assets/graph-C5DFNLrC.js +1 -0
  125. package/server/client/dist/assets/image-delete-confirmation-D7xrODQV.js +1 -0
  126. package/server/client/dist/assets/image.api-CyQisInP.js +17 -0
  127. package/server/client/dist/assets/index-B-E1Ilh9.js +1 -0
  128. package/server/client/dist/assets/infoDiagram-FWYZ7A6U-N_D9RdfG.js +2 -0
  129. package/server/client/dist/assets/init-Gi6I4Gst.js +1 -0
  130. package/server/client/dist/assets/isObject-U9U2HXiq.js +1 -0
  131. package/server/client/dist/assets/ishikawaDiagram-FXEZZL3T-BBKrzmB2.js +70 -0
  132. package/server/client/dist/assets/journeyDiagram-5HDEW3XC-NdCxLmQB.js +139 -0
  133. package/server/client/dist/assets/kanban-definition-HUTT4EX6-Ck7t4-tt.js +89 -0
  134. package/server/client/dist/assets/katex-DywYRkvg.css +1 -0
  135. package/server/client/dist/assets/katex-HP8lGamR.js +257 -0
  136. package/server/client/dist/assets/katex-x288kqHd.js +257 -0
  137. package/server/client/dist/assets/layout-Cz0MDlGi.js +1 -0
  138. package/server/client/dist/assets/linear-D6yRgDLq.js +1 -0
  139. package/server/client/dist/assets/manage-image-azmo5iVw.js +1 -0
  140. package/server/client/dist/assets/manage-image-detail-BF-uSqb_.js +1 -0
  141. package/server/client/dist/assets/map-Mm1V-_Na.js +1 -0
  142. package/server/client/dist/assets/{mcp-CT_9IV2c.js → mcp-CCaFd0zm.js} +4 -4
  143. package/server/client/dist/assets/{mcp-admin-adapter-xAuyZc_M.js → mcp-admin-adapter-PMmgPupc.js} +1 -1
  144. package/server/client/dist/assets/mermaid.core-B14ZAmWA.js +308 -0
  145. package/server/client/dist/assets/min-tv6RD-6E.js +1 -0
  146. package/server/client/dist/assets/mindmap-definition-LN4V7U3C-BTUqSdcP.js +96 -0
  147. package/server/client/dist/assets/{note-core-Buwzyxi7.js → note-core-DUTqUh5N.js} +2 -2
  148. package/server/client/dist/assets/{note-runtime-CPDVOFEo.js → note-runtime-zN5ddTba.js} +1 -1
  149. package/server/client/dist/assets/{note-ui-CHI-tzj-.js → note-ui-CtijppHK.js} +1 -1
  150. package/server/client/dist/assets/{note.api-D_00ZzJC.js → note.api-D3oJmG3q.js} +6 -6
  151. package/server/client/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  152. package/server/client/dist/assets/pegDiagram-2B236MQR-Cjcu3mVz.js +1 -0
  153. package/server/client/dist/assets/pieDiagram-ENE6RG2P-BxI_c22Z.js +39 -0
  154. package/server/client/dist/assets/{placeholder-DbdGiYGL.js → placeholder-AusSo8p9.js} +4 -4
  155. package/server/client/dist/assets/properties-BrNJLkxR.js +1 -0
  156. package/server/client/dist/assets/quadrantDiagram-ABIIQ3AL-DGm0a-yR.js +7 -0
  157. package/server/client/dist/assets/railroadDiagram-RFXS5EU6-DmCDu89O.js +1 -0
  158. package/server/client/dist/assets/requirementDiagram-TGXJPOKE-CBpUt7Ig.js +84 -0
  159. package/server/client/dist/assets/route-preload.js +2 -2
  160. package/server/client/dist/assets/sankeyDiagram-HTMAVEWB-BjGnDZlp.js +40 -0
  161. package/server/client/dist/assets/search-D-xKTPdO.js +1 -0
  162. package/server/client/dist/assets/search-admin-adapter-CJnJmL6w.js +1 -0
  163. package/server/client/dist/assets/sequenceDiagram-DBY2YBRQ-B7rpCfS6.js +162 -0
  164. package/server/client/dist/assets/sizeCapture-X5ZJPWSS-CUJhD0uW.js +1 -0
  165. package/server/client/dist/assets/stateDiagram-2N3HPSRC-Y9-3XqRX.js +1 -0
  166. package/server/client/dist/assets/stateDiagram-v2-6OUMAXLB-DbHXhT02.js +1 -0
  167. package/server/client/dist/assets/swimlanes-5IMT3BWC-Cs1NO9ng.js +2 -0
  168. package/server/client/dist/assets/swimlanesDiagram-G3AALYLV-DQnrq2ZC.js +8 -0
  169. package/server/client/dist/assets/{tag.api-CX0SE06J.js → tag.api-DNSQpqwk.js} +3 -3
  170. package/server/client/dist/assets/time-D5LRMumI.js +9 -0
  171. package/server/client/dist/assets/timeline-definition-FHXFAJF6-8fqD4WNL.js +120 -0
  172. package/server/client/dist/assets/toNumber-DE3J3kMD.js +1 -0
  173. package/server/client/dist/assets/transform-BUB79_za.js +1 -0
  174. package/server/client/dist/assets/trash-D4-9sv8q.js +1 -0
  175. package/server/client/dist/assets/url-9nrbQs7Z.js +1 -0
  176. package/server/client/dist/assets/{useReminderMutate-CLK1tHvT.js → useReminderMutate-BrGO9M0o.js} +4 -4
  177. package/server/client/dist/assets/vennDiagram-L72KCM5P-BPqKkd5a.js +34 -0
  178. package/server/client/dist/assets/wardleyDiagram-EHGQE667-Cq11kU2M.js +78 -0
  179. package/server/client/dist/assets/xychartDiagram-FW5EYKEG-DJ6UzFj-.js +7 -0
  180. package/server/client/dist/index.html +7 -7
  181. package/server/dist/features/image/services/delete.js +25 -1
  182. package/server/dist/features/note/graphql/note.field.resolver.js +2 -0
  183. package/server/dist/features/note/graphql/note.mutation.resolver.js +54 -23
  184. package/server/dist/features/note/graphql/note.query.resolver.js +15 -5
  185. package/server/dist/features/note/graphql/note.type-defs.js +2 -1
  186. package/server/dist/features/note/http/mcp.js +1 -60
  187. package/server/dist/features/note/services/authoring.js +17 -80
  188. package/server/dist/features/note/services/markdown-patch.js +80 -8
  189. package/server/dist/features/note/services/note-reference-index.js +98 -0
  190. package/server/dist/features/note/services/properties.js +21 -1
  191. package/server/dist/features/note/services/property-restore.js +26 -0
  192. package/server/dist/features/note/services/search.js +5 -0
  193. package/server/dist/features/note/services/snapshot.js +82 -58
  194. package/server/dist/features/note/services/trash.js +18 -31
  195. package/server/dist/features/note/services/write.js +10 -3
  196. package/server/dist/features/search/embedding-api-key-store.js +57 -0
  197. package/server/dist/features/search/embedding-client.js +179 -0
  198. package/server/dist/features/search/graphql/index.js +6 -0
  199. package/server/dist/features/search/graphql/resolver.js +32 -0
  200. package/server/dist/features/search/graphql/type-defs.js +37 -0
  201. package/server/dist/features/search/http/handlers.js +108 -0
  202. package/server/dist/features/search/hybrid-ranking.js +57 -0
  203. package/server/dist/features/search/hybrid-search.js +176 -0
  204. package/server/dist/features/search/note-change.js +16 -0
  205. package/server/dist/features/search/note-chunking.js +75 -0
  206. package/server/dist/features/search/related-notes.js +186 -0
  207. package/server/dist/features/search/search-config.js +150 -0
  208. package/server/dist/features/search/search-manager.js +431 -0
  209. package/server/dist/features/search/semantic-indexer.js +138 -0
  210. package/server/dist/features/search/sqlite-vector-index.js +636 -0
  211. package/server/dist/features/search/url-normalization.js +10 -0
  212. package/server/dist/features/tag/services/organization.js +3 -0
  213. package/server/dist/features/view/services/workspace.js +1 -1
  214. package/server/dist/main.js +12 -3
  215. package/server/dist/modules/blocknote.js +4 -5
  216. package/server/dist/paths.js +7 -2
  217. package/server/dist/routes/api.js +37 -0
  218. package/server/dist/routes/mcp.js +0 -5
  219. package/server/dist/schema/index.js +3 -0
  220. package/server/prisma/migrations/20260728090000_0019_note_reference_index/migration.sql +15 -0
  221. package/server/prisma/schema.prisma +16 -0
  222. package/server/client/dist/assets/Calendar-BP6HTuSn.js +0 -25
  223. package/server/client/dist/assets/Graph-Xha3fwhp.js +0 -46
  224. package/server/client/dist/assets/Image-BLEjLUqd.js +0 -1
  225. package/server/client/dist/assets/Note-DjrCYtat.js +0 -24
  226. package/server/client/dist/assets/NotePropertiesPanel-2DgXEM4B.js +0 -2
  227. package/server/client/dist/assets/Reminders-B4l3KdlK.js +0 -1
  228. package/server/client/dist/assets/Search-BN5sf7bE.js +0 -1
  229. package/server/client/dist/assets/SurfaceCard-BZm73nyS.js +0 -1
  230. package/server/client/dist/assets/Tag-oSnmViVp.js +0 -1
  231. package/server/client/dist/assets/TagNotes-BDTCcJcL.js +0 -1
  232. package/server/client/dist/assets/ViewNotes-CiZtGJNE.js +0 -1
  233. package/server/client/dist/assets/ViewSectionDialog-Ctl_694Y.js +0 -102
  234. package/server/client/dist/assets/Views-D-zlatYD.js +0 -1
  235. package/server/client/dist/assets/app-DmqIOMWF.css +0 -1
  236. package/server/client/dist/assets/app-cTRcKMGc.js +0 -26
  237. package/server/client/dist/assets/image.api-CVuuvTBk.js +0 -17
  238. package/server/client/dist/assets/index-DKJChPr4.js +0 -1
  239. package/server/client/dist/assets/manage-image-BZjaxp-f.js +0 -1
  240. package/server/client/dist/assets/manage-image-detail-DPv0FQ2m.js +0 -1
  241. package/server/client/dist/assets/properties-D447wsWk.js +0 -1
  242. package/server/client/dist/assets/time-B3pt8vt4.js +0 -9
  243. package/server/client/dist/assets/trash-8sH7EZgc.js +0 -1
  244. 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 z4 } from "zod";
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] or [#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] or [#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 = z4.enum(["and", "or"]);
374
- var propertyValueTypeSchema = z4.enum(["text", "url", "number", "date", "boolean", "select"]);
375
- var propertyFilterOperatorSchema = z4.enum(["equals", "before", "after", "exists", "notExists"]);
376
- var viewSortBySchema = z4.enum(["updatedAt", "createdAt", "title"]);
377
- var viewSortOrderSchema = z4.enum(["asc", "desc"]);
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 = z4.object({
392
- key: z4.string().describe("Property key from ocean_brain_list_properties, e.g. state"),
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: z4.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).")
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 graphql(serverUrl, token, `
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 registerMcpTools = (server, serverUrl, token) => {
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. Returns matching note titles and tags. Use ocean_brain_read_note to get full content for a specific note.",
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: z4.string().describe("Search keyword"),
473
- limit: z4.number().optional().default(10).describe("Max results (default: 10)")
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 graphql(serverUrl, token, `
477
- query ($searchFilter: SearchFilterInput, $pagination: PaginationInput) {
478
- allNotes(searchFilter: $searchFilter, pagination: $pagination) {
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
- contentAsMarkdown
485
+ contentPreview
486
486
  }
487
487
  }
488
488
  }
489
489
  `, {
490
- searchFilter: { query, sortBy: "updatedAt", sortOrder: "desc" },
491
- pagination: { limit, offset: 0 }
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: z4.string().describe("Note ID"),
509
- maxLength: z4.number().optional().default(1e3).describe("Max content length in characters. 0 for full content. (default: 1000)")
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 graphql(serverUrl, token, `
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: z4.string().describe("Note title"),
544
- markdown: z4.string().optional().default("").describe("Markdown body for the new note. In MCP markdown, tags must use [@tag] or [#tag]. Defaults to an empty note body."),
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 graphql(serverUrl, token, `
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: z4.string().optional().default("").describe("Optional property key/name search query"),
600
- limit: z4.number().optional().default(50).describe("Max results (default: 50, server max: 100)"),
601
- offset: z4.number().optional().default(0).describe("Pagination offset (default: 0)")
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 graphql(serverUrl, token, `
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: z4.string().describe("Tag name to inspect. You can pass @project or project."),
634
- limit: z4.number().optional().default(20).describe("Max results (default: 20)"),
635
- offset: z4.number().optional().default(0).describe("Pagination offset (default: 0)")
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 graphql(serverUrl, token, `
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: z4.array(z4.string()).min(1).describe("Tag names to inspect. You can pass @project or project values."),
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: z4.number().optional().default(20).describe("Max results (default: 20)"),
691
- offset: z4.number().optional().default(0).describe("Pagination offset (default: 0)")
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 graphql(serverUrl, token, `
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: z4.array(propertyFilterSchema).min(1).max(10).describe("Required property filters. Multiple property filters are combined with AND."),
761
- tagNames: z4.array(z4.string()).optional().default([]).describe("Optional tag filters. You can pass @project, #project, or project."),
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: z4.boolean().optional().default(false).describe("Include returned note properties. Defaults to false to reduce tokens."),
766
- propertyKeys: z4.array(z4.string()).optional().default([]).describe("Property keys to include in output; automatically includes properties."),
767
- limit: z4.number().optional().default(20).describe("Max results (default: 20, server max: 50)"),
768
- offset: z4.number().optional().default(0).describe("Pagination offset (default: 0)")
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 data = await graphql(serverUrl, token, `
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: z4.number().optional().default(10).describe("Max results (default: 10)")
813
+ limit: z3.number().optional().default(10).describe("Max results (default: 10)")
819
814
  },
820
815
  async ({ limit }) => {
821
- const data = await graphql(serverUrl, token, `
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: z4.string().optional().default("temp tmp draft test wip").describe("Keywords that mark a note as a cleanup candidate. Comma or space separated."),
852
- limit: z4.number().optional().default(20).describe("Max results (default: 20)"),
853
- offset: z4.number().optional().default(0).describe("Pagination offset (default: 0)")
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 graphql(serverUrl, token, `
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: z4.string().describe("Tag name to create. You can pass @project or project.")
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: z4.string().describe("Note ID to move to trash")
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.8.2",
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.8.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-wWLZ1CdM.js";import{R as r}from"./note.api-D_00ZzJC.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};
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-wWLZ1CdM.js";import{R as m,Z as d}from"./note.api-D_00ZzJC.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
+ 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-wWLZ1CdM.js";import{R as V}from"./note.api-D_00ZzJC.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};
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};