@openclaw-cloud/agent-controller 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/backup-cli.js +10 -75
- package/dist/commands/backup-cli.js.map +1 -1
- package/dist/commands/knowledge-sync-cli.js +7 -44
- package/dist/commands/knowledge-sync-cli.js.map +1 -1
- package/dist/connection.js +35 -40
- package/dist/connection.js.map +1 -1
- package/dist/handlers/backup.d.ts +1 -2
- package/dist/handlers/backup.js +7 -80
- package/dist/handlers/backup.js.map +1 -1
- package/dist/handlers/chat.js +4 -3
- package/dist/handlers/chat.js.map +1 -1
- package/dist/handlers/config.js +13 -2
- package/dist/handlers/config.js.map +1 -1
- package/dist/handlers/diagnostics.d.ts +2 -0
- package/dist/handlers/diagnostics.js +50 -0
- package/dist/handlers/diagnostics.js.map +1 -0
- package/dist/handlers/knowledge-sync.js +25 -56
- package/dist/handlers/knowledge-sync.js.map +1 -1
- package/dist/handlers/onboarding.js +3 -21
- package/dist/handlers/onboarding.js.map +1 -1
- package/dist/handlers/package-install.js +17 -3
- package/dist/handlers/package-install.js.map +1 -1
- package/dist/handlers/restart.js +3 -21
- package/dist/handlers/restart.js.map +1 -1
- package/dist/handlers/self-update.d.ts +2 -0
- package/dist/handlers/self-update.js +14 -0
- package/dist/handlers/self-update.js.map +1 -0
- package/dist/heartbeat.js +0 -4
- package/dist/heartbeat.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/openclaw/gateway-adapter.d.ts +1 -0
- package/dist/openclaw/gateway-adapter.js +37 -7
- package/dist/openclaw/gateway-adapter.js.map +1 -1
- package/dist/platform/common.d.ts +1 -0
- package/dist/platform/common.js +10 -1
- package/dist/platform/common.js.map +1 -1
- package/dist/platform/linux.d.ts +1 -1
- package/dist/platform/linux.js +1 -8
- package/dist/platform/linux.js.map +1 -1
- package/dist/platform/macos.d.ts +1 -1
- package/dist/platform/macos.js +1 -8
- package/dist/platform/macos.js.map +1 -1
- package/dist/platform/windows.d.ts +1 -1
- package/dist/platform/windows.js +1 -8
- package/dist/platform/windows.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/utils/archive.js +2 -2
- package/dist/utils/archive.js.map +1 -1
- package/dist/utils/backup-push.d.ts +16 -0
- package/dist/utils/backup-push.js +95 -0
- package/dist/utils/backup-push.js.map +1 -0
- package/dist/utils/env.d.ts +1 -0
- package/dist/utils/env.js +3 -0
- package/dist/utils/env.js.map +1 -1
- package/dist/utils/gateway-restart-handler.d.ts +6 -0
- package/dist/utils/gateway-restart-handler.js +27 -0
- package/dist/utils/gateway-restart-handler.js.map +1 -0
- package/dist/utils/knowledge-push.d.ts +8 -0
- package/dist/utils/knowledge-push.js +103 -0
- package/dist/utils/knowledge-push.js.map +1 -0
- package/package.json +1 -1
- package/dist/handlers/exec.d.ts +0 -2
- package/dist/handlers/exec.js +0 -29
- package/dist/handlers/exec.js.map +0 -1
|
@@ -1,80 +1,15 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import { getWorkspaceDir } from '../workspace.js';
|
|
4
|
-
import { requireEnv } from '../utils/env.js';
|
|
5
|
-
import { createArchive } from '../utils/archive.js';
|
|
1
|
+
import { pushBackupToBackend } from '../utils/backup-push.js';
|
|
2
|
+
import { toErrorMessage } from '../utils/response.js';
|
|
6
3
|
export async function runBackup() {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const initRes = await fetch(`${backendUrl}/api/internal/agents/${agentId}/backup/init`, {
|
|
13
|
-
method: 'POST',
|
|
14
|
-
headers: { Authorization: `Bearer ${agentToken}` },
|
|
15
|
-
signal: AbortSignal.timeout(30_000),
|
|
16
|
-
});
|
|
17
|
-
if (!initRes.ok) {
|
|
18
|
-
const text = await initRes.text().catch(() => '');
|
|
19
|
-
console.error(`Backup init failed: ${initRes.status} ${text}`);
|
|
20
|
-
process.exit(1);
|
|
21
|
-
}
|
|
22
|
-
const { snapshotId, uploadUrl, token, method } = await initRes.json();
|
|
23
|
-
// Step 2: Create archive
|
|
24
|
-
const archivePath = path.join('/tmp', `backup-${Date.now()}.tar.gz`);
|
|
25
|
-
console.log('Creating archive...');
|
|
26
|
-
await createArchive(archivePath, getWorkspaceDir());
|
|
27
|
-
const stat = await fs.stat(archivePath);
|
|
28
|
-
const sizeMb = (stat.size / 1024 / 1024).toFixed(2);
|
|
29
|
-
console.log(`Archive size: ${sizeMb} MB`);
|
|
30
|
-
// Step 3: Upload
|
|
31
|
-
if (method === 'presigned') {
|
|
32
|
-
// Direct S3 PUT — bypasses ALB, no size limit
|
|
33
|
-
console.log('Uploading directly to S3...');
|
|
34
|
-
const fileBuffer = await fs.readFile(archivePath);
|
|
35
|
-
const uploadRes = await fetch(uploadUrl, {
|
|
36
|
-
method: 'PUT',
|
|
37
|
-
headers: { 'Content-Type': 'application/gzip' },
|
|
38
|
-
body: fileBuffer,
|
|
39
|
-
signal: AbortSignal.timeout(300_000),
|
|
40
|
-
});
|
|
41
|
-
await fs.unlink(archivePath).catch(() => { });
|
|
42
|
-
if (!uploadRes.ok) {
|
|
43
|
-
const text = await uploadRes.text().catch(() => '');
|
|
44
|
-
console.error(`S3 upload failed: ${uploadRes.status} ${text}`);
|
|
45
|
-
process.exit(1);
|
|
46
|
-
}
|
|
47
|
-
// Notify backend that upload is complete
|
|
48
|
-
const completeRes = await fetch(`${backendUrl}/api/internal/agents/${agentId}/backup/complete`, {
|
|
49
|
-
method: 'POST',
|
|
50
|
-
headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${agentToken}` },
|
|
51
|
-
body: JSON.stringify({ snapshotId, sizeBytes: stat.size }),
|
|
52
|
-
signal: AbortSignal.timeout(30_000),
|
|
53
|
-
});
|
|
54
|
-
if (!completeRes.ok) {
|
|
55
|
-
const text = await completeRes.text().catch(() => '');
|
|
56
|
-
console.error(`Backup complete notification failed: ${completeRes.status} ${text}`);
|
|
57
|
-
process.exit(1);
|
|
58
|
-
}
|
|
4
|
+
console.log('Starting backup...');
|
|
5
|
+
try {
|
|
6
|
+
const { sizeBytes } = await pushBackupToBackend();
|
|
7
|
+
const sizeMb = (sizeBytes / 1024 / 1024).toFixed(2);
|
|
8
|
+
console.log(`Backup complete — ${sizeMb} MB.`);
|
|
59
9
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
console.log(`Uploading via API...`);
|
|
64
|
-
const fileBuffer = await fs.readFile(archivePath);
|
|
65
|
-
const uploadRes = await fetch(apiUploadUrl, {
|
|
66
|
-
method: 'POST',
|
|
67
|
-
headers: { 'Content-Type': 'application/gzip', Authorization: `Bearer ${token}` },
|
|
68
|
-
body: fileBuffer,
|
|
69
|
-
signal: AbortSignal.timeout(120_000),
|
|
70
|
-
});
|
|
71
|
-
await fs.unlink(archivePath).catch(() => { });
|
|
72
|
-
if (!uploadRes.ok) {
|
|
73
|
-
const text = await uploadRes.text().catch(() => '');
|
|
74
|
-
console.error(`Upload failed: ${uploadRes.status} ${text}`);
|
|
75
|
-
process.exit(1);
|
|
76
|
-
}
|
|
10
|
+
catch (e) {
|
|
11
|
+
console.error(toErrorMessage(e));
|
|
12
|
+
process.exit(1);
|
|
77
13
|
}
|
|
78
|
-
console.log(`Backup complete — ${sizeMb} MB.`);
|
|
79
14
|
}
|
|
80
15
|
//# sourceMappingURL=backup-cli.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup-cli.js","sourceRoot":"","sources":["../../src/commands/backup-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"backup-cli.js","sourceRoot":"","sources":["../../src/commands/backup-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAElC,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,CAAC,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,MAAM,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -1,51 +1,14 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import { getWorkspaceDir } from '../workspace.js';
|
|
4
|
-
import { requireEnv } from '../utils/env.js';
|
|
5
|
-
const FIXED_FILES = ['SOUL.md', 'MEMORY.md', 'AGENTS.md', 'TOOLS.md', 'HEARTBEAT.md', 'USER.md'];
|
|
1
|
+
import { pushKnowledgeToBackend } from '../utils/knowledge-push.js';
|
|
2
|
+
import { toErrorMessage } from '../utils/response.js';
|
|
6
3
|
export async function runKnowledgeSync() {
|
|
7
|
-
|
|
8
|
-
const agentToken = requireEnv('AGENT_TOKEN');
|
|
9
|
-
const agentId = requireEnv('AGENT_ID');
|
|
10
|
-
const workspaceDir = getWorkspaceDir();
|
|
11
|
-
const filePaths = [...FIXED_FILES];
|
|
12
|
-
// Scan memory/ directory for .md files
|
|
13
|
-
const memoryDir = path.join(workspaceDir, 'memory');
|
|
4
|
+
console.log('Starting knowledge sync...');
|
|
14
5
|
try {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
if (entry.endsWith('.md'))
|
|
18
|
-
filePaths.push(`memory/${entry}`);
|
|
19
|
-
}
|
|
6
|
+
const { filesRead, filesUpdated } = await pushKnowledgeToBackend();
|
|
7
|
+
console.log(`Knowledge sync complete — ${filesUpdated}/${filesRead} files updated.`);
|
|
20
8
|
}
|
|
21
|
-
catch {
|
|
22
|
-
|
|
23
|
-
console.log(`Reading ${filePaths.length} files from workspace...`);
|
|
24
|
-
const files = [];
|
|
25
|
-
for (const filePath of filePaths) {
|
|
26
|
-
try {
|
|
27
|
-
const content = await fs.readFile(path.join(workspaceDir, filePath), 'utf-8');
|
|
28
|
-
files.push({ path: filePath, content });
|
|
29
|
-
}
|
|
30
|
-
catch { /* skip missing */ }
|
|
31
|
-
}
|
|
32
|
-
console.log(` Found ${files.length} files to sync.`);
|
|
33
|
-
// Push to backend
|
|
34
|
-
const res = await fetch(`${backendUrl}/api/internal/agents/${agentId}/knowledge/push`, {
|
|
35
|
-
method: 'POST',
|
|
36
|
-
headers: {
|
|
37
|
-
'Content-Type': 'application/json',
|
|
38
|
-
Authorization: `Bearer ${agentToken}`,
|
|
39
|
-
},
|
|
40
|
-
body: JSON.stringify({ files }),
|
|
41
|
-
signal: AbortSignal.timeout(30_000),
|
|
42
|
-
});
|
|
43
|
-
if (!res.ok) {
|
|
44
|
-
const text = await res.text().catch(() => '');
|
|
45
|
-
console.error(`Knowledge push failed: ${res.status} ${text}`);
|
|
9
|
+
catch (e) {
|
|
10
|
+
console.error(toErrorMessage(e));
|
|
46
11
|
process.exit(1);
|
|
47
12
|
}
|
|
48
|
-
const { filesUpdated } = await res.json();
|
|
49
|
-
console.log(`Knowledge sync complete — ${filesUpdated}/${files.length} files updated.`);
|
|
50
13
|
}
|
|
51
14
|
//# sourceMappingURL=knowledge-sync-cli.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge-sync-cli.js","sourceRoot":"","sources":["../../src/commands/knowledge-sync-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"knowledge-sync-cli.js","sourceRoot":"","sources":["../../src/commands/knowledge-sync-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAE1C,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,sBAAsB,EAAE,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,6BAA6B,YAAY,IAAI,SAAS,iBAAiB,CAAC,CAAC;IACvF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/connection.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { debugLog } from './debug.js';
|
|
2
2
|
import { Centrifuge } from 'centrifuge';
|
|
3
3
|
import WebSocket from 'ws';
|
|
4
|
-
import {
|
|
4
|
+
import { handleDiagnostics } from './handlers/diagnostics.js';
|
|
5
5
|
import { handleRestart } from './handlers/restart.js';
|
|
6
6
|
import { handleDeploy } from './handlers/deploy.js';
|
|
7
7
|
import { handleConfig } from './handlers/config.js';
|
|
@@ -14,19 +14,20 @@ import { handleFileWrite } from './handlers/file-write.js';
|
|
|
14
14
|
import { handleFileDelete } from './handlers/file-delete.js';
|
|
15
15
|
import { handleOnboardingComplete } from './handlers/onboarding.js';
|
|
16
16
|
import { handleKnowledgeSync } from './handlers/knowledge-sync.js';
|
|
17
|
-
import {
|
|
17
|
+
import { handleSelfUpdate } from './handlers/self-update.js';
|
|
18
|
+
import { toErrorMessage } from './utils/response.js';
|
|
18
19
|
// ---------------------------------------------------------------------------
|
|
19
20
|
// Handlers
|
|
20
21
|
// ---------------------------------------------------------------------------
|
|
21
22
|
function buildHandlers(opts) {
|
|
22
23
|
return {
|
|
23
|
-
|
|
24
|
+
diagnostics: handleDiagnostics,
|
|
24
25
|
restart: handleRestart,
|
|
25
26
|
deploy: handleDeploy,
|
|
26
27
|
config: handleConfig,
|
|
27
28
|
pair: handlePair,
|
|
28
29
|
stop: handleStop,
|
|
29
|
-
backup:
|
|
30
|
+
backup: handleBackup,
|
|
30
31
|
package_install: handlePackageInstall,
|
|
31
32
|
file_write: handleFileWrite,
|
|
32
33
|
file_delete: handleFileDelete,
|
|
@@ -35,14 +36,7 @@ function buildHandlers(opts) {
|
|
|
35
36
|
// RACE-3: selfUpdate calls process.exit(0) after npm install, which may interrupt
|
|
36
37
|
// in-flight commands. This is intentional — the agent restarts and resumes from scratch.
|
|
37
38
|
// The backend should handle missing responses for in-flight commands gracefully.
|
|
38
|
-
self_update: (
|
|
39
|
-
.then(() => ({ id: cmd.id, type: cmd.type, success: true, data: {} }))
|
|
40
|
-
.catch((err) => ({
|
|
41
|
-
id: cmd.id,
|
|
42
|
-
type: cmd.type,
|
|
43
|
-
success: false,
|
|
44
|
-
error: err instanceof Error ? err.message : String(err),
|
|
45
|
-
})),
|
|
39
|
+
self_update: handleSelfUpdate(opts.version),
|
|
46
40
|
};
|
|
47
41
|
}
|
|
48
42
|
// ---------------------------------------------------------------------------
|
|
@@ -183,32 +177,33 @@ function attachCommandHandlers(sub, channel, opts) {
|
|
|
183
177
|
// commands execute concurrently, preventing races (dual restart, concurrent exec, etc.)
|
|
184
178
|
let commandQueue = Promise.resolve();
|
|
185
179
|
sub.on('publication', (ctx) => {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
break;
|
|
209
|
-
}
|
|
210
|
-
return;
|
|
180
|
+
console.log(`[WS] Received message on ${channel}:`, JSON.stringify(ctx.data));
|
|
181
|
+
debugLog('connection', 'publication', channel, JSON.stringify(ctx.data).slice(0, 500));
|
|
182
|
+
const raw = ctx.data;
|
|
183
|
+
if (!raw || typeof raw['id'] !== 'string' || typeof raw['type'] !== 'string') {
|
|
184
|
+
console.warn('[WS] Ignoring malformed message (missing id or type):', JSON.stringify(ctx.data));
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const command = raw;
|
|
188
|
+
// Chat commands are stateless and don't conflict with other handlers — run concurrently
|
|
189
|
+
if (command.type === 'chat_list_sessions' || command.type === 'chat_history' || command.type === 'chat_send') {
|
|
190
|
+
const publishFn = async (data) => { await opts.api.publishResponse(opts.agentId, data); };
|
|
191
|
+
console.log(`[WS] Handling chat command: type=${command.type} id=${command.id}`);
|
|
192
|
+
switch (command.type) {
|
|
193
|
+
case 'chat_list_sessions':
|
|
194
|
+
handleChatListSessions(command, publishFn).catch(console.error);
|
|
195
|
+
break;
|
|
196
|
+
case 'chat_history':
|
|
197
|
+
handleChatHistory(command, publishFn).catch(console.error);
|
|
198
|
+
break;
|
|
199
|
+
case 'chat_send':
|
|
200
|
+
handleChatSend(command, publishFn, opts.agentId).catch(console.error);
|
|
201
|
+
break;
|
|
211
202
|
}
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
// RACE-1: All other commands are serialized to prevent concurrent execution races
|
|
206
|
+
commandQueue = commandQueue.then(async () => {
|
|
212
207
|
const handler = handlers[command.type];
|
|
213
208
|
if (!handler) {
|
|
214
209
|
console.error(`[WS] Unknown command type: ${command.type}`);
|
|
@@ -224,18 +219,18 @@ function attachCommandHandlers(sub, channel, opts) {
|
|
|
224
219
|
id: command.id,
|
|
225
220
|
type: command.type,
|
|
226
221
|
success: false,
|
|
227
|
-
error:
|
|
222
|
+
error: toErrorMessage(err),
|
|
228
223
|
};
|
|
229
224
|
try {
|
|
230
225
|
await opts.api.publishResponse(opts.agentId, errorResponse);
|
|
231
226
|
}
|
|
232
227
|
catch (publishErr) {
|
|
233
|
-
console.error('[WS] Failed to publish error response:', publishErr
|
|
228
|
+
console.error('[WS] Failed to publish error response:', toErrorMessage(publishErr));
|
|
234
229
|
}
|
|
235
230
|
}
|
|
236
231
|
}).catch((err) => {
|
|
237
232
|
// Prevent one command failure from breaking the queue for subsequent commands
|
|
238
|
-
console.error('[WS] Unhandled error in command queue:', err
|
|
233
|
+
console.error('[WS] Unhandled error in command queue:', toErrorMessage(err));
|
|
239
234
|
});
|
|
240
235
|
});
|
|
241
236
|
return () => commandQueue;
|
package/dist/connection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAgB,MAAM,YAAY,CAAC;AACtD,OAAO,SAAS,MAAM,IAAI,CAAC;AAE3B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,2 @@
|
|
|
1
1
|
import type { AgentCommand, AgentResponse } from '../types.js';
|
|
2
|
-
|
|
3
|
-
export declare function handleBackup(command: AgentCommand, api: AgentApi, agentId: string): Promise<AgentResponse>;
|
|
2
|
+
export declare function handleBackup(command: AgentCommand): Promise<AgentResponse>;
|
package/dist/handlers/backup.js
CHANGED
|
@@ -1,95 +1,22 @@
|
|
|
1
|
-
import
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { getWorkspaceDir } from '../workspace.js';
|
|
4
|
-
import { createArchive } from '../utils/archive.js';
|
|
1
|
+
import { pushBackupToBackend } from '../utils/backup-push.js';
|
|
5
2
|
import { toErrorMessage } from '../utils/response.js';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
if (method === 'presigned')
|
|
10
|
-
return true;
|
|
11
|
-
if (method === 'api')
|
|
12
|
-
return false;
|
|
13
|
-
return uploadUrl.includes('s3') || uploadUrl.includes('amazonaws');
|
|
14
|
-
}
|
|
15
|
-
export function handleBackup(command, api, agentId) {
|
|
16
|
-
// TYPE-5: validate payload fields before casting to avoid silent null/undefined propagation
|
|
17
|
-
const uploadUrl = typeof command.payload.uploadUrl === 'string' ? command.payload.uploadUrl : '';
|
|
18
|
-
const token = typeof command.payload.token === 'string' ? command.payload.token : undefined;
|
|
19
|
-
const method = typeof command.payload.method === 'string' ? command.payload.method : undefined;
|
|
20
|
-
const snapshotId = typeof command.payload.snapshotId === 'string' ? command.payload.snapshotId : undefined;
|
|
21
|
-
if (!uploadUrl) {
|
|
22
|
-
return Promise.resolve({
|
|
23
|
-
id: command.id,
|
|
24
|
-
type: 'backup',
|
|
25
|
-
success: false,
|
|
26
|
-
error: 'Missing "uploadUrl" in payload',
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
const presigned = isPresigned(uploadUrl, method);
|
|
30
|
-
const timestamp = Date.now();
|
|
31
|
-
const filename = `backup-${timestamp}.tar.gz`;
|
|
32
|
-
const archivePath = path.join(BACKUP_DIR, filename);
|
|
33
|
-
return createArchive(archivePath, getWorkspaceDir())
|
|
34
|
-
.then(() => uploadArchive(archivePath, uploadUrl, presigned ? undefined : token, presigned))
|
|
35
|
-
.then(async (sizeBytes) => {
|
|
36
|
-
await cleanup(archivePath);
|
|
37
|
-
if (presigned && snapshotId) {
|
|
38
|
-
await notifyComplete(snapshotId, sizeBytes, api, agentId);
|
|
39
|
-
}
|
|
3
|
+
export async function handleBackup(command) {
|
|
4
|
+
try {
|
|
5
|
+
const { snapshotId, sizeBytes } = await pushBackupToBackend();
|
|
40
6
|
return {
|
|
41
7
|
id: command.id,
|
|
42
8
|
type: 'backup',
|
|
43
9
|
success: true,
|
|
44
|
-
data: {
|
|
10
|
+
data: { snapshotId, sizeBytes },
|
|
45
11
|
};
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
await cleanup(archivePath);
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
49
14
|
return {
|
|
50
15
|
id: command.id,
|
|
51
16
|
type: 'backup',
|
|
52
17
|
success: false,
|
|
53
18
|
error: toErrorMessage(err),
|
|
54
19
|
};
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
async function uploadArchive(archivePath, uploadUrl, token, presigned = false) {
|
|
58
|
-
const stat = await fs.stat(archivePath);
|
|
59
|
-
const headers = {
|
|
60
|
-
'Content-Type': 'application/gzip',
|
|
61
|
-
'Content-Length': String(stat.size),
|
|
62
|
-
};
|
|
63
|
-
if (!presigned && token) {
|
|
64
|
-
headers['Authorization'] = `Bearer ${token}`;
|
|
65
|
-
}
|
|
66
|
-
// Read file into buffer — S3 presigned PUT rejects Transfer-Encoding: chunked
|
|
67
|
-
const body = await fs.readFile(archivePath);
|
|
68
|
-
const response = await fetch(uploadUrl, {
|
|
69
|
-
method: presigned ? 'PUT' : 'POST',
|
|
70
|
-
headers,
|
|
71
|
-
body,
|
|
72
|
-
signal: AbortSignal.timeout(UPLOAD_TIMEOUT),
|
|
73
|
-
});
|
|
74
|
-
if (!response.ok) {
|
|
75
|
-
const text = await response.text().catch(() => '');
|
|
76
|
-
throw new Error(`Upload failed: ${response.status} ${response.statusText} ${text}`);
|
|
77
|
-
}
|
|
78
|
-
return stat.size;
|
|
79
|
-
}
|
|
80
|
-
async function notifyComplete(snapshotId, sizeBytes, api, agentId) {
|
|
81
|
-
const res = await api.post(`/api/internal/agents/${agentId}/backup/complete`, { snapshotId, sizeBytes });
|
|
82
|
-
if (!res.ok) {
|
|
83
|
-
const text = await res.text().catch(() => '');
|
|
84
|
-
throw new Error(`Backup complete notify failed: ${res.status} ${res.statusText} ${text}`);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
async function cleanup(archivePath) {
|
|
88
|
-
try {
|
|
89
|
-
await fs.unlink(archivePath);
|
|
90
|
-
}
|
|
91
|
-
catch {
|
|
92
|
-
// ignore cleanup errors
|
|
93
20
|
}
|
|
94
21
|
}
|
|
95
22
|
//# sourceMappingURL=backup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/handlers/backup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/handlers/backup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAqB;IACtD,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAC9D,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE;SAChC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC;SAC3B,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/handlers/chat.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getChatProvider } from '../openclaw/index.js';
|
|
2
|
+
import { toErrorMessage } from '../utils/response.js';
|
|
2
3
|
export async function handleChatListSessions(command, publish) {
|
|
3
4
|
const provider = getChatProvider();
|
|
4
5
|
if (!provider) {
|
|
@@ -10,7 +11,7 @@ export async function handleChatListSessions(command, publish) {
|
|
|
10
11
|
await publish({ type: 'chat_sessions_response', correlationId: command.id, sessions });
|
|
11
12
|
}
|
|
12
13
|
catch (err) {
|
|
13
|
-
await publish({ type: 'chat_sessions_response', correlationId: command.id, sessions: [], error:
|
|
14
|
+
await publish({ type: 'chat_sessions_response', correlationId: command.id, sessions: [], error: toErrorMessage(err) });
|
|
14
15
|
}
|
|
15
16
|
}
|
|
16
17
|
export async function handleChatHistory(command, publish) {
|
|
@@ -25,7 +26,7 @@ export async function handleChatHistory(command, publish) {
|
|
|
25
26
|
await publish({ type: 'chat_history_response', correlationId: command.id, messages });
|
|
26
27
|
}
|
|
27
28
|
catch (err) {
|
|
28
|
-
await publish({ type: 'chat_history_response', correlationId: command.id, messages: [], error:
|
|
29
|
+
await publish({ type: 'chat_history_response', correlationId: command.id, messages: [], error: toErrorMessage(err) });
|
|
29
30
|
}
|
|
30
31
|
}
|
|
31
32
|
export async function handleChatSend(command, publish, agentId) {
|
|
@@ -56,7 +57,7 @@ export async function handleChatSend(command, publish, agentId) {
|
|
|
56
57
|
});
|
|
57
58
|
}
|
|
58
59
|
catch (err) {
|
|
59
|
-
await publish({ type: 'chat_response', correlationId, sessionKey, text: '', error:
|
|
60
|
+
await publish({ type: 'chat_response', correlationId, sessionKey, text: '', error: toErrorMessage(err) }).catch(() => { });
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
63
|
//# sourceMappingURL=chat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/handlers/chat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/handlers/chat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAqB,EACrB,OAAyC;IAEzC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC;QACnI,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC/C,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAqB,EACrB,OAAyC;IAEzC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,OAAiD,CAAC;IACxF,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC;QAClI,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,KAAK,IAAI,GAAG,CAAC,CAAC;QACrE,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAqB,EACrB,OAAyC,EACzC,OAAe;IAEf,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,OAIjD,CAAC;IACF,MAAM,aAAa,GAAG,OAAO,CAAC,EAAE,CAAC;IAEjC,mBAAmB;IACnB,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAE7E,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC;QACtH,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,WAAW,CAAC;YACzB,UAAU;YACV,IAAI;YACJ,cAAc,EAAE,aAAa;YAC7B,WAAW,EAAE,kDAAkD;YAC/D,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;gBAC7B,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACtG,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;gBAC1B,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACvG,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACvB,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACvG,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC5H,CAAC;AACH,CAAC"}
|
package/dist/handlers/config.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { execGatewayRestart } from '../utils/gateway-restart.js';
|
|
4
|
+
import { toErrorMessage } from '../utils/response.js';
|
|
4
5
|
const CONFIG_DIR = '/etc/openclaw';
|
|
6
|
+
const ALLOWED_CONFIG_FILES = ['openclaw.json', 'openclaw.yaml', 'openclaw.yml'];
|
|
5
7
|
export async function handleConfig(command) {
|
|
6
8
|
const filename = command.payload.filename;
|
|
7
9
|
const content = command.payload.content;
|
|
@@ -13,7 +15,16 @@ export async function handleConfig(command) {
|
|
|
13
15
|
error: 'Missing "filename" or "content" in payload',
|
|
14
16
|
};
|
|
15
17
|
}
|
|
16
|
-
const
|
|
18
|
+
const basename = path.basename(filename);
|
|
19
|
+
if (!ALLOWED_CONFIG_FILES.includes(basename)) {
|
|
20
|
+
return {
|
|
21
|
+
id: command.id,
|
|
22
|
+
type: 'config',
|
|
23
|
+
success: false,
|
|
24
|
+
error: 'Config filename not allowed',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const configPath = path.join(CONFIG_DIR, basename);
|
|
17
28
|
try {
|
|
18
29
|
await fs.mkdir(CONFIG_DIR, { recursive: true });
|
|
19
30
|
await fs.writeFile(configPath, content, 'utf-8');
|
|
@@ -32,7 +43,7 @@ export async function handleConfig(command) {
|
|
|
32
43
|
type: 'config',
|
|
33
44
|
success: false,
|
|
34
45
|
data: { path: configPath, stdout: e.stdout ?? '', stderr: e.stderr ?? '' },
|
|
35
|
-
error:
|
|
46
|
+
error: toErrorMessage(e),
|
|
36
47
|
};
|
|
37
48
|
}
|
|
38
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/handlers/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/handlers/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,UAAU,GAAG,eAAe,CAAC;AAEnC,MAAM,oBAAoB,GAAG,CAAC,eAAe,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;AAEhF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAqB;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAkB,CAAC;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAiB,CAAC;IAElD,IAAI,CAAC,QAAQ,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,4CAA4C;SACpD,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEzC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7C,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,6BAA6B;SACrC,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAC;QACtD,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE;SAC3C,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAAmD,CAAC;QAC9D,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE;YAC1E,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;SACzB,CAAC;IACJ,CAAC;AACH,CAAC"}
|