ocean-brain 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +73 -41
- package/dist/mcp.js +587 -26
- package/package.json +6 -1
- package/scripts/postinstall-prisma.mjs +41 -0
- package/server/client/dist/assets/Calendar-DRv2aEl8.js +28 -0
- package/server/client/dist/assets/Callout-B2kPcDrq.js +1 -0
- package/server/client/dist/assets/Graph-DotbTrZR.js +1 -0
- package/server/client/dist/assets/Image-B5R7gF2P.js +1 -0
- package/server/client/dist/assets/Image.es-Dld9r9MJ.js +1 -0
- package/server/client/dist/assets/ModalActionRow-CES9L_Gy.js +1 -0
- package/server/client/dist/assets/Note-SK4hDhEM.css +1 -0
- package/server/client/dist/assets/Note-cIbXJc1v.js +1 -0
- package/server/client/dist/assets/Reminders-4LunlZRb.js +1 -0
- package/server/client/dist/assets/{Search-BANPp2ZV.js → Search-Cp17DGR6.js} +1 -1
- package/server/client/dist/assets/SurfaceCard-yzVU4Qkx.js +1 -0
- package/server/client/dist/assets/Tag-CwmuMPmo.js +1 -0
- package/server/client/dist/assets/TagNotes-gGroWMtT.js +1 -0
- package/server/client/dist/assets/Trash.es-B3KWD8_C.js +1 -0
- package/server/client/dist/assets/color-wpu7wT_s.js +1 -0
- package/server/client/dist/assets/{image.api-rBH0OSWJ.js → image.api-DJgOBt8S.js} +1 -1
- package/server/client/dist/assets/index-40Y2UsVr.js +205 -0
- package/server/client/dist/assets/index-BnxpTwtL.css +1 -0
- package/server/client/dist/assets/index-DYUg2N-6.js +1 -0
- package/server/client/dist/assets/manage-image-ByY1mRZx.js +1 -0
- package/server/client/dist/assets/manage-image-detail-BVaDZHRu.js +1 -0
- package/server/client/dist/assets/mcp-Jj3061aI.js +1 -0
- package/server/client/dist/assets/placeholder-4P_GK7fV.js +34 -0
- package/server/client/dist/assets/trash-CPBwY07S.js +1 -0
- package/server/client/dist/assets/{useReminderMutate-CU-UinGn.js → useReminderMutate-1YVndM2T.js} +1 -1
- package/server/client/dist/index.html +2 -2
- package/server/dist/app.js +97 -9
- package/server/dist/app.js.map +1 -1
- package/server/dist/main.js +16 -2
- package/server/dist/main.js.map +1 -1
- package/server/dist/modules/auth-guard.js +73 -0
- package/server/dist/modules/auth-guard.js.map +1 -0
- package/server/dist/modules/auth-mode.js +51 -0
- package/server/dist/modules/auth-mode.js.map +1 -0
- package/server/dist/modules/auth.js +9 -0
- package/server/dist/modules/auth.js.map +1 -1
- package/server/dist/modules/blocknote.js +7 -1
- package/server/dist/modules/blocknote.js.map +1 -1
- package/server/dist/modules/error-handler.js +41 -0
- package/server/dist/modules/error-handler.js.map +1 -0
- package/server/dist/modules/image-upload.js +114 -0
- package/server/dist/modules/image-upload.js.map +1 -0
- package/server/dist/modules/mcp-admin.js +88 -0
- package/server/dist/modules/mcp-admin.js.map +1 -0
- package/server/dist/modules/mcp-auth.js +71 -0
- package/server/dist/modules/mcp-auth.js.map +1 -0
- package/server/dist/modules/mcp-token.js +28 -0
- package/server/dist/modules/mcp-token.js.map +1 -0
- package/server/dist/modules/note-authoring.js +140 -0
- package/server/dist/modules/note-authoring.js.map +1 -0
- package/server/dist/modules/note-cleanup.js +207 -0
- package/server/dist/modules/note-cleanup.js.map +1 -0
- package/server/dist/modules/note-snapshot.js +223 -0
- package/server/dist/modules/note-snapshot.js.map +1 -0
- package/server/dist/modules/note-trash.js +262 -0
- package/server/dist/modules/note-trash.js.map +1 -0
- package/server/dist/modules/prisma-runtime.js +46 -0
- package/server/dist/modules/prisma-runtime.js.map +1 -0
- package/server/dist/modules/recovery-retention.js +26 -0
- package/server/dist/modules/recovery-retention.js.map +1 -0
- package/server/dist/modules/remote-image.js +176 -0
- package/server/dist/modules/remote-image.js.map +1 -0
- package/server/dist/modules/tag-organization.js +66 -0
- package/server/dist/modules/tag-organization.js.map +1 -0
- package/server/dist/modules/use-async.js +2 -4
- package/server/dist/modules/use-async.js.map +1 -1
- package/server/dist/schema/note/index.js +150 -6
- package/server/dist/schema/note/index.js.map +1 -1
- package/server/dist/start.js +11 -0
- package/server/dist/start.js.map +1 -0
- package/server/dist/types/index.js.map +1 -1
- package/server/dist/urls.js +3 -2
- package/server/dist/urls.js.map +1 -1
- package/server/dist/views/auth.js +305 -0
- package/server/dist/views/auth.js.map +1 -0
- package/server/dist/views/image.js +24 -81
- package/server/dist/views/image.js.map +1 -1
- package/server/dist/views/index.js +4 -0
- package/server/dist/views/index.js.map +1 -1
- package/server/dist/views/mcp-admin.js +42 -0
- package/server/dist/views/mcp-admin.js.map +1 -0
- package/server/dist/views/note.js +124 -0
- package/server/dist/views/note.js.map +1 -0
- package/server/dist/views/tag.js +23 -0
- package/server/dist/views/tag.js.map +1 -0
- package/server/prisma/migrations/20260331183000_0010_note_snapshot/migration.sql +13 -0
- package/server/prisma/migrations/20260331195000_0011_note_trash_entities/migration.sql +35 -0
- package/server/prisma/migrations/20260331213000_0012_image_hash_unique/migration.sql +49 -0
- package/server/prisma/migrations/20260404000000_0013_mcp_admin_control/migration.sql +9 -0
- package/server/prisma/schema.prisma +66 -1
- package/server/client/dist/assets/Calendar-ST5q_8KT.js +0 -48
- package/server/client/dist/assets/Callout-CrWW3bg0.js +0 -1
- package/server/client/dist/assets/Graph-CzJjt6rP.js +0 -1
- package/server/client/dist/assets/Image-Dxg1qqZw.js +0 -1
- package/server/client/dist/assets/Image.es-DZ0H6wH1.js +0 -1
- package/server/client/dist/assets/Note-Bu7fN3B6.js +0 -6
- package/server/client/dist/assets/Note-CCvXqPzv.css +0 -1
- package/server/client/dist/assets/Plus.es-CS3WVMDq.js +0 -1
- package/server/client/dist/assets/PriorityLegend-D61iBwNW.js +0 -1
- package/server/client/dist/assets/Reminders-BjirJMOR.css +0 -1
- package/server/client/dist/assets/Reminders-DjWRombU.js +0 -1
- package/server/client/dist/assets/Tag-DbKSLTj0.js +0 -1
- package/server/client/dist/assets/TagNotes-B6s7jtL7.js +0 -1
- package/server/client/dist/assets/index-BzWwEDoL.js +0 -1
- package/server/client/dist/assets/index-CF5_ZCYN.js +0 -162
- package/server/client/dist/assets/index-DjZk2Gpg.css +0 -1
- package/server/client/dist/assets/manage-image-detail-DOx6QsCl.js +0 -1
- package/server/client/dist/assets/manage-image-g-MC6Fkc.js +0 -1
- package/server/client/dist/assets/placeholder-DV3u6MrA.js +0 -34
package/dist/index.js
CHANGED
|
@@ -1,58 +1,90 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/index.ts
|
|
4
|
-
import
|
|
5
|
-
import fs from "fs";
|
|
4
|
+
import fs2 from "fs";
|
|
6
5
|
import os from "os";
|
|
7
6
|
import path from "path";
|
|
8
7
|
import { fileURLToPath, pathToFileURL } from "url";
|
|
9
8
|
import { Command } from "commander";
|
|
9
|
+
|
|
10
|
+
// src/auth-options.ts
|
|
11
|
+
var isTruthy = (value) => {
|
|
12
|
+
if (!value) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
return ["1", "true", "yes", "on"].includes(value.trim().toLowerCase());
|
|
16
|
+
};
|
|
17
|
+
var ensurePasswordModeRequirements = (env) => {
|
|
18
|
+
if (!env.OCEAN_BRAIN_PASSWORD) {
|
|
19
|
+
throw new Error(
|
|
20
|
+
"Missing OCEAN_BRAIN_PASSWORD. Set OCEAN_BRAIN_PASSWORD before running password auth mode."
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
if (!env.OCEAN_BRAIN_SESSION_SECRET) {
|
|
24
|
+
throw new Error(
|
|
25
|
+
"Missing OCEAN_BRAIN_SESSION_SECRET. Set OCEAN_BRAIN_SESSION_SECRET before running password auth mode."
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
var resolveServeAuthEnvironment = (options, env) => {
|
|
30
|
+
const allowInsecureNoAuth = options.allowInsecureNoAuth || isTruthy(env.OCEAN_BRAIN_ALLOW_INSECURE_NO_AUTH);
|
|
31
|
+
if (!allowInsecureNoAuth && env.OCEAN_BRAIN_PASSWORD) {
|
|
32
|
+
ensurePasswordModeRequirements(env);
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
OCEAN_BRAIN_ALLOW_INSECURE_NO_AUTH: allowInsecureNoAuth ? "true" : void 0
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// src/mcp-auth.ts
|
|
40
|
+
import fs from "fs";
|
|
41
|
+
var resolveMcpBearerToken = (options) => {
|
|
42
|
+
if (options.tokenFile) {
|
|
43
|
+
const token = fs.readFileSync(options.tokenFile, "utf-8").trim();
|
|
44
|
+
return token || void 0;
|
|
45
|
+
}
|
|
46
|
+
return options.token?.trim() || void 0;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// src/index.ts
|
|
10
50
|
var __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
11
51
|
var serverRoot = path.resolve(__dirname, "..", "server");
|
|
12
|
-
function findBin(name, fromDir) {
|
|
13
|
-
let dir = path.resolve(fromDir, "..");
|
|
14
|
-
while (true) {
|
|
15
|
-
const bin = path.resolve(dir, "node_modules", ".bin", name);
|
|
16
|
-
if (fs.existsSync(bin)) return bin;
|
|
17
|
-
const parent = path.dirname(dir);
|
|
18
|
-
if (parent === dir) break;
|
|
19
|
-
dir = parent;
|
|
20
|
-
}
|
|
21
|
-
throw new Error(`Could not find "${name}" binary. Make sure it is installed.`);
|
|
22
|
-
}
|
|
23
52
|
var pkg = JSON.parse(
|
|
24
|
-
|
|
53
|
+
fs2.readFileSync(path.resolve(__dirname, "..", "package.json"), "utf-8")
|
|
25
54
|
);
|
|
26
55
|
var program = new Command();
|
|
27
56
|
program.name("ocean-brain").description("Self-hosted, open-source note-taking app with bi-directional links").version(pkg.version);
|
|
28
|
-
program.command("serve", { isDefault: true }).description("Start the Ocean Brain server").option("-p, --port <port>", "port to listen on", "6683").option("-H, --host <host>", "host to bind to", "0.0.0.0").action(async (opts) => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
57
|
+
program.command("serve", { isDefault: true }).description("Start the Ocean Brain server").option("-p, --port <port>", "port to listen on", "6683").option("-H, --host <host>", "host to bind to", "0.0.0.0").option("--allow-insecure-no-auth", "explicitly disable auth protection for local or trusted environments").action(async (opts) => {
|
|
58
|
+
try {
|
|
59
|
+
const defaultRoot = path.resolve(os.homedir(), ".ocean-brain");
|
|
60
|
+
const dataDir = process.env.OCEAN_BRAIN_DATA_DIR || path.resolve(defaultRoot, "data");
|
|
61
|
+
const imageDir = process.env.OCEAN_BRAIN_IMAGE_DIR || path.resolve(defaultRoot, "assets/images");
|
|
62
|
+
const dbPath = path.resolve(dataDir, "db.sqlite3");
|
|
63
|
+
fs2.mkdirSync(dataDir, { recursive: true });
|
|
64
|
+
fs2.mkdirSync(imageDir, { recursive: true });
|
|
65
|
+
process.env.DATABASE_URL = process.env.DATABASE_URL || `file:${dbPath}`;
|
|
66
|
+
process.env.OCEAN_BRAIN_PACKAGE_ROOT = serverRoot;
|
|
67
|
+
process.env.OCEAN_BRAIN_DATA_DIR = dataDir;
|
|
68
|
+
process.env.OCEAN_BRAIN_IMAGE_DIR = imageDir;
|
|
69
|
+
process.env.PORT = process.env.PORT || opts.port;
|
|
70
|
+
process.env.HOST = process.env.HOST || opts.host;
|
|
71
|
+
const authEnvironment = resolveServeAuthEnvironment(opts, process.env);
|
|
72
|
+
if (authEnvironment.OCEAN_BRAIN_ALLOW_INSECURE_NO_AUTH) {
|
|
73
|
+
process.env.OCEAN_BRAIN_ALLOW_INSECURE_NO_AUTH = authEnvironment.OCEAN_BRAIN_ALLOW_INSECURE_NO_AUTH;
|
|
74
|
+
}
|
|
75
|
+
const serverEntry = pathToFileURL(path.resolve(serverRoot, "dist/start.js")).href;
|
|
76
|
+
await import(serverEntry);
|
|
77
|
+
} catch (error) {
|
|
78
|
+
const message = error instanceof Error ? error.message : "Unknown CLI auth configuration error";
|
|
79
|
+
process.stderr.write(`[auth] Serve startup failed: ${message}
|
|
80
|
+
`);
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
53
83
|
});
|
|
54
|
-
program.command("mcp").description("Start MCP server for AI integration").option("-s, --server <url>", "Ocean Brain server URL", "http://localhost:6683").action(async (opts) => {
|
|
84
|
+
program.command("mcp").description("Start MCP server for AI integration").option("-s, --server <url>", "Ocean Brain server URL", "http://localhost:6683").option("--token-file <path>", "read the MCP bearer token from a file").option("--token <token>", "explicit MCP bearer token fallback").option("--write-safety-dir <path>", "directory for pending MCP write confirmations and operation logs").action(async (opts) => {
|
|
55
85
|
const { startMcpServer } = await import("./mcp.js");
|
|
56
|
-
|
|
86
|
+
const token = resolveMcpBearerToken(opts);
|
|
87
|
+
const writeSafetyDir = opts.writeSafetyDir || process.env.OCEAN_BRAIN_MCP_WRITE_SAFETY_DIR;
|
|
88
|
+
await startMcpServer(opts.server, token, { writeSafetyDir });
|
|
57
89
|
});
|
|
58
90
|
program.parse();
|