@susu-eng/gralkor 26.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/.env.example +32 -0
- package/README.md +429 -0
- package/config.yaml +16 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +89 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/check.d.ts +2 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +118 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/config.d.ts +3 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +24 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/install.d.ts +8 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +105 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +68 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/lib/config.d.ts +7 -0
- package/dist/cli/lib/config.d.ts.map +1 -0
- package/dist/cli/lib/config.js +38 -0
- package/dist/cli/lib/config.js.map +1 -0
- package/dist/cli/lib/openclaw.d.ts +21 -0
- package/dist/cli/lib/openclaw.d.ts.map +1 -0
- package/dist/cli/lib/openclaw.js +93 -0
- package/dist/cli/lib/openclaw.js.map +1 -0
- package/dist/cli/lib/output.d.ts +9 -0
- package/dist/cli/lib/output.d.ts.map +1 -0
- package/dist/cli/lib/output.js +36 -0
- package/dist/cli/lib/output.js.map +1 -0
- package/dist/cli/lib/version.d.ts +9 -0
- package/dist/cli/lib/version.d.ts.map +1 -0
- package/dist/cli/lib/version.js +51 -0
- package/dist/cli/lib/version.js.map +1 -0
- package/dist/client.d.ts +72 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +85 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +69 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +163 -0
- package/dist/config.js.map +1 -0
- package/dist/hooks.d.ts +131 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +458 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +88 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +184 -0
- package/dist/index.js.map +1 -0
- package/dist/native-memory.d.ts +67 -0
- package/dist/native-memory.d.ts.map +1 -0
- package/dist/native-memory.js +79 -0
- package/dist/native-memory.js.map +1 -0
- package/dist/register.d.ts +10 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +150 -0
- package/dist/register.js.map +1 -0
- package/dist/server-manager.d.ts +19 -0
- package/dist/server-manager.d.ts.map +1 -0
- package/dist/server-manager.js +238 -0
- package/dist/server-manager.js.map +1 -0
- package/dist/tools.d.ts +32 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +56 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +48 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/docker-compose.yml +34 -0
- package/openclaw.plugin.json +99 -0
- package/package.json +65 -0
- package/server/Dockerfile +7 -0
- package/server/main.py +763 -0
- package/server/pyproject.toml +19 -0
- package/server/requirements.txt +5 -0
- package/server/uv.lock +1162 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { execFile, spawn } from "node:child_process";
|
|
2
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
3
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import { DEFAULT_LLM_PROVIDER, DEFAULT_LLM_MODEL, DEFAULT_EMBEDDER_PROVIDER, DEFAULT_EMBEDDER_MODEL } from "./config.js";
|
|
7
|
+
const execFileAsync = promisify(execFile);
|
|
8
|
+
const HEALTH_POLL_INTERVAL_MS = 500;
|
|
9
|
+
const HEALTH_TIMEOUT_MS = 120_000;
|
|
10
|
+
const MONITOR_INTERVAL_MS = 60_000;
|
|
11
|
+
const STOP_GRACE_MS = 5_000;
|
|
12
|
+
export function createServerManager(opts) {
|
|
13
|
+
let proc = null;
|
|
14
|
+
let monitorTimer;
|
|
15
|
+
async function start() {
|
|
16
|
+
if (proc)
|
|
17
|
+
return;
|
|
18
|
+
const bootStart = Date.now();
|
|
19
|
+
console.log("[gralkor] boot: starting...");
|
|
20
|
+
await mkdir(opts.dataDir, { recursive: true });
|
|
21
|
+
const venvDir = join(opts.dataDir, "venv");
|
|
22
|
+
const venvPython = join(venvDir, "bin", "python");
|
|
23
|
+
// Ensure uv is available
|
|
24
|
+
try {
|
|
25
|
+
await execFileAsync("uv", ["--version"]);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
throw new Error("uv is required but not found on PATH. " +
|
|
29
|
+
"Install: curl -LsSf https://astral.sh/uv/install.sh | sh");
|
|
30
|
+
}
|
|
31
|
+
// Sync Python environment
|
|
32
|
+
const syncEnv = {
|
|
33
|
+
...process.env,
|
|
34
|
+
UV_PROJECT_ENVIRONMENT: venvDir,
|
|
35
|
+
};
|
|
36
|
+
console.log("[gralkor] boot: syncing python env...");
|
|
37
|
+
await execFileAsync("uv", ["sync", "--no-dev", "--frozen", "--directory", opts.serverDir], { env: syncEnv, timeout: 300_000 });
|
|
38
|
+
console.log("[gralkor] boot: python env ready");
|
|
39
|
+
// Force-install bundled wheels to override broken PyPI packages.
|
|
40
|
+
// UV_FIND_LINKS doesn't work with `uv sync --frozen` (lockfile hash
|
|
41
|
+
// verification rejects locally-built wheels), so we use a separate
|
|
42
|
+
// `uv pip install` step that bypasses the lockfile entirely.
|
|
43
|
+
const wheelsDir = join(opts.serverDir, "wheels");
|
|
44
|
+
if (existsSync(wheelsDir)) {
|
|
45
|
+
const wheelPaths = readdirSync(wheelsDir)
|
|
46
|
+
.filter((f) => f.endsWith(".whl"))
|
|
47
|
+
.map((f) => join(wheelsDir, f));
|
|
48
|
+
for (const wheelPath of wheelPaths) {
|
|
49
|
+
try {
|
|
50
|
+
console.log("[gralkor] Installing bundled wheel:", wheelPath);
|
|
51
|
+
await execFileAsync("uv", ["pip", "install", "--reinstall", "--no-deps", wheelPath, "--python", venvPython], { timeout: 60_000 });
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Wheel might not be compatible with this platform (e.g. arm64
|
|
55
|
+
// wheel on a macOS dev machine) — that's OK, uv sync already
|
|
56
|
+
// installed compatible packages from PyPI.
|
|
57
|
+
console.log("[gralkor] Bundled wheel not compatible, using PyPI version");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Write dynamic config.yaml from plugin settings (with defaults)
|
|
62
|
+
const configPath = join(opts.dataDir, "config.yaml");
|
|
63
|
+
let configYaml = [
|
|
64
|
+
"llm:",
|
|
65
|
+
` provider: "${opts.llmConfig?.provider ?? DEFAULT_LLM_PROVIDER}"`,
|
|
66
|
+
` model: "${opts.llmConfig?.model ?? DEFAULT_LLM_MODEL}"`,
|
|
67
|
+
"embedder:",
|
|
68
|
+
` provider: "${opts.embedderConfig?.provider ?? DEFAULT_EMBEDDER_PROVIDER}"`,
|
|
69
|
+
` model: "${opts.embedderConfig?.model ?? DEFAULT_EMBEDDER_MODEL}"`,
|
|
70
|
+
"",
|
|
71
|
+
].join("\n");
|
|
72
|
+
if (opts.test) {
|
|
73
|
+
configYaml += "test: true\n";
|
|
74
|
+
}
|
|
75
|
+
if (opts.ontologyConfig) {
|
|
76
|
+
configYaml += serializeOntologyYaml(opts.ontologyConfig);
|
|
77
|
+
}
|
|
78
|
+
await writeFile(configPath, configYaml, "utf-8");
|
|
79
|
+
const env = {
|
|
80
|
+
...process.env,
|
|
81
|
+
...opts.env,
|
|
82
|
+
FALKORDB_DATA_DIR: join(opts.dataDir, "falkordb"),
|
|
83
|
+
CONFIG_PATH: configPath,
|
|
84
|
+
};
|
|
85
|
+
// Do NOT set FALKORDB_URI — its absence triggers embedded FalkorDBLite mode
|
|
86
|
+
delete env.FALKORDB_URI;
|
|
87
|
+
console.log("[gralkor] Starting Graphiti server on port", opts.port);
|
|
88
|
+
proc = spawn(venvPython, ["-m", "uvicorn", "main:app", "--host", "127.0.0.1", "--port", String(opts.port), "--no-access-log"], {
|
|
89
|
+
cwd: opts.serverDir,
|
|
90
|
+
env,
|
|
91
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
92
|
+
});
|
|
93
|
+
// Forward stdout/stderr
|
|
94
|
+
proc.stdout?.on("data", (data) => {
|
|
95
|
+
for (const line of data.toString().split("\n").filter(Boolean)) {
|
|
96
|
+
console.log("[gralkor] [server]", line);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
proc.stderr?.on("data", (data) => {
|
|
100
|
+
for (const line of data.toString().split("\n").filter(Boolean)) {
|
|
101
|
+
console.log("[gralkor] [server]", line);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
proc.on("exit", (code, signal) => {
|
|
105
|
+
console.log("[gralkor] Server process exited — code:", code, "signal:", signal);
|
|
106
|
+
proc = null;
|
|
107
|
+
});
|
|
108
|
+
// Wait for server to become healthy
|
|
109
|
+
await waitForHealth(opts.port);
|
|
110
|
+
console.log("[gralkor] boot: server healthy");
|
|
111
|
+
const bootDuration = ((Date.now() - bootStart) / 1000).toFixed(1);
|
|
112
|
+
console.log(`[gralkor] boot: ready (${bootDuration}s)`);
|
|
113
|
+
// Start health monitor
|
|
114
|
+
monitorTimer = setInterval(async () => {
|
|
115
|
+
try {
|
|
116
|
+
const res = await fetch(`http://127.0.0.1:${opts.port}/health`);
|
|
117
|
+
await res.text(); // Drain response body to prevent memory leak
|
|
118
|
+
if (!res.ok) {
|
|
119
|
+
console.warn("[gralkor] Server health check returned", res.status);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
console.warn("[gralkor] Server health check failed:", err instanceof Error ? err.message : err);
|
|
124
|
+
}
|
|
125
|
+
}, MONITOR_INTERVAL_MS);
|
|
126
|
+
}
|
|
127
|
+
async function stop() {
|
|
128
|
+
if (monitorTimer) {
|
|
129
|
+
clearInterval(monitorTimer);
|
|
130
|
+
monitorTimer = undefined;
|
|
131
|
+
}
|
|
132
|
+
if (!proc)
|
|
133
|
+
return;
|
|
134
|
+
const child = proc;
|
|
135
|
+
proc = null;
|
|
136
|
+
// Try graceful SIGTERM first
|
|
137
|
+
child.kill("SIGTERM");
|
|
138
|
+
await new Promise((resolve) => {
|
|
139
|
+
const forceKill = setTimeout(() => {
|
|
140
|
+
child.kill("SIGKILL");
|
|
141
|
+
resolve();
|
|
142
|
+
}, STOP_GRACE_MS);
|
|
143
|
+
child.on("exit", () => {
|
|
144
|
+
clearTimeout(forceKill);
|
|
145
|
+
resolve();
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
function isRunning() {
|
|
150
|
+
return proc !== null;
|
|
151
|
+
}
|
|
152
|
+
return { start, stop, isRunning };
|
|
153
|
+
}
|
|
154
|
+
function yamlQuote(s) {
|
|
155
|
+
if (/[:#{}[\]|>&*!%@`]/.test(s) || s !== s.trim()) {
|
|
156
|
+
return `"${s.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
157
|
+
}
|
|
158
|
+
return `"${s}"`;
|
|
159
|
+
}
|
|
160
|
+
function serializeAttrValue(attr, indent) {
|
|
161
|
+
if (typeof attr === "string") {
|
|
162
|
+
return ` ${yamlQuote(attr)}`;
|
|
163
|
+
}
|
|
164
|
+
if (Array.isArray(attr)) {
|
|
165
|
+
return "\n" + attr.map((v) => `${indent} - ${yamlQuote(v)}`).join("\n");
|
|
166
|
+
}
|
|
167
|
+
if ("enum" in attr) {
|
|
168
|
+
const lines = [
|
|
169
|
+
`\n${indent} enum:`,
|
|
170
|
+
...attr.enum.map((v) => `${indent} - ${yamlQuote(v)}`),
|
|
171
|
+
`${indent} description: ${yamlQuote(attr.description)}`,
|
|
172
|
+
];
|
|
173
|
+
return lines.join("\n");
|
|
174
|
+
}
|
|
175
|
+
// { type, description }
|
|
176
|
+
return [
|
|
177
|
+
"",
|
|
178
|
+
`${indent} type: ${yamlQuote(attr.type)}`,
|
|
179
|
+
`${indent} description: ${yamlQuote(attr.description)}`,
|
|
180
|
+
].join("\n");
|
|
181
|
+
}
|
|
182
|
+
function serializeTypeDefs(defs, indent) {
|
|
183
|
+
const lines = [];
|
|
184
|
+
for (const [name, def] of Object.entries(defs)) {
|
|
185
|
+
lines.push(`${indent}${name}:`);
|
|
186
|
+
lines.push(`${indent} description: ${yamlQuote(def.description)}`);
|
|
187
|
+
if (def.attributes && Object.keys(def.attributes).length > 0) {
|
|
188
|
+
lines.push(`${indent} attributes:`);
|
|
189
|
+
for (const [attr, val] of Object.entries(def.attributes)) {
|
|
190
|
+
lines.push(`${indent} ${attr}:${serializeAttrValue(val, `${indent} `)}`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return lines;
|
|
195
|
+
}
|
|
196
|
+
export function serializeOntologyYaml(ontology) {
|
|
197
|
+
const lines = ["ontology:"];
|
|
198
|
+
if (ontology.entities && Object.keys(ontology.entities).length > 0) {
|
|
199
|
+
lines.push(" entities:");
|
|
200
|
+
lines.push(...serializeTypeDefs(ontology.entities, " "));
|
|
201
|
+
}
|
|
202
|
+
if (ontology.edges && Object.keys(ontology.edges).length > 0) {
|
|
203
|
+
lines.push(" edges:");
|
|
204
|
+
lines.push(...serializeTypeDefs(ontology.edges, " "));
|
|
205
|
+
}
|
|
206
|
+
if (ontology.edgeMap && Object.keys(ontology.edgeMap).length > 0) {
|
|
207
|
+
lines.push(" edgeMap:");
|
|
208
|
+
for (const [key, values] of Object.entries(ontology.edgeMap)) {
|
|
209
|
+
lines.push(` ${yamlQuote(key)}:`);
|
|
210
|
+
for (const v of values) {
|
|
211
|
+
lines.push(` - ${yamlQuote(v)}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (ontology.excludedEntityTypes && ontology.excludedEntityTypes.length > 0) {
|
|
216
|
+
lines.push(" excludedEntityTypes:");
|
|
217
|
+
for (const name of ontology.excludedEntityTypes) {
|
|
218
|
+
lines.push(` - ${yamlQuote(name)}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return lines.join("\n") + "\n";
|
|
222
|
+
}
|
|
223
|
+
async function waitForHealth(port) {
|
|
224
|
+
const deadline = Date.now() + HEALTH_TIMEOUT_MS;
|
|
225
|
+
while (Date.now() < deadline) {
|
|
226
|
+
try {
|
|
227
|
+
const res = await fetch(`http://127.0.0.1:${port}/health`);
|
|
228
|
+
if (res.ok)
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
// not ready yet
|
|
233
|
+
}
|
|
234
|
+
await new Promise((r) => setTimeout(r, HEALTH_POLL_INTERVAL_MS));
|
|
235
|
+
}
|
|
236
|
+
throw new Error(`Graphiti server did not become healthy within ${HEALTH_TIMEOUT_MS / 1000}s`);
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=server-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-manager.js","sourceRoot":"","sources":["../src/server-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { GraphitiClient, Fact } from "./client.js";
|
|
2
|
+
import type { GralkorConfig, ReadyGate } from "./config.js";
|
|
3
|
+
export declare const INTERPRETATION_INSTRUCTION: string;
|
|
4
|
+
export declare function formatFact(f: Fact): string;
|
|
5
|
+
export declare function formatFacts(facts: Fact[]): string;
|
|
6
|
+
export interface StoreToolOpts {
|
|
7
|
+
getGroupId?: () => string;
|
|
8
|
+
serverReady?: ReadyGate;
|
|
9
|
+
}
|
|
10
|
+
export declare function createMemoryStoreTool(client: GraphitiClient, config: GralkorConfig, opts?: StoreToolOpts): {
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
parameters: {
|
|
14
|
+
type: "object";
|
|
15
|
+
properties: {
|
|
16
|
+
content: {
|
|
17
|
+
type: "string";
|
|
18
|
+
description: string;
|
|
19
|
+
};
|
|
20
|
+
source_description: {
|
|
21
|
+
type: "string";
|
|
22
|
+
description: string;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
required: readonly ["content"];
|
|
26
|
+
};
|
|
27
|
+
execute(_toolCallId: string, args: {
|
|
28
|
+
content: string;
|
|
29
|
+
source_description?: string;
|
|
30
|
+
}): Promise<string>;
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE5D,eAAO,MAAM,0BAA0B,QAEkC,CAAC;AAE1E,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAM1C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAIjD;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,SAAS,CAAC;CACzB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,aAAa,EACrB,IAAI,GAAE,aAAkB;;;;;;;;;;;;;;;;;yBAsBP,MAAM,QACb;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAAE,GACrD,OAAO,CAAC,MAAM,CAAC;EAwBrB"}
|
package/dist/tools.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export const INTERPRETATION_INSTRUCTION = "Before responding, interpret these facts for relevance to the task at hand. " +
|
|
2
|
+
"Doing this step thoughtfully improves response quality significantly.";
|
|
3
|
+
export function formatFact(f) {
|
|
4
|
+
const createdAt = f.created_at ? ` (created ${f.created_at})` : "";
|
|
5
|
+
const validAt = f.valid_at ? ` (valid from ${f.valid_at})` : "";
|
|
6
|
+
const invalidAt = f.invalid_at ? ` (invalid since ${f.invalid_at})` : "";
|
|
7
|
+
const expiredAt = f.expired_at ? ` (expired ${f.expired_at})` : "";
|
|
8
|
+
return `- ${f.fact}${createdAt}${validAt}${invalidAt}${expiredAt}`;
|
|
9
|
+
}
|
|
10
|
+
export function formatFacts(facts) {
|
|
11
|
+
if (facts.length === 0)
|
|
12
|
+
return "No graph facts found.";
|
|
13
|
+
const lines = facts.map(formatFact).join("\n");
|
|
14
|
+
return `Facts (knowledge graph):\n${lines}`;
|
|
15
|
+
}
|
|
16
|
+
export function createMemoryStoreTool(client, config, opts = {}) {
|
|
17
|
+
const { getGroupId, serverReady } = opts;
|
|
18
|
+
return {
|
|
19
|
+
name: "memory_add",
|
|
20
|
+
description: "Store a thought, insight, reflection, or decision in memory. Conversations are already captured automatically — use this for higher-level reasoning, conclusions, and connections you want to preserve, not for recording what was said.",
|
|
21
|
+
parameters: {
|
|
22
|
+
type: "object",
|
|
23
|
+
properties: {
|
|
24
|
+
content: {
|
|
25
|
+
type: "string",
|
|
26
|
+
description: "The information to store in memory",
|
|
27
|
+
},
|
|
28
|
+
source_description: {
|
|
29
|
+
type: "string",
|
|
30
|
+
description: "Optional description of where this information came from",
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
required: ["content"],
|
|
34
|
+
},
|
|
35
|
+
async execute(_toolCallId, args) {
|
|
36
|
+
if (serverReady && !serverReady.isReady()) {
|
|
37
|
+
throw new Error(`[gralkor] memory_add failed: server is not ready`);
|
|
38
|
+
}
|
|
39
|
+
const groupId = getGroupId?.() ?? "default";
|
|
40
|
+
console.log(`[gralkor] memory_add storing — groupId:${groupId} bodySize:${args.content.length}`);
|
|
41
|
+
if (config.test) {
|
|
42
|
+
console.log(`[gralkor] [test] episode body:\n${args.content}`);
|
|
43
|
+
}
|
|
44
|
+
await client.addEpisode({
|
|
45
|
+
name: `memory-store-${Date.now()}`,
|
|
46
|
+
episode_body: args.content,
|
|
47
|
+
source_description: args.source_description ?? "manual memory_store",
|
|
48
|
+
group_id: groupId,
|
|
49
|
+
source: "text",
|
|
50
|
+
});
|
|
51
|
+
console.log(`[gralkor] memory_add stored — groupId:${groupId}`);
|
|
52
|
+
return "Stored successfully. The knowledge graph will extract entities and relationships from this content.";
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,0BAA0B,GACrC,8EAA8E;IAC9E,uEAAuE,CAAC;AAE1E,MAAM,UAAU,UAAU,CAAC,CAAO;IAChC,MAAM,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,MAAM,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,MAAM,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,OAAO,KAAK,CAAC,CAAC,IAAI,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,uBAAuB,CAAC;IACvD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,6BAA6B,KAAK,EAAE,CAAC;AAC9C,CAAC;AAOD,MAAM,UAAU,qBAAqB,CACnC,MAAsB,EACtB,MAAqB,EACrB,OAAsB,EAAE;IAExB,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IACzC,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,0OAA0O;QAC5O,UAAU,EAAE;YACV,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,oCAAoC;iBAClD;gBACD,kBAAkB,EAAE;oBAClB,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,0DAA0D;iBACxE;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAU;SAC/B;QACD,KAAK,CAAC,OAAO,CACX,WAAmB,EACnB,IAAsD;YAEtD,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;YACtE,CAAC;YAED,MAAM,OAAO,GAAG,UAAU,EAAE,EAAE,IAAI,SAAS,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,0CAA0C,OAAO,aAAa,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAEjG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,mCAAmC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,MAAM,CAAC,UAAU,CAAC;gBACtB,IAAI,EAAE,gBAAgB,IAAI,CAAC,GAAG,EAAE,EAAE;gBAClC,YAAY,EAAE,IAAI,CAAC,OAAO;gBAC1B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,IAAI,qBAAqB;gBACpE,QAAQ,EAAE,OAAO;gBACjB,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,yCAAyC,OAAO,EAAE,CAAC,CAAC;YAChE,OAAO,qGAAqG,CAAC;QAC/G,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw plugin API surface used by Gralkor.
|
|
3
|
+
*
|
|
4
|
+
* OpenClaw doesn't export types, so we define the subset we use here.
|
|
5
|
+
* Keep in sync with the OpenClaw plugin contract documented in CLAUDE.md.
|
|
6
|
+
*/
|
|
7
|
+
type AnyFn = (...args: any[]) => any;
|
|
8
|
+
/**
|
|
9
|
+
* Minimal API surface used by shared registration code (hooks, health, CLI).
|
|
10
|
+
*/
|
|
11
|
+
export interface PluginApiBase {
|
|
12
|
+
/** Plugin-specific config from plugins.entries.<id>.config, validated against configSchema */
|
|
13
|
+
pluginConfig?: Record<string, unknown>;
|
|
14
|
+
on(event: string, handler: AnyFn): void;
|
|
15
|
+
registerService(service: {
|
|
16
|
+
id: string;
|
|
17
|
+
start: () => void | Promise<void>;
|
|
18
|
+
stop: () => void | Promise<void>;
|
|
19
|
+
}): void;
|
|
20
|
+
registerCli(registrar: (ctx: {
|
|
21
|
+
program: any;
|
|
22
|
+
config: any;
|
|
23
|
+
workspaceDir?: string;
|
|
24
|
+
logger: any;
|
|
25
|
+
}) => void | Promise<void>, opts?: {
|
|
26
|
+
commands?: string[];
|
|
27
|
+
}): void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Memory-mode API — adds tool registration.
|
|
31
|
+
*
|
|
32
|
+
* registerTool is overloaded: accepts both plain tool objects and factory functions.
|
|
33
|
+
*/
|
|
34
|
+
export interface MemoryPluginApi extends PluginApiBase {
|
|
35
|
+
registerTool(tool: {
|
|
36
|
+
name: string;
|
|
37
|
+
description: string;
|
|
38
|
+
parameters: unknown;
|
|
39
|
+
execute: AnyFn;
|
|
40
|
+
}, opts?: {
|
|
41
|
+
optional?: boolean;
|
|
42
|
+
}): void;
|
|
43
|
+
registerTool(factory: (ctx: any) => any | any[] | null, opts?: {
|
|
44
|
+
names?: string[];
|
|
45
|
+
}): void;
|
|
46
|
+
}
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,KAAK,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;AAErC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,8FAA8F;IAC9F,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG,IAAI,CAAC;IACxC,eAAe,CAAC,OAAO,EAAE;QACvB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAClC,GAAG,IAAI,CAAC;IACT,WAAW,CACT,SAAS,EAAE,CAAC,GAAG,EAAE;QAEf,OAAO,EAAE,GAAG,CAAC;QAEb,MAAM,EAAE,GAAG,CAAC;QACZ,YAAY,CAAC,EAAE,MAAM,CAAC;QAEtB,MAAM,EAAE,GAAG,CAAC;KACb,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC1B,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAC7B,IAAI,CAAC;CACT;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAgB,SAAQ,aAAa;IAEpD,YAAY,CACV,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,KAAK,CAAA;KAAE,EAChF,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAC5B,IAAI,CAAC;IAER,YAAY,CAEV,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,EACzC,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAC1B,IAAI,CAAC;CACT"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
services:
|
|
2
|
+
falkordb:
|
|
3
|
+
image: falkordb/falkordb:latest
|
|
4
|
+
restart: unless-stopped
|
|
5
|
+
ports:
|
|
6
|
+
- "6379:6379"
|
|
7
|
+
- "3000:3000"
|
|
8
|
+
volumes:
|
|
9
|
+
- ${FALKORDB_DATA_DIR:-falkordb_data}:/var/lib/falkordb/data
|
|
10
|
+
networks:
|
|
11
|
+
- gralkor
|
|
12
|
+
|
|
13
|
+
graphiti:
|
|
14
|
+
image: gralkor-server:latest
|
|
15
|
+
restart: unless-stopped
|
|
16
|
+
ports:
|
|
17
|
+
- "8001:8001"
|
|
18
|
+
env_file:
|
|
19
|
+
- .env
|
|
20
|
+
environment:
|
|
21
|
+
FALKORDB_URI: redis://falkordb:6379
|
|
22
|
+
volumes:
|
|
23
|
+
- ./config.yaml:/app/config.yaml:ro
|
|
24
|
+
depends_on:
|
|
25
|
+
- falkordb
|
|
26
|
+
networks:
|
|
27
|
+
- gralkor
|
|
28
|
+
|
|
29
|
+
networks:
|
|
30
|
+
gralkor:
|
|
31
|
+
name: gralkor
|
|
32
|
+
|
|
33
|
+
volumes:
|
|
34
|
+
falkordb_data:
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "gralkor",
|
|
3
|
+
"kind": "memory",
|
|
4
|
+
"name": "Gralkor Memory",
|
|
5
|
+
"description": "Persistent, temporally-aware memory via Graphiti knowledge graphs and FalkorDB",
|
|
6
|
+
"configSchema": {
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {
|
|
9
|
+
"autoCapture": {
|
|
10
|
+
"type": "object",
|
|
11
|
+
"properties": {
|
|
12
|
+
"enabled": {
|
|
13
|
+
"type": "boolean",
|
|
14
|
+
"default": true,
|
|
15
|
+
"description": "Automatically capture conversations into the graph"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"autoRecall": {
|
|
20
|
+
"type": "object",
|
|
21
|
+
"properties": {
|
|
22
|
+
"enabled": {
|
|
23
|
+
"type": "boolean",
|
|
24
|
+
"default": true,
|
|
25
|
+
"description": "Automatically recall relevant context before agent runs"
|
|
26
|
+
},
|
|
27
|
+
"maxResults": {
|
|
28
|
+
"type": "number",
|
|
29
|
+
"default": 10,
|
|
30
|
+
"description": "Maximum number of facts to inject as context"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"llm": {
|
|
35
|
+
"type": "object",
|
|
36
|
+
"properties": {
|
|
37
|
+
"provider": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"description": "LLM provider for knowledge extraction (openai, anthropic, gemini, groq)"
|
|
40
|
+
},
|
|
41
|
+
"model": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"description": "LLM model name (e.g. gpt-4.1-mini, gemini-2.0-flash)"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"embedder": {
|
|
48
|
+
"type": "object",
|
|
49
|
+
"properties": {
|
|
50
|
+
"provider": {
|
|
51
|
+
"type": "string",
|
|
52
|
+
"description": "Embedding provider (openai, gemini)"
|
|
53
|
+
},
|
|
54
|
+
"model": {
|
|
55
|
+
"type": "string",
|
|
56
|
+
"description": "Embedding model name (e.g. text-embedding-3-small)"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"test": {
|
|
61
|
+
"type": "boolean",
|
|
62
|
+
"default": false,
|
|
63
|
+
"description": "Enable test mode — logs full episode bodies and search results for debugging"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"tools": [
|
|
68
|
+
"memory_search",
|
|
69
|
+
"memory_get",
|
|
70
|
+
"memory_add"
|
|
71
|
+
],
|
|
72
|
+
"uiHints": {
|
|
73
|
+
"autoCapture.enabled": {
|
|
74
|
+
"label": "Auto-capture conversations"
|
|
75
|
+
},
|
|
76
|
+
"autoRecall.enabled": {
|
|
77
|
+
"label": "Auto-recall context"
|
|
78
|
+
},
|
|
79
|
+
"autoRecall.maxResults": {
|
|
80
|
+
"label": "Max auto-recall results"
|
|
81
|
+
},
|
|
82
|
+
"llm.provider": {
|
|
83
|
+
"label": "LLM provider"
|
|
84
|
+
},
|
|
85
|
+
"llm.model": {
|
|
86
|
+
"label": "LLM model"
|
|
87
|
+
},
|
|
88
|
+
"embedder.provider": {
|
|
89
|
+
"label": "Embedding provider"
|
|
90
|
+
},
|
|
91
|
+
"embedder.model": {
|
|
92
|
+
"label": "Embedding model"
|
|
93
|
+
},
|
|
94
|
+
"test": {
|
|
95
|
+
"label": "Test mode (verbose logging)"
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"version": "26.0.0"
|
|
99
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@susu-eng/gralkor",
|
|
3
|
+
"version": "26.0.0",
|
|
4
|
+
"description": "OpenClaw memory plugin powered by Graphiti knowledge graphs and FalkorDB",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"gralkor": "./dist/cli/bin.js"
|
|
9
|
+
},
|
|
10
|
+
"openclaw": {
|
|
11
|
+
"extensions": [
|
|
12
|
+
"./dist/index.js"
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"server/Dockerfile",
|
|
18
|
+
"server/main.py",
|
|
19
|
+
"server/pyproject.toml",
|
|
20
|
+
"server/uv.lock",
|
|
21
|
+
"server/requirements.txt",
|
|
22
|
+
"server/wheels",
|
|
23
|
+
"openclaw.plugin.json",
|
|
24
|
+
"docker-compose.yml",
|
|
25
|
+
"config.yaml",
|
|
26
|
+
".env.example"
|
|
27
|
+
],
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "https://github.com/susu-eng/gralkor.git"
|
|
31
|
+
},
|
|
32
|
+
"homepage": "https://github.com/susu-eng/gralkor#readme",
|
|
33
|
+
"bugs": {
|
|
34
|
+
"url": "https://github.com/susu-eng/gralkor/issues"
|
|
35
|
+
},
|
|
36
|
+
"author": "susu-eng",
|
|
37
|
+
"keywords": [
|
|
38
|
+
"openclaw",
|
|
39
|
+
"openclaw-plugin",
|
|
40
|
+
"graphiti",
|
|
41
|
+
"falkordb",
|
|
42
|
+
"knowledge-graph",
|
|
43
|
+
"memory",
|
|
44
|
+
"ai-agent"
|
|
45
|
+
],
|
|
46
|
+
"publishConfig": {
|
|
47
|
+
"access": "public"
|
|
48
|
+
},
|
|
49
|
+
"engines": {
|
|
50
|
+
"node": ">=18"
|
|
51
|
+
},
|
|
52
|
+
"peerDependencies": {
|
|
53
|
+
"openclaw": ">= 2026.1.26"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@types/node": "^25.0.0",
|
|
57
|
+
"typescript": "^5.7.0",
|
|
58
|
+
"vitest": "^3.0.0"
|
|
59
|
+
},
|
|
60
|
+
"license": "MIT",
|
|
61
|
+
"scripts": {
|
|
62
|
+
"build": "tsc",
|
|
63
|
+
"publish:npm": "bash scripts/publish.sh"
|
|
64
|
+
}
|
|
65
|
+
}
|