@@ -18,6 +18,35 @@ function asTrimmedString(value: unknown): string | null {
1818 return trimmed . length > 0 ? trimmed : null ;
1919}
2020
21+ const UNAVAILABLE_RETAINED_BOUNDARY_DETAIL =
22+ / ^ P r o v i d e r a d a p t e r v a l i d a t i o n f a i l e d \( [ ^ ) ] + \) i n r o l l b a c k T h r e a d T o : P r o v i d e r h i s t o r y h a s \d + t u r n s , b e l o w r e t a i n e d b o u n d a r y \d + \. $ / ;
23+
24+ function normalizeLegacyRetractionFailure (
25+ activity : OrchestrationThreadActivity ,
26+ ) : OrchestrationThreadActivity {
27+ const payload = asRecord ( activity . payload ) ;
28+ if (
29+ activity . kind !== "turn.retract.failed" ||
30+ ! payload ||
31+ typeof payload . detail !== "string" ||
32+ ! UNAVAILABLE_RETAINED_BOUNDARY_DETAIL . test ( payload . detail )
33+ ) {
34+ return activity ;
35+ }
36+
37+ // Boundary failures emitted before stale Esc retractions became silent are
38+ // immutable event history. Normalize them at the wire boundary so every
39+ // projection rebuild keeps the compatibility behavior without rewriting
40+ // the event store or the persisted activity payload.
41+ return {
42+ ...activity ,
43+ payload : {
44+ ...payload ,
45+ silent : true ,
46+ } ,
47+ } ;
48+ }
49+
2150export const MAX_PROJECTED_TOOL_RESULT_CHARS = 50_000 ;
2251
2352const PROJECTED_TOOL_RESULT_TRUNCATION_MARKER = "…[truncated]" ;
@@ -326,15 +355,16 @@ function projectMcpToolCallData(data: Record<string, unknown>): Record<string, u
326355export function projectActivityPayload (
327356 activity : OrchestrationThreadActivity ,
328357) : OrchestrationThreadActivity {
329- const payload = asRecord ( activity . payload ) ;
358+ const normalizedActivity = normalizeLegacyRetractionFailure ( activity ) ;
359+ const payload = asRecord ( normalizedActivity . payload ) ;
330360 const data = asRecord ( payload ?. data ) ;
331361 if ( ! payload || ! data ) {
332- return activity ;
362+ return normalizedActivity ;
333363 }
334364
335365 if ( payload . itemType === "mcp_tool_call" ) {
336366 return {
337- ...activity ,
367+ ...normalizedActivity ,
338368 payload : {
339369 ...payload ,
340370 data : projectMcpToolCallData ( data ) ,
@@ -370,7 +400,7 @@ export function projectActivityPayload(
370400 }
371401
372402 return {
373- ...activity ,
403+ ...normalizedActivity ,
374404 payload : {
375405 ...payload ,
376406 data : projectedData ,
0 commit comments