claude-code-rust 0.9.0 → 0.11.0

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.
@@ -1,6 +1,32 @@
1
1
  import { emitMcpOperationError, slashError, writeEvent } from "./events.js";
2
+ import { bridgeLogger, LOG_TARGETS } from "./logger.js";
2
3
  export const MCP_STALE_STATUS_REVALIDATION_COOLDOWN_MS = 30_000;
3
4
  const knownConnectedMcpServers = new Set();
5
+ function logMcpSuccess(eventName, message, sessionId, requestId, fields) {
6
+ bridgeLogger.info({
7
+ target: LOG_TARGETS.BRIDGE_MCP,
8
+ eventName,
9
+ message,
10
+ outcome: "success",
11
+ sessionId,
12
+ ...(requestId ? { requestId } : {}),
13
+ ...(fields ? { fields } : {}),
14
+ });
15
+ }
16
+ function logMcpFailure(eventName, message, sessionId, errorMessage, requestId, fields) {
17
+ bridgeLogger.warn({
18
+ target: LOG_TARGETS.BRIDGE_MCP,
19
+ eventName,
20
+ message,
21
+ outcome: "failure",
22
+ sessionId,
23
+ ...(requestId ? { requestId } : {}),
24
+ fields: {
25
+ ...(fields ?? {}),
26
+ error_message: errorMessage,
27
+ },
28
+ });
29
+ }
4
30
  function queryWithMcpAuth(session) {
5
31
  return session.query;
6
32
  }
@@ -51,6 +77,9 @@ export async function emitMcpSnapshotEvent(session, requestId) {
51
77
  let mapped = servers.map(mapMcpServerStatus);
52
78
  mapped = await reconcileSuspiciousMcpStatuses(session, mapped);
53
79
  rememberKnownConnectedMcpServers(mapped);
80
+ logMcpSuccess("mcp_snapshot_emitted", "MCP snapshot emitted", session.sessionId, requestId, {
81
+ server_count: mapped.length,
82
+ });
54
83
  writeEvent({
55
84
  event: "mcp_snapshot",
56
85
  session_id: session.sessionId,
@@ -90,15 +119,36 @@ async function reconcileSuspiciousMcpStatuses(session, servers) {
90
119
  const now = Date.now();
91
120
  for (const serverName of candidates) {
92
121
  session.mcpStatusRevalidatedAt.set(serverName, now);
93
- console.error(`[sdk mcp reconcile] session=${session.sessionId} server=${serverName} ` +
94
- `status=needs-auth reason=previously-connected action=reconnect`);
122
+ bridgeLogger.info({
123
+ target: LOG_TARGETS.BRIDGE_MCP,
124
+ eventName: "mcp_auth_revalidation_started",
125
+ message: "revalidating stale MCP auth status",
126
+ outcome: "start",
127
+ sessionId: session.sessionId,
128
+ fields: {
129
+ server_name: serverName,
130
+ status: "needs-auth",
131
+ reason: "previously_connected",
132
+ action: "reconnect",
133
+ },
134
+ });
95
135
  try {
96
136
  await session.query.reconnectMcpServer(serverName);
97
137
  }
98
138
  catch (error) {
99
139
  const message = error instanceof Error ? error.message : String(error);
100
- console.error(`[sdk mcp reconcile] session=${session.sessionId} server=${serverName} ` +
101
- `action=reconnect failed=${message}`);
140
+ bridgeLogger.warn({
141
+ target: LOG_TARGETS.BRIDGE_MCP,
142
+ eventName: "mcp_auth_revalidation_failed",
143
+ message: "failed to revalidate MCP auth status",
144
+ outcome: "failure",
145
+ sessionId: session.sessionId,
146
+ fields: {
147
+ server_name: serverName,
148
+ action: "reconnect",
149
+ error_message: message,
150
+ },
151
+ });
102
152
  }
103
153
  }
104
154
  return (await session.query.mcpServerStatus()).map(mapMcpServerStatus);
@@ -137,6 +187,7 @@ export async function handleMcpStatusCommand(session, requestId) {
137
187
  }
138
188
  catch (error) {
139
189
  const message = error instanceof Error ? error.message : String(error);
190
+ logMcpFailure("mcp_snapshot_failed", "failed to emit MCP snapshot", session.sessionId, message, requestId);
140
191
  writeEvent({
141
192
  event: "mcp_snapshot",
142
193
  session_id: session.sessionId,
@@ -148,27 +199,35 @@ export async function handleMcpStatusCommand(session, requestId) {
148
199
  export async function handleMcpReconnectCommand(session, command, requestId) {
149
200
  try {
150
201
  await session.query.reconnectMcpServer(command.server_name);
202
+ logMcpSuccess("mcp_reconnect_completed", "MCP reconnect completed", command.session_id, requestId, {
203
+ server_name: command.server_name,
204
+ });
151
205
  }
152
206
  catch (error) {
153
207
  const message = error instanceof Error ? error.message : String(error);
208
+ logMcpFailure("mcp_reconnect_failed", "MCP reconnect failed", command.session_id, message, requestId, { server_name: command.server_name });
154
209
  emitMcpCommandError(command.session_id, "reconnect", message, requestId, command.server_name);
155
210
  }
156
211
  }
157
212
  export async function handleMcpToggleCommand(session, command, requestId) {
158
213
  try {
159
214
  await session.query.toggleMcpServer(command.server_name, command.enabled);
215
+ logMcpSuccess("mcp_toggle_completed", "MCP server toggle completed", command.session_id, requestId, { server_name: command.server_name, enabled: command.enabled });
160
216
  }
161
217
  catch (error) {
162
218
  const message = error instanceof Error ? error.message : String(error);
219
+ logMcpFailure("mcp_toggle_failed", "MCP server toggle failed", command.session_id, message, requestId, { server_name: command.server_name, enabled: command.enabled });
163
220
  emitMcpCommandError(command.session_id, "toggle", message, requestId, command.server_name);
164
221
  }
165
222
  }
166
223
  export async function handleMcpSetServersCommand(session, command, requestId) {
167
224
  try {
168
225
  await session.query.setMcpServers(command.servers);
226
+ logMcpSuccess("mcp_servers_set_completed", "MCP server configuration updated", command.session_id, requestId, { server_count: Object.keys(command.servers).length });
169
227
  }
170
228
  catch (error) {
171
229
  const message = error instanceof Error ? error.message : String(error);
230
+ logMcpFailure("mcp_servers_set_failed", "failed to update MCP server configuration", command.session_id, message, requestId, { server_count: Object.keys(command.servers).length });
172
231
  slashError(command.session_id, `failed to set MCP servers: ${message}`, requestId);
173
232
  }
174
233
  }
@@ -177,16 +236,21 @@ export async function handleMcpAuthenticateCommand(session, command, requestId)
177
236
  const result = await callMcpAuthMethod(session, "mcpAuthenticate", [command.server_name]);
178
237
  const redirect = extractMcpAuthRedirect(command.server_name, result);
179
238
  if (redirect) {
239
+ logMcpSuccess("mcp_auth_redirect_emitted", "MCP auth redirect emitted", command.session_id, requestId, { server_name: command.server_name, requires_user_action: redirect.requires_user_action });
180
240
  writeEvent({
181
241
  event: "mcp_auth_redirect",
182
242
  session_id: command.session_id,
183
243
  redirect,
184
- });
244
+ }, requestId);
245
+ }
246
+ else {
247
+ logMcpSuccess("mcp_authenticate_completed", "MCP authentication command completed", command.session_id, requestId, { server_name: command.server_name });
185
248
  }
186
249
  scheduleMcpAuthSnapshotMonitor(session, command.server_name);
187
250
  }
188
251
  catch (error) {
189
252
  const message = error instanceof Error ? error.message : String(error);
253
+ logMcpFailure("mcp_authenticate_failed", "MCP authentication command failed", command.session_id, message, requestId, { server_name: command.server_name });
190
254
  emitMcpCommandError(command.session_id, "authenticate", message, requestId, command.server_name);
191
255
  }
192
256
  }
@@ -195,9 +259,13 @@ export async function handleMcpClearAuthCommand(session, command, requestId) {
195
259
  await callMcpAuthMethod(session, "mcpClearAuth", [command.server_name]);
196
260
  forgetKnownConnectedMcpServer(command.server_name);
197
261
  session.mcpStatusRevalidatedAt.delete(command.server_name);
262
+ logMcpSuccess("mcp_clear_auth_completed", "MCP auth cleared", command.session_id, requestId, {
263
+ server_name: command.server_name,
264
+ });
198
265
  }
199
266
  catch (error) {
200
267
  const message = error instanceof Error ? error.message : String(error);
268
+ logMcpFailure("mcp_clear_auth_failed", "failed to clear MCP auth", command.session_id, message, requestId, { server_name: command.server_name });
201
269
  emitMcpCommandError(command.session_id, "clear-auth", message, requestId, command.server_name);
202
270
  }
203
271
  }
@@ -207,9 +275,17 @@ export async function handleMcpOauthCallbackUrlCommand(session, command, request
207
275
  command.server_name,
208
276
  command.callback_url,
209
277
  ]);
278
+ logMcpSuccess("mcp_oauth_callback_completed", "MCP OAuth callback URL submitted", command.session_id, requestId, {
279
+ server_name: command.server_name,
280
+ callback_url_chars: command.callback_url.length,
281
+ });
210
282
  }
211
283
  catch (error) {
212
284
  const message = error instanceof Error ? error.message : String(error);
285
+ logMcpFailure("mcp_oauth_callback_failed", "failed to submit MCP OAuth callback URL", command.session_id, message, requestId, {
286
+ server_name: command.server_name,
287
+ callback_url_chars: command.callback_url.length,
288
+ });
213
289
  emitMcpCommandError(command.session_id, "submit-callback-url", message, requestId, command.server_name);
214
290
  }
215
291
  }