@openclaw-cloud/agent-controller 1.0.0-beta.2 → 1.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 (131) hide show
  1. package/bin/agent-controller.js +11 -2
  2. package/dist/api.d.ts +4 -0
  3. package/dist/api.js +10 -2
  4. package/dist/api.js.map +1 -1
  5. package/dist/commands/bootstrap.js +9 -34
  6. package/dist/commands/bootstrap.js.map +1 -1
  7. package/dist/commands/channel-server.d.ts +17 -0
  8. package/dist/commands/channel-server.js +71 -0
  9. package/dist/commands/channel-server.js.map +1 -0
  10. package/dist/commands/heartbeat-cli.js +5 -4
  11. package/dist/commands/heartbeat-cli.js.map +1 -1
  12. package/dist/commands/install-deps.js +18 -8
  13. package/dist/commands/install-deps.js.map +1 -1
  14. package/dist/commands/install.js +8 -8
  15. package/dist/commands/install.js.map +1 -1
  16. package/dist/commands/self-update.js +2 -1
  17. package/dist/commands/self-update.js.map +1 -1
  18. package/dist/config-file.js +20 -4
  19. package/dist/config-file.js.map +1 -1
  20. package/dist/config.d.ts +39 -0
  21. package/dist/config.js +101 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/connection.d.ts +2 -0
  24. package/dist/connection.js +38 -7
  25. package/dist/connection.js.map +1 -1
  26. package/dist/debug.js +2 -1
  27. package/dist/debug.js.map +1 -1
  28. package/dist/handlers/backup.js +4 -1
  29. package/dist/handlers/backup.js.map +1 -1
  30. package/dist/handlers/board-handler.d.ts +4 -0
  31. package/dist/handlers/board-handler.js +127 -100
  32. package/dist/handlers/board-handler.js.map +1 -1
  33. package/dist/handlers/chat.d.ts +17 -0
  34. package/dist/handlers/chat.js +187 -6
  35. package/dist/handlers/chat.js.map +1 -1
  36. package/dist/handlers/deploy.js +16 -29
  37. package/dist/handlers/deploy.js.map +1 -1
  38. package/dist/handlers/diagnostics.js +12 -0
  39. package/dist/handlers/diagnostics.js.map +1 -1
  40. package/dist/handlers/knowledge-sync.js +21 -1
  41. package/dist/handlers/knowledge-sync.js.map +1 -1
  42. package/dist/handlers/memory.d.ts +13 -0
  43. package/dist/handlers/memory.js +128 -0
  44. package/dist/handlers/memory.js.map +1 -0
  45. package/dist/handlers/onboarding.js +18 -2
  46. package/dist/handlers/onboarding.js.map +1 -1
  47. package/dist/handlers/package-install.js +44 -12
  48. package/dist/handlers/package-install.js.map +1 -1
  49. package/dist/handlers/pair.js +14 -1
  50. package/dist/handlers/pair.js.map +1 -1
  51. package/dist/handlers/restart.js +3 -1
  52. package/dist/handlers/restart.js.map +1 -1
  53. package/dist/handlers/self-update.js +3 -1
  54. package/dist/handlers/self-update.js.map +1 -1
  55. package/dist/handlers/stop.js +7 -0
  56. package/dist/handlers/stop.js.map +1 -1
  57. package/dist/handlers/telegram-webhook.js +23 -0
  58. package/dist/handlers/telegram-webhook.js.map +1 -1
  59. package/dist/handlers/update-config.js +8 -2
  60. package/dist/handlers/update-config.js.map +1 -1
  61. package/dist/heartbeat.d.ts +7 -0
  62. package/dist/heartbeat.js +15 -65
  63. package/dist/heartbeat.js.map +1 -1
  64. package/dist/index.d.ts +1 -1
  65. package/dist/index.js +140 -29
  66. package/dist/index.js.map +1 -1
  67. package/dist/mcp-client.js.map +1 -1
  68. package/dist/memory-mcp-server.d.ts +8 -0
  69. package/dist/memory-mcp-server.js +291 -0
  70. package/dist/memory-mcp-server.js.map +1 -0
  71. package/dist/platform/linux.js +7 -3
  72. package/dist/platform/linux.js.map +1 -1
  73. package/dist/platform/macos.js +4 -2
  74. package/dist/platform/macos.js.map +1 -1
  75. package/dist/platform/windows.js +4 -2
  76. package/dist/platform/windows.js.map +1 -1
  77. package/dist/providers/claude-code/channel-server.d.ts +60 -0
  78. package/dist/providers/claude-code/channel-server.js +155 -0
  79. package/dist/providers/claude-code/channel-server.js.map +1 -0
  80. package/dist/providers/claude-code/index.d.ts +68 -0
  81. package/dist/providers/claude-code/index.js +276 -0
  82. package/dist/providers/claude-code/index.js.map +1 -0
  83. package/dist/providers/claude-code/login-flow.d.ts +26 -0
  84. package/dist/providers/claude-code/login-flow.js +129 -0
  85. package/dist/providers/claude-code/login-flow.js.map +1 -0
  86. package/dist/providers/claude-code/settings-writer.d.ts +29 -0
  87. package/dist/providers/claude-code/settings-writer.js +95 -0
  88. package/dist/providers/claude-code/settings-writer.js.map +1 -0
  89. package/dist/providers/claude-code/socket-bridge.d.ts +88 -0
  90. package/dist/providers/claude-code/socket-bridge.js +302 -0
  91. package/dist/providers/claude-code/socket-bridge.js.map +1 -0
  92. package/dist/providers/claude-code/spawn-claude.d.ts +44 -0
  93. package/dist/providers/claude-code/spawn-claude.js +108 -0
  94. package/dist/providers/claude-code/spawn-claude.js.map +1 -0
  95. package/dist/providers/index.d.ts +4 -2
  96. package/dist/providers/index.js +12 -0
  97. package/dist/providers/index.js.map +1 -1
  98. package/dist/providers/mock/index.js.map +1 -1
  99. package/dist/providers/openclaw/device-identity.js +2 -2
  100. package/dist/providers/openclaw/device-identity.js.map +1 -1
  101. package/dist/providers/openclaw/gateway-adapter.js +19 -8
  102. package/dist/providers/openclaw/gateway-adapter.js.map +1 -1
  103. package/dist/providers/openclaw/gateway-client.js +9 -3
  104. package/dist/providers/openclaw/gateway-client.js.map +1 -1
  105. package/dist/providers/openclaw/index.js +14 -3
  106. package/dist/providers/openclaw/index.js.map +1 -1
  107. package/dist/types.d.ts +1 -1
  108. package/dist/utils/agent-controller-bin.d.ts +8 -0
  109. package/dist/utils/agent-controller-bin.js +58 -0
  110. package/dist/utils/agent-controller-bin.js.map +1 -0
  111. package/dist/utils/apply-config.d.ts +28 -0
  112. package/dist/utils/apply-config.js +234 -4
  113. package/dist/utils/apply-config.js.map +1 -1
  114. package/dist/utils/claude-env.js +11 -5
  115. package/dist/utils/claude-env.js.map +1 -1
  116. package/dist/utils/config-merge-paths.d.ts +21 -0
  117. package/dist/utils/config-merge-paths.js +27 -0
  118. package/dist/utils/config-merge-paths.js.map +1 -0
  119. package/dist/utils/env.js +2 -1
  120. package/dist/utils/env.js.map +1 -1
  121. package/dist/utils/knowledge-graph.d.ts +66 -0
  122. package/dist/utils/knowledge-graph.js +163 -0
  123. package/dist/utils/knowledge-graph.js.map +1 -0
  124. package/dist/utils/release-channel.js +2 -4
  125. package/dist/utils/release-channel.js.map +1 -1
  126. package/dist/utils/write-workspace-files.d.ts +15 -0
  127. package/dist/utils/write-workspace-files.js +48 -0
  128. package/dist/utils/write-workspace-files.js.map +1 -0
  129. package/dist/workspace.js +4 -5
  130. package/dist/workspace.js.map +1 -1
  131. package/package.json +24 -3
@@ -1,45 +1,200 @@
1
1
  import { getProvider } from '../providers/index.js';
2
+ import { ClaudeCodeProvider } from '../providers/claude-code/index.js';
2
3
  import { toErrorMessage } from '../utils/response.js';
4
+ import { logCollector } from '../connection.js';
5
+ const pendingClaudeChats = new Map();
6
+ /** Test-only: wipe any tracked in-flight claude-code chat sends. */
7
+ export function __resetClaudeChatRegistry() {
8
+ pendingClaudeChats.clear();
9
+ }
10
+ function resolvePendingClaudeChat(sessionKey) {
11
+ if (!sessionKey)
12
+ return;
13
+ const pending = pendingClaudeChats.get(sessionKey);
14
+ if (!pending)
15
+ return;
16
+ pendingClaudeChats.delete(sessionKey);
17
+ logCollector?.push('command_completed', 'info', 'chat_send completed', {
18
+ commandId: pending.commandId,
19
+ durationMs: Date.now() - pending.startMs,
20
+ sessionKey,
21
+ provider: 'claude-code',
22
+ });
23
+ // Clear the typing indicator — Claude has produced its reply.
24
+ Promise.resolve(pending.publish({ type: 'chat_typing', agentId: pending.agentId, state: false })).catch(() => { });
25
+ }
26
+ /**
27
+ * Register a one-shot reply publisher with the claude-code provider. Called
28
+ * at startup from `main()` once the provider is configured. The publisher
29
+ * receives Claude's async `reply` / `edit_message` tool calls and publishes
30
+ * them to the chat channel via the supplied callback (typically a wrapper
31
+ * around `api.publishResponse` that emits `chat_response`).
32
+ */
33
+ export function registerClaudeReplyPublisher(provider, publish) {
34
+ provider.setReplyPublisher((reply, tool, meta) => {
35
+ const sessionKey = typeof meta.chat_id === 'string' ? meta.chat_id : undefined;
36
+ const payload = {
37
+ type: tool === 'edit_message' ? 'chat_edit' : 'chat_response',
38
+ correlationId: typeof meta.message_id === 'string' ? meta.message_id : undefined,
39
+ sessionKey,
40
+ text: reply.text,
41
+ source: typeof meta.source === 'string' ? meta.source : undefined,
42
+ };
43
+ try {
44
+ void publish(payload);
45
+ }
46
+ catch (err) {
47
+ logCollector?.push('claude_reply_publish_failed', 'warn', `reply publish failed: ${toErrorMessage(err)}`);
48
+ }
49
+ // Pair the reply with its originating chat_send (if any): clears the
50
+ // typing indicator and logs `command_completed`. Only `reply` (final)
51
+ // closes the command; `edit_message` is an intermediate progress update
52
+ // and must not clear typing.
53
+ if (tool === 'reply') {
54
+ resolvePendingClaudeChat(sessionKey);
55
+ }
56
+ });
57
+ }
3
58
  export async function handleChatListSessions(command, publish) {
59
+ logCollector?.push('command_received', 'info', `Command: ${command.type}`, {
60
+ commandId: command.id,
61
+ });
62
+ const startMs = Date.now();
4
63
  const provider = getProvider();
5
64
  if (!provider) {
6
- await publish({ type: 'chat_sessions_response', correlationId: command.id, sessions: [], error: 'Chat provider not available' });
65
+ logCollector?.push('command_failed', 'error', `${command.type} failed: Chat provider not available`, {
66
+ commandId: command.id,
67
+ durationMs: Date.now() - startMs,
68
+ });
69
+ await publish({
70
+ type: 'chat_sessions_response',
71
+ correlationId: command.id,
72
+ sessions: [],
73
+ error: 'Chat provider not available',
74
+ });
7
75
  return;
8
76
  }
9
77
  try {
10
78
  const sessions = await provider.listSessions();
79
+ logCollector?.push('command_completed', 'info', `${command.type} completed`, {
80
+ commandId: command.id,
81
+ durationMs: Date.now() - startMs,
82
+ sessionCount: sessions.length,
83
+ });
11
84
  await publish({ type: 'chat_sessions_response', correlationId: command.id, sessions });
12
85
  }
13
86
  catch (err) {
14
- await publish({ type: 'chat_sessions_response', correlationId: command.id, sessions: [], error: toErrorMessage(err) });
87
+ logCollector?.push('command_failed', 'error', `${command.type} failed: ${toErrorMessage(err)}`, {
88
+ commandId: command.id,
89
+ durationMs: Date.now() - startMs,
90
+ });
91
+ await publish({
92
+ type: 'chat_sessions_response',
93
+ correlationId: command.id,
94
+ sessions: [],
95
+ error: toErrorMessage(err),
96
+ });
15
97
  }
16
98
  }
17
99
  export async function handleChatHistory(command, publish) {
100
+ logCollector?.push('command_received', 'info', `Command: ${command.type}`, {
101
+ commandId: command.id,
102
+ });
103
+ const startMs = Date.now();
18
104
  const { sessionKey, limit } = command.payload;
19
105
  const provider = getProvider();
20
106
  if (!provider) {
21
- await publish({ type: 'chat_history_response', correlationId: command.id, messages: [], error: 'Chat provider not available' });
107
+ logCollector?.push('command_failed', 'error', `${command.type} failed: Chat provider not available`, {
108
+ commandId: command.id,
109
+ durationMs: Date.now() - startMs,
110
+ });
111
+ await publish({
112
+ type: 'chat_history_response',
113
+ correlationId: command.id,
114
+ messages: [],
115
+ error: 'Chat provider not available',
116
+ });
22
117
  return;
23
118
  }
24
119
  try {
25
120
  const messages = await provider.getHistory(sessionKey, limit ?? 200);
121
+ logCollector?.push('command_completed', 'info', `${command.type} completed`, {
122
+ commandId: command.id,
123
+ durationMs: Date.now() - startMs,
124
+ messageCount: messages.length,
125
+ });
26
126
  await publish({ type: 'chat_history_response', correlationId: command.id, messages });
27
127
  }
28
128
  catch (err) {
29
- await publish({ type: 'chat_history_response', correlationId: command.id, messages: [], error: toErrorMessage(err) });
129
+ logCollector?.push('command_failed', 'error', `${command.type} failed: ${toErrorMessage(err)}`, {
130
+ commandId: command.id,
131
+ durationMs: Date.now() - startMs,
132
+ });
133
+ await publish({
134
+ type: 'chat_history_response',
135
+ correlationId: command.id,
136
+ messages: [],
137
+ error: toErrorMessage(err),
138
+ });
30
139
  }
31
140
  }
32
141
  export async function handleChatSend(command, publish, agentId) {
142
+ logCollector?.push('command_received', 'info', `Command: ${command.type}`, {
143
+ commandId: command.id,
144
+ });
145
+ const startMs = Date.now();
33
146
  const { sessionKey, text, attachments } = command.payload;
34
147
  const correlationId = command.id;
35
148
  // Typing indicator
36
149
  await publish({ type: 'chat_typing', agentId, state: true }).catch(() => { });
37
150
  const provider = getProvider();
38
151
  if (!provider) {
39
- await publish({ type: 'chat_response', correlationId, sessionKey, text: '', error: 'Chat provider not available' });
152
+ logCollector?.push('command_failed', 'error', `${command.type} failed: Chat provider not available`, {
153
+ commandId: command.id,
154
+ durationMs: Date.now() - startMs,
155
+ });
156
+ await publish({
157
+ type: 'chat_response',
158
+ correlationId,
159
+ sessionKey,
160
+ text: '',
161
+ error: 'Chat provider not available',
162
+ });
163
+ await publish({ type: 'chat_typing', agentId, state: false }).catch(() => { });
40
164
  return;
41
165
  }
42
166
  try {
167
+ // claude-code: if a login is pending, treat the next message as the auth
168
+ // code instead of a chat message. Acknowledge via chat_response.
169
+ if (provider instanceof ClaudeCodeProvider && provider.getPendingLoginUrl()) {
170
+ const accepted = provider.submitLoginCode(text);
171
+ const ack = accepted
172
+ ? 'Login code received — finishing authentication…'
173
+ : 'No login prompt is waiting right now.';
174
+ logCollector?.push('command_completed', 'info', `${command.type} completed`, {
175
+ commandId: command.id,
176
+ durationMs: Date.now() - startMs,
177
+ sessionKey,
178
+ loginCodeSubmitted: accepted,
179
+ });
180
+ await publish({ type: 'chat_response', correlationId, sessionKey, text: ack }).catch(() => { });
181
+ await publish({ type: 'chat_typing', agentId, state: false }).catch(() => { });
182
+ return;
183
+ }
184
+ // CLAUDE-CODE TYPING: ClaudeCodeProvider.sendMessage returns immediately
185
+ // and never invokes onDone — replies arrive async via the reply publisher.
186
+ // Register this command as "pending" so the publisher can clear typing
187
+ // and emit `command_completed` when Claude's first reply arrives.
188
+ const isClaudeCode = provider instanceof ClaudeCodeProvider;
189
+ if (isClaudeCode) {
190
+ pendingClaudeChats.set(sessionKey, {
191
+ commandId: command.id,
192
+ agentId,
193
+ sessionKey,
194
+ startMs,
195
+ publish,
196
+ });
197
+ }
43
198
  await provider.sendMessage({
44
199
  sessionKey,
45
200
  text,
@@ -49,15 +204,41 @@ export async function handleChatSend(command, publish, agentId) {
49
204
  await publish({ type: 'chat_delta', correlationId, sessionKey, text: accumulated }).catch(() => { });
50
205
  },
51
206
  onDone: async (finalText) => {
207
+ logCollector?.push('command_completed', 'info', `${command.type} completed`, {
208
+ commandId: command.id,
209
+ durationMs: Date.now() - startMs,
210
+ sessionKey,
211
+ });
52
212
  await publish({ type: 'chat_response', correlationId, sessionKey, text: finalText }).catch(() => { });
213
+ await publish({ type: 'chat_typing', agentId, state: false }).catch(() => { });
53
214
  },
54
215
  onError: async (error) => {
216
+ logCollector?.push('command_failed', 'error', `${command.type} failed: ${error}`, {
217
+ commandId: command.id,
218
+ durationMs: Date.now() - startMs,
219
+ });
220
+ // Release any pending claude-code entry so it doesn't linger.
221
+ pendingClaudeChats.delete(sessionKey);
55
222
  await publish({ type: 'chat_response', correlationId, sessionKey, text: '', error }).catch(() => { });
223
+ await publish({ type: 'chat_typing', agentId, state: false }).catch(() => { });
56
224
  },
57
225
  });
58
226
  }
59
227
  catch (err) {
60
- await publish({ type: 'chat_response', correlationId, sessionKey, text: '', error: toErrorMessage(err) }).catch(() => { });
228
+ logCollector?.push('command_failed', 'error', `${command.type} failed: ${toErrorMessage(err)}`, {
229
+ commandId: command.id,
230
+ durationMs: Date.now() - startMs,
231
+ });
232
+ // Clear any claude-code pending entry to prevent stale tracking.
233
+ pendingClaudeChats.delete(sessionKey);
234
+ await publish({
235
+ type: 'chat_response',
236
+ correlationId,
237
+ sessionKey,
238
+ text: '',
239
+ error: toErrorMessage(err),
240
+ }).catch(() => { });
241
+ await publish({ type: 'chat_typing', agentId, state: false }).catch(() => { });
61
242
  }
62
243
  }
63
244
  //# sourceMappingURL=chat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/handlers/chat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/handlers/chat.ts"],"names":[],"mappings":"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"}
@@ -1,34 +1,21 @@
1
- import { getProvider } from '../providers/index.js';
1
+ import { handleGatewayRestartCommand } from '../utils/gateway-restart-handler.js';
2
+ import { logCollector } from '../connection.js';
2
3
  export async function handleDeploy(command) {
3
- const provider = getProvider();
4
- if (!provider) {
5
- return {
6
- id: command.id,
7
- type: 'deploy',
8
- success: false,
9
- error: 'No agent provider configured',
10
- };
4
+ const startMs = Date.now();
5
+ logCollector?.push('command_received', 'info', `Command: ${command.type}`, {
6
+ commandId: command.id,
7
+ });
8
+ const response = await handleGatewayRestartCommand(command);
9
+ const durationMs = Date.now() - startMs;
10
+ if (response.success) {
11
+ logCollector?.push('command_completed', 'info', `${command.type} completed`, {
12
+ commandId: command.id,
13
+ durationMs,
14
+ });
11
15
  }
12
- try {
13
- await provider.restart();
14
- return {
15
- id: command.id,
16
- type: 'deploy',
17
- success: true,
18
- data: { restart: { stdout: '', stderr: '' } },
19
- };
20
- }
21
- catch (err) {
22
- const e = err;
23
- return {
24
- id: command.id,
25
- type: 'deploy',
26
- success: false,
27
- data: {
28
- restart: { stdout: e.stdout ?? '', stderr: e.stderr ?? '' },
29
- },
30
- error: `Restart failed: ${e.message}`,
31
- };
16
+ else {
17
+ logCollector?.push('command_failed', 'error', `${command.type} failed: ${response.error ?? ''}`, { commandId: command.id, durationMs });
32
18
  }
19
+ return response;
33
20
  }
34
21
  //# sourceMappingURL=deploy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/handlers/deploy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAqB;IACtD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,8BAA8B;SACtC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QACzB,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE;SAC9C,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAAmD,CAAC;QAC9D,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,KAAK;YACd,IAAI,EAAE;gBACJ,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE;aAC5D;YACD,KAAK,EAAE,mBAAmB,CAAC,CAAC,OAAO,EAAE;SACtC,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/handlers/deploy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAqB;IACtD,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;IACH,MAAM,QAAQ,GAAG,MAAM,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IACxC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,YAAY,EAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,YAAY,EAAE;YAC3E,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,UAAU;SACX,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,YAAY,EAAE,IAAI,CAChB,gBAAgB,EAChB,OAAO,EACP,GAAG,OAAO,CAAC,IAAI,YAAY,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,EACjD,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,CACtC,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { exec } from 'node:child_process';
2
+ import { logCollector } from '../connection.js';
2
3
  const DIAGNOSTICS_TIMEOUT = 10_000;
3
4
  const ALLOWED_CHECKS = {
4
5
  disk_usage: 'df -h',
@@ -22,8 +23,14 @@ function runCheck(cmd) {
22
23
  });
23
24
  }
24
25
  export async function handleDiagnostics(command) {
26
+ const startMs = Date.now();
27
+ logCollector?.push('command_received', 'info', `Command: ${command.type}`, {
28
+ commandId: command.id,
29
+ });
25
30
  const checks = command.payload.checks;
26
31
  if (!Array.isArray(checks) || checks.length === 0) {
32
+ const durationMs = Date.now() - startMs;
33
+ logCollector?.push('command_failed', 'error', `${command.type} failed: Missing "checks" array in payload`, { commandId: command.id, durationMs });
27
34
  return {
28
35
  id: command.id,
29
36
  type: 'diagnostics',
@@ -40,6 +47,11 @@ export async function handleDiagnostics(command) {
40
47
  }
41
48
  results[key] = await runCheck(cmd);
42
49
  }
50
+ const durationMs = Date.now() - startMs;
51
+ logCollector?.push('command_completed', 'info', `${command.type} completed`, {
52
+ commandId: command.id,
53
+ durationMs,
54
+ });
43
55
  return {
44
56
  id: command.id,
45
57
  type: 'diagnostics',
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/handlers/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAG1C,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEnC,MAAM,cAAc,GAA2B;IAC7C,UAAU,EAAE,OAAO;IACnB,WAAW,EAAE,oBAAoB;IACjC,MAAM,EAAE,QAAQ;IAChB,cAAc,EAAE,gCAAgC;IAChD,YAAY,EAAE,gBAAgB;IAC9B,kBAAkB,EAAE,wDAAwD;IAC5E,SAAS,EAAE,+BAA+B;CAC3C,CAAC;AASF,SAAS,QAAQ,CAAC,GAAW;IAC3B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACpE,OAAO,CAAC;gBACN,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;gBACzB,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;gBACzB,OAAO,EAAE,CAAC,KAAK;gBACf,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAqB;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAA8B,CAAC;IAE9D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,mCAAmC;SAC3C,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAoD,EAAE,CAAC;IAEpE,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;YAC1C,SAAS;QACX,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,EAAE,OAAO,EAAE;KAClB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/handlers/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,17 @@
1
1
  import { pushKnowledgeToBackend } from '../utils/knowledge-push.js';
2
+ import { toErrorMessage } from '../utils/response.js';
3
+ import { logCollector } from '../connection.js';
2
4
  export async function handleKnowledgeSync(command, api, agentId) {
5
+ logCollector?.push('command_received', 'info', `Command: ${command.type}`, {
6
+ commandId: command.id,
7
+ });
8
+ const startMs = Date.now();
3
9
  const paths = command.payload.paths;
4
10
  if (paths !== undefined && !Array.isArray(paths)) {
11
+ logCollector?.push('command_failed', 'error', `${command.type} failed: invalid paths payload`, {
12
+ commandId: command.id,
13
+ durationMs: Date.now() - startMs,
14
+ });
5
15
  return {
6
16
  id: command.id,
7
17
  type: 'knowledge_sync',
@@ -11,6 +21,12 @@ export async function handleKnowledgeSync(command, api, agentId) {
11
21
  }
12
22
  try {
13
23
  const { filesRead, filesUpdated } = await pushKnowledgeToBackend(api, agentId, paths);
24
+ logCollector?.push('command_completed', 'info', `${command.type} completed`, {
25
+ commandId: command.id,
26
+ durationMs: Date.now() - startMs,
27
+ filesRead,
28
+ filesUpdated,
29
+ });
14
30
  return {
15
31
  id: command.id,
16
32
  type: 'knowledge_sync',
@@ -19,11 +35,15 @@ export async function handleKnowledgeSync(command, api, agentId) {
19
35
  };
20
36
  }
21
37
  catch (e) {
38
+ logCollector?.push('command_failed', 'error', `${command.type} failed: ${toErrorMessage(e)}`, {
39
+ commandId: command.id,
40
+ durationMs: Date.now() - startMs,
41
+ });
22
42
  return {
23
43
  id: command.id,
24
44
  type: 'knowledge_sync',
25
45
  success: false,
26
- error: e instanceof Error ? e.message : String(e),
46
+ error: toErrorMessage(e),
27
47
  };
28
48
  }
29
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge-sync.js","sourceRoot":"","sources":["../../src/handlers/knowledge-sync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAqB,EAAE,GAAa,EAAE,OAAe;IAC7F,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAA6B,CAAC;IAC5D,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,qDAAqD;SAC7D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACtF,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE;SAClC,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;SAClD,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"knowledge-sync.js","sourceRoot":"","sources":["../../src/handlers/knowledge-sync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAqB,EACrB,GAAa,EACb,OAAe;IAEf,YAAY,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,EAAE,YAAY,OAAO,CAAC,IAAI,EAAE,EAAE;QACzE,SAAS,EAAE,OAAO,CAAC,EAAE;KACtB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE3B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAA6B,CAAC;IAC5D,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,gCAAgC,EAAE;YAC7F,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;SACjC,CAAC,CAAC;QACH,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,qDAAqD;SAC7D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACtF,YAAY,EAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,YAAY,EAAE;YAC3E,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;YAChC,SAAS;YACT,YAAY;SACb,CAAC,CAAC;QACH,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE;SAClC,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,YAAY,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5F,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;SACjC,CAAC,CAAC;QACH,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;SACzB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { AgentCommand, AgentResponse } from '../types.js';
2
+ import type { KnowledgeGraphManager } from '../utils/knowledge-graph.js';
3
+ /**
4
+ * Forward KnowledgeGraphManager 'delta' events to the structured log stream so
5
+ * we can correlate WS broadcast with backend receipt. Call once at startup
6
+ * (idempotent per manager — caller is responsible for not double-wiring).
7
+ */
8
+ export declare function wireMemoryDeltaLogging(manager: KnowledgeGraphManager): void;
9
+ /**
10
+ * Create WS command handlers for memory operations.
11
+ * All 9 handlers delegate to the shared KnowledgeGraphManager instance.
12
+ */
13
+ export declare function createMemoryHandlers(manager: KnowledgeGraphManager): Record<string, (cmd: AgentCommand) => Promise<AgentResponse>>;
@@ -0,0 +1,128 @@
1
+ import { logCollector } from '../connection.js';
2
+ import { toErrorMessage } from '../utils/response.js';
3
+ // ---------------------------------------------------------------------------
4
+ // Helpers
5
+ // ---------------------------------------------------------------------------
6
+ function ok(cmd, data) {
7
+ return {
8
+ id: cmd.id,
9
+ type: cmd.type,
10
+ success: true,
11
+ data: data,
12
+ };
13
+ }
14
+ /**
15
+ * Compute a compact payload-shape summary for logs. NEVER logs values —
16
+ * only counts / top-level shape, so we can't leak observation contents.
17
+ */
18
+ function payloadShape(cmd) {
19
+ const p = (cmd.payload ?? {});
20
+ const shape = {};
21
+ const entities = p.entities;
22
+ if (Array.isArray(entities))
23
+ shape.entityCount = entities.length;
24
+ const relations = p.relations;
25
+ if (Array.isArray(relations))
26
+ shape.relationCount = relations.length;
27
+ const observations = p.observations;
28
+ if (Array.isArray(observations))
29
+ shape.observationCount = observations.length;
30
+ const deletions = p.deletions;
31
+ if (Array.isArray(deletions))
32
+ shape.deletionCount = deletions.length;
33
+ const entityNames = p.entityNames;
34
+ if (Array.isArray(entityNames))
35
+ shape.entityNameCount = entityNames.length;
36
+ const names = p.names;
37
+ if (Array.isArray(names))
38
+ shape.nameCount = names.length;
39
+ return shape;
40
+ }
41
+ /**
42
+ * Wrap a memory handler with structured lifecycle logs:
43
+ * memory_cmd_received → memory_cmd_persisting → memory_cmd_completed | memory_cmd_failed
44
+ * The `received`/`persisting` logs fire BEFORE disk I/O so that a hang during
45
+ * atomic write leaves the last-known state in backend-visible logs.
46
+ */
47
+ function instrument(type, fn) {
48
+ return async (cmd) => {
49
+ const started = Date.now();
50
+ const shape = payloadShape(cmd);
51
+ logCollector?.push('memory_cmd_received', 'info', `memory ${type} received`, {
52
+ commandId: cmd.id,
53
+ type,
54
+ ...shape,
55
+ });
56
+ logCollector?.push('memory_cmd_persisting', 'info', `memory ${type} persisting`, {
57
+ commandId: cmd.id,
58
+ type,
59
+ ...shape,
60
+ });
61
+ try {
62
+ const res = await fn(cmd);
63
+ logCollector?.push('memory_cmd_completed', 'info', `memory ${type} completed`, {
64
+ commandId: cmd.id,
65
+ type,
66
+ durationMs: Date.now() - started,
67
+ ...shape,
68
+ });
69
+ return res;
70
+ }
71
+ catch (err) {
72
+ logCollector?.push('memory_cmd_failed', 'error', `memory ${type} failed: ${toErrorMessage(err)}`, {
73
+ commandId: cmd.id,
74
+ type,
75
+ durationMs: Date.now() - started,
76
+ error: toErrorMessage(err),
77
+ ...shape,
78
+ });
79
+ throw err;
80
+ }
81
+ };
82
+ }
83
+ /**
84
+ * Forward KnowledgeGraphManager 'delta' events to the structured log stream so
85
+ * we can correlate WS broadcast with backend receipt. Call once at startup
86
+ * (idempotent per manager — caller is responsible for not double-wiring).
87
+ */
88
+ export function wireMemoryDeltaLogging(manager) {
89
+ manager.on('delta', (delta) => {
90
+ let count = 0;
91
+ if (Array.isArray(delta.data))
92
+ count = delta.data.length;
93
+ logCollector?.push('memory_delta', 'debug', `memory delta ${delta.action}`, {
94
+ action: delta.action,
95
+ count,
96
+ });
97
+ });
98
+ }
99
+ // ---------------------------------------------------------------------------
100
+ // Handler factory
101
+ // ---------------------------------------------------------------------------
102
+ /**
103
+ * Create WS command handlers for memory operations.
104
+ * All 9 handlers delegate to the shared KnowledgeGraphManager instance.
105
+ */
106
+ export function createMemoryHandlers(manager) {
107
+ return {
108
+ memory_create_entities: instrument('memory_create_entities', async (cmd) => ok(cmd, await manager.createEntities(cmd.payload.entities))),
109
+ memory_create_relations: instrument('memory_create_relations', async (cmd) => ok(cmd, await manager.createRelations(cmd.payload.relations))),
110
+ memory_add_observations: instrument('memory_add_observations', async (cmd) => ok(cmd, await manager.addObservations(cmd.payload.observations))),
111
+ memory_delete_entities: instrument('memory_delete_entities', async (cmd) => {
112
+ await manager.deleteEntities(cmd.payload.entityNames);
113
+ return ok(cmd, {});
114
+ }),
115
+ memory_delete_observations: instrument('memory_delete_observations', async (cmd) => {
116
+ await manager.deleteObservations(cmd.payload.deletions);
117
+ return ok(cmd, {});
118
+ }),
119
+ memory_delete_relations: instrument('memory_delete_relations', async (cmd) => {
120
+ await manager.deleteRelations(cmd.payload.relations);
121
+ return ok(cmd, {});
122
+ }),
123
+ memory_read_graph: instrument('memory_read_graph', async (cmd) => ok(cmd, manager.readGraph())),
124
+ memory_search_nodes: instrument('memory_search_nodes', async (cmd) => ok(cmd, manager.searchNodes(cmd.payload.query))),
125
+ memory_open_nodes: instrument('memory_open_nodes', async (cmd) => ok(cmd, manager.openNodes(cmd.payload.names))),
126
+ };
127
+ }
128
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/handlers/memory.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,21 @@
1
1
  import { handleGatewayRestartCommand } from '../utils/gateway-restart-handler.js';
2
- export function handleOnboardingComplete(command) {
3
- return handleGatewayRestartCommand(command);
2
+ import { logCollector } from '../connection.js';
3
+ export async function handleOnboardingComplete(command) {
4
+ const startMs = Date.now();
5
+ logCollector?.push('command_received', 'info', `Command: ${command.type}`, {
6
+ commandId: command.id,
7
+ });
8
+ const response = await handleGatewayRestartCommand(command);
9
+ const durationMs = Date.now() - startMs;
10
+ if (response.success) {
11
+ logCollector?.push('command_completed', 'info', `${command.type} completed`, {
12
+ commandId: command.id,
13
+ durationMs,
14
+ });
15
+ }
16
+ else {
17
+ logCollector?.push('command_failed', 'error', `${command.type} failed: ${response.error ?? ''}`, { commandId: command.id, durationMs });
18
+ }
19
+ return response;
4
20
  }
5
21
  //# sourceMappingURL=onboarding.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/handlers/onboarding.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAElF,MAAM,UAAU,wBAAwB,CAAC,OAAqB;IAC5D,OAAO,2BAA2B,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/handlers/onboarding.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,OAAqB;IAClE,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;IACH,MAAM,QAAQ,GAAG,MAAM,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IACxC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,YAAY,EAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,YAAY,EAAE;YAC3E,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,UAAU;SACX,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,YAAY,EAAE,IAAI,CAChB,gBAAgB,EAChB,OAAO,EACP,GAAG,OAAO,CAAC,IAAI,YAAY,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,EACjD,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,CACtC,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}