@openclaw-cloud/agent-controller 2.4.0-beta.2 → 2.4.0-beta.3
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 +7 -1
- package/dist/commands/agent-update-cli.d.ts +1 -0
- package/dist/commands/agent-update-cli.js +104 -0
- package/dist/commands/agent-update-cli.js.map +1 -0
- package/dist/commands/plugin-update-cli.d.ts +1 -0
- package/dist/commands/plugin-update-cli.js +77 -0
- package/dist/commands/plugin-update-cli.js.map +1 -0
- package/package.json +1 -1
package/bin/agent-controller.js
CHANGED
|
@@ -43,13 +43,19 @@ if (command === '--version' || command === '-v') {
|
|
|
43
43
|
} else if (command === 'channel-server' || command === 'channel_server') {
|
|
44
44
|
const { runChannelServer } = await import('../dist/commands/channel-server.js');
|
|
45
45
|
await runChannelServer(process.argv.slice(3));
|
|
46
|
+
} else if (command === 'plugin-update' || command === 'plugin_update') {
|
|
47
|
+
const { runPluginUpdateCli } = await import('../dist/commands/plugin-update-cli.js');
|
|
48
|
+
await runPluginUpdateCli(process.argv.slice(3));
|
|
49
|
+
} else if (command === 'agent-update' || command === 'agent_update') {
|
|
50
|
+
const { runAgentUpdateCli } = await import('../dist/commands/agent-update-cli.js');
|
|
51
|
+
await runAgentUpdateCli(process.argv.slice(3));
|
|
46
52
|
} else if (command === undefined) {
|
|
47
53
|
const { main } = await import('../dist/index.js');
|
|
48
54
|
main();
|
|
49
55
|
} else {
|
|
50
56
|
console.error(`Unknown command: ${command}`);
|
|
51
57
|
console.error(
|
|
52
|
-
'Available: --version, self-update, backup, knowledge-sync, heartbeat, bootstrap, update-config, install-deps, install, uninstall, channel-server',
|
|
58
|
+
'Available: --version, self-update, backup, knowledge-sync, heartbeat, bootstrap, update-config, install-deps, install, uninstall, channel-server, plugin-update, agent-update',
|
|
53
59
|
);
|
|
54
60
|
process.exit(2);
|
|
55
61
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runAgentUpdateCli(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { installOpenclaw, installPlugins, } from '../utils/openclaw-ops.js';
|
|
2
|
+
import { restartGateway } from '../utils/gateway-restart.js';
|
|
3
|
+
import { logCollector } from '../connection.js';
|
|
4
|
+
import { toErrorMessage } from '../utils/response.js';
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// CLI entrypoint for
|
|
7
|
+
// agent-controller agent-update <openclaw-version> [plugin@v ...]
|
|
8
|
+
// Mirrors the WS handler at src/handlers/agent-update.ts: install runtime,
|
|
9
|
+
// install plugins (per-plugin failures recorded but don't abort the batch),
|
|
10
|
+
// then a single best-effort gateway restart if anything actually changed.
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
const USAGE = 'Usage: agent-controller agent-update <openclaw-version> [plugin1@v1 plugin2@v2 ...]';
|
|
13
|
+
function parsePluginToken(token) {
|
|
14
|
+
const at = token.lastIndexOf('@');
|
|
15
|
+
if (at <= 0)
|
|
16
|
+
return null;
|
|
17
|
+
const id = token.slice(0, at).trim();
|
|
18
|
+
const version = token.slice(at + 1).trim();
|
|
19
|
+
if (!id || !version)
|
|
20
|
+
return null;
|
|
21
|
+
return { id, version };
|
|
22
|
+
}
|
|
23
|
+
function parseArgs(args) {
|
|
24
|
+
if (args.length < 1)
|
|
25
|
+
return null;
|
|
26
|
+
const openclawVersion = args[0]?.trim() ?? '';
|
|
27
|
+
if (!openclawVersion)
|
|
28
|
+
return null;
|
|
29
|
+
const plugins = [];
|
|
30
|
+
for (const token of args.slice(1)) {
|
|
31
|
+
const p = parsePluginToken(token);
|
|
32
|
+
if (!p)
|
|
33
|
+
return null;
|
|
34
|
+
plugins.push(p);
|
|
35
|
+
}
|
|
36
|
+
return { openclawVersion, plugins };
|
|
37
|
+
}
|
|
38
|
+
function logSummary(runtimeChanged, summary) {
|
|
39
|
+
console.log(`[agent-update] runtime ${runtimeChanged ? 'installed' : 'unchanged'}`);
|
|
40
|
+
if (summary) {
|
|
41
|
+
if (summary.installed.length > 0) {
|
|
42
|
+
console.log(`[agent-update] plugins installed: ${summary.installed.join(', ')}`);
|
|
43
|
+
}
|
|
44
|
+
if (summary.skipped.length > 0) {
|
|
45
|
+
console.log(`[agent-update] plugins skipped: ${summary.skipped.join(', ')}`);
|
|
46
|
+
}
|
|
47
|
+
if (summary.failed.length > 0) {
|
|
48
|
+
for (const f of summary.failed) {
|
|
49
|
+
console.error(`[agent-update] plugin failed: ${f.id} — ${f.error}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export async function runAgentUpdateCli(args) {
|
|
55
|
+
const parsed = parseArgs(args);
|
|
56
|
+
if (!parsed) {
|
|
57
|
+
console.error(USAGE);
|
|
58
|
+
process.exit(2);
|
|
59
|
+
}
|
|
60
|
+
const { openclawVersion, plugins } = parsed;
|
|
61
|
+
logCollector?.push('agent_update_cli_start', 'info', 'agent-update CLI invoked', {
|
|
62
|
+
version: openclawVersion,
|
|
63
|
+
pluginCount: plugins.length,
|
|
64
|
+
});
|
|
65
|
+
let runtimeChanged = false;
|
|
66
|
+
let pluginSummary;
|
|
67
|
+
try {
|
|
68
|
+
console.log(`[agent-update] installing openclaw@${openclawVersion}...`);
|
|
69
|
+
runtimeChanged = await installOpenclaw(openclawVersion);
|
|
70
|
+
if (plugins.length > 0) {
|
|
71
|
+
console.log(`[agent-update] installing ${plugins.length} plugin(s)...`);
|
|
72
|
+
pluginSummary = await installPlugins(plugins);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
const msg = toErrorMessage(err);
|
|
77
|
+
console.error(`[agent-update] failed: ${msg}`);
|
|
78
|
+
logCollector?.push('agent_update_cli_failed', 'error', 'agent-update CLI failed', {
|
|
79
|
+
version: openclawVersion,
|
|
80
|
+
error: msg,
|
|
81
|
+
});
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
logSummary(runtimeChanged, pluginSummary);
|
|
85
|
+
const installedCount = pluginSummary?.installed.length ?? 0;
|
|
86
|
+
const anyChanged = runtimeChanged || installedCount > 0;
|
|
87
|
+
if (anyChanged) {
|
|
88
|
+
console.log('[agent-update] restarting gateway...');
|
|
89
|
+
try {
|
|
90
|
+
await restartGateway();
|
|
91
|
+
console.log('[agent-update] gateway restarted');
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
const msg = toErrorMessage(err);
|
|
95
|
+
console.error(`[agent-update] gateway restart failed (treating as warning): ${msg}`);
|
|
96
|
+
logCollector?.push('agent_update_cli_restart_failed', 'warn', 'Gateway restart failed after CLI agent-update', { version: openclawVersion, error: msg });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
console.log('[agent-update] nothing changed, skipping gateway restart');
|
|
101
|
+
}
|
|
102
|
+
console.log('[agent-update] done');
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=agent-update-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-update-cli.js","sourceRoot":"","sources":["../../src/commands/agent-update-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runPluginUpdateCli(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { installPlugin } from '../utils/openclaw-ops.js';
|
|
2
|
+
import { restartGateway } from '../utils/gateway-restart.js';
|
|
3
|
+
import { logCollector } from '../connection.js';
|
|
4
|
+
import { toErrorMessage } from '../utils/response.js';
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// CLI entrypoint for `agent-controller plugin-update <id> <version>`
|
|
7
|
+
// (also accepts `<id>@<version>` shorthand). Mirrors the behaviour of the WS
|
|
8
|
+
// handler at src/handlers/plugin-update.ts: install, then best-effort restart
|
|
9
|
+
// the gateway. Restart failures degrade to a warning — the install already
|
|
10
|
+
// succeeded so we exit 0.
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
const USAGE = 'Usage: agent-controller plugin-update <id> <version>\n' +
|
|
13
|
+
' agent-controller plugin-update <id>@<version>';
|
|
14
|
+
function parseArgs(args) {
|
|
15
|
+
if (args.length === 1) {
|
|
16
|
+
const at = args[0].lastIndexOf('@');
|
|
17
|
+
// Reject leading-@ so `@scope/name` without version doesn't slip through.
|
|
18
|
+
if (at <= 0)
|
|
19
|
+
return null;
|
|
20
|
+
const id = args[0].slice(0, at).trim();
|
|
21
|
+
const version = args[0].slice(at + 1).trim();
|
|
22
|
+
if (!id || !version)
|
|
23
|
+
return null;
|
|
24
|
+
return { id, version };
|
|
25
|
+
}
|
|
26
|
+
if (args.length === 2) {
|
|
27
|
+
const id = args[0]?.trim() ?? '';
|
|
28
|
+
const version = args[1]?.trim() ?? '';
|
|
29
|
+
if (!id || !version)
|
|
30
|
+
return null;
|
|
31
|
+
return { id, version };
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
export async function runPluginUpdateCli(args) {
|
|
36
|
+
const parsed = parseArgs(args);
|
|
37
|
+
if (!parsed) {
|
|
38
|
+
console.error(USAGE);
|
|
39
|
+
process.exit(2);
|
|
40
|
+
}
|
|
41
|
+
const { id, version } = parsed;
|
|
42
|
+
logCollector?.push('plugin_update_cli_start', 'info', 'plugin-update CLI invoked', {
|
|
43
|
+
id,
|
|
44
|
+
version,
|
|
45
|
+
});
|
|
46
|
+
try {
|
|
47
|
+
console.log(`[plugin-update] installing ${id}@${version}...`);
|
|
48
|
+
const installed = await installPlugin(id, version);
|
|
49
|
+
if (!installed) {
|
|
50
|
+
console.log(`[plugin-update] ${id}@${version} already installed, nothing to do`);
|
|
51
|
+
console.log('[plugin-update] done');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
console.log('[plugin-update] restarting gateway...');
|
|
55
|
+
try {
|
|
56
|
+
await restartGateway();
|
|
57
|
+
console.log('[plugin-update] gateway restarted');
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
const msg = toErrorMessage(err);
|
|
61
|
+
console.error(`[plugin-update] gateway restart failed (treating as warning): ${msg}`);
|
|
62
|
+
logCollector?.push('plugin_update_cli_restart_failed', 'warn', 'Gateway restart failed after CLI plugin install', { id, version, error: msg });
|
|
63
|
+
}
|
|
64
|
+
console.log('[plugin-update] done');
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
const msg = toErrorMessage(err);
|
|
68
|
+
console.error(`[plugin-update] failed: ${msg}`);
|
|
69
|
+
logCollector?.push('plugin_update_cli_failed', 'error', 'plugin-update CLI failed', {
|
|
70
|
+
id,
|
|
71
|
+
version,
|
|
72
|
+
error: msg,
|
|
73
|
+
});
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=plugin-update-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-update-cli.js","sourceRoot":"","sources":["../../src/commands/plugin-update-cli.ts"],"names":[],"mappings":"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"}
|