@openclaw-cloud/agent-controller 0.9.0 → 0.9.1
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 +22 -0
- package/dist/api.js +89 -5
- package/dist/api.js.map +1 -1
- package/dist/commands/backup-cli.js +6 -3
- package/dist/commands/backup-cli.js.map +1 -1
- package/dist/commands/bootstrap.js +6 -15
- package/dist/commands/bootstrap.js.map +1 -1
- package/dist/commands/knowledge-sync-cli.js +6 -3
- package/dist/commands/knowledge-sync-cli.js.map +1 -1
- package/dist/connection.js +7 -77
- package/dist/connection.js.map +1 -1
- package/dist/handlers/backup.d.ts +2 -1
- package/dist/handlers/backup.js +2 -2
- package/dist/handlers/backup.js.map +1 -1
- package/dist/handlers/knowledge-sync.d.ts +2 -1
- package/dist/handlers/knowledge-sync.js +3 -4
- package/dist/handlers/knowledge-sync.js.map +1 -1
- package/dist/utils/backup-push.d.ts +5 -4
- package/dist/utils/backup-push.js +9 -62
- package/dist/utils/backup-push.js.map +1 -1
- package/dist/utils/knowledge-push.d.ts +3 -2
- package/dist/utils/knowledge-push.js +3 -20
- package/dist/utils/knowledge-push.js.map +1 -1
- package/package.json +1 -1
package/dist/api.d.ts
CHANGED
|
@@ -1,7 +1,29 @@
|
|
|
1
|
+
export interface BackupInitResult {
|
|
2
|
+
snapshotId: string;
|
|
3
|
+
uploadUrl: string;
|
|
4
|
+
token: string | null;
|
|
5
|
+
method: 'presigned' | 'api';
|
|
6
|
+
}
|
|
7
|
+
export interface BootstrapResult {
|
|
8
|
+
openclawConfig?: Record<string, unknown>;
|
|
9
|
+
workspaceFiles?: Record<string, string>;
|
|
10
|
+
}
|
|
1
11
|
export interface AgentApi {
|
|
2
12
|
get(path: string): Promise<unknown>;
|
|
3
13
|
post(path: string, body?: unknown): Promise<Response>;
|
|
4
14
|
publishResponse(agentId: string, data: unknown): Promise<void>;
|
|
5
15
|
publishHeartbeat(agentId: string, payload: unknown): Promise<void>;
|
|
16
|
+
fetchConnectionToken(agentId: string): Promise<string>;
|
|
17
|
+
fetchSubscriptionToken(agentId: string, channels: string[]): Promise<Record<string, string>>;
|
|
18
|
+
backupInit(agentId: string): Promise<BackupInitResult>;
|
|
19
|
+
backupComplete(agentId: string, snapshotId: string, sizeBytes: number): Promise<void>;
|
|
20
|
+
knowledgePush(agentId: string, files: Array<{
|
|
21
|
+
path: string;
|
|
22
|
+
content: string;
|
|
23
|
+
}>): Promise<{
|
|
24
|
+
filesUpdated: number;
|
|
25
|
+
}>;
|
|
26
|
+
agentBootstrap(agentId: string): Promise<BootstrapResult>;
|
|
27
|
+
uploadRaw(url: string, body: NodeJS.ReadableStream | Buffer | Uint8Array, contentType: string, size: number, timeoutMs?: number): Promise<void>;
|
|
6
28
|
}
|
|
7
29
|
export declare function createAgentApi(backendUrl: string, agentToken: string): AgentApi;
|
package/dist/api.js
CHANGED
|
@@ -1,11 +1,21 @@
|
|
|
1
1
|
import { DEBUG, debugLog } from './debug.js';
|
|
2
|
-
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Timeouts by operation type
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
const TIMEOUT_DEFAULT = 10_000;
|
|
6
|
+
const TIMEOUT_TOKEN = 5_000;
|
|
7
|
+
const TIMEOUT_LONG = 30_000;
|
|
8
|
+
const TIMEOUT_UPLOAD = 300_000; // 5 min
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Implementation
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
3
12
|
export function createAgentApi(backendUrl, agentToken) {
|
|
4
|
-
async function request(method, path, body) {
|
|
13
|
+
async function request(method, path, body, timeoutMs = TIMEOUT_DEFAULT) {
|
|
5
14
|
const controller = new AbortController();
|
|
6
|
-
const timeout = setTimeout(() => controller.abort(),
|
|
15
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
16
|
+
const start = Date.now();
|
|
7
17
|
try {
|
|
8
|
-
debugLog('api',
|
|
18
|
+
debugLog('api', `→ ${method} ${path}`, body ? JSON.stringify(body).slice(0, 500) : '');
|
|
9
19
|
const res = await fetch(`${backendUrl}${path}`, {
|
|
10
20
|
method,
|
|
11
21
|
headers: {
|
|
@@ -15,10 +25,11 @@ export function createAgentApi(backendUrl, agentToken) {
|
|
|
15
25
|
...(body !== undefined ? { body: JSON.stringify(body) } : {}),
|
|
16
26
|
signal: controller.signal,
|
|
17
27
|
});
|
|
28
|
+
const elapsed = Date.now() - start;
|
|
18
29
|
if (DEBUG) {
|
|
19
30
|
const clone = res.clone();
|
|
20
31
|
const bodyText = await clone.text().catch(() => '');
|
|
21
|
-
debugLog('api',
|
|
32
|
+
debugLog('api', `← ${res.status} ${method} ${path} (${bodyText.length}b, ${elapsed}ms)`, bodyText.slice(0, 1000));
|
|
22
33
|
}
|
|
23
34
|
return res;
|
|
24
35
|
}
|
|
@@ -27,6 +38,7 @@ export function createAgentApi(backendUrl, agentToken) {
|
|
|
27
38
|
}
|
|
28
39
|
}
|
|
29
40
|
return {
|
|
41
|
+
// --- Generic ---
|
|
30
42
|
async get(path) {
|
|
31
43
|
const res = await request('GET', path);
|
|
32
44
|
if (!res.ok) {
|
|
@@ -37,6 +49,7 @@ export function createAgentApi(backendUrl, agentToken) {
|
|
|
37
49
|
async post(path, body) {
|
|
38
50
|
return request('POST', path, body);
|
|
39
51
|
},
|
|
52
|
+
// --- Agent responses & heartbeat ---
|
|
40
53
|
async publishResponse(agentId, data) {
|
|
41
54
|
const res = await request('POST', '/api/internal/agent-response', { agentId, data });
|
|
42
55
|
if (!res.ok) {
|
|
@@ -49,6 +62,77 @@ export function createAgentApi(backendUrl, agentToken) {
|
|
|
49
62
|
throw new Error(`publishHeartbeat failed: HTTP ${res.status}`);
|
|
50
63
|
}
|
|
51
64
|
},
|
|
65
|
+
// --- Centrifugo tokens ---
|
|
66
|
+
async fetchConnectionToken(agentId) {
|
|
67
|
+
const res = await request('POST', '/api/internal/centrifugo-token', { agentId }, TIMEOUT_TOKEN);
|
|
68
|
+
if (!res.ok) {
|
|
69
|
+
const body = await res.text().catch(() => '');
|
|
70
|
+
throw new Error(`HTTP ${res.status}: ${body}`);
|
|
71
|
+
}
|
|
72
|
+
const data = await res.json();
|
|
73
|
+
return data.token;
|
|
74
|
+
},
|
|
75
|
+
async fetchSubscriptionToken(agentId, channels) {
|
|
76
|
+
const res = await request('POST', '/api/internal/centrifugo-subscribe-token', { agentId, channels }, TIMEOUT_TOKEN);
|
|
77
|
+
if (!res.ok) {
|
|
78
|
+
const body = await res.text().catch(() => '');
|
|
79
|
+
throw new Error(`HTTP ${res.status}: ${body}`);
|
|
80
|
+
}
|
|
81
|
+
const data = await res.json();
|
|
82
|
+
return data.subscriptions;
|
|
83
|
+
},
|
|
84
|
+
// --- Backup ---
|
|
85
|
+
async backupInit(agentId) {
|
|
86
|
+
const res = await request('POST', `/api/internal/agents/${agentId}/backup/init`, undefined, TIMEOUT_LONG);
|
|
87
|
+
if (!res.ok) {
|
|
88
|
+
const text = await res.text().catch(() => '');
|
|
89
|
+
throw new Error(`Backup init failed: ${res.status} ${text}`);
|
|
90
|
+
}
|
|
91
|
+
return res.json();
|
|
92
|
+
},
|
|
93
|
+
async backupComplete(agentId, snapshotId, sizeBytes) {
|
|
94
|
+
const res = await request('POST', `/api/internal/agents/${agentId}/backup/complete`, { snapshotId, sizeBytes }, TIMEOUT_LONG);
|
|
95
|
+
if (!res.ok) {
|
|
96
|
+
const text = await res.text().catch(() => '');
|
|
97
|
+
throw new Error(`Backup complete failed: ${res.status} ${text}`);
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
// --- Knowledge ---
|
|
101
|
+
async knowledgePush(agentId, files) {
|
|
102
|
+
const res = await request('POST', `/api/internal/agents/${agentId}/knowledge/push`, { files }, TIMEOUT_LONG);
|
|
103
|
+
if (!res.ok) {
|
|
104
|
+
const text = await res.text().catch(() => '');
|
|
105
|
+
throw new Error(`Knowledge push failed: ${res.status} ${text}`);
|
|
106
|
+
}
|
|
107
|
+
return res.json();
|
|
108
|
+
},
|
|
109
|
+
// --- Bootstrap ---
|
|
110
|
+
async agentBootstrap(agentId) {
|
|
111
|
+
const res = await request('GET', `/api/internal/agent-bootstrap/${agentId}`, undefined, TIMEOUT_LONG);
|
|
112
|
+
if (!res.ok) {
|
|
113
|
+
const body = await res.text().catch(() => '');
|
|
114
|
+
throw new Error(`Bootstrap API failed: HTTP ${res.status} ${body}`);
|
|
115
|
+
}
|
|
116
|
+
return res.json();
|
|
117
|
+
},
|
|
118
|
+
// --- Raw upload (S3 presigned or backend API fallback) ---
|
|
119
|
+
async uploadRaw(url, body, contentType, size, timeoutMs = TIMEOUT_UPLOAD) {
|
|
120
|
+
const start = Date.now();
|
|
121
|
+
debugLog('api', `→ PUT ${url.slice(0, 80)}... (${size}b)`);
|
|
122
|
+
const res = await fetch(url, {
|
|
123
|
+
method: 'PUT',
|
|
124
|
+
headers: { 'Content-Type': contentType, 'Content-Length': String(size) },
|
|
125
|
+
body: body,
|
|
126
|
+
duplex: 'half',
|
|
127
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
128
|
+
});
|
|
129
|
+
const elapsed = Date.now() - start;
|
|
130
|
+
debugLog('api', `← ${res.status} PUT upload (${elapsed}ms)`);
|
|
131
|
+
if (!res.ok) {
|
|
132
|
+
const text = await res.text().catch(() => '');
|
|
133
|
+
throw new Error(`Upload failed: ${res.status} ${text}`);
|
|
134
|
+
}
|
|
135
|
+
},
|
|
52
136
|
};
|
|
53
137
|
}
|
|
54
138
|
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
|
+
import { createAgentApi } from '../api.js';
|
|
2
|
+
import { getBackendUrl, requireEnv } from '../utils/env.js';
|
|
1
3
|
import { pushBackupToBackend } from '../utils/backup-push.js';
|
|
2
|
-
import { toErrorMessage } from '../utils/response.js';
|
|
3
4
|
export async function runBackup() {
|
|
4
5
|
console.log('Starting backup...');
|
|
6
|
+
const api = createAgentApi(getBackendUrl(), requireEnv('AGENT_TOKEN'));
|
|
7
|
+
const agentId = requireEnv('AGENT_ID');
|
|
5
8
|
try {
|
|
6
|
-
const { sizeBytes } = await pushBackupToBackend();
|
|
9
|
+
const { sizeBytes } = await pushBackupToBackend(api, agentId);
|
|
7
10
|
const sizeMb = (sizeBytes / 1024 / 1024).toFixed(2);
|
|
8
11
|
console.log(`Backup complete — ${sizeMb} MB.`);
|
|
9
12
|
}
|
|
10
13
|
catch (e) {
|
|
11
|
-
console.error(
|
|
14
|
+
console.error(e instanceof Error ? e.message : String(e));
|
|
12
15
|
process.exit(1);
|
|
13
16
|
}
|
|
14
17
|
}
|
|
@@ -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,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAElC,MAAM,GAAG,GAAG,cAAc,CAAC,aAAa,EAAE,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9D,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,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import os from 'node:os';
|
|
4
|
-
import {
|
|
4
|
+
import { createAgentApi } from '../api.js';
|
|
5
|
+
import { getBackendUrl, requireEnv } from '../utils/env.js';
|
|
5
6
|
export async function bootstrap() {
|
|
6
|
-
const backendUrl =
|
|
7
|
+
const backendUrl = getBackendUrl();
|
|
7
8
|
const agentToken = requireEnv('AGENT_TOKEN');
|
|
8
9
|
const agentId = requireEnv('AGENT_ID');
|
|
9
10
|
const openclawDir = process.env.OPENCLAW_STATE_DIR?.trim() ?? path.join(os.homedir(), '.openclaw');
|
|
@@ -11,23 +12,13 @@ export async function bootstrap() {
|
|
|
11
12
|
console.log(`Bootstrapping agent ${agentId}...`);
|
|
12
13
|
console.log(` Backend: ${backendUrl}`);
|
|
13
14
|
console.log(` OpenClaw dir: ${openclawDir}`);
|
|
14
|
-
|
|
15
|
-
const url = `${backendUrl}/api/internal/agent-bootstrap/${agentId}`;
|
|
15
|
+
const api = createAgentApi(backendUrl, agentToken);
|
|
16
16
|
let data;
|
|
17
17
|
try {
|
|
18
|
-
|
|
19
|
-
headers: { Authorization: `Bearer ${agentToken}` },
|
|
20
|
-
signal: AbortSignal.timeout(30_000),
|
|
21
|
-
});
|
|
22
|
-
if (!res.ok) {
|
|
23
|
-
const body = await res.text().catch(() => '');
|
|
24
|
-
console.error(`Bootstrap API failed: HTTP ${res.status} ${body}`);
|
|
25
|
-
process.exit(1);
|
|
26
|
-
}
|
|
27
|
-
data = await res.json();
|
|
18
|
+
data = await api.agentBootstrap(agentId);
|
|
28
19
|
}
|
|
29
20
|
catch (err) {
|
|
30
|
-
console.error('Bootstrap
|
|
21
|
+
console.error('Bootstrap failed:', err instanceof Error ? err.message : err);
|
|
31
22
|
process.exit(1);
|
|
32
23
|
return;
|
|
33
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
+
import { createAgentApi } from '../api.js';
|
|
2
|
+
import { getBackendUrl, requireEnv } from '../utils/env.js';
|
|
1
3
|
import { pushKnowledgeToBackend } from '../utils/knowledge-push.js';
|
|
2
|
-
import { toErrorMessage } from '../utils/response.js';
|
|
3
4
|
export async function runKnowledgeSync() {
|
|
4
5
|
console.log('Starting knowledge sync...');
|
|
6
|
+
const api = createAgentApi(getBackendUrl(), requireEnv('AGENT_TOKEN'));
|
|
7
|
+
const agentId = requireEnv('AGENT_ID');
|
|
5
8
|
try {
|
|
6
|
-
const { filesRead, filesUpdated } = await pushKnowledgeToBackend();
|
|
9
|
+
const { filesRead, filesUpdated } = await pushKnowledgeToBackend(api, agentId);
|
|
7
10
|
console.log(`Knowledge sync complete — ${filesUpdated}/${filesRead} files updated.`);
|
|
8
11
|
}
|
|
9
12
|
catch (e) {
|
|
10
|
-
console.error(
|
|
13
|
+
console.error(e instanceof Error ? e.message : String(e));
|
|
11
14
|
process.exit(1);
|
|
12
15
|
}
|
|
13
16
|
}
|
|
@@ -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,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAE1C,MAAM,GAAG,GAAG,cAAc,CAAC,aAAa,EAAE,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,6BAA6B,YAAY,IAAI,SAAS,iBAAiB,CAAC,CAAC;IACvF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/connection.js
CHANGED
|
@@ -27,90 +27,28 @@ function buildHandlers(opts) {
|
|
|
27
27
|
config: handleConfig,
|
|
28
28
|
pair: handlePair,
|
|
29
29
|
stop: handleStop,
|
|
30
|
-
backup: handleBackup,
|
|
30
|
+
backup: (cmd) => handleBackup(cmd, opts.api, opts.agentId),
|
|
31
31
|
package_install: handlePackageInstall,
|
|
32
32
|
file_write: handleFileWrite,
|
|
33
33
|
file_delete: handleFileDelete,
|
|
34
34
|
onboarding_complete: handleOnboardingComplete,
|
|
35
|
-
knowledge_sync: handleKnowledgeSync,
|
|
36
|
-
// RACE-3: selfUpdate calls process.exit(0) after npm install, which may interrupt
|
|
37
|
-
// in-flight commands. This is intentional — the agent restarts and resumes from scratch.
|
|
38
|
-
// The backend should handle missing responses for in-flight commands gracefully.
|
|
35
|
+
knowledge_sync: (cmd) => handleKnowledgeSync(cmd, opts.api, opts.agentId),
|
|
39
36
|
self_update: handleSelfUpdate(opts.version),
|
|
40
37
|
};
|
|
41
38
|
}
|
|
42
39
|
// ---------------------------------------------------------------------------
|
|
43
|
-
// Token helpers
|
|
44
|
-
// ---------------------------------------------------------------------------
|
|
45
|
-
async function fetchConnectionToken(backendUrl, agentToken, agentId) {
|
|
46
|
-
debugLog('api', '→ POST /api/internal/centrifugo-token', JSON.stringify({ agentId }));
|
|
47
|
-
const controller = new AbortController();
|
|
48
|
-
const timeout = setTimeout(() => controller.abort(), 5000);
|
|
49
|
-
try {
|
|
50
|
-
const res = await fetch(`${backendUrl}/api/internal/centrifugo-token`, {
|
|
51
|
-
method: 'POST',
|
|
52
|
-
headers: {
|
|
53
|
-
'Content-Type': 'application/json',
|
|
54
|
-
'Authorization': `Bearer ${agentToken}`,
|
|
55
|
-
},
|
|
56
|
-
body: JSON.stringify({ agentId }),
|
|
57
|
-
signal: controller.signal,
|
|
58
|
-
});
|
|
59
|
-
const body = await res.text();
|
|
60
|
-
debugLog('api', `← POST /api/internal/centrifugo-token ${res.status}`, body.slice(0, 200));
|
|
61
|
-
if (!res.ok) {
|
|
62
|
-
throw new Error(`HTTP ${res.status}: ${body}`);
|
|
63
|
-
}
|
|
64
|
-
const data = JSON.parse(body);
|
|
65
|
-
return data.token;
|
|
66
|
-
}
|
|
67
|
-
finally {
|
|
68
|
-
clearTimeout(timeout);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
async function fetchSubscriptionToken(backendUrl, agentToken, agentId, channels) {
|
|
72
|
-
debugLog('api', '→ POST /api/internal/centrifugo-subscribe-token', JSON.stringify({ agentId, channels }));
|
|
73
|
-
const controller = new AbortController();
|
|
74
|
-
const timeout = setTimeout(() => controller.abort(), 5000);
|
|
75
|
-
try {
|
|
76
|
-
const res = await fetch(`${backendUrl}/api/internal/centrifugo-subscribe-token`, {
|
|
77
|
-
method: 'POST',
|
|
78
|
-
headers: {
|
|
79
|
-
'Content-Type': 'application/json',
|
|
80
|
-
'Authorization': `Bearer ${agentToken}`,
|
|
81
|
-
},
|
|
82
|
-
body: JSON.stringify({ agentId, channels }),
|
|
83
|
-
signal: controller.signal,
|
|
84
|
-
});
|
|
85
|
-
const body = await res.text();
|
|
86
|
-
debugLog('api', `← POST /api/internal/centrifugo-subscribe-token ${res.status}`, body.slice(0, 500));
|
|
87
|
-
if (!res.ok) {
|
|
88
|
-
throw new Error(`HTTP ${res.status}: ${body}`);
|
|
89
|
-
}
|
|
90
|
-
const data = JSON.parse(body);
|
|
91
|
-
return data.subscriptions;
|
|
92
|
-
}
|
|
93
|
-
catch (err) {
|
|
94
|
-
console.error('Subscription token fetch failed:', err instanceof Error ? err.message : err);
|
|
95
|
-
throw err;
|
|
96
|
-
}
|
|
97
|
-
finally {
|
|
98
|
-
clearTimeout(timeout);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
// ---------------------------------------------------------------------------
|
|
102
40
|
// Step 1: Create Centrifuge client (no subscriptions yet)
|
|
103
41
|
// ---------------------------------------------------------------------------
|
|
104
42
|
function createClient(opts) {
|
|
105
43
|
const getToken = async () => {
|
|
106
44
|
console.log('Fetching connection token...');
|
|
107
45
|
try {
|
|
108
|
-
const token = await
|
|
46
|
+
const token = await opts.api.fetchConnectionToken(opts.agentId);
|
|
109
47
|
console.log('Got connection token');
|
|
110
48
|
return token;
|
|
111
49
|
}
|
|
112
50
|
catch (err) {
|
|
113
|
-
console.error('Connection token failed:', err
|
|
51
|
+
console.error('Connection token failed:', toErrorMessage(err));
|
|
114
52
|
throw err;
|
|
115
53
|
}
|
|
116
54
|
};
|
|
@@ -142,7 +80,7 @@ function subscribeToChannel(client, channel, opts) {
|
|
|
142
80
|
const sub = client.newSubscription(channel, {
|
|
143
81
|
getToken: async () => {
|
|
144
82
|
console.log(`Fetching subscription token for ${channel}...`);
|
|
145
|
-
const subs = await
|
|
83
|
+
const subs = await opts.api.fetchSubscriptionToken(opts.agentId, [channel]);
|
|
146
84
|
const token = subs[channel];
|
|
147
85
|
if (!token) {
|
|
148
86
|
throw new Error(`No subscription token returned for ${channel}`);
|
|
@@ -173,8 +111,6 @@ function subscribeToChannel(client, channel, opts) {
|
|
|
173
111
|
// ---------------------------------------------------------------------------
|
|
174
112
|
function attachCommandHandlers(sub, channel, opts) {
|
|
175
113
|
const handlers = buildHandlers(opts);
|
|
176
|
-
// RACE-1: Serialize command execution. A simple promise chain ensures no two
|
|
177
|
-
// commands execute concurrently, preventing races (dual restart, concurrent exec, etc.)
|
|
178
114
|
let commandQueue = Promise.resolve();
|
|
179
115
|
sub.on('publication', (ctx) => {
|
|
180
116
|
console.log(`[WS] Received message on ${channel}:`, JSON.stringify(ctx.data));
|
|
@@ -185,7 +121,7 @@ function attachCommandHandlers(sub, channel, opts) {
|
|
|
185
121
|
return;
|
|
186
122
|
}
|
|
187
123
|
const command = raw;
|
|
188
|
-
// Chat commands are stateless
|
|
124
|
+
// Chat commands are stateless — run concurrently, outside the queue
|
|
189
125
|
if (command.type === 'chat_list_sessions' || command.type === 'chat_history' || command.type === 'chat_send') {
|
|
190
126
|
const publishFn = async (data) => { await opts.api.publishResponse(opts.agentId, data); };
|
|
191
127
|
console.log(`[WS] Handling chat command: type=${command.type} id=${command.id}`);
|
|
@@ -202,7 +138,7 @@ function attachCommandHandlers(sub, channel, opts) {
|
|
|
202
138
|
}
|
|
203
139
|
return;
|
|
204
140
|
}
|
|
205
|
-
//
|
|
141
|
+
// All other commands — serialized queue (RACE-1)
|
|
206
142
|
commandQueue = commandQueue.then(async () => {
|
|
207
143
|
const handler = handlers[command.type];
|
|
208
144
|
if (!handler) {
|
|
@@ -229,7 +165,6 @@ function attachCommandHandlers(sub, channel, opts) {
|
|
|
229
165
|
}
|
|
230
166
|
}
|
|
231
167
|
}).catch((err) => {
|
|
232
|
-
// Prevent one command failure from breaking the queue for subsequent commands
|
|
233
168
|
console.error('[WS] Unhandled error in command queue:', toErrorMessage(err));
|
|
234
169
|
});
|
|
235
170
|
});
|
|
@@ -240,16 +175,11 @@ function attachCommandHandlers(sub, channel, opts) {
|
|
|
240
175
|
// ---------------------------------------------------------------------------
|
|
241
176
|
export function createConnection(opts) {
|
|
242
177
|
const commandChannel = `agent:${opts.agentId}`;
|
|
243
|
-
// Step 1: Create client
|
|
244
178
|
const client = createClient(opts);
|
|
245
|
-
// Step 2: Subscribe to agent command channel
|
|
246
179
|
const commandSub = subscribeToChannel(client, commandChannel, opts);
|
|
247
|
-
// Step 3: Wire up command handlers
|
|
248
180
|
const drainCommands = attachCommandHandlers(commandSub, commandChannel, opts);
|
|
249
|
-
// Step 4: Connect
|
|
250
181
|
client.connect();
|
|
251
182
|
return { client, drainCommands };
|
|
252
183
|
}
|
|
253
|
-
// Re-export for use in index.ts (board subscription)
|
|
254
184
|
export { subscribeToChannel };
|
|
255
185
|
//# sourceMappingURL=connection.js.map
|
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,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAWrD,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,SAAS,aAAa,CAAC,IAAuB;IAC5C,OAAO;QACL,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EAAE,aAAa;QACtB,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,
|
|
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,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAWrD,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,SAAS,aAAa,CAAC,IAAuB;IAC5C,OAAO;QACL,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EAAE,aAAa;QACtB,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC;QAC1D,eAAe,EAAE,oBAAoB;QACrC,UAAU,EAAE,eAAe;QAC3B,WAAW,EAAE,gBAAgB;QAC7B,mBAAmB,EAAE,wBAAwB;QAC7C,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC;QACzE,WAAW,EAAE,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,0DAA0D;AAC1D,8EAA8E;AAE9E,SAAS,YAAY,CAAC,IAAuB;IAC3C,MAAM,QAAQ,GAAG,KAAK,IAAqB,EAAE;QAC3C,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/D,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE;QACtC,SAAS,EAAE,SAAS;QACpB,IAAI,EAAE,kBAAkB;QACxB,QAAQ;QACR,iBAAiB,EAAE,IAAI;QACvB,iBAAiB,EAAE,KAAK;KACzB,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QAC5D,QAAQ,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE;QAChC,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,MAAM,UAAU,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QAC9D,QAAQ,CAAC,YAAY,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE;QAC9B,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,MAAM,UAAU,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QAC5D,QAAQ,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,8DAA8D;AAC9D,8EAA8E;AAE9E,SAAS,kBAAkB,CACzB,MAAkB,EAClB,OAAe,EACf,IAAuB;IAEvB,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE;QAC1C,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnB,OAAO,CAAC,GAAG,CAAC,mCAAmC,OAAO,KAAK,CAAC,CAAC;YAC7D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;YACnE,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;YACrD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC,CAAC;IAEH,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE;QAC3B,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,eAAe,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC;QAC9E,QAAQ,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE;QAC5B,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,KAAK,GAAG,CAAC,MAAM,UAAU,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QAChF,QAAQ,CAAC,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACtB,OAAO,CAAC,KAAK,CAAC,8BAA8B,OAAO,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,0BAA0B,OAAO,KAAK,GAAG,CAAC,MAAM,UAAU,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,SAAS,EAAE,CAAC;IAChB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8EAA8E;AAC9E,wCAAwC;AACxC,8EAA8E;AAE9E,SAAS,qBAAqB,CAC5B,GAAiB,EACjB,OAAe,EACf,IAAuB;IAEvB,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAErC,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE;QAC5B,OAAO,CAAC,GAAG,CAAC,4BAA4B,OAAO,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,QAAQ,CAAC,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACvF,MAAM,GAAG,GAAG,GAAG,CAAC,IAAsC,CAAC;QACvD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,uDAAuD,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAChG,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,GAA8B,CAAC;QAE/C,oEAAoE;QACpE,IAAI,OAAO,CAAC,IAAI,KAAK,oBAAoB,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC7G,MAAM,SAAS,GAAG,KAAK,EAAE,IAAa,EAAiB,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAClH,OAAO,CAAC,GAAG,CAAC,oCAAoC,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACjF,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrB,KAAK,oBAAoB;oBACvB,sBAAsB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBAChE,MAAM;gBACR,KAAK,cAAc;oBACjB,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBAC3D,MAAM;gBACR,KAAK,WAAW;oBACd,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBACtE,MAAM;YACV,CAAC;YACD,OAAO;QACT,CAAC;QAED,iDAAiD;QACjD,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC5D,OAAO;YACT,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,+BAA+B,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YAE5E,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;gBACxC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACzD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,aAAa,GAAkB;oBACnC,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC;iBAC3B,CAAC;gBACF,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;gBAC9D,CAAC;gBAAC,OAAO,UAAU,EAAE,CAAC;oBACpB,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;gBACtF,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACf,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC;AAC5B,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,UAAU,gBAAgB,CAAC,IAAuB;IAItD,MAAM,cAAc,GAAG,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;IAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;IACpE,MAAM,aAAa,GAAG,qBAAqB,CAAC,UAAU,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;IAC9E,MAAM,CAAC,OAAO,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AACnC,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
import type { AgentCommand, AgentResponse } from '../types.js';
|
|
2
|
-
|
|
2
|
+
import type { AgentApi } from '../api.js';
|
|
3
|
+
export declare function handleBackup(command: AgentCommand, api: AgentApi, agentId: string): Promise<AgentResponse>;
|
package/dist/handlers/backup.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { pushBackupToBackend } from '../utils/backup-push.js';
|
|
2
2
|
import { toErrorMessage } from '../utils/response.js';
|
|
3
|
-
export async function handleBackup(command) {
|
|
3
|
+
export async function handleBackup(command, api, agentId) {
|
|
4
4
|
try {
|
|
5
|
-
const { snapshotId, sizeBytes } = await pushBackupToBackend();
|
|
5
|
+
const { snapshotId, sizeBytes } = await pushBackupToBackend(api, agentId);
|
|
6
6
|
return {
|
|
7
7
|
id: command.id,
|
|
8
8
|
type: 'backup',
|
|
@@ -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":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAqB,EAAE,GAAa,EAAE,OAAe;IACtF,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC1E,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"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
import type { AgentCommand, AgentResponse } from '../types.js';
|
|
2
|
-
|
|
2
|
+
import type { AgentApi } from '../api.js';
|
|
3
|
+
export declare function handleKnowledgeSync(command: AgentCommand, api: AgentApi, agentId: string): Promise<AgentResponse>;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { pushKnowledgeToBackend } from '../utils/knowledge-push.js';
|
|
2
|
-
|
|
3
|
-
export async function handleKnowledgeSync(command) {
|
|
2
|
+
export async function handleKnowledgeSync(command, api, agentId) {
|
|
4
3
|
const paths = command.payload.paths;
|
|
5
4
|
if (paths !== undefined && !Array.isArray(paths)) {
|
|
6
5
|
return {
|
|
@@ -11,7 +10,7 @@ export async function handleKnowledgeSync(command) {
|
|
|
11
10
|
};
|
|
12
11
|
}
|
|
13
12
|
try {
|
|
14
|
-
const { filesRead, filesUpdated } = await pushKnowledgeToBackend(paths);
|
|
13
|
+
const { filesRead, filesUpdated } = await pushKnowledgeToBackend(api, agentId, paths);
|
|
15
14
|
return {
|
|
16
15
|
id: command.id,
|
|
17
16
|
type: 'knowledge_sync',
|
|
@@ -24,7 +23,7 @@ export async function handleKnowledgeSync(command) {
|
|
|
24
23
|
id: command.id,
|
|
25
24
|
type: 'knowledge_sync',
|
|
26
25
|
success: false,
|
|
27
|
-
error:
|
|
26
|
+
error: e instanceof Error ? e.message : String(e),
|
|
28
27
|
};
|
|
29
28
|
}
|
|
30
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge-sync.js","sourceRoot":"","sources":["../../src/handlers/knowledge-sync.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"knowledge-sync.js","sourceRoot":"","sources":["../../src/handlers/knowledge-sync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAqB,EAAE,GAAa,EAAE,OAAe;IAC7F,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAA6B,CAAC;IAC5D,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,qDAAqD;SAC7D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACtF,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE;SAClC,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;SAClD,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { AgentApi } from '../api.js';
|
|
1
2
|
interface BackupResult {
|
|
2
3
|
snapshotId: string;
|
|
3
4
|
sizeBytes: number;
|
|
@@ -7,10 +8,10 @@ interface BackupResult {
|
|
|
7
8
|
* Used by both CLI command and Centrifugo handler.
|
|
8
9
|
*
|
|
9
10
|
* Flow:
|
|
10
|
-
* 1.
|
|
11
|
+
* 1. api.backupInit() → get uploadUrl, snapshotId, method
|
|
11
12
|
* 2. Create tar.gz archive of workspace
|
|
12
|
-
* 3. Upload archive
|
|
13
|
-
* 4.
|
|
13
|
+
* 3. Upload archive (presigned S3 PUT or backend API)
|
|
14
|
+
* 4. api.backupComplete() (for presigned uploads)
|
|
14
15
|
*/
|
|
15
|
-
export declare function pushBackupToBackend(): Promise<BackupResult>;
|
|
16
|
+
export declare function pushBackupToBackend(api: AgentApi, agentId: string): Promise<BackupResult>;
|
|
16
17
|
export {};
|
|
@@ -2,89 +2,36 @@ import fs from 'node:fs/promises';
|
|
|
2
2
|
import { createReadStream } from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { getWorkspaceDir } from '../workspace.js';
|
|
5
|
-
import { requireEnv, getBackendUrl } from './env.js';
|
|
6
5
|
import { createArchive } from './archive.js';
|
|
7
|
-
const UPLOAD_TIMEOUT = 300_000; // 5 min
|
|
8
6
|
/**
|
|
9
7
|
* Create a workspace backup and upload it to backend.
|
|
10
8
|
* Used by both CLI command and Centrifugo handler.
|
|
11
9
|
*
|
|
12
10
|
* Flow:
|
|
13
|
-
* 1.
|
|
11
|
+
* 1. api.backupInit() → get uploadUrl, snapshotId, method
|
|
14
12
|
* 2. Create tar.gz archive of workspace
|
|
15
|
-
* 3. Upload archive
|
|
16
|
-
* 4.
|
|
13
|
+
* 3. Upload archive (presigned S3 PUT or backend API)
|
|
14
|
+
* 4. api.backupComplete() (for presigned uploads)
|
|
17
15
|
*/
|
|
18
|
-
export async function pushBackupToBackend() {
|
|
19
|
-
const backendUrl = getBackendUrl();
|
|
20
|
-
const agentToken = requireEnv('AGENT_TOKEN');
|
|
21
|
-
const agentId = requireEnv('AGENT_ID');
|
|
16
|
+
export async function pushBackupToBackend(api, agentId) {
|
|
22
17
|
// Step 1: Init — get upload details from backend
|
|
23
|
-
const
|
|
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());
|
|
18
|
+
const { snapshotId, uploadUrl, method } = await api.backupInit(agentId);
|
|
33
19
|
// Step 2: Create archive
|
|
34
20
|
const archivePath = path.join('/tmp', `backup-${Date.now()}.tar.gz`);
|
|
35
21
|
try {
|
|
36
22
|
await createArchive(archivePath, getWorkspaceDir());
|
|
37
23
|
const stat = await fs.stat(archivePath);
|
|
38
|
-
// Step 3: Upload
|
|
24
|
+
// Step 3: Upload
|
|
39
25
|
if (method === 'presigned') {
|
|
40
26
|
const stream = createReadStream(archivePath);
|
|
41
|
-
|
|
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
|
-
}
|
|
27
|
+
await api.uploadRaw(uploadUrl, stream, 'application/gzip', stat.size);
|
|
54
28
|
// Step 4: Notify backend
|
|
55
|
-
|
|
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
|
-
}
|
|
29
|
+
await api.backupComplete(agentId, snapshotId, stat.size);
|
|
68
30
|
}
|
|
69
31
|
else {
|
|
70
32
|
// Fallback: upload through backend API (local storage)
|
|
71
33
|
const stream = createReadStream(archivePath);
|
|
72
|
-
|
|
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
|
-
}
|
|
34
|
+
await api.uploadRaw(uploadUrl, stream, 'application/gzip', stat.size);
|
|
88
35
|
}
|
|
89
36
|
return { snapshotId, sizeBytes: stat.size };
|
|
90
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup-push.js","sourceRoot":"","sources":["../../src/utils/backup-push.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"backup-push.js","sourceRoot":"","sources":["../../src/utils/backup-push.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAQ7C;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAa,EAAE,OAAe;IACtE,iDAAiD;IACjD,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAExE,yBAAyB;IACzB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAExC,iBAAiB;QACjB,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAC7C,MAAM,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAEtE,yBAAyB;YACzB,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,uDAAuD;YACvD,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAC7C,MAAM,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC9C,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import type { AgentApi } from '../api.js';
|
|
1
2
|
/**
|
|
2
|
-
* Push knowledge files to backend via
|
|
3
|
+
* Push knowledge files to backend via API.
|
|
3
4
|
* Used by both CLI command and Centrifugo handler.
|
|
4
5
|
*/
|
|
5
|
-
export declare function pushKnowledgeToBackend(paths?: string[]): Promise<{
|
|
6
|
+
export declare function pushKnowledgeToBackend(api: AgentApi, agentId: string, paths?: string[]): Promise<{
|
|
6
7
|
filesRead: number;
|
|
7
8
|
filesUpdated: number;
|
|
8
9
|
}>;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { getWorkspaceDir } from '../workspace.js';
|
|
4
|
-
import { requireEnv, getBackendUrl } from './env.js';
|
|
5
4
|
const FIXED_FILES = [
|
|
6
5
|
'SOUL.md',
|
|
7
6
|
'MEMORY.md',
|
|
@@ -70,13 +69,10 @@ async function readFiles(workspaceDir, filePaths) {
|
|
|
70
69
|
return files;
|
|
71
70
|
}
|
|
72
71
|
/**
|
|
73
|
-
* Push knowledge files to backend via
|
|
72
|
+
* Push knowledge files to backend via API.
|
|
74
73
|
* Used by both CLI command and Centrifugo handler.
|
|
75
74
|
*/
|
|
76
|
-
export async function pushKnowledgeToBackend(paths) {
|
|
77
|
-
const backendUrl = getBackendUrl();
|
|
78
|
-
const agentToken = requireEnv('AGENT_TOKEN');
|
|
79
|
-
const agentId = requireEnv('AGENT_ID');
|
|
75
|
+
export async function pushKnowledgeToBackend(api, agentId, paths) {
|
|
80
76
|
const requestedPaths = paths ?? [...FIXED_FILES, 'memory/'];
|
|
81
77
|
const workspaceDir = getWorkspaceDir();
|
|
82
78
|
const resolvedPaths = await resolvePaths(workspaceDir, requestedPaths);
|
|
@@ -84,20 +80,7 @@ export async function pushKnowledgeToBackend(paths) {
|
|
|
84
80
|
if (files.length === 0) {
|
|
85
81
|
return { filesRead: 0, filesUpdated: 0 };
|
|
86
82
|
}
|
|
87
|
-
const
|
|
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());
|
|
83
|
+
const { filesUpdated } = await api.knowledgePush(agentId, files);
|
|
101
84
|
return { filesRead: files.length, filesUpdated };
|
|
102
85
|
}
|
|
103
86
|
//# sourceMappingURL=knowledge-push.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge-push.js","sourceRoot":"","sources":["../../src/utils/knowledge-push.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"knowledge-push.js","sourceRoot":"","sources":["../../src/utils/knowledge-push.ts"],"names":[],"mappings":"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"}
|