@openclaw-cloud/agent-controller 3.6.2 → 3.6.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.
Files changed (205) hide show
  1. package/dist/api.d.ts +2 -14
  2. package/dist/api.js +1 -15
  3. package/dist/api.js.map +1 -1
  4. package/dist/commands/agent-update-cli.js +0 -7
  5. package/dist/commands/agent-update-cli.js.map +1 -1
  6. package/dist/commands/bootstrap.d.ts +0 -10
  7. package/dist/commands/bootstrap.js +2 -16
  8. package/dist/commands/bootstrap.js.map +1 -1
  9. package/dist/commands/channel-server.d.ts +0 -16
  10. package/dist/commands/channel-server.js +1 -19
  11. package/dist/commands/channel-server.js.map +1 -1
  12. package/dist/commands/deploy-cli.js +2 -12
  13. package/dist/commands/deploy-cli.js.map +1 -1
  14. package/dist/commands/diagnostics-cli.js +0 -6
  15. package/dist/commands/diagnostics-cli.js.map +1 -1
  16. package/dist/commands/install-deps.d.ts +0 -10
  17. package/dist/commands/install-deps.js +1 -10
  18. package/dist/commands/install-deps.js.map +1 -1
  19. package/dist/commands/install.js +0 -6
  20. package/dist/commands/install.js.map +1 -1
  21. package/dist/commands/package-install-cli.js +1 -14
  22. package/dist/commands/package-install-cli.js.map +1 -1
  23. package/dist/commands/plugin-update-cli.js +1 -8
  24. package/dist/commands/plugin-update-cli.js.map +1 -1
  25. package/dist/commands/restart-cli.js +0 -4
  26. package/dist/commands/restart-cli.js.map +1 -1
  27. package/dist/commands/self-update.d.ts +2 -24
  28. package/dist/commands/self-update.js +5 -54
  29. package/dist/commands/self-update.js.map +1 -1
  30. package/dist/commands/stop-cli.d.ts +0 -4
  31. package/dist/commands/stop-cli.js +1 -24
  32. package/dist/commands/stop-cli.js.map +1 -1
  33. package/dist/config-file.d.ts +3 -20
  34. package/dist/config-file.js +3 -22
  35. package/dist/config-file.js.map +1 -1
  36. package/dist/config.d.ts +0 -22
  37. package/dist/config.js +1 -34
  38. package/dist/config.js.map +1 -1
  39. package/dist/connection.js +2 -39
  40. package/dist/connection.js.map +1 -1
  41. package/dist/handlers/agent-update.d.ts +1 -21
  42. package/dist/handlers/agent-update.js +1 -21
  43. package/dist/handlers/agent-update.js.map +1 -1
  44. package/dist/handlers/chat.d.ts +0 -8
  45. package/dist/handlers/chat.js +3 -23
  46. package/dist/handlers/chat.js.map +1 -1
  47. package/dist/handlers/file-write.js +1 -4
  48. package/dist/handlers/file-write.js.map +1 -1
  49. package/dist/handlers/memory.d.ts +1 -9
  50. package/dist/handlers/memory.js +3 -25
  51. package/dist/handlers/memory.js.map +1 -1
  52. package/dist/handlers/onboarding.js +0 -2
  53. package/dist/handlers/onboarding.js.map +1 -1
  54. package/dist/handlers/pair.js +1 -3
  55. package/dist/handlers/pair.js.map +1 -1
  56. package/dist/handlers/plugin-update.d.ts +1 -16
  57. package/dist/handlers/plugin-update.js +1 -16
  58. package/dist/handlers/plugin-update.js.map +1 -1
  59. package/dist/handlers/restart.js +0 -2
  60. package/dist/handlers/restart.js.map +1 -1
  61. package/dist/handlers/self-update.d.ts +2 -29
  62. package/dist/handlers/self-update.js +3 -35
  63. package/dist/handlers/self-update.js.map +1 -1
  64. package/dist/handlers/slack-event.d.ts +2 -9
  65. package/dist/handlers/slack-event.js +2 -10
  66. package/dist/handlers/slack-event.js.map +1 -1
  67. package/dist/heartbeat.d.ts +2 -12
  68. package/dist/heartbeat.js +3 -18
  69. package/dist/heartbeat.js.map +1 -1
  70. package/dist/index.js +6 -50
  71. package/dist/index.js.map +1 -1
  72. package/dist/lockfile.d.ts +0 -7
  73. package/dist/lockfile.js +0 -9
  74. package/dist/lockfile.js.map +1 -1
  75. package/dist/memory-mcp-server.d.ts +1 -19
  76. package/dist/memory-mcp-server.js +5 -53
  77. package/dist/memory-mcp-server.js.map +1 -1
  78. package/dist/mock-board-worker.d.ts +2 -25
  79. package/dist/mock-board-worker.js +7 -54
  80. package/dist/mock-board-worker.js.map +1 -1
  81. package/dist/platform/linux.js +0 -3
  82. package/dist/platform/linux.js.map +1 -1
  83. package/dist/platform/macos.js +0 -2
  84. package/dist/platform/macos.js.map +1 -1
  85. package/dist/providers/chat-types.d.ts +0 -3
  86. package/dist/providers/chat-types.js +0 -3
  87. package/dist/providers/chat-types.js.map +1 -1
  88. package/dist/providers/claude-code/channel-server.d.ts +0 -19
  89. package/dist/providers/claude-code/channel-server.js +0 -19
  90. package/dist/providers/claude-code/channel-server.js.map +1 -1
  91. package/dist/providers/claude-code/index.d.ts +0 -22
  92. package/dist/providers/claude-code/index.js +3 -26
  93. package/dist/providers/claude-code/index.js.map +1 -1
  94. package/dist/providers/claude-code/login-flow.d.ts +0 -17
  95. package/dist/providers/claude-code/login-flow.js +2 -16
  96. package/dist/providers/claude-code/login-flow.js.map +1 -1
  97. package/dist/providers/claude-code/settings-writer.d.ts +1 -16
  98. package/dist/providers/claude-code/settings-writer.js +5 -20
  99. package/dist/providers/claude-code/settings-writer.js.map +1 -1
  100. package/dist/providers/claude-code/socket-bridge.d.ts +0 -35
  101. package/dist/providers/claude-code/socket-bridge.js +2 -43
  102. package/dist/providers/claude-code/socket-bridge.js.map +1 -1
  103. package/dist/providers/claude-code/spawn-claude.d.ts +0 -17
  104. package/dist/providers/claude-code/spawn-claude.js +1 -15
  105. package/dist/providers/claude-code/spawn-claude.js.map +1 -1
  106. package/dist/providers/index.d.ts +1 -10
  107. package/dist/providers/index.js +2 -13
  108. package/dist/providers/index.js.map +1 -1
  109. package/dist/providers/mock/index.d.ts +0 -4
  110. package/dist/providers/mock/index.js +0 -4
  111. package/dist/providers/mock/index.js.map +1 -1
  112. package/dist/providers/openclaw/auto-pair.d.ts +1 -6
  113. package/dist/providers/openclaw/auto-pair.js +1 -10
  114. package/dist/providers/openclaw/auto-pair.js.map +1 -1
  115. package/dist/providers/openclaw/device-identity.d.ts +1 -1
  116. package/dist/providers/openclaw/device-identity.js +33 -17
  117. package/dist/providers/openclaw/device-identity.js.map +1 -1
  118. package/dist/providers/openclaw/gateway-adapter.d.ts +0 -5
  119. package/dist/providers/openclaw/gateway-adapter.js +4 -32
  120. package/dist/providers/openclaw/gateway-adapter.js.map +1 -1
  121. package/dist/providers/openclaw/gateway-client.js +3 -9
  122. package/dist/providers/openclaw/gateway-client.js.map +1 -1
  123. package/dist/providers/openclaw/index.js +2 -15
  124. package/dist/providers/openclaw/index.js.map +1 -1
  125. package/dist/providers/types.d.ts +0 -10
  126. package/dist/slack-relay-server.d.ts +4 -33
  127. package/dist/slack-relay-server.js +9 -57
  128. package/dist/slack-relay-server.js.map +1 -1
  129. package/dist/types.d.ts +1 -12
  130. package/dist/types.js +0 -6
  131. package/dist/types.js.map +1 -1
  132. package/dist/utils/agent-controller-bin.d.ts +0 -6
  133. package/dist/utils/agent-controller-bin.js +1 -21
  134. package/dist/utils/agent-controller-bin.js.map +1 -1
  135. package/dist/utils/anthropic-auth.d.ts +1 -22
  136. package/dist/utils/anthropic-auth.js +0 -10
  137. package/dist/utils/anthropic-auth.js.map +1 -1
  138. package/dist/utils/apply-config.d.ts +7 -74
  139. package/dist/utils/apply-config.js +30 -221
  140. package/dist/utils/apply-config.js.map +1 -1
  141. package/dist/utils/backup-push.d.ts +0 -10
  142. package/dist/utils/backup-push.js +0 -15
  143. package/dist/utils/backup-push.js.map +1 -1
  144. package/dist/utils/claude-env.d.ts +1 -10
  145. package/dist/utils/claude-env.js +2 -14
  146. package/dist/utils/claude-env.js.map +1 -1
  147. package/dist/utils/config-merge-paths.d.ts +5 -43
  148. package/dist/utils/config-merge-paths.js +5 -43
  149. package/dist/utils/config-merge-paths.js.map +1 -1
  150. package/dist/utils/deploy-type.d.ts +1 -13
  151. package/dist/utils/deploy-type.js +2 -19
  152. package/dist/utils/deploy-type.js.map +1 -1
  153. package/dist/utils/diagnostics.d.ts +0 -7
  154. package/dist/utils/diagnostics.js +0 -15
  155. package/dist/utils/diagnostics.js.map +1 -1
  156. package/dist/utils/exec.d.ts +0 -10
  157. package/dist/utils/exec.js +2 -32
  158. package/dist/utils/exec.js.map +1 -1
  159. package/dist/utils/gateway-restart-handler.d.ts +1 -8
  160. package/dist/utils/gateway-restart-handler.js +1 -8
  161. package/dist/utils/gateway-restart-handler.js.map +1 -1
  162. package/dist/utils/gateway-restart.d.ts +1 -11
  163. package/dist/utils/gateway-restart.js +1 -11
  164. package/dist/utils/gateway-restart.js.map +1 -1
  165. package/dist/utils/knowledge-graph.d.ts +2 -25
  166. package/dist/utils/knowledge-graph.js +2 -37
  167. package/dist/utils/knowledge-graph.js.map +1 -1
  168. package/dist/utils/knowledge-push.d.ts +0 -4
  169. package/dist/utils/knowledge-push.js +4 -19
  170. package/dist/utils/knowledge-push.js.map +1 -1
  171. package/dist/utils/legacy-mcp-servers.d.ts +1 -11
  172. package/dist/utils/legacy-mcp-servers.js +1 -11
  173. package/dist/utils/legacy-mcp-servers.js.map +1 -1
  174. package/dist/utils/log-collector.js +0 -2
  175. package/dist/utils/log-collector.js.map +1 -1
  176. package/dist/utils/openclaw-ops.d.ts +5 -72
  177. package/dist/utils/openclaw-ops.js +6 -98
  178. package/dist/utils/openclaw-ops.js.map +1 -1
  179. package/dist/utils/openclaw-stack-update.d.ts +2 -14
  180. package/dist/utils/openclaw-stack-update.js +1 -6
  181. package/dist/utils/openclaw-stack-update.js.map +1 -1
  182. package/dist/utils/package-install.d.ts +0 -5
  183. package/dist/utils/package-install.js +2 -21
  184. package/dist/utils/package-install.js.map +1 -1
  185. package/dist/utils/package-version.d.ts +1 -9
  186. package/dist/utils/package-version.js +1 -9
  187. package/dist/utils/package-version.js.map +1 -1
  188. package/dist/utils/parse-id-at-version.d.ts +1 -11
  189. package/dist/utils/parse-id-at-version.js +1 -11
  190. package/dist/utils/parse-id-at-version.js.map +1 -1
  191. package/dist/utils/plugin-reconcile.d.ts +2 -33
  192. package/dist/utils/plugin-reconcile.js +7 -77
  193. package/dist/utils/plugin-reconcile.js.map +1 -1
  194. package/dist/utils/release-channel.d.ts +0 -8
  195. package/dist/utils/release-channel.js.map +1 -1
  196. package/dist/utils/write-home-files.d.ts +2 -24
  197. package/dist/utils/write-home-files.js +3 -27
  198. package/dist/utils/write-home-files.js.map +1 -1
  199. package/dist/utils/write-workspace-files.d.ts +0 -14
  200. package/dist/utils/write-workspace-files.js +1 -19
  201. package/dist/utils/write-workspace-files.js.map +1 -1
  202. package/dist/workspace.d.ts +1 -21
  203. package/dist/workspace.js +1 -21
  204. package/dist/workspace.js.map +1 -1
  205. package/package.json +1 -1
@@ -1,10 +1,2 @@
1
- /**
2
- * Version from the package's own package.json.
3
- *
4
- * Read via `createRequire` rather than a JSON import so the compiled output
5
- * stays plain ESM. The relative depth (`../..`) is correct from both
6
- * `dist/utils/` and `src/utils/` — three call sites used to hand-roll this with
7
- * three different depths, which is exactly the kind of thing that breaks
8
- * silently when a file moves.
9
- */
1
+ /** createRequire keeps output plain ESM; ../.. reaches package.json from both src/utils and dist/utils. */
10
2
  export declare function getPackageVersion(): string;
@@ -2,15 +2,7 @@ import { createRequire } from 'node:module';
2
2
  import { fileURLToPath } from 'node:url';
3
3
  import { dirname, join } from 'node:path';
4
4
  const _require = createRequire(import.meta.url);
5
- /**
6
- * Version from the package's own package.json.
7
- *
8
- * Read via `createRequire` rather than a JSON import so the compiled output
9
- * stays plain ESM. The relative depth (`../..`) is correct from both
10
- * `dist/utils/` and `src/utils/` — three call sites used to hand-roll this with
11
- * three different depths, which is exactly the kind of thing that breaks
12
- * silently when a file moves.
13
- */
5
+ /** createRequire keeps output plain ESM; ../.. reaches package.json from both src/utils and dist/utils. */
14
6
  export function getPackageVersion() {
15
7
  const pkgPath = join(dirname(fileURLToPath(import.meta.url)), '../../package.json');
16
8
  return _require(pkgPath).version;
@@ -1 +1 @@
1
- {"version":3,"file":"package-version.js","sourceRoot":"","sources":["../../src/utils/package-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEhD;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;IACpF,OAAQ,QAAQ,CAAC,OAAO,CAAyB,CAAC,OAAO,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"package-version.js","sourceRoot":"","sources":["../../src/utils/package-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEhD,2GAA2G;AAC3G,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;IACpF,OAAQ,QAAQ,CAAC,OAAO,CAAyB,CAAC,OAAO,CAAC;AAC5D,CAAC"}
@@ -1,14 +1,4 @@
1
- /**
2
- * Split a CLI token like `@scope/pkg@1.2.3` into `{ id, version }`, or null if
3
- * it isn't one. Splits at the LAST `@` so scoped npm names survive, and rejects
4
- * a leading `@` so a bare `@scope/name` (no version) doesn't parse as
5
- * `{ id: '', version: 'scope/name' }`.
6
- *
7
- * Shared by the `plugin-update` and `agent-update` CLIs, which each had their
8
- * own byte-identical copy. Kept out of openclaw-ops.ts on purpose: this is a
9
- * pure parser, and openclaw-ops is the module every test mocks wholesale
10
- * because it shells out.
11
- */
1
+ /** Split at the last @ to preserve scoped names; a bare @scope/name has no version. */
12
2
  export declare function parseIdAtVersion(token: string): {
13
3
  id: string;
14
4
  version: string;
@@ -1,14 +1,4 @@
1
- /**
2
- * Split a CLI token like `@scope/pkg@1.2.3` into `{ id, version }`, or null if
3
- * it isn't one. Splits at the LAST `@` so scoped npm names survive, and rejects
4
- * a leading `@` so a bare `@scope/name` (no version) doesn't parse as
5
- * `{ id: '', version: 'scope/name' }`.
6
- *
7
- * Shared by the `plugin-update` and `agent-update` CLIs, which each had their
8
- * own byte-identical copy. Kept out of openclaw-ops.ts on purpose: this is a
9
- * pure parser, and openclaw-ops is the module every test mocks wholesale
10
- * because it shells out.
11
- */
1
+ /** Split at the last @ to preserve scoped names; a bare @scope/name has no version. */
12
2
  export function parseIdAtVersion(token) {
13
3
  const at = token.lastIndexOf('@');
14
4
  if (at <= 0)
@@ -1 +1 @@
1
- {"version":3,"file":"parse-id-at-version.js","sourceRoot":"","sources":["../../src/utils/parse-id-at-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"parse-id-at-version.js","sourceRoot":"","sources":["../../src/utils/parse-id-at-version.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;AACzB,CAAC"}
@@ -7,40 +7,9 @@ export interface ReconcileResult {
7
7
  id: string;
8
8
  error: string;
9
9
  }>;
10
- /** Set when reconcile could not run — nothing was installed. */
11
10
  skippedReason?: string;
12
11
  }
13
- /**
14
- * The plugin ids openclaw.json says must be present.
15
- *
16
- * `plugins.allow` is the primary source: the backend's config generator writes
17
- * exactly the external npm plugins it expects installed (today
18
- * `['@openclaw-cloud/mcp-warmup']`).
19
- *
20
- * `plugins.entries` is also consulted, but ONLY for scoped ids (`@scope/name`).
21
- * That block additionally holds openclaw's BUNDLED plugins — `telegram`,
22
- * `discord`, `slack`, `whatsapp` — which ship inside the runtime and are not
23
- * npm-installable; handing those to `openclaw plugins install` would fail on
24
- * every boot. Bundled ids are bare words, external ones are scoped, so the
25
- * `@scope/` shape is the discriminator. An entry explicitly `{enabled: false}`
26
- * is skipped.
27
- *
28
- * Everything is finally filtered through `isSafePackageName` — these ids reach
29
- * a shell via `openclaw plugins install <id>@<version>`.
30
- */
12
+ /** Only scoped entries are npm-installable; bare IDs belong to bundled runtime plugins. */
31
13
  export declare function declaredPluginIds(openclawConfig: unknown): string[];
32
- /**
33
- * Install every declared-but-absent plugin. NEVER throws — bootstrap and
34
- * startup both call it on their happy path and a plugin problem must not take
35
- * down the boot; the next controller start reconciles again.
36
- *
37
- * Cheap when nothing is missing: one `openclaw plugins list --json` (no npm
38
- * traffic, no backend call). The backend/npm work only happens once something
39
- * is actually absent.
40
- *
41
- * Installs go through `runOpenclawStackUpdate`, the one owner of
42
- * "install then restart the gateway once if anything changed" — so a plugin
43
- * installed while the gateway is already running is picked up immediately
44
- * instead of waiting for the next restart.
45
- */
14
+ /** Plugin failures must not abort boot; the next controller start retries missing packages. */
46
15
  export declare function reconcilePlugins(source: ReconcileSource): Promise<ReconcileResult>;
@@ -1,27 +1,6 @@
1
1
  /**
2
- * Plugin reconciliation — agent-controller is the SINGLE OWNER of "the plugins
3
- * openclaw.json declares are actually installed on disk".
4
- *
5
- * Background (incident 2026-08-03): the EC2 user-data used to install
6
- * `@openclaw-cloud/mcp-warmup` itself with
7
- * su - ubuntu -c "openclaw plugins install ...@latest --force" || echo "…non-fatal"
8
- * On a whole cohort of VMs that step died with `openclaw: command not found`
9
- * (the login shell has no npm-global bin on PATH that early in first boot) and
10
- * the `|| echo` swallowed it. The agents then ran for months with
11
- * `plugins.allow=["@openclaw-cloud/mcp-warmup"]` in openclaw.json and no
12
- * package on disk — openclaw logged "stale config entry ignored", no MCP warmup
13
- * session ever started, and board tasks were undeliverable. Nothing noticed.
14
- *
15
- * So: the declared set lives in openclaw.json (written by the backend
16
- * bootstrap), and this module makes the disk match it — at `agent-controller
17
- * bootstrap` and again on every controller start, which is what turns a reboot
18
- * into a self-heal instead of a permanent silent failure.
19
- *
20
- * SCOPE — missing-entirely only. A plugin that is installed at the "wrong"
21
- * version is NOT touched here: version upgrades remain self-update's job
22
- * (`runExplicitSelfUpdate` / the `agent_update` + `plugin_update` handlers,
23
- * driven by backend targets). Reconcile answers one question — "is it there at
24
- * all?" — so it can stay cheap enough to run on every boot.
2
+ * Controller bootstrap and startup own missing-plugin repair so failed provisioning can self-heal.
3
+ * Installed versions stay untouched: upgrades belong to explicit self-update targets.
25
4
  */
26
5
  import fs from 'node:fs/promises';
27
6
  import { getOpenclawJsonPath } from './apply-config.js';
@@ -36,24 +15,7 @@ import { fetchRuntimeTargets } from '../commands/self-update.js';
36
15
  import { logCollector } from '../connection.js';
37
16
  import { toErrorMessage } from './response.js';
38
17
  const LOG_PREFIX = '[plugin-reconcile]';
39
- /**
40
- * The plugin ids openclaw.json says must be present.
41
- *
42
- * `plugins.allow` is the primary source: the backend's config generator writes
43
- * exactly the external npm plugins it expects installed (today
44
- * `['@openclaw-cloud/mcp-warmup']`).
45
- *
46
- * `plugins.entries` is also consulted, but ONLY for scoped ids (`@scope/name`).
47
- * That block additionally holds openclaw's BUNDLED plugins — `telegram`,
48
- * `discord`, `slack`, `whatsapp` — which ship inside the runtime and are not
49
- * npm-installable; handing those to `openclaw plugins install` would fail on
50
- * every boot. Bundled ids are bare words, external ones are scoped, so the
51
- * `@scope/` shape is the discriminator. An entry explicitly `{enabled: false}`
52
- * is skipped.
53
- *
54
- * Everything is finally filtered through `isSafePackageName` — these ids reach
55
- * a shell via `openclaw plugins install <id>@<version>`.
56
- */
18
+ /** Only scoped entries are npm-installable; bare IDs belong to bundled runtime plugins. */
57
19
  export function declaredPluginIds(openclawConfig) {
58
20
  const plugins = openclawConfig?.plugins;
59
21
  if (!plugins || typeof plugins !== 'object')
@@ -71,7 +33,7 @@ export function declaredPluginIds(openclawConfig) {
71
33
  for (const [rawId, entry] of Object.entries(entries)) {
72
34
  const id = rawId.trim();
73
35
  if (!id.startsWith('@') || !id.includes('/'))
74
- continue; // bundled runtime plugin
36
+ continue;
75
37
  const enabled = entry?.enabled;
76
38
  if (enabled === false)
77
39
  continue;
@@ -92,20 +54,9 @@ async function readDeclaredPlugins() {
92
54
  return [];
93
55
  }
94
56
  }
95
- /**
96
- * Version to install a missing plugin at — resolved exactly the way
97
- * self-update does:
98
- * 1. the backend's runtime targets for this agent
99
- * (`GET /api/agent/runtime-targets` → `openclaw.plugins[]`), which is what
100
- * `runSelfUpdateCli` prefers, then
101
- * 2. the AC_RELEASE_CHANNEL dist-tag — `beta` on the beta channel, `latest`
102
- * on stable (the same mapping as `selfUpdate()`), which is also what the
103
- * old user-data line used.
104
- */
105
57
  async function resolvePluginVersions(ids) {
106
58
  const channel = getReleaseChannel();
107
59
  const distTag = channel === 'stable' ? 'latest' : channel;
108
- // Best-effort: fetchRuntimeTargets() already swallows every failure into null.
109
60
  const targets = await fetchRuntimeTargets();
110
61
  const fromBackend = new Map();
111
62
  for (const p of targets?.openclaw?.plugins ?? []) {
@@ -115,20 +66,7 @@ async function resolvePluginVersions(ids) {
115
66
  }
116
67
  return new Map(ids.map((id) => [id, fromBackend.get(id) ?? distTag]));
117
68
  }
118
- /**
119
- * Install every declared-but-absent plugin. NEVER throws — bootstrap and
120
- * startup both call it on their happy path and a plugin problem must not take
121
- * down the boot; the next controller start reconciles again.
122
- *
123
- * Cheap when nothing is missing: one `openclaw plugins list --json` (no npm
124
- * traffic, no backend call). The backend/npm work only happens once something
125
- * is actually absent.
126
- *
127
- * Installs go through `runOpenclawStackUpdate`, the one owner of
128
- * "install then restart the gateway once if anything changed" — so a plugin
129
- * installed while the gateway is already running is picked up immediately
130
- * instead of waiting for the next restart.
131
- */
69
+ /** Plugin failures must not abort boot; the next controller start retries missing packages. */
132
70
  export async function reconcilePlugins(source) {
133
71
  const empty = { declared: [], missing: [], installed: [], failed: [] };
134
72
  try {
@@ -137,10 +75,7 @@ export async function reconcilePlugins(source) {
137
75
  console.log(`${LOG_PREFIX} no plugins declared in openclaw.json — nothing to reconcile`);
138
76
  return empty;
139
77
  }
140
- // `openclaw plugins list --json` is the source of truth, NOT the
141
- // `plugins.installs` block of openclaw.json: the incident was precisely a
142
- // config entry with no package behind it, so a config-derived inventory
143
- // would report the missing plugin as present.
78
+ // CLI inventory reflects packages on disk; plugins.installs alone can claim an absent package exists.
144
79
  let installedIds;
145
80
  try {
146
81
  installedIds = new Set((await listInstalledPlugins()).map((p) => p.id));
@@ -176,11 +111,7 @@ export async function reconcilePlugins(source) {
176
111
  console.error(`${LOG_PREFIX} gateway restart failed: ${stack.restartError}`);
177
112
  }
178
113
  if (summary.failed.length > 0) {
179
- // LOUD. A swallowed plugin install is what caused the incident; this is
180
- // the line an operator greps for, and the backend `agent_log` row an
181
- // alert can fire on. (In the `bootstrap` CLI process `logCollector` is
182
- // undefined — no WS connection — so there the console line is all we
183
- // have; the startup reconcile re-reports it to the backend.)
114
+ // Bootstrap has no logCollector, so retain console diagnostics as well as startup backend events.
184
115
  const detail = summary.failed.map((f) => `${f.id}: ${f.error}`).join('; ');
185
116
  console.error(`${LOG_PREFIX} install FAILED for ${summary.failed.length} plugin(s): ${detail}`);
186
117
  logCollector?.push('plugin_reconcile_failed', 'error', `Plugin install failed during reconcile: ${detail}`, { source, failed: summary.failed });
@@ -188,7 +119,6 @@ export async function reconcilePlugins(source) {
188
119
  return { declared, missing, installed: summary.installed, failed: summary.failed };
189
120
  }
190
121
  catch (err) {
191
- // Anything unexpected (fs, backend client construction, …). Never fatal.
192
122
  const error = toErrorMessage(err);
193
123
  console.error(`${LOG_PREFIX} reconcile failed: ${error}`);
194
124
  logCollector?.push('plugin_reconcile_failed', 'error', `Plugin reconcile failed: ${error}`, {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-reconcile.js","sourceRoot":"","sources":["../../src/utils/plugin-reconcile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,6EAA6E;AAC7E,8EAA8E;AAC9E,4BAA4B;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAaxC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,iBAAiB,CAAC,cAAuB;IACvD,MAAM,OAAO,GAAI,cAA2D,EAAE,OAAO,CAAC;IACtF,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEvD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9B,MAAM,KAAK,GAAI,OAA+B,CAAC,KAAK,CAAC;IACrD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE;gBAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAI,OAAiC,CAAC,OAAO,CAAC;IAC3D,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACtE,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAkC,CAAC,EAAE,CAAC;YAChF,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAC,yBAAyB;YACjF,MAAM,OAAO,GAAI,KAAsC,EAAE,OAAO,CAAC;YACjE,IAAI,OAAO,KAAK,KAAK;gBAAE,SAAS;YAChC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,mBAAmB;IAChC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,EAAE,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAChF,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,mCAAmC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;QACpF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,qBAAqB,CAAC,GAAa;IAChD,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IAE1D,+EAA+E;IAC/E,MAAM,OAAO,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;QACjD,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAChF,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;AACxE,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAuB;IAC5D,MAAM,KAAK,GAAoB,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACxF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAC7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,8DAA8D,CAAC,CAAC;YACzF,OAAO,KAAK,CAAC;QACf,CAAC;QAED,iEAAiE;QACjE,0EAA0E;QAC1E,wEAAwE;QACxE,8CAA8C;QAC9C,IAAI,YAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,oBAAoB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;YAClC,qEAAqE;YACrE,wDAAwD;YACxD,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,wDAAwD,KAAK,EAAE,CAAC,CAAC;YAC5F,YAAY,EAAE,IAAI,CAChB,+BAA+B,EAC/B,OAAO,EACP,8DAA8D,KAAK,EAAE,EACrE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAC5B,CAAC;YACF,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;QACtD,CAAC;QAED,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,QAAQ,QAAQ,CAAC,MAAM,6BAA6B,CAAC,CAAC;YAC/E,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC;QAChC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,uBAAuB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACnF,YAAY,EAAE,IAAI,CAChB,0BAA0B,EAC1B,MAAM,EACN,qCAAqC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACzD,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAC9B,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC;QAErF,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC;YACzC,OAAO;YACP,WAAW,EAAE,kBAAkB;YAC/B,IAAI,EAAE,EAAE,MAAM,EAAE;SACjB,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAElF,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,eAAe,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxE,YAAY,EAAE,IAAI,CAChB,4BAA4B,EAC5B,MAAM,EACN,aAAa,OAAO,CAAC,SAAS,CAAC,MAAM,uBAAuB,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC1F,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE,CACnF,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,4BAA4B,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,wEAAwE;YACxE,qEAAqE;YACrE,uEAAuE;YACvE,qEAAqE;YACrE,6DAA6D;YAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3E,OAAO,CAAC,KAAK,CACX,GAAG,UAAU,uBAAuB,OAAO,CAAC,MAAM,CAAC,MAAM,eAAe,MAAM,EAAE,CACjF,CAAC;YACF,YAAY,EAAE,IAAI,CAChB,yBAAyB,EACzB,OAAO,EACP,2CAA2C,MAAM,EAAE,EACnD,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CACnC,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;IACrF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,yEAAyE;QACzE,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,sBAAsB,KAAK,EAAE,CAAC,CAAC;QAC1D,YAAY,EAAE,IAAI,CAAC,yBAAyB,EAAE,OAAO,EAAE,4BAA4B,KAAK,EAAE,EAAE;YAC1F,MAAM;YACN,KAAK;SACN,CAAC,CAAC;QACH,OAAO,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"plugin-reconcile.js","sourceRoot":"","sources":["../../src/utils/plugin-reconcile.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,2 @@
1
- /**
2
- * Resolve the npm dist-tag / release channel for package installs.
3
- *
4
- * Env: AC_RELEASE_CHANNEL=beta|stable (default: stable)
5
- *
6
- * - "beta" → npm install pkg@beta
7
- * - "stable" → npm install pkg@latest
8
- */
9
1
  export type ReleaseChannel = 'beta' | 'stable';
10
2
  export declare function getReleaseChannel(): ReleaseChannel;
@@ -1 +1 @@
1
- {"version":3,"file":"release-channel.js","sourceRoot":"","sources":["../../src/utils/release-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAYtC,MAAM,UAAU,iBAAiB;IAC/B,OAAO,MAAM,CAAC,cAAc,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"release-channel.js","sourceRoot":"","sources":["../../src/utils/release-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAItC,MAAM,UAAU,iBAAiB;IAC/B,OAAO,MAAM,CAAC,cAAc,CAAC;AAC/B,CAAC"}
@@ -1,27 +1,5 @@
1
1
  /**
2
- * Write platform-managed files into the agent user's HOME directory.
3
- *
4
- * These live OUTSIDE the openclaw workspace on purpose: the workspace is
5
- * indexed and pushed back to the backend by knowledge sync, and these files are
6
- * credentials (first consumer: `.secrets/SECRETS.txt`). Keys are paths RELATIVE
7
- * to `os.homedir()`; values are the full contents.
8
- *
9
- * `os.homedir()` is the right anchor because on a VM/pod agent-controller runs
10
- * as the agent user itself — the same resolution `writeClaudeEnv()`
11
- * (`~/.claude`) and `config.stateDir` (`~/.openclaw`) already rely on. On
12
- * systemd that means the unit's `HOME` must be the agent user's home; it
13
- * already must be, or the controller would not find `~/.openclaw` either
14
- * (docs/DRAGONS.md#systemd-home).
15
- *
16
- * Semantics:
17
- * - Parent dirs created with mode 0700, files written 0600, always overwritten.
18
- * - Absolute keys and keys escaping HOME are logged and skipped — the same
19
- * segment-aware sandbox `writeWorkspaceFiles` uses, anchored at HOME.
20
- * - Nothing here throws: one bad entry must never fail the whole config apply.
21
- * - File CONTENTS are never logged — only the relative path and a byte count.
22
- *
23
- * ponytail: no deletion / directory GC. The platform overwrites the files it
24
- * knows about; a key dropped from a later payload leaves the file on disk. Add
25
- * a manifest + prune only if revocation-by-removal ever becomes a requirement.
2
+ * Credentials must stay outside the indexed workspace; anchor at the agent user's HOME
3
+ * (docs/DRAGONS.md#systemd-home). Never log contents or delete files merely absent from a payload.
26
4
  */
27
5
  export declare function writeHomeFiles(files: Record<string, string> | undefined): Promise<number>;
@@ -5,37 +5,13 @@ import { resolveInsideWorkspace } from '../workspace.js';
5
5
  import { getResolvedDeployType, isManagedDeploy } from './deploy-type.js';
6
6
  import { toErrorMessage } from './response.js';
7
7
  /**
8
- * Write platform-managed files into the agent user's HOME directory.
9
- *
10
- * These live OUTSIDE the openclaw workspace on purpose: the workspace is
11
- * indexed and pushed back to the backend by knowledge sync, and these files are
12
- * credentials (first consumer: `.secrets/SECRETS.txt`). Keys are paths RELATIVE
13
- * to `os.homedir()`; values are the full contents.
14
- *
15
- * `os.homedir()` is the right anchor because on a VM/pod agent-controller runs
16
- * as the agent user itself — the same resolution `writeClaudeEnv()`
17
- * (`~/.claude`) and `config.stateDir` (`~/.openclaw`) already rely on. On
18
- * systemd that means the unit's `HOME` must be the agent user's home; it
19
- * already must be, or the controller would not find `~/.openclaw` either
20
- * (docs/DRAGONS.md#systemd-home).
21
- *
22
- * Semantics:
23
- * - Parent dirs created with mode 0700, files written 0600, always overwritten.
24
- * - Absolute keys and keys escaping HOME are logged and skipped — the same
25
- * segment-aware sandbox `writeWorkspaceFiles` uses, anchored at HOME.
26
- * - Nothing here throws: one bad entry must never fail the whole config apply.
27
- * - File CONTENTS are never logged — only the relative path and a byte count.
28
- *
29
- * ponytail: no deletion / directory GC. The platform overwrites the files it
30
- * knows about; a key dropped from a later payload leaves the file on disk. Add
31
- * a manifest + prune only if revocation-by-removal ever becomes a requirement.
8
+ * Credentials must stay outside the indexed workspace; anchor at the agent user's HOME
9
+ * (docs/DRAGONS.md#systemd-home). Never log contents or delete files merely absent from a payload.
32
10
  */
33
11
  export async function writeHomeFiles(files) {
34
12
  if (!files || Object.keys(files).length === 0)
35
13
  return 0;
36
- // Same guard as writeClaudeEnv(), for the same reason: this writes into a
37
- // real user's HOME. `agent-controller bootstrap` on a developer laptop must
38
- // never do that. Defense in depth — the only caller is already managed-only.
14
+ // Guard here as well as at callers: third-party HOME must never receive platform credentials.
39
15
  if (!isManagedDeploy()) {
40
16
  console.log(`[home-files] skipped: not a managed install (deployType=${getResolvedDeployType() ?? 'unknown'})`);
41
17
  return 0;
@@ -1 +1 @@
1
- {"version":3,"file":"write-home-files.js","sourceRoot":"","sources":["../../src/utils/write-home-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAyC;IAC5E,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAExD,0EAA0E;IAC1E,4EAA4E;IAC5E,6EAA6E;IAC7E,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CACT,2DAA2D,qBAAqB,EAAE,IAAI,SAAS,GAAG,CACnG,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7B,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,kBAAkB,OAAO,sCAAsC,CAAC,CAAC;YAC9E,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,kBAAkB,OAAO,0CAA0C,CAAC,CAAC;YAClF,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,qEAAqE;YACrE,uEAAuE;YACvE,4DAA4D;YAC5D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACzE,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAChC,OAAO,EAAE,CAAC;YACV,kDAAkD;YAClD,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,KAAK,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACzF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,kBAAkB,OAAO,KAAK,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"write-home-files.js","sourceRoot":"","sources":["../../src/utils/write-home-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAyC;IAC5E,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAExD,8FAA8F;IAC9F,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CACT,2DAA2D,qBAAqB,EAAE,IAAI,SAAS,GAAG,CACnG,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7B,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,kBAAkB,OAAO,sCAAsC,CAAC,CAAC;YAC9E,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,kBAAkB,OAAO,0CAA0C,CAAC,CAAC;YAClF,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,qEAAqE;YACrE,uEAAuE;YACvE,4DAA4D;YAC5D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACzE,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAChC,OAAO,EAAE,CAAC;YACV,kDAAkD;YAClD,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,KAAK,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACzF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,kBAAkB,OAAO,KAAK,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,15 +1 @@
1
- /**
2
- * Write a map of workspace-relative paths → content into `workspaceDir`.
3
- *
4
- * Mirrors the exact behavior of the original inline block in `commands/bootstrap.ts`:
5
- * - Creates parent directories recursively.
6
- * - Writes each file as UTF-8.
7
- * - `chmod 0o755` on any path ending in `.sh`.
8
- * - Logs per-file success/failure and a skill-deployment summary.
9
- * - Never throws on a single file's write error — logs and continues.
10
- *
11
- * Used by both the bootstrap CLI (one-shot startup) and the live `update_config`
12
- * command path in `applyBootstrapConfig` (propagates shared-file updates from
13
- * the backend without requiring a restart).
14
- */
15
1
  export declare function writeWorkspaceFiles(files: Record<string, string>, workspaceDir: string): Promise<number>;
@@ -2,20 +2,6 @@ import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { resolveInsideWorkspace } from '../workspace.js';
4
4
  import { toErrorMessage } from './response.js';
5
- /**
6
- * Write a map of workspace-relative paths → content into `workspaceDir`.
7
- *
8
- * Mirrors the exact behavior of the original inline block in `commands/bootstrap.ts`:
9
- * - Creates parent directories recursively.
10
- * - Writes each file as UTF-8.
11
- * - `chmod 0o755` on any path ending in `.sh`.
12
- * - Logs per-file success/failure and a skill-deployment summary.
13
- * - Never throws on a single file's write error — logs and continues.
14
- *
15
- * Used by both the bootstrap CLI (one-shot startup) and the live `update_config`
16
- * command path in `applyBootstrapConfig` (propagates shared-file updates from
17
- * the backend without requiring a restart).
18
- */
19
5
  export async function writeWorkspaceFiles(files, workspaceDir) {
20
6
  const fileNames = Object.keys(files);
21
7
  if (fileNames.length === 0)
@@ -23,9 +9,7 @@ export async function writeWorkspaceFiles(files, workspaceDir) {
23
9
  await fs.mkdir(workspaceDir, { recursive: true });
24
10
  const written = [];
25
11
  for (const [filePath, content] of Object.entries(files)) {
26
- // Reject any key that escapes the workspace — a backend-supplied key like
27
- // "../../etc/openclaw/agent.env" or an absolute path must not write outside
28
- // it. Same sandbox helper as the file_write / file_delete handlers.
12
+ // Backend-controlled paths must use the same containment sandbox as file_write/file_delete.
29
13
  const fullPath = resolveInsideWorkspace(workspaceDir, filePath);
30
14
  if (!fullPath) {
31
15
  console.error(` ✗ ${filePath}: rejected (path escapes workspace)`);
@@ -41,14 +25,12 @@ export async function writeWorkspaceFiles(files, workspaceDir) {
41
25
  console.error(` ✗ ${filePath}: ${toErrorMessage(err)}`);
42
26
  }
43
27
  }
44
- // Make .sh files executable (only the ones we actually wrote)
45
28
  for (const filePath of written) {
46
29
  if (filePath.endsWith('.sh')) {
47
30
  const fullPath = path.join(workspaceDir, filePath);
48
31
  await fs.chmod(fullPath, 0o755);
49
32
  }
50
33
  }
51
- // Summary for deployed skills (under .agents/skills/<name>/...)
52
34
  const skillFiles = written.filter((f) => f.startsWith('.agents/skills/'));
53
35
  if (skillFiles.length > 0) {
54
36
  const skills = [...new Set(skillFiles.map((f) => f.split('/')[2]))];
@@ -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;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C;;;;;;;;;;;;;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,CAAC,CAAC;IAErC,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,0EAA0E;QAC1E,4EAA4E;QAC5E,oEAAoE;QACpE,MAAM,QAAQ,GAAG,sBAAsB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAChE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,OAAO,QAAQ,qCAAqC,CAAC,CAAC;YACpE,SAAS;QACX,CAAC;QACD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,OAAO,QAAQ,KAAK,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC/B,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YACnD,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC1E,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,MAAM,kBAAkB,CAAC,CAAC;IACzD,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC"}
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;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,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,CAAC,CAAC;IAErC,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,4FAA4F;QAC5F,MAAM,QAAQ,GAAG,sBAAsB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAChE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,OAAO,QAAQ,qCAAqC,CAAC,CAAC;YACpE,SAAS;QACX,CAAC;QACD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,OAAO,QAAQ,KAAK,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC/B,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YACnD,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC1E,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,MAAM,kBAAkB,CAAC,CAAC;IACzD,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC"}
@@ -1,23 +1,3 @@
1
- /**
2
- * Returns the canonical workspace directory.
3
- *
4
- * Resolution order (first match wins):
5
- * 1. WORKSPACE_DIR — explicit override, used in K8s pods (/etc/openclaw/workspace)
6
- * 2. OPENCLAW_STATE_DIR/workspace — standard path for VM / dev installs
7
- * 3. ~/.openclaw/workspace — local development fallback
8
- *
9
- * This single source of truth fixes the divergence between file_write/file_delete
10
- * (which used WORKSPACE_DIR) and backup/knowledge_sync (which used OPENCLAW_STATE_DIR).
11
- */
12
1
  export declare function getWorkspaceDir(): string;
13
- /**
14
- * Resolve a backend-supplied relative path inside `workspaceDir`, or null if it
15
- * escapes. The ONE sandbox for every backend-supplied path — `file_write`,
16
- * `file_delete` and `writeWorkspaceFiles` all route through it.
17
- *
18
- * Containment is checked on path *segments* (via `path.relative`), not by
19
- * substring. The old `p.includes('..') || p.startsWith('/')` copies in the two
20
- * handlers rejected innocent names like `notes..v2.md` and missed Windows
21
- * absolute forms such as `C:\x` and `\\server\share`.
22
- */
2
+ /** Check containment by path segments: substring checks reject notes..v2.md and miss Windows absolute paths. */
23
3
  export declare function resolveInsideWorkspace(workspaceDir: string, relPath: string): string | null;
package/dist/workspace.js CHANGED
@@ -1,31 +1,11 @@
1
1
  import path from 'node:path';
2
2
  import { config } from './config.js';
3
- /**
4
- * Returns the canonical workspace directory.
5
- *
6
- * Resolution order (first match wins):
7
- * 1. WORKSPACE_DIR — explicit override, used in K8s pods (/etc/openclaw/workspace)
8
- * 2. OPENCLAW_STATE_DIR/workspace — standard path for VM / dev installs
9
- * 3. ~/.openclaw/workspace — local development fallback
10
- *
11
- * This single source of truth fixes the divergence between file_write/file_delete
12
- * (which used WORKSPACE_DIR) and backup/knowledge_sync (which used OPENCLAW_STATE_DIR).
13
- */
14
3
  export function getWorkspaceDir() {
15
4
  if (config.workspaceDir)
16
5
  return config.workspaceDir;
17
6
  return path.join(config.stateDir, 'workspace');
18
7
  }
19
- /**
20
- * Resolve a backend-supplied relative path inside `workspaceDir`, or null if it
21
- * escapes. The ONE sandbox for every backend-supplied path — `file_write`,
22
- * `file_delete` and `writeWorkspaceFiles` all route through it.
23
- *
24
- * Containment is checked on path *segments* (via `path.relative`), not by
25
- * substring. The old `p.includes('..') || p.startsWith('/')` copies in the two
26
- * handlers rejected innocent names like `notes..v2.md` and missed Windows
27
- * absolute forms such as `C:\x` and `\\server\share`.
28
- */
8
+ /** Check containment by path segments: substring checks reject notes..v2.md and miss Windows absolute paths. */
29
9
  export function resolveInsideWorkspace(workspaceDir, relPath) {
30
10
  if (!relPath || path.isAbsolute(relPath) || path.win32.isAbsolute(relPath))
31
11
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,MAAM,CAAC,YAAY;QAAE,OAAO,MAAM,CAAC,YAAY,CAAC;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AACjD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CAAC,YAAoB,EAAE,OAAe;IAC1E,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAClD,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1F,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,UAAU,eAAe;IAC7B,IAAI,MAAM,CAAC,YAAY;QAAE,OAAO,MAAM,CAAC,YAAY,CAAC;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AACjD,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,sBAAsB,CAAC,YAAoB,EAAE,OAAe;IAC1E,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAClD,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1F,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw-cloud/agent-controller",
3
- "version": "3.6.2",
3
+ "version": "3.6.3",
4
4
  "packageManager": "pnpm@11.5.2",
5
5
  "type": "module",
6
6
  "engines": {