@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.
Files changed (83) hide show
  1. package/.env.example +32 -0
  2. package/README.md +429 -0
  3. package/config.yaml +16 -0
  4. package/dist/cli/bin.d.ts +3 -0
  5. package/dist/cli/bin.d.ts.map +1 -0
  6. package/dist/cli/bin.js +89 -0
  7. package/dist/cli/bin.js.map +1 -0
  8. package/dist/cli/commands/check.d.ts +2 -0
  9. package/dist/cli/commands/check.d.ts.map +1 -0
  10. package/dist/cli/commands/check.js +118 -0
  11. package/dist/cli/commands/check.js.map +1 -0
  12. package/dist/cli/commands/config.d.ts +3 -0
  13. package/dist/cli/commands/config.d.ts.map +1 -0
  14. package/dist/cli/commands/config.js +24 -0
  15. package/dist/cli/commands/config.js.map +1 -0
  16. package/dist/cli/commands/install.d.ts +8 -0
  17. package/dist/cli/commands/install.d.ts.map +1 -0
  18. package/dist/cli/commands/install.js +105 -0
  19. package/dist/cli/commands/install.js.map +1 -0
  20. package/dist/cli/commands/status.d.ts +2 -0
  21. package/dist/cli/commands/status.d.ts.map +1 -0
  22. package/dist/cli/commands/status.js +68 -0
  23. package/dist/cli/commands/status.js.map +1 -0
  24. package/dist/cli/lib/config.d.ts +7 -0
  25. package/dist/cli/lib/config.d.ts.map +1 -0
  26. package/dist/cli/lib/config.js +38 -0
  27. package/dist/cli/lib/config.js.map +1 -0
  28. package/dist/cli/lib/openclaw.d.ts +21 -0
  29. package/dist/cli/lib/openclaw.d.ts.map +1 -0
  30. package/dist/cli/lib/openclaw.js +93 -0
  31. package/dist/cli/lib/openclaw.js.map +1 -0
  32. package/dist/cli/lib/output.d.ts +9 -0
  33. package/dist/cli/lib/output.d.ts.map +1 -0
  34. package/dist/cli/lib/output.js +36 -0
  35. package/dist/cli/lib/output.js.map +1 -0
  36. package/dist/cli/lib/version.d.ts +9 -0
  37. package/dist/cli/lib/version.d.ts.map +1 -0
  38. package/dist/cli/lib/version.js +51 -0
  39. package/dist/cli/lib/version.js.map +1 -0
  40. package/dist/client.d.ts +72 -0
  41. package/dist/client.d.ts.map +1 -0
  42. package/dist/client.js +85 -0
  43. package/dist/client.js.map +1 -0
  44. package/dist/config.d.ts +69 -0
  45. package/dist/config.d.ts.map +1 -0
  46. package/dist/config.js +163 -0
  47. package/dist/config.js.map +1 -0
  48. package/dist/hooks.d.ts +131 -0
  49. package/dist/hooks.d.ts.map +1 -0
  50. package/dist/hooks.js +458 -0
  51. package/dist/hooks.js.map +1 -0
  52. package/dist/index.d.ts +88 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +184 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/native-memory.d.ts +67 -0
  57. package/dist/native-memory.d.ts.map +1 -0
  58. package/dist/native-memory.js +79 -0
  59. package/dist/native-memory.js.map +1 -0
  60. package/dist/register.d.ts +10 -0
  61. package/dist/register.d.ts.map +1 -0
  62. package/dist/register.js +150 -0
  63. package/dist/register.js.map +1 -0
  64. package/dist/server-manager.d.ts +19 -0
  65. package/dist/server-manager.d.ts.map +1 -0
  66. package/dist/server-manager.js +238 -0
  67. package/dist/server-manager.js.map +1 -0
  68. package/dist/tools.d.ts +32 -0
  69. package/dist/tools.d.ts.map +1 -0
  70. package/dist/tools.js +56 -0
  71. package/dist/tools.js.map +1 -0
  72. package/dist/types.d.ts +48 -0
  73. package/dist/types.d.ts.map +1 -0
  74. package/dist/types.js +8 -0
  75. package/dist/types.js.map +1 -0
  76. package/docker-compose.yml +34 -0
  77. package/openclaw.plugin.json +99 -0
  78. package/package.json +65 -0
  79. package/server/Dockerfile +7 -0
  80. package/server/main.py +763 -0
  81. package/server/pyproject.toml +19 -0
  82. package/server/requirements.txt +5 -0
  83. package/server/uv.lock +1162 -0
package/dist/index.js ADDED
@@ -0,0 +1,184 @@
1
+ import { fileURLToPath } from "node:url";
2
+ import { dirname, join } from "node:path";
3
+ import { GraphitiClient } from "./client.js";
4
+ import { resolveConfig, validateOntologyConfig, GRAPHITI_URL, resolveProviders, createReadyGate, defaultConfig } from "./config.js";
5
+ import { createMemoryStoreTool, formatFacts, INTERPRETATION_INSTRUCTION, } from "./tools.js";
6
+ import { registerHooks, registerServerService, registerCli, } from "./register.js";
7
+ import { countNativeResults } from "./hooks.js";
8
+ import { searchNativeMemory, readNativeMemoryFile } from "./native-memory.js";
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = dirname(__filename);
11
+ const pluginDir = join(__dirname, ".."); // dist/ → plugin root
12
+ // OpenClaw calls register() 4+ times per event; only log config once
13
+ let configLogged = false;
14
+ // Guard against duplicate SIGTERM handlers across multiple register() calls
15
+ let sigTermHandlerInstalled = false;
16
+ function registerFullPlugin(api, client, config, dir) {
17
+ const serverReady = createReadyGate();
18
+ // Shared group ID: hooks capture agentId, tools read it
19
+ let currentGroupId = "default";
20
+ const getGroupId = () => currentGroupId;
21
+ const setGroupId = (id) => { currentGroupId = id; };
22
+ // Shared native search function: factory sets it at agent start, hook reads it
23
+ let nativeSearchFn = null;
24
+ const getNativeSearch = () => nativeSearchFn;
25
+ // Native memory tools via OpenClaw memory SDK (getMemorySearchManager)
26
+ // The factory provides ctx.config and ctx.sessionKey at agent start
27
+ api.registerTool(
28
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
+ (ctx) => {
30
+ // Capture native search function for the auto-recall hook
31
+ nativeSearchFn = async (query) => {
32
+ return (await searchNativeMemory(ctx.config, getGroupId(), query, { sessionKey: ctx.sessionKey })) ?? "";
33
+ };
34
+ // memory_search: combines native Markdown + graph facts
35
+ const memorySearchTool = {
36
+ name: "memory_search",
37
+ description: "Search memory for relevant context. Use specific, focused queries.",
38
+ parameters: {
39
+ type: "object",
40
+ properties: {
41
+ query: { type: "string" },
42
+ limit: { type: "number" },
43
+ },
44
+ required: ["query"],
45
+ },
46
+ async execute(toolCallId, args) {
47
+ const groupId = getGroupId();
48
+ const limit = args.limit ?? 10;
49
+ if (!serverReady.isReady()) {
50
+ throw new Error("[gralkor] memory_search failed: server is not ready");
51
+ }
52
+ const [nativeResult, searchResults] = await Promise.all([
53
+ searchNativeMemory(ctx.config, groupId, args.query, {
54
+ maxResults: limit,
55
+ sessionKey: ctx.sessionKey,
56
+ }),
57
+ client.search(args.query, [groupId], limit),
58
+ ]);
59
+ const factCount = searchResults.facts.length;
60
+ const nativeCount = countNativeResults(nativeResult);
61
+ console.log(`[gralkor] memory_search result — graph: ${factCount} facts, native: ${nativeCount} results — groupId:${groupId}`);
62
+ const sections = [];
63
+ if (nativeCount > 0) {
64
+ sections.push(nativeResult);
65
+ }
66
+ if (searchResults.facts.length > 0) {
67
+ sections.push(formatFacts(searchResults.facts));
68
+ }
69
+ if (sections.length === 0) {
70
+ return "No memories found.";
71
+ }
72
+ sections.push(INTERPRETATION_INSTRUCTION);
73
+ const combinedResult = sections.join("\n\n");
74
+ if (config.test) {
75
+ console.log(`[gralkor] [test] memory_search query: ${args.query}`);
76
+ console.log(`[gralkor] [test] memory_search result:\n${combinedResult}`);
77
+ }
78
+ return combinedResult;
79
+ },
80
+ };
81
+ // memory_get: reads native Markdown memory files via SDK
82
+ const memoryGetTool = {
83
+ name: "memory_get",
84
+ description: "Read a memory file by path with optional line range. Use after memory_search to pull specific sections.",
85
+ parameters: {
86
+ type: "object",
87
+ properties: {
88
+ path: { type: "string" },
89
+ from: { type: "number" },
90
+ lines: { type: "number" },
91
+ },
92
+ required: ["path"],
93
+ },
94
+ async execute(_toolCallId, args) {
95
+ return readNativeMemoryFile(ctx.config, getGroupId(), args.path, {
96
+ from: args.from,
97
+ lines: args.lines,
98
+ });
99
+ },
100
+ };
101
+ return [memorySearchTool, memoryGetTool];
102
+ }, { names: ["memory_search", "memory_get"] });
103
+ const storeTool = createMemoryStoreTool(client, config, {
104
+ getGroupId,
105
+ serverReady,
106
+ });
107
+ api.registerTool(storeTool);
108
+ const debouncer = registerHooks(api, client, config, { setGroupId, getNativeSearch, serverReady });
109
+ // Flush pending session buffers on SIGTERM to prevent data loss on shutdown
110
+ if (!sigTermHandlerInstalled) {
111
+ sigTermHandlerInstalled = true;
112
+ process.on("SIGTERM", () => {
113
+ if (debouncer.pendingCount > 0) {
114
+ console.log(`[gralkor] SIGTERM received, flushing ${debouncer.pendingCount} pending session buffer(s)...`);
115
+ debouncer.flushAll().catch((err) => {
116
+ console.error("[gralkor] SIGTERM flush failed:", err instanceof Error ? err.message : err);
117
+ });
118
+ }
119
+ });
120
+ }
121
+ const resolvedDataDir = config.dataDir ?? join(dir, "..", ".gralkor-data");
122
+ const manager = registerServerService(api, config, dir, serverReady);
123
+ // CLI — gralkor commands
124
+ registerCli(api, client, config, manager, resolvedDataDir);
125
+ }
126
+ export const id = "gralkor";
127
+ export const name = "Gralkor Memory";
128
+ export const description = "Persistent, temporally-aware memory via Graphiti knowledge graphs and FalkorDB";
129
+ export const kind = "memory";
130
+ export const tools = ["memory_search", "memory_get", "memory_add"];
131
+ export const configSchema = {
132
+ type: "object",
133
+ properties: {
134
+ autoCapture: {
135
+ type: "object",
136
+ properties: {
137
+ enabled: { type: "boolean", default: defaultConfig.autoCapture.enabled },
138
+ },
139
+ },
140
+ autoRecall: {
141
+ type: "object",
142
+ properties: {
143
+ enabled: { type: "boolean", default: defaultConfig.autoRecall.enabled },
144
+ maxResults: { type: "number", default: defaultConfig.autoRecall.maxResults },
145
+ },
146
+ },
147
+ dataDir: {
148
+ type: "string",
149
+ description: "Directory for backend data (venv, database). Defaults to .gralkor-data alongside the plugin directory.",
150
+ },
151
+ test: {
152
+ type: "boolean",
153
+ default: false,
154
+ description: "Enable test mode — logs full episode bodies and search results for debugging.",
155
+ },
156
+ },
157
+ };
158
+ export function register(api) {
159
+ const config = resolveConfig((api.pluginConfig ?? {}));
160
+ validateOntologyConfig(config.ontology);
161
+ if (!configLogged) {
162
+ configLogged = true;
163
+ if (config.test) {
164
+ console.log(`[gralkor] raw pluginConfig: ${JSON.stringify(api.pluginConfig)}`);
165
+ }
166
+ const { llmProvider, llmModel, embedderProvider, embedderModel } = resolveProviders(config);
167
+ const ontologySummary = config.ontology
168
+ ? `${Object.keys(config.ontology.entities ?? {}).length} entities, ${Object.keys(config.ontology.edges ?? {}).length} edges`
169
+ : "none";
170
+ console.log(`[gralkor] config:` +
171
+ ` llm=${llmProvider}/${llmModel}` +
172
+ ` embedder=${embedderProvider}/${embedderModel}` +
173
+ ` ontology=${ontologySummary}` +
174
+ ` autoCapture=${config.autoCapture.enabled}` +
175
+ ` autoRecall=${config.autoRecall.enabled} maxResults=${config.autoRecall.maxResults}` +
176
+ ` idleTimeout=${config.idleTimeoutMs}ms` +
177
+ ` test=${config.test}` +
178
+ ` dataDir=${config.dataDir ?? 'default'}`);
179
+ }
180
+ const client = new GraphitiClient({ baseUrl: GRAPHITI_URL });
181
+ registerFullPlugin(api, client, config, pluginDir);
182
+ }
183
+ export default { id, name, description, kind, configSchema, register };
184
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Native memory delegation — searches OpenClaw's built-in Markdown memory
3
+ * via the memory SDK. Lazy-loads SDK modules at runtime (not available at build time).
4
+ */
5
+ export type MemorySDK = {
6
+ getMemorySearchManager: (params: {
7
+ cfg: unknown;
8
+ agentId: string;
9
+ purpose?: "default" | "status";
10
+ }) => Promise<{
11
+ manager: MemorySearchManager | null;
12
+ error?: string;
13
+ }>;
14
+ readAgentMemoryFile: (params: {
15
+ cfg: unknown;
16
+ agentId: string;
17
+ relPath: string;
18
+ from?: number;
19
+ lines?: number;
20
+ }) => Promise<{
21
+ text: string;
22
+ path: string;
23
+ }>;
24
+ };
25
+ export interface MemorySearchManager {
26
+ search(query: string, opts?: {
27
+ maxResults?: number;
28
+ minScore?: number;
29
+ sessionKey?: string;
30
+ }): Promise<Array<{
31
+ path: string;
32
+ startLine: number;
33
+ endLine: number;
34
+ score: number;
35
+ snippet: string;
36
+ source: string;
37
+ }>>;
38
+ readFile(params: {
39
+ relPath: string;
40
+ from?: number;
41
+ lines?: number;
42
+ }): Promise<{
43
+ text: string;
44
+ path: string;
45
+ }>;
46
+ }
47
+ /** Replace the SDK loader (for testing). */
48
+ export declare function setSDKLoader(loader: () => Promise<MemorySDK>): void;
49
+ /** Reset to the default SDK loader (for testing). */
50
+ export declare function resetSDKLoader(): void;
51
+ /**
52
+ * Search native Markdown memory via the OpenClaw memory SDK.
53
+ * Returns JSON string matching memory-core's output format ({ results: [...] })
54
+ * so countNativeResults() can parse it.
55
+ */
56
+ export declare function searchNativeMemory(cfg: any, agentId: string, query: string, opts?: {
57
+ maxResults?: number;
58
+ sessionKey?: string;
59
+ }): Promise<string | null>;
60
+ /**
61
+ * Read a native memory file via the OpenClaw memory SDK.
62
+ */
63
+ export declare function readNativeMemoryFile(cfg: any, agentId: string, relPath: string, opts?: {
64
+ from?: number;
65
+ lines?: number;
66
+ }): Promise<string>;
67
+ //# sourceMappingURL=native-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-memory.d.ts","sourceRoot":"","sources":["../src/native-memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,SAAS,GAAG;IACtB,sBAAsB,EAAE,CAAC,MAAM,EAAE;QAC/B,GAAG,EAAE,OAAO,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;KAChC,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,mBAAmB,EAAE,CAAC,MAAM,EAAE;QAC5B,GAAG,EAAE,OAAO,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,MAAM,CACJ,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GACrE,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACxH,QAAQ,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/G;AAoBD,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAGnE;AAED,qDAAqD;AACrD,wBAAgB,cAAc,IAAI,IAAI,CAGrC;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAEtC,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAClD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBxB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAExC,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACvC,OAAO,CAAC,MAAM,CAAC,CAejB"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Native memory delegation — searches OpenClaw's built-in Markdown memory
3
+ * via the memory SDK. Lazy-loads SDK modules at runtime (not available at build time).
4
+ */
5
+ let memorySDKPromise = null;
6
+ function defaultLoadMemorySDK() {
7
+ // Dynamic import paths constructed to prevent TypeScript from resolving them
8
+ // at build time — these modules are provided by the OpenClaw host at runtime.
9
+ const sdkBase = "openclaw/plugin-sdk";
10
+ memorySDKPromise ??= Promise.all([
11
+ import(/* @vite-ignore */ `${sdkBase}/memory-core`),
12
+ import(/* @vite-ignore */ `${sdkBase}/memory-core-host-runtime-files`),
13
+ ]).then(([core, files]) => ({
14
+ getMemorySearchManager: core.getMemorySearchManager,
15
+ readAgentMemoryFile: files.readAgentMemoryFile,
16
+ }));
17
+ return memorySDKPromise;
18
+ }
19
+ let sdkLoader = defaultLoadMemorySDK;
20
+ /** Replace the SDK loader (for testing). */
21
+ export function setSDKLoader(loader) {
22
+ sdkLoader = loader;
23
+ memorySDKPromise = null;
24
+ }
25
+ /** Reset to the default SDK loader (for testing). */
26
+ export function resetSDKLoader() {
27
+ sdkLoader = defaultLoadMemorySDK;
28
+ memorySDKPromise = null;
29
+ }
30
+ /**
31
+ * Search native Markdown memory via the OpenClaw memory SDK.
32
+ * Returns JSON string matching memory-core's output format ({ results: [...] })
33
+ * so countNativeResults() can parse it.
34
+ */
35
+ export async function searchNativeMemory(
36
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
37
+ cfg, agentId, query, opts) {
38
+ try {
39
+ const { getMemorySearchManager } = await sdkLoader();
40
+ const { manager, error } = await getMemorySearchManager({ cfg, agentId });
41
+ if (!manager) {
42
+ if (error)
43
+ console.log(`[gralkor] native memory unavailable: ${error}`);
44
+ return null;
45
+ }
46
+ const results = await manager.search(query, {
47
+ maxResults: opts?.maxResults,
48
+ sessionKey: opts?.sessionKey,
49
+ });
50
+ return JSON.stringify({ results });
51
+ }
52
+ catch (err) {
53
+ console.log(`[gralkor] native memory search failed: ${err instanceof Error ? err.message : err}`);
54
+ return null;
55
+ }
56
+ }
57
+ /**
58
+ * Read a native memory file via the OpenClaw memory SDK.
59
+ */
60
+ export async function readNativeMemoryFile(
61
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
62
+ cfg, agentId, relPath, opts) {
63
+ try {
64
+ const { readAgentMemoryFile } = await sdkLoader();
65
+ const result = await readAgentMemoryFile({
66
+ cfg,
67
+ agentId,
68
+ relPath,
69
+ from: opts?.from,
70
+ lines: opts?.lines,
71
+ });
72
+ return JSON.stringify(result);
73
+ }
74
+ catch (err) {
75
+ const message = err instanceof Error ? err.message : String(err);
76
+ return JSON.stringify({ path: relPath, text: "", error: message });
77
+ }
78
+ }
79
+ //# sourceMappingURL=native-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-memory.js","sourceRoot":"","sources":["../src/native-memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { GraphitiClient } from "./client.js";
2
+ import type { GralkorConfig, ReadyGate } from "./config.js";
3
+ import { DebouncedFlush, type RecallOpts, type SessionBuffer } from "./hooks.js";
4
+ import { type ServerManager } from "./server-manager.js";
5
+ import type { PluginApiBase } from "./types.js";
6
+ export type { ServerManager } from "./server-manager.js";
7
+ export declare function registerHooks(api: PluginApiBase, client: GraphitiClient, config: GralkorConfig, opts?: RecallOpts): DebouncedFlush<SessionBuffer>;
8
+ export declare function registerServerService(api: PluginApiBase, config: GralkorConfig, pluginDir: string, serverReady?: ReadyGate): ServerManager;
9
+ export declare function registerCli(api: PluginApiBase, client: GraphitiClient, config: GralkorConfig, manager?: ServerManager, dataDir?: string): void;
10
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,EAIL,cAAc,EAEd,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,wBAAgB,aAAa,CAC3B,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,aAAa,EACrB,IAAI,GAAE,UAAe,GACpB,cAAc,CAAC,aAAa,CAAC,CAU/B;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,SAAS,GACtB,aAAa,CAgCf;AAED,wBAAgB,WAAW,CACzB,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,MAAM,QA2HjB"}
@@ -0,0 +1,150 @@
1
+ import { join } from "node:path";
2
+ import { GRAPHITI_URL, GRAPHITI_PORT, validateConfig, resolveProviders } from "./config.js";
3
+ import { createBeforePromptBuildHandler, createAgentEndHandler, createSessionEndHandler, DebouncedFlush, flushSessionBuffer, } from "./hooks.js";
4
+ import { createServerManager } from "./server-manager.js";
5
+ export function registerHooks(api, client, config, opts = {}) {
6
+ const debouncer = new DebouncedFlush(config.idleTimeoutMs, (key, buf) => flushSessionBuffer(key, buf, client, { test: config.test }));
7
+ api.on("before_prompt_build", createBeforePromptBuildHandler(client, config, opts));
8
+ api.on("agent_end", createAgentEndHandler(config, debouncer));
9
+ api.on("session_end", createSessionEndHandler(debouncer));
10
+ return debouncer;
11
+ }
12
+ export function registerServerService(api, config, pluginDir, serverReady) {
13
+ const dataDir = config.dataDir ?? join(pluginDir, "..", ".gralkor-data");
14
+ const serverDir = join(pluginDir, "server");
15
+ const env = {};
16
+ for (const key of ["OPENAI_API_KEY", "ANTHROPIC_API_KEY", "GOOGLE_API_KEY", "GROQ_API_KEY"]) {
17
+ if (process.env[key])
18
+ env[key] = process.env[key];
19
+ }
20
+ const manager = createServerManager({
21
+ dataDir,
22
+ serverDir,
23
+ port: GRAPHITI_PORT,
24
+ env,
25
+ llmConfig: config.llm,
26
+ embedderConfig: config.embedder,
27
+ ontologyConfig: config.ontology,
28
+ test: config.test,
29
+ });
30
+ api.registerService({
31
+ id: "gralkor-server",
32
+ async start() {
33
+ await manager.start();
34
+ serverReady?.resolve();
35
+ },
36
+ async stop() {
37
+ await manager.stop();
38
+ },
39
+ });
40
+ return manager;
41
+ }
42
+ export function registerCli(api, client, config, manager, dataDir) {
43
+ api.registerCli(({ program }) => {
44
+ const gralkor = program
45
+ .command("gralkor")
46
+ .description("Manage the Gralkor memory backend");
47
+ gralkor
48
+ .command("status")
49
+ .description("Check Graphiti and FalkorDB connection status")
50
+ .action(async () => {
51
+ // Process state
52
+ if (manager) {
53
+ console.log(`Server process: ${manager.isRunning() ? "running" : "stopped"}`);
54
+ }
55
+ // Config summary
56
+ const { llmProvider, llmModel, embedderProvider, embedderModel } = resolveProviders(config);
57
+ console.log(`LLM: ${llmProvider}/${llmModel}`);
58
+ console.log(`Embedder: ${embedderProvider}/${embedderModel}`);
59
+ console.log(`Auto-capture: ${config.autoCapture.enabled ? "enabled" : "disabled"}`);
60
+ console.log(`Auto-recall: ${config.autoRecall.enabled ? "enabled" : "disabled"} (max ${config.autoRecall.maxResults} results)`);
61
+ // Data directory
62
+ if (dataDir) {
63
+ console.log(`Data directory: ${dataDir}`);
64
+ }
65
+ // Server health + graph stats
66
+ try {
67
+ const result = await client.health();
68
+ console.log(`Graphiti: ${result.status ?? "reachable"} at ${GRAPHITI_URL}`);
69
+ if (result.graph) {
70
+ if (result.graph.connected) {
71
+ console.log(`FalkorDB: connected (${result.graph.node_count ?? 0} nodes, ${result.graph.edge_count ?? 0} edges)`);
72
+ }
73
+ else {
74
+ console.log(`FalkorDB: disconnected — ${result.graph.error ?? "unknown error"}`);
75
+ }
76
+ }
77
+ }
78
+ catch (err) {
79
+ console.error(`Graphiti: unreachable at ${GRAPHITI_URL} — ${err instanceof Error ? err.message : err}`);
80
+ }
81
+ // Venv state
82
+ if (dataDir) {
83
+ const venvPython = join(dataDir, "venv", "bin", "python");
84
+ try {
85
+ const { execFile } = await import("node:child_process");
86
+ const { promisify } = await import("node:util");
87
+ const execFileAsync = promisify(execFile);
88
+ await execFileAsync(venvPython, ["--version"]);
89
+ console.log(`Python venv: ready`);
90
+ }
91
+ catch {
92
+ console.log(`Python venv: not found`);
93
+ }
94
+ }
95
+ });
96
+ gralkor
97
+ .command("check")
98
+ .description("Validate Gralkor configuration and environment")
99
+ .action(async () => {
100
+ const result = await validateConfig(config);
101
+ for (const check of result.checks) {
102
+ const icon = check.status === "pass" ? "OK" : check.status === "warn" ? "WARN" : "FAIL";
103
+ console.log(` [${icon}] ${check.label}: ${check.message}`);
104
+ }
105
+ if (!result.ok) {
106
+ console.error("\nConfiguration has errors. Fix the issues above before starting.");
107
+ process.exitCode = 1;
108
+ }
109
+ else {
110
+ console.log("\nConfiguration looks good.");
111
+ }
112
+ });
113
+ gralkor
114
+ .command("search <group_id> <query...>")
115
+ .description("Search the knowledge graph")
116
+ .action(async (groupId, query) => {
117
+ const q = query.join(" ");
118
+ try {
119
+ console.log(`Searching group "${groupId}" for: ${q}`);
120
+ const results = await client.search(q, [groupId], 10);
121
+ console.log(`Found ${results.facts.length} facts in group "${groupId}".`);
122
+ if (results.facts.length === 0) {
123
+ console.log("No results found.");
124
+ return;
125
+ }
126
+ console.log("Facts:\n" +
127
+ results.facts.map((f) => {
128
+ const validity = f.invalid_at ? ` (invalid since ${f.invalid_at})` : "";
129
+ return ` - ${f.fact}${validity}`;
130
+ }).join("\n"));
131
+ }
132
+ catch (err) {
133
+ console.error(`Search failed: ${err instanceof Error ? err.message : err}`);
134
+ }
135
+ });
136
+ gralkor
137
+ .command("clear <group_id>")
138
+ .description("Clear the knowledge graph for a group")
139
+ .action(async (groupId) => {
140
+ try {
141
+ await client.clearGraph(groupId);
142
+ console.log(`Cleared graph for group "${groupId}".`);
143
+ }
144
+ catch (err) {
145
+ console.error(`Clear failed: ${err instanceof Error ? err.message : err}`);
146
+ }
147
+ });
148
+ }, { commands: ["gralkor"] });
149
+ }
150
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type ModelConfig, type OntologyConfig } from "./config.js";
2
+ export interface ServerManagerOptions {
3
+ dataDir: string;
4
+ serverDir: string;
5
+ port: number;
6
+ env?: Record<string, string>;
7
+ llmConfig?: ModelConfig;
8
+ embedderConfig?: ModelConfig;
9
+ ontologyConfig?: OntologyConfig;
10
+ test?: boolean;
11
+ }
12
+ export interface ServerManager {
13
+ start(): Promise<void>;
14
+ stop(): Promise<void>;
15
+ isRunning(): boolean;
16
+ }
17
+ export declare function createServerManager(opts: ServerManagerOptions): ServerManager;
18
+ export declare function serializeOntologyYaml(ontology: OntologyConfig): string;
19
+ //# sourceMappingURL=server-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-manager.d.ts","sourceRoot":"","sources":["../src/server-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAA8F,KAAK,WAAW,EAAE,KAAK,cAAc,EAA+B,MAAM,aAAa,CAAC;AAS7L,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,SAAS,IAAI,OAAO,CAAC;CACtB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,GAAG,aAAa,CAkL7E;AAkDD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CA+BtE"}