diff --git a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts index 26e71b5167e8..812998e5cc64 100644 --- a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts +++ b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts @@ -2479,6 +2479,10 @@ interface ActiveClaudeTurnContext { readonly providerTurnId: OrchestrationV2ProviderTurn["id"]; readonly providerTurnOrdinal: number; readonly startedAt: DateTime.Utc; + // Item ordinals allocated in this turn. Later turns never look items up + // here: a subagent resumed from another turn keeps its ordinal on the + // session subagent registry. + readonly itemOrdinals: Map; readonly assistant: { fallbackText: string; fallbackNativeItemId: string; @@ -2788,8 +2792,6 @@ export function makeClaudeAdapterV2( const steeredTurns = yield* Ref.make(new Set()); const queryContext = yield* Ref.make(null); const openedNativeThreads = yield* Ref.make(new Set()); - const itemOrdinals = yield* Ref.make(new Map()); - const nextItemOrdinalsByTurn = yield* Ref.make(new Map()); const latestPlanByKind = yield* Ref.make(new Map()); const planIdsByNativeItem = yield* Ref.make( new Map(), @@ -3284,29 +3286,16 @@ export function makeClaudeAdapterV2( }), }); - const resolveItemOrdinal = Effect.fnUntraced(function* ( - context: ActiveClaudeTurnContext, - nativeItemId: string, - ) { - const existing = (yield* Ref.get(itemOrdinals)).get(nativeItemId); - if (existing !== undefined) { - return existing; - } - - const nextWithinTurn = yield* Ref.modify(nextItemOrdinalsByTurn, (current) => { - const next = (current.get(context.nativeTurnId) ?? 0) + 1; - const updated = new Map(current); - updated.set(context.nativeTurnId, next); - return [next, updated]; - }); - const nextOrdinal = context.input.providerTurnOrdinal * 100 + nextWithinTurn; - yield* Ref.update(itemOrdinals, (current) => { - const updated = new Map(current); - updated.set(nativeItemId, nextOrdinal); - return updated; + const resolveItemOrdinal = (context: ActiveClaudeTurnContext, nativeItemId: string) => + Effect.sync(() => { + const existing = context.itemOrdinals.get(nativeItemId); + if (existing !== undefined) { + return existing; + } + const ordinal = context.input.providerTurnOrdinal * 100 + context.itemOrdinals.size + 1; + context.itemOrdinals.set(nativeItemId, ordinal); + return ordinal; }); - return nextOrdinal; - }); const providerTurnPayload = (input: { readonly context: ActiveClaudeTurnContext; @@ -6397,6 +6386,7 @@ export function makeClaudeAdapterV2( providerTurnId, providerTurnOrdinal, startedAt, + itemOrdinals: new Map(), assistant: { fallbackText: "", fallbackNativeItemId: `assistant:${turnInput.runId}`,