@remnic/server 1.0.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/README.md +1 -0
- package/dist/bin/chunk-XDNRJ5ON.js +150 -0
- package/dist/bin/chunk-XDNRJ5ON.js.map +1 -0
- package/dist/bin/engram-server.js +13 -0
- package/dist/bin/engram-server.js.map +1 -0
- package/dist/bin/remnic-server.js +13 -0
- package/dist/bin/remnic-server.js.map +1 -0
- package/dist/index.js +150 -0
- package/dist/index.js.map +1 -0
- package/package.json +41 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# M2: Standalone Server + CLI
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// openclaw-engram: Local-first memory plugin
|
|
2
|
+
|
|
3
|
+
// src/index.ts
|
|
4
|
+
import fs from "fs";
|
|
5
|
+
import path from "path";
|
|
6
|
+
import { parseConfig, Orchestrator, EngramAccessService, EngramAccessHttpServer, initLogger, log, getAllValidTokens, getAllValidTokensCached } from "@remnic/core";
|
|
7
|
+
function readCompatEnv(primary, legacy) {
|
|
8
|
+
return process.env[primary] ?? process.env[legacy];
|
|
9
|
+
}
|
|
10
|
+
function resolveConfigPath(cliPath) {
|
|
11
|
+
if (cliPath) return path.resolve(cliPath);
|
|
12
|
+
const envPath = readCompatEnv("REMNIC_CONFIG_PATH", "ENGRAM_CONFIG_PATH");
|
|
13
|
+
if (envPath) return path.resolve(envPath);
|
|
14
|
+
const homeDir = process.env.HOME ?? "~";
|
|
15
|
+
const candidates = [
|
|
16
|
+
path.join(process.cwd(), "remnic.config.json"),
|
|
17
|
+
path.join(process.cwd(), "engram.config.json"),
|
|
18
|
+
path.join(homeDir, ".config", "remnic", "config.json"),
|
|
19
|
+
path.join(homeDir, ".config", "engram", "config.json")
|
|
20
|
+
];
|
|
21
|
+
for (const candidate of candidates) {
|
|
22
|
+
if (fs.existsSync(candidate)) return candidate;
|
|
23
|
+
}
|
|
24
|
+
return path.join(homeDir, ".config", "remnic", "config.json");
|
|
25
|
+
}
|
|
26
|
+
function loadConfigFile(configPath) {
|
|
27
|
+
const raw = JSON.parse(fs.readFileSync(configPath, "utf8"));
|
|
28
|
+
return {
|
|
29
|
+
remnic: raw.remnic ?? raw.engram ?? raw ?? {},
|
|
30
|
+
server: raw.server ?? {}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function envOverrides() {
|
|
34
|
+
const overrides = {};
|
|
35
|
+
const remnic = {};
|
|
36
|
+
const port = readCompatEnv("REMNIC_PORT", "ENGRAM_PORT");
|
|
37
|
+
const host = readCompatEnv("REMNIC_HOST", "ENGRAM_HOST");
|
|
38
|
+
const authToken = readCompatEnv("REMNIC_AUTH_TOKEN", "ENGRAM_AUTH_TOKEN");
|
|
39
|
+
if (port) overrides.port = parseInt(port, 10);
|
|
40
|
+
if (host) overrides.host = host;
|
|
41
|
+
if (authToken) overrides.authToken = authToken;
|
|
42
|
+
if (process.env.OPENAI_API_KEY) remnic.openaiApiKey = process.env.OPENAI_API_KEY;
|
|
43
|
+
const memoryDir = readCompatEnv("REMNIC_MEMORY_DIR", "ENGRAM_MEMORY_DIR");
|
|
44
|
+
if (memoryDir) remnic.memoryDir = memoryDir;
|
|
45
|
+
return { ...overrides, ...Object.keys(remnic).length > 0 ? { remnic } : {} };
|
|
46
|
+
}
|
|
47
|
+
async function startServer(options) {
|
|
48
|
+
initLogger();
|
|
49
|
+
const configPath = resolveConfigPath(options?.configPath);
|
|
50
|
+
const fileConfig = fs.existsSync(configPath) ? loadConfigFile(configPath) : { remnic: {}, server: {} };
|
|
51
|
+
const env = envOverrides();
|
|
52
|
+
const remnicConfig = { ...fileConfig.remnic, ...env.remnic ?? {} };
|
|
53
|
+
const serverConfig = {
|
|
54
|
+
...fileConfig.server,
|
|
55
|
+
...env,
|
|
56
|
+
...options?.host ? { host: options.host } : {},
|
|
57
|
+
...options?.port ? { port: options.port } : {},
|
|
58
|
+
...options?.authToken ? { authToken: options.authToken } : {}
|
|
59
|
+
};
|
|
60
|
+
const config = parseConfig(remnicConfig);
|
|
61
|
+
const orchestrator = new Orchestrator(config);
|
|
62
|
+
const service = new EngramAccessService(orchestrator);
|
|
63
|
+
const authToken = serverConfig.authToken ?? readCompatEnv("REMNIC_AUTH_TOKEN", "ENGRAM_AUTH_TOKEN") ?? "";
|
|
64
|
+
if (!authToken && getAllValidTokens().length === 0) {
|
|
65
|
+
log.warn("No auth token set \u2014 server will reject all requests. Set REMNIC_AUTH_TOKEN, server.authToken in config, or generate tokens with 'remnic token generate'.");
|
|
66
|
+
}
|
|
67
|
+
const httpServer = new EngramAccessHttpServer({
|
|
68
|
+
service,
|
|
69
|
+
host: serverConfig.host ?? "127.0.0.1",
|
|
70
|
+
port: serverConfig.port ?? 4318,
|
|
71
|
+
authToken: authToken || void 0,
|
|
72
|
+
authTokensGetter: () => getAllValidTokensCached(),
|
|
73
|
+
principal: serverConfig.principal,
|
|
74
|
+
maxBodyBytes: serverConfig.maxBodyBytes,
|
|
75
|
+
adminConsoleEnabled: serverConfig.adminConsoleEnabled ?? false
|
|
76
|
+
});
|
|
77
|
+
const { host, port } = await httpServer.start();
|
|
78
|
+
return { config, service, httpServer, host, port };
|
|
79
|
+
}
|
|
80
|
+
function parseCliArgs(argv) {
|
|
81
|
+
const args = {};
|
|
82
|
+
for (let i = 0; i < argv.length; i++) {
|
|
83
|
+
const token = argv[i];
|
|
84
|
+
if (token.startsWith("--")) {
|
|
85
|
+
const key = token.slice(2);
|
|
86
|
+
const next = argv[i + 1];
|
|
87
|
+
if (next && !next.startsWith("--")) {
|
|
88
|
+
args[key] = next;
|
|
89
|
+
i++;
|
|
90
|
+
} else {
|
|
91
|
+
args[key] = "true";
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return args;
|
|
96
|
+
}
|
|
97
|
+
async function cliMain(argv = process.argv.slice(2)) {
|
|
98
|
+
const args = parseCliArgs(argv);
|
|
99
|
+
if (args.help) {
|
|
100
|
+
console.log(`
|
|
101
|
+
remnic-server \u2014 Standalone Remnic memory server
|
|
102
|
+
|
|
103
|
+
Usage:
|
|
104
|
+
remnic-server [options]
|
|
105
|
+
|
|
106
|
+
Options:
|
|
107
|
+
--config <path> Path to config file (default: remnic.config.json)
|
|
108
|
+
--host <addr> Bind address (default: 127.0.0.1)
|
|
109
|
+
--port <number> Port number (default: 4318)
|
|
110
|
+
--auth-token <tok> Bearer token for auth (or set REMNIC_AUTH_TOKEN)
|
|
111
|
+
--help Show this help
|
|
112
|
+
|
|
113
|
+
Environment:
|
|
114
|
+
REMNIC_CONFIG_PATH Config file path (ENGRAM_CONFIG_PATH also supported)
|
|
115
|
+
REMNIC_PORT Server port (ENGRAM_PORT also supported)
|
|
116
|
+
REMNIC_HOST Bind address (ENGRAM_HOST also supported)
|
|
117
|
+
REMNIC_AUTH_TOKEN Auth bearer token (ENGRAM_AUTH_TOKEN also supported)
|
|
118
|
+
REMNIC_MEMORY_DIR Override memory directory (ENGRAM_MEMORY_DIR also supported)
|
|
119
|
+
OPENAI_API_KEY OpenAI API key for extraction
|
|
120
|
+
`);
|
|
121
|
+
process.exit(0);
|
|
122
|
+
}
|
|
123
|
+
const result = await startServer({
|
|
124
|
+
configPath: args.config,
|
|
125
|
+
host: args.host,
|
|
126
|
+
port: args.port ? parseInt(args.port, 10) : void 0,
|
|
127
|
+
authToken: args["auth-token"]
|
|
128
|
+
});
|
|
129
|
+
console.log(`Remnic server listening on http://${result.host}:${result.port}`);
|
|
130
|
+
const shutdown = async (signal) => {
|
|
131
|
+
console.log(`
|
|
132
|
+
Received ${signal}, shutting down...`);
|
|
133
|
+
await result.httpServer.stop();
|
|
134
|
+
process.exit(0);
|
|
135
|
+
};
|
|
136
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
137
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
138
|
+
}
|
|
139
|
+
if (process.argv[1] && (/remnic-server[\\/](?:dist|src)[\\/]index\.[jt]s$/.test(process.argv[1]) || /engram-server[\\/](?:dist|src)[\\/]index\.[jt]s$/.test(process.argv[1]) || process.argv[1].endsWith("remnic-server") || process.argv[1].endsWith("engram-server"))) {
|
|
140
|
+
cliMain().catch((err) => {
|
|
141
|
+
process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}
|
|
142
|
+
`);
|
|
143
|
+
process.exit(1);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export {
|
|
148
|
+
cliMain
|
|
149
|
+
};
|
|
150
|
+
//# sourceMappingURL=chunk-XDNRJ5ON.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["/**\n * @remnic/server\n *\n * Standalone Remnic memory server.\n *\n * Loads config from `remnic.config.json` (or env vars), creates an Orchestrator,\n * and starts the HTTP access server with MCP endpoint — no OpenClaw required.\n *\n * Usage:\n * npx remnic-server\n * npx remnic-server --config ./my-remnic.json\n * npx remnic-server --port 4320\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { parseConfig, Orchestrator, EngramAccessService, EngramAccessHttpServer, initLogger, log, getAllValidTokens, getAllValidTokensCached, type PluginConfig } from \"@remnic/core\";\n\n// ── Config loading ──────────────────────────────────────────────────────────\n\nexport interface ServerConfig {\n remnic: Record<string, unknown>;\n server: {\n host?: string;\n port?: number;\n authToken?: string;\n principal?: string;\n maxBodyBytes?: number;\n adminConsoleEnabled?: boolean;\n };\n}\n\nfunction readCompatEnv(primary: string, legacy: string): string | undefined {\n return process.env[primary] ?? process.env[legacy];\n}\n\nfunction resolveConfigPath(cliPath?: string): string {\n if (cliPath) return path.resolve(cliPath);\n\n const envPath = readCompatEnv(\"REMNIC_CONFIG_PATH\", \"ENGRAM_CONFIG_PATH\");\n if (envPath) return path.resolve(envPath);\n\n const homeDir = process.env.HOME ?? \"~\";\n const candidates = [\n path.join(process.cwd(), \"remnic.config.json\"),\n path.join(process.cwd(), \"engram.config.json\"),\n path.join(homeDir, \".config\", \"remnic\", \"config.json\"),\n path.join(homeDir, \".config\", \"engram\", \"config.json\"),\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return path.join(homeDir, \".config\", \"remnic\", \"config.json\");\n}\n\nfunction loadConfigFile(configPath: string): ServerConfig {\n const raw = JSON.parse(fs.readFileSync(configPath, \"utf8\"));\n return {\n remnic: raw.remnic ?? raw.engram ?? raw ?? {},\n server: raw.server ?? {},\n };\n}\n\nfunction envOverrides(): Partial<ServerConfig[\"server\"]> & { remnic?: Record<string, unknown> } {\n const overrides: Record<string, unknown> = {};\n const remnic: Record<string, unknown> = {};\n\n const port = readCompatEnv(\"REMNIC_PORT\", \"ENGRAM_PORT\");\n const host = readCompatEnv(\"REMNIC_HOST\", \"ENGRAM_HOST\");\n const authToken = readCompatEnv(\"REMNIC_AUTH_TOKEN\", \"ENGRAM_AUTH_TOKEN\");\n if (port) overrides.port = parseInt(port, 10);\n if (host) overrides.host = host;\n if (authToken) overrides.authToken = authToken;\n\n if (process.env.OPENAI_API_KEY) remnic.openaiApiKey = process.env.OPENAI_API_KEY;\n const memoryDir = readCompatEnv(\"REMNIC_MEMORY_DIR\", \"ENGRAM_MEMORY_DIR\");\n if (memoryDir) remnic.memoryDir = memoryDir;\n\n return { ...overrides, ...(Object.keys(remnic).length > 0 ? { remnic } : {}) };\n}\n\n// ── Server startup ──────────────────────────────────────────────────────────\n\nexport interface ServerResult {\n config: PluginConfig;\n service: EngramAccessService;\n httpServer: EngramAccessHttpServer;\n host: string;\n port: number;\n}\n\nexport async function startServer(options?: {\n configPath?: string;\n host?: string;\n port?: number;\n authToken?: string;\n}): Promise<ServerResult> {\n initLogger();\n\n const configPath = resolveConfigPath(options?.configPath);\n const fileConfig = fs.existsSync(configPath)\n ? loadConfigFile(configPath)\n : { remnic: {}, server: {} };\n\n const env = envOverrides();\n\n // Merge: file < env < cli flags\n const remnicConfig = { ...fileConfig.remnic, ...(env.remnic ?? {}) };\n const serverConfig = {\n ...fileConfig.server,\n ...env,\n ...(options?.host ? { host: options.host } : {}),\n ...(options?.port ? { port: options.port } : {}),\n ...(options?.authToken ? { authToken: options.authToken } : {}),\n };\n\n const config = parseConfig(remnicConfig);\n const orchestrator = new Orchestrator(config);\n const service = new EngramAccessService(orchestrator);\n\n const authToken = serverConfig.authToken ?? readCompatEnv(\"REMNIC_AUTH_TOKEN\", \"ENGRAM_AUTH_TOKEN\") ?? \"\";\n\n // Connector tokens are loaded dynamically per request via authTokensGetter\n // so that token generate/revoke takes effect without server restart\n if (!authToken && getAllValidTokens().length === 0) {\n log.warn(\"No auth token set — server will reject all requests. Set REMNIC_AUTH_TOKEN, server.authToken in config, or generate tokens with 'remnic token generate'.\");\n }\n\n const httpServer = new EngramAccessHttpServer({\n service,\n host: serverConfig.host ?? \"127.0.0.1\",\n port: serverConfig.port ?? 4318,\n authToken: authToken || undefined,\n authTokensGetter: () => getAllValidTokensCached(),\n principal: serverConfig.principal,\n maxBodyBytes: serverConfig.maxBodyBytes,\n adminConsoleEnabled: serverConfig.adminConsoleEnabled ?? false,\n });\n\n const { host, port } = await httpServer.start();\n\n return { config, service, httpServer, host, port };\n}\n\n// ── CLI entry point ──────────────────────────────────────────────────────────\n\nfunction parseCliArgs(argv: string[]): Record<string, string | undefined> {\n const args: Record<string, string | undefined> = {};\n for (let i = 0; i < argv.length; i++) {\n const token = argv[i];\n if (token.startsWith(\"--\")) {\n const key = token.slice(2);\n const next = argv[i + 1];\n if (next && !next.startsWith(\"--\")) {\n args[key] = next;\n i++;\n } else {\n args[key] = \"true\";\n }\n }\n }\n return args;\n}\n\nexport async function cliMain(argv: string[] = process.argv.slice(2)): Promise<void> {\n const args = parseCliArgs(argv);\n\n if (args.help) {\n console.log(`\nremnic-server — Standalone Remnic memory server\n\nUsage:\n remnic-server [options]\n\nOptions:\n --config <path> Path to config file (default: remnic.config.json)\n --host <addr> Bind address (default: 127.0.0.1)\n --port <number> Port number (default: 4318)\n --auth-token <tok> Bearer token for auth (or set REMNIC_AUTH_TOKEN)\n --help Show this help\n\nEnvironment:\n REMNIC_CONFIG_PATH Config file path (ENGRAM_CONFIG_PATH also supported)\n REMNIC_PORT Server port (ENGRAM_PORT also supported)\n REMNIC_HOST Bind address (ENGRAM_HOST also supported)\n REMNIC_AUTH_TOKEN Auth bearer token (ENGRAM_AUTH_TOKEN also supported)\n REMNIC_MEMORY_DIR Override memory directory (ENGRAM_MEMORY_DIR also supported)\n OPENAI_API_KEY OpenAI API key for extraction\n`);\n process.exit(0);\n }\n\n const result = await startServer({\n configPath: args.config,\n host: args.host,\n port: args.port ? parseInt(args.port, 10) : undefined,\n authToken: args[\"auth-token\"],\n });\n\n console.log(`Remnic server listening on http://${result.host}:${result.port}`);\n\n // Graceful shutdown\n const shutdown = async (signal: string) => {\n console.log(`\\nReceived ${signal}, shutting down...`);\n await result.httpServer.stop();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n}\n\n// Auto-run when executed directly\n// Matches: `node .../remnic-server/dist/index.js`, `node .../remnic-server/src/index.ts`,\n// `npx remnic-server`, `npx engram-server`, but NOT test files under those directories\nif (\n process.argv[1] &&\n (/remnic-server[\\\\/](?:dist|src)[\\\\/]index\\.[jt]s$/.test(process.argv[1]) ||\n /engram-server[\\\\/](?:dist|src)[\\\\/]index\\.[jt]s$/.test(process.argv[1]) ||\n process.argv[1].endsWith(\"remnic-server\") ||\n process.argv[1].endsWith(\"engram-server\"))\n) {\n cliMain().catch((err) => {\n process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// openclaw-engram: Local-first memory plugin
|
|
3
|
+
import {
|
|
4
|
+
cliMain
|
|
5
|
+
} from "./chunk-XDNRJ5ON.js";
|
|
6
|
+
|
|
7
|
+
// bin/engram-server.ts
|
|
8
|
+
cliMain().catch((err) => {
|
|
9
|
+
process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}
|
|
10
|
+
`);
|
|
11
|
+
process.exit(1);
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=engram-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../bin/engram-server.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * engram-server binary entry point.\n * Delegates to @remnic/server CLI main.\n */\nimport { cliMain } from \"../src/index.js\";\n\ncliMain().catch((err) => {\n process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n});\n"],"mappings":";;;;;;;AAOA,QAAQ,EAAE,MAAM,CAAC,QAAQ;AACvB,UAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// openclaw-engram: Local-first memory plugin
|
|
3
|
+
import {
|
|
4
|
+
cliMain
|
|
5
|
+
} from "./chunk-XDNRJ5ON.js";
|
|
6
|
+
|
|
7
|
+
// bin/remnic-server.ts
|
|
8
|
+
cliMain().catch((err) => {
|
|
9
|
+
process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}
|
|
10
|
+
`);
|
|
11
|
+
process.exit(1);
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=remnic-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../bin/remnic-server.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * remnic-server binary entry point.\n * Delegates to @remnic/server CLI main.\n */\nimport { cliMain } from \"../src/index.js\";\n\ncliMain().catch((err) => {\n process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n});\n"],"mappings":";;;;;;;AAOA,QAAQ,EAAE,MAAM,CAAC,QAAQ;AACvB,UAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// openclaw-engram: Local-first memory plugin
|
|
2
|
+
|
|
3
|
+
// src/index.ts
|
|
4
|
+
import fs from "fs";
|
|
5
|
+
import path from "path";
|
|
6
|
+
import { parseConfig, Orchestrator, EngramAccessService, EngramAccessHttpServer, initLogger, log, getAllValidTokens, getAllValidTokensCached } from "@remnic/core";
|
|
7
|
+
function readCompatEnv(primary, legacy) {
|
|
8
|
+
return process.env[primary] ?? process.env[legacy];
|
|
9
|
+
}
|
|
10
|
+
function resolveConfigPath(cliPath) {
|
|
11
|
+
if (cliPath) return path.resolve(cliPath);
|
|
12
|
+
const envPath = readCompatEnv("REMNIC_CONFIG_PATH", "ENGRAM_CONFIG_PATH");
|
|
13
|
+
if (envPath) return path.resolve(envPath);
|
|
14
|
+
const homeDir = process.env.HOME ?? "~";
|
|
15
|
+
const candidates = [
|
|
16
|
+
path.join(process.cwd(), "remnic.config.json"),
|
|
17
|
+
path.join(process.cwd(), "engram.config.json"),
|
|
18
|
+
path.join(homeDir, ".config", "remnic", "config.json"),
|
|
19
|
+
path.join(homeDir, ".config", "engram", "config.json")
|
|
20
|
+
];
|
|
21
|
+
for (const candidate of candidates) {
|
|
22
|
+
if (fs.existsSync(candidate)) return candidate;
|
|
23
|
+
}
|
|
24
|
+
return path.join(homeDir, ".config", "remnic", "config.json");
|
|
25
|
+
}
|
|
26
|
+
function loadConfigFile(configPath) {
|
|
27
|
+
const raw = JSON.parse(fs.readFileSync(configPath, "utf8"));
|
|
28
|
+
return {
|
|
29
|
+
remnic: raw.remnic ?? raw.engram ?? raw ?? {},
|
|
30
|
+
server: raw.server ?? {}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function envOverrides() {
|
|
34
|
+
const overrides = {};
|
|
35
|
+
const remnic = {};
|
|
36
|
+
const port = readCompatEnv("REMNIC_PORT", "ENGRAM_PORT");
|
|
37
|
+
const host = readCompatEnv("REMNIC_HOST", "ENGRAM_HOST");
|
|
38
|
+
const authToken = readCompatEnv("REMNIC_AUTH_TOKEN", "ENGRAM_AUTH_TOKEN");
|
|
39
|
+
if (port) overrides.port = parseInt(port, 10);
|
|
40
|
+
if (host) overrides.host = host;
|
|
41
|
+
if (authToken) overrides.authToken = authToken;
|
|
42
|
+
if (process.env.OPENAI_API_KEY) remnic.openaiApiKey = process.env.OPENAI_API_KEY;
|
|
43
|
+
const memoryDir = readCompatEnv("REMNIC_MEMORY_DIR", "ENGRAM_MEMORY_DIR");
|
|
44
|
+
if (memoryDir) remnic.memoryDir = memoryDir;
|
|
45
|
+
return { ...overrides, ...Object.keys(remnic).length > 0 ? { remnic } : {} };
|
|
46
|
+
}
|
|
47
|
+
async function startServer(options) {
|
|
48
|
+
initLogger();
|
|
49
|
+
const configPath = resolveConfigPath(options?.configPath);
|
|
50
|
+
const fileConfig = fs.existsSync(configPath) ? loadConfigFile(configPath) : { remnic: {}, server: {} };
|
|
51
|
+
const env = envOverrides();
|
|
52
|
+
const remnicConfig = { ...fileConfig.remnic, ...env.remnic ?? {} };
|
|
53
|
+
const serverConfig = {
|
|
54
|
+
...fileConfig.server,
|
|
55
|
+
...env,
|
|
56
|
+
...options?.host ? { host: options.host } : {},
|
|
57
|
+
...options?.port ? { port: options.port } : {},
|
|
58
|
+
...options?.authToken ? { authToken: options.authToken } : {}
|
|
59
|
+
};
|
|
60
|
+
const config = parseConfig(remnicConfig);
|
|
61
|
+
const orchestrator = new Orchestrator(config);
|
|
62
|
+
const service = new EngramAccessService(orchestrator);
|
|
63
|
+
const authToken = serverConfig.authToken ?? readCompatEnv("REMNIC_AUTH_TOKEN", "ENGRAM_AUTH_TOKEN") ?? "";
|
|
64
|
+
if (!authToken && getAllValidTokens().length === 0) {
|
|
65
|
+
log.warn("No auth token set \u2014 server will reject all requests. Set REMNIC_AUTH_TOKEN, server.authToken in config, or generate tokens with 'remnic token generate'.");
|
|
66
|
+
}
|
|
67
|
+
const httpServer = new EngramAccessHttpServer({
|
|
68
|
+
service,
|
|
69
|
+
host: serverConfig.host ?? "127.0.0.1",
|
|
70
|
+
port: serverConfig.port ?? 4318,
|
|
71
|
+
authToken: authToken || void 0,
|
|
72
|
+
authTokensGetter: () => getAllValidTokensCached(),
|
|
73
|
+
principal: serverConfig.principal,
|
|
74
|
+
maxBodyBytes: serverConfig.maxBodyBytes,
|
|
75
|
+
adminConsoleEnabled: serverConfig.adminConsoleEnabled ?? false
|
|
76
|
+
});
|
|
77
|
+
const { host, port } = await httpServer.start();
|
|
78
|
+
return { config, service, httpServer, host, port };
|
|
79
|
+
}
|
|
80
|
+
function parseCliArgs(argv) {
|
|
81
|
+
const args = {};
|
|
82
|
+
for (let i = 0; i < argv.length; i++) {
|
|
83
|
+
const token = argv[i];
|
|
84
|
+
if (token.startsWith("--")) {
|
|
85
|
+
const key = token.slice(2);
|
|
86
|
+
const next = argv[i + 1];
|
|
87
|
+
if (next && !next.startsWith("--")) {
|
|
88
|
+
args[key] = next;
|
|
89
|
+
i++;
|
|
90
|
+
} else {
|
|
91
|
+
args[key] = "true";
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return args;
|
|
96
|
+
}
|
|
97
|
+
async function cliMain(argv = process.argv.slice(2)) {
|
|
98
|
+
const args = parseCliArgs(argv);
|
|
99
|
+
if (args.help) {
|
|
100
|
+
console.log(`
|
|
101
|
+
remnic-server \u2014 Standalone Remnic memory server
|
|
102
|
+
|
|
103
|
+
Usage:
|
|
104
|
+
remnic-server [options]
|
|
105
|
+
|
|
106
|
+
Options:
|
|
107
|
+
--config <path> Path to config file (default: remnic.config.json)
|
|
108
|
+
--host <addr> Bind address (default: 127.0.0.1)
|
|
109
|
+
--port <number> Port number (default: 4318)
|
|
110
|
+
--auth-token <tok> Bearer token for auth (or set REMNIC_AUTH_TOKEN)
|
|
111
|
+
--help Show this help
|
|
112
|
+
|
|
113
|
+
Environment:
|
|
114
|
+
REMNIC_CONFIG_PATH Config file path (ENGRAM_CONFIG_PATH also supported)
|
|
115
|
+
REMNIC_PORT Server port (ENGRAM_PORT also supported)
|
|
116
|
+
REMNIC_HOST Bind address (ENGRAM_HOST also supported)
|
|
117
|
+
REMNIC_AUTH_TOKEN Auth bearer token (ENGRAM_AUTH_TOKEN also supported)
|
|
118
|
+
REMNIC_MEMORY_DIR Override memory directory (ENGRAM_MEMORY_DIR also supported)
|
|
119
|
+
OPENAI_API_KEY OpenAI API key for extraction
|
|
120
|
+
`);
|
|
121
|
+
process.exit(0);
|
|
122
|
+
}
|
|
123
|
+
const result = await startServer({
|
|
124
|
+
configPath: args.config,
|
|
125
|
+
host: args.host,
|
|
126
|
+
port: args.port ? parseInt(args.port, 10) : void 0,
|
|
127
|
+
authToken: args["auth-token"]
|
|
128
|
+
});
|
|
129
|
+
console.log(`Remnic server listening on http://${result.host}:${result.port}`);
|
|
130
|
+
const shutdown = async (signal) => {
|
|
131
|
+
console.log(`
|
|
132
|
+
Received ${signal}, shutting down...`);
|
|
133
|
+
await result.httpServer.stop();
|
|
134
|
+
process.exit(0);
|
|
135
|
+
};
|
|
136
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
137
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
138
|
+
}
|
|
139
|
+
if (process.argv[1] && (/remnic-server[\\/](?:dist|src)[\\/]index\.[jt]s$/.test(process.argv[1]) || /engram-server[\\/](?:dist|src)[\\/]index\.[jt]s$/.test(process.argv[1]) || process.argv[1].endsWith("remnic-server") || process.argv[1].endsWith("engram-server"))) {
|
|
140
|
+
cliMain().catch((err) => {
|
|
141
|
+
process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}
|
|
142
|
+
`);
|
|
143
|
+
process.exit(1);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
export {
|
|
147
|
+
cliMain,
|
|
148
|
+
startServer
|
|
149
|
+
};
|
|
150
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @remnic/server\n *\n * Standalone Remnic memory server.\n *\n * Loads config from `remnic.config.json` (or env vars), creates an Orchestrator,\n * and starts the HTTP access server with MCP endpoint — no OpenClaw required.\n *\n * Usage:\n * npx remnic-server\n * npx remnic-server --config ./my-remnic.json\n * npx remnic-server --port 4320\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { parseConfig, Orchestrator, EngramAccessService, EngramAccessHttpServer, initLogger, log, getAllValidTokens, getAllValidTokensCached, type PluginConfig } from \"@remnic/core\";\n\n// ── Config loading ──────────────────────────────────────────────────────────\n\nexport interface ServerConfig {\n remnic: Record<string, unknown>;\n server: {\n host?: string;\n port?: number;\n authToken?: string;\n principal?: string;\n maxBodyBytes?: number;\n adminConsoleEnabled?: boolean;\n };\n}\n\nfunction readCompatEnv(primary: string, legacy: string): string | undefined {\n return process.env[primary] ?? process.env[legacy];\n}\n\nfunction resolveConfigPath(cliPath?: string): string {\n if (cliPath) return path.resolve(cliPath);\n\n const envPath = readCompatEnv(\"REMNIC_CONFIG_PATH\", \"ENGRAM_CONFIG_PATH\");\n if (envPath) return path.resolve(envPath);\n\n const homeDir = process.env.HOME ?? \"~\";\n const candidates = [\n path.join(process.cwd(), \"remnic.config.json\"),\n path.join(process.cwd(), \"engram.config.json\"),\n path.join(homeDir, \".config\", \"remnic\", \"config.json\"),\n path.join(homeDir, \".config\", \"engram\", \"config.json\"),\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return path.join(homeDir, \".config\", \"remnic\", \"config.json\");\n}\n\nfunction loadConfigFile(configPath: string): ServerConfig {\n const raw = JSON.parse(fs.readFileSync(configPath, \"utf8\"));\n return {\n remnic: raw.remnic ?? raw.engram ?? raw ?? {},\n server: raw.server ?? {},\n };\n}\n\nfunction envOverrides(): Partial<ServerConfig[\"server\"]> & { remnic?: Record<string, unknown> } {\n const overrides: Record<string, unknown> = {};\n const remnic: Record<string, unknown> = {};\n\n const port = readCompatEnv(\"REMNIC_PORT\", \"ENGRAM_PORT\");\n const host = readCompatEnv(\"REMNIC_HOST\", \"ENGRAM_HOST\");\n const authToken = readCompatEnv(\"REMNIC_AUTH_TOKEN\", \"ENGRAM_AUTH_TOKEN\");\n if (port) overrides.port = parseInt(port, 10);\n if (host) overrides.host = host;\n if (authToken) overrides.authToken = authToken;\n\n if (process.env.OPENAI_API_KEY) remnic.openaiApiKey = process.env.OPENAI_API_KEY;\n const memoryDir = readCompatEnv(\"REMNIC_MEMORY_DIR\", \"ENGRAM_MEMORY_DIR\");\n if (memoryDir) remnic.memoryDir = memoryDir;\n\n return { ...overrides, ...(Object.keys(remnic).length > 0 ? { remnic } : {}) };\n}\n\n// ── Server startup ──────────────────────────────────────────────────────────\n\nexport interface ServerResult {\n config: PluginConfig;\n service: EngramAccessService;\n httpServer: EngramAccessHttpServer;\n host: string;\n port: number;\n}\n\nexport async function startServer(options?: {\n configPath?: string;\n host?: string;\n port?: number;\n authToken?: string;\n}): Promise<ServerResult> {\n initLogger();\n\n const configPath = resolveConfigPath(options?.configPath);\n const fileConfig = fs.existsSync(configPath)\n ? loadConfigFile(configPath)\n : { remnic: {}, server: {} };\n\n const env = envOverrides();\n\n // Merge: file < env < cli flags\n const remnicConfig = { ...fileConfig.remnic, ...(env.remnic ?? {}) };\n const serverConfig = {\n ...fileConfig.server,\n ...env,\n ...(options?.host ? { host: options.host } : {}),\n ...(options?.port ? { port: options.port } : {}),\n ...(options?.authToken ? { authToken: options.authToken } : {}),\n };\n\n const config = parseConfig(remnicConfig);\n const orchestrator = new Orchestrator(config);\n const service = new EngramAccessService(orchestrator);\n\n const authToken = serverConfig.authToken ?? readCompatEnv(\"REMNIC_AUTH_TOKEN\", \"ENGRAM_AUTH_TOKEN\") ?? \"\";\n\n // Connector tokens are loaded dynamically per request via authTokensGetter\n // so that token generate/revoke takes effect without server restart\n if (!authToken && getAllValidTokens().length === 0) {\n log.warn(\"No auth token set — server will reject all requests. Set REMNIC_AUTH_TOKEN, server.authToken in config, or generate tokens with 'remnic token generate'.\");\n }\n\n const httpServer = new EngramAccessHttpServer({\n service,\n host: serverConfig.host ?? \"127.0.0.1\",\n port: serverConfig.port ?? 4318,\n authToken: authToken || undefined,\n authTokensGetter: () => getAllValidTokensCached(),\n principal: serverConfig.principal,\n maxBodyBytes: serverConfig.maxBodyBytes,\n adminConsoleEnabled: serverConfig.adminConsoleEnabled ?? false,\n });\n\n const { host, port } = await httpServer.start();\n\n return { config, service, httpServer, host, port };\n}\n\n// ── CLI entry point ──────────────────────────────────────────────────────────\n\nfunction parseCliArgs(argv: string[]): Record<string, string | undefined> {\n const args: Record<string, string | undefined> = {};\n for (let i = 0; i < argv.length; i++) {\n const token = argv[i];\n if (token.startsWith(\"--\")) {\n const key = token.slice(2);\n const next = argv[i + 1];\n if (next && !next.startsWith(\"--\")) {\n args[key] = next;\n i++;\n } else {\n args[key] = \"true\";\n }\n }\n }\n return args;\n}\n\nexport async function cliMain(argv: string[] = process.argv.slice(2)): Promise<void> {\n const args = parseCliArgs(argv);\n\n if (args.help) {\n console.log(`\nremnic-server — Standalone Remnic memory server\n\nUsage:\n remnic-server [options]\n\nOptions:\n --config <path> Path to config file (default: remnic.config.json)\n --host <addr> Bind address (default: 127.0.0.1)\n --port <number> Port number (default: 4318)\n --auth-token <tok> Bearer token for auth (or set REMNIC_AUTH_TOKEN)\n --help Show this help\n\nEnvironment:\n REMNIC_CONFIG_PATH Config file path (ENGRAM_CONFIG_PATH also supported)\n REMNIC_PORT Server port (ENGRAM_PORT also supported)\n REMNIC_HOST Bind address (ENGRAM_HOST also supported)\n REMNIC_AUTH_TOKEN Auth bearer token (ENGRAM_AUTH_TOKEN also supported)\n REMNIC_MEMORY_DIR Override memory directory (ENGRAM_MEMORY_DIR also supported)\n OPENAI_API_KEY OpenAI API key for extraction\n`);\n process.exit(0);\n }\n\n const result = await startServer({\n configPath: args.config,\n host: args.host,\n port: args.port ? parseInt(args.port, 10) : undefined,\n authToken: args[\"auth-token\"],\n });\n\n console.log(`Remnic server listening on http://${result.host}:${result.port}`);\n\n // Graceful shutdown\n const shutdown = async (signal: string) => {\n console.log(`\\nReceived ${signal}, shutting down...`);\n await result.httpServer.stop();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n}\n\n// Auto-run when executed directly\n// Matches: `node .../remnic-server/dist/index.js`, `node .../remnic-server/src/index.ts`,\n// `npx remnic-server`, `npx engram-server`, but NOT test files under those directories\nif (\n process.argv[1] &&\n (/remnic-server[\\\\/](?:dist|src)[\\\\/]index\\.[jt]s$/.test(process.argv[1]) ||\n /engram-server[\\\\/](?:dist|src)[\\\\/]index\\.[jt]s$/.test(process.argv[1]) ||\n process.argv[1].endsWith(\"remnic-server\") ||\n process.argv[1].endsWith(\"engram-server\"))\n) {\n cliMain().catch((err) => {\n process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n });\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@remnic/server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Standalone Remnic memory server — HTTP + MCP without OpenClaw",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"import": "./dist/index.js"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"bin": {
|
|
13
|
+
"remnic-server": "./dist/bin/remnic-server.js",
|
|
14
|
+
"engram-server": "./dist/bin/engram-server.js"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public",
|
|
21
|
+
"provenance": true
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsup src/index.ts --format esm --target es2022 --platform node --outDir dist && tsup bin/remnic-server.ts bin/engram-server.ts --format esm --target es2022 --platform node --outDir dist/bin",
|
|
25
|
+
"check-types": "tsc --noEmit",
|
|
26
|
+
"prepublishOnly": "npm run build"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@remnic/core": "workspace:*"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"tsup": "^8.5.1",
|
|
33
|
+
"typescript": "^5.9.3"
|
|
34
|
+
},
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "https://github.com/joshuaswarren/remnic.git",
|
|
39
|
+
"directory": "packages/remnic-server"
|
|
40
|
+
}
|
|
41
|
+
}
|