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.
- package/README.md +16 -9
- package/agent-sdk/README.md +1 -1
- package/agent-sdk/dist/bridge/commands.js +71 -2
- package/agent-sdk/dist/bridge/events.js +127 -12
- package/agent-sdk/dist/bridge/history.js +9 -4
- package/agent-sdk/dist/bridge/logger.js +253 -0
- package/agent-sdk/dist/bridge/mcp.js +81 -5
- package/agent-sdk/dist/bridge/message_handlers.js +318 -67
- package/agent-sdk/dist/bridge/session_lifecycle.js +774 -58
- package/agent-sdk/dist/bridge/shared.js +0 -7
- package/agent-sdk/dist/bridge/state_parsing.js +61 -0
- package/agent-sdk/dist/bridge/tool_calls.js +269 -66
- package/agent-sdk/dist/bridge/tooling.js +60 -27
- package/agent-sdk/dist/bridge/user_interaction.js +34 -23
- package/agent-sdk/dist/bridge.js +406 -42
- package/agent-sdk/dist/bridge.test.js +765 -23
- package/package.json +2 -2
|
@@ -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
|
-
|
|
94
|
-
|
|
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
|
-
|
|
101
|
-
|
|
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
|
}
|