@openclaw-cloud/agent-controller 3.0.0-beta.2 → 3.0.0-beta.20

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 (166) hide show
  1. package/bin/agent-controller.js +5 -9
  2. package/dist/api.d.ts +16 -0
  3. package/dist/api.js.map +1 -1
  4. package/dist/commands/agent-update-cli.js +23 -38
  5. package/dist/commands/agent-update-cli.js.map +1 -1
  6. package/dist/commands/backup-cli.js +6 -4
  7. package/dist/commands/backup-cli.js.map +1 -1
  8. package/dist/commands/bootstrap.d.ts +10 -1
  9. package/dist/commands/bootstrap.js +33 -73
  10. package/dist/commands/bootstrap.js.map +1 -1
  11. package/dist/commands/channel-server.js +4 -3
  12. package/dist/commands/channel-server.js.map +1 -1
  13. package/dist/commands/heartbeat-cli.js +2 -6
  14. package/dist/commands/heartbeat-cli.js.map +1 -1
  15. package/dist/commands/install-deps.d.ts +10 -0
  16. package/dist/commands/install-deps.js +33 -43
  17. package/dist/commands/install-deps.js.map +1 -1
  18. package/dist/commands/knowledge-sync-cli.js +6 -4
  19. package/dist/commands/knowledge-sync-cli.js.map +1 -1
  20. package/dist/commands/plugin-update-cli.js +4 -8
  21. package/dist/commands/plugin-update-cli.js.map +1 -1
  22. package/dist/commands/self-update.d.ts +1 -0
  23. package/dist/commands/self-update.js +76 -37
  24. package/dist/commands/self-update.js.map +1 -1
  25. package/dist/commands/update-skills.js +7 -6
  26. package/dist/commands/update-skills.js.map +1 -1
  27. package/dist/config-file.d.ts +24 -0
  28. package/dist/config-file.js +56 -20
  29. package/dist/config-file.js.map +1 -1
  30. package/dist/config.d.ts +4 -0
  31. package/dist/config.js +12 -0
  32. package/dist/config.js.map +1 -1
  33. package/dist/connection.d.ts +4 -0
  34. package/dist/connection.js +50 -5
  35. package/dist/connection.js.map +1 -1
  36. package/dist/handlers/agent-update.d.ts +4 -0
  37. package/dist/handlers/agent-update.js +16 -44
  38. package/dist/handlers/agent-update.js.map +1 -1
  39. package/dist/handlers/deploy.d.ts +1 -2
  40. package/dist/handlers/deploy.js +4 -20
  41. package/dist/handlers/deploy.js.map +1 -1
  42. package/dist/handlers/diagnostics.js +0 -12
  43. package/dist/handlers/diagnostics.js.map +1 -1
  44. package/dist/handlers/file-delete.js +4 -5
  45. package/dist/handlers/file-delete.js.map +1 -1
  46. package/dist/handlers/file-write.js +4 -4
  47. package/dist/handlers/file-write.js.map +1 -1
  48. package/dist/handlers/knowledge-sync.js +2 -14
  49. package/dist/handlers/knowledge-sync.js.map +1 -1
  50. package/dist/handlers/memory.d.ts +11 -1
  51. package/dist/handlers/memory.js.map +1 -1
  52. package/dist/handlers/onboarding.d.ts +1 -2
  53. package/dist/handlers/onboarding.js +3 -20
  54. package/dist/handlers/onboarding.js.map +1 -1
  55. package/dist/handlers/package-install.js +1 -1
  56. package/dist/handlers/package-install.js.map +1 -1
  57. package/dist/handlers/pair.js +0 -12
  58. package/dist/handlers/pair.js.map +1 -1
  59. package/dist/handlers/restart.d.ts +1 -2
  60. package/dist/handlers/restart.js +3 -8
  61. package/dist/handlers/restart.js.map +1 -1
  62. package/dist/handlers/slack-event.d.ts +13 -0
  63. package/dist/handlers/slack-event.js +40 -0
  64. package/dist/handlers/slack-event.js.map +1 -0
  65. package/dist/handlers/stop.js +0 -7
  66. package/dist/handlers/stop.js.map +1 -1
  67. package/dist/handlers/telegram-webhook.js +3 -22
  68. package/dist/handlers/telegram-webhook.js.map +1 -1
  69. package/dist/handlers/update-config.js +4 -13
  70. package/dist/handlers/update-config.js.map +1 -1
  71. package/dist/heartbeat.d.ts +7 -1
  72. package/dist/heartbeat.js +35 -6
  73. package/dist/heartbeat.js.map +1 -1
  74. package/dist/index.d.ts +0 -8
  75. package/dist/index.js +87 -119
  76. package/dist/index.js.map +1 -1
  77. package/dist/lockfile.js +2 -1
  78. package/dist/lockfile.js.map +1 -1
  79. package/dist/platform/linux.js +6 -5
  80. package/dist/platform/linux.js.map +1 -1
  81. package/dist/platform/macos.js +3 -2
  82. package/dist/platform/macos.js.map +1 -1
  83. package/dist/platform/windows.js +3 -2
  84. package/dist/platform/windows.js.map +1 -1
  85. package/dist/providers/claude-code/channel-server.js +2 -1
  86. package/dist/providers/claude-code/channel-server.js.map +1 -1
  87. package/dist/providers/claude-code/settings-writer.d.ts +3 -2
  88. package/dist/providers/claude-code/settings-writer.js +6 -15
  89. package/dist/providers/claude-code/settings-writer.js.map +1 -1
  90. package/dist/providers/index.d.ts +13 -0
  91. package/dist/providers/index.js +25 -0
  92. package/dist/providers/index.js.map +1 -1
  93. package/dist/providers/openclaw/gateway-adapter.js +2 -0
  94. package/dist/providers/openclaw/gateway-adapter.js.map +1 -1
  95. package/dist/providers/openclaw/gateway-client.js +6 -1
  96. package/dist/providers/openclaw/gateway-client.js.map +1 -1
  97. package/dist/providers/openclaw/index.js +11 -13
  98. package/dist/providers/openclaw/index.js.map +1 -1
  99. package/dist/slack-relay-server.d.ts +48 -0
  100. package/dist/slack-relay-server.js +197 -0
  101. package/dist/slack-relay-server.js.map +1 -0
  102. package/dist/types.d.ts +16 -1
  103. package/dist/utils/anthropic-auth.d.ts +14 -0
  104. package/dist/utils/anthropic-auth.js +24 -0
  105. package/dist/utils/anthropic-auth.js.map +1 -1
  106. package/dist/utils/apply-config.d.ts +65 -12
  107. package/dist/utils/apply-config.js +295 -100
  108. package/dist/utils/apply-config.js.map +1 -1
  109. package/dist/utils/claude-env.d.ts +6 -0
  110. package/dist/utils/claude-env.js +29 -28
  111. package/dist/utils/claude-env.js.map +1 -1
  112. package/dist/utils/config-merge-paths.d.ts +15 -1
  113. package/dist/utils/config-merge-paths.js +17 -3
  114. package/dist/utils/config-merge-paths.js.map +1 -1
  115. package/dist/utils/deploy-type.d.ts +16 -0
  116. package/dist/utils/deploy-type.js +34 -0
  117. package/dist/utils/deploy-type.js.map +1 -0
  118. package/dist/utils/env.d.ts +0 -1
  119. package/dist/utils/env.js +0 -8
  120. package/dist/utils/env.js.map +1 -1
  121. package/dist/utils/exec.d.ts +11 -0
  122. package/dist/utils/exec.js +47 -1
  123. package/dist/utils/exec.js.map +1 -1
  124. package/dist/utils/gateway-restart-handler.d.ts +6 -2
  125. package/dist/utils/gateway-restart-handler.js +11 -2
  126. package/dist/utils/gateway-restart-handler.js.map +1 -1
  127. package/dist/utils/gateway-restart.d.ts +7 -0
  128. package/dist/utils/gateway-restart.js +12 -4
  129. package/dist/utils/gateway-restart.js.map +1 -1
  130. package/dist/utils/knowledge-graph.d.ts +13 -1
  131. package/dist/utils/knowledge-graph.js +75 -29
  132. package/dist/utils/knowledge-graph.js.map +1 -1
  133. package/dist/utils/legacy-mcp-servers.d.ts +12 -0
  134. package/dist/utils/legacy-mcp-servers.js +37 -0
  135. package/dist/utils/legacy-mcp-servers.js.map +1 -0
  136. package/dist/utils/log-collector.js +2 -1
  137. package/dist/utils/log-collector.js.map +1 -1
  138. package/dist/utils/openclaw-ops.d.ts +45 -3
  139. package/dist/utils/openclaw-ops.js +94 -15
  140. package/dist/utils/openclaw-ops.js.map +1 -1
  141. package/dist/utils/openclaw-stack-update.d.ts +31 -0
  142. package/dist/utils/openclaw-stack-update.js +50 -0
  143. package/dist/utils/openclaw-stack-update.js.map +1 -0
  144. package/dist/utils/package-install.js +4 -12
  145. package/dist/utils/package-install.js.map +1 -1
  146. package/dist/utils/package-version.d.ts +10 -0
  147. package/dist/utils/package-version.js +18 -0
  148. package/dist/utils/package-version.js.map +1 -0
  149. package/dist/utils/parse-id-at-version.d.ts +15 -0
  150. package/dist/utils/parse-id-at-version.js +22 -0
  151. package/dist/utils/parse-id-at-version.js.map +1 -0
  152. package/dist/utils/plugin-reconcile.d.ts +46 -0
  153. package/dist/utils/plugin-reconcile.js +201 -0
  154. package/dist/utils/plugin-reconcile.js.map +1 -0
  155. package/dist/utils/response.js +1 -0
  156. package/dist/utils/response.js.map +1 -1
  157. package/dist/utils/write-home-files.d.ts +27 -0
  158. package/dist/utils/write-home-files.js +72 -0
  159. package/dist/utils/write-home-files.js.map +1 -0
  160. package/dist/utils/write-workspace-files.d.ts +1 -1
  161. package/dist/utils/write-workspace-files.js +19 -7
  162. package/dist/utils/write-workspace-files.js.map +1 -1
  163. package/dist/workspace.d.ts +11 -0
  164. package/dist/workspace.js +20 -0
  165. package/dist/workspace.js.map +1 -1
  166. package/package.json +9 -4
@@ -1,18 +1,11 @@
1
- import { logCollector } from '../connection.js';
2
1
  import { config } from '../config.js';
3
2
  // STRUCT-3: This handler is intentionally a stub. The backend validates the pairing
4
3
  // token server-side; agent-controller only echoes back the identifiers as confirmation.
5
4
  // No local pairing operation is performed here.
6
5
  export function handlePair(command) {
7
- const startMs = Date.now();
8
- logCollector?.push('command_received', 'info', `Command: ${command.type}`, {
9
- commandId: command.id,
10
- });
11
6
  const pairToken = command.payload.token;
12
7
  const targetId = command.payload.targetId;
13
8
  if (!pairToken || !targetId) {
14
- const durationMs = Date.now() - startMs;
15
- logCollector?.push('command_failed', 'error', `${command.type} failed: Missing "token" or "targetId" in payload`, { commandId: command.id, durationMs });
16
9
  return Promise.resolve({
17
10
  id: command.id,
18
11
  type: 'pair',
@@ -20,11 +13,6 @@ export function handlePair(command) {
20
13
  error: 'Missing "token" or "targetId" in payload',
21
14
  });
22
15
  }
23
- const durationMs = Date.now() - startMs;
24
- logCollector?.push('command_completed', 'info', `${command.type} completed`, {
25
- commandId: command.id,
26
- durationMs,
27
- });
28
16
  return Promise.resolve({
29
17
  id: command.id,
30
18
  type: 'pair',
@@ -1 +1 @@
1
- {"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/handlers/pair.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,oFAAoF;AACpF,wFAAwF;AACxF,gDAAgD;AAChD,MAAM,UAAU,UAAU,CAAC,OAAqB;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,YAAY,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,EAAE,YAAY,OAAO,CAAC,IAAI,EAAE,EAAE;QACzE,SAAS,EAAE,OAAO,CAAC,EAAE;KACtB,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,KAAe,CAAC;IAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAkB,CAAC;IAEpD,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;QACxC,YAAY,EAAE,IAAI,CAChB,gBAAgB,EAChB,OAAO,EACP,GAAG,OAAO,CAAC,IAAI,mDAAmD,EAClE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,CACtC,CAAC;QACF,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,0CAA0C;SAClD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IACxC,YAAY,EAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,YAAY,EAAE;QAC3E,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,UAAU;KACX,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,OAAO,CAAC;QACrB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,IAAI;QACb,IAAI,EAAE;YACJ,MAAM,EAAE,IAAI;YACZ,QAAQ;YACR,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/handlers/pair.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,oFAAoF;AACpF,wFAAwF;AACxF,gDAAgD;AAChD,MAAM,UAAU,UAAU,CAAC,OAAqB;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,KAAe,CAAC;IAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAkB,CAAC;IAEpD,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,0CAA0C;SAClD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC;QACrB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,IAAI;QACb,IAAI,EAAE;YACJ,MAAM,EAAE,IAAI;YACZ,QAAQ;YACR,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -1,2 +1 @@
1
- import type { AgentCommand, AgentResponse } from '../types.js';
2
- export declare function handleRestart(command: AgentCommand): Promise<AgentResponse>;
1
+ export { handleGatewayRestartCommand as handleRestart } from '../utils/gateway-restart-handler.js';
@@ -1,9 +1,4 @@
1
- import { handleGatewayRestartCommand } from '../utils/gateway-restart-handler.js';
2
- import { logCollector } from '../connection.js';
3
- export async function handleRestart(command) {
4
- logCollector?.push('gateway_restart', 'info', 'Gateway restart requested', {
5
- commandId: command.id,
6
- });
7
- return handleGatewayRestartCommand(command);
8
- }
1
+ // `restart`, `deploy` and `onboarding_complete` are the same operation — a
2
+ // gateway restart. One implementation, three command names.
3
+ export { handleGatewayRestartCommand as handleRestart } from '../utils/gateway-restart-handler.js';
9
4
  //# sourceMappingURL=restart.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"restart.js","sourceRoot":"","sources":["../../src/handlers/restart.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAqB;IACvD,YAAY,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE,2BAA2B,EAAE;QACzE,SAAS,EAAE,OAAO,CAAC,EAAE;KACtB,CAAC,CAAC;IACH,OAAO,2BAA2B,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"restart.js","sourceRoot":"","sources":["../../src/handlers/restart.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,4DAA4D;AAC5D,OAAO,EAAE,2BAA2B,IAAI,aAAa,EAAE,MAAM,qCAAqC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { AgentCommand, AgentResponse } from '../types.js';
2
+ /**
3
+ * Backend → Centrifugo `slack_event` command. Forwards one Slack message event
4
+ * to the openclaw relay client over the local WS server. The push resolves once
5
+ * the frame is written to that client socket — NOT on openclaw's later
6
+ * dispatch-ack (see src/slack-relay-server.ts) — so `delivered:true` means the
7
+ * relay client received the frame, not that openclaw dispatched it to the agent.
8
+ *
9
+ * No CLI wrapper — same exemption as `telegram_webhook`: the payload is a live
10
+ * routed message that only makes sense arriving over the WS with a connected
11
+ * relay client on the other end; there is nothing to run standalone.
12
+ */
13
+ export declare function handleSlackEvent(cmd: AgentCommand): Promise<AgentResponse>;
@@ -0,0 +1,40 @@
1
+ import { logCollector } from '../connection.js';
2
+ import { toErrorMessage, toErrorResponse } from '../utils/response.js';
3
+ import { pushSlackEvent } from '../slack-relay-server.js';
4
+ /**
5
+ * Backend → Centrifugo `slack_event` command. Forwards one Slack message event
6
+ * to the openclaw relay client over the local WS server. The push resolves once
7
+ * the frame is written to that client socket — NOT on openclaw's later
8
+ * dispatch-ack (see src/slack-relay-server.ts) — so `delivered:true` means the
9
+ * relay client received the frame, not that openclaw dispatched it to the agent.
10
+ *
11
+ * No CLI wrapper — same exemption as `telegram_webhook`: the payload is a live
12
+ * routed message that only makes sense arriving over the WS with a connected
13
+ * relay client on the other end; there is nothing to run standalone.
14
+ */
15
+ export async function handleSlackEvent(cmd) {
16
+ const { event, deliveryId, route } = cmd.payload;
17
+ // Trust boundary — the backend is upstream, validate before forwarding.
18
+ if (!event) {
19
+ return { id: cmd.id, type: cmd.type, success: false, error: 'Missing event' };
20
+ }
21
+ if (!deliveryId) {
22
+ // Required: it's the backend's at-least-once redelivery key and rides in the frame.
23
+ return { id: cmd.id, type: cmd.type, success: false, error: 'Missing deliveryId' };
24
+ }
25
+ try {
26
+ await pushSlackEvent({
27
+ event,
28
+ deliveryId,
29
+ route: route ?? { kind: 'channel_default', key: '' },
30
+ });
31
+ // Domain event only — connection.ts owns command_received/completed/failed.
32
+ logCollector?.push('slack_event_forwarded', 'info', `Slack event forwarded to relay client (delivery ${deliveryId})`, { commandId: cmd.id, deliveryId });
33
+ return { id: cmd.id, type: cmd.type, success: true, data: { delivered: true } };
34
+ }
35
+ catch (err) {
36
+ logCollector?.push('slack_event_forwarded', 'error', `Slack event relay failed (delivery ${deliveryId}): ${toErrorMessage(err)}`, { commandId: cmd.id, deliveryId });
37
+ return toErrorResponse(cmd, err);
38
+ }
39
+ }
40
+ //# sourceMappingURL=slack-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-event.js","sourceRoot":"","sources":["../../src/handlers/slack-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAiB;IACtD,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,OAIxC,CAAC;IAEF,wEAAwE;IACxE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IAChF,CAAC;IACD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,oFAAoF;QACpF,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IACrF,CAAC;IAED,IAAI,CAAC;QACH,MAAM,cAAc,CAAC;YACnB,KAAK;YACL,UAAU;YACV,KAAK,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,EAAE,EAAE;SACrD,CAAC,CAAC;QACH,4EAA4E;QAC5E,YAAY,EAAE,IAAI,CAChB,uBAAuB,EACvB,MAAM,EACN,mDAAmD,UAAU,GAAG,EAChE,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,CAClC,CAAC;QACF,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;IAClF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,EAAE,IAAI,CAChB,uBAAuB,EACvB,OAAO,EACP,sCAAsC,UAAU,MAAM,cAAc,CAAC,GAAG,CAAC,EAAE,EAC3E,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,CAClC,CAAC;QACF,OAAO,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC;AACH,CAAC"}
@@ -1,11 +1,4 @@
1
- import { logCollector } from '../connection.js';
2
1
  export function handleStop(command) {
3
- logCollector?.push('command_received', 'info', `Command: ${command.type}`, {
4
- commandId: command.id,
5
- });
6
- logCollector?.push('command_completed', 'info', `${command.type} completed`, {
7
- commandId: command.id,
8
- });
9
2
  const response = {
10
3
  id: command.id,
11
4
  type: 'stop',
@@ -1 +1 @@
1
- {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/handlers/stop.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,UAAU,UAAU,CAAC,OAAqB;IAC9C,YAAY,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,EAAE,YAAY,OAAO,CAAC,IAAI,EAAE,EAAE;QACzE,SAAS,EAAE,OAAO,CAAC,EAAE;KACtB,CAAC,CAAC;IACH,YAAY,EAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,YAAY,EAAE;QAC3E,SAAS,EAAE,OAAO,CAAC,EAAE;KACtB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAkB;QAC9B,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,EAAE,OAAO,EAAE,0BAA0B,EAAE;KAC9C,CAAC;IAEF,yFAAyF;IACzF,yFAAyF;IACzF,qFAAqF;IACrF,8CAA8C;IAC9C,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,EAAE,GAAG,CAAC,CAAC;IAER,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/handlers/stop.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,UAAU,CAAC,OAAqB;IAC9C,MAAM,QAAQ,GAAkB;QAC9B,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,EAAE,OAAO,EAAE,0BAA0B,EAAE;KAC9C,CAAC;IAEF,yFAAyF;IACzF,yFAAyF;IACzF,qFAAqF;IACrF,8CAA8C;IAC9C,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,EAAE,GAAG,CAAC,CAAC;IAER,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC"}
@@ -3,16 +3,8 @@ import { logCollector } from '../connection.js';
3
3
  const WEBHOOK_PORT = 8787;
4
4
  const TIMEOUT_MS = 10_000;
5
5
  export async function handleTelegramWebhook(command) {
6
- logCollector?.push('command_received', 'info', `Command: ${command.type}`, {
7
- commandId: command.id,
8
- });
9
- const startMs = Date.now();
10
6
  const { body, webhookSecret } = command.payload;
11
7
  if (!body) {
12
- logCollector?.push('command_failed', 'error', `${command.type} failed: missing body in payload`, {
13
- commandId: command.id,
14
- durationMs: Date.now() - startMs,
15
- });
16
8
  return {
17
9
  id: command.id,
18
10
  type: command.type,
@@ -33,12 +25,10 @@ export async function handleTelegramWebhook(command) {
33
25
  body: JSON.stringify(body),
34
26
  signal: AbortSignal.timeout(TIMEOUT_MS),
35
27
  });
28
+ // Domain event: which status the local gateway gave us. The command
29
+ // lifecycle (received/completed/failed) is logged by connection.ts.
30
+ logCollector?.push('telegram_webhook_forwarded', response.ok ? 'info' : 'error', `Telegram update forwarded to gateway: HTTP ${response.status}`, { commandId: command.id, statusCode: response.status });
36
31
  if (!response.ok) {
37
- logCollector?.push('command_failed', 'error', `${command.type} failed: gateway ${response.status}`, {
38
- commandId: command.id,
39
- durationMs: Date.now() - startMs,
40
- statusCode: response.status,
41
- });
42
32
  return {
43
33
  id: command.id,
44
34
  type: command.type,
@@ -46,11 +36,6 @@ export async function handleTelegramWebhook(command) {
46
36
  error: `Gateway responded with ${response.status}: ${response.statusText}`,
47
37
  };
48
38
  }
49
- logCollector?.push('command_completed', 'info', `${command.type} completed`, {
50
- commandId: command.id,
51
- durationMs: Date.now() - startMs,
52
- statusCode: response.status,
53
- });
54
39
  return {
55
40
  id: command.id,
56
41
  type: command.type,
@@ -59,10 +44,6 @@ export async function handleTelegramWebhook(command) {
59
44
  };
60
45
  }
61
46
  catch (err) {
62
- logCollector?.push('command_failed', 'error', `${command.type} failed: ${toErrorMessage(err)}`, {
63
- commandId: command.id,
64
- durationMs: Date.now() - startMs,
65
- });
66
47
  return {
67
48
  id: command.id,
68
49
  type: command.type,
@@ -1 +1 @@
1
- {"version":3,"file":"telegram-webhook.js","sourceRoot":"","sources":["../../src/handlers/telegram-webhook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telegram-webhook.js","sourceRoot":"","sources":["../../src/handlers/telegram-webhook.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAqB;IAC/D,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,OAGvC,CAAC;IAEF,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,2BAA2B;SACnC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QACF,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,CAAC,iCAAiC,CAAC,GAAG,aAAa,CAAC;QAC7D,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,YAAY,mBAAmB,EAAE;YAChF,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC;SACxC,CAAC,CAAC;QAEH,oEAAoE;QACpE,oEAAoE;QACpE,YAAY,EAAE,IAAI,CAChB,4BAA4B,EAC5B,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAC9B,8CAA8C,QAAQ,CAAC,MAAM,EAAE,EAC/D,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,CACvD,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO;gBACL,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,0BAA0B,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE;aAC3E,CAAC;QACJ,CAAC;QAED,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE;SAClC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC;SAC3B,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,26 +1,17 @@
1
1
  import { toErrorMessage } from '../utils/response.js';
2
- import { applyBootstrapConfig } from '../utils/apply-config.js';
2
+ import { fetchAndApplyConfig } from '../utils/apply-config.js';
3
3
  import { logCollector } from '../connection.js';
4
4
  export function handleUpdateConfig(api, agentId) {
5
5
  return async (cmd) => {
6
- const startMs = Date.now();
7
- logCollector?.push('command_received', 'info', `Command: ${cmd.type}`, { commandId: cmd.id });
8
6
  try {
9
- const data = await api.agentBootstrap(agentId);
10
- await applyBootstrapConfig(data);
11
- const durationMs = Date.now() - startMs;
12
- logCollector?.push('command_completed', 'info', `${cmd.type} completed`, {
7
+ const { managed } = await fetchAndApplyConfig(api, agentId);
8
+ logCollector?.push('config_applied', 'info', `Config applied (managed=${managed})`, {
13
9
  commandId: cmd.id,
14
- durationMs,
10
+ managed,
15
11
  });
16
12
  return { id: cmd.id, type: cmd.type, success: true, data: {} };
17
13
  }
18
14
  catch (err) {
19
- const durationMs = Date.now() - startMs;
20
- logCollector?.push('command_failed', 'error', `${cmd.type} failed: ${toErrorMessage(err)}`, {
21
- commandId: cmd.id,
22
- durationMs,
23
- });
24
15
  return { id: cmd.id, type: cmd.type, success: false, error: toErrorMessage(err) };
25
16
  }
26
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"update-config.js","sourceRoot":"","sources":["../../src/handlers/update-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,UAAU,kBAAkB,CAAC,GAAa,EAAE,OAAe;IAC/D,OAAO,KAAK,EAAE,GAAiB,EAA0B,EAAE;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,YAAY,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,EAAE,YAAY,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAC/C,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;YACxC,YAAY,EAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,YAAY,EAAE;gBACvE,SAAS,EAAE,GAAG,CAAC,EAAE;gBACjB,UAAU;aACX,CAAC,CAAC;YACH,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACjE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;YACxC,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,YAAY,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE;gBAC1F,SAAS,EAAE,GAAG,CAAC,EAAE;gBACjB,UAAU;aACX,CAAC,CAAC;YACH,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACpF,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"update-config.js","sourceRoot":"","sources":["../../src/handlers/update-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,UAAU,kBAAkB,CAAC,GAAa,EAAE,OAAe;IAC/D,OAAO,KAAK,EAAE,GAAiB,EAA0B,EAAE;QACzD,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC5D,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,2BAA2B,OAAO,GAAG,EAAE;gBAClF,SAAS,EAAE,GAAG,CAAC,EAAE;gBACjB,OAAO;aACR,CAAC,CAAC;YACH,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACjE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACpF,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { AgentApi } from './api.js';
2
- import type { HeartbeatPayload } from './types.js';
2
+ import type { HeartbeatPayload, CentrifugoStatus } from './types.js';
3
3
  /**
4
4
  * Read sessions.json index to find the latest session activity timestamp.
5
5
  * sessions.json is maintained by OpenClaw gateway and contains an `updatedAt`
@@ -12,6 +12,12 @@ export interface HeartbeatOptions {
12
12
  api: AgentApi;
13
13
  agentId: string;
14
14
  version: string;
15
+ /**
16
+ * Optional probe for the Centrifugo WS connection. Wired in `index.ts`
17
+ * from the live `createConnection()` result. Omitted in CLI / one-shot
18
+ * contexts (`agent-controller heartbeat`) where no WS client exists.
19
+ */
20
+ getCentrifugoStatus?: () => CentrifugoStatus;
15
21
  }
16
22
  declare function getMetrics(): HeartbeatPayload['metrics'];
17
23
  export declare function publishHeartbeat(opts: HeartbeatOptions): Promise<void>;
package/dist/heartbeat.js CHANGED
@@ -6,6 +6,7 @@ import { config } from './config.js';
6
6
  import { getProvider } from './providers/index.js';
7
7
  import { isLockFilePresent } from './lockfile.js';
8
8
  import { getOpenclawVersion, listInstalledPlugins } from './utils/openclaw-ops.js';
9
+ import { toErrorMessage } from './utils/response.js';
9
10
  const HEARTBEAT_INTERVAL = 30_000;
10
11
  async function checkGateway() {
11
12
  const provider = getProvider();
@@ -60,13 +61,20 @@ function getMetrics() {
60
61
  }
61
62
  /**
62
63
  * Collect installed component versions for the heartbeat. The controller
63
- * version is always known (it's the binary running this code). Runtime and
64
- * plugin lookups go through the openclaw CLI and are best-effort: a missing
65
- * binary or a malformed `--json` reply must NOT break the heartbeat loop —
66
- * the backend handles partial data and keeps the last known good values.
64
+ * version is always known (it's the binary running this code). Runtime
65
+ * goes through `openclaw --version` and is best-effort: a missing binary
66
+ * (mock/claude-code providers) drops the field. Plugin enumeration goes
67
+ * through `openclaw plugins list --json` — that's the source of truth.
68
+ * The config file's `plugins.installs` block is incomplete: bundled /
69
+ * compat-discovered plugins are absent from it, and openclaw itself
70
+ * sometimes rewrites the config without preserving the `installs` map,
71
+ * so reading the file under-reports loaded plugins. Plugin read returns
72
+ * `[]` on any failure; the backend treats `plugins: []` as a true "no
73
+ * plugins" signal (distinct from omitting the field).
67
74
  */
68
75
  async function collectVersions(controllerVersion) {
69
76
  const versions = { agentController: controllerVersion };
77
+ versions.nodeVersion = process.version;
70
78
  try {
71
79
  versions.agentRuntime = await getOpenclawVersion();
72
80
  }
@@ -77,13 +85,27 @@ async function collectVersions(controllerVersion) {
77
85
  versions.plugins = await listInstalledPlugins();
78
86
  }
79
87
  catch {
80
- /* CLI failed — omit and let backend retain previous list */
88
+ /* CLI failed (timeout, missing subcommand) — report empty list rather than throw */
89
+ versions.plugins = [];
81
90
  }
82
91
  return versions;
83
92
  }
84
93
  export async function publishHeartbeat(opts) {
85
94
  const gw = await checkGateway();
86
95
  const versions = await collectVersions(opts.version);
96
+ // Capture Centrifugo status synchronously *before* the await on the network
97
+ // POST so the snapshot reflects the state at send-time, not at ack-time.
98
+ let centrifugoStatus;
99
+ if (opts.getCentrifugoStatus) {
100
+ try {
101
+ centrifugoStatus = opts.getCentrifugoStatus();
102
+ }
103
+ catch (err) {
104
+ // Never let a probe failure crash a heartbeat — backend can infer
105
+ // "controller alive but probe broken" from the absent field.
106
+ debugLog('heartbeat', 'getCentrifugoStatus threw', err);
107
+ }
108
+ }
87
109
  const payload = {
88
110
  type: 'heartbeat',
89
111
  agentId: opts.agentId,
@@ -93,14 +115,21 @@ export async function publishHeartbeat(opts) {
93
115
  metrics: getMetrics(),
94
116
  gatewayStatus: gw,
95
117
  lastMessageAt: await getLastMessageAt(),
118
+ ...(centrifugoStatus ? { centrifugoStatus } : {}),
96
119
  };
97
120
  try {
98
121
  debugLog('heartbeat', '→ sending', opts.agentId, JSON.stringify(payload).slice(0, 500));
99
122
  await opts.api.publishHeartbeat(opts.agentId, payload);
100
123
  debugLog('heartbeat', '← ok');
124
+ if (centrifugoStatus) {
125
+ console.log(`[heartbeat] ok centrifugo=${centrifugoStatus.state} commands=${centrifugoStatus.commandSubState} chat=${centrifugoStatus.chatSubState}`);
126
+ }
127
+ else {
128
+ console.log('[heartbeat] ok');
129
+ }
101
130
  }
102
131
  catch (err) {
103
- console.error('Heartbeat publish failed:', err instanceof Error ? err.message : err);
132
+ console.error('Heartbeat publish failed:', toErrorMessage(err));
104
133
  debugLog('heartbeat', '← error', err);
105
134
  }
106
135
  }
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1 @@
1
- /**
2
- * Lift any legacy flat `mcpServers` at the root of openclaw.json into the
3
- * canonical `mcp.servers` location. The OpenClaw CLI switched to strict
4
- * schema validation that rejects the unknown top-level `mcpServers` key, so
5
- * leaving it behind crashes the gateway on startup. Mutates `fileConfig`
6
- * in place; returns true if anything changed.
7
- */
8
- export declare function migrateLegacyMcpServers(fileConfig: Record<string, unknown>): boolean;
9
1
  export declare function main(): Promise<void>;