Skip to content

Commit fe9889d

Browse files
Aleksandr Lossenkoclaude
andcommitted
fix(session): catch plugin defects and normalize static MCP headers
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 0915805 commit fe9889d

1 file changed

Lines changed: 12 additions & 15 deletions

File tree

packages/opencode/src/session/prompt.ts

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -407,16 +407,17 @@ export const layer = Layer.effect(
407407
{ tool: key, sessionID: ctx.sessionID, callID: opts.toolCallId },
408408
{ args },
409409
)
410-
// === BEGIN ADDITIONS ===
411410
const meta = (item as { __mcp?: { server: string; tool: string } }).__mcp
412411
let mcpHeaders: Record<string, string> | undefined
413412
if (meta) {
414413
const cfg = yield* config.get()
415414
const serverCfg = cfg.mcp?.[meta.server]
416-
const staticHeaders =
417-
serverCfg && "headers" in serverCfg && serverCfg.headers
418-
? { ...serverCfg.headers }
419-
: {}
415+
const staticHeaders: Record<string, string> = {}
416+
if (serverCfg && "headers" in serverCfg && serverCfg.headers) {
417+
for (const [k, v] of Object.entries(serverCfg.headers)) {
418+
staticHeaders[k.toLowerCase()] = v
419+
}
420+
}
420421
const output = { headers: staticHeaders }
421422
yield* plugin
422423
.trigger(
@@ -430,31 +431,28 @@ export const layer = Layer.effect(
430431
output,
431432
)
432433
.pipe(
433-
Effect.catch((_err) => {
434-
const err = _err as unknown
434+
Effect.catchCause((cause) => {
435435
log.warn("mcp.call.before plugin failed", {
436436
server: meta.server,
437437
tool: meta.tool,
438438
sessionID: ctx.sessionID,
439439
callID: opts.toolCallId,
440-
error: err instanceof Error ? err.message : String(err),
440+
error: Cause.pretty(cause),
441441
})
442-
return Effect.succeed(output)
442+
return Effect.void
443443
}),
444444
)
445445
mcpHeaders = output.headers
446446
}
447-
// === END ADDITIONS ===
448447

449448
const result: Awaited<ReturnType<NonNullable<typeof execute>>> = yield* Effect.gen(function* () {
450449
yield* ctx.ask({ permission: key, metadata: {}, patterns: ["*"], always: ["*"] })
451-
// === BEGIN MODIFICATION ===
452450
return yield* Effect.promise(() => {
453-
if (meta && mcpHeaders) {
451+
if (mcpHeaders) {
454452
return MCP.McpCallContext.run(
455453
{
456-
server: meta.server,
457-
tool: meta.tool,
454+
server: meta!.server,
455+
tool: meta!.tool,
458456
sessionID: ctx.sessionID,
459457
callID: opts.toolCallId,
460458
headers: mcpHeaders,
@@ -464,7 +462,6 @@ export const layer = Layer.effect(
464462
}
465463
return execute(args, opts)
466464
})
467-
// === END MODIFICATION ===
468465
}).pipe(
469466
Effect.withSpan("Tool.execute", {
470467
attributes: {

0 commit comments

Comments
 (0)