@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.
Files changed (65) hide show
  1. package/dist/commands/backup-cli.js +10 -75
  2. package/dist/commands/backup-cli.js.map +1 -1
  3. package/dist/commands/knowledge-sync-cli.js +7 -44
  4. package/dist/commands/knowledge-sync-cli.js.map +1 -1
  5. package/dist/connection.js +35 -40
  6. package/dist/connection.js.map +1 -1
  7. package/dist/handlers/backup.d.ts +1 -2
  8. package/dist/handlers/backup.js +7 -80
  9. package/dist/handlers/backup.js.map +1 -1
  10. package/dist/handlers/chat.js +4 -3
  11. package/dist/handlers/chat.js.map +1 -1
  12. package/dist/handlers/config.js +13 -2
  13. package/dist/handlers/config.js.map +1 -1
  14. package/dist/handlers/diagnostics.d.ts +2 -0
  15. package/dist/handlers/diagnostics.js +50 -0
  16. package/dist/handlers/diagnostics.js.map +1 -0
  17. package/dist/handlers/knowledge-sync.js +25 -56
  18. package/dist/handlers/knowledge-sync.js.map +1 -1
  19. package/dist/handlers/onboarding.js +3 -21
  20. package/dist/handlers/onboarding.js.map +1 -1
  21. package/dist/handlers/package-install.js +17 -3
  22. package/dist/handlers/package-install.js.map +1 -1
  23. package/dist/handlers/restart.js +3 -21
  24. package/dist/handlers/restart.js.map +1 -1
  25. package/dist/handlers/self-update.d.ts +2 -0
  26. package/dist/handlers/self-update.js +14 -0
  27. package/dist/handlers/self-update.js.map +1 -0
  28. package/dist/heartbeat.js +0 -4
  29. package/dist/heartbeat.js.map +1 -1
  30. package/dist/index.js +2 -2
  31. package/dist/index.js.map +1 -1
  32. package/dist/openclaw/gateway-adapter.d.ts +1 -0
  33. package/dist/openclaw/gateway-adapter.js +37 -7
  34. package/dist/openclaw/gateway-adapter.js.map +1 -1
  35. package/dist/platform/common.d.ts +1 -0
  36. package/dist/platform/common.js +10 -1
  37. package/dist/platform/common.js.map +1 -1
  38. package/dist/platform/linux.d.ts +1 -1
  39. package/dist/platform/linux.js +1 -8
  40. package/dist/platform/linux.js.map +1 -1
  41. package/dist/platform/macos.d.ts +1 -1
  42. package/dist/platform/macos.js +1 -8
  43. package/dist/platform/macos.js.map +1 -1
  44. package/dist/platform/windows.d.ts +1 -1
  45. package/dist/platform/windows.js +1 -8
  46. package/dist/platform/windows.js.map +1 -1
  47. package/dist/types.d.ts +1 -1
  48. package/dist/utils/archive.js +2 -2
  49. package/dist/utils/archive.js.map +1 -1
  50. package/dist/utils/backup-push.d.ts +16 -0
  51. package/dist/utils/backup-push.js +95 -0
  52. package/dist/utils/backup-push.js.map +1 -0
  53. package/dist/utils/env.d.ts +1 -0
  54. package/dist/utils/env.js +3 -0
  55. package/dist/utils/env.js.map +1 -1
  56. package/dist/utils/gateway-restart-handler.d.ts +6 -0
  57. package/dist/utils/gateway-restart-handler.js +27 -0
  58. package/dist/utils/gateway-restart-handler.js.map +1 -0
  59. package/dist/utils/knowledge-push.d.ts +8 -0
  60. package/dist/utils/knowledge-push.js +103 -0
  61. package/dist/utils/knowledge-push.js.map +1 -0
  62. package/package.json +1 -1
  63. package/dist/handlers/exec.d.ts +0 -2
  64. package/dist/handlers/exec.js +0 -29
  65. package/dist/handlers/exec.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import type { PlatformConfig } from './common.js';
1
+ import { type PlatformConfig } from './common.js';
2
2
  export type { PlatformConfig };
3
3
  export declare function installWindows(config: PlatformConfig): Promise<void>;
4
4
  export declare function uninstallWindows(): Promise<void>;
@@ -1,14 +1,7 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import { join } from 'node:path';
3
3
  import { execAsync } from '../utils/exec.js';
4
- async function which(bin) {
5
- try {
6
- return await execAsync(`where "${bin}"`);
7
- }
8
- catch {
9
- return '';
10
- }
11
- }
4
+ import { which } from './common.js';
12
5
  export async function installWindows(config) {
13
6
  const appData = process.env['APPDATA'] ?? join(process.env['USERPROFILE'] ?? 'C:\\Users\\Default', 'AppData', 'Roaming');
14
7
  const openclawDir = join(appData, 'openclaw');
@@ -1 +1 @@
1
- {"version":3,"file":"windows.js","sourceRoot":"","sources":["../../src/platform/windows.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"windows.js","sourceRoot":"","sources":["../../src/platform/windows.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  * agent:<agentId> — commands from backend, responses from agent
4
4
  * heartbeat:<agentId> — heartbeat publications from agent
5
5
  */
6
- export type CommandType = 'exec' | 'restart' | 'deploy' | 'config' | 'pair' | 'stop' | 'backup' | 'chat_list_sessions' | 'chat_history' | 'chat_send' | 'package_install' | 'file_write' | 'file_delete' | 'onboarding_complete' | 'knowledge_sync' | 'self_update';
6
+ export type CommandType = 'diagnostics' | 'restart' | 'deploy' | 'config' | 'pair' | 'stop' | 'backup' | 'chat_list_sessions' | 'chat_history' | 'chat_send' | 'package_install' | 'file_write' | 'file_delete' | 'onboarding_complete' | 'knowledge_sync' | 'self_update';
7
7
  export interface AgentCommand {
8
8
  id: string;
9
9
  type: CommandType;
@@ -1,9 +1,9 @@
1
- import { exec } from 'node:child_process';
1
+ import { execFile } from 'node:child_process';
2
2
  import path from 'node:path';
3
3
  const TAR_TIMEOUT = 120_000;
4
4
  export function createArchive(archivePath, workspaceDir) {
5
5
  return new Promise((resolve, reject) => {
6
- exec(`tar -czf ${archivePath} -C ${path.dirname(workspaceDir)} ${path.basename(workspaceDir)}`, { timeout: TAR_TIMEOUT }, (error, _stdout, stderr) => {
6
+ execFile('tar', ['-czf', archivePath, '-C', path.dirname(workspaceDir), path.basename(workspaceDir)], { timeout: TAR_TIMEOUT }, (error, _stdout, stderr) => {
7
7
  if (error) {
8
8
  reject(new Error(`tar failed: ${stderr.toString() || error.message}`));
9
9
  }
@@ -1 +1 @@
1
- {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/utils/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,WAAW,GAAG,OAAO,CAAC;AAE5B,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,YAAoB;IACrE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,CACF,YAAY,WAAW,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,EACzF,EAAE,OAAO,EAAE,WAAW,EAAE,EACxB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;YACzB,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,MAAM,CAAC,QAAQ,EAAE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACzE,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/utils/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,WAAW,GAAG,OAAO,CAAC;AAE5B,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,YAAoB;IACrE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,QAAQ,CACN,KAAK,EACL,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EACpF,EAAE,OAAO,EAAE,WAAW,EAAE,EACxB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;YACzB,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,MAAM,CAAC,QAAQ,EAAE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACzE,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,16 @@
1
+ interface BackupResult {
2
+ snapshotId: string;
3
+ sizeBytes: number;
4
+ }
5
+ /**
6
+ * Create a workspace backup and upload it to backend.
7
+ * Used by both CLI command and Centrifugo handler.
8
+ *
9
+ * Flow:
10
+ * 1. Request init from backend → get uploadUrl, snapshotId, method
11
+ * 2. Create tar.gz archive of workspace
12
+ * 3. Upload archive via stream (presigned S3 PUT or backend API)
13
+ * 4. Notify backend of completion (for presigned uploads)
14
+ */
15
+ export declare function pushBackupToBackend(): Promise<BackupResult>;
16
+ export {};
@@ -0,0 +1,95 @@
1
+ import fs from 'node:fs/promises';
2
+ import { createReadStream } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { getWorkspaceDir } from '../workspace.js';
5
+ import { requireEnv, getBackendUrl } from './env.js';
6
+ import { createArchive } from './archive.js';
7
+ const UPLOAD_TIMEOUT = 300_000; // 5 min
8
+ /**
9
+ * Create a workspace backup and upload it to backend.
10
+ * Used by both CLI command and Centrifugo handler.
11
+ *
12
+ * Flow:
13
+ * 1. Request init from backend → get uploadUrl, snapshotId, method
14
+ * 2. Create tar.gz archive of workspace
15
+ * 3. Upload archive via stream (presigned S3 PUT or backend API)
16
+ * 4. Notify backend of completion (for presigned uploads)
17
+ */
18
+ export async function pushBackupToBackend() {
19
+ const backendUrl = getBackendUrl();
20
+ const agentToken = requireEnv('AGENT_TOKEN');
21
+ const agentId = requireEnv('AGENT_ID');
22
+ // Step 1: Init — get upload details from backend
23
+ const initRes = await fetch(`${backendUrl}/api/internal/agents/${agentId}/backup/init`, {
24
+ method: 'POST',
25
+ headers: { Authorization: `Bearer ${agentToken}` },
26
+ signal: AbortSignal.timeout(30_000),
27
+ });
28
+ if (!initRes.ok) {
29
+ const text = await initRes.text().catch(() => '');
30
+ throw new Error(`Backup init failed: ${initRes.status} ${text}`);
31
+ }
32
+ const { snapshotId, uploadUrl, token, method } = (await initRes.json());
33
+ // Step 2: Create archive
34
+ const archivePath = path.join('/tmp', `backup-${Date.now()}.tar.gz`);
35
+ try {
36
+ await createArchive(archivePath, getWorkspaceDir());
37
+ const stat = await fs.stat(archivePath);
38
+ // Step 3: Upload via stream
39
+ if (method === 'presigned') {
40
+ const stream = createReadStream(archivePath);
41
+ // Node.js fetch accepts ReadStream as body; cast needed for TS DOM types
42
+ const uploadInit = {
43
+ method: 'PUT',
44
+ headers: { 'Content-Type': 'application/gzip', 'Content-Length': String(stat.size) },
45
+ body: stream,
46
+ duplex: 'half',
47
+ signal: AbortSignal.timeout(UPLOAD_TIMEOUT),
48
+ };
49
+ const uploadRes = await fetch(uploadUrl, uploadInit);
50
+ if (!uploadRes.ok) {
51
+ const text = await uploadRes.text().catch(() => '');
52
+ throw new Error(`S3 upload failed: ${uploadRes.status} ${text}`);
53
+ }
54
+ // Step 4: Notify backend
55
+ const completeRes = await fetch(`${backendUrl}/api/internal/agents/${agentId}/backup/complete`, {
56
+ method: 'POST',
57
+ headers: {
58
+ 'Content-Type': 'application/json',
59
+ Authorization: `Bearer ${agentToken}`,
60
+ },
61
+ body: JSON.stringify({ snapshotId, sizeBytes: stat.size }),
62
+ signal: AbortSignal.timeout(30_000),
63
+ });
64
+ if (!completeRes.ok) {
65
+ const text = await completeRes.text().catch(() => '');
66
+ throw new Error(`Backup complete notification failed: ${completeRes.status} ${text}`);
67
+ }
68
+ }
69
+ else {
70
+ // Fallback: upload through backend API (local storage)
71
+ const stream = createReadStream(archivePath);
72
+ const uploadInit = {
73
+ method: 'POST',
74
+ headers: {
75
+ 'Content-Type': 'application/gzip',
76
+ 'Content-Length': String(stat.size),
77
+ Authorization: `Bearer ${token}`,
78
+ },
79
+ body: stream,
80
+ duplex: 'half',
81
+ signal: AbortSignal.timeout(UPLOAD_TIMEOUT),
82
+ };
83
+ const uploadRes = await fetch(`${backendUrl}/api/internal/agents/${agentId}/knowledge/upload?snapshotId=${snapshotId}`, uploadInit);
84
+ if (!uploadRes.ok) {
85
+ const text = await uploadRes.text().catch(() => '');
86
+ throw new Error(`Upload failed: ${uploadRes.status} ${text}`);
87
+ }
88
+ }
89
+ return { snapshotId, sizeBytes: stat.size };
90
+ }
91
+ finally {
92
+ await fs.unlink(archivePath).catch(() => { });
93
+ }
94
+ }
95
+ //# sourceMappingURL=backup-push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup-push.js","sourceRoot":"","sources":["../../src/utils/backup-push.ts"],"names":[],"mappings":"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"}
@@ -1 +1,2 @@
1
1
  export declare function requireEnv(name: string): string;
2
+ export declare function getBackendUrl(): string;
package/dist/utils/env.js CHANGED
@@ -6,4 +6,7 @@ export function requireEnv(name) {
6
6
  }
7
7
  return value;
8
8
  }
9
+ export function getBackendUrl() {
10
+ return process.env.BACKEND_URL || process.env.BACKEND_INTERNAL_URL || requireEnv('BACKEND_URL');
11
+ }
9
12
  //# sourceMappingURL=env.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC;AAClG,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { AgentCommand, AgentResponse } from '../types.js';
2
+ /**
3
+ * Shared handler logic for commands that restart the OpenClaw gateway.
4
+ * Used by handleRestart and handleOnboardingComplete.
5
+ */
6
+ export declare function handleGatewayRestartCommand(command: AgentCommand): Promise<AgentResponse>;
@@ -0,0 +1,27 @@
1
+ import { execGatewayRestart } from './gateway-restart.js';
2
+ /**
3
+ * Shared handler logic for commands that restart the OpenClaw gateway.
4
+ * Used by handleRestart and handleOnboardingComplete.
5
+ */
6
+ export async function handleGatewayRestartCommand(command) {
7
+ try {
8
+ const { stdout, stderr } = await execGatewayRestart();
9
+ return {
10
+ id: command.id,
11
+ type: command.type,
12
+ success: true,
13
+ data: { stdout, stderr },
14
+ };
15
+ }
16
+ catch (err) {
17
+ const e = err;
18
+ return {
19
+ id: command.id,
20
+ type: command.type,
21
+ success: false,
22
+ data: { stdout: e.stdout ?? '', stderr: e.stderr ?? '' },
23
+ error: e.message,
24
+ };
25
+ }
26
+ }
27
+ //# sourceMappingURL=gateway-restart-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-restart-handler.js","sourceRoot":"","sources":["../../src/utils/gateway-restart-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAAqB;IACrE,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAC;QACtD,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;SACzB,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,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE;YACxD,KAAK,EAAE,CAAC,CAAC,OAAO;SACjB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Push knowledge files to backend via HTTP.
3
+ * Used by both CLI command and Centrifugo handler.
4
+ */
5
+ export declare function pushKnowledgeToBackend(paths?: string[]): Promise<{
6
+ filesRead: number;
7
+ filesUpdated: number;
8
+ }>;
@@ -0,0 +1,103 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { getWorkspaceDir } from '../workspace.js';
4
+ import { requireEnv, getBackendUrl } from './env.js';
5
+ const FIXED_FILES = [
6
+ 'SOUL.md',
7
+ 'MEMORY.md',
8
+ 'AGENTS.md',
9
+ 'TOOLS.md',
10
+ 'HEARTBEAT.md',
11
+ 'USER.md',
12
+ 'IDENTITY.md',
13
+ ];
14
+ const MAX_FILE_BYTES = 1_048_576; // 1 MB per file
15
+ const MAX_TOTAL_BYTES = 10_485_760; // 10 MB total payload
16
+ /**
17
+ * Resolve requested paths to actual file paths in workspace.
18
+ * Paths ending with '/' are treated as directories — scanned for .md files.
19
+ */
20
+ async function resolvePaths(workspaceDir, paths) {
21
+ const resolved = [];
22
+ for (const p of paths) {
23
+ if (p.endsWith('/')) {
24
+ const dir = path.join(workspaceDir, p);
25
+ try {
26
+ const entries = await fs.readdir(dir);
27
+ for (const entry of entries) {
28
+ if (entry.endsWith('.md'))
29
+ resolved.push(path.join(p, entry));
30
+ }
31
+ }
32
+ catch {
33
+ // Directory doesn't exist — skip
34
+ }
35
+ }
36
+ else {
37
+ resolved.push(p);
38
+ }
39
+ }
40
+ return resolved;
41
+ }
42
+ /**
43
+ * Read workspace files with size limits.
44
+ */
45
+ async function readFiles(workspaceDir, filePaths) {
46
+ const files = [];
47
+ let totalBytes = 0;
48
+ for (const filePath of filePaths) {
49
+ if (totalBytes >= MAX_TOTAL_BYTES) {
50
+ console.warn(`[knowledge-push] Total payload limit (${MAX_TOTAL_BYTES / 1024 / 1024} MB) reached, skipping remaining files`);
51
+ break;
52
+ }
53
+ try {
54
+ const fullPath = path.join(workspaceDir, filePath);
55
+ const stat = await fs.stat(fullPath).catch(() => null);
56
+ if (!stat || !stat.isFile() || stat.size > MAX_FILE_BYTES) {
57
+ if (stat && stat.isFile()) {
58
+ console.warn(`[knowledge-push] Skipping ${filePath}: file too large (${stat.size} bytes)`);
59
+ }
60
+ continue;
61
+ }
62
+ const content = await fs.readFile(fullPath, 'utf-8');
63
+ totalBytes += Buffer.byteLength(content, 'utf-8');
64
+ files.push({ path: filePath, content });
65
+ }
66
+ catch {
67
+ // File doesn't exist or unreadable — skip
68
+ }
69
+ }
70
+ return files;
71
+ }
72
+ /**
73
+ * Push knowledge files to backend via HTTP.
74
+ * Used by both CLI command and Centrifugo handler.
75
+ */
76
+ export async function pushKnowledgeToBackend(paths) {
77
+ const backendUrl = getBackendUrl();
78
+ const agentToken = requireEnv('AGENT_TOKEN');
79
+ const agentId = requireEnv('AGENT_ID');
80
+ const requestedPaths = paths ?? [...FIXED_FILES, 'memory/'];
81
+ const workspaceDir = getWorkspaceDir();
82
+ const resolvedPaths = await resolvePaths(workspaceDir, requestedPaths);
83
+ const files = await readFiles(workspaceDir, resolvedPaths);
84
+ if (files.length === 0) {
85
+ return { filesRead: 0, filesUpdated: 0 };
86
+ }
87
+ const res = await fetch(`${backendUrl}/api/internal/agents/${agentId}/knowledge/push`, {
88
+ method: 'POST',
89
+ headers: {
90
+ 'Content-Type': 'application/json',
91
+ Authorization: `Bearer ${agentToken}`,
92
+ },
93
+ body: JSON.stringify({ files }),
94
+ signal: AbortSignal.timeout(30_000),
95
+ });
96
+ if (!res.ok) {
97
+ const text = await res.text().catch(() => '');
98
+ throw new Error(`Knowledge push failed: ${res.status} ${text}`);
99
+ }
100
+ const { filesUpdated } = (await res.json());
101
+ return { filesRead: files.length, filesUpdated };
102
+ }
103
+ //# sourceMappingURL=knowledge-push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-push.js","sourceRoot":"","sources":["../../src/utils/knowledge-push.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw-cloud/agent-controller",
3
- "version": "0.8.1",
3
+ "version": "0.9.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -1,2 +0,0 @@
1
- import type { AgentCommand, AgentResponse } from '../types.js';
2
- export declare function handleExec(command: AgentCommand): Promise<AgentResponse>;
@@ -1,29 +0,0 @@
1
- import { exec } from 'node:child_process';
2
- const EXEC_TIMEOUT = 60_000;
3
- export function handleExec(command) {
4
- const cmd = command.payload.command;
5
- if (!cmd) {
6
- return Promise.resolve({
7
- id: command.id,
8
- type: 'exec',
9
- success: false,
10
- error: 'Missing "command" in payload',
11
- });
12
- }
13
- return new Promise((resolve) => {
14
- exec(cmd, { timeout: EXEC_TIMEOUT }, (error, stdout, stderr) => {
15
- resolve({
16
- id: command.id,
17
- type: 'exec',
18
- success: !error,
19
- data: {
20
- exitCode: error ? (typeof error.code === 'number' ? error.code : 1) : 0,
21
- stdout: stdout.toString(),
22
- stderr: stderr.toString(),
23
- },
24
- ...(error ? { error: error.message } : {}),
25
- });
26
- });
27
- });
28
- }
29
- //# sourceMappingURL=exec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/handlers/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAG1C,MAAM,YAAY,GAAG,MAAM,CAAC;AAE5B,MAAM,UAAU,UAAU,CAAC,OAAqB;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,OAAiB,CAAC;IAC9C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,8BAA8B;SACtC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAC7D,OAAO,CAAC;gBACN,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,CAAC,KAAK;gBACf,IAAI,EAAE;oBACJ,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,KAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrH,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;oBACzB,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;iBAC1B;gBACD,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}