Skip to content

Commit 921270a

Browse files
committed
fix: preserve sourceProposedPlan through incremental event path
The thread.turn-start-requested handler updated modelSelection, runtimeMode, and interactionMode but never stored the event's sourceProposedPlan field. Because buildLatestTurn only carries forward sourceProposedPlan from the previous latestTurn when turnIds match, the field was permanently lost for new turns created via the incremental event path. Fix: - Add pendingSourceProposedPlan field to Thread to bridge the gap between turn-start-requested (which has the plan reference but no turnId) and later events that call buildLatestTurn (which create the turn). - Store event.payload.sourceProposedPlan in the turn-start-requested handler. - Pass pendingSourceProposedPlan to buildLatestTurn as a fallback for new turns where the previous latestTurn turnId doesn't match. - Seed pendingSourceProposedPlan in mapThread (snapshot path) for consistency.
1 parent ea6a5ae commit 921270a

File tree

2 files changed

+12
-3
lines changed

2 files changed

+12
-3
lines changed

apps/web/src/store.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ function mapThread(thread: OrchestrationThread): Thread {
158158
archivedAt: thread.archivedAt,
159159
updatedAt: thread.updatedAt,
160160
latestTurn: thread.latestTurn,
161+
pendingSourceProposedPlan: thread.latestTurn?.sourceProposedPlan,
161162
branch: thread.branch,
162163
worktreePath: thread.worktreePath,
163164
turnDiffSummaries: thread.checkpoints.map(mapTurnDiffSummary),
@@ -214,17 +215,20 @@ function buildLatestTurn(params: {
214215
startedAt: string | null;
215216
completedAt: string | null;
216217
assistantMessageId: NonNullable<Thread["latestTurn"]>["assistantMessageId"];
218+
sourceProposedPlan?: Thread["pendingSourceProposedPlan"];
217219
}): NonNullable<Thread["latestTurn"]> {
220+
const resolvedPlan =
221+
params.previous?.turnId === params.turnId
222+
? params.previous.sourceProposedPlan
223+
: params.sourceProposedPlan;
218224
return {
219225
turnId: params.turnId,
220226
state: params.state,
221227
requestedAt: params.requestedAt,
222228
startedAt: params.startedAt,
223229
completedAt: params.completedAt,
224230
assistantMessageId: params.assistantMessageId,
225-
...(params.previous?.turnId === params.turnId && params.previous.sourceProposedPlan
226-
? { sourceProposedPlan: params.previous.sourceProposedPlan }
227-
: {}),
231+
...(resolvedPlan ? { sourceProposedPlan: resolvedPlan } : {}),
228232
};
229233
}
230234

@@ -534,6 +538,7 @@ export function applyOrchestrationEvent(state: AppState, event: OrchestrationEve
534538
: {}),
535539
runtimeMode: event.payload.runtimeMode,
536540
interactionMode: event.payload.interactionMode,
541+
pendingSourceProposedPlan: event.payload.sourceProposedPlan,
537542
updatedAt: event.occurredAt,
538543
}));
539544
return threads === state.threads ? state : { ...state, threads };
@@ -629,6 +634,7 @@ export function applyOrchestrationEvent(state: AppState, event: OrchestrationEve
629634
thread.latestTurn?.turnId === event.payload.turnId
630635
? (thread.latestTurn.startedAt ?? event.payload.createdAt)
631636
: event.payload.createdAt,
637+
sourceProposedPlan: thread.pendingSourceProposedPlan,
632638
completedAt: event.payload.streaming
633639
? thread.latestTurn?.turnId === event.payload.turnId
634640
? (thread.latestTurn.completedAt ?? null)
@@ -671,6 +677,7 @@ export function applyOrchestrationEvent(state: AppState, event: OrchestrationEve
671677
thread.latestTurn?.turnId === event.payload.session.activeTurnId
672678
? thread.latestTurn.assistantMessageId
673679
: null,
680+
sourceProposedPlan: thread.pendingSourceProposedPlan,
674681
})
675682
: thread.latestTurn,
676683
updatedAt: event.occurredAt,
@@ -755,6 +762,7 @@ export function applyOrchestrationEvent(state: AppState, event: OrchestrationEve
755762
startedAt: thread.latestTurn?.startedAt ?? event.payload.completedAt,
756763
completedAt: event.payload.completedAt,
757764
assistantMessageId: event.payload.assistantMessageId,
765+
sourceProposedPlan: thread.pendingSourceProposedPlan,
758766
})
759767
: thread.latestTurn;
760768
return {

apps/web/src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ export interface Thread {
104104
archivedAt: string | null;
105105
updatedAt?: string | undefined;
106106
latestTurn: OrchestrationLatestTurn | null;
107+
pendingSourceProposedPlan?: OrchestrationLatestTurn["sourceProposedPlan"];
107108
branch: string | null;
108109
worktreePath: string | null;
109110
turnDiffSummaries: TurnDiffSummary[];

0 commit comments

Comments
 (0)