Skip to content

Commit e016fe7

Browse files
Refactor Claude stream error handling
- Consolidate Claude stream exit handling through `Exit.match` - Preserve interrupted vs failed turn completion and runtime error emission
1 parent 851024d commit e016fe7

1 file changed

Lines changed: 33 additions & 28 deletions

File tree

apps/server/src/provider/Layers/ClaudeAdapter.ts

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1302,6 +1302,29 @@ const makeClaudeAdapter = Effect.fn("makeClaudeAdapter")(function* (
13021302
});
13031303
});
13041304

1305+
const handleClaudeStreamError = (
1306+
context: ClaudeSessionContext,
1307+
cause: Cause.Cause<ClaudeStreamError>,
1308+
) =>
1309+
Option.match(Cause.findErrorOption(cause), {
1310+
onNone: () =>
1311+
context.turnState
1312+
? completeTurn(context, "failed", "Claude runtime stream failed.")
1313+
: Effect.void,
1314+
onSome: (streamError) =>
1315+
isClaudeStreamInterruptedError(streamError)
1316+
? context.turnState
1317+
? completeTurn(context, "interrupted", "Claude runtime interrupted.")
1318+
: Effect.void
1319+
: Effect.gen(function* () {
1320+
const message = streamError.message;
1321+
yield* emitRuntimeError(context, message, Cause.pretty(cause));
1322+
if (context.turnState) {
1323+
yield* completeTurn(context, "failed", message);
1324+
}
1325+
}),
1326+
});
1327+
13051328
const completeTurn = Effect.fn("completeTurn")(function* (
13061329
context: ClaudeSessionContext,
13071330
status: ProviderRuntimeTurnStatus,
@@ -2228,34 +2251,16 @@ const makeClaudeAdapter = Effect.fn("makeClaudeAdapter")(function* (
22282251
return;
22292252
}
22302253

2231-
if (Exit.isFailure(exit)) {
2232-
if (Cause.hasInterruptsOnly(exit.cause)) {
2233-
if (context.turnState) {
2234-
yield* completeTurn(context, "interrupted", "Claude runtime interrupted.");
2235-
}
2236-
} else {
2237-
yield* Option.match(Cause.findErrorOption(exit.cause), {
2238-
onNone: () =>
2239-
context.turnState
2240-
? completeTurn(context, "failed", "Claude runtime stream failed.")
2241-
: Effect.void,
2242-
onSome: (streamError) =>
2243-
isClaudeStreamInterruptedError(streamError)
2244-
? context.turnState
2245-
? completeTurn(context, "interrupted", "Claude runtime interrupted.")
2246-
: Effect.void
2247-
: Effect.gen(function* () {
2248-
const message = streamError.message;
2249-
yield* emitRuntimeError(context, message, Cause.pretty(exit.cause));
2250-
if (context.turnState) {
2251-
yield* completeTurn(context, "failed", message);
2252-
}
2253-
}),
2254-
});
2255-
}
2256-
} else if (context.turnState) {
2257-
yield* completeTurn(context, "interrupted", "Claude runtime stream ended.");
2258-
}
2254+
yield* Exit.match(exit, {
2255+
onSuccess: () =>
2256+
context.turnState
2257+
? completeTurn(context, "interrupted", "Claude runtime stream ended.")
2258+
: Effect.void,
2259+
onFailure: (cause) =>
2260+
Cause.hasInterruptsOnly(cause) && context.turnState
2261+
? completeTurn(context, "interrupted", "Claude runtime interrupted.")
2262+
: handleClaudeStreamError(context, cause),
2263+
});
22592264

22602265
yield* stopSessionInternal(context, {
22612266
emitExitEvent: true,

0 commit comments

Comments
 (0)