@openclaw-cloud/agent-controller 1.0.0-beta.4 → 1.0.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.d.ts +4 -0
- package/dist/api.js +8 -0
- package/dist/api.js.map +1 -1
- package/dist/commands/bootstrap.js +2 -2
- package/dist/commands/bootstrap.js.map +1 -1
- package/dist/commands/heartbeat-cli.js +5 -4
- package/dist/commands/heartbeat-cli.js.map +1 -1
- package/dist/commands/install.js +8 -8
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/self-update.js +2 -1
- package/dist/commands/self-update.js.map +1 -1
- package/dist/config-file.js +2 -3
- package/dist/config-file.js.map +1 -1
- package/dist/config.d.ts +29 -0
- package/dist/config.js +81 -0
- package/dist/config.js.map +1 -0
- package/dist/connection.d.ts +2 -0
- package/dist/connection.js +2 -0
- package/dist/connection.js.map +1 -1
- package/dist/debug.js +2 -1
- package/dist/debug.js.map +1 -1
- package/dist/handlers/memory.d.ts +7 -0
- package/dist/handlers/memory.js +41 -0
- package/dist/handlers/memory.js.map +1 -0
- package/dist/handlers/pair.js +2 -1
- package/dist/handlers/pair.js.map +1 -1
- package/dist/heartbeat.d.ts +7 -0
- package/dist/heartbeat.js +15 -67
- package/dist/heartbeat.js.map +1 -1
- package/dist/index.js +66 -14
- package/dist/index.js.map +1 -1
- package/dist/memory-mcp-server.d.ts +8 -0
- package/dist/memory-mcp-server.js +272 -0
- package/dist/memory-mcp-server.js.map +1 -0
- package/dist/providers/openclaw/device-identity.js +2 -2
- package/dist/providers/openclaw/device-identity.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/utils/apply-config.js +3 -3
- package/dist/utils/apply-config.js.map +1 -1
- package/dist/utils/env.js +2 -1
- package/dist/utils/env.js.map +1 -1
- package/dist/utils/knowledge-graph.d.ts +63 -0
- package/dist/utils/knowledge-graph.js +157 -0
- package/dist/utils/knowledge-graph.js.map +1 -0
- package/dist/utils/release-channel.js +2 -4
- package/dist/utils/release-channel.js.map +1 -1
- package/dist/workspace.js +4 -5
- package/dist/workspace.js.map +1 -1
- package/package.json +1 -1
package/dist/heartbeat.js
CHANGED
|
@@ -2,6 +2,7 @@ import os from 'node:os';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import fs from 'node:fs/promises';
|
|
4
4
|
import { debugLog } from './debug.js';
|
|
5
|
+
import { config } from './config.js';
|
|
5
6
|
import { getProvider } from './providers/index.js';
|
|
6
7
|
import { isLockFilePresent } from './lockfile.js';
|
|
7
8
|
const HEARTBEAT_INTERVAL = 30_000;
|
|
@@ -17,76 +18,23 @@ async function checkGateway() {
|
|
|
17
18
|
return { running: false, rpcOk: false };
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (entry.type !== 'message')
|
|
28
|
-
return null;
|
|
29
|
-
const msg = entry.message;
|
|
30
|
-
if (!msg || msg.role !== 'user')
|
|
31
|
-
return null;
|
|
32
|
-
if (typeof msg.content === 'string')
|
|
33
|
-
return msg.content;
|
|
34
|
-
if (Array.isArray(msg.content)) {
|
|
35
|
-
return msg.content
|
|
36
|
-
.filter((c) => c.type === 'text')
|
|
37
|
-
.map((c) => c.text ?? '')
|
|
38
|
-
.join(' ');
|
|
39
|
-
}
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
21
|
+
/**
|
|
22
|
+
* Read sessions.json index to find the latest session activity timestamp.
|
|
23
|
+
* sessions.json is maintained by OpenClaw gateway and contains an `updatedAt`
|
|
24
|
+
* (ms epoch) field per session, updated on each real session turn (user message
|
|
25
|
+
* → agent reply). This works for all channels (Telegram, Slack, Discord, etc.)
|
|
26
|
+
* regardless of how messages are delivered (webhook, Socket Mode, etc.).
|
|
27
|
+
*/
|
|
42
28
|
export async function getLastMessageAt() {
|
|
43
|
-
const stateDir =
|
|
44
|
-
const
|
|
29
|
+
const stateDir = config.stateDir;
|
|
30
|
+
const sessionsJsonPath = path.join(stateDir, 'agents', 'main', 'sessions', 'sessions.json');
|
|
45
31
|
try {
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
if (jsonlFiles.length === 0)
|
|
49
|
-
return null;
|
|
50
|
-
const now = Date.now();
|
|
51
|
-
const TWO_HOURS = 2 * 60 * 60 * 1000;
|
|
32
|
+
const raw = await fs.readFile(sessionsJsonPath, 'utf-8');
|
|
33
|
+
const store = JSON.parse(raw);
|
|
52
34
|
let latestTs = 0;
|
|
53
|
-
for (const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
// Skip files not modified in the last 2 hours
|
|
57
|
-
if (now - stat.mtimeMs > TWO_HOURS)
|
|
58
|
-
continue;
|
|
59
|
-
// Read last 64KB of the file
|
|
60
|
-
const readSize = Math.min(stat.size, TAIL_READ_SIZE);
|
|
61
|
-
const fh = await fs.open(filePath, 'r');
|
|
62
|
-
const buf = Buffer.alloc(readSize);
|
|
63
|
-
await fh.read(buf, 0, readSize, Math.max(0, stat.size - readSize));
|
|
64
|
-
await fh.close();
|
|
65
|
-
// Take last N lines, search backwards for a real user message
|
|
66
|
-
const lines = buf
|
|
67
|
-
.toString('utf-8')
|
|
68
|
-
.split('\n')
|
|
69
|
-
.filter((l) => l.trim());
|
|
70
|
-
const tail = lines.slice(-TAIL_LINES);
|
|
71
|
-
for (let i = tail.length - 1; i >= 0; i--) {
|
|
72
|
-
try {
|
|
73
|
-
const entry = JSON.parse(tail[i]);
|
|
74
|
-
const text = extractUserText(entry);
|
|
75
|
-
if (text === null)
|
|
76
|
-
continue;
|
|
77
|
-
if (isHeartbeatMessage(text))
|
|
78
|
-
continue;
|
|
79
|
-
// Found a real user message — extract timestamp
|
|
80
|
-
const msg = entry.message;
|
|
81
|
-
const ts = (msg?.timestamp ?? entry.timestamp);
|
|
82
|
-
const tsNum = typeof ts === 'number' ? ts : new Date(ts).getTime();
|
|
83
|
-
if (tsNum > latestTs)
|
|
84
|
-
latestTs = tsNum;
|
|
85
|
-
break; // Only need the latest per file
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
35
|
+
for (const entry of Object.values(store)) {
|
|
36
|
+
if (typeof entry?.updatedAt === 'number' && entry.updatedAt > latestTs) {
|
|
37
|
+
latestTs = entry.updatedAt;
|
|
90
38
|
}
|
|
91
39
|
}
|
|
92
40
|
return latestTs > 0 ? new Date(latestTs).toISOString() : null;
|
package/dist/heartbeat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,6 @@ import { createRequire } from 'node:module';
|
|
|
2
2
|
import { fileURLToPath } from 'node:url';
|
|
3
3
|
import { dirname, join } from 'node:path';
|
|
4
4
|
import fs from 'node:fs';
|
|
5
|
-
import os from 'node:os';
|
|
6
5
|
import { createConnection, subscribeToChannel, logCollector } from './connection.js';
|
|
7
6
|
import { startHeartbeat } from './heartbeat.js';
|
|
8
7
|
import { createAgentApi } from './api.js';
|
|
@@ -10,16 +9,20 @@ import { BoardHandler } from './handlers/board-handler.js';
|
|
|
10
9
|
import { McpBoardClient } from './mcp-client.js';
|
|
11
10
|
import { configureProvider, createProvider, getProvider } from './providers/index.js';
|
|
12
11
|
import { DEBUG } from './debug.js';
|
|
13
|
-
import {
|
|
12
|
+
import { getBackendUrl } from './utils/env.js';
|
|
13
|
+
import { config, requireConfig } from './config.js';
|
|
14
14
|
import { createLockFile } from './lockfile.js';
|
|
15
15
|
import { applyBootstrapConfig } from './utils/apply-config.js';
|
|
16
|
+
import { KnowledgeGraphManager } from './utils/knowledge-graph.js';
|
|
17
|
+
import { startMemoryMcpServer } from './memory-mcp-server.js';
|
|
18
|
+
import { toErrorMessage } from './utils/response.js';
|
|
16
19
|
const _require = createRequire(import.meta.url);
|
|
17
20
|
const { version: CONTROLLER_VERSION } = _require(join(dirname(fileURLToPath(import.meta.url)), '../package.json'));
|
|
18
21
|
/** On startup, fetch latest config from bootstrap API and apply */
|
|
19
22
|
async function refreshConfigFromBootstrap() {
|
|
20
|
-
const backendUrl =
|
|
21
|
-
const agentToken =
|
|
22
|
-
const agentId =
|
|
23
|
+
const backendUrl = config.backendUrl;
|
|
24
|
+
const agentToken = config.agentToken;
|
|
25
|
+
const agentId = config.agentId;
|
|
23
26
|
if (!backendUrl || !agentToken || !agentId)
|
|
24
27
|
return;
|
|
25
28
|
try {
|
|
@@ -32,18 +35,40 @@ async function refreshConfigFromBootstrap() {
|
|
|
32
35
|
console.error('[startup] Failed to refresh config from bootstrap:', err instanceof Error ? err.message : err);
|
|
33
36
|
}
|
|
34
37
|
}
|
|
38
|
+
/** Inject agent-memory MCP server into openclaw.json so OpenClaw agent can discover it. */
|
|
39
|
+
function injectMemoryMcpConfig() {
|
|
40
|
+
try {
|
|
41
|
+
const openclawDir = config.stateDir;
|
|
42
|
+
const configPath = join(openclawDir, 'openclaw.json');
|
|
43
|
+
if (!fs.existsSync(configPath))
|
|
44
|
+
return;
|
|
45
|
+
const fileConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
46
|
+
// Ensure mcpServers section exists
|
|
47
|
+
if (!fileConfig.mcpServers)
|
|
48
|
+
fileConfig.mcpServers = {};
|
|
49
|
+
fileConfig.mcpServers['agent-memory'] = {
|
|
50
|
+
url: 'http://127.0.0.1:3457/mcp',
|
|
51
|
+
transport: 'streamable-http',
|
|
52
|
+
};
|
|
53
|
+
fs.writeFileSync(configPath, JSON.stringify(fileConfig, null, 2) + '\n');
|
|
54
|
+
console.log('[startup] Injected agent-memory MCP server into openclaw.json');
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
console.warn('[startup] Failed to inject memory MCP config:', err instanceof Error ? err.message : err);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
35
60
|
/**
|
|
36
61
|
* Read MCP server config from openclaw.json (injected by bootstrap).
|
|
37
62
|
* Returns McpBoardClient if config is found, null otherwise.
|
|
38
63
|
*/
|
|
39
64
|
function createMcpClient() {
|
|
40
65
|
try {
|
|
41
|
-
const openclawDir =
|
|
66
|
+
const openclawDir = config.stateDir;
|
|
42
67
|
const configPath = join(openclawDir, 'openclaw.json');
|
|
43
68
|
if (!fs.existsSync(configPath))
|
|
44
69
|
return null;
|
|
45
|
-
const
|
|
46
|
-
const mcpConfig =
|
|
70
|
+
const fileConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
71
|
+
const mcpConfig = fileConfig?.mcpServers?.['openclaw-cloud'];
|
|
47
72
|
if (!mcpConfig?.url)
|
|
48
73
|
return null;
|
|
49
74
|
const token = mcpConfig.headers?.Authorization?.replace('Bearer ', '') ?? '';
|
|
@@ -64,15 +89,40 @@ export function main() {
|
|
|
64
89
|
refreshConfigFromBootstrap().catch((err) => {
|
|
65
90
|
console.error('[startup] refreshConfigFromBootstrap failed:', err);
|
|
66
91
|
});
|
|
67
|
-
const url =
|
|
68
|
-
const token =
|
|
69
|
-
const agentId =
|
|
92
|
+
const url = requireConfig('centrifugoUrl');
|
|
93
|
+
const token = requireConfig('agentToken');
|
|
94
|
+
const agentId = requireConfig('agentId');
|
|
70
95
|
const backendUrl = getBackendUrl();
|
|
71
96
|
if (DEBUG)
|
|
72
97
|
console.log('[debug] Debug mode enabled');
|
|
73
98
|
console.log(`Starting agent-controller for agent: ${agentId}`);
|
|
74
99
|
console.log(`Backend URL: ${backendUrl} (JWT mode)`);
|
|
75
100
|
const api = createAgentApi(backendUrl, token);
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
// Memory graph — init, MCP server, delta wiring, openclaw.json injection
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
const graphPath = join(config.stateDir, 'memory', 'graph.jsonl');
|
|
105
|
+
const knowledgeGraphManager = new KnowledgeGraphManager(graphPath);
|
|
106
|
+
let closeMemoryMcp = null;
|
|
107
|
+
knowledgeGraphManager
|
|
108
|
+
.init()
|
|
109
|
+
.then(() => {
|
|
110
|
+
console.log('[memory] KnowledgeGraphManager initialized');
|
|
111
|
+
return startMemoryMcpServer(knowledgeGraphManager);
|
|
112
|
+
})
|
|
113
|
+
.then((closeFn) => {
|
|
114
|
+
closeMemoryMcp = closeFn;
|
|
115
|
+
injectMemoryMcpConfig();
|
|
116
|
+
})
|
|
117
|
+
.catch((err) => {
|
|
118
|
+
console.error('[memory] Failed to initialize memory:', toErrorMessage(err));
|
|
119
|
+
});
|
|
120
|
+
// Fire-and-forget delta sync to backend
|
|
121
|
+
knowledgeGraphManager.on('delta', (delta) => {
|
|
122
|
+
api.postMemoryDelta(agentId, delta).catch((err) => {
|
|
123
|
+
console.error('[memory] Failed to push delta:', toErrorMessage(err));
|
|
124
|
+
});
|
|
125
|
+
});
|
|
76
126
|
const { client, drainCommands } = createConnection({
|
|
77
127
|
url,
|
|
78
128
|
token,
|
|
@@ -80,11 +130,12 @@ export function main() {
|
|
|
80
130
|
backendUrl,
|
|
81
131
|
api,
|
|
82
132
|
version: CONTROLLER_VERSION,
|
|
133
|
+
knowledgeGraphManager,
|
|
83
134
|
});
|
|
84
135
|
// Configure agent provider
|
|
85
|
-
const providerType =
|
|
86
|
-
const gatewayWsUrl =
|
|
87
|
-
const gatewayToken =
|
|
136
|
+
const providerType = config.agentProvider;
|
|
137
|
+
const gatewayWsUrl = config.gatewayWsUrl;
|
|
138
|
+
const gatewayToken = config.gatewayToken;
|
|
88
139
|
if (providerType === 'openclaw') {
|
|
89
140
|
if (gatewayToken) {
|
|
90
141
|
const provider = createProvider('openclaw', { wsUrl: gatewayWsUrl, wsToken: gatewayToken });
|
|
@@ -159,6 +210,7 @@ export function main() {
|
|
|
159
210
|
heartbeatHandle.stop();
|
|
160
211
|
boardSub?.unsubscribe();
|
|
161
212
|
mcpClient?.disconnect();
|
|
213
|
+
closeMemoryMcp?.();
|
|
162
214
|
getProvider()?.disconnect();
|
|
163
215
|
client.disconnect();
|
|
164
216
|
const drainWithTimeout = Promise.race([
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { KnowledgeGraphManager } from './utils/knowledge-graph.js';
|
|
3
|
+
export declare function createMemoryMcpServer(manager: KnowledgeGraphManager): McpServer;
|
|
4
|
+
/**
|
|
5
|
+
* Start the MCP memory server on localhost.
|
|
6
|
+
* Returns a close function for graceful shutdown.
|
|
7
|
+
*/
|
|
8
|
+
export declare function startMemoryMcpServer(manager: KnowledgeGraphManager): Promise<() => void>;
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { createServer } from 'node:http';
|
|
3
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
4
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Zod schemas — exact match with @modelcontextprotocol/server-memory
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
const EntitySchema = z.object({
|
|
10
|
+
name: z.string().describe('The name of the entity'),
|
|
11
|
+
entityType: z.string().describe('The type of the entity'),
|
|
12
|
+
observations: z
|
|
13
|
+
.array(z.string())
|
|
14
|
+
.describe('An array of observation contents associated with the entity'),
|
|
15
|
+
});
|
|
16
|
+
const RelationSchema = z.object({
|
|
17
|
+
from: z.string().describe('The name of the entity where the relation starts'),
|
|
18
|
+
to: z.string().describe('The name of the entity where the relation ends'),
|
|
19
|
+
relationType: z.string().describe('The type of the relation'),
|
|
20
|
+
});
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// MCP server factory
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
export function createMemoryMcpServer(manager) {
|
|
25
|
+
const server = new McpServer({
|
|
26
|
+
name: 'agent-memory',
|
|
27
|
+
version: '1.0.0',
|
|
28
|
+
});
|
|
29
|
+
// --- create_entities ---
|
|
30
|
+
server.registerTool('create_entities', {
|
|
31
|
+
title: 'Create Entities',
|
|
32
|
+
description: 'Create multiple new entities in the knowledge graph',
|
|
33
|
+
inputSchema: { entities: z.array(EntitySchema) },
|
|
34
|
+
outputSchema: { entities: z.array(EntitySchema) },
|
|
35
|
+
}, async ({ entities }) => {
|
|
36
|
+
const result = await manager.createEntities(entities);
|
|
37
|
+
return {
|
|
38
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
39
|
+
structuredContent: { entities: result },
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
// --- create_relations ---
|
|
43
|
+
server.registerTool('create_relations', {
|
|
44
|
+
title: 'Create Relations',
|
|
45
|
+
description: 'Create multiple new relations between entities in the knowledge graph. Relations should be in active voice',
|
|
46
|
+
inputSchema: { relations: z.array(RelationSchema) },
|
|
47
|
+
outputSchema: { relations: z.array(RelationSchema) },
|
|
48
|
+
}, async ({ relations }) => {
|
|
49
|
+
const result = await manager.createRelations(relations);
|
|
50
|
+
return {
|
|
51
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
52
|
+
structuredContent: { relations: result },
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
// --- add_observations ---
|
|
56
|
+
server.registerTool('add_observations', {
|
|
57
|
+
title: 'Add Observations',
|
|
58
|
+
description: 'Add new observations to existing entities in the knowledge graph',
|
|
59
|
+
inputSchema: {
|
|
60
|
+
observations: z.array(z.object({
|
|
61
|
+
entityName: z.string().describe('The name of the entity to add the observations to'),
|
|
62
|
+
contents: z.array(z.string()).describe('An array of observation contents to add'),
|
|
63
|
+
})),
|
|
64
|
+
},
|
|
65
|
+
outputSchema: {
|
|
66
|
+
results: z.array(z.object({
|
|
67
|
+
entityName: z.string(),
|
|
68
|
+
addedObservations: z.array(z.string()),
|
|
69
|
+
})),
|
|
70
|
+
},
|
|
71
|
+
}, async ({ observations }) => {
|
|
72
|
+
const result = await manager.addObservations(observations);
|
|
73
|
+
return {
|
|
74
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
75
|
+
structuredContent: { results: result },
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
// --- delete_entities ---
|
|
79
|
+
server.registerTool('delete_entities', {
|
|
80
|
+
title: 'Delete Entities',
|
|
81
|
+
description: 'Delete multiple entities and their associated relations from the knowledge graph',
|
|
82
|
+
inputSchema: {
|
|
83
|
+
entityNames: z.array(z.string()).describe('An array of entity names to delete'),
|
|
84
|
+
},
|
|
85
|
+
outputSchema: {
|
|
86
|
+
success: z.boolean(),
|
|
87
|
+
message: z.string(),
|
|
88
|
+
},
|
|
89
|
+
}, async ({ entityNames }) => {
|
|
90
|
+
await manager.deleteEntities(entityNames);
|
|
91
|
+
return {
|
|
92
|
+
content: [{ type: 'text', text: 'Entities deleted successfully' }],
|
|
93
|
+
structuredContent: { success: true, message: 'Entities deleted successfully' },
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
// --- delete_observations ---
|
|
97
|
+
server.registerTool('delete_observations', {
|
|
98
|
+
title: 'Delete Observations',
|
|
99
|
+
description: 'Delete specific observations from entities in the knowledge graph',
|
|
100
|
+
inputSchema: {
|
|
101
|
+
deletions: z.array(z.object({
|
|
102
|
+
entityName: z.string().describe('The name of the entity containing the observations'),
|
|
103
|
+
observations: z.array(z.string()).describe('An array of observations to delete'),
|
|
104
|
+
})),
|
|
105
|
+
},
|
|
106
|
+
outputSchema: {
|
|
107
|
+
success: z.boolean(),
|
|
108
|
+
message: z.string(),
|
|
109
|
+
},
|
|
110
|
+
}, async ({ deletions }) => {
|
|
111
|
+
await manager.deleteObservations(deletions);
|
|
112
|
+
return {
|
|
113
|
+
content: [{ type: 'text', text: 'Observations deleted successfully' }],
|
|
114
|
+
structuredContent: { success: true, message: 'Observations deleted successfully' },
|
|
115
|
+
};
|
|
116
|
+
});
|
|
117
|
+
// --- delete_relations ---
|
|
118
|
+
server.registerTool('delete_relations', {
|
|
119
|
+
title: 'Delete Relations',
|
|
120
|
+
description: 'Delete multiple relations from the knowledge graph',
|
|
121
|
+
inputSchema: {
|
|
122
|
+
relations: z.array(RelationSchema).describe('An array of relations to delete'),
|
|
123
|
+
},
|
|
124
|
+
outputSchema: {
|
|
125
|
+
success: z.boolean(),
|
|
126
|
+
message: z.string(),
|
|
127
|
+
},
|
|
128
|
+
}, async ({ relations }) => {
|
|
129
|
+
await manager.deleteRelations(relations);
|
|
130
|
+
return {
|
|
131
|
+
content: [{ type: 'text', text: 'Relations deleted successfully' }],
|
|
132
|
+
structuredContent: { success: true, message: 'Relations deleted successfully' },
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
// --- read_graph ---
|
|
136
|
+
server.registerTool('read_graph', {
|
|
137
|
+
title: 'Read Graph',
|
|
138
|
+
description: 'Read the entire knowledge graph',
|
|
139
|
+
inputSchema: {},
|
|
140
|
+
outputSchema: {
|
|
141
|
+
entities: z.array(EntitySchema),
|
|
142
|
+
relations: z.array(RelationSchema),
|
|
143
|
+
},
|
|
144
|
+
}, async () => {
|
|
145
|
+
const graph = manager.readGraph();
|
|
146
|
+
return {
|
|
147
|
+
content: [{ type: 'text', text: JSON.stringify(graph, null, 2) }],
|
|
148
|
+
structuredContent: { ...graph },
|
|
149
|
+
};
|
|
150
|
+
});
|
|
151
|
+
// --- search_nodes ---
|
|
152
|
+
server.registerTool('search_nodes', {
|
|
153
|
+
title: 'Search Nodes',
|
|
154
|
+
description: 'Search for nodes in the knowledge graph based on a query',
|
|
155
|
+
inputSchema: {
|
|
156
|
+
query: z
|
|
157
|
+
.string()
|
|
158
|
+
.describe('The search query to match against entity names, types, and observation content'),
|
|
159
|
+
},
|
|
160
|
+
outputSchema: {
|
|
161
|
+
entities: z.array(EntitySchema),
|
|
162
|
+
relations: z.array(RelationSchema),
|
|
163
|
+
},
|
|
164
|
+
}, async ({ query }) => {
|
|
165
|
+
const graph = manager.searchNodes(query);
|
|
166
|
+
return {
|
|
167
|
+
content: [{ type: 'text', text: JSON.stringify(graph, null, 2) }],
|
|
168
|
+
structuredContent: { ...graph },
|
|
169
|
+
};
|
|
170
|
+
});
|
|
171
|
+
// --- open_nodes ---
|
|
172
|
+
server.registerTool('open_nodes', {
|
|
173
|
+
title: 'Open Nodes',
|
|
174
|
+
description: 'Open specific nodes in the knowledge graph by their names',
|
|
175
|
+
inputSchema: {
|
|
176
|
+
names: z.array(z.string()).describe('An array of entity names to retrieve'),
|
|
177
|
+
},
|
|
178
|
+
outputSchema: {
|
|
179
|
+
entities: z.array(EntitySchema),
|
|
180
|
+
relations: z.array(RelationSchema),
|
|
181
|
+
},
|
|
182
|
+
}, async ({ names }) => {
|
|
183
|
+
const graph = manager.openNodes(names);
|
|
184
|
+
return {
|
|
185
|
+
content: [{ type: 'text', text: JSON.stringify(graph, null, 2) }],
|
|
186
|
+
structuredContent: { ...graph },
|
|
187
|
+
};
|
|
188
|
+
});
|
|
189
|
+
return server;
|
|
190
|
+
}
|
|
191
|
+
// ---------------------------------------------------------------------------
|
|
192
|
+
// HTTP transport — Node.js http server on localhost:3457
|
|
193
|
+
// ---------------------------------------------------------------------------
|
|
194
|
+
const MEMORY_MCP_PORT = 3457;
|
|
195
|
+
/**
|
|
196
|
+
* Start the MCP memory server on localhost.
|
|
197
|
+
* Returns a close function for graceful shutdown.
|
|
198
|
+
*/
|
|
199
|
+
export async function startMemoryMcpServer(manager) {
|
|
200
|
+
const mcpServer = createMemoryMcpServer(manager);
|
|
201
|
+
// Map of sessionId -> transport for stateful session management
|
|
202
|
+
const transports = new Map();
|
|
203
|
+
const httpServer = createServer(async (req, res) => {
|
|
204
|
+
const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
|
|
205
|
+
if (url.pathname !== '/mcp') {
|
|
206
|
+
res.writeHead(404);
|
|
207
|
+
res.end('Not found');
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
// Parse body for POST
|
|
211
|
+
let body = undefined;
|
|
212
|
+
if (req.method === 'POST') {
|
|
213
|
+
const chunks = [];
|
|
214
|
+
for await (const chunk of req) {
|
|
215
|
+
chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);
|
|
216
|
+
}
|
|
217
|
+
try {
|
|
218
|
+
body = JSON.parse(Buffer.concat(chunks).toString('utf-8'));
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
222
|
+
res.end(JSON.stringify({ error: 'Invalid JSON' }));
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// Check for existing session
|
|
227
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
228
|
+
if (sessionId && transports.has(sessionId)) {
|
|
229
|
+
const transport = transports.get(sessionId);
|
|
230
|
+
await transport.handleRequest(req, res, body);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
// Handle DELETE for session termination
|
|
234
|
+
if (req.method === 'DELETE') {
|
|
235
|
+
if (sessionId && transports.has(sessionId)) {
|
|
236
|
+
const transport = transports.get(sessionId);
|
|
237
|
+
await transport.close();
|
|
238
|
+
transports.delete(sessionId);
|
|
239
|
+
}
|
|
240
|
+
res.writeHead(200);
|
|
241
|
+
res.end();
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
// New session — create transport
|
|
245
|
+
const transport = new StreamableHTTPServerTransport({
|
|
246
|
+
sessionIdGenerator: () => randomUUID(),
|
|
247
|
+
});
|
|
248
|
+
transport.onclose = () => {
|
|
249
|
+
if (transport.sessionId) {
|
|
250
|
+
transports.delete(transport.sessionId);
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
await mcpServer.connect(transport);
|
|
254
|
+
if (transport.sessionId) {
|
|
255
|
+
transports.set(transport.sessionId, transport);
|
|
256
|
+
}
|
|
257
|
+
await transport.handleRequest(req, res, body);
|
|
258
|
+
});
|
|
259
|
+
return new Promise((resolve) => {
|
|
260
|
+
httpServer.listen(MEMORY_MCP_PORT, '127.0.0.1', () => {
|
|
261
|
+
console.log(`[memory-mcp] MCP memory server listening on http://127.0.0.1:${MEMORY_MCP_PORT}/mcp`);
|
|
262
|
+
resolve(() => {
|
|
263
|
+
for (const transport of transports.values()) {
|
|
264
|
+
transport.close().catch(() => { });
|
|
265
|
+
}
|
|
266
|
+
transports.clear();
|
|
267
|
+
httpServer.close();
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=memory-mcp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-mcp-server.js","sourceRoot":"","sources":["../src/memory-mcp-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import crypto from 'node:crypto';
|
|
2
2
|
import fs from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
-
import
|
|
4
|
+
import { config } from '../../config.js';
|
|
5
5
|
const ED25519_SPKI_PREFIX = Buffer.from('302a300506032b6570032100', 'hex');
|
|
6
6
|
function base64UrlEncode(buf) {
|
|
7
7
|
return buf.toString('base64').replaceAll('+', '-').replaceAll('/', '_').replace(/=+$/g, '');
|
|
@@ -43,7 +43,7 @@ export function buildDeviceAuthPayloadV3(params) {
|
|
|
43
43
|
].join('|');
|
|
44
44
|
}
|
|
45
45
|
function getIdentityPath() {
|
|
46
|
-
const stateDir =
|
|
46
|
+
const stateDir = config.stateDir;
|
|
47
47
|
return path.join(stateDir, 'identity', 'device.json');
|
|
48
48
|
}
|
|
49
49
|
export function loadOrCreateDeviceIdentity() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-identity.js","sourceRoot":"","sources":["../../../src/providers/openclaw/device-identity.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"device-identity.js","sourceRoot":"","sources":["../../../src/providers/openclaw/device-identity.ts"],"names":[],"mappings":"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"}
|