@openclaw-cloud/agent-controller 3.1.0 → 3.1.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/bin/agent-controller.js +5 -9
- package/dist/api.d.ts +7 -0
- package/dist/api.js.map +1 -1
- package/dist/commands/agent-update-cli.js +23 -38
- package/dist/commands/agent-update-cli.js.map +1 -1
- package/dist/commands/backup-cli.js +6 -4
- package/dist/commands/backup-cli.js.map +1 -1
- package/dist/commands/bootstrap.d.ts +10 -1
- package/dist/commands/bootstrap.js +25 -73
- package/dist/commands/bootstrap.js.map +1 -1
- package/dist/commands/channel-server.js +4 -3
- package/dist/commands/channel-server.js.map +1 -1
- package/dist/commands/heartbeat-cli.js +2 -6
- package/dist/commands/heartbeat-cli.js.map +1 -1
- package/dist/commands/install-deps.d.ts +10 -0
- package/dist/commands/install-deps.js +33 -43
- package/dist/commands/install-deps.js.map +1 -1
- package/dist/commands/knowledge-sync-cli.js +6 -4
- package/dist/commands/knowledge-sync-cli.js.map +1 -1
- package/dist/commands/plugin-update-cli.js +4 -8
- package/dist/commands/plugin-update-cli.js.map +1 -1
- package/dist/commands/self-update.js +17 -34
- package/dist/commands/self-update.js.map +1 -1
- package/dist/commands/update-skills.js +7 -6
- package/dist/commands/update-skills.js.map +1 -1
- package/dist/config-file.d.ts +7 -0
- package/dist/config-file.js +22 -11
- package/dist/config-file.js.map +1 -1
- package/dist/handlers/agent-update.d.ts +4 -0
- package/dist/handlers/agent-update.js +16 -44
- package/dist/handlers/agent-update.js.map +1 -1
- package/dist/handlers/deploy.d.ts +1 -2
- package/dist/handlers/deploy.js +4 -20
- package/dist/handlers/deploy.js.map +1 -1
- package/dist/handlers/diagnostics.js +0 -12
- package/dist/handlers/diagnostics.js.map +1 -1
- package/dist/handlers/file-delete.js +4 -5
- package/dist/handlers/file-delete.js.map +1 -1
- package/dist/handlers/file-write.js +4 -4
- package/dist/handlers/file-write.js.map +1 -1
- package/dist/handlers/knowledge-sync.js +2 -14
- package/dist/handlers/knowledge-sync.js.map +1 -1
- package/dist/handlers/memory.d.ts +11 -1
- package/dist/handlers/memory.js.map +1 -1
- package/dist/handlers/onboarding.d.ts +1 -2
- package/dist/handlers/onboarding.js +3 -20
- package/dist/handlers/onboarding.js.map +1 -1
- package/dist/handlers/package-install.js +1 -1
- package/dist/handlers/package-install.js.map +1 -1
- package/dist/handlers/pair.js +0 -12
- package/dist/handlers/pair.js.map +1 -1
- package/dist/handlers/restart.d.ts +1 -2
- package/dist/handlers/restart.js +3 -8
- package/dist/handlers/restart.js.map +1 -1
- package/dist/handlers/stop.js +0 -7
- package/dist/handlers/stop.js.map +1 -1
- package/dist/handlers/telegram-webhook.js +3 -22
- package/dist/handlers/telegram-webhook.js.map +1 -1
- package/dist/handlers/update-config.js +4 -13
- package/dist/handlers/update-config.js.map +1 -1
- package/dist/heartbeat.js +2 -1
- package/dist/heartbeat.js.map +1 -1
- package/dist/index.d.ts +0 -8
- package/dist/index.js +57 -117
- package/dist/index.js.map +1 -1
- package/dist/lockfile.js +2 -1
- package/dist/lockfile.js.map +1 -1
- package/dist/platform/linux.js +6 -5
- package/dist/platform/linux.js.map +1 -1
- package/dist/platform/macos.js +3 -2
- package/dist/platform/macos.js.map +1 -1
- package/dist/platform/windows.js +3 -2
- package/dist/platform/windows.js.map +1 -1
- package/dist/providers/claude-code/channel-server.js +2 -1
- package/dist/providers/claude-code/channel-server.js.map +1 -1
- package/dist/providers/claude-code/settings-writer.d.ts +3 -2
- package/dist/providers/claude-code/settings-writer.js +6 -15
- package/dist/providers/claude-code/settings-writer.js.map +1 -1
- package/dist/providers/index.d.ts +13 -0
- package/dist/providers/index.js +25 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openclaw/gateway-adapter.js +2 -0
- package/dist/providers/openclaw/gateway-adapter.js.map +1 -1
- package/dist/providers/openclaw/index.js +11 -13
- package/dist/providers/openclaw/index.js.map +1 -1
- package/dist/utils/anthropic-auth.d.ts +14 -0
- package/dist/utils/anthropic-auth.js +24 -0
- package/dist/utils/anthropic-auth.js.map +1 -1
- package/dist/utils/apply-config.d.ts +38 -6
- package/dist/utils/apply-config.js +118 -69
- package/dist/utils/apply-config.js.map +1 -1
- package/dist/utils/claude-env.d.ts +6 -0
- package/dist/utils/claude-env.js +29 -28
- package/dist/utils/claude-env.js.map +1 -1
- package/dist/utils/deploy-type.d.ts +16 -0
- package/dist/utils/deploy-type.js +34 -0
- package/dist/utils/deploy-type.js.map +1 -0
- package/dist/utils/env.d.ts +0 -1
- package/dist/utils/env.js +0 -8
- package/dist/utils/env.js.map +1 -1
- package/dist/utils/exec.d.ts +9 -0
- package/dist/utils/exec.js +12 -1
- package/dist/utils/exec.js.map +1 -1
- package/dist/utils/gateway-restart-handler.d.ts +6 -2
- package/dist/utils/gateway-restart-handler.js +11 -2
- package/dist/utils/gateway-restart-handler.js.map +1 -1
- package/dist/utils/gateway-restart.d.ts +7 -0
- package/dist/utils/gateway-restart.js +12 -4
- package/dist/utils/gateway-restart.js.map +1 -1
- package/dist/utils/knowledge-graph.d.ts +13 -1
- package/dist/utils/knowledge-graph.js +75 -29
- package/dist/utils/knowledge-graph.js.map +1 -1
- package/dist/utils/legacy-mcp-servers.d.ts +12 -0
- package/dist/utils/legacy-mcp-servers.js +37 -0
- package/dist/utils/legacy-mcp-servers.js.map +1 -0
- package/dist/utils/log-collector.js +2 -1
- package/dist/utils/log-collector.js.map +1 -1
- package/dist/utils/openclaw-ops.js +8 -7
- package/dist/utils/openclaw-ops.js.map +1 -1
- package/dist/utils/openclaw-stack-update.d.ts +31 -0
- package/dist/utils/openclaw-stack-update.js +50 -0
- package/dist/utils/openclaw-stack-update.js.map +1 -0
- package/dist/utils/package-install.js +4 -12
- package/dist/utils/package-install.js.map +1 -1
- package/dist/utils/package-version.d.ts +10 -0
- package/dist/utils/package-version.js +18 -0
- package/dist/utils/package-version.js.map +1 -0
- package/dist/utils/parse-id-at-version.d.ts +15 -0
- package/dist/utils/parse-id-at-version.js +22 -0
- package/dist/utils/parse-id-at-version.js.map +1 -0
- package/dist/utils/response.js +1 -0
- package/dist/utils/response.js.map +1 -1
- package/dist/utils/write-workspace-files.d.ts +1 -1
- package/dist/utils/write-workspace-files.js +19 -7
- package/dist/utils/write-workspace-files.js.map +1 -1
- package/dist/workspace.d.ts +11 -0
- package/dist/workspace.js +20 -0
- package/dist/workspace.js.map +1 -1
- package/package.json +9 -4
package/dist/utils/env.js
CHANGED
|
@@ -1,12 +1,4 @@
|
|
|
1
1
|
import { config, requireConfig } from '../config.js';
|
|
2
|
-
export function requireEnv(name) {
|
|
3
|
-
const value = process.env[name];
|
|
4
|
-
if (!value) {
|
|
5
|
-
console.error(`Missing required environment variable: ${name}`);
|
|
6
|
-
process.exit(1);
|
|
7
|
-
}
|
|
8
|
-
return value;
|
|
9
|
-
}
|
|
10
2
|
export function getBackendUrl() {
|
|
11
3
|
return config.backendUrl ?? requireConfig('backendUrl');
|
|
12
4
|
}
|
package/dist/utils/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,UAAU,aAAa;IAC3B,OAAO,MAAM,CAAC,UAAU,IAAI,aAAa,CAAC,YAAY,CAAC,CAAC;AAC1D,CAAC"}
|
package/dist/utils/exec.d.ts
CHANGED
|
@@ -1 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run a command through a shell and resolve its trimmed stdout.
|
|
3
|
+
*
|
|
4
|
+
* `timeout` defaults to 0 (no timeout) to preserve the behaviour of existing
|
|
5
|
+
* no-timeout callers (fast systemctl/launchctl/which calls); long-running
|
|
6
|
+
* callers already pass an explicit timeout. The raised maxBuffer prevents
|
|
7
|
+
* verbose output (e.g. `npm install -g`) from rejecting with
|
|
8
|
+
* ERR_CHILD_PROCESS_STDOUT_MAXBUFFER.
|
|
9
|
+
*/
|
|
1
10
|
export declare function execAsync(cmd: string, timeout?: number): Promise<string>;
|
package/dist/utils/exec.js
CHANGED
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
import { exec } from 'node:child_process';
|
|
2
|
+
// 16 MB — avoid ERR_CHILD_PROCESS_STDOUT_MAXBUFFER on chatty commands like `npm install -g`.
|
|
3
|
+
const DEFAULT_MAX_BUFFER = 16 * 1024 * 1024;
|
|
4
|
+
/**
|
|
5
|
+
* Run a command through a shell and resolve its trimmed stdout.
|
|
6
|
+
*
|
|
7
|
+
* `timeout` defaults to 0 (no timeout) to preserve the behaviour of existing
|
|
8
|
+
* no-timeout callers (fast systemctl/launchctl/which calls); long-running
|
|
9
|
+
* callers already pass an explicit timeout. The raised maxBuffer prevents
|
|
10
|
+
* verbose output (e.g. `npm install -g`) from rejecting with
|
|
11
|
+
* ERR_CHILD_PROCESS_STDOUT_MAXBUFFER.
|
|
12
|
+
*/
|
|
2
13
|
export function execAsync(cmd, timeout = 0) {
|
|
3
14
|
return new Promise((resolve, reject) => {
|
|
4
|
-
exec(cmd, { timeout }, (err, stdout) => {
|
|
15
|
+
exec(cmd, { timeout, maxBuffer: DEFAULT_MAX_BUFFER }, (err, stdout) => {
|
|
5
16
|
if (err)
|
|
6
17
|
reject(err);
|
|
7
18
|
else
|
package/dist/utils/exec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,OAAO,GAAG,CAAC;IAChD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,6FAA6F;AAC7F,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,OAAO,GAAG,CAAC;IAChD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;YACpE,IAAI,GAAG;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;gBAChB,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { AgentCommand, AgentResponse } from '../types.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
3
|
+
* The handler behind every command whose whole job is "restart the OpenClaw
|
|
4
|
+
* gateway": `restart`, `deploy` and `onboarding_complete`. They were three
|
|
5
|
+
* byte-identical copies of this wrapper.
|
|
6
|
+
*
|
|
7
|
+
* Emits only the domain event (`gateway_restart`) — the command lifecycle
|
|
8
|
+
* events are owned by the dispatch loop in connection.ts.
|
|
5
9
|
*/
|
|
6
10
|
export declare function handleGatewayRestartCommand(command: AgentCommand): Promise<AgentResponse>;
|
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
import { restartGateway } from './gateway-restart.js';
|
|
2
|
+
import { logCollector } from '../connection.js';
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
4
|
+
* The handler behind every command whose whole job is "restart the OpenClaw
|
|
5
|
+
* gateway": `restart`, `deploy` and `onboarding_complete`. They were three
|
|
6
|
+
* byte-identical copies of this wrapper.
|
|
7
|
+
*
|
|
8
|
+
* Emits only the domain event (`gateway_restart`) — the command lifecycle
|
|
9
|
+
* events are owned by the dispatch loop in connection.ts.
|
|
5
10
|
*/
|
|
6
11
|
export async function handleGatewayRestartCommand(command) {
|
|
12
|
+
logCollector?.push('gateway_restart', 'info', 'Gateway restart requested', {
|
|
13
|
+
commandId: command.id,
|
|
14
|
+
type: command.type,
|
|
15
|
+
});
|
|
7
16
|
try {
|
|
8
17
|
const { stdout, stderr } = await restartGateway();
|
|
9
18
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-restart-handler.js","sourceRoot":"","sources":["../../src/utils/gateway-restart-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"gateway-restart-handler.js","sourceRoot":"","sources":["../../src/utils/gateway-restart-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAAqB;IACrE,YAAY,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE,2BAA2B,EAAE;QACzE,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;QAClD,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"}
|
|
@@ -5,6 +5,13 @@ export interface GatewayRestartResult {
|
|
|
5
5
|
/**
|
|
6
6
|
* Restart the gateway via the configured agent provider.
|
|
7
7
|
* Returns { stdout: '', stderr: '' } for interface compatibility.
|
|
8
|
+
*
|
|
9
|
+
* `configureProvider()` only ever runs inside the daemon's `main()`, so in
|
|
10
|
+
* EVERY CLI invocation `getProvider()` is null. This used to warn and return
|
|
11
|
+
* success, which made `agent-controller restart` (and the restart tail of
|
|
12
|
+
* `deploy` / `agent-update` / `self-update`) a silent no-op that still exited
|
|
13
|
+
* 0. We now build a throwaway provider from config instead, and throw when
|
|
14
|
+
* even that is impossible so the caller can exit non-zero.
|
|
8
15
|
*/
|
|
9
16
|
export declare function restartGateway(): Promise<GatewayRestartResult>;
|
|
10
17
|
/**
|
|
@@ -1,13 +1,21 @@
|
|
|
1
|
-
import { getProvider } from '../providers/index.js';
|
|
1
|
+
import { createProviderFromConfig, getProvider } from '../providers/index.js';
|
|
2
|
+
import { config } from '../config.js';
|
|
2
3
|
/**
|
|
3
4
|
* Restart the gateway via the configured agent provider.
|
|
4
5
|
* Returns { stdout: '', stderr: '' } for interface compatibility.
|
|
6
|
+
*
|
|
7
|
+
* `configureProvider()` only ever runs inside the daemon's `main()`, so in
|
|
8
|
+
* EVERY CLI invocation `getProvider()` is null. This used to warn and return
|
|
9
|
+
* success, which made `agent-controller restart` (and the restart tail of
|
|
10
|
+
* `deploy` / `agent-update` / `self-update`) a silent no-op that still exited
|
|
11
|
+
* 0. We now build a throwaway provider from config instead, and throw when
|
|
12
|
+
* even that is impossible so the caller can exit non-zero.
|
|
5
13
|
*/
|
|
6
14
|
export async function restartGateway() {
|
|
7
|
-
const provider = getProvider();
|
|
15
|
+
const provider = getProvider() ?? createProviderFromConfig();
|
|
8
16
|
if (!provider) {
|
|
9
|
-
|
|
10
|
-
|
|
17
|
+
throw new Error(`Cannot restart gateway: unknown agent provider '${config.agentProvider}' ` +
|
|
18
|
+
'(set AGENT_PROVIDER to openclaw, claude-code or mock)');
|
|
11
19
|
}
|
|
12
20
|
await provider.restart();
|
|
13
21
|
return { stdout: '', stderr: '' };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-restart.js","sourceRoot":"","sources":["../../src/utils/gateway-restart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"gateway-restart.js","sourceRoot":"","sources":["../../src/utils/gateway-restart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAOtC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,QAAQ,GAAG,WAAW,EAAE,IAAI,wBAAwB,EAAE,CAAC;IAC7D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,mDAAmD,MAAM,CAAC,aAAa,IAAI;YACzE,uDAAuD,CAC1D,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC"}
|
|
@@ -48,8 +48,20 @@ export declare class KnowledgeGraphManager extends EventEmitter {
|
|
|
48
48
|
/** Load graph from disk into memory. Call once at startup. */
|
|
49
49
|
init(): Promise<void>;
|
|
50
50
|
private readGraphFromDisk;
|
|
51
|
-
/**
|
|
51
|
+
/**
|
|
52
|
+
* Serialized persist: enqueues writes so concurrent calls never interleave.
|
|
53
|
+
* The queue tail swallows rejections so persistQueue is always fulfilled — a
|
|
54
|
+
* failed write never poisons the chain (the next write still runs) — while the
|
|
55
|
+
* caller of THIS write still observes its real success/failure.
|
|
56
|
+
*/
|
|
52
57
|
private persist;
|
|
58
|
+
/**
|
|
59
|
+
* Persist after an in-memory mutation, rolling the graph back to `snapshot`
|
|
60
|
+
* if the write fails. This keeps memory consistent with disk and with the
|
|
61
|
+
* backend (which is told the mutation failed and receives no delta) instead
|
|
62
|
+
* of leaving the failed mutation in memory to land on the next write.
|
|
63
|
+
*/
|
|
64
|
+
private persistWithRollback;
|
|
53
65
|
/** Atomic persist: write to .tmp, then fs.rename(). */
|
|
54
66
|
private doPersist;
|
|
55
67
|
/** Emit delta event after mutation (for sync to backend). */
|
|
@@ -33,24 +33,35 @@ export class KnowledgeGraphManager extends EventEmitter {
|
|
|
33
33
|
try {
|
|
34
34
|
const data = await fs.readFile(this.memoryFilePath, 'utf-8');
|
|
35
35
|
const lines = data.split('\n').filter((line) => line.trim() !== '');
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
const graph = { entities: [], relations: [] };
|
|
37
|
+
for (const line of lines) {
|
|
38
|
+
let item;
|
|
39
|
+
try {
|
|
40
|
+
item = JSON.parse(line);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Skip a single corrupt/truncated line instead of discarding the
|
|
44
|
+
// entire graph — recover every well-formed record around it.
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (item.type === 'entity' && typeof item.name === 'string') {
|
|
39
48
|
graph.entities.push({
|
|
40
49
|
name: item.name,
|
|
41
|
-
entityType: item.entityType,
|
|
42
|
-
observations: item.observations,
|
|
50
|
+
entityType: item.entityType ?? '',
|
|
51
|
+
observations: item.observations ?? [],
|
|
43
52
|
});
|
|
44
53
|
}
|
|
45
|
-
if (item.type === 'relation'
|
|
54
|
+
else if (item.type === 'relation' &&
|
|
55
|
+
typeof item.from === 'string' &&
|
|
56
|
+
typeof item.to === 'string') {
|
|
46
57
|
graph.relations.push({
|
|
47
58
|
from: item.from,
|
|
48
59
|
to: item.to,
|
|
49
|
-
relationType: item.relationType,
|
|
60
|
+
relationType: item.relationType ?? '',
|
|
50
61
|
});
|
|
51
62
|
}
|
|
52
|
-
|
|
53
|
-
|
|
63
|
+
}
|
|
64
|
+
return graph;
|
|
54
65
|
}
|
|
55
66
|
catch (error) {
|
|
56
67
|
if (error?.code === 'ENOENT') {
|
|
@@ -59,10 +70,31 @@ export class KnowledgeGraphManager extends EventEmitter {
|
|
|
59
70
|
throw error;
|
|
60
71
|
}
|
|
61
72
|
}
|
|
62
|
-
/**
|
|
73
|
+
/**
|
|
74
|
+
* Serialized persist: enqueues writes so concurrent calls never interleave.
|
|
75
|
+
* The queue tail swallows rejections so persistQueue is always fulfilled — a
|
|
76
|
+
* failed write never poisons the chain (the next write still runs) — while the
|
|
77
|
+
* caller of THIS write still observes its real success/failure.
|
|
78
|
+
*/
|
|
63
79
|
persist() {
|
|
64
|
-
|
|
65
|
-
|
|
80
|
+
const run = this.persistQueue.then(() => this.doPersist());
|
|
81
|
+
this.persistQueue = run.then(() => undefined, () => undefined);
|
|
82
|
+
return run;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Persist after an in-memory mutation, rolling the graph back to `snapshot`
|
|
86
|
+
* if the write fails. This keeps memory consistent with disk and with the
|
|
87
|
+
* backend (which is told the mutation failed and receives no delta) instead
|
|
88
|
+
* of leaving the failed mutation in memory to land on the next write.
|
|
89
|
+
*/
|
|
90
|
+
async persistWithRollback(snapshot) {
|
|
91
|
+
try {
|
|
92
|
+
await this.persist();
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
this.graph = snapshot;
|
|
96
|
+
throw err;
|
|
97
|
+
}
|
|
66
98
|
}
|
|
67
99
|
/** Atomic persist: write to .tmp, then fs.rename(). */
|
|
68
100
|
async doPersist() {
|
|
@@ -89,8 +121,9 @@ export class KnowledgeGraphManager extends EventEmitter {
|
|
|
89
121
|
// -------------------------------------------------------------------------
|
|
90
122
|
async createEntities(entities) {
|
|
91
123
|
const newEntities = entities.filter((e) => !this.graph.entities.some((existing) => existing.name === e.name));
|
|
124
|
+
const snapshot = structuredClone(this.graph);
|
|
92
125
|
this.graph.entities.push(...newEntities);
|
|
93
|
-
await this.
|
|
126
|
+
await this.persistWithRollback(snapshot);
|
|
94
127
|
this.emitDelta('entities_created', newEntities);
|
|
95
128
|
return newEntities;
|
|
96
129
|
}
|
|
@@ -98,44 +131,57 @@ export class KnowledgeGraphManager extends EventEmitter {
|
|
|
98
131
|
const newRelations = relations.filter((r) => !this.graph.relations.some((existing) => existing.from === r.from &&
|
|
99
132
|
existing.to === r.to &&
|
|
100
133
|
existing.relationType === r.relationType));
|
|
134
|
+
const snapshot = structuredClone(this.graph);
|
|
101
135
|
this.graph.relations.push(...newRelations);
|
|
102
|
-
await this.
|
|
136
|
+
await this.persistWithRollback(snapshot);
|
|
103
137
|
this.emitDelta('relations_created', newRelations);
|
|
104
138
|
return newRelations;
|
|
105
139
|
}
|
|
106
140
|
async addObservations(observations) {
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
141
|
+
const snapshot = structuredClone(this.graph);
|
|
142
|
+
try {
|
|
143
|
+
const results = observations.map((o) => {
|
|
144
|
+
const entity = this.graph.entities.find((e) => e.name === o.entityName);
|
|
145
|
+
if (!entity) {
|
|
146
|
+
throw new Error(`Entity with name ${o.entityName} not found`);
|
|
147
|
+
}
|
|
148
|
+
const newObservations = o.contents.filter((content) => !entity.observations.includes(content));
|
|
149
|
+
entity.observations.push(...newObservations);
|
|
150
|
+
return { entityName: o.entityName, addedObservations: newObservations };
|
|
151
|
+
});
|
|
152
|
+
await this.persistWithRollback(snapshot);
|
|
153
|
+
this.emitDelta('observations_added', results);
|
|
154
|
+
return results;
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
// Roll back any partial in-memory mutation (a missing entity throws
|
|
158
|
+
// mid-map after earlier entities were already mutated).
|
|
159
|
+
this.graph = snapshot;
|
|
160
|
+
throw err;
|
|
161
|
+
}
|
|
119
162
|
}
|
|
120
163
|
async deleteEntities(names) {
|
|
164
|
+
const snapshot = structuredClone(this.graph);
|
|
121
165
|
this.graph.entities = this.graph.entities.filter((e) => !names.includes(e.name));
|
|
122
166
|
this.graph.relations = this.graph.relations.filter((r) => !names.includes(r.from) && !names.includes(r.to));
|
|
123
|
-
await this.
|
|
167
|
+
await this.persistWithRollback(snapshot);
|
|
124
168
|
this.emitDelta('entities_deleted', names);
|
|
125
169
|
}
|
|
126
170
|
async deleteObservations(deletions) {
|
|
171
|
+
const snapshot = structuredClone(this.graph);
|
|
127
172
|
deletions.forEach((d) => {
|
|
128
173
|
const entity = this.graph.entities.find((e) => e.name === d.entityName);
|
|
129
174
|
if (entity) {
|
|
130
175
|
entity.observations = entity.observations.filter((o) => !d.observations.includes(o));
|
|
131
176
|
}
|
|
132
177
|
});
|
|
133
|
-
await this.
|
|
178
|
+
await this.persistWithRollback(snapshot);
|
|
134
179
|
this.emitDelta('observations_deleted', deletions);
|
|
135
180
|
}
|
|
136
181
|
async deleteRelations(relations) {
|
|
182
|
+
const snapshot = structuredClone(this.graph);
|
|
137
183
|
this.graph.relations = this.graph.relations.filter((r) => !relations.some((del) => r.from === del.from && r.to === del.to && r.relationType === del.relationType));
|
|
138
|
-
await this.
|
|
184
|
+
await this.persistWithRollback(snapshot);
|
|
139
185
|
this.emitDelta('relations_deleted', relations);
|
|
140
186
|
}
|
|
141
187
|
// -------------------------------------------------------------------------
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge-graph.js","sourceRoot":"","sources":["../../src/utils/knowledge-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmD3C,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,OAAO,qBAAsB,SAAQ,YAAY;IAIjC;IAHZ,KAAK,GAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC/C,YAAY,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAExD,YAAoB,cAAsB;QACxC,KAAK,EAAE,CAAC;QADU,mBAAc,GAAd,cAAc,CAAQ;IAE1C,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC9C,CAAC;IAED,4EAA4E;IAC5E,WAAW;IACX,4EAA4E;IAEpE,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACpE,
|
|
1
|
+
{"version":3,"file":"knowledge-graph.js","sourceRoot":"","sources":["../../src/utils/knowledge-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmD3C,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,OAAO,qBAAsB,SAAQ,YAAY;IAIjC;IAHZ,KAAK,GAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC/C,YAAY,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAExD,YAAoB,cAAsB;QACxC,KAAK,EAAE,CAAC;QADU,mBAAc,GAAd,cAAc,CAAQ;IAE1C,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC9C,CAAC;IAED,4EAA4E;IAC5E,WAAW;IACX,4EAA4E;IAEpE,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACpE,MAAM,KAAK,GAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;YACrD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAQH,CAAC;gBACF,IAAI,CAAC;oBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC1B,CAAC;gBAAC,MAAM,CAAC;oBACP,iEAAiE;oBACjE,6DAA6D;oBAC7D,SAAS;gBACX,CAAC;gBACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC5D,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;wBAClB,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;wBACjC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE;qBACtC,CAAC,CAAC;gBACL,CAAC;qBAAM,IACL,IAAI,CAAC,IAAI,KAAK,UAAU;oBACxB,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;oBAC7B,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,EAC3B,CAAC;oBACD,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;wBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE;qBACtC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAK,KAA+B,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;YACzC,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,OAAO;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,IAAI,CAC1B,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,mBAAmB,CAAC,QAAe;QAC/C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;YACtB,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,uDAAuD;IAC/C,KAAK,CAAC,SAAS;QACrB,MAAM,KAAK,GAAG;YACZ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/B,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,YAAY,EAAE,CAAC,CAAC,YAAY;aAC7B,CAAC,CACH;YACD,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAChC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAC3F;SACF,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;QAC7C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAChD,CAAC;IAED,6DAA6D;IACrD,SAAS,CAAC,MAAyB,EAAE,IAAa;QACxD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAiB,CAAC,CAAC;IACtD,CAAC;IAED,4EAA4E;IAC5E,yDAAyD;IACzD,4EAA4E;IAE5E,KAAK,CAAC,cAAc,CAAC,QAAkB;QACrC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CACzE,CAAC;QACF,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;QACzC,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;QAChD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAAqB;QACzC,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CACnC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CACxB,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;YACpB,QAAQ,CAAC,YAAY,KAAK,CAAC,CAAC,YAAY,CAC3C,CACJ,CAAC;QACF,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;QAClD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,YAAgC;QACpD,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACrC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;gBACxE,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,UAAU,YAAY,CAAC,CAAC;gBAChE,CAAC;gBACD,MAAM,eAAe,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CACvC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CACpD,CAAC;gBACF,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;gBAC7C,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC;YAC1E,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,CAAC,SAAS,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,oEAAoE;YACpE,wDAAwD;YACxD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;YACtB,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,KAAe;QAClC,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAChD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CACxD,CAAC;QACF,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,SAAgC;QACvD,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;YACxE,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACvF,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,SAAS,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAAqB;QACzC,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAChD,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,SAAS,CAAC,IAAI,CACb,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,YAAY,KAAK,GAAG,CAAC,YAAY,CACvF,CACJ,CAAC;QACF,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;IAED,4EAA4E;IAC5E,wDAAwD;IACxD,4EAA4E;IAE5E,SAAS;QACP,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,WAAW,CAAC,KAAa;QACvB,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CACjD,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;YACzC,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC/C,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CACnE,CAAC;QACF,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACzE,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CACnD,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CACxE,CAAC;QACF,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;IACtE,CAAC;IAED,SAAS,CAAC,KAAe;QACvB,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACnF,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACzE,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CACnD,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CACxE,CAAC;QACF,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;IACtE,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lift a legacy flat `mcpServers` map at the root of a config file into the
|
|
3
|
+
* canonical nested `mcp.servers`. Existing nested entries win; the flat key is
|
|
4
|
+
* removed. Mutates `fileConfig` in place and returns true when anything moved.
|
|
5
|
+
*
|
|
6
|
+
* OpenClaw's CLI switched to strict schema validation that rejects the unknown
|
|
7
|
+
* top-level `mcpServers` key, so leaving it behind crashes the gateway on
|
|
8
|
+
* startup. The same migration runs against openclaw.json (both at startup and
|
|
9
|
+
* on the scoped-merge path) and against ~/.claude/settings.json, which is why
|
|
10
|
+
* it lives here instead of being copy-pasted into each of them.
|
|
11
|
+
*/
|
|
12
|
+
export declare function migrateLegacyMcpServers(fileConfig: Record<string, unknown>, logPrefix: string): boolean;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
function asPlainObject(v) {
|
|
2
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v)
|
|
3
|
+
? v
|
|
4
|
+
: null;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Lift a legacy flat `mcpServers` map at the root of a config file into the
|
|
8
|
+
* canonical nested `mcp.servers`. Existing nested entries win; the flat key is
|
|
9
|
+
* removed. Mutates `fileConfig` in place and returns true when anything moved.
|
|
10
|
+
*
|
|
11
|
+
* OpenClaw's CLI switched to strict schema validation that rejects the unknown
|
|
12
|
+
* top-level `mcpServers` key, so leaving it behind crashes the gateway on
|
|
13
|
+
* startup. The same migration runs against openclaw.json (both at startup and
|
|
14
|
+
* on the scoped-merge path) and against ~/.claude/settings.json, which is why
|
|
15
|
+
* it lives here instead of being copy-pasted into each of them.
|
|
16
|
+
*/
|
|
17
|
+
export function migrateLegacyMcpServers(fileConfig, logPrefix) {
|
|
18
|
+
const flat = asPlainObject(fileConfig.mcpServers);
|
|
19
|
+
if (!flat)
|
|
20
|
+
return false;
|
|
21
|
+
const mcp = asPlainObject(fileConfig.mcp) ?? {};
|
|
22
|
+
const nested = asPlainObject(mcp.servers) ?? {};
|
|
23
|
+
for (const [name, value] of Object.entries(flat)) {
|
|
24
|
+
if (!(name in nested)) {
|
|
25
|
+
nested[name] = value;
|
|
26
|
+
console.log(`${logPrefix} MIGRATED legacy mcpServers.${name} → mcp.servers.${name}`);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
console.warn(`${logPrefix} MIGRATION SKIP: mcp.servers.${name} already exists, dropping legacy flat entry`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
mcp.servers = nested;
|
|
33
|
+
fileConfig.mcp = mcp;
|
|
34
|
+
delete fileConfig.mcpServers;
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=legacy-mcp-servers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-mcp-servers.js","sourceRoot":"","sources":["../../src/utils/legacy-mcp-servers.ts"],"names":[],"mappings":"AAAA,SAAS,aAAa,CAAC,CAAU;IAC/B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAE,CAA6B;QAChC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB,CACrC,UAAmC,EACnC,SAAiB;IAEjB,MAAM,IAAI,GAAG,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,MAAM,GAAG,GAAG,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAEhD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,+BAA+B,IAAI,kBAAkB,IAAI,EAAE,CAAC,CAAC;QACvF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CACV,GAAG,SAAS,gCAAgC,IAAI,6CAA6C,CAC9F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC;IACrB,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC;IACrB,OAAO,UAAU,CAAC,UAAU,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { toErrorMessage } from './response.js';
|
|
1
2
|
export class LogCollector {
|
|
2
3
|
buffer = [];
|
|
3
4
|
timer = null;
|
|
@@ -39,7 +40,7 @@ export class LogCollector {
|
|
|
39
40
|
if (this.buffer.length > 500) {
|
|
40
41
|
this.buffer.splice(500);
|
|
41
42
|
}
|
|
42
|
-
console.error('[log-collector] flush failed:', err
|
|
43
|
+
console.error('[log-collector] flush failed:', toErrorMessage(err));
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
46
|
async shutdown() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-collector.js","sourceRoot":"","sources":["../../src/utils/log-collector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"log-collector.js","sourceRoot":"","sources":["../../src/utils/log-collector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAU/C,MAAM,OAAO,YAAY;IACf,MAAM,GAAe,EAAE,CAAC;IACxB,KAAK,GAA0B,IAAI,CAAC;IAC3B,eAAe,CAAS;IACxB,YAAY,CAAS;IACrB,GAAG,CAAW;IAE/B,YAAY,GAAa,EAAE,IAA0D;QACnF,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,eAAe,GAAG,IAAI,EAAE,eAAe,IAAI,IAAI,CAAC;QACrD,IAAI,CAAC,YAAY,GAAG,IAAI,EAAE,YAAY,IAAI,EAAE,CAAC;QAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,IAAI,CACF,SAAiB,EACjB,KAA0C,EAC1C,OAAe,EACf,QAAkC;QAElC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,SAAS;YACT,KAAK;YACL,OAAO;YACP,QAAQ;YACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAChF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,kDAAkD;YAClD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;YAC9B,gDAAgD;YAChD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBAC7B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,KAAK;YAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACnF,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -12,6 +12,7 @@ import fs from 'node:fs/promises';
|
|
|
12
12
|
import path from 'node:path';
|
|
13
13
|
import { execAsync } from './exec.js';
|
|
14
14
|
import { config } from '../config.js';
|
|
15
|
+
import { toErrorMessage } from './response.js';
|
|
15
16
|
const OPENCLAW_PACKAGE = 'openclaw';
|
|
16
17
|
export const AC_PACKAGE = '@openclaw-cloud/agent-controller';
|
|
17
18
|
// ---------------------------------------------------------------------------
|
|
@@ -34,11 +35,11 @@ export async function withEaccesRetry(fn, label) {
|
|
|
34
35
|
return await fn();
|
|
35
36
|
}
|
|
36
37
|
catch (retryErr) {
|
|
37
|
-
console.error(`${label} failed after permission fix:`, retryErr
|
|
38
|
+
console.error(`${label} failed after permission fix:`, toErrorMessage(retryErr));
|
|
38
39
|
throw retryErr;
|
|
39
40
|
}
|
|
40
41
|
}
|
|
41
|
-
console.error(`${label} failed:`, err
|
|
42
|
+
console.error(`${label} failed:`, toErrorMessage(err));
|
|
42
43
|
throw err;
|
|
43
44
|
}
|
|
44
45
|
}
|
|
@@ -56,7 +57,7 @@ export async function getOpenclawVersion() {
|
|
|
56
57
|
stdout = await execAsync('openclaw --version', 10_000);
|
|
57
58
|
}
|
|
58
59
|
catch (err) {
|
|
59
|
-
const msg =
|
|
60
|
+
const msg = toErrorMessage(err);
|
|
60
61
|
throw new Error(`openclaw --version failed: ${msg}`);
|
|
61
62
|
}
|
|
62
63
|
// Match a SemVer-like token; tolerate prefixes like "openclaw v1.2.3"
|
|
@@ -139,7 +140,7 @@ export async function listInstalledPlugins() {
|
|
|
139
140
|
stdout = await execAsync('openclaw plugins list --json', 60_000);
|
|
140
141
|
}
|
|
141
142
|
catch (err) {
|
|
142
|
-
const msg =
|
|
143
|
+
const msg = toErrorMessage(err);
|
|
143
144
|
throw new Error(`openclaw plugins list --json failed: ${msg}`);
|
|
144
145
|
}
|
|
145
146
|
let parsed;
|
|
@@ -147,7 +148,7 @@ export async function listInstalledPlugins() {
|
|
|
147
148
|
parsed = JSON.parse(stdout);
|
|
148
149
|
}
|
|
149
150
|
catch (err) {
|
|
150
|
-
const msg =
|
|
151
|
+
const msg = toErrorMessage(err);
|
|
151
152
|
throw new Error(`openclaw plugins list --json returned invalid JSON (${msg}): ${stdout.slice(0, 200)}`);
|
|
152
153
|
}
|
|
153
154
|
// Accept either a top-level array or { plugins: [...] }
|
|
@@ -238,7 +239,7 @@ export async function installPlugins(plugins) {
|
|
|
238
239
|
inventory = await listInstalledPlugins();
|
|
239
240
|
}
|
|
240
241
|
catch (err) {
|
|
241
|
-
console.warn('listInstalledPlugins failed; proceeding without skip-cache:', err
|
|
242
|
+
console.warn('listInstalledPlugins failed; proceeding without skip-cache:', toErrorMessage(err));
|
|
242
243
|
}
|
|
243
244
|
for (const p of plugins) {
|
|
244
245
|
if (!p || typeof p.id !== 'string' || typeof p.version !== 'string' || !p.id || !p.version) {
|
|
@@ -253,7 +254,7 @@ export async function installPlugins(plugins) {
|
|
|
253
254
|
result.skipped.push(p.id);
|
|
254
255
|
}
|
|
255
256
|
catch (err) {
|
|
256
|
-
const msg =
|
|
257
|
+
const msg = toErrorMessage(err);
|
|
257
258
|
result.failed.push({ id: p.id, error: msg });
|
|
258
259
|
}
|
|
259
260
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openclaw-ops.js","sourceRoot":"","sources":["../../src/utils/openclaw-ops.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"openclaw-ops.js","sourceRoot":"","sources":["../../src/utils/openclaw-ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type InstallPluginsResult } from './openclaw-ops.js';
|
|
2
|
+
export interface OpenclawStackUpdateOptions {
|
|
3
|
+
/** openclaw runtime version to install. Omit to only touch plugins. */
|
|
4
|
+
version?: string;
|
|
5
|
+
plugins?: Array<{
|
|
6
|
+
id: string;
|
|
7
|
+
version: string;
|
|
8
|
+
}>;
|
|
9
|
+
/**
|
|
10
|
+
* Prefix for the emitted logCollector events (`self_update`, `agent_update`,
|
|
11
|
+
* `agent_update_cli`). Kept per-caller so backend log queries can still tell
|
|
12
|
+
* a self-update apart from an agent-update.
|
|
13
|
+
*/
|
|
14
|
+
eventPrefix: string;
|
|
15
|
+
/** Extra fields merged into every emitted event (e.g. `{ commandId }`). */
|
|
16
|
+
meta?: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
export interface OpenclawStackUpdateResult {
|
|
19
|
+
runtimeChanged: boolean;
|
|
20
|
+
pluginSummary?: InstallPluginsResult;
|
|
21
|
+
/** True only when a restart was attempted AND succeeded. */
|
|
22
|
+
gatewayRestarted: boolean;
|
|
23
|
+
/** Set when a restart was attempted and failed (best-effort — not fatal). */
|
|
24
|
+
restartError?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Throws whatever `installOpenclaw` / `installPlugins` throw — per-plugin
|
|
28
|
+
* failures are reported inside `pluginSummary`, not raised. A failed gateway
|
|
29
|
+
* restart is never thrown: the install already landed, so it is a warning.
|
|
30
|
+
*/
|
|
31
|
+
export declare function runOpenclawStackUpdate(opts: OpenclawStackUpdateOptions): Promise<OpenclawStackUpdateResult>;
|