@openclaw-cloud/agent-controller 0.21.0 → 1.0.0-beta.10
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 +10 -2
- package/dist/api.js.map +1 -1
- package/dist/commands/bootstrap.js +8 -8
- 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-deps.js +18 -8
- package/dist/commands/install-deps.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 +14 -4
- 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 +27 -7
- package/dist/connection.js.map +1 -1
- package/dist/debug.js +2 -1
- package/dist/debug.js.map +1 -1
- package/dist/handlers/backup.js +4 -1
- package/dist/handlers/backup.js.map +1 -1
- package/dist/handlers/board-handler.d.ts +23 -1
- package/dist/handlers/board-handler.js +153 -27
- package/dist/handlers/board-handler.js.map +1 -1
- package/dist/handlers/chat.js +94 -6
- package/dist/handlers/chat.js.map +1 -1
- package/dist/handlers/deploy.js +16 -29
- package/dist/handlers/deploy.js.map +1 -1
- package/dist/handlers/diagnostics.js +12 -0
- package/dist/handlers/diagnostics.js.map +1 -1
- package/dist/handlers/knowledge-sync.js +21 -1
- package/dist/handlers/knowledge-sync.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/onboarding.js +18 -2
- package/dist/handlers/onboarding.js.map +1 -1
- package/dist/handlers/package-install.js +44 -12
- package/dist/handlers/package-install.js.map +1 -1
- package/dist/handlers/pair.js +14 -1
- package/dist/handlers/pair.js.map +1 -1
- package/dist/handlers/restart.js +3 -1
- package/dist/handlers/restart.js.map +1 -1
- package/dist/handlers/self-update.js +3 -1
- package/dist/handlers/self-update.js.map +1 -1
- package/dist/handlers/stop.js +7 -0
- package/dist/handlers/stop.js.map +1 -1
- package/dist/handlers/telegram-webhook.js +23 -0
- package/dist/handlers/telegram-webhook.js.map +1 -1
- package/dist/handlers/update-config.js +8 -2
- package/dist/handlers/update-config.js.map +1 -1
- package/dist/heartbeat.d.ts +7 -0
- package/dist/heartbeat.js +15 -65
- package/dist/heartbeat.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +126 -23
- package/dist/index.js.map +1 -1
- package/dist/mcp-client.d.ts +29 -0
- package/dist/mcp-client.js +70 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/memory-mcp-server.d.ts +8 -0
- package/dist/memory-mcp-server.js +291 -0
- package/dist/memory-mcp-server.js.map +1 -0
- package/dist/platform/linux.js +7 -3
- package/dist/platform/linux.js.map +1 -1
- package/dist/platform/macos.js +4 -2
- package/dist/platform/macos.js.map +1 -1
- package/dist/platform/windows.js +4 -2
- package/dist/platform/windows.js.map +1 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/mock/index.js.map +1 -1
- package/dist/providers/openclaw/device-identity.js +2 -2
- package/dist/providers/openclaw/device-identity.js.map +1 -1
- package/dist/providers/openclaw/gateway-adapter.js +19 -8
- package/dist/providers/openclaw/gateway-adapter.js.map +1 -1
- package/dist/providers/openclaw/gateway-client.js +9 -3
- package/dist/providers/openclaw/gateway-client.js.map +1 -1
- package/dist/providers/openclaw/index.js +14 -3
- package/dist/providers/openclaw/index.js.map +1 -1
- package/dist/skills/index.d.ts +1 -1
- package/dist/skills/index.js +1 -21
- package/dist/skills/index.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/utils/apply-config.js +9 -5
- package/dist/utils/apply-config.js.map +1 -1
- package/dist/utils/claude-env.js +11 -5
- package/dist/utils/claude-env.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 +66 -0
- package/dist/utils/knowledge-graph.js +163 -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 +28 -5
- package/dist/skills/board-tools/SKILL.md +0 -75
- package/dist/skills/board-tools/scripts/board-artifact.sh +0 -56
- package/dist/skills/board-tools/scripts/board-artifacts.sh +0 -16
- package/dist/skills/board-tools/scripts/board-comment.sh +0 -23
- package/dist/skills/board-tools/scripts/board-move.sh +0 -13
- package/dist/skills/board-tools/scripts/board-result.sh +0 -35
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"self-update.js","sourceRoot":"","sources":["../../src/handlers/self-update.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,KAAK,EAAE,GAAiB,EAA0B,EAAE;QACzD,IAAI,CAAC;YACH,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,mCAAmC,OAAO,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"self-update.js","sourceRoot":"","sources":["../../src/handlers/self-update.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,KAAK,EAAE,GAAiB,EAA0B,EAAE;QACzD,IAAI,CAAC;YACH,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,mCAAmC,OAAO,GAAG,EAAE;gBACvF,cAAc,EAAE,OAAO;aACxB,CAAC,CAAC;YACH,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAC1B,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACjE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACpF,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/handlers/stop.js
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
+
import { logCollector } from '../connection.js';
|
|
1
2
|
export function handleStop(command) {
|
|
3
|
+
logCollector?.push('command_received', 'info', `Command: ${command.type}`, {
|
|
4
|
+
commandId: command.id,
|
|
5
|
+
});
|
|
6
|
+
logCollector?.push('command_completed', 'info', `${command.type} completed`, {
|
|
7
|
+
commandId: command.id,
|
|
8
|
+
});
|
|
2
9
|
const response = {
|
|
3
10
|
id: command.id,
|
|
4
11
|
type: 'stop',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/handlers/stop.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/handlers/stop.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,UAAU,UAAU,CAAC,OAAqB;IAC9C,YAAY,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,EAAE,YAAY,OAAO,CAAC,IAAI,EAAE,EAAE;QACzE,SAAS,EAAE,OAAO,CAAC,EAAE;KACtB,CAAC,CAAC;IACH,YAAY,EAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,YAAY,EAAE;QAC3E,SAAS,EAAE,OAAO,CAAC,EAAE;KACtB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAkB;QAC9B,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,EAAE,OAAO,EAAE,0BAA0B,EAAE;KAC9C,CAAC;IAEF,yFAAyF;IACzF,yFAAyF;IACzF,qFAAqF;IACrF,8CAA8C;IAC9C,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,EAAE,GAAG,CAAC,CAAC;IAER,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
import { toErrorMessage } from '../utils/response.js';
|
|
2
|
+
import { logCollector } from '../connection.js';
|
|
2
3
|
const WEBHOOK_PORT = 8787;
|
|
3
4
|
const TIMEOUT_MS = 10_000;
|
|
4
5
|
export async function handleTelegramWebhook(command) {
|
|
6
|
+
logCollector?.push('command_received', 'info', `Command: ${command.type}`, {
|
|
7
|
+
commandId: command.id,
|
|
8
|
+
});
|
|
9
|
+
const startMs = Date.now();
|
|
5
10
|
const { body, webhookSecret } = command.payload;
|
|
6
11
|
if (!body) {
|
|
12
|
+
logCollector?.push('command_failed', 'error', `${command.type} failed: missing body in payload`, {
|
|
13
|
+
commandId: command.id,
|
|
14
|
+
durationMs: Date.now() - startMs,
|
|
15
|
+
});
|
|
7
16
|
return {
|
|
8
17
|
id: command.id,
|
|
9
18
|
type: command.type,
|
|
@@ -25,6 +34,11 @@ export async function handleTelegramWebhook(command) {
|
|
|
25
34
|
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
26
35
|
});
|
|
27
36
|
if (!response.ok) {
|
|
37
|
+
logCollector?.push('command_failed', 'error', `${command.type} failed: gateway ${response.status}`, {
|
|
38
|
+
commandId: command.id,
|
|
39
|
+
durationMs: Date.now() - startMs,
|
|
40
|
+
statusCode: response.status,
|
|
41
|
+
});
|
|
28
42
|
return {
|
|
29
43
|
id: command.id,
|
|
30
44
|
type: command.type,
|
|
@@ -32,6 +46,11 @@ export async function handleTelegramWebhook(command) {
|
|
|
32
46
|
error: `Gateway responded with ${response.status}: ${response.statusText}`,
|
|
33
47
|
};
|
|
34
48
|
}
|
|
49
|
+
logCollector?.push('command_completed', 'info', `${command.type} completed`, {
|
|
50
|
+
commandId: command.id,
|
|
51
|
+
durationMs: Date.now() - startMs,
|
|
52
|
+
statusCode: response.status,
|
|
53
|
+
});
|
|
35
54
|
return {
|
|
36
55
|
id: command.id,
|
|
37
56
|
type: command.type,
|
|
@@ -40,6 +59,10 @@ export async function handleTelegramWebhook(command) {
|
|
|
40
59
|
};
|
|
41
60
|
}
|
|
42
61
|
catch (err) {
|
|
62
|
+
logCollector?.push('command_failed', 'error', `${command.type} failed: ${toErrorMessage(err)}`, {
|
|
63
|
+
commandId: command.id,
|
|
64
|
+
durationMs: Date.now() - startMs,
|
|
65
|
+
});
|
|
43
66
|
return {
|
|
44
67
|
id: command.id,
|
|
45
68
|
type: command.type,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telegram-webhook.js","sourceRoot":"","sources":["../../src/handlers/telegram-webhook.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"telegram-webhook.js","sourceRoot":"","sources":["../../src/handlers/telegram-webhook.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,12 +9,18 @@ export function handleUpdateConfig(api, agentId) {
|
|
|
9
9
|
const data = await api.agentBootstrap(agentId);
|
|
10
10
|
await applyBootstrapConfig(data);
|
|
11
11
|
const durationMs = Date.now() - startMs;
|
|
12
|
-
logCollector?.push('command_completed', 'info', `${cmd.type} completed`, {
|
|
12
|
+
logCollector?.push('command_completed', 'info', `${cmd.type} completed`, {
|
|
13
|
+
commandId: cmd.id,
|
|
14
|
+
durationMs,
|
|
15
|
+
});
|
|
13
16
|
return { id: cmd.id, type: cmd.type, success: true, data: {} };
|
|
14
17
|
}
|
|
15
18
|
catch (err) {
|
|
16
19
|
const durationMs = Date.now() - startMs;
|
|
17
|
-
logCollector?.push('command_failed', 'error', `${cmd.type} failed: ${toErrorMessage(err)}`, {
|
|
20
|
+
logCollector?.push('command_failed', 'error', `${cmd.type} failed: ${toErrorMessage(err)}`, {
|
|
21
|
+
commandId: cmd.id,
|
|
22
|
+
durationMs,
|
|
23
|
+
});
|
|
18
24
|
return { id: cmd.id, type: cmd.type, success: false, error: toErrorMessage(err) };
|
|
19
25
|
}
|
|
20
26
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-config.js","sourceRoot":"","sources":["../../src/handlers/update-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,UAAU,kBAAkB,CAAC,GAAa,EAAE,OAAe;IAC/D,OAAO,KAAK,EAAE,GAAiB,EAA0B,EAAE;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,YAAY,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,EAAE,YAAY,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAC/C,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;YACxC,YAAY,EAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"update-config.js","sourceRoot":"","sources":["../../src/handlers/update-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,UAAU,kBAAkB,CAAC,GAAa,EAAE,OAAe;IAC/D,OAAO,KAAK,EAAE,GAAiB,EAA0B,EAAE;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,YAAY,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,EAAE,YAAY,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAC/C,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;YACxC,YAAY,EAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,YAAY,EAAE;gBACvE,SAAS,EAAE,GAAG,CAAC,EAAE;gBACjB,UAAU;aACX,CAAC,CAAC;YACH,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACjE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;YACxC,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,YAAY,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE;gBAC1F,SAAS,EAAE,GAAG,CAAC,EAAE;gBACjB,UAAU;aACX,CAAC,CAAC;YACH,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACpF,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/heartbeat.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import type { AgentApi } from './api.js';
|
|
2
2
|
import type { BoardState, HeartbeatPayload } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Read sessions.json index to find the latest session activity timestamp.
|
|
5
|
+
* sessions.json is maintained by OpenClaw gateway and contains an `updatedAt`
|
|
6
|
+
* (ms epoch) field per session, updated on each real session turn (user message
|
|
7
|
+
* → agent reply). This works for all channels (Telegram, Slack, Discord, etc.)
|
|
8
|
+
* regardless of how messages are delivered (webhook, Socket Mode, etc.).
|
|
9
|
+
*/
|
|
3
10
|
export declare function getLastMessageAt(): Promise<string | null>;
|
|
4
11
|
export interface HeartbeatOptions {
|
|
5
12
|
api: AgentApi;
|
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,74 +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
|
-
|
|
45
|
-
const sessionsDir = path.join(stateDir, 'agents', 'main', 'sessions');
|
|
29
|
+
const stateDir = config.stateDir;
|
|
30
|
+
const sessionsJsonPath = path.join(stateDir, 'agents', 'main', 'sessions', 'sessions.json');
|
|
46
31
|
try {
|
|
47
|
-
const
|
|
48
|
-
const
|
|
49
|
-
if (jsonlFiles.length === 0)
|
|
50
|
-
return null;
|
|
51
|
-
const now = Date.now();
|
|
52
|
-
const TWO_HOURS = 2 * 60 * 60 * 1000;
|
|
32
|
+
const raw = await fs.readFile(sessionsJsonPath, 'utf-8');
|
|
33
|
+
const store = JSON.parse(raw);
|
|
53
34
|
let latestTs = 0;
|
|
54
|
-
for (const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
// Skip files not modified in the last 2 hours
|
|
58
|
-
if (now - stat.mtimeMs > TWO_HOURS)
|
|
59
|
-
continue;
|
|
60
|
-
// Read last 64KB of the file
|
|
61
|
-
const readSize = Math.min(stat.size, TAIL_READ_SIZE);
|
|
62
|
-
const fh = await fs.open(filePath, 'r');
|
|
63
|
-
const buf = Buffer.alloc(readSize);
|
|
64
|
-
await fh.read(buf, 0, readSize, Math.max(0, stat.size - readSize));
|
|
65
|
-
await fh.close();
|
|
66
|
-
// Take last N lines, search backwards for a real user message
|
|
67
|
-
const lines = buf.toString('utf-8').split('\n').filter((l) => l.trim());
|
|
68
|
-
const tail = lines.slice(-TAIL_LINES);
|
|
69
|
-
for (let i = tail.length - 1; i >= 0; i--) {
|
|
70
|
-
try {
|
|
71
|
-
const entry = JSON.parse(tail[i]);
|
|
72
|
-
const text = extractUserText(entry);
|
|
73
|
-
if (text === null)
|
|
74
|
-
continue;
|
|
75
|
-
if (isHeartbeatMessage(text))
|
|
76
|
-
continue;
|
|
77
|
-
// Found a real user message — extract timestamp
|
|
78
|
-
const msg = entry.message;
|
|
79
|
-
const ts = (msg?.timestamp ?? entry.timestamp);
|
|
80
|
-
const tsNum = typeof ts === 'number' ? ts : new Date(ts).getTime();
|
|
81
|
-
if (tsNum > latestTs)
|
|
82
|
-
latestTs = tsNum;
|
|
83
|
-
break; // Only need the latest per file
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
continue;
|
|
87
|
-
}
|
|
35
|
+
for (const entry of Object.values(store)) {
|
|
36
|
+
if (typeof entry?.updatedAt === 'number' && entry.updatedAt > latestTs) {
|
|
37
|
+
latestTs = entry.updatedAt;
|
|
88
38
|
}
|
|
89
39
|
}
|
|
90
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.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function main(): void
|
|
1
|
+
export declare function main(): Promise<void>;
|
package/dist/index.js
CHANGED
|
@@ -1,22 +1,28 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';
|
|
2
2
|
import { fileURLToPath } from 'node:url';
|
|
3
3
|
import { dirname, join } from 'node:path';
|
|
4
|
+
import fs from 'node:fs';
|
|
4
5
|
import { createConnection, subscribeToChannel, logCollector } from './connection.js';
|
|
5
6
|
import { startHeartbeat } from './heartbeat.js';
|
|
6
7
|
import { createAgentApi } from './api.js';
|
|
7
8
|
import { BoardHandler } from './handlers/board-handler.js';
|
|
9
|
+
import { McpBoardClient } from './mcp-client.js';
|
|
8
10
|
import { configureProvider, createProvider, getProvider } from './providers/index.js';
|
|
9
11
|
import { DEBUG } from './debug.js';
|
|
10
|
-
import {
|
|
12
|
+
import { getBackendUrl } from './utils/env.js';
|
|
13
|
+
import { config, requireConfig } from './config.js';
|
|
11
14
|
import { createLockFile } from './lockfile.js';
|
|
12
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';
|
|
13
19
|
const _require = createRequire(import.meta.url);
|
|
14
20
|
const { version: CONTROLLER_VERSION } = _require(join(dirname(fileURLToPath(import.meta.url)), '../package.json'));
|
|
15
21
|
/** On startup, fetch latest config from bootstrap API and apply */
|
|
16
22
|
async function refreshConfigFromBootstrap() {
|
|
17
|
-
const backendUrl =
|
|
18
|
-
const agentToken =
|
|
19
|
-
const agentId =
|
|
23
|
+
const backendUrl = config.backendUrl;
|
|
24
|
+
const agentToken = config.agentToken;
|
|
25
|
+
const agentId = config.agentId;
|
|
20
26
|
if (!backendUrl || !agentToken || !agentId)
|
|
21
27
|
return;
|
|
22
28
|
try {
|
|
@@ -29,25 +35,103 @@ async function refreshConfigFromBootstrap() {
|
|
|
29
35
|
console.error('[startup] Failed to refresh config from bootstrap:', err instanceof Error ? err.message : err);
|
|
30
36
|
}
|
|
31
37
|
}
|
|
32
|
-
|
|
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
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Read MCP server config from openclaw.json (injected by bootstrap).
|
|
62
|
+
* Returns McpBoardClient if config is found, null otherwise.
|
|
63
|
+
*/
|
|
64
|
+
function createMcpClient() {
|
|
65
|
+
try {
|
|
66
|
+
const openclawDir = config.stateDir;
|
|
67
|
+
const configPath = join(openclawDir, 'openclaw.json');
|
|
68
|
+
if (!fs.existsSync(configPath))
|
|
69
|
+
return null;
|
|
70
|
+
const fileConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
71
|
+
const mcpConfig = fileConfig?.mcpServers?.['openclaw-cloud'];
|
|
72
|
+
if (!mcpConfig?.url)
|
|
73
|
+
return null;
|
|
74
|
+
const token = mcpConfig.headers?.Authorization?.replace('Bearer ', '') ?? '';
|
|
75
|
+
if (!token) {
|
|
76
|
+
console.warn('[mcp] No auth token in MCP config, skipping MCP client');
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
console.log(`[mcp] Found MCP config: ${mcpConfig.url}`);
|
|
80
|
+
return new McpBoardClient({ url: mcpConfig.url, token });
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
console.warn('[mcp] Failed to read MCP config:', err instanceof Error ? err.message : err);
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export async function main() {
|
|
33
88
|
createLockFile();
|
|
34
89
|
refreshConfigFromBootstrap().catch((err) => {
|
|
35
90
|
console.error('[startup] refreshConfigFromBootstrap failed:', err);
|
|
36
91
|
});
|
|
37
|
-
const url =
|
|
38
|
-
const token =
|
|
39
|
-
const agentId =
|
|
92
|
+
const url = requireConfig('centrifugoUrl');
|
|
93
|
+
const token = requireConfig('agentToken');
|
|
94
|
+
const agentId = requireConfig('agentId');
|
|
40
95
|
const backendUrl = getBackendUrl();
|
|
41
96
|
if (DEBUG)
|
|
42
97
|
console.log('[debug] Debug mode enabled');
|
|
43
98
|
console.log(`Starting agent-controller for agent: ${agentId}`);
|
|
44
99
|
console.log(`Backend URL: ${backendUrl} (JWT mode)`);
|
|
45
100
|
const api = createAgentApi(backendUrl, token);
|
|
46
|
-
|
|
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
|
+
try {
|
|
108
|
+
await knowledgeGraphManager.init();
|
|
109
|
+
console.log('[memory] KnowledgeGraphManager initialized');
|
|
110
|
+
closeMemoryMcp = await startMemoryMcpServer(knowledgeGraphManager);
|
|
111
|
+
injectMemoryMcpConfig();
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
console.error('[memory] Failed to initialize memory:', toErrorMessage(err));
|
|
115
|
+
}
|
|
116
|
+
// Fire-and-forget delta sync to backend
|
|
117
|
+
knowledgeGraphManager.on('delta', (delta) => {
|
|
118
|
+
api.postMemoryDelta(agentId, delta).catch((err) => {
|
|
119
|
+
console.error('[memory] Failed to push delta:', toErrorMessage(err));
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
const { client, drainCommands } = createConnection({
|
|
123
|
+
url,
|
|
124
|
+
token,
|
|
125
|
+
agentId,
|
|
126
|
+
backendUrl,
|
|
127
|
+
api,
|
|
128
|
+
version: CONTROLLER_VERSION,
|
|
129
|
+
knowledgeGraphManager,
|
|
130
|
+
});
|
|
47
131
|
// Configure agent provider
|
|
48
|
-
const providerType =
|
|
49
|
-
const gatewayWsUrl =
|
|
50
|
-
const gatewayToken =
|
|
132
|
+
const providerType = config.agentProvider;
|
|
133
|
+
const gatewayWsUrl = config.gatewayWsUrl;
|
|
134
|
+
const gatewayToken = config.gatewayToken;
|
|
51
135
|
if (providerType === 'openclaw') {
|
|
52
136
|
if (gatewayToken) {
|
|
53
137
|
const provider = createProvider('openclaw', { wsUrl: gatewayWsUrl, wsToken: gatewayToken });
|
|
@@ -71,19 +155,32 @@ export function main() {
|
|
|
71
155
|
process.exit(1);
|
|
72
156
|
}
|
|
73
157
|
// Board handler — board subscription kept in outer scope for shutdown cleanup
|
|
74
|
-
const
|
|
158
|
+
const mcpClient = createMcpClient();
|
|
159
|
+
const boardHandler = new BoardHandler(api, mcpClient ?? undefined);
|
|
75
160
|
let boardSub = null;
|
|
76
161
|
// RACE-4: boardHandler.initialize() is async, so events published during initialization
|
|
77
162
|
// are missed. This is a known limitation: the initialize() call includes a checkQueue()
|
|
78
163
|
// backfill that re-reads all unassigned cards, so any events missed during init are
|
|
79
164
|
// recovered by that initial queue scan.
|
|
80
|
-
boardHandler
|
|
165
|
+
boardHandler
|
|
166
|
+
.initialize()
|
|
167
|
+
.then((workspaceId) => {
|
|
81
168
|
if (!workspaceId) {
|
|
82
169
|
console.log('No board found for this agent, board handler dormant');
|
|
83
170
|
return;
|
|
84
171
|
}
|
|
172
|
+
// Subscribe to Centrifugo board channel as fallback.
|
|
173
|
+
// When MCP is connected, board events arrive via MCP notifications too,
|
|
174
|
+
// but RACE-2 guard in BoardHandler prevents duplicate claims.
|
|
85
175
|
const boardChannel = `board:${workspaceId}`;
|
|
86
|
-
boardSub = subscribeToChannel(client, boardChannel, {
|
|
176
|
+
boardSub = subscribeToChannel(client, boardChannel, {
|
|
177
|
+
url,
|
|
178
|
+
token,
|
|
179
|
+
agentId,
|
|
180
|
+
backendUrl,
|
|
181
|
+
api,
|
|
182
|
+
version: CONTROLLER_VERSION,
|
|
183
|
+
});
|
|
87
184
|
boardSub.on('publication', (ctx) => {
|
|
88
185
|
const event = ctx.data;
|
|
89
186
|
if (!event || !event.event)
|
|
@@ -92,8 +189,9 @@ export function main() {
|
|
|
92
189
|
console.error('Board event handler error:', err instanceof Error ? err.message : err);
|
|
93
190
|
});
|
|
94
191
|
});
|
|
95
|
-
console.log(`Subscribed to board channel: ${boardChannel}`);
|
|
96
|
-
})
|
|
192
|
+
console.log(`Subscribed to board channel: ${boardChannel}${boardHandler.isUsingMcp() ? ' (MCP primary, Centrifugo fallback)' : ''}`);
|
|
193
|
+
})
|
|
194
|
+
.catch((err) => {
|
|
97
195
|
console.error('Board handler init error:', err instanceof Error ? err.message : err);
|
|
98
196
|
});
|
|
99
197
|
console.log('Heartbeat via backend API');
|
|
@@ -107,14 +205,19 @@ export function main() {
|
|
|
107
205
|
console.log('Shutting down...');
|
|
108
206
|
heartbeatHandle.stop();
|
|
109
207
|
boardSub?.unsubscribe();
|
|
208
|
+
mcpClient?.disconnect();
|
|
209
|
+
closeMemoryMcp?.();
|
|
110
210
|
getProvider()?.disconnect();
|
|
111
|
-
logCollector?.shutdown().catch(() => { });
|
|
112
211
|
client.disconnect();
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
212
|
+
const drainWithTimeout = Promise.race([
|
|
213
|
+
Promise.all([drainCommands(), logCollector?.shutdown() ?? Promise.resolve()]),
|
|
214
|
+
new Promise((resolve) => setTimeout(resolve, 3000)),
|
|
215
|
+
]);
|
|
216
|
+
drainWithTimeout
|
|
217
|
+
.catch(() => { })
|
|
218
|
+
.finally(() => {
|
|
219
|
+
process.exit(0);
|
|
220
|
+
});
|
|
118
221
|
};
|
|
119
222
|
process.on('SIGINT', shutdown);
|
|
120
223
|
process.on('SIGTERM', shutdown);
|
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,gBAAgB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface McpToolResult {
|
|
2
|
+
content: Array<{
|
|
3
|
+
type: string;
|
|
4
|
+
text?: string;
|
|
5
|
+
}>;
|
|
6
|
+
isError?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface McpBoardClientOptions {
|
|
9
|
+
url: string;
|
|
10
|
+
token: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* MCP client for communicating with the openclaw-cloud MCP server.
|
|
14
|
+
* Used by BoardHandler to call board tools and receive board event notifications.
|
|
15
|
+
*/
|
|
16
|
+
export declare class McpBoardClient {
|
|
17
|
+
private client;
|
|
18
|
+
private connected;
|
|
19
|
+
private onBoardEvent?;
|
|
20
|
+
private url;
|
|
21
|
+
private token;
|
|
22
|
+
constructor(options: McpBoardClientOptions);
|
|
23
|
+
setEventHandler(handler: (event: Record<string, unknown>) => void): void;
|
|
24
|
+
connect(): Promise<void>;
|
|
25
|
+
disconnect(): Promise<void>;
|
|
26
|
+
callTool(name: string, args?: Record<string, unknown>): Promise<McpToolResult>;
|
|
27
|
+
listTools(): Promise<string[]>;
|
|
28
|
+
isConnected(): boolean;
|
|
29
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
/**
|
|
5
|
+
* MCP client for communicating with the openclaw-cloud MCP server.
|
|
6
|
+
* Used by BoardHandler to call board tools and receive board event notifications.
|
|
7
|
+
*/
|
|
8
|
+
export class McpBoardClient {
|
|
9
|
+
client;
|
|
10
|
+
connected = false;
|
|
11
|
+
onBoardEvent;
|
|
12
|
+
url;
|
|
13
|
+
token;
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.url = options.url;
|
|
16
|
+
this.token = options.token;
|
|
17
|
+
this.client = new Client({ name: 'agent-controller', version: '1.0.0' }, { capabilities: {} });
|
|
18
|
+
}
|
|
19
|
+
setEventHandler(handler) {
|
|
20
|
+
this.onBoardEvent = handler;
|
|
21
|
+
}
|
|
22
|
+
async connect() {
|
|
23
|
+
const transport = new StreamableHTTPClientTransport(new URL(this.url), {
|
|
24
|
+
requestInit: {
|
|
25
|
+
headers: { Authorization: `Bearer ${this.token}` },
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
await this.client.connect(transport);
|
|
29
|
+
this.connected = true;
|
|
30
|
+
// Listen for board event notifications from MCP server.
|
|
31
|
+
// The backend dispatches these as method 'board/event' via McpSessionManager.
|
|
32
|
+
const BoardEventNotification = z.object({
|
|
33
|
+
method: z.literal('board/event'),
|
|
34
|
+
params: z.object({}).passthrough().optional(),
|
|
35
|
+
});
|
|
36
|
+
this.client.setNotificationHandler(BoardEventNotification, (notification) => {
|
|
37
|
+
if (this.onBoardEvent && notification.params) {
|
|
38
|
+
this.onBoardEvent(notification.params);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
console.log('[mcp] Client connected to', this.url);
|
|
42
|
+
}
|
|
43
|
+
async disconnect() {
|
|
44
|
+
if (this.connected) {
|
|
45
|
+
try {
|
|
46
|
+
await this.client.close();
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Ignore close errors
|
|
50
|
+
}
|
|
51
|
+
this.connected = false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async callTool(name, args = {}) {
|
|
55
|
+
if (!this.connected)
|
|
56
|
+
throw new Error('MCP client not connected');
|
|
57
|
+
const result = await this.client.callTool({ name, arguments: args });
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
async listTools() {
|
|
61
|
+
if (!this.connected)
|
|
62
|
+
throw new Error('MCP client not connected');
|
|
63
|
+
const result = await this.client.listTools();
|
|
64
|
+
return result.tools.map((t) => t.name);
|
|
65
|
+
}
|
|
66
|
+
isConnected() {
|
|
67
|
+
return this.connected;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=mcp-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../src/mcp-client.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>;
|