ocean-brain 0.7.5 → 0.8.1

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 (263) hide show
  1. package/dist/index.js +3 -3
  2. package/dist/mcp.js +180 -736
  3. package/package.json +6 -2
  4. package/server/client/dist/assets/ArrowRight.es-CbA8ey6a.js +1 -0
  5. package/server/client/dist/assets/{Calendar-Bc2zJueR.js → Calendar-CgWgr1BV.js} +2 -2
  6. package/server/client/dist/assets/Callout-DKruIT0f.js +1 -0
  7. package/server/client/dist/assets/Copy.es-DFbgpaNJ.js +1 -0
  8. package/server/client/dist/assets/Graph-kCltGRlY.js +1 -0
  9. package/server/client/dist/assets/{Image-DxWhlIDG.js → Image-7W0DZwMo.js} +1 -1
  10. package/server/client/dist/assets/Image.es-5pXLx9TU.js +1 -0
  11. package/server/client/dist/assets/Note-BW6Np_5g.js +20 -0
  12. package/server/client/dist/assets/Plus.es-B0sg64VJ.js +1 -0
  13. package/server/client/dist/assets/Reminders-C10fHQcl.js +1 -0
  14. package/server/client/dist/assets/Search-tf2nV4v0.js +1 -0
  15. package/server/client/dist/assets/{SurfaceCard-CkAVMLPs.js → SurfaceCard-pydtvHfu.js} +1 -1
  16. package/server/client/dist/assets/Tag-uCoYbISy.js +1 -0
  17. package/server/client/dist/assets/TagNotes-CqOcQiRw.js +1 -0
  18. package/server/client/dist/assets/Trash.es-w32Goxfa.js +1 -0
  19. package/server/client/dist/assets/ViewNotes-slPXXoOY.js +1 -0
  20. package/server/client/dist/assets/ViewSectionDialog-brTrsF6G.js +102 -0
  21. package/server/client/dist/assets/Views-B_wsb-XJ.js +1 -0
  22. package/server/client/dist/assets/{graph-vendor-CUxe67Lr.js → graph-vendor-BAF95C0g.js} +2 -2
  23. package/server/client/dist/assets/image.api-CYsjXiMr.js +17 -0
  24. package/server/client/dist/assets/index-BR05aSXr.js +342 -0
  25. package/server/client/dist/assets/{index-D3BfroIT.js → index-D83QbOcw.js} +1 -1
  26. package/server/client/dist/assets/{index-C5BGzDgt.css → index-DPI6YoDt.css} +1 -1
  27. package/server/client/dist/assets/manage-image-BYIhWu56.js +1 -0
  28. package/server/client/dist/assets/{manage-image-detail-C8Q7K7I3.js → manage-image-detail-6KgmQvbN.js} +1 -1
  29. package/server/client/dist/assets/mcp-Dd98N9Hq.js +4 -0
  30. package/server/client/dist/assets/mcp-admin-adapter-DOgBsYpl.js +1 -0
  31. package/server/client/dist/assets/note-core-CMGUaW1v.js +176 -0
  32. package/server/client/dist/assets/note-vendor-Hoz9Q4-4.js +54 -0
  33. package/server/client/dist/assets/{placeholder-Cr_nI8UI.js → placeholder-siHGg9aK.js} +4 -4
  34. package/server/client/dist/assets/{properties-CvYWJWUM.js → properties-CyVRKgcT.js} +1 -1
  35. package/server/client/dist/assets/tag.api-CwmC8crB.js +21 -0
  36. package/server/client/dist/assets/trash-wojQBK9Z.js +1 -0
  37. package/server/client/dist/assets/{useReminderMutate-CDmIEwsw.js → useReminderMutate-DuVKxpBh.js} +1 -1
  38. package/server/client/dist/index.html +5 -5
  39. package/server/dist/app.js +0 -1
  40. package/server/dist/features/auth/http/api.js +0 -1
  41. package/server/dist/features/auth/http/login-page.js +272 -5
  42. package/server/dist/features/auth/http/pages.js +20 -3
  43. package/server/dist/features/auth/service.js +3 -2
  44. package/server/dist/features/cache/graphql/cache.field.resolver.js +0 -1
  45. package/server/dist/features/cache/graphql/cache.mutation.resolver.js +0 -1
  46. package/server/dist/features/cache/graphql/cache.query.resolver.js +0 -1
  47. package/server/dist/features/cache/graphql/cache.resolver.js +0 -1
  48. package/server/dist/features/cache/graphql/cache.type-defs.js +0 -1
  49. package/server/dist/features/cache/graphql/index.js +0 -1
  50. package/server/dist/features/image/graphql/image.field.resolver.js +0 -1
  51. package/server/dist/features/image/graphql/image.mutation.resolver.js +0 -1
  52. package/server/dist/features/image/graphql/image.query.resolver.js +0 -1
  53. package/server/dist/features/image/graphql/image.resolver.js +0 -1
  54. package/server/dist/features/image/graphql/image.type-defs.js +0 -1
  55. package/server/dist/features/image/graphql/index.js +0 -1
  56. package/server/dist/features/image/http/upload.js +34 -24
  57. package/server/dist/features/image/services/delete.js +0 -1
  58. package/server/dist/features/image/services/upload.js +0 -1
  59. package/server/dist/features/image/services/validation.js +110 -0
  60. package/server/dist/features/mcp-admin/http/handlers.js +11 -4
  61. package/server/dist/features/mcp-admin/service.js +0 -1
  62. package/server/dist/features/note/graphql/index.js +0 -1
  63. package/server/dist/features/note/graphql/note.field.resolver.js +0 -1
  64. package/server/dist/features/note/graphql/note.mutation.resolver.js +0 -1
  65. package/server/dist/features/note/graphql/note.query.resolver.js +0 -1
  66. package/server/dist/features/note/graphql/note.resolver.js +0 -1
  67. package/server/dist/features/note/graphql/note.type-defs.js +0 -1
  68. package/server/dist/features/note/http/mcp.js +8 -44
  69. package/server/dist/features/note/services/authoring.js +0 -1
  70. package/server/dist/features/note/services/cleanup.js +2 -3
  71. package/server/dist/features/note/services/content-blocks.js +0 -1
  72. package/server/dist/features/note/services/markdown-intent-write.js +11 -44
  73. package/server/dist/features/note/services/markdown-patch.js +4 -124
  74. package/server/dist/features/note/services/properties.js +0 -1
  75. package/server/dist/features/note/services/search-backfill.js +0 -1
  76. package/server/dist/features/note/services/search.js +0 -1
  77. package/server/dist/features/note/services/snapshot.js +0 -1
  78. package/server/dist/features/note/services/tag-filter.js +0 -1
  79. package/server/dist/features/note/services/trash.js +0 -1
  80. package/server/dist/features/note/services/write-conflict.js +0 -1
  81. package/server/dist/features/note/services/write.js +13 -14
  82. package/server/dist/features/placeholder/graphql/index.js +0 -1
  83. package/server/dist/features/placeholder/graphql/placeholder.field.resolver.js +0 -1
  84. package/server/dist/features/placeholder/graphql/placeholder.mutation.resolver.js +0 -1
  85. package/server/dist/features/placeholder/graphql/placeholder.query.resolver.js +0 -1
  86. package/server/dist/features/placeholder/graphql/placeholder.resolver.js +0 -1
  87. package/server/dist/features/placeholder/graphql/placeholder.type-defs.js +0 -1
  88. package/server/dist/features/reminder/graphql/index.js +0 -1
  89. package/server/dist/features/reminder/graphql/reminder.field.resolver.js +0 -1
  90. package/server/dist/features/reminder/graphql/reminder.mutation.resolver.js +0 -1
  91. package/server/dist/features/reminder/graphql/reminder.query.resolver.js +0 -1
  92. package/server/dist/features/reminder/graphql/reminder.resolver.js +0 -1
  93. package/server/dist/features/reminder/graphql/reminder.type-defs.js +0 -1
  94. package/server/dist/features/tag/graphql/index.js +0 -1
  95. package/server/dist/features/tag/graphql/tag.field.resolver.js +0 -1
  96. package/server/dist/features/tag/graphql/tag.mutation.resolver.js +0 -1
  97. package/server/dist/features/tag/graphql/tag.query.resolver.js +16 -2
  98. package/server/dist/features/tag/graphql/tag.resolver.js +0 -1
  99. package/server/dist/features/tag/graphql/tag.type-defs.js +2 -1
  100. package/server/dist/features/tag/http/mcp.js +0 -1
  101. package/server/dist/features/tag/services/organization.js +0 -1
  102. package/server/dist/features/view/graphql/index.js +0 -1
  103. package/server/dist/features/view/graphql/view.mutation.resolver.js +0 -1
  104. package/server/dist/features/view/graphql/view.query.resolver.js +0 -1
  105. package/server/dist/features/view/graphql/view.resolver.js +0 -1
  106. package/server/dist/features/view/graphql/view.type-defs.js +0 -1
  107. package/server/dist/features/view/services/workspace.js +0 -1
  108. package/server/dist/main.js +0 -1
  109. package/server/dist/models.js +0 -1
  110. package/server/dist/modules/app-version.js +104 -0
  111. package/server/dist/modules/auth-guard.js +0 -1
  112. package/server/dist/modules/auth-mode.js +0 -1
  113. package/server/dist/modules/auth-redirect.js +0 -1
  114. package/server/dist/modules/blocknote-markdown-editor.js +53 -0
  115. package/server/dist/modules/blocknote-tree.js +0 -1
  116. package/server/dist/modules/blocknote.js +10 -4
  117. package/server/dist/modules/data-maintenance.js +0 -1
  118. package/server/dist/modules/error-handler.js +0 -1
  119. package/server/dist/modules/graphql.js +0 -1
  120. package/server/dist/modules/logger.js +0 -1
  121. package/server/dist/modules/mcp-auth.js +62 -2
  122. package/server/dist/modules/mcp-token.js +0 -1
  123. package/server/dist/modules/prisma-runtime.js +0 -1
  124. package/server/dist/modules/rate-limit.js +0 -1
  125. package/server/dist/modules/recovery-retention.js +0 -1
  126. package/server/dist/modules/server-events-handler.js +0 -1
  127. package/server/dist/modules/server-events.js +0 -1
  128. package/server/dist/modules/session-store.js +0 -1
  129. package/server/dist/modules/use-async.js +0 -1
  130. package/server/dist/paths.js +1 -1
  131. package/server/dist/routes/api.js +2 -9
  132. package/server/dist/routes/auth-pages.js +0 -1
  133. package/server/dist/routes/client.js +51 -2
  134. package/server/dist/routes/graphql.js +0 -1
  135. package/server/dist/routes/index.js +0 -1
  136. package/server/dist/routes/mcp.js +0 -1
  137. package/server/dist/schema/index.js +0 -1
  138. package/server/dist/start.js +0 -1
  139. package/server/dist/types/index.js +0 -1
  140. package/server/dist/types/input.js +0 -1
  141. package/server/client/dist/assets/Callout-B4kA_Cvr.js +0 -1
  142. package/server/client/dist/assets/Graph-uq5jfJgt.js +0 -1
  143. package/server/client/dist/assets/Image.es-BpAOJjJT.js +0 -1
  144. package/server/client/dist/assets/Note-Bo8ZYRP-.js +0 -22
  145. package/server/client/dist/assets/Plus.es-Dc_js8AC.js +0 -1
  146. package/server/client/dist/assets/Reminders-lj7Equld.js +0 -1
  147. package/server/client/dist/assets/Search-1wcRO5--.js +0 -1
  148. package/server/client/dist/assets/Tag-CeygwFfv.js +0 -1
  149. package/server/client/dist/assets/TagNotes-B8DqItxw.js +0 -1
  150. package/server/client/dist/assets/Trash.es-OuQVb_SX.js +0 -1
  151. package/server/client/dist/assets/ViewNotes-BH7PbdOD.js +0 -1
  152. package/server/client/dist/assets/ViewSectionTableRenderer-BJwhd5be.js +0 -102
  153. package/server/client/dist/assets/Views-eYFtsdFj.js +0 -1
  154. package/server/client/dist/assets/image.api-C0eYGCeH.js +0 -17
  155. package/server/client/dist/assets/index-jIfkRdY_.js +0 -361
  156. package/server/client/dist/assets/manage-image-C0YwkLIP.js +0 -1
  157. package/server/client/dist/assets/mcp-DHHhTLC8.js +0 -1
  158. package/server/client/dist/assets/note-core-Z6kqulGB.js +0 -180
  159. package/server/client/dist/assets/note-vendor-i1M2FSI2.js +0 -54
  160. package/server/client/dist/assets/trash-DA27aW7L.js +0 -1
  161. package/server/client/dist/fonts/Pretendard-Bold.woff +0 -0
  162. package/server/client/dist/fonts/Pretendard-Regular.woff +0 -0
  163. package/server/dist/app.js.map +0 -1
  164. package/server/dist/features/auth/http/api.js.map +0 -1
  165. package/server/dist/features/auth/http/login-page.js.map +0 -1
  166. package/server/dist/features/auth/http/pages.js.map +0 -1
  167. package/server/dist/features/auth/service.js.map +0 -1
  168. package/server/dist/features/cache/graphql/cache.field.resolver.js.map +0 -1
  169. package/server/dist/features/cache/graphql/cache.mutation.resolver.js.map +0 -1
  170. package/server/dist/features/cache/graphql/cache.query.resolver.js.map +0 -1
  171. package/server/dist/features/cache/graphql/cache.resolver.js.map +0 -1
  172. package/server/dist/features/cache/graphql/cache.type-defs.js.map +0 -1
  173. package/server/dist/features/cache/graphql/index.js.map +0 -1
  174. package/server/dist/features/image/graphql/image.field.resolver.js.map +0 -1
  175. package/server/dist/features/image/graphql/image.mutation.resolver.js.map +0 -1
  176. package/server/dist/features/image/graphql/image.query.resolver.js.map +0 -1
  177. package/server/dist/features/image/graphql/image.resolver.js.map +0 -1
  178. package/server/dist/features/image/graphql/image.type-defs.js.map +0 -1
  179. package/server/dist/features/image/graphql/index.js.map +0 -1
  180. package/server/dist/features/image/http/upload.js.map +0 -1
  181. package/server/dist/features/image/services/delete.js.map +0 -1
  182. package/server/dist/features/image/services/remote-fetch.js +0 -176
  183. package/server/dist/features/image/services/remote-fetch.js.map +0 -1
  184. package/server/dist/features/image/services/upload.js.map +0 -1
  185. package/server/dist/features/mcp-admin/http/handlers.js.map +0 -1
  186. package/server/dist/features/mcp-admin/service.js.map +0 -1
  187. package/server/dist/features/note/graphql/index.js.map +0 -1
  188. package/server/dist/features/note/graphql/note.field.resolver.js.map +0 -1
  189. package/server/dist/features/note/graphql/note.mutation.resolver.js.map +0 -1
  190. package/server/dist/features/note/graphql/note.query.resolver.js.map +0 -1
  191. package/server/dist/features/note/graphql/note.resolver.js.map +0 -1
  192. package/server/dist/features/note/graphql/note.type-defs.js.map +0 -1
  193. package/server/dist/features/note/http/mcp.js.map +0 -1
  194. package/server/dist/features/note/services/authoring.js.map +0 -1
  195. package/server/dist/features/note/services/cleanup.js.map +0 -1
  196. package/server/dist/features/note/services/content-blocks.js.map +0 -1
  197. package/server/dist/features/note/services/markdown-intent-write.js.map +0 -1
  198. package/server/dist/features/note/services/markdown-patch.js.map +0 -1
  199. package/server/dist/features/note/services/properties.js.map +0 -1
  200. package/server/dist/features/note/services/search-backfill.js.map +0 -1
  201. package/server/dist/features/note/services/search.js.map +0 -1
  202. package/server/dist/features/note/services/snapshot.js.map +0 -1
  203. package/server/dist/features/note/services/tag-filter.js.map +0 -1
  204. package/server/dist/features/note/services/trash.js.map +0 -1
  205. package/server/dist/features/note/services/write-conflict.js.map +0 -1
  206. package/server/dist/features/note/services/write.js.map +0 -1
  207. package/server/dist/features/placeholder/graphql/index.js.map +0 -1
  208. package/server/dist/features/placeholder/graphql/placeholder.field.resolver.js.map +0 -1
  209. package/server/dist/features/placeholder/graphql/placeholder.mutation.resolver.js.map +0 -1
  210. package/server/dist/features/placeholder/graphql/placeholder.query.resolver.js.map +0 -1
  211. package/server/dist/features/placeholder/graphql/placeholder.resolver.js.map +0 -1
  212. package/server/dist/features/placeholder/graphql/placeholder.type-defs.js.map +0 -1
  213. package/server/dist/features/reminder/graphql/index.js.map +0 -1
  214. package/server/dist/features/reminder/graphql/reminder.field.resolver.js.map +0 -1
  215. package/server/dist/features/reminder/graphql/reminder.mutation.resolver.js.map +0 -1
  216. package/server/dist/features/reminder/graphql/reminder.query.resolver.js.map +0 -1
  217. package/server/dist/features/reminder/graphql/reminder.resolver.js.map +0 -1
  218. package/server/dist/features/reminder/graphql/reminder.type-defs.js.map +0 -1
  219. package/server/dist/features/tag/graphql/index.js.map +0 -1
  220. package/server/dist/features/tag/graphql/tag.field.resolver.js.map +0 -1
  221. package/server/dist/features/tag/graphql/tag.mutation.resolver.js.map +0 -1
  222. package/server/dist/features/tag/graphql/tag.query.resolver.js.map +0 -1
  223. package/server/dist/features/tag/graphql/tag.resolver.js.map +0 -1
  224. package/server/dist/features/tag/graphql/tag.type-defs.js.map +0 -1
  225. package/server/dist/features/tag/http/mcp.js.map +0 -1
  226. package/server/dist/features/tag/services/organization.js.map +0 -1
  227. package/server/dist/features/view/graphql/index.js.map +0 -1
  228. package/server/dist/features/view/graphql/view.mutation.resolver.js.map +0 -1
  229. package/server/dist/features/view/graphql/view.query.resolver.js.map +0 -1
  230. package/server/dist/features/view/graphql/view.resolver.js.map +0 -1
  231. package/server/dist/features/view/graphql/view.type-defs.js.map +0 -1
  232. package/server/dist/features/view/services/workspace.js.map +0 -1
  233. package/server/dist/main.js.map +0 -1
  234. package/server/dist/models.js.map +0 -1
  235. package/server/dist/modules/auth-guard.js.map +0 -1
  236. package/server/dist/modules/auth-mode.js.map +0 -1
  237. package/server/dist/modules/auth-redirect.js.map +0 -1
  238. package/server/dist/modules/blocknote-tree.js.map +0 -1
  239. package/server/dist/modules/blocknote.js.map +0 -1
  240. package/server/dist/modules/data-maintenance.js.map +0 -1
  241. package/server/dist/modules/error-handler.js.map +0 -1
  242. package/server/dist/modules/graphql.js.map +0 -1
  243. package/server/dist/modules/logger.js.map +0 -1
  244. package/server/dist/modules/mcp-auth.js.map +0 -1
  245. package/server/dist/modules/mcp-token.js.map +0 -1
  246. package/server/dist/modules/prisma-runtime.js.map +0 -1
  247. package/server/dist/modules/rate-limit.js.map +0 -1
  248. package/server/dist/modules/recovery-retention.js.map +0 -1
  249. package/server/dist/modules/server-events-handler.js.map +0 -1
  250. package/server/dist/modules/server-events.js.map +0 -1
  251. package/server/dist/modules/session-store.js.map +0 -1
  252. package/server/dist/modules/use-async.js.map +0 -1
  253. package/server/dist/paths.js.map +0 -1
  254. package/server/dist/routes/api.js.map +0 -1
  255. package/server/dist/routes/auth-pages.js.map +0 -1
  256. package/server/dist/routes/client.js.map +0 -1
  257. package/server/dist/routes/graphql.js.map +0 -1
  258. package/server/dist/routes/index.js.map +0 -1
  259. package/server/dist/routes/mcp.js.map +0 -1
  260. package/server/dist/schema/index.js.map +0 -1
  261. package/server/dist/start.js.map +0 -1
  262. package/server/dist/types/index.js.map +0 -1
  263. package/server/dist/types/input.js.map +0 -1
@@ -0,0 +1,104 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { paths } from "../paths.js";
4
+ const OCEAN_BRAIN_RELEASES_URL = "https://github.com/baealex/ocean-brain/releases";
5
+ const OCEAN_BRAIN_MCP_COMPATIBILITY_VERSION_HEADER = "X-Ocean-Brain-MCP-Compatibility-Version";
6
+ const OCEAN_BRAIN_MCP_CLIENT_VERSION_HEADER = "X-Ocean-Brain-MCP-Client-Version";
7
+ const normalizeVersion = (version) => version.trim().replace(/^v/i, "");
8
+ const parseMajorMinorVersion = (version) => {
9
+ const match = normalizeVersion(version).match(/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/);
10
+ if (!match) {
11
+ return null;
12
+ }
13
+ return {
14
+ major: Number(match[1]),
15
+ minor: Number(match[2])
16
+ };
17
+ };
18
+ const formatMcpVersionRequirement = (mcpCompatibilityVersion) => {
19
+ const parsed = parseMajorMinorVersion(mcpCompatibilityVersion);
20
+ return parsed ? `${parsed.major}.${parsed.minor}.x` : "unknown";
21
+ };
22
+ const readPackageMetadata = (packageJsonPath) => {
23
+ try {
24
+ return JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
25
+ } catch {
26
+ return void 0;
27
+ }
28
+ };
29
+ const readPackageVersion = (packageJsonPath) => {
30
+ const packageJson = readPackageMetadata(packageJsonPath);
31
+ return typeof packageJson?.version === "string" ? packageJson.version : void 0;
32
+ };
33
+ const readPackageMcpCompatibilityVersion = (packageJsonPath) => {
34
+ const packageJson = readPackageMetadata(packageJsonPath);
35
+ const version = packageJson?.oceanBrain?.mcpCompatibilityVersion;
36
+ return typeof version === "string" ? version : void 0;
37
+ };
38
+ const createMissingMcpCompatibilityVersionError = () => new Error("Ocean Brain MCP compatibility version is required in package metadata.");
39
+ const getVersionCandidatePaths = () => {
40
+ return Array.from(
41
+ /* @__PURE__ */ new Set([
42
+ path.resolve(paths.packageRoot, "..", "package.json"),
43
+ path.resolve(paths.packageRoot, "..", "cli", "package.json"),
44
+ path.resolve(process.cwd(), "packages", "cli", "package.json"),
45
+ path.resolve(process.cwd(), "..", "cli", "package.json")
46
+ ])
47
+ );
48
+ };
49
+ const resolveOceanBrainVersion = () => {
50
+ for (const candidatePath of getVersionCandidatePaths()) {
51
+ const version = readPackageVersion(candidatePath);
52
+ if (version) {
53
+ return normalizeVersion(version);
54
+ }
55
+ }
56
+ if (process.env.OCEAN_BRAIN_VERSION) {
57
+ return normalizeVersion(process.env.OCEAN_BRAIN_VERSION);
58
+ }
59
+ return "0.0.0";
60
+ };
61
+ const resolveMcpCompatibilityVersionFromPaths = (candidatePaths) => {
62
+ for (const candidatePath of candidatePaths) {
63
+ const version = readPackageMcpCompatibilityVersion(candidatePath);
64
+ if (version) {
65
+ return normalizeVersion(version);
66
+ }
67
+ }
68
+ throw createMissingMcpCompatibilityVersionError();
69
+ };
70
+ const resolveMcpCompatibilityVersion = () => resolveMcpCompatibilityVersionFromPaths(getVersionCandidatePaths());
71
+ const buildOceanBrainVersionInfo = ({
72
+ mcpCompatibilityVersion,
73
+ version
74
+ }) => {
75
+ const compatibilityVersion = normalizeVersion(mcpCompatibilityVersion);
76
+ const compatibilityRequirement = formatMcpVersionRequirement(compatibilityVersion);
77
+ return {
78
+ version: normalizeVersion(version),
79
+ releaseUrl: OCEAN_BRAIN_RELEASES_URL,
80
+ mcpVersionRequirement: compatibilityRequirement,
81
+ mcp: {
82
+ compatibilityVersion,
83
+ compatibilityRequirement,
84
+ compatibilityVersionHeader: OCEAN_BRAIN_MCP_COMPATIBILITY_VERSION_HEADER,
85
+ clientVersionHeader: OCEAN_BRAIN_MCP_CLIENT_VERSION_HEADER
86
+ }
87
+ };
88
+ };
89
+ const getOceanBrainVersionInfo = () => buildOceanBrainVersionInfo({
90
+ version: resolveOceanBrainVersion(),
91
+ mcpCompatibilityVersion: resolveMcpCompatibilityVersion()
92
+ });
93
+ export {
94
+ OCEAN_BRAIN_MCP_CLIENT_VERSION_HEADER,
95
+ OCEAN_BRAIN_MCP_COMPATIBILITY_VERSION_HEADER,
96
+ OCEAN_BRAIN_RELEASES_URL,
97
+ buildOceanBrainVersionInfo,
98
+ formatMcpVersionRequirement,
99
+ getOceanBrainVersionInfo,
100
+ parseMajorMinorVersion,
101
+ resolveMcpCompatibilityVersion,
102
+ resolveMcpCompatibilityVersionFromPaths,
103
+ resolveOceanBrainVersion
104
+ };
@@ -102,4 +102,3 @@ export {
102
102
  requireSessionForGraphql,
103
103
  requireSessionForWrite
104
104
  };
105
- //# sourceMappingURL=auth-guard.js.map
@@ -23,4 +23,3 @@ export {
23
23
  logAuthConfig,
24
24
  resolveAuthConfig
25
25
  };
26
- //# sourceMappingURL=auth-mode.js.map
@@ -7,4 +7,3 @@ const sanitizeRedirectPath = (value) => sanitizeCommonRedirectPath(value, {
7
7
  export {
8
8
  sanitizeRedirectPath
9
9
  };
10
- //# sourceMappingURL=auth-redirect.js.map
@@ -0,0 +1,53 @@
1
+ import { BlockNoteEditor } from "@blocknote/core";
2
+ import { JSDOM } from "jsdom";
3
+ const restoreGlobalProperty = (key, descriptor) => {
4
+ if (descriptor) {
5
+ Object.defineProperty(globalThis, key, descriptor);
6
+ return;
7
+ }
8
+ Reflect.deleteProperty(globalThis, key);
9
+ };
10
+ class BlockNoteMarkdownEditor {
11
+ editor = BlockNoteEditor.create();
12
+ dom = new JSDOM();
13
+ queue = Promise.resolve();
14
+ static create() {
15
+ return new BlockNoteMarkdownEditor();
16
+ }
17
+ runWithDom(operation) {
18
+ const run = this.queue.then(async () => {
19
+ const previousWindow = Object.getOwnPropertyDescriptor(globalThis, "window");
20
+ const previousDocument = Object.getOwnPropertyDescriptor(globalThis, "document");
21
+ Object.defineProperty(globalThis, "window", {
22
+ configurable: true,
23
+ writable: true,
24
+ value: this.dom.window
25
+ });
26
+ Object.defineProperty(globalThis, "document", {
27
+ configurable: true,
28
+ writable: true,
29
+ value: this.dom.window.document
30
+ });
31
+ try {
32
+ return await operation();
33
+ } finally {
34
+ restoreGlobalProperty("window", previousWindow);
35
+ restoreGlobalProperty("document", previousDocument);
36
+ }
37
+ });
38
+ this.queue = run.then(
39
+ () => void 0,
40
+ () => void 0
41
+ );
42
+ return run;
43
+ }
44
+ blocksToMarkdownLossy(blocks) {
45
+ return this.runWithDom(() => this.editor.blocksToMarkdownLossy(blocks));
46
+ }
47
+ tryParseMarkdownToBlocks(markdown) {
48
+ return this.runWithDom(() => this.editor.tryParseMarkdownToBlocks(markdown));
49
+ }
50
+ }
51
+ export {
52
+ BlockNoteMarkdownEditor
53
+ };
@@ -38,4 +38,3 @@ export {
38
38
  parseBlockNoteContent,
39
39
  walkBlockNoteTree
40
40
  };
41
- //# sourceMappingURL=blocknote-tree.js.map
@@ -1,6 +1,6 @@
1
- import { ServerBlockNoteEditor } from "@blocknote/server-util";
2
1
  import { ensureTagByName } from "../features/tag/services/organization.js";
3
2
  import models from "../models.js";
3
+ import { BlockNoteMarkdownEditor } from "./blocknote-markdown-editor.js";
4
4
  const UNSUPPORTED_MARKDOWN_BLOCK_TYPES = /* @__PURE__ */ new Set(["tableOfContents"]);
5
5
  const TAG_PLACEHOLDER_PREFIX = "OCEAN_BRAIN_TAG_";
6
6
  const TAG_PLACEHOLDER_SUFFIX = "_TOKEN";
@@ -529,7 +529,7 @@ function protectMarkdownLineEndHardBreakMarker(line, lineEnding, hasContinuation
529
529
  }
530
530
  const placeholder = createHardBreakPlaceholder(placeholderToToken.size);
531
531
  const shouldPreserveAsHardBreak = hasContinuationLine && !hasUnclosedInlineCodeSpanAtLineEnd(line);
532
- placeholderToToken.set(placeholder, shouldPreserveAsHardBreak ? "" : "\\");
532
+ placeholderToToken.set(placeholder, shouldPreserveAsHardBreak ? "\n" : "\\");
533
533
  return `${line.slice(0, -1)}${placeholder}`;
534
534
  }
535
535
  function isMarkdownHardBreakContinuationLine(line) {
@@ -654,6 +654,13 @@ function restoreProtectedTextInValue(value, placeholderToToken) {
654
654
  function restoreProtectedText(text, placeholderToToken) {
655
655
  let restoredText = text;
656
656
  for (const [placeholder, token] of placeholderToToken.entries()) {
657
+ if (placeholder.startsWith(HARD_BREAK_PLACEHOLDER_PREFIX) && token === "\n") {
658
+ restoredText = restoredText.split(`${placeholder} `).join(placeholder).split(`${placeholder}
659
+ `).join(`${placeholder}
660
+ `).split(`${placeholder}\r
661
+ `).join(`${placeholder}\r
662
+ `);
663
+ }
657
664
  restoredText = restoredText.split(placeholder).join(token);
658
665
  }
659
666
  return restoredText;
@@ -828,7 +835,7 @@ function collectTagIds(blocks) {
828
835
  let editorInstance = null;
829
836
  function getEditor() {
830
837
  if (!editorInstance) {
831
- editorInstance = ServerBlockNoteEditor.create();
838
+ editorInstance = BlockNoteMarkdownEditor.create();
832
839
  }
833
840
  return editorInstance;
834
841
  }
@@ -943,4 +950,3 @@ export {
943
950
  hasUnsupportedMarkdownBlocks,
944
951
  markdownToBlocksJson
945
952
  };
946
- //# sourceMappingURL=blocknote.js.map
@@ -72,4 +72,3 @@ export {
72
72
  runDataMaintenanceInBackground,
73
73
  startDataMaintenanceScheduler
74
74
  };
75
- //# sourceMappingURL=data-maintenance.js.map
@@ -48,4 +48,3 @@ export {
48
48
  createAppError,
49
49
  createErrorHandler
50
50
  };
51
- //# sourceMappingURL=error-handler.js.map
@@ -4,4 +4,3 @@ function gql(texts, ...values) {
4
4
  export {
5
5
  gql
6
6
  };
7
- //# sourceMappingURL=graphql.js.map
@@ -51,4 +51,3 @@ export {
51
51
  logger_default as default,
52
52
  loggerOptions
53
53
  };
54
- //# sourceMappingURL=logger.js.map
@@ -1,5 +1,42 @@
1
1
  import { GraphQLError } from "graphql";
2
+ import {
3
+ getOceanBrainVersionInfo,
4
+ OCEAN_BRAIN_MCP_CLIENT_VERSION_HEADER,
5
+ OCEAN_BRAIN_MCP_COMPATIBILITY_VERSION_HEADER,
6
+ parseMajorMinorVersion
7
+ } from "./app-version.js";
2
8
  const JSON_HEADERS = { "Content-Type": "application/json" };
9
+ const OCEAN_BRAIN_MCP_VERSION_HEADER = "X-Ocean-Brain-MCP-Version";
10
+ const readHeaderValue = (req, headerName) => {
11
+ const value = req.headers[headerName.toLowerCase()];
12
+ return Array.isArray(value) ? value[0] : value;
13
+ };
14
+ const readMcpCompatibilityVersion = (req) => readHeaderValue(req, OCEAN_BRAIN_MCP_COMPATIBILITY_VERSION_HEADER) ?? readHeaderValue(req, OCEAN_BRAIN_MCP_VERSION_HEADER);
15
+ const readMcpClientVersion = (req) => readHeaderValue(req, OCEAN_BRAIN_MCP_CLIENT_VERSION_HEADER) ?? readHeaderValue(req, OCEAN_BRAIN_MCP_VERSION_HEADER);
16
+ const isMcpVersionCompatible = (requiredMcpCompatibilityVersion, mcpCompatibilityVersion) => {
17
+ const required = parseMajorMinorVersion(requiredMcpCompatibilityVersion);
18
+ const mcp = parseMajorMinorVersion(mcpCompatibilityVersion);
19
+ return Boolean(required && mcp && required.major === mcp.major && required.minor === mcp.minor);
20
+ };
21
+ const createMcpVersionCompatibilityMessage = ({
22
+ mcpClientVersion,
23
+ mcpCompatibilityVersion,
24
+ requiredMcpCompatibilityVersion,
25
+ serverVersion
26
+ }) => {
27
+ const mcpCompatibilityVersionText = mcpCompatibilityVersion ? `v${mcpCompatibilityVersion}` : "not provided";
28
+ const mcpClientVersionText = mcpClientVersion ? `v${mcpClientVersion}` : "not provided";
29
+ return [
30
+ "Ocean Brain MCP compatibility versions are incompatible.",
31
+ `Server: v${serverVersion}`,
32
+ `Required MCP compatibility: ${requiredMcpCompatibilityVersion}`,
33
+ `MCP compatibility: ${mcpCompatibilityVersionText}`,
34
+ `MCP client: ${mcpClientVersionText}`,
35
+ "",
36
+ "Please update Ocean Brain MCP to a compatible release.",
37
+ getOceanBrainVersionInfo().releaseUrl
38
+ ].join("\n");
39
+ };
3
40
  const readBearerToken = (authorizationHeader) => {
4
41
  if (!authorizationHeader?.startsWith("Bearer ")) {
5
42
  return void 0;
@@ -40,6 +77,28 @@ const createMcpAuthMiddleware = (_authConfig, mcpAdminAuth) => {
40
77
  }).end();
41
78
  return;
42
79
  }
80
+ const versionInfo = getOceanBrainVersionInfo();
81
+ const mcpCompatibilityVersion = readMcpCompatibilityVersion(req);
82
+ const mcpClientVersion = readMcpClientVersion(req);
83
+ if (!mcpCompatibilityVersion || !isMcpVersionCompatible(versionInfo.mcp.compatibilityVersion, mcpCompatibilityVersion)) {
84
+ res.status(426).set(JSON_HEADERS).json({
85
+ code: "MCP_VERSION_INCOMPATIBLE",
86
+ message: createMcpVersionCompatibilityMessage({
87
+ serverVersion: versionInfo.version,
88
+ requiredMcpCompatibilityVersion: versionInfo.mcp.compatibilityRequirement,
89
+ mcpCompatibilityVersion,
90
+ mcpClientVersion
91
+ }),
92
+ serverVersion: versionInfo.version,
93
+ mcpVersion: mcpClientVersion ?? mcpCompatibilityVersion ?? null,
94
+ mcpClientVersion: mcpClientVersion ?? null,
95
+ mcpCompatibilityVersion: mcpCompatibilityVersion ?? null,
96
+ requiredMcpVersion: versionInfo.mcpVersionRequirement,
97
+ requiredMcpCompatibilityVersion: versionInfo.mcp.compatibilityRequirement,
98
+ releaseUrl: versionInfo.releaseUrl
99
+ }).end();
100
+ return;
101
+ }
43
102
  next();
44
103
  } catch (error) {
45
104
  next(error);
@@ -64,7 +123,8 @@ const createReadOnlyMcpValidationRule = () => {
64
123
  };
65
124
  };
66
125
  export {
126
+ OCEAN_BRAIN_MCP_VERSION_HEADER,
67
127
  createMcpAuthMiddleware,
68
- createReadOnlyMcpValidationRule
128
+ createReadOnlyMcpValidationRule,
129
+ isMcpVersionCompatible
69
130
  };
70
- //# sourceMappingURL=mcp-auth.js.map
@@ -25,4 +25,3 @@ export {
25
25
  issueMcpToken,
26
26
  verifyMcpToken
27
27
  };
28
- //# sourceMappingURL=mcp-token.js.map
@@ -38,4 +38,3 @@ export {
38
38
  resolvePrismaSchemaPath,
39
39
  runPrismaMigrateDeploy
40
40
  };
41
- //# sourceMappingURL=prisma-runtime.js.map
@@ -29,4 +29,3 @@ export {
29
29
  createAuthAttemptRateLimit,
30
30
  createSessionAccessRateLimit
31
31
  };
32
- //# sourceMappingURL=rate-limit.js.map
@@ -23,4 +23,3 @@ export {
23
23
  createRetentionCutoff,
24
24
  resolveRetentionCutoff
25
25
  };
26
- //# sourceMappingURL=recovery-retention.js.map
@@ -48,4 +48,3 @@ const createServerEventsHandler = () => {
48
48
  export {
49
49
  createServerEventsHandler
50
50
  };
51
- //# sourceMappingURL=server-events-handler.js.map
@@ -29,4 +29,3 @@ export {
29
29
  serializeServerEvent,
30
30
  subscribeServerEvents
31
31
  };
32
- //# sourceMappingURL=server-events.js.map
@@ -146,4 +146,3 @@ export {
146
146
  TtlMemorySessionStore,
147
147
  createSessionStore
148
148
  };
149
- //# sourceMappingURL=session-store.js.map
@@ -8,4 +8,3 @@ function useAsync(callback) {
8
8
  export {
9
9
  useAsync as default
10
10
  };
11
- //# sourceMappingURL=use-async.js.map
@@ -4,6 +4,7 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
4
4
  const PACKAGE_ROOT = process.env.OCEAN_BRAIN_PACKAGE_ROOT || path.resolve(__dirname, "..");
5
5
  const IMAGE_DIR = process.env.OCEAN_BRAIN_IMAGE_DIR || path.resolve(process.env.OCEAN_BRAIN_DATA_DIR || ".", "assets/images");
6
6
  const paths = {
7
+ packageRoot: path.resolve(PACKAGE_ROOT),
7
8
  clientDist: path.resolve(PACKAGE_ROOT, "client/dist"),
8
9
  clientIndex: path.resolve(PACKAGE_ROOT, "client/dist/index.html"),
9
10
  imageDir: path.resolve(IMAGE_DIR)
@@ -11,4 +12,3 @@ const paths = {
11
12
  export {
12
13
  paths
13
14
  };
14
- //# sourceMappingURL=paths.js.map
@@ -1,6 +1,6 @@
1
1
  import { Router } from "express";
2
2
  import { createLoginHandler, createLogoutHandler, createSessionStatusHandler } from "../features/auth/http/api.js";
3
- import { createUploadImageFromSrcHandler, createUploadImageHandler } from "../features/image/http/upload.js";
3
+ import { createUploadImageHandler } from "../features/image/http/upload.js";
4
4
  import {
5
5
  createMcpAdminRevokeTokenHandler,
6
6
  createMcpAdminRotateTokenHandler,
@@ -46,15 +46,8 @@ const createApiRouter = (authConfig, mcpAdminService) => {
46
46
  requireSession,
47
47
  csrfProtection,
48
48
  useAsync(createMcpAdminRevokeTokenHandler(mcpAdminService))
49
- ).post("/image", sessionAccessRateLimit, requireSession, csrfProtection, useAsync(createUploadImageHandler())).post(
50
- "/image-from-src",
51
- sessionAccessRateLimit,
52
- requireSession,
53
- csrfProtection,
54
- useAsync(createUploadImageFromSrcHandler())
55
- ).get("/events", sessionAccessRateLimit, requireSession, csrfProtection, createServerEventsHandler());
49
+ ).post("/image", sessionAccessRateLimit, requireSession, csrfProtection, useAsync(createUploadImageHandler())).get("/events", sessionAccessRateLimit, requireSession, csrfProtection, createServerEventsHandler());
56
50
  };
57
51
  export {
58
52
  createApiRouter
59
53
  };
60
- //# sourceMappingURL=api.js.map
@@ -20,4 +20,3 @@ const createAuthPagesRouter = (authConfig) => {
20
20
  export {
21
21
  createAuthPagesRouter
22
22
  };
23
- //# sourceMappingURL=auth-pages.js.map
@@ -1,7 +1,9 @@
1
1
  import express, { Router } from "express";
2
+ import { rateLimit } from "express-rate-limit";
2
3
  import path from "path";
3
4
  import { createCsrfProtection, isAuthenticatedRequest } from "../modules/auth-guard.js";
4
5
  import { paths } from "../paths.js";
6
+ const IMAGE_ASSET_RATE_LIMIT_MESSAGE = "Too many image asset requests. Please try again later.";
5
7
  const shouldBlockClientRoute = (authConfig, requestPath, authenticated) => {
6
8
  if (authConfig.mode !== "password" || authenticated) {
7
9
  return false;
@@ -11,6 +13,35 @@ const shouldBlockClientRoute = (authConfig, requestPath, authenticated) => {
11
13
  }
12
14
  return path.extname(requestPath) === "";
13
15
  };
16
+ const createImageAssetAuthRateLimit = (authConfig) => rateLimit({
17
+ windowMs: 15 * 60 * 1e3,
18
+ limit: 10,
19
+ standardHeaders: true,
20
+ legacyHeaders: false,
21
+ skip: (req) => authConfig.mode !== "password" || isAuthenticatedRequest(req),
22
+ handler: (_req, res) => {
23
+ res.setHeader("Cache-Control", "no-store");
24
+ res.status(429).json({
25
+ code: "IMAGE_ASSET_RATE_LIMITED",
26
+ message: IMAGE_ASSET_RATE_LIMIT_MESSAGE
27
+ });
28
+ }
29
+ });
30
+ const createProtectedImageAssetsMiddleware = (authConfig) => {
31
+ return (req, res, next) => {
32
+ if (authConfig.mode !== "password" || isAuthenticatedRequest(req)) {
33
+ next();
34
+ return;
35
+ }
36
+ res.setHeader("Cache-Control", "no-store");
37
+ if (req.headers.accept?.includes("text/html")) {
38
+ const redirectPath = encodeURIComponent(req.originalUrl || req.url || "/");
39
+ res.redirect(303, `/login?next=${redirectPath}`);
40
+ return;
41
+ }
42
+ res.status(401).end();
43
+ };
44
+ };
14
45
  const createClientRouteCsrfTokenMiddleware = (authConfig) => {
15
46
  const csrfProtection = createCsrfProtection(authConfig);
16
47
  return (req, res, next) => {
@@ -21,7 +52,26 @@ const createClientRouteCsrfTokenMiddleware = (authConfig) => {
21
52
  csrfProtection(req, res, next);
22
53
  };
23
54
  };
24
- const createClientRouter = (authConfig) => Router().use("/assets/images", express.static(paths.imageDir)).use((req, res, next) => {
55
+ const createClientRouter = (authConfig) => Router().use(
56
+ "/assets/images",
57
+ createImageAssetAuthRateLimit(authConfig),
58
+ createProtectedImageAssetsMiddleware(authConfig),
59
+ express.static(paths.imageDir, {
60
+ setHeaders: (res) => {
61
+ res.setHeader("X-Content-Type-Options", "nosniff");
62
+ if (authConfig.mode === "password") {
63
+ res.setHeader("Cache-Control", "no-store");
64
+ }
65
+ }
66
+ }),
67
+ (_req, res) => {
68
+ res.setHeader("X-Content-Type-Options", "nosniff");
69
+ if (authConfig.mode === "password") {
70
+ res.setHeader("Cache-Control", "no-store");
71
+ }
72
+ res.status(404).end();
73
+ }
74
+ ).use((req, res, next) => {
25
75
  if (shouldBlockClientRoute(authConfig, req.path, isAuthenticatedRequest(req))) {
26
76
  const redirectPath = encodeURIComponent(req.originalUrl || "/");
27
77
  res.redirect(303, `/login?next=${redirectPath}`);
@@ -34,4 +84,3 @@ const createClientRouter = (authConfig) => Router().use("/assets/images", expres
34
84
  export {
35
85
  createClientRouter
36
86
  };
37
- //# sourceMappingURL=client.js.map
@@ -34,4 +34,3 @@ const createGraphqlRouter = (authConfig, mcpAdminService) => {
34
34
  export {
35
35
  createGraphqlRouter
36
36
  };
37
- //# sourceMappingURL=graphql.js.map
@@ -8,4 +8,3 @@ export {
8
8
  createClientRouter,
9
9
  createGraphqlRouter
10
10
  };
11
- //# sourceMappingURL=index.js.map
@@ -52,4 +52,3 @@ const createMcpRouter = (authConfig, mcpAdminService) => Router().post(
52
52
  export {
53
53
  createMcpRouter
54
54
  };
55
- //# sourceMappingURL=mcp.js.map
@@ -30,4 +30,3 @@ var schema_default = schema;
30
30
  export {
31
31
  schema_default as default
32
32
  };
33
- //# sourceMappingURL=index.js.map
@@ -8,4 +8,3 @@ try {
8
8
  `);
9
9
  process.exit(1);
10
10
  }
11
- //# sourceMappingURL=start.js.map
@@ -1,2 +1 @@
1
1
  export * from "./input.js";
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- //# sourceMappingURL=input.js.map
@@ -1 +0,0 @@
1
- import{j as n}from"./note-vendor-i1M2FSI2.js";import{p as m,T as d}from"./index-jIfkRdY_.js";import{a as e}from"./graph-vendor-CUxe67Lr.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,f=({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{f as C,i as m};
@@ -1 +0,0 @@
1
- import{j as t}from"./note-vendor-i1M2FSI2.js";import{a0 as _,P as C,a3 as U,i as G,a4 as J,a5 as Y,a6 as X,a7 as ee,q as ne,N as te,J as re,T as N,a8 as oe}from"./index-jIfkRdY_.js";import{a as i,F as se}from"./graph-vendor-CUxe67Lr.js";import"./note-core-Z6kqulGB.js";const ae=s=>{let a=0;for(let r=0;r<s.length;r++)a+=s.charCodeAt(r);return a},ie={background:"#f4f6f8",nodeHub:"#2c2f36",nodeSelected:"#111318",nodeConnected:"#636b76",nodeDefault:["#d6dbe1","#c8ced6","#b7bec7","#a7afb9"],nodeDimmed:["rgba(214,219,225,0.28)","rgba(200,206,214,0.24)","rgba(183,190,199,0.24)","rgba(167,175,185,0.2)"],nodeHubDimmed:"rgba(44,47,54,0.16)",nodeStroke:"#eef1f4",nodeSelectedStroke:"#a6b0bc",labelBackground:"rgba(246,248,250,0.92)",labelText:"#222831",labelFontFamily:"Pretendard Variable, Pretendard, system-ui, sans-serif",linkIdle:"rgba(99, 107, 117, 0.34)",linkConnected:"#68717c",linkDimmed:"rgba(127, 136, 146, 0.12)",legendHub:"#2c2f36"},le={background:"#121316",nodeHub:"#d6dce3",nodeSelected:"#eef1f5",nodeConnected:"#9099a4",nodeDefault:["#343a43","#2d333c","#262c35","#20262f"],nodeDimmed:["rgba(52,58,67,0.28)","rgba(45,51,60,0.24)","rgba(38,44,53,0.22)","rgba(32,38,47,0.2)"],nodeHubDimmed:"rgba(214,220,227,0.16)",nodeStroke:"#171c23",nodeSelectedStroke:"#7f8a97",labelBackground:"rgba(16,18,22,0.9)",labelText:"#eef2f6",labelFontFamily:"Pretendard Variable, Pretendard, system-ui, sans-serif",linkIdle:"rgba(118, 127, 138, 0.42)",linkConnected:"#a2abb6",linkDimmed:"rgba(118, 127, 138, 0.1)",legendHub:"#d6dce3"};function D(s){return s==="dark"?le:ie}function de(s,a){const r=D(s),{connections:g,colorIndex:y,selectedNodeId:d,nodeId:b,isConnected:c}=a,h=d===b;return d!==null&&!h&&!c?g>3?r.nodeHubDimmed:r.nodeDimmed[y%r.nodeDimmed.length]:h?r.nodeSelected:c?r.nodeConnected:g>3?r.nodeHub:r.nodeDefault[y%r.nodeDefault.length]}function ce(s,a){const r=D(s);return a.selectedNodeId!==null&&!a.isConnected?r.linkDimmed:a.isConnected?r.linkConnected:r.linkIdle}function ue(s,a){const r=D(s);return`${a.emphasize?"700":"400"} ${a.fontSize}px ${r.labelFontFamily}`}function z(s){return s<=1?3.5:s<=3?4.5:s<=6?5.5:Math.min(7,5.5+Math.sqrt(s)*.5)}const fe=t.jsx(C,{title:"Knowledge Graph",description:t.jsx(G,{width:184,height:16,className:"rounded-full"}),children:t.jsx("div",{className:"flex h-[600px] items-center justify-center",children:t.jsx(G,{width:"100%",height:"100%"})})});function he(){const s=J(),a=i.useRef(null),r=i.useRef(null),[g,y]=i.useState({width:800,height:600}),[d,b]=i.useState(null),{theme:c}=Y(e=>e),h=D(c),v=i.useRef(h);v.current=h;const{data:w}=X({queryKey:ne.notes.graph(),queryFn:async()=>{const e=await ee();if(e.type==="error")throw e;return e.noteGraph}}),l=i.useMemo(()=>{if(w.nodes.length===0)return null;const e=w.nodes.filter(o=>o.connections>0);if(e.length===0)return null;const n=new Set(e.map(o=>o.id));return{nodes:e,links:w.links.filter(o=>n.has(o.source)&&n.has(o.target))}},[w]);i.useEffect(()=>{if(!l)return;const e=()=>{if(!a.current)return;const n=a.current.getBoundingClientRect();y({width:n.width,height:Math.max(600,window.innerHeight-150)})};return e(),window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[l]),i.useEffect(()=>{if(!l||!r.current)return;const e=window.setTimeout(()=>{r.current?.zoomToFit(400,50)},500);return()=>window.clearTimeout(e)},[l]);const R=i.useRef(d);R.current=d;const B=i.useCallback(e=>{if(R.current===e.id){s({to:te,params:{id:e.id}});return}b(e.id)},[s]),L=i.useCallback(()=>{b(null)},[]),K=i.useCallback(e=>{a.current&&(a.current.style.cursor=e?"pointer":"default")},[]),I=i.useRef(!1),q=i.useCallback(()=>{I.current||(I.current=!0,r.current?.enableZoomInteraction(!1))},[]),A=i.useCallback(()=>{I.current=!1,r.current?.enableZoomInteraction(!0)},[]),H=i.useRef(new Map),O=i.useMemo(()=>{const e=new Map;if(l)for(const n of l.links)e.has(n.source)||e.set(n.source,new Set),e.has(n.target)||e.set(n.target,new Set),e.get(n.source)?.add(n.target),e.get(n.target)?.add(n.source);return e},[l]);H.current=O;const Z=i.useCallback((e,n,o)=>{const u=v.current,f=d,p=H.current,m=z(e.connections),x=e.x||0,S=e.y||0,k=f===e.id,T=f?p.get(f)?.has(e.id)??!1:!1,V=f!==null&&!k&&!T,W=ae(e.id);if(n.beginPath(),n.arc(x,S,m,0,Math.PI*2),n.fillStyle=de(c,{connections:e.connections,colorIndex:W,selectedNodeId:f,nodeId:e.id,isConnected:T}),n.fill(),V)return;n.strokeStyle=u.nodeStroke,n.lineWidth=(k?2:1)/o,n.stroke(),k&&(n.beginPath(),n.arc(x,S,m+2/o,0,Math.PI*2),n.strokeStyle=u.nodeSelectedStroke,n.lineWidth=1.5/o,n.stroke());const Q=T&&e.connections>=4;if(k||Q||o>2.5){const P=e.title||"Untitled",E=Math.max(10/o,2.5);n.font=ue(c,{fontSize:E,emphasize:k}),n.textAlign="center",n.textBaseline="top";const M=n.measureText(P).width,j=2/o,F=S+m+3/o;n.fillStyle=u.labelBackground,n.fillRect(x-M/2-j,F,M+j*2,E+j*2),n.fillStyle=u.labelText,n.fillText(P,x,F+j)}},[d,c]),$=i.useCallback((e,n,o)=>{const u=d,f=e.source,p=e.target,m=u?f.id===u||p.id===u:!1;n.beginPath(),n.moveTo(f.x||0,f.y||0),n.lineTo(p.x||0,p.y||0),n.strokeStyle=ce(c,{selectedNodeId:u,isConnected:m}),n.lineWidth=m?2/o:.5/o,n.stroke()},[d,c]);return l?t.jsx(C,{title:"Knowledge Graph",description:`${l.nodes.length} linked notes, ${l.links.length} connections`,children:t.jsxs("div",{ref:a,className:"surface-base graph-canvas relative overflow-hidden",style:{"--graph-bg":h.background},children:[d&&(()=>{const e=l.nodes.find(n=>n.id===d);return e?t.jsxs("div",{className:"surface-floating absolute top-3 left-3 z-10 flex items-center gap-2 px-3 py-2",children:[t.jsx(N,{as:"span",variant:"meta",weight:"semibold",truncate:!0,className:"max-w-48",children:e.title}),t.jsxs(N,{as:"span",variant:"label",tone:"tertiary",children:[e.connections," links"]}),t.jsx("button",{type:"button",onClick:()=>b(null),className:"focus-ring-soft ml-1 flex h-6 w-6 cursor-pointer items-center justify-center rounded-[8px] text-fg-tertiary transition-colors hover:bg-hover-subtle hover:text-fg-default","aria-label":"Deselect node",children:t.jsx(oe,{className:"h-3.5 w-3.5"})})]}):null})(),t.jsxs("div",{className:"surface-floating absolute top-3 right-3 z-10 flex flex-col gap-1.5 px-3 py-2.5",children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"legend-dot h-2.5 w-2.5 shrink-0 rounded-full",style:{"--legend-color":h.legendHub}}),t.jsx(N,{as:"span",variant:"label",weight:"medium",tone:"secondary",children:"Hub notes (4+ connections)"})]}),t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"legend-dot h-2.5 w-2.5 shrink-0 rounded-full",style:{"--legend-color":h.nodeConnected}}),t.jsx(N,{as:"span",variant:"label",weight:"medium",tone:"secondary",children:"Connected notes"})]})]}),t.jsx(se,{ref:r,graphData:l,width:g.width,height:g.height,nodeId:"id",nodeLabel:"",nodeCanvasObject:Z,nodePointerAreaPaint:(e,n,o)=>{o.beginPath(),o.arc(e.x||0,e.y||0,Math.max(z(e.connections)+4,10),0,2*Math.PI),o.fillStyle=n,o.fill()},linkCanvasObject:$,linkCanvasObjectMode:()=>"replace",linkDirectionalParticles:0,onNodeClick:B,onNodeHover:K,onBackgroundClick:L,onNodeDrag:q,onNodeDragEnd:A,warmupTicks:30,cooldownTicks:80,d3AlphaDecay:.05,d3VelocityDecay:.3,enableZoomInteraction:!0,enablePanInteraction:!0,minZoom:.3,maxZoom:5})]})}):t.jsx(C,{title:"Knowledge Graph",description:"0 linked notes, 0 connections",children:t.jsx(re,{title:"No constellations yet",description:"Link your notes together and watch your own starry sky unfold"})})}function ke(){return t.jsx(_,{fallback:fe,errorTitle:"Failed to load graph",errorDescription:"Retry loading your linked note constellation",renderError:({error:s,retry:a})=>t.jsx(C,{title:"Knowledge Graph",children:t.jsx(U,{title:"Failed to load graph",description:"Retry loading your linked note constellation",error:s,onRetry:a})}),children:t.jsx(he,{})})}export{ke as default};
@@ -1 +0,0 @@
1
- import{a}from"./graph-vendor-CUxe67Lr.js";import{p as m}from"./index-jIfkRdY_.js";const n=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M144,96a16,16,0,1,1,16,16A16,16,0,0,1,144,96Zm92-40V200a20,20,0,0,1-20,20H40a20,20,0,0,1-20-20V56A20,20,0,0,1,40,36H216A20,20,0,0,1,236,56ZM44,60v79.72l33.86-33.86a20,20,0,0,1,28.28,0L147.31,147l17.18-17.17a20,20,0,0,1,28.28,0L212,149.09V60Zm0,136H162.34L92,125.66l-48,48Zm168,0V183l-33.37-33.37L164.28,164l32,32Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,56V178.06l-39.72-39.72a8,8,0,0,0-11.31,0L147.31,164,97.66,114.34a8,8,0,0,0-11.32,0L32,168.69V56a8,8,0,0,1,8-8H216A8,8,0,0,1,224,56Z",opacity:"0.2"}),a.createElement("path",{d:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,16V158.75l-26.07-26.06a16,16,0,0,0-22.63,0l-20,20-44-44a16,16,0,0,0-22.62,0L40,149.37V56ZM40,172l52-52,80,80H40Zm176,28H194.63l-36-36,20-20L216,181.38V200ZM144,100a12,12,0,1,1,12,12A12,12,0,0,1,144,100Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM156,88a12,12,0,1,1-12,12A12,12,0,0,1,156,88Zm60,112H40V160.69l46.34-46.35a8,8,0,0,1,11.32,0h0L165,181.66a8,8,0,0,0,11.32-11.32l-17.66-17.65L173,138.34a8,8,0,0,1,11.31,0L216,170.07V200Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,42H40A14,14,0,0,0,26,56V200a14,14,0,0,0,14,14H216a14,14,0,0,0,14-14V56A14,14,0,0,0,216,42ZM40,54H216a2,2,0,0,1,2,2V163.57L188.53,134.1a14,14,0,0,0-19.8,0l-21.42,21.42L101.9,110.1a14,14,0,0,0-19.8,0L38,154.2V56A2,2,0,0,1,40,54ZM38,200V171.17l52.58-52.58a2,2,0,0,1,2.84,0L176.83,202H40A2,2,0,0,1,38,200Zm178,2H193.8l-38-38,21.41-21.42a2,2,0,0,1,2.83,0l38,38V200A2,2,0,0,1,216,202ZM146,100a10,10,0,1,1,10,10A10,10,0,0,1,146,100Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,16V158.75l-26.07-26.06a16,16,0,0,0-22.63,0l-20,20-44-44a16,16,0,0,0-22.62,0L40,149.37V56ZM40,172l52-52,80,80H40Zm176,28H194.63l-36-36,20-20L216,181.38V200ZM144,100a12,12,0,1,1,12,12A12,12,0,0,1,144,100Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,44H40A12,12,0,0,0,28,56V200a12,12,0,0,0,12,12H216a12,12,0,0,0,12-12V56A12,12,0,0,0,216,44ZM40,52H216a4,4,0,0,1,4,4V168.4l-32.89-32.89a12,12,0,0,0-17,0l-22.83,22.83-46.82-46.83a12,12,0,0,0-17,0L36,159V56A4,4,0,0,1,40,52ZM36,200V170.34l53.17-53.17a4,4,0,0,1,5.66,0L181.66,204H40A4,4,0,0,1,36,200Zm180,4H193l-40-40,22.83-22.83a4,4,0,0,1,5.66,0L220,179.71V200A4,4,0,0,1,216,204ZM148,100a8,8,0,1,1,8,8A8,8,0,0,1,148,100Z"}))]]),e=a.forwardRef((l,t)=>a.createElement(m,{ref:t,...l,weights:n}));e.displayName="ImageIcon";const Z=e;export{Z as I};