@openclaw-cloud/agent-controller 0.8.1 → 0.8.2
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 +9 -75
- package/dist/commands/backup-cli.js.map +1 -1
- package/dist/commands/knowledge-sync-cli.js +6 -44
- package/dist/commands/knowledge-sync-cli.js.map +1 -1
- package/dist/connection.js +1 -1
- 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/knowledge-sync.js +24 -56
- package/dist/handlers/knowledge-sync.js.map +1 -1
- package/dist/utils/backup-push.d.ts +16 -0
- package/dist/utils/backup-push.js +88 -0
- package/dist/utils/backup-push.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
|
@@ -1,80 +1,14 @@
|
|
|
1
|
-
import
|
|
2
|
-
import path from 'node:path';
|
|
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';
|
|
6
2
|
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
|
-
}
|
|
3
|
+
console.log('Starting backup...');
|
|
4
|
+
try {
|
|
5
|
+
const { sizeBytes } = await pushBackupToBackend();
|
|
6
|
+
const sizeMb = (sizeBytes / 1024 / 1024).toFixed(2);
|
|
7
|
+
console.log(`Backup complete — ${sizeMb} MB.`);
|
|
59
8
|
}
|
|
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
|
-
}
|
|
9
|
+
catch (e) {
|
|
10
|
+
console.error(e instanceof Error ? e.message : String(e));
|
|
11
|
+
process.exit(1);
|
|
77
12
|
}
|
|
78
|
-
console.log(`Backup complete — ${sizeMb} MB.`);
|
|
79
13
|
}
|
|
80
14
|
//# 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;AAE9D,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,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,51 +1,13 @@
|
|
|
1
|
-
import
|
|
2
|
-
import path from 'node:path';
|
|
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';
|
|
6
2
|
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');
|
|
3
|
+
console.log('Starting knowledge sync...');
|
|
14
4
|
try {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
if (entry.endsWith('.md'))
|
|
18
|
-
filePaths.push(`memory/${entry}`);
|
|
19
|
-
}
|
|
5
|
+
const { filesRead, filesUpdated } = await pushKnowledgeToBackend();
|
|
6
|
+
console.log(`Knowledge sync complete — ${filesUpdated}/${filesRead} files updated.`);
|
|
20
7
|
}
|
|
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}`);
|
|
8
|
+
catch (e) {
|
|
9
|
+
console.error(e instanceof Error ? e.message : String(e));
|
|
46
10
|
process.exit(1);
|
|
47
11
|
}
|
|
48
|
-
const { filesUpdated } = await res.json();
|
|
49
|
-
console.log(`Knowledge sync complete — ${filesUpdated}/${files.length} files updated.`);
|
|
50
12
|
}
|
|
51
13
|
//# 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;AAEpE,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,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
|
@@ -26,7 +26,7 @@ function buildHandlers(opts) {
|
|
|
26
26
|
config: handleConfig,
|
|
27
27
|
pair: handlePair,
|
|
28
28
|
stop: handleStop,
|
|
29
|
-
backup: (cmd) => handleBackup(cmd
|
|
29
|
+
backup: (cmd) => handleBackup(cmd),
|
|
30
30
|
package_install: handlePackageInstall,
|
|
31
31
|
file_write: handleFileWrite,
|
|
32
32
|
file_delete: handleFileDelete,
|
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,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,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,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAWvD,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,SAAS,aAAa,CAAC,IAAuB;IAC5C,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,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,
|
|
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"}
|
|
@@ -1,62 +1,30 @@
|
|
|
1
|
-
import
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { getWorkspaceDir } from '../workspace.js';
|
|
4
|
-
const MAX_FILE_BYTES = 1_048_576; // 1 MB per file
|
|
5
|
-
const MAX_TOTAL_BYTES = 10_485_760; // 10 MB total payload
|
|
1
|
+
import { pushKnowledgeToBackend } from '../utils/knowledge-push.js';
|
|
6
2
|
export async function handleKnowledgeSync(command) {
|
|
7
|
-
const
|
|
8
|
-
if (!Array.isArray(
|
|
9
|
-
return {
|
|
3
|
+
const paths = command.payload.paths;
|
|
4
|
+
if (paths !== undefined && !Array.isArray(paths)) {
|
|
5
|
+
return {
|
|
6
|
+
id: command.id,
|
|
7
|
+
type: 'knowledge_sync',
|
|
8
|
+
success: false,
|
|
9
|
+
error: 'Invalid "paths" in payload — expected array or omit',
|
|
10
|
+
};
|
|
10
11
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
for (const entry of entries) {
|
|
20
|
-
if (entry.endsWith('.md'))
|
|
21
|
-
resolvedPaths.push(path.join(p, entry));
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
catch {
|
|
25
|
-
// Directory doesn't exist — skip
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
resolvedPaths.push(p);
|
|
30
|
-
}
|
|
12
|
+
try {
|
|
13
|
+
const { filesRead, filesUpdated } = await pushKnowledgeToBackend(paths);
|
|
14
|
+
return {
|
|
15
|
+
id: command.id,
|
|
16
|
+
type: 'knowledge_sync',
|
|
17
|
+
success: true,
|
|
18
|
+
data: { filesRead, filesUpdated },
|
|
19
|
+
};
|
|
31
20
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
try {
|
|
40
|
-
const fullPath = path.join(workspaceDir, filePath);
|
|
41
|
-
const stat = await fs.stat(fullPath).catch(() => null);
|
|
42
|
-
if (!stat || stat.size > MAX_FILE_BYTES) {
|
|
43
|
-
if (stat)
|
|
44
|
-
console.warn(`[knowledge-sync] Skipping ${filePath}: file too large (${stat.size} bytes)`);
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
const content = await fs.readFile(fullPath, 'utf-8');
|
|
48
|
-
totalBytes += Buffer.byteLength(content, 'utf-8');
|
|
49
|
-
files.push({ path: filePath, content });
|
|
50
|
-
}
|
|
51
|
-
catch {
|
|
52
|
-
// File doesn't exist or unreadable — skip
|
|
53
|
-
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
return {
|
|
23
|
+
id: command.id,
|
|
24
|
+
type: 'knowledge_sync',
|
|
25
|
+
success: false,
|
|
26
|
+
error: e instanceof Error ? e.message : String(e),
|
|
27
|
+
};
|
|
54
28
|
}
|
|
55
|
-
return {
|
|
56
|
-
id: command.id,
|
|
57
|
-
type: 'knowledge_sync',
|
|
58
|
-
success: true,
|
|
59
|
-
data: { files },
|
|
60
|
-
};
|
|
61
29
|
}
|
|
62
30
|
//# sourceMappingURL=knowledge-sync.js.map
|
|
@@ -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":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAqB;IAC7D,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,KAAK,CAAC,CAAC;QACxE,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"}
|
|
@@ -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 (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,88 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { getWorkspaceDir } from '../workspace.js';
|
|
4
|
+
import { requireEnv } from './env.js';
|
|
5
|
+
import { createArchive } from './archive.js';
|
|
6
|
+
const UPLOAD_TIMEOUT = 300_000; // 5 min
|
|
7
|
+
/**
|
|
8
|
+
* Create a workspace backup and upload it to backend.
|
|
9
|
+
* Used by both CLI command and Centrifugo handler.
|
|
10
|
+
*
|
|
11
|
+
* Flow:
|
|
12
|
+
* 1. Request init from backend → get uploadUrl, snapshotId, method
|
|
13
|
+
* 2. Create tar.gz archive of workspace
|
|
14
|
+
* 3. Upload archive (presigned S3 PUT or backend API)
|
|
15
|
+
* 4. Notify backend of completion (for presigned uploads)
|
|
16
|
+
*/
|
|
17
|
+
export async function pushBackupToBackend() {
|
|
18
|
+
const backendUrl = process.env.BACKEND_URL || process.env.BACKEND_INTERNAL_URL || requireEnv('BACKEND_URL');
|
|
19
|
+
const agentToken = requireEnv('AGENT_TOKEN');
|
|
20
|
+
const agentId = requireEnv('AGENT_ID');
|
|
21
|
+
// Step 1: Init — get upload details from backend
|
|
22
|
+
const initRes = await fetch(`${backendUrl}/api/internal/agents/${agentId}/backup/init`, {
|
|
23
|
+
method: 'POST',
|
|
24
|
+
headers: { Authorization: `Bearer ${agentToken}` },
|
|
25
|
+
signal: AbortSignal.timeout(30_000),
|
|
26
|
+
});
|
|
27
|
+
if (!initRes.ok) {
|
|
28
|
+
const text = await initRes.text().catch(() => '');
|
|
29
|
+
throw new Error(`Backup init failed: ${initRes.status} ${text}`);
|
|
30
|
+
}
|
|
31
|
+
const { snapshotId, uploadUrl, token, method } = (await initRes.json());
|
|
32
|
+
// Step 2: Create archive
|
|
33
|
+
const archivePath = path.join('/tmp', `backup-${Date.now()}.tar.gz`);
|
|
34
|
+
try {
|
|
35
|
+
await createArchive(archivePath, getWorkspaceDir());
|
|
36
|
+
const stat = await fs.stat(archivePath);
|
|
37
|
+
// Step 3: Upload
|
|
38
|
+
if (method === 'presigned') {
|
|
39
|
+
const fileBuffer = await fs.readFile(archivePath);
|
|
40
|
+
const uploadRes = await fetch(uploadUrl, {
|
|
41
|
+
method: 'PUT',
|
|
42
|
+
headers: { 'Content-Type': 'application/gzip', 'Content-Length': String(stat.size) },
|
|
43
|
+
body: fileBuffer,
|
|
44
|
+
signal: AbortSignal.timeout(UPLOAD_TIMEOUT),
|
|
45
|
+
});
|
|
46
|
+
if (!uploadRes.ok) {
|
|
47
|
+
const text = await uploadRes.text().catch(() => '');
|
|
48
|
+
throw new Error(`S3 upload failed: ${uploadRes.status} ${text}`);
|
|
49
|
+
}
|
|
50
|
+
// Step 4: Notify backend
|
|
51
|
+
const completeRes = await fetch(`${backendUrl}/api/internal/agents/${agentId}/backup/complete`, {
|
|
52
|
+
method: 'POST',
|
|
53
|
+
headers: {
|
|
54
|
+
'Content-Type': 'application/json',
|
|
55
|
+
Authorization: `Bearer ${agentToken}`,
|
|
56
|
+
},
|
|
57
|
+
body: JSON.stringify({ snapshotId, sizeBytes: stat.size }),
|
|
58
|
+
signal: AbortSignal.timeout(30_000),
|
|
59
|
+
});
|
|
60
|
+
if (!completeRes.ok) {
|
|
61
|
+
const text = await completeRes.text().catch(() => '');
|
|
62
|
+
throw new Error(`Backup complete notification failed: ${completeRes.status} ${text}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// Fallback: upload through backend API (local storage)
|
|
67
|
+
const fileBuffer = await fs.readFile(archivePath);
|
|
68
|
+
const uploadRes = await fetch(`${backendUrl}/api/internal/agents/${agentId}/knowledge/upload?snapshotId=${snapshotId}`, {
|
|
69
|
+
method: 'POST',
|
|
70
|
+
headers: {
|
|
71
|
+
'Content-Type': 'application/gzip',
|
|
72
|
+
Authorization: `Bearer ${token}`,
|
|
73
|
+
},
|
|
74
|
+
body: fileBuffer,
|
|
75
|
+
signal: AbortSignal.timeout(UPLOAD_TIMEOUT),
|
|
76
|
+
});
|
|
77
|
+
if (!uploadRes.ok) {
|
|
78
|
+
const text = await uploadRes.text().catch(() => '');
|
|
79
|
+
throw new Error(`Upload failed: ${uploadRes.status} ${text}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return { snapshotId, sizeBytes: stat.size };
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
await fs.unlink(archivePath).catch(() => { });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# 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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"}
|
|
@@ -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 } 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 = process.env.BACKEND_URL || process.env.BACKEND_INTERNAL_URL || requireEnv('BACKEND_URL');
|
|
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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"}
|