ocean-brain 0.8.1 → 0.10.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 (243) hide show
  1. package/README.md +115 -0
  2. package/dist/mcp.js +205 -294
  3. package/package.json +7 -6
  4. package/server/client/dist/assets/ArrowRight.es-Bm-ZXpEC.js +1 -0
  5. package/server/client/dist/assets/Calendar-BsNs3NzO.js +25 -0
  6. package/server/client/dist/assets/Callout-CviyPHKO.js +1 -0
  7. package/server/client/dist/assets/Copy.es-BPreRnP9.js +1 -0
  8. package/server/client/dist/assets/Graph-vXQQ0a-Q.js +1 -0
  9. package/server/client/dist/assets/Graph-yPE3ljW0.js +46 -0
  10. package/server/client/dist/assets/Image.es-DnR3qc_c.js +1 -0
  11. package/server/client/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  12. package/server/client/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  13. package/server/client/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  14. package/server/client/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  15. package/server/client/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  16. package/server/client/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  17. package/server/client/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  18. package/server/client/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  19. package/server/client/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  20. package/server/client/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  21. package/server/client/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  22. package/server/client/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  23. package/server/client/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  24. package/server/client/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  25. package/server/client/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  26. package/server/client/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  27. package/server/client/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  28. package/server/client/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  29. package/server/client/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  30. package/server/client/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  31. package/server/client/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  32. package/server/client/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  33. package/server/client/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  34. package/server/client/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  35. package/server/client/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  36. package/server/client/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  37. package/server/client/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  38. package/server/client/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  39. package/server/client/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  40. package/server/client/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  41. package/server/client/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  42. package/server/client/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  43. package/server/client/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  44. package/server/client/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  45. package/server/client/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  46. package/server/client/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  47. package/server/client/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  48. package/server/client/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  49. package/server/client/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  50. package/server/client/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  51. package/server/client/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  52. package/server/client/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  53. package/server/client/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  54. package/server/client/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  55. package/server/client/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  56. package/server/client/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  57. package/server/client/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  58. package/server/client/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  59. package/server/client/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  60. package/server/client/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  61. package/server/client/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  62. package/server/client/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  63. package/server/client/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  64. package/server/client/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  65. package/server/client/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  66. package/server/client/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  67. package/server/client/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  68. package/server/client/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  69. package/server/client/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  70. package/server/client/dist/assets/Note-CmreVzvQ.js +25 -0
  71. package/server/client/dist/assets/NotePropertiesPanel-DXYgE8h2.js +2 -0
  72. package/server/client/dist/assets/PencilLine.es-B9V6u64t.js +1 -0
  73. package/server/client/dist/assets/Plus.es-CRRp2u5J.js +1 -0
  74. package/server/client/dist/assets/Reminders-BOtfNeYD.js +1 -0
  75. package/server/client/dist/assets/Search-C-FB3pKf.js +1 -0
  76. package/server/client/dist/assets/SurfaceCard-GMt5xM7v.js +1 -0
  77. package/server/client/dist/assets/Tag-lBxDRE77.js +1 -0
  78. package/server/client/dist/assets/TagNotes-Bgorp_rC.js +1 -0
  79. package/server/client/dist/assets/Trash.es-svHOb5LN.js +1 -0
  80. package/server/client/dist/assets/ViewNotes-C7d10VFf.js +1 -0
  81. package/server/client/dist/assets/ViewSectionDialog-Bhw-ILop.js +102 -0
  82. package/server/client/dist/assets/Views-C7V3saUo.js +1 -0
  83. package/server/client/dist/assets/abnfDiagram-VRR7QNED-CWlV5dXw.js +1 -0
  84. package/server/client/dist/assets/app-DQBV36r_.js +50 -0
  85. package/server/client/dist/assets/app-ZgwR5t_I.css +1 -0
  86. package/server/client/dist/assets/arc-BV-n6RUX.js +1 -0
  87. package/server/client/dist/assets/architectureDiagram-ZJ3FMSHR-CekzMXdu.js +36 -0
  88. package/server/client/dist/assets/blockDiagram-677ZJIJ3-B49yHoxq.js +132 -0
  89. package/server/client/dist/assets/c4Diagram-LMCZKHZV-0AfB9NBC.js +10 -0
  90. package/server/client/dist/assets/channel-CigOulR-.js +1 -0
  91. package/server/client/dist/assets/chunk-2Q5K7J3B-DaPQAU1q.js +1 -0
  92. package/server/client/dist/assets/chunk-32BRIVSS-CfL3kZAg.js +1 -0
  93. package/server/client/dist/assets/chunk-5VM5RSS4-DeOwWPE_.js +15 -0
  94. package/server/client/dist/assets/chunk-EX3LRPZG-C3W1oc9y.js +231 -0
  95. package/server/client/dist/assets/chunk-JWPE2WC7-_Oqh79OY.js +1 -0
  96. package/server/client/dist/assets/chunk-MOJQB5TN-DDKNNzI6.js +88 -0
  97. package/server/client/dist/assets/chunk-RYQCIY6F-DCHah7CC.js +1 -0
  98. package/server/client/dist/assets/chunk-V7JOEXUC-uUOIzgxj.js +206 -0
  99. package/server/client/dist/assets/chunk-VR4S4FIN-DDVw2WPs.js +1 -0
  100. package/server/client/dist/assets/chunk-XXDRQBXY-Coo4UFm2.js +1 -0
  101. package/server/client/dist/assets/classDiagram-OUVF2IWQ-D13ISIOW.js +1 -0
  102. package/server/client/dist/assets/classDiagram-v2-EOCWNBFH-D13ISIOW.js +1 -0
  103. package/server/client/dist/assets/colors-Cc3OSVma.js +1 -0
  104. package/server/client/dist/assets/cose-bilkent-JH36ORCC-C3pHmHpD.js +1 -0
  105. package/server/client/dist/assets/cynefin-VYW2F7L2-DU_G4Atc.js +166 -0
  106. package/server/client/dist/assets/cynefinDiagram-TSTJHNR4-DZ6iiJFo.js +62 -0
  107. package/server/client/dist/assets/cytoscape.esm-D3_iZ_3b.js +321 -0
  108. package/server/client/dist/assets/dagre-VKFMJZFB-DNELbhwC.js +4 -0
  109. package/server/client/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  110. package/server/client/dist/assets/diagram-FQU43EPY-CMEvZJ61.js +3 -0
  111. package/server/client/dist/assets/diagram-G47NLZAW-BYDtf6j9.js +24 -0
  112. package/server/client/dist/assets/diagram-NH7WQ7WH-CmXfcCQA.js +24 -0
  113. package/server/client/dist/assets/diagram-OA4YK3LP-BflTKJxU.js +30 -0
  114. package/server/client/dist/assets/diagram-WEI45ONY-KW3fKqna.js +41 -0
  115. package/server/client/dist/assets/ebnfDiagram-CCIWWBDH-CbyhY5Nj.js +1 -0
  116. package/server/client/dist/assets/erDiagram-Q63AITRT-CC2eZV8g.js +85 -0
  117. package/server/client/dist/assets/floating-ui.react-dom-BWTnA00G.js +1 -0
  118. package/server/client/dist/assets/flowDiagram-23GEKE2U-unplo7Qm.js +156 -0
  119. package/server/client/dist/assets/ganttDiagram-NO4QXBWP-BcBK5HcZ.js +292 -0
  120. package/server/client/dist/assets/gitGraphDiagram-IHSO6WYX-DgVbbb5k.js +106 -0
  121. package/server/client/dist/assets/graph-C5DFNLrC.js +1 -0
  122. package/server/client/dist/assets/image-delete-confirmation-D7xrODQV.js +1 -0
  123. package/server/client/dist/assets/image.api-QmHYjp3z.js +17 -0
  124. package/server/client/dist/assets/index-CaF9d-zG.js +1 -0
  125. package/server/client/dist/assets/infoDiagram-FWYZ7A6U-N_D9RdfG.js +2 -0
  126. package/server/client/dist/assets/init-Gi6I4Gst.js +1 -0
  127. package/server/client/dist/assets/isObject-U9U2HXiq.js +1 -0
  128. package/server/client/dist/assets/ishikawaDiagram-FXEZZL3T-BBKrzmB2.js +70 -0
  129. package/server/client/dist/assets/journeyDiagram-5HDEW3XC-NdCxLmQB.js +139 -0
  130. package/server/client/dist/assets/kanban-definition-HUTT4EX6-Ck7t4-tt.js +89 -0
  131. package/server/client/dist/assets/katex-DywYRkvg.css +1 -0
  132. package/server/client/dist/assets/katex-HP8lGamR.js +257 -0
  133. package/server/client/dist/assets/katex-x288kqHd.js +257 -0
  134. package/server/client/dist/assets/layout-Cz0MDlGi.js +1 -0
  135. package/server/client/dist/assets/linear-D6yRgDLq.js +1 -0
  136. package/server/client/dist/assets/manage-image-DCDF8AM9.js +1 -0
  137. package/server/client/dist/assets/manage-image-detail-e0ViRAj-.js +1 -0
  138. package/server/client/dist/assets/map-Mm1V-_Na.js +1 -0
  139. package/server/client/dist/assets/mcp-admin-adapter-D39G3udJ.js +1 -0
  140. package/server/client/dist/assets/{mcp-Dd98N9Hq.js → mcp-uFZkdhCi.js} +4 -4
  141. package/server/client/dist/assets/mermaid.core-B14ZAmWA.js +308 -0
  142. package/server/client/dist/assets/min-tv6RD-6E.js +1 -0
  143. package/server/client/dist/assets/mindmap-definition-LN4V7U3C-BTUqSdcP.js +96 -0
  144. package/server/client/dist/assets/note-core-DUTqUh5N.js +13 -0
  145. package/server/client/dist/assets/note-runtime-zN5ddTba.js +168 -0
  146. package/server/client/dist/assets/note-ui-CxK8ymUc.js +2 -0
  147. package/server/client/dist/assets/{index-DPI6YoDt.css → note-ui-DL8owV-U.css} +1 -1
  148. package/server/client/dist/assets/note.api-BQovzEzd.js +356 -0
  149. package/server/client/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  150. package/server/client/dist/assets/pegDiagram-2B236MQR-Cjcu3mVz.js +1 -0
  151. package/server/client/dist/assets/pieDiagram-ENE6RG2P-BxI_c22Z.js +39 -0
  152. package/server/client/dist/assets/placeholder-D3b8lZGE.js +34 -0
  153. package/server/client/dist/assets/preload-helper-BXl3LOEh.js +1 -0
  154. package/server/client/dist/assets/properties-M-yWq1D7.js +1 -0
  155. package/server/client/dist/assets/quadrantDiagram-ABIIQ3AL-DGm0a-yR.js +7 -0
  156. package/server/client/dist/assets/railroadDiagram-RFXS5EU6-DmCDu89O.js +1 -0
  157. package/server/client/dist/assets/requirementDiagram-TGXJPOKE-CBpUt7Ig.js +84 -0
  158. package/server/client/dist/assets/route-preload.js +2 -0
  159. package/server/client/dist/assets/sankeyDiagram-HTMAVEWB-BjGnDZlp.js +40 -0
  160. package/server/client/dist/assets/search-DFnzZKLd.js +1 -0
  161. package/server/client/dist/assets/sequenceDiagram-DBY2YBRQ-B7rpCfS6.js +162 -0
  162. package/server/client/dist/assets/sizeCapture-X5ZJPWSS-CUJhD0uW.js +1 -0
  163. package/server/client/dist/assets/stateDiagram-2N3HPSRC-Y9-3XqRX.js +1 -0
  164. package/server/client/dist/assets/stateDiagram-v2-6OUMAXLB-DbHXhT02.js +1 -0
  165. package/server/client/dist/assets/swimlanes-5IMT3BWC-Cs1NO9ng.js +2 -0
  166. package/server/client/dist/assets/swimlanesDiagram-G3AALYLV-DQnrq2ZC.js +8 -0
  167. package/server/client/dist/assets/{tag.api-CwmC8crB.js → tag.api-DUfjr8bg.js} +3 -3
  168. package/server/client/dist/assets/time-CfAYZipR.js +9 -0
  169. package/server/client/dist/assets/timeline-definition-FHXFAJF6-8fqD4WNL.js +120 -0
  170. package/server/client/dist/assets/toNumber-DE3J3kMD.js +1 -0
  171. package/server/client/dist/assets/transform-BUB79_za.js +1 -0
  172. package/server/client/dist/assets/trash-CClKfP1x.js +1 -0
  173. package/server/client/dist/assets/url-9nrbQs7Z.js +1 -0
  174. package/server/client/dist/assets/{useReminderMutate-DuVKxpBh.js → useReminderMutate--omDLmBV.js} +2 -2
  175. package/server/client/dist/assets/vennDiagram-L72KCM5P-BPqKkd5a.js +34 -0
  176. package/server/client/dist/assets/wardleyDiagram-EHGQE667-Cq11kU2M.js +78 -0
  177. package/server/client/dist/assets/xychartDiagram-FW5EYKEG-DJ6UzFj-.js +7 -0
  178. package/server/client/dist/index.html +10 -5
  179. package/server/dist/app.js +1 -1
  180. package/server/dist/features/image/services/delete.js +25 -1
  181. package/server/dist/features/note/graphql/note.mutation.resolver.js +38 -12
  182. package/server/dist/features/note/graphql/note.type-defs.js +1 -1
  183. package/server/dist/features/note/http/mcp.js +1 -60
  184. package/server/dist/features/note/services/authoring.js +2 -70
  185. package/server/dist/features/note/services/markdown-patch.js +80 -8
  186. package/server/dist/features/note/services/properties.js +21 -1
  187. package/server/dist/features/note/services/property-restore.js +26 -0
  188. package/server/dist/features/note/services/snapshot.js +79 -59
  189. package/server/dist/features/note/services/trash.js +16 -31
  190. package/server/dist/features/search/embedding-api-key-store.js +57 -0
  191. package/server/dist/features/search/embedding-client.js +179 -0
  192. package/server/dist/features/search/graphql/index.js +6 -0
  193. package/server/dist/features/search/graphql/resolver.js +20 -0
  194. package/server/dist/features/search/graphql/type-defs.js +30 -0
  195. package/server/dist/features/search/http/handlers.js +108 -0
  196. package/server/dist/features/search/hybrid-ranking.js +55 -0
  197. package/server/dist/features/search/hybrid-search.js +174 -0
  198. package/server/dist/features/search/note-change.js +16 -0
  199. package/server/dist/features/search/note-chunking.js +75 -0
  200. package/server/dist/features/search/search-config.js +150 -0
  201. package/server/dist/features/search/search-manager.js +431 -0
  202. package/server/dist/features/search/semantic-indexer.js +138 -0
  203. package/server/dist/features/search/sqlite-vector-index.js +636 -0
  204. package/server/dist/features/search/url-normalization.js +10 -0
  205. package/server/dist/features/tag/services/organization.js +3 -0
  206. package/server/dist/features/view/services/workspace.js +1 -1
  207. package/server/dist/main.js +2 -0
  208. package/server/dist/modules/blocknote.js +266 -80
  209. package/server/dist/modules/error-handler.js +8 -0
  210. package/server/dist/paths.js +7 -2
  211. package/server/dist/routes/api.js +37 -0
  212. package/server/dist/routes/mcp.js +0 -5
  213. package/server/dist/schema/index.js +3 -0
  214. package/server/client/dist/assets/ArrowRight.es-CbA8ey6a.js +0 -1
  215. package/server/client/dist/assets/Calendar-CgWgr1BV.js +0 -25
  216. package/server/client/dist/assets/Callout-DKruIT0f.js +0 -1
  217. package/server/client/dist/assets/Copy.es-DFbgpaNJ.js +0 -1
  218. package/server/client/dist/assets/Graph-kCltGRlY.js +0 -1
  219. package/server/client/dist/assets/Image-7W0DZwMo.js +0 -1
  220. package/server/client/dist/assets/Image.es-5pXLx9TU.js +0 -1
  221. package/server/client/dist/assets/Note-BW6Np_5g.js +0 -20
  222. package/server/client/dist/assets/Plus.es-B0sg64VJ.js +0 -1
  223. package/server/client/dist/assets/Reminders-C10fHQcl.js +0 -1
  224. package/server/client/dist/assets/Search-tf2nV4v0.js +0 -1
  225. package/server/client/dist/assets/SurfaceCard-pydtvHfu.js +0 -1
  226. package/server/client/dist/assets/Tag-uCoYbISy.js +0 -1
  227. package/server/client/dist/assets/TagNotes-CqOcQiRw.js +0 -1
  228. package/server/client/dist/assets/Trash.es-w32Goxfa.js +0 -1
  229. package/server/client/dist/assets/ViewNotes-slPXXoOY.js +0 -1
  230. package/server/client/dist/assets/ViewSectionDialog-brTrsF6G.js +0 -102
  231. package/server/client/dist/assets/Views-B_wsb-XJ.js +0 -1
  232. package/server/client/dist/assets/graph-vendor-BAF95C0g.js +0 -46
  233. package/server/client/dist/assets/image.api-CYsjXiMr.js +0 -17
  234. package/server/client/dist/assets/index-BR05aSXr.js +0 -342
  235. package/server/client/dist/assets/index-D83QbOcw.js +0 -1
  236. package/server/client/dist/assets/manage-image-BYIhWu56.js +0 -1
  237. package/server/client/dist/assets/manage-image-detail-6KgmQvbN.js +0 -1
  238. package/server/client/dist/assets/mcp-admin-adapter-DOgBsYpl.js +0 -1
  239. package/server/client/dist/assets/note-core-CMGUaW1v.js +0 -176
  240. package/server/client/dist/assets/note-vendor-Hoz9Q4-4.js +0 -54
  241. package/server/client/dist/assets/placeholder-siHGg9aK.js +0 -34
  242. package/server/client/dist/assets/properties-CyVRKgcT.js +0 -1
  243. package/server/client/dist/assets/trash-wojQBK9Z.js +0 -1
@@ -180,7 +180,7 @@ function restoreTagPlaceholdersInMarkdown(markdown, placeholderToTag) {
180
180
  function preprocessMarkdownExplicitTags(markdown) {
181
181
  const placeholderToTag = /* @__PURE__ */ new Map();
182
182
  let nextPlaceholderIndex = 0;
183
- const preprocessedMarkdown = markdown.replace(/\[([@#][^\s[\]]+)\]/g, (_match, tagToken) => {
183
+ const preprocessedMarkdown = markdown.replace(/\[(@[^\s[\]]+)\]/g, (_match, tagToken) => {
184
184
  const placeholder = createTagPlaceholder(nextPlaceholderIndex++);
185
185
  placeholderToTag.set(placeholder, tagToken);
186
186
  return placeholder;
@@ -242,7 +242,10 @@ function replaceExplicitReferenceTokens(text, placeholderToReference) {
242
242
  });
243
243
  }
244
244
  const MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN = /<([^<>\n]+)>/g;
245
- const MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN = /(\d)~(?=\d)/g;
245
+ const TILDE_RUN_PATTERN = /~+/g;
246
+ const NUMERIC_ENDPOINT_TOKEN_CHARACTER_PATTERN = /[\p{L}\p{M}\p{N}\p{Sc}%‰.,+\-/:°℃℉µμ·²³^]/u;
247
+ const NUMERIC_ENDPOINT_START_PATTERN = /^(?:[+-]?\p{Sc}?|\p{Sc}[+-]?)\p{N}/u;
248
+ const NUMERIC_CHARACTER_REFERENCE_PATTERN = /&#(?:x[0-9a-f]+|\d+);/giu;
246
249
  const MARKDOWN_FENCED_CODE_PATTERN = /^ {0,3}(`{3,}|~{3,})/;
247
250
  const ANGLE_BRACKET_PLACEHOLDER_PREFIX = "\uE000OBANGLE";
248
251
  const ANGLE_BRACKET_PLACEHOLDER_SUFFIX = "\uE001";
@@ -285,19 +288,39 @@ function hasLiteralAngleBracketTextTokenLoss(sourceMarkdown, renderedMarkdown) {
285
288
  }
286
289
  return false;
287
290
  }
288
- function countNumericTildeRangeMarkers(markdown) {
289
- return [...markdown.matchAll(MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN)].length;
291
+ function getNumericTildeRangeRunSignatures(markdown) {
292
+ const normalizedMarkdown = markdown.replace(/\\(?=~)/g, "");
293
+ return getNumericTildeRangeRuns(normalizedMarkdown).map((run) => {
294
+ const leftEndpoint = getNumericEndpointBefore(normalizedMarkdown, run.start);
295
+ const rightEndpoint = getNumericEndpointAfter(normalizedMarkdown, run.start + run.length);
296
+ return JSON.stringify([leftEndpoint, run.length, rightEndpoint]);
297
+ });
290
298
  }
291
299
  function hasNumericTildeRangeMarkers(markdown) {
292
- return countNumericTildeRangeMarkers(markdown) > 0;
300
+ return getNumericTildeRangeRunSignatures(markdown).length > 0;
293
301
  }
294
302
  function hasNumericTildeRangeMarkerLoss(sourceMarkdown, renderedMarkdown) {
295
- const sourceCount = countNumericTildeRangeMarkers(sourceMarkdown);
296
- return sourceCount > 0 && countNumericTildeRangeMarkers(renderedMarkdown) < sourceCount;
303
+ const sourceRunSignatures = getNumericTildeRangeRunSignatures(sourceMarkdown);
304
+ if (sourceRunSignatures.length === 0) {
305
+ return false;
306
+ }
307
+ const renderedRunSignatures = getNumericTildeRangeRunSignatures(renderedMarkdown);
308
+ let renderedIndex = 0;
309
+ for (const sourceRunSignature of sourceRunSignatures) {
310
+ while (renderedIndex < renderedRunSignatures.length && renderedRunSignatures[renderedIndex] !== sourceRunSignature) {
311
+ renderedIndex += 1;
312
+ }
313
+ if (renderedIndex === renderedRunSignatures.length) {
314
+ return true;
315
+ }
316
+ renderedIndex += 1;
317
+ }
318
+ return false;
297
319
  }
298
320
  function protectMarkdownNumericTildeRanges(markdown) {
299
321
  const protectedLines = [];
300
322
  const placeholderToToken = /* @__PURE__ */ new Map();
323
+ const createPlaceholder = createNumericTildeRangePlaceholderFactory(markdown);
301
324
  let activeFence = null;
302
325
  for (const line of markdown.split(/(?<=\n)/)) {
303
326
  const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);
@@ -322,7 +345,9 @@ function protectMarkdownNumericTildeRanges(markdown) {
322
345
  protectedLines.push(line);
323
346
  continue;
324
347
  }
325
- protectedLines.push(`${protectMarkdownLineNumericTildeRanges(lineBody, placeholderToToken)}${lineEnding}`);
348
+ protectedLines.push(
349
+ `${protectMarkdownLineNumericTildeRanges(lineBody, placeholderToToken, createPlaceholder)}${lineEnding}`
350
+ );
326
351
  }
327
352
  return {
328
353
  markdown: protectedLines.join(""),
@@ -332,6 +357,11 @@ function protectMarkdownNumericTildeRanges(markdown) {
332
357
  function protectMarkdownLineEndHardBreakMarkers(markdown) {
333
358
  const protectedLines = [];
334
359
  const placeholderToToken = /* @__PURE__ */ new Map();
360
+ const createPlaceholder = createProtectedTextPlaceholderFactory(
361
+ markdown,
362
+ HARD_BREAK_PLACEHOLDER_PREFIX,
363
+ HARD_BREAK_PLACEHOLDER_SUFFIX
364
+ );
335
365
  let activeFence = null;
336
366
  const lines = markdown.split(/(?<=\n)/);
337
367
  for (const [index, line] of lines.entries()) {
@@ -363,7 +393,8 @@ function protectMarkdownLineEndHardBreakMarkers(markdown) {
363
393
  lineBody,
364
394
  lineEnding,
365
395
  isMarkdownHardBreakContinuationLine(nextLineBody),
366
- placeholderToToken
396
+ placeholderToToken,
397
+ createPlaceholder
367
398
  )}${lineEnding}`
368
399
  );
369
400
  }
@@ -375,6 +406,11 @@ function protectMarkdownLineEndHardBreakMarkers(markdown) {
375
406
  function protectMarkdownTextAngleBrackets(markdown) {
376
407
  const protectedLines = [];
377
408
  const placeholderToToken = /* @__PURE__ */ new Map();
409
+ const createPlaceholder = createProtectedTextPlaceholderFactory(
410
+ markdown,
411
+ ANGLE_BRACKET_PLACEHOLDER_PREFIX,
412
+ ANGLE_BRACKET_PLACEHOLDER_SUFFIX
413
+ );
378
414
  let activeFence = null;
379
415
  for (const line of markdown.split(/(?<=\n)/)) {
380
416
  const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);
@@ -399,7 +435,9 @@ function protectMarkdownTextAngleBrackets(markdown) {
399
435
  protectedLines.push(line);
400
436
  continue;
401
437
  }
402
- protectedLines.push(`${protectMarkdownLineTextAngleBrackets(lineBody, placeholderToToken)}${lineEnding}`);
438
+ protectedLines.push(
439
+ `${protectMarkdownLineTextAngleBrackets(lineBody, placeholderToToken, createPlaceholder)}${lineEnding}`
440
+ );
403
441
  }
404
442
  return {
405
443
  markdown: protectedLines.join(""),
@@ -428,68 +466,69 @@ function isClosingFenceLine(line, fence) {
428
466
  const escapedMarker = fence.marker === "`" ? "`" : "~";
429
467
  return new RegExp(`^ {0,3}${escapedMarker}{${fence.length},} *$`).test(line);
430
468
  }
431
- function protectMarkdownLineTextAngleBrackets(line, placeholderToToken) {
469
+ function protectMarkdownLineTextAngleBrackets(line, placeholderToToken, createPlaceholder) {
432
470
  let result = "";
433
471
  let cursor = 0;
434
472
  while (cursor < line.length) {
435
- const codeStart = line.indexOf("`", cursor);
436
- if (codeStart === -1) {
437
- result += replaceLiteralAngleBracketTextTokens(line.slice(cursor), placeholderToToken);
438
- break;
439
- }
440
- result += replaceLiteralAngleBracketTextTokens(line.slice(cursor, codeStart), placeholderToToken);
441
- const delimiterLength = countRepeatedCharacter(line, codeStart, "`");
442
- const codeEnd = line.indexOf("`".repeat(delimiterLength), codeStart + delimiterLength);
443
- if (codeEnd === -1) {
444
- result += replaceLiteralAngleBracketTextTokens(line.slice(codeStart), placeholderToToken);
473
+ const codeSpan = findNextInlineCodeSpan(line, cursor);
474
+ if (!codeSpan) {
475
+ result += replaceLiteralAngleBracketTextTokens(line.slice(cursor), placeholderToToken, createPlaceholder);
445
476
  break;
446
477
  }
447
- const codeEndExclusive = codeEnd + delimiterLength;
448
- result += line.slice(codeStart, codeEndExclusive);
449
- cursor = codeEndExclusive;
478
+ result += replaceLiteralAngleBracketTextTokens(
479
+ line.slice(cursor, codeSpan.start),
480
+ placeholderToToken,
481
+ createPlaceholder
482
+ );
483
+ result += line.slice(codeSpan.start, codeSpan.end);
484
+ cursor = codeSpan.end;
450
485
  }
451
486
  return result;
452
487
  }
453
- function protectMarkdownLineNumericTildeRanges(line, placeholderToToken) {
488
+ function protectMarkdownLineNumericTildeRanges(line, placeholderToToken, createPlaceholder) {
454
489
  let result = "";
455
490
  let cursor = 0;
456
491
  while (cursor < line.length) {
457
492
  const protectedSpan = findNextMarkdownProtectedSpan(line, cursor);
458
493
  if (!protectedSpan) {
459
- result += replaceNumericTildeRangeMarkers(line.slice(cursor), placeholderToToken);
494
+ result += replaceNumericTildeRangeMarkers(line.slice(cursor), placeholderToToken, createPlaceholder);
460
495
  break;
461
496
  }
462
- result += replaceNumericTildeRangeMarkers(line.slice(cursor, protectedSpan.start), placeholderToToken);
497
+ result += replaceNumericTildeRangeMarkers(
498
+ line.slice(cursor, protectedSpan.start),
499
+ placeholderToToken,
500
+ createPlaceholder
501
+ );
463
502
  result += line.slice(protectedSpan.start, protectedSpan.end);
464
503
  cursor = protectedSpan.end;
465
504
  }
466
505
  return result;
467
506
  }
468
507
  function findNextMarkdownProtectedSpan(line, cursor) {
469
- const codeSpan = findNextInlineCodeSpan(line, cursor);
470
- const linkDestinationSpan = findNextMarkdownLinkDestinationSpan(line, cursor);
471
- if (!codeSpan) {
472
- return linkDestinationSpan;
473
- }
474
- if (!linkDestinationSpan) {
475
- return codeSpan;
476
- }
477
- return codeSpan.start <= linkDestinationSpan.start ? codeSpan : linkDestinationSpan;
508
+ return [
509
+ findNextInlineCodeSpan(line, cursor),
510
+ findNextMarkdownLinkDestinationSpan(line, cursor),
511
+ findNextMarkdownAngleBracketSpan(line, cursor)
512
+ ].reduce((nextSpan, span) => {
513
+ if (!span || nextSpan && nextSpan.start <= span.start) {
514
+ return nextSpan;
515
+ }
516
+ return span;
517
+ }, null);
478
518
  }
479
519
  function findNextInlineCodeSpan(line, cursor) {
480
- const codeStart = line.indexOf("`", cursor);
481
- if (codeStart === -1) {
482
- return null;
483
- }
484
- const delimiterLength = countRepeatedCharacter(line, codeStart, "`");
485
- const codeEnd = line.indexOf("`".repeat(delimiterLength), codeStart + delimiterLength);
486
- if (codeEnd === -1) {
487
- return null;
520
+ let codeStart = line.indexOf("`", cursor);
521
+ while (codeStart !== -1) {
522
+ const delimiterLength = countRepeatedCharacter(line, codeStart, "`");
523
+ if (!isEscapedMarkdownCharacter(line, codeStart)) {
524
+ const end = findMatchingBacktickRunEnd(line, codeStart, delimiterLength);
525
+ if (end !== null) {
526
+ return { start: codeStart, end };
527
+ }
528
+ }
529
+ codeStart = line.indexOf("`", codeStart + delimiterLength);
488
530
  }
489
- return {
490
- start: codeStart,
491
- end: codeEnd + delimiterLength
492
- };
531
+ return null;
493
532
  }
494
533
  function findNextMarkdownLinkDestinationSpan(line, cursor) {
495
534
  const linkDestinationPrefix = line.indexOf("](", cursor);
@@ -497,37 +536,144 @@ function findNextMarkdownLinkDestinationSpan(line, cursor) {
497
536
  return null;
498
537
  }
499
538
  const destinationStart = linkDestinationPrefix + 2;
500
- const destinationEnd = line.indexOf(")", destinationStart);
501
- if (destinationEnd === -1) {
539
+ let parenthesisDepth = 0;
540
+ for (let destinationEnd = destinationStart; destinationEnd < line.length; destinationEnd += 1) {
541
+ const character = line[destinationEnd];
542
+ if (character === "\\") {
543
+ destinationEnd += 1;
544
+ continue;
545
+ }
546
+ if (character === "(") {
547
+ parenthesisDepth += 1;
548
+ continue;
549
+ }
550
+ if (character !== ")") {
551
+ continue;
552
+ }
553
+ if (parenthesisDepth > 0) {
554
+ parenthesisDepth -= 1;
555
+ continue;
556
+ }
557
+ return {
558
+ start: destinationStart,
559
+ end: destinationEnd
560
+ };
561
+ }
562
+ return null;
563
+ }
564
+ function findNextMarkdownAngleBracketSpan(line, cursor) {
565
+ const start = line.indexOf("<", cursor);
566
+ if (start === -1) {
502
567
  return null;
503
568
  }
504
- return {
505
- start: destinationStart,
506
- end: destinationEnd
507
- };
569
+ const end = line.indexOf(">", start + 1);
570
+ if (end === -1) {
571
+ return null;
572
+ }
573
+ return { start, end: end + 1 };
508
574
  }
509
- function replaceLiteralAngleBracketTextTokens(text, placeholderToToken) {
575
+ function replaceLiteralAngleBracketTextTokens(text, placeholderToToken, createPlaceholder) {
510
576
  return text.replace(MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN, (match, innerText) => {
511
577
  if (isMarkdownAutolinkAngleBracketText(innerText)) {
512
578
  return match;
513
579
  }
514
- const placeholder = createAngleBracketPlaceholder(placeholderToToken.size);
580
+ const placeholder = createPlaceholder();
515
581
  placeholderToToken.set(placeholder, match);
516
582
  return placeholder;
517
583
  });
518
584
  }
519
- function replaceNumericTildeRangeMarkers(text, placeholderToToken) {
520
- return text.replace(MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN, (match, leadingDigit) => {
521
- const placeholder = createNumericTildeRangePlaceholder(placeholderToToken.size);
522
- placeholderToToken.set(placeholder, "~");
523
- return `${leadingDigit}${placeholder}`;
585
+ function isPotentialNumericTildeRangeRun(value, start, end) {
586
+ if (end - start > 2) {
587
+ return false;
588
+ }
589
+ return getNumericEndpointBefore(value, start) !== null && getNumericEndpointAfter(value, end) !== null;
590
+ }
591
+ function findEndpointTokenBefore(value, end) {
592
+ let start = end;
593
+ while (start > 0 && NUMERIC_ENDPOINT_TOKEN_CHARACTER_PATTERN.test(value[start - 1] ?? "")) {
594
+ start -= 1;
595
+ }
596
+ return {
597
+ start,
598
+ token: value.slice(start, end)
599
+ };
600
+ }
601
+ function findEndpointTokenAfter(value, start) {
602
+ let end = start;
603
+ while (end < value.length && NUMERIC_ENDPOINT_TOKEN_CHARACTER_PATTERN.test(value[end] ?? "")) {
604
+ end += 1;
605
+ }
606
+ return value.slice(start, end);
607
+ }
608
+ function getNumericEndpointBefore(value, end) {
609
+ const endpoint = findEndpointTokenBefore(value, end);
610
+ if (NUMERIC_ENDPOINT_START_PATTERN.test(endpoint.token)) {
611
+ return endpoint.token;
612
+ }
613
+ if (!endpoint.token) {
614
+ return null;
615
+ }
616
+ let previousEnd = endpoint.start;
617
+ while (previousEnd > 0 && (value[previousEnd - 1] === " " || value[previousEnd - 1] === " ")) {
618
+ previousEnd -= 1;
619
+ }
620
+ if (previousEnd === endpoint.start) {
621
+ return null;
622
+ }
623
+ const previousEndpoint = findEndpointTokenBefore(value, previousEnd);
624
+ return NUMERIC_ENDPOINT_START_PATTERN.test(previousEndpoint.token) ? value.slice(previousEndpoint.start, end) : null;
625
+ }
626
+ function getNumericEndpointAfter(value, start) {
627
+ const endpoint = findEndpointTokenAfter(value, start);
628
+ return NUMERIC_ENDPOINT_START_PATTERN.test(endpoint) ? endpoint : null;
629
+ }
630
+ function getNumericTildeRangeRuns(value) {
631
+ const numericRuns = [];
632
+ const pendingNumericBoundaryStrikeOpeners = /* @__PURE__ */ new Set();
633
+ for (const match of value.matchAll(TILDE_RUN_PATTERN)) {
634
+ const start = match.index;
635
+ const length = match[0].length;
636
+ const end = start + length;
637
+ if (length > 2) {
638
+ continue;
639
+ }
640
+ const canOpen = end < value.length && !/\s/u.test(value[end] ?? "");
641
+ const canClose = start > 0 && !/\s/u.test(value[start - 1] ?? "");
642
+ const isNumericRange = isPotentialNumericTildeRangeRun(value, start, end);
643
+ if (isNumericRange) {
644
+ if (canClose && pendingNumericBoundaryStrikeOpeners.delete(length)) {
645
+ continue;
646
+ }
647
+ numericRuns.push({ length, start });
648
+ continue;
649
+ }
650
+ if (canClose && pendingNumericBoundaryStrikeOpeners.delete(length)) {
651
+ continue;
652
+ }
653
+ if (canOpen && getNumericEndpointBefore(value, start) !== null) {
654
+ pendingNumericBoundaryStrikeOpeners.add(length);
655
+ }
656
+ }
657
+ return numericRuns;
658
+ }
659
+ function replaceNumericTildeRangeMarkers(text, placeholderToToken, createPlaceholder) {
660
+ const numericRunStarts = new Set(getNumericTildeRangeRuns(text).map((run) => run.start));
661
+ return text.replace(TILDE_RUN_PATTERN, (tildeRun, offset) => {
662
+ if (!numericRunStarts.has(offset)) {
663
+ return tildeRun;
664
+ }
665
+ return [...tildeRun].map(() => {
666
+ const placeholder = createPlaceholder();
667
+ placeholderToToken.set(placeholder, "~");
668
+ return placeholder;
669
+ }).join("");
524
670
  });
525
671
  }
526
- function protectMarkdownLineEndHardBreakMarker(line, lineEnding, hasContinuationLine, placeholderToToken) {
672
+ function protectMarkdownLineEndHardBreakMarker(line, lineEnding, hasContinuationLine, placeholderToToken, createPlaceholder) {
527
673
  if (!lineEnding || !line.endsWith("\\")) {
528
674
  return line;
529
675
  }
530
- const placeholder = createHardBreakPlaceholder(placeholderToToken.size);
676
+ const placeholder = createPlaceholder();
531
677
  const shouldPreserveAsHardBreak = hasContinuationLine && !hasUnclosedInlineCodeSpanAtLineEnd(line);
532
678
  placeholderToToken.set(placeholder, shouldPreserveAsHardBreak ? "\n" : "\\");
533
679
  return `${line.slice(0, -1)}${placeholder}`;
@@ -569,14 +715,35 @@ function hasUnclosedInlineCodeSpanAtLineEnd(line) {
569
715
  }
570
716
  return openDelimiter !== null;
571
717
  }
572
- function createAngleBracketPlaceholder(index) {
573
- return `${ANGLE_BRACKET_PLACEHOLDER_PREFIX}${index}${ANGLE_BRACKET_PLACEHOLDER_SUFFIX}`;
718
+ function decodeNumericCharacterReference(reference) {
719
+ const value = reference.slice(2, -1);
720
+ const isHexadecimal = value[0]?.toLowerCase() === "x";
721
+ const codePoint = Number.parseInt(isHexadecimal ? value.slice(1) : value, isHexadecimal ? 16 : 10);
722
+ if (!Number.isSafeInteger(codePoint) || codePoint < 0 || codePoint > 1114111) {
723
+ return reference;
724
+ }
725
+ return String.fromCodePoint(codePoint);
574
726
  }
575
- function createNumericTildeRangePlaceholder(index) {
576
- return `${NUMERIC_TILDE_RANGE_PLACEHOLDER_PREFIX}${index}${NUMERIC_TILDE_RANGE_PLACEHOLDER_SUFFIX}`;
727
+ function createNumericTildeRangePlaceholderFactory(markdown) {
728
+ return createProtectedTextPlaceholderFactory(
729
+ markdown,
730
+ NUMERIC_TILDE_RANGE_PLACEHOLDER_PREFIX,
731
+ NUMERIC_TILDE_RANGE_PLACEHOLDER_SUFFIX
732
+ );
577
733
  }
578
- function createHardBreakPlaceholder(index) {
579
- return `${HARD_BREAK_PLACEHOLDER_PREFIX}${index}${HARD_BREAK_PLACEHOLDER_SUFFIX}`;
734
+ function createProtectedTextPlaceholderFactory(markdown, prefix, suffix) {
735
+ const decodedMarkdown = markdown.replace(NUMERIC_CHARACTER_REFERENCE_PATTERN, decodeNumericCharacterReference);
736
+ const lowercaseMarkdown = markdown.toLowerCase();
737
+ let index = 0;
738
+ return () => {
739
+ let placeholder = `${prefix}${index}${suffix}`;
740
+ while (markdown.includes(placeholder) || lowercaseMarkdown.includes(encodeURIComponent(placeholder).toLowerCase()) || decodedMarkdown.includes(placeholder)) {
741
+ index += 1;
742
+ placeholder = `${prefix}${index}${suffix}`;
743
+ }
744
+ index += 1;
745
+ return placeholder;
746
+ };
580
747
  }
581
748
  function countRepeatedCharacter(value, start, character) {
582
749
  let cursor = start;
@@ -585,6 +752,28 @@ function countRepeatedCharacter(value, start, character) {
585
752
  }
586
753
  return cursor - start;
587
754
  }
755
+ function isEscapedMarkdownCharacter(value, index) {
756
+ let precedingBackslashes = 0;
757
+ for (let cursor = index - 1; cursor >= 0 && value[cursor] === "\\"; cursor -= 1) {
758
+ precedingBackslashes += 1;
759
+ }
760
+ return precedingBackslashes % 2 === 1;
761
+ }
762
+ function findMatchingBacktickRunEnd(line, start, delimiterLength) {
763
+ let cursor = start + delimiterLength;
764
+ while (cursor < line.length) {
765
+ const candidate = line.indexOf("`", cursor);
766
+ if (candidate === -1) {
767
+ return null;
768
+ }
769
+ const candidateLength = countRepeatedCharacter(line, candidate, "`");
770
+ if (candidateLength === delimiterLength) {
771
+ return candidate + candidateLength;
772
+ }
773
+ cursor = candidate + candidateLength;
774
+ }
775
+ return null;
776
+ }
588
777
  function findTagPlaceholderAtCursor(text, cursor, placeholderToTag) {
589
778
  for (const [placeholder, tagToken] of placeholderToTag.entries()) {
590
779
  if (text.startsWith(placeholder, cursor)) {
@@ -629,13 +818,7 @@ function restoreProtectedTextPlaceholders(blocks, placeholderToToken) {
629
818
  if (placeholderToToken.size === 0) {
630
819
  return blocks;
631
820
  }
632
- return mapBlocks(
633
- blocks,
634
- (content) => mapBlockContent(
635
- content,
636
- (inline) => restoreProtectedTextInValue(inline, placeholderToToken)
637
- )
638
- );
821
+ return restoreProtectedTextInValue(blocks, placeholderToToken);
639
822
  }
640
823
  function restoreProtectedTextInValue(value, placeholderToToken) {
641
824
  if (typeof value === "string") {
@@ -661,6 +844,10 @@ function restoreProtectedText(text, placeholderToToken) {
661
844
  `).join(`${placeholder}\r
662
845
  `);
663
846
  }
847
+ restoredText = restoredText.replace(
848
+ new RegExp(encodeURIComponent(placeholder), "gi"),
849
+ encodeURIComponent(token)
850
+ );
664
851
  restoredText = restoredText.split(placeholder).join(token);
665
852
  }
666
853
  return restoredText;
@@ -685,14 +872,13 @@ async function restoreCustomInlineContent(blocks, deps, placeholderToTag, placeh
685
872
  const noteCache = /* @__PURE__ */ new Map();
686
873
  const noteByIdCache = /* @__PURE__ */ new Map();
687
874
  const getTag = (token) => {
688
- const normalizedToken = token.startsWith("#") ? `@${token.slice(1)}` : token;
689
- let existing = tagCache.get(normalizedToken);
875
+ let existing = tagCache.get(token);
690
876
  if (!existing) {
691
- existing = deps.ensureTag(normalizedToken.slice(1)).then((result) => ({
877
+ existing = deps.ensureTag(token.slice(1)).then((result) => ({
692
878
  id: "tag" in result ? result.tag.id : result.id,
693
879
  tag: "tag" in result ? result.tag.name : result.name
694
880
  }));
695
- tagCache.set(normalizedToken, existing);
881
+ tagCache.set(token, existing);
696
882
  }
697
883
  return existing;
698
884
  };
@@ -13,6 +13,7 @@ class AppError extends Error {
13
13
  const createAppError = (status, code, message, details) => {
14
14
  return new AppError(status, code, message, details);
15
15
  };
16
+ const hasErrorType = (error, type) => error instanceof Error && "type" in error && error.type === type;
16
17
  const createErrorHandler = () => {
17
18
  return (error, _req, res, next) => {
18
19
  if (res.headersSent) {
@@ -27,6 +28,13 @@ const createErrorHandler = () => {
27
28
  }).end();
28
29
  return;
29
30
  }
31
+ if (hasErrorType(error, "encoding.unsupported")) {
32
+ res.status(415).json({
33
+ code: "UNSUPPORTED_CONTENT_ENCODING",
34
+ message: "Compressed request bodies are not supported."
35
+ }).end();
36
+ return;
37
+ }
30
38
  if (error instanceof Error && error.message.startsWith("CSRF token ")) {
31
39
  res.status(403).json({
32
40
  code: "CSRF_TOKEN_INVALID",
@@ -2,12 +2,17 @@ import path from "path";
2
2
  import { fileURLToPath } from "url";
3
3
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
4
4
  const PACKAGE_ROOT = process.env.OCEAN_BRAIN_PACKAGE_ROOT || path.resolve(__dirname, "..");
5
- const IMAGE_DIR = process.env.OCEAN_BRAIN_IMAGE_DIR || path.resolve(process.env.OCEAN_BRAIN_DATA_DIR || ".", "assets/images");
5
+ const DATA_DIR = process.env.OCEAN_BRAIN_DATA_DIR || ".";
6
+ const IMAGE_DIR = process.env.OCEAN_BRAIN_IMAGE_DIR || path.resolve(DATA_DIR, "assets/images");
7
+ const SEARCH_INDEX_PATH = process.env.OCEAN_BRAIN_SEARCH_INDEX_PATH || path.resolve(DATA_DIR, "search.sqlite3");
8
+ const EMBEDDING_API_KEY_PATH = path.resolve(DATA_DIR, "embedding-api-key");
6
9
  const paths = {
7
10
  packageRoot: path.resolve(PACKAGE_ROOT),
8
11
  clientDist: path.resolve(PACKAGE_ROOT, "client/dist"),
9
12
  clientIndex: path.resolve(PACKAGE_ROOT, "client/dist/index.html"),
10
- imageDir: path.resolve(IMAGE_DIR)
13
+ imageDir: path.resolve(IMAGE_DIR),
14
+ searchIndex: path.resolve(SEARCH_INDEX_PATH),
15
+ embeddingApiKey: path.resolve(EMBEDDING_API_KEY_PATH)
11
16
  };
12
17
  export {
13
18
  paths
@@ -7,6 +7,13 @@ import {
7
7
  createMcpAdminSetEnabledHandler,
8
8
  createMcpAdminStatusHandler
9
9
  } from "../features/mcp-admin/http/handlers.js";
10
+ import {
11
+ createSearchAdminListModelsHandler,
12
+ createSearchAdminReindexHandler,
13
+ createSearchAdminSaveConfigHandler,
14
+ createSearchAdminStatusHandler,
15
+ createSearchAdminTestConnectionHandler
16
+ } from "../features/search/http/handlers.js";
10
17
  import { createCsrfProtection, requireSessionForWrite } from "../modules/auth-guard.js";
11
18
  import { createAuthAttemptRateLimit, createSessionAccessRateLimit } from "../modules/rate-limit.js";
12
19
  import { createServerEventsHandler } from "../modules/server-events-handler.js";
@@ -46,6 +53,36 @@ const createApiRouter = (authConfig, mcpAdminService) => {
46
53
  requireSession,
47
54
  csrfProtection,
48
55
  useAsync(createMcpAdminRevokeTokenHandler(mcpAdminService))
56
+ ).get(
57
+ "/search-admin/status",
58
+ sessionAccessRateLimit,
59
+ requireSession,
60
+ csrfProtection,
61
+ useAsync(createSearchAdminStatusHandler())
62
+ ).post(
63
+ "/search-admin/config",
64
+ sessionAccessRateLimit,
65
+ requireSession,
66
+ csrfProtection,
67
+ useAsync(createSearchAdminSaveConfigHandler())
68
+ ).post(
69
+ "/search-admin/models",
70
+ sessionAccessRateLimit,
71
+ requireSession,
72
+ csrfProtection,
73
+ useAsync(createSearchAdminListModelsHandler())
74
+ ).post(
75
+ "/search-admin/test",
76
+ sessionAccessRateLimit,
77
+ requireSession,
78
+ csrfProtection,
79
+ useAsync(createSearchAdminTestConnectionHandler())
80
+ ).post(
81
+ "/search-admin/reindex",
82
+ sessionAccessRateLimit,
83
+ requireSession,
84
+ csrfProtection,
85
+ useAsync(createSearchAdminReindexHandler())
49
86
  ).post("/image", sessionAccessRateLimit, requireSession, csrfProtection, useAsync(createUploadImageHandler())).get("/events", sessionAccessRateLimit, requireSession, csrfProtection, createServerEventsHandler());
50
87
  };
51
88
  export {
@@ -6,7 +6,6 @@ import {
6
6
  createMcpNoteWriteBaselineHandler,
7
7
  createMcpPatchNoteMarkdownHandler,
8
8
  createMcpReplaceNoteMarkdownHandler,
9
- createMcpUpdateNoteHandler,
10
9
  createMcpUpdateNoteMetadataHandler
11
10
  } from "../features/note/http/mcp.js";
12
11
  import { createMcpCreateTagHandler } from "../features/tag/http/mcp.js";
@@ -16,10 +15,6 @@ const createMcpRouter = (authConfig, mcpAdminService) => Router().post(
16
15
  "/notes/create",
17
16
  createMcpAuthMiddleware(authConfig, mcpAdminService),
18
17
  useAsync(createMcpCreateNoteHandler())
19
- ).post(
20
- "/notes/update",
21
- createMcpAuthMiddleware(authConfig, mcpAdminService),
22
- useAsync(createMcpUpdateNoteHandler())
23
18
  ).post(
24
19
  "/notes/baseline",
25
20
  createMcpAuthMiddleware(authConfig, mcpAdminService),
@@ -4,6 +4,7 @@ import { imageResolvers, imageTypeDefs } from "../features/image/graphql/index.j
4
4
  import { noteResolvers, noteTypeDefs } from "../features/note/graphql/index.js";
5
5
  import { placeholderResolvers, placeholderTypeDefs } from "../features/placeholder/graphql/index.js";
6
6
  import { reminderResolvers, reminderTypeDefs } from "../features/reminder/graphql/index.js";
7
+ import { searchResolvers, searchTypeDefs } from "../features/search/graphql/index.js";
7
8
  import { tagResolvers, tagTypeDefs } from "../features/tag/graphql/index.js";
8
9
  import { viewResolvers, viewTypeDefs } from "../features/view/graphql/index.js";
9
10
  const schema = makeExecutableSchema({
@@ -14,6 +15,7 @@ const schema = makeExecutableSchema({
14
15
  tagTypeDefs,
15
16
  placeholderTypeDefs,
16
17
  reminderTypeDefs,
18
+ searchTypeDefs,
17
19
  viewTypeDefs
18
20
  ],
19
21
  resolvers: [
@@ -23,6 +25,7 @@ const schema = makeExecutableSchema({
23
25
  tagResolvers,
24
26
  placeholderResolvers,
25
27
  reminderResolvers,
28
+ searchResolvers,
26
29
  viewResolvers
27
30
  ]
28
31
  });
@@ -1 +0,0 @@
1
- import{a as e}from"./graph-vendor-BAF95C0g.js";import{a7 as r}from"./index-BR05aSXr.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"}))]]),a=e.forwardRef((t,l)=>e.createElement(r,{ref:l,...t,weights:n}));a.displayName="ArrowRightIcon";const o=a;export{o as s};