@openclaw-cloud/agent-controller 3.0.0 → 3.1.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 +7 -0
- package/dist/api.js.map +1 -1
- package/dist/commands/bootstrap.d.ts +10 -1
- package/dist/commands/bootstrap.js +21 -69
- package/dist/commands/bootstrap.js.map +1 -1
- package/dist/commands/plugin-update-cli.js +6 -3
- package/dist/commands/plugin-update-cli.js.map +1 -1
- package/dist/commands/self-update.js +53 -2
- package/dist/commands/self-update.js.map +1 -1
- package/dist/commands/update-skills.js +3 -3
- package/dist/commands/update-skills.js.map +1 -1
- package/dist/config-file.js +1 -0
- package/dist/config-file.js.map +1 -1
- package/dist/connection.d.ts +4 -0
- package/dist/connection.js +48 -5
- package/dist/connection.js.map +1 -1
- package/dist/handlers/memory.d.ts +11 -1
- package/dist/handlers/memory.js.map +1 -1
- package/dist/handlers/update-config.js +2 -3
- package/dist/handlers/update-config.js.map +1 -1
- package/dist/heartbeat.d.ts +7 -1
- package/dist/heartbeat.js +53 -0
- package/dist/heartbeat.js.map +1 -1
- package/dist/index.js +23 -35
- package/dist/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/types.d.ts +23 -0
- package/dist/utils/apply-config.d.ts +25 -6
- package/dist/utils/apply-config.js +77 -11
- package/dist/utils/apply-config.js.map +1 -1
- package/dist/utils/claude-env.d.ts +6 -0
- package/dist/utils/claude-env.js +11 -0
- 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/exec.d.ts +9 -0
- package/dist/utils/exec.js +12 -1
- package/dist/utils/exec.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/openclaw-ops.d.ts +45 -3
- package/dist/utils/openclaw-ops.js +86 -8
- package/dist/utils/openclaw-ops.js.map +1 -1
- package/dist/utils/write-workspace-files.d.ts +1 -1
- package/dist/utils/write-workspace-files.js +22 -5
- package/dist/utils/write-workspace-files.js.map +1 -1
- package/package.json +9 -4
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
*
|
|
9
9
|
* NEVER import 'process.env.X' here — use config from '../config.js'.
|
|
10
10
|
*/
|
|
11
|
+
import fs from 'node:fs/promises';
|
|
12
|
+
import path from 'node:path';
|
|
11
13
|
import { execAsync } from './exec.js';
|
|
12
14
|
import { config } from '../config.js';
|
|
13
15
|
const OPENCLAW_PACKAGE = 'openclaw';
|
|
@@ -64,15 +66,77 @@ export async function getOpenclawVersion() {
|
|
|
64
66
|
}
|
|
65
67
|
return match[0];
|
|
66
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Reads installed plugins from `<stateDir>/openclaw.json` directly.
|
|
71
|
+
*
|
|
72
|
+
* Why prefer the config file over the CLI: the WS `plugin_update` handler
|
|
73
|
+
* (and `agent-update`) writes `plugins.installs.<id>.{spec, version,
|
|
74
|
+
* resolvedVersion}` into the openclaw config; openclaw watches the file
|
|
75
|
+
* and reloads. So the config file is the canonical "what's installed"
|
|
76
|
+
* record — there is no separate package directory we need to enumerate.
|
|
77
|
+
*
|
|
78
|
+
* Reading the file avoids:
|
|
79
|
+
* - 30s-cadence `openclaw plugins list --json` fork+execs from the
|
|
80
|
+
* heartbeat loop, AND
|
|
81
|
+
* - dependency on a specific openclaw CLI version exposing that
|
|
82
|
+
* subcommand at all (older runtimes silently failed → empty list).
|
|
83
|
+
*
|
|
84
|
+
* Returns an empty array on missing file, malformed JSON, or absent
|
|
85
|
+
* `plugins.installs` — heartbeat callers don't want to crash on partial
|
|
86
|
+
* config. Prefers `resolvedVersion` (the post-install actual version)
|
|
87
|
+
* over `version` (the requested spec) when both are present.
|
|
88
|
+
*/
|
|
89
|
+
export async function listInstalledPluginsFromConfig() {
|
|
90
|
+
const configPath = path.join(config.stateDir, 'openclaw.json');
|
|
91
|
+
let raw;
|
|
92
|
+
try {
|
|
93
|
+
raw = await fs.readFile(configPath, 'utf-8');
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
let parsed;
|
|
99
|
+
try {
|
|
100
|
+
parsed = JSON.parse(raw);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
const plugins = parsed?.plugins;
|
|
106
|
+
if (!plugins || typeof plugins !== 'object')
|
|
107
|
+
return [];
|
|
108
|
+
const installs = plugins.installs;
|
|
109
|
+
if (!installs || typeof installs !== 'object')
|
|
110
|
+
return [];
|
|
111
|
+
const out = [];
|
|
112
|
+
for (const [id, value] of Object.entries(installs)) {
|
|
113
|
+
if (!id || !value || typeof value !== 'object')
|
|
114
|
+
continue;
|
|
115
|
+
const v = value;
|
|
116
|
+
const version = typeof v.resolvedVersion === 'string' && v.resolvedVersion.length > 0
|
|
117
|
+
? v.resolvedVersion
|
|
118
|
+
: typeof v.version === 'string' && v.version.length > 0
|
|
119
|
+
? v.version
|
|
120
|
+
: null;
|
|
121
|
+
if (!version)
|
|
122
|
+
continue;
|
|
123
|
+
out.push({ id, version });
|
|
124
|
+
}
|
|
125
|
+
return out;
|
|
126
|
+
}
|
|
67
127
|
/**
|
|
68
128
|
* Reads the installed plugin list via `openclaw plugins list --json`.
|
|
69
129
|
* Throws on exec failure or malformed JSON, including a stdout snippet so
|
|
70
130
|
* operators can debug from the agent log.
|
|
131
|
+
*
|
|
132
|
+
* 60-second timeout: the CLI has been observed to take 30s+ on cold
|
|
133
|
+
* boot when openclaw warms up its plugin scanner, and a tighter cap
|
|
134
|
+
* caused spurious failures from the heartbeat / installPlugins paths.
|
|
71
135
|
*/
|
|
72
136
|
export async function listInstalledPlugins() {
|
|
73
137
|
let stdout;
|
|
74
138
|
try {
|
|
75
|
-
stdout = await execAsync('openclaw plugins list --json',
|
|
139
|
+
stdout = await execAsync('openclaw plugins list --json', 60_000);
|
|
76
140
|
}
|
|
77
141
|
catch (err) {
|
|
78
142
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -114,6 +178,12 @@ export async function listInstalledPlugins() {
|
|
|
114
178
|
/**
|
|
115
179
|
* Install a specific openclaw runtime version globally.
|
|
116
180
|
* Skip-fast when `openclaw --version` already matches.
|
|
181
|
+
*
|
|
182
|
+
* `--force` is required: a previous install often leaves the
|
|
183
|
+
* `/usr/local/bin/openclaw` symlink owned by a different user (or
|
|
184
|
+
* untracked by the new package metadata), which makes a plain
|
|
185
|
+
* `npm install -g openclaw@<v>` fail with `EEXIST: file already exists`.
|
|
186
|
+
* The flag tells npm to overwrite the existing link instead of bailing.
|
|
117
187
|
*/
|
|
118
188
|
export async function installOpenclaw(version) {
|
|
119
189
|
let current = null;
|
|
@@ -126,7 +196,7 @@ export async function installOpenclaw(version) {
|
|
|
126
196
|
if (current === version) {
|
|
127
197
|
return false;
|
|
128
198
|
}
|
|
129
|
-
await withEaccesRetry(() => execAsync(`npm install -g ${OPENCLAW_PACKAGE}@${version}`, 120_000), `npm install -g ${OPENCLAW_PACKAGE}@${version}`);
|
|
199
|
+
await withEaccesRetry(() => execAsync(`npm install -g ${OPENCLAW_PACKAGE}@${version} --force`, 120_000), `npm install -g ${OPENCLAW_PACKAGE}@${version}`);
|
|
130
200
|
return true;
|
|
131
201
|
}
|
|
132
202
|
/**
|
|
@@ -144,9 +214,20 @@ export async function installPlugin(id, version, alreadyInstalled) {
|
|
|
144
214
|
return true;
|
|
145
215
|
}
|
|
146
216
|
/**
|
|
147
|
-
* Install several plugins sequentially. One
|
|
148
|
-
* is shared across the whole loop;
|
|
149
|
-
* not abort the rest of the
|
|
217
|
+
* Install several plugins sequentially. One inventory probe via
|
|
218
|
+
* `openclaw plugins list --json` is shared across the whole loop;
|
|
219
|
+
* per-plugin failures are recorded but do not abort the rest of the
|
|
220
|
+
* batch (poison-pill protection).
|
|
221
|
+
*
|
|
222
|
+
* Why CLI not config-file: the config file's `plugins.installs` block
|
|
223
|
+
* is incomplete in practice (bundled / compat-discovered plugins are
|
|
224
|
+
* absent, and openclaw itself sometimes rewrites the file without
|
|
225
|
+
* preserving installs), so a config-driven skip-cache under-reports
|
|
226
|
+
* what's actually loaded and forces every install to re-run with
|
|
227
|
+
* `--force`. The CLI is the source of truth.
|
|
228
|
+
*
|
|
229
|
+
* If the CLI throws we still try every install — the per-plugin
|
|
230
|
+
* `installPlugin --force` will overwrite cleanly.
|
|
150
231
|
*/
|
|
151
232
|
export async function installPlugins(plugins) {
|
|
152
233
|
const result = { installed: [], skipped: [], failed: [] };
|
|
@@ -157,9 +238,6 @@ export async function installPlugins(plugins) {
|
|
|
157
238
|
inventory = await listInstalledPlugins();
|
|
158
239
|
}
|
|
159
240
|
catch (err) {
|
|
160
|
-
// If we cannot read the inventory we still try to install — the CLI's
|
|
161
|
-
// own --force will overwrite. Record the read failure as the first
|
|
162
|
-
// diagnostic context but don't abort.
|
|
163
241
|
console.warn('listInstalledPlugins failed; proceeding without skip-cache:', err instanceof Error ? err.message : err);
|
|
164
242
|
}
|
|
165
243
|
for (const p of plugins) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openclaw-ops.js","sourceRoot":"","sources":["../../src/utils/openclaw-ops.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,gBAAgB,GAAG,UAAU,CAAC;AACpC,MAAM,CAAC,MAAM,UAAU,GAAG,kCAAkC,CAAC;AAE7D,8EAA8E;AAC9E,yEAAyE;AACzE,8DAA8D;AAC9D,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;IACnF,MAAM,SAAS,CACb,oCAAoC,IAAI,WAAW,IAAI,mCAAmC,EAC1F,MAAM,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAI,EAAoB,EAAE,KAAa;IAC1E,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3D,MAAM,iBAAiB,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,OAAO,MAAM,EAAE,EAAE,CAAC;YACpB,CAAC;YAAC,OAAO,QAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CACX,GAAG,KAAK,+BAA+B,EACvC,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CACxD,CAAC;gBACF,MAAM,QAAQ,CAAC;YACjB,CAAC;QACH,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,UAAU,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC5E,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,SAAS,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,sEAAsE;IACtE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,mDAAmD,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAOD
|
|
1
|
+
{"version":3,"file":"openclaw-ops.js","sourceRoot":"","sources":["../../src/utils/openclaw-ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,4 +12,4 @@
|
|
|
12
12
|
* command path in `applyBootstrapConfig` (propagates shared-file updates from
|
|
13
13
|
* the backend without requiring a restart).
|
|
14
14
|
*/
|
|
15
|
-
export declare function writeWorkspaceFiles(files: Record<string, string>, workspaceDir: string): Promise<
|
|
15
|
+
export declare function writeWorkspaceFiles(files: Record<string, string>, workspaceDir: string): Promise<number>;
|
|
@@ -17,32 +17,49 @@ import path from 'node:path';
|
|
|
17
17
|
export async function writeWorkspaceFiles(files, workspaceDir) {
|
|
18
18
|
const fileNames = Object.keys(files);
|
|
19
19
|
if (fileNames.length === 0)
|
|
20
|
-
return;
|
|
20
|
+
return 0;
|
|
21
21
|
await fs.mkdir(workspaceDir, { recursive: true });
|
|
22
|
+
const written = [];
|
|
22
23
|
for (const [filePath, content] of Object.entries(files)) {
|
|
24
|
+
// Reject any key that escapes the workspace. The file_write handler applies
|
|
25
|
+
// the same sandbox; writeWorkspaceFiles previously had no guard, so a
|
|
26
|
+
// backend-supplied key like "../../etc/openclaw/agent.env" or an absolute
|
|
27
|
+
// path could write outside the workspace.
|
|
23
28
|
const fullPath = path.join(workspaceDir, filePath);
|
|
29
|
+
const rel = path.relative(workspaceDir, fullPath);
|
|
30
|
+
// Segment-aware containment: reject absolute keys and real ".." traversal,
|
|
31
|
+
// but allow filenames that merely contain ".." (e.g. "notes..v2.md").
|
|
32
|
+
if (path.isAbsolute(filePath) ||
|
|
33
|
+
rel === '..' ||
|
|
34
|
+
rel.startsWith('..' + path.sep) ||
|
|
35
|
+
path.isAbsolute(rel)) {
|
|
36
|
+
console.error(` ✗ ${filePath}: rejected (path escapes workspace)`);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
24
39
|
await fs.mkdir(path.dirname(fullPath), { recursive: true });
|
|
25
40
|
try {
|
|
26
41
|
await fs.writeFile(fullPath, content);
|
|
42
|
+
written.push(filePath);
|
|
27
43
|
console.log(` ✓ ${filePath}`);
|
|
28
44
|
}
|
|
29
45
|
catch (err) {
|
|
30
46
|
console.error(` ✗ ${filePath}: ${err instanceof Error ? err.message : err}`);
|
|
31
47
|
}
|
|
32
48
|
}
|
|
33
|
-
// Make .sh files executable
|
|
34
|
-
for (const filePath of
|
|
49
|
+
// Make .sh files executable (only the ones we actually wrote)
|
|
50
|
+
for (const filePath of written) {
|
|
35
51
|
if (filePath.endsWith('.sh')) {
|
|
36
52
|
const fullPath = path.join(workspaceDir, filePath);
|
|
37
53
|
await fs.chmod(fullPath, 0o755);
|
|
38
54
|
}
|
|
39
55
|
}
|
|
40
56
|
// Summary for deployed skills (under .agents/skills/<name>/...)
|
|
41
|
-
const skillFiles =
|
|
57
|
+
const skillFiles = written.filter((f) => f.startsWith('.agents/skills/'));
|
|
42
58
|
if (skillFiles.length > 0) {
|
|
43
59
|
const skills = [...new Set(skillFiles.map((f) => f.split('/')[2]))];
|
|
44
60
|
console.log(` ✓ skills deployed: ${skills.join(', ')}`);
|
|
45
61
|
}
|
|
46
|
-
console.log(` wrote ${
|
|
62
|
+
console.log(` wrote ${written.length} workspace files`);
|
|
63
|
+
return written.length;
|
|
47
64
|
}
|
|
48
65
|
//# sourceMappingURL=write-workspace-files.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-workspace-files.js","sourceRoot":"","sources":["../../src/utils/write-workspace-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAA6B,EAC7B,YAAoB;IAEpB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"write-workspace-files.js","sourceRoot":"","sources":["../../src/utils/write-workspace-files.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw-cloud/agent-controller",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.1",
|
|
4
|
+
"packageManager": "pnpm@11.5.2",
|
|
4
5
|
"type": "module",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=22"
|
|
8
|
+
},
|
|
5
9
|
"main": "dist/index.js",
|
|
6
10
|
"bin": {
|
|
7
11
|
"agent-controller": "bin/agent-controller.js"
|
|
8
12
|
},
|
|
9
13
|
"scripts": {
|
|
10
14
|
"build": "tsc",
|
|
11
|
-
"prepublishOnly": "
|
|
12
|
-
"test": "
|
|
15
|
+
"prepublishOnly": "pnpm run build",
|
|
16
|
+
"test": "NODE_OPTIONS=--experimental-vm-modules jest --forceExit",
|
|
13
17
|
"start": "node bin/agent-controller.js",
|
|
14
|
-
"prepare": "[ -
|
|
18
|
+
"prepare": "[ -e .git ] && husky || true",
|
|
15
19
|
"lint": "eslint --fix ./src"
|
|
16
20
|
},
|
|
17
21
|
"files": [
|
|
@@ -25,6 +29,7 @@
|
|
|
25
29
|
"zod": "^4.3.6"
|
|
26
30
|
},
|
|
27
31
|
"devDependencies": {
|
|
32
|
+
"@jest/globals": "^30.0.0",
|
|
28
33
|
"@semantic-release/git": "^10.0.1",
|
|
29
34
|
"@semantic-release/npm": "^13.1.5",
|
|
30
35
|
"@types/jest": "^30.0.0",
|