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.
- package/dist/index.js +3 -3
- package/dist/mcp.js +180 -736
- package/package.json +6 -2
- package/server/client/dist/assets/ArrowRight.es-CbA8ey6a.js +1 -0
- package/server/client/dist/assets/{Calendar-Bc2zJueR.js → Calendar-CgWgr1BV.js} +2 -2
- package/server/client/dist/assets/Callout-DKruIT0f.js +1 -0
- package/server/client/dist/assets/Copy.es-DFbgpaNJ.js +1 -0
- package/server/client/dist/assets/Graph-kCltGRlY.js +1 -0
- package/server/client/dist/assets/{Image-DxWhlIDG.js → Image-7W0DZwMo.js} +1 -1
- package/server/client/dist/assets/Image.es-5pXLx9TU.js +1 -0
- package/server/client/dist/assets/Note-BW6Np_5g.js +20 -0
- package/server/client/dist/assets/Plus.es-B0sg64VJ.js +1 -0
- package/server/client/dist/assets/Reminders-C10fHQcl.js +1 -0
- package/server/client/dist/assets/Search-tf2nV4v0.js +1 -0
- package/server/client/dist/assets/{SurfaceCard-CkAVMLPs.js → SurfaceCard-pydtvHfu.js} +1 -1
- package/server/client/dist/assets/Tag-uCoYbISy.js +1 -0
- package/server/client/dist/assets/TagNotes-CqOcQiRw.js +1 -0
- package/server/client/dist/assets/Trash.es-w32Goxfa.js +1 -0
- package/server/client/dist/assets/ViewNotes-slPXXoOY.js +1 -0
- package/server/client/dist/assets/ViewSectionDialog-brTrsF6G.js +102 -0
- package/server/client/dist/assets/Views-B_wsb-XJ.js +1 -0
- package/server/client/dist/assets/{graph-vendor-CUxe67Lr.js → graph-vendor-BAF95C0g.js} +2 -2
- package/server/client/dist/assets/image.api-CYsjXiMr.js +17 -0
- package/server/client/dist/assets/index-BR05aSXr.js +342 -0
- package/server/client/dist/assets/{index-D3BfroIT.js → index-D83QbOcw.js} +1 -1
- package/server/client/dist/assets/{index-C5BGzDgt.css → index-DPI6YoDt.css} +1 -1
- package/server/client/dist/assets/manage-image-BYIhWu56.js +1 -0
- package/server/client/dist/assets/{manage-image-detail-C8Q7K7I3.js → manage-image-detail-6KgmQvbN.js} +1 -1
- package/server/client/dist/assets/mcp-Dd98N9Hq.js +4 -0
- package/server/client/dist/assets/mcp-admin-adapter-DOgBsYpl.js +1 -0
- package/server/client/dist/assets/note-core-CMGUaW1v.js +176 -0
- package/server/client/dist/assets/note-vendor-Hoz9Q4-4.js +54 -0
- package/server/client/dist/assets/{placeholder-Cr_nI8UI.js → placeholder-siHGg9aK.js} +4 -4
- package/server/client/dist/assets/{properties-CvYWJWUM.js → properties-CyVRKgcT.js} +1 -1
- package/server/client/dist/assets/tag.api-CwmC8crB.js +21 -0
- package/server/client/dist/assets/trash-wojQBK9Z.js +1 -0
- package/server/client/dist/assets/{useReminderMutate-CDmIEwsw.js → useReminderMutate-DuVKxpBh.js} +1 -1
- package/server/client/dist/index.html +5 -5
- package/server/dist/app.js +0 -1
- package/server/dist/features/auth/http/api.js +0 -1
- package/server/dist/features/auth/http/login-page.js +272 -5
- package/server/dist/features/auth/http/pages.js +20 -3
- package/server/dist/features/auth/service.js +3 -2
- package/server/dist/features/cache/graphql/cache.field.resolver.js +0 -1
- package/server/dist/features/cache/graphql/cache.mutation.resolver.js +0 -1
- package/server/dist/features/cache/graphql/cache.query.resolver.js +0 -1
- package/server/dist/features/cache/graphql/cache.resolver.js +0 -1
- package/server/dist/features/cache/graphql/cache.type-defs.js +0 -1
- package/server/dist/features/cache/graphql/index.js +0 -1
- package/server/dist/features/image/graphql/image.field.resolver.js +0 -1
- package/server/dist/features/image/graphql/image.mutation.resolver.js +0 -1
- package/server/dist/features/image/graphql/image.query.resolver.js +0 -1
- package/server/dist/features/image/graphql/image.resolver.js +0 -1
- package/server/dist/features/image/graphql/image.type-defs.js +0 -1
- package/server/dist/features/image/graphql/index.js +0 -1
- package/server/dist/features/image/http/upload.js +34 -24
- package/server/dist/features/image/services/delete.js +0 -1
- package/server/dist/features/image/services/upload.js +0 -1
- package/server/dist/features/image/services/validation.js +110 -0
- package/server/dist/features/mcp-admin/http/handlers.js +11 -4
- package/server/dist/features/mcp-admin/service.js +0 -1
- package/server/dist/features/note/graphql/index.js +0 -1
- package/server/dist/features/note/graphql/note.field.resolver.js +0 -1
- package/server/dist/features/note/graphql/note.mutation.resolver.js +0 -1
- package/server/dist/features/note/graphql/note.query.resolver.js +0 -1
- package/server/dist/features/note/graphql/note.resolver.js +0 -1
- package/server/dist/features/note/graphql/note.type-defs.js +0 -1
- package/server/dist/features/note/http/mcp.js +8 -44
- package/server/dist/features/note/services/authoring.js +0 -1
- package/server/dist/features/note/services/cleanup.js +2 -3
- package/server/dist/features/note/services/content-blocks.js +0 -1
- package/server/dist/features/note/services/markdown-intent-write.js +11 -44
- package/server/dist/features/note/services/markdown-patch.js +4 -124
- package/server/dist/features/note/services/properties.js +0 -1
- package/server/dist/features/note/services/search-backfill.js +0 -1
- package/server/dist/features/note/services/search.js +0 -1
- package/server/dist/features/note/services/snapshot.js +0 -1
- package/server/dist/features/note/services/tag-filter.js +0 -1
- package/server/dist/features/note/services/trash.js +0 -1
- package/server/dist/features/note/services/write-conflict.js +0 -1
- package/server/dist/features/note/services/write.js +13 -14
- package/server/dist/features/placeholder/graphql/index.js +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.field.resolver.js +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.mutation.resolver.js +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.query.resolver.js +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.resolver.js +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.type-defs.js +0 -1
- package/server/dist/features/reminder/graphql/index.js +0 -1
- package/server/dist/features/reminder/graphql/reminder.field.resolver.js +0 -1
- package/server/dist/features/reminder/graphql/reminder.mutation.resolver.js +0 -1
- package/server/dist/features/reminder/graphql/reminder.query.resolver.js +0 -1
- package/server/dist/features/reminder/graphql/reminder.resolver.js +0 -1
- package/server/dist/features/reminder/graphql/reminder.type-defs.js +0 -1
- package/server/dist/features/tag/graphql/index.js +0 -1
- package/server/dist/features/tag/graphql/tag.field.resolver.js +0 -1
- package/server/dist/features/tag/graphql/tag.mutation.resolver.js +0 -1
- package/server/dist/features/tag/graphql/tag.query.resolver.js +16 -2
- package/server/dist/features/tag/graphql/tag.resolver.js +0 -1
- package/server/dist/features/tag/graphql/tag.type-defs.js +2 -1
- package/server/dist/features/tag/http/mcp.js +0 -1
- package/server/dist/features/tag/services/organization.js +0 -1
- package/server/dist/features/view/graphql/index.js +0 -1
- package/server/dist/features/view/graphql/view.mutation.resolver.js +0 -1
- package/server/dist/features/view/graphql/view.query.resolver.js +0 -1
- package/server/dist/features/view/graphql/view.resolver.js +0 -1
- package/server/dist/features/view/graphql/view.type-defs.js +0 -1
- package/server/dist/features/view/services/workspace.js +0 -1
- package/server/dist/main.js +0 -1
- package/server/dist/models.js +0 -1
- package/server/dist/modules/app-version.js +104 -0
- package/server/dist/modules/auth-guard.js +0 -1
- package/server/dist/modules/auth-mode.js +0 -1
- package/server/dist/modules/auth-redirect.js +0 -1
- package/server/dist/modules/blocknote-markdown-editor.js +53 -0
- package/server/dist/modules/blocknote-tree.js +0 -1
- package/server/dist/modules/blocknote.js +10 -4
- package/server/dist/modules/data-maintenance.js +0 -1
- package/server/dist/modules/error-handler.js +0 -1
- package/server/dist/modules/graphql.js +0 -1
- package/server/dist/modules/logger.js +0 -1
- package/server/dist/modules/mcp-auth.js +62 -2
- package/server/dist/modules/mcp-token.js +0 -1
- package/server/dist/modules/prisma-runtime.js +0 -1
- package/server/dist/modules/rate-limit.js +0 -1
- package/server/dist/modules/recovery-retention.js +0 -1
- package/server/dist/modules/server-events-handler.js +0 -1
- package/server/dist/modules/server-events.js +0 -1
- package/server/dist/modules/session-store.js +0 -1
- package/server/dist/modules/use-async.js +0 -1
- package/server/dist/paths.js +1 -1
- package/server/dist/routes/api.js +2 -9
- package/server/dist/routes/auth-pages.js +0 -1
- package/server/dist/routes/client.js +51 -2
- package/server/dist/routes/graphql.js +0 -1
- package/server/dist/routes/index.js +0 -1
- package/server/dist/routes/mcp.js +0 -1
- package/server/dist/schema/index.js +0 -1
- package/server/dist/start.js +0 -1
- package/server/dist/types/index.js +0 -1
- package/server/dist/types/input.js +0 -1
- package/server/client/dist/assets/Callout-B4kA_Cvr.js +0 -1
- package/server/client/dist/assets/Graph-uq5jfJgt.js +0 -1
- package/server/client/dist/assets/Image.es-BpAOJjJT.js +0 -1
- package/server/client/dist/assets/Note-Bo8ZYRP-.js +0 -22
- package/server/client/dist/assets/Plus.es-Dc_js8AC.js +0 -1
- package/server/client/dist/assets/Reminders-lj7Equld.js +0 -1
- package/server/client/dist/assets/Search-1wcRO5--.js +0 -1
- package/server/client/dist/assets/Tag-CeygwFfv.js +0 -1
- package/server/client/dist/assets/TagNotes-B8DqItxw.js +0 -1
- package/server/client/dist/assets/Trash.es-OuQVb_SX.js +0 -1
- package/server/client/dist/assets/ViewNotes-BH7PbdOD.js +0 -1
- package/server/client/dist/assets/ViewSectionTableRenderer-BJwhd5be.js +0 -102
- package/server/client/dist/assets/Views-eYFtsdFj.js +0 -1
- package/server/client/dist/assets/image.api-C0eYGCeH.js +0 -17
- package/server/client/dist/assets/index-jIfkRdY_.js +0 -361
- package/server/client/dist/assets/manage-image-C0YwkLIP.js +0 -1
- package/server/client/dist/assets/mcp-DHHhTLC8.js +0 -1
- package/server/client/dist/assets/note-core-Z6kqulGB.js +0 -180
- package/server/client/dist/assets/note-vendor-i1M2FSI2.js +0 -54
- package/server/client/dist/assets/trash-DA27aW7L.js +0 -1
- package/server/client/dist/fonts/Pretendard-Bold.woff +0 -0
- package/server/client/dist/fonts/Pretendard-Regular.woff +0 -0
- package/server/dist/app.js.map +0 -1
- package/server/dist/features/auth/http/api.js.map +0 -1
- package/server/dist/features/auth/http/login-page.js.map +0 -1
- package/server/dist/features/auth/http/pages.js.map +0 -1
- package/server/dist/features/auth/service.js.map +0 -1
- package/server/dist/features/cache/graphql/cache.field.resolver.js.map +0 -1
- package/server/dist/features/cache/graphql/cache.mutation.resolver.js.map +0 -1
- package/server/dist/features/cache/graphql/cache.query.resolver.js.map +0 -1
- package/server/dist/features/cache/graphql/cache.resolver.js.map +0 -1
- package/server/dist/features/cache/graphql/cache.type-defs.js.map +0 -1
- package/server/dist/features/cache/graphql/index.js.map +0 -1
- package/server/dist/features/image/graphql/image.field.resolver.js.map +0 -1
- package/server/dist/features/image/graphql/image.mutation.resolver.js.map +0 -1
- package/server/dist/features/image/graphql/image.query.resolver.js.map +0 -1
- package/server/dist/features/image/graphql/image.resolver.js.map +0 -1
- package/server/dist/features/image/graphql/image.type-defs.js.map +0 -1
- package/server/dist/features/image/graphql/index.js.map +0 -1
- package/server/dist/features/image/http/upload.js.map +0 -1
- package/server/dist/features/image/services/delete.js.map +0 -1
- package/server/dist/features/image/services/remote-fetch.js +0 -176
- package/server/dist/features/image/services/remote-fetch.js.map +0 -1
- package/server/dist/features/image/services/upload.js.map +0 -1
- package/server/dist/features/mcp-admin/http/handlers.js.map +0 -1
- package/server/dist/features/mcp-admin/service.js.map +0 -1
- package/server/dist/features/note/graphql/index.js.map +0 -1
- package/server/dist/features/note/graphql/note.field.resolver.js.map +0 -1
- package/server/dist/features/note/graphql/note.mutation.resolver.js.map +0 -1
- package/server/dist/features/note/graphql/note.query.resolver.js.map +0 -1
- package/server/dist/features/note/graphql/note.resolver.js.map +0 -1
- package/server/dist/features/note/graphql/note.type-defs.js.map +0 -1
- package/server/dist/features/note/http/mcp.js.map +0 -1
- package/server/dist/features/note/services/authoring.js.map +0 -1
- package/server/dist/features/note/services/cleanup.js.map +0 -1
- package/server/dist/features/note/services/content-blocks.js.map +0 -1
- package/server/dist/features/note/services/markdown-intent-write.js.map +0 -1
- package/server/dist/features/note/services/markdown-patch.js.map +0 -1
- package/server/dist/features/note/services/properties.js.map +0 -1
- package/server/dist/features/note/services/search-backfill.js.map +0 -1
- package/server/dist/features/note/services/search.js.map +0 -1
- package/server/dist/features/note/services/snapshot.js.map +0 -1
- package/server/dist/features/note/services/tag-filter.js.map +0 -1
- package/server/dist/features/note/services/trash.js.map +0 -1
- package/server/dist/features/note/services/write-conflict.js.map +0 -1
- package/server/dist/features/note/services/write.js.map +0 -1
- package/server/dist/features/placeholder/graphql/index.js.map +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.field.resolver.js.map +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.mutation.resolver.js.map +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.query.resolver.js.map +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.resolver.js.map +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.type-defs.js.map +0 -1
- package/server/dist/features/reminder/graphql/index.js.map +0 -1
- package/server/dist/features/reminder/graphql/reminder.field.resolver.js.map +0 -1
- package/server/dist/features/reminder/graphql/reminder.mutation.resolver.js.map +0 -1
- package/server/dist/features/reminder/graphql/reminder.query.resolver.js.map +0 -1
- package/server/dist/features/reminder/graphql/reminder.resolver.js.map +0 -1
- package/server/dist/features/reminder/graphql/reminder.type-defs.js.map +0 -1
- package/server/dist/features/tag/graphql/index.js.map +0 -1
- package/server/dist/features/tag/graphql/tag.field.resolver.js.map +0 -1
- package/server/dist/features/tag/graphql/tag.mutation.resolver.js.map +0 -1
- package/server/dist/features/tag/graphql/tag.query.resolver.js.map +0 -1
- package/server/dist/features/tag/graphql/tag.resolver.js.map +0 -1
- package/server/dist/features/tag/graphql/tag.type-defs.js.map +0 -1
- package/server/dist/features/tag/http/mcp.js.map +0 -1
- package/server/dist/features/tag/services/organization.js.map +0 -1
- package/server/dist/features/view/graphql/index.js.map +0 -1
- package/server/dist/features/view/graphql/view.mutation.resolver.js.map +0 -1
- package/server/dist/features/view/graphql/view.query.resolver.js.map +0 -1
- package/server/dist/features/view/graphql/view.resolver.js.map +0 -1
- package/server/dist/features/view/graphql/view.type-defs.js.map +0 -1
- package/server/dist/features/view/services/workspace.js.map +0 -1
- package/server/dist/main.js.map +0 -1
- package/server/dist/models.js.map +0 -1
- package/server/dist/modules/auth-guard.js.map +0 -1
- package/server/dist/modules/auth-mode.js.map +0 -1
- package/server/dist/modules/auth-redirect.js.map +0 -1
- package/server/dist/modules/blocknote-tree.js.map +0 -1
- package/server/dist/modules/blocknote.js.map +0 -1
- package/server/dist/modules/data-maintenance.js.map +0 -1
- package/server/dist/modules/error-handler.js.map +0 -1
- package/server/dist/modules/graphql.js.map +0 -1
- package/server/dist/modules/logger.js.map +0 -1
- package/server/dist/modules/mcp-auth.js.map +0 -1
- package/server/dist/modules/mcp-token.js.map +0 -1
- package/server/dist/modules/prisma-runtime.js.map +0 -1
- package/server/dist/modules/rate-limit.js.map +0 -1
- package/server/dist/modules/recovery-retention.js.map +0 -1
- package/server/dist/modules/server-events-handler.js.map +0 -1
- package/server/dist/modules/server-events.js.map +0 -1
- package/server/dist/modules/session-store.js.map +0 -1
- package/server/dist/modules/use-async.js.map +0 -1
- package/server/dist/paths.js.map +0 -1
- package/server/dist/routes/api.js.map +0 -1
- package/server/dist/routes/auth-pages.js.map +0 -1
- package/server/dist/routes/client.js.map +0 -1
- package/server/dist/routes/graphql.js.map +0 -1
- package/server/dist/routes/index.js.map +0 -1
- package/server/dist/routes/mcp.js.map +0 -1
- package/server/dist/schema/index.js.map +0 -1
- package/server/dist/start.js.map +0 -1
- package/server/dist/types/index.js.map +0 -1
- 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
|
+
};
|
|
@@ -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
|
+
};
|
|
@@ -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 =
|
|
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
|
|
@@ -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
|
package/server/dist/paths.js
CHANGED
|
@@ -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 {
|
|
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())).
|
|
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
|
|
@@ -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(
|
|
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
|
package/server/dist/start.js
CHANGED
|
@@ -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};
|