authorgravatar for me@t3.ggTheo Browne <me@t3.gg> 2026-09-25 20:28:03-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-09-25 20:28:03-07:00
logb6eefc926ae305f4cb85cca797668b010cee1136
treed33d8a5d048d3401f1f47130d0da4073cb96524e
parent574b18090281225de3449816c8366f0ee9ab886c
signature Signed by PGP key B5690EEEBB952194

perf(server): build the thread list snapshot without decoding it twice (#13693)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

1 files changed, 8 insertions(+), 22 deletions(-)

apps/server/src/orchestration/Layers/ProjectionSnapshotQuery.ts+8-22
......@@ -12,7 +12,7 @@ import {
1212 OrchestrationProposedPlanId,
1313 OrchestrationReadModel,
1414 OrchestrationThreadSearchSource,
15 OrchestrationShellSnapshot,
15 type OrchestrationShellSnapshot,
1616 OrchestrationThread,
1717 OrchestrationThreadDetailSnapshot,
1818 ProjectScript,
......@@ -82,7 +82,6 @@ import {
8282} from "../Services/ProjectionSnapshotQuery.ts";
8383
8484const decodeReadModel = Schema.decodeUnknownEffect(OrchestrationReadModel);
85const decodeShellSnapshot = Schema.decodeUnknownEffect(OrchestrationShellSnapshot);
8685const decodeThread = Schema.decodeUnknownEffect(OrchestrationThread);
8786const decodeImportedTranscriptsPayload = Schema.decodeUnknownOption(
8887 Schema.fromJsonString(
......@@ -2746,7 +2745,10 @@ pending_approval_requests AS (
27462745 );
27472746 const pullRequestsByThread = groupPullRequestRowsByThread(pullRequestRows);
27482747
2749 const snapshot = {
2748 // Built from schema-decoded rows, so no second decode here. The HTTP
2749 // and RPC layers encode it against OrchestrationShellSnapshot on the
2750 // way out, like the per-item shells from getThreadShellById.
2751 return {
27502752 snapshotSequence: computeSnapshotSequence(stateRows),
27512753 projects: Arr.filterMap(projectRows, (row) =>
27522754 row.deletedAt === null
......@@ -2800,15 +2802,7 @@ pending_approval_requests AS (
28002802 : Result.failVoid,
28012803 ),
28022804 updatedAt: updatedAt ?? "1970-01-01T00:00:00.000Z",
2803 };
2804
2805 return yield* decodeShellSnapshot(snapshot).pipe(
2806 Effect.mapError(
2807 toPersistenceDecodeError(
2808 "ProjectionSnapshotQuery.getShellSnapshot:decodeShellSnapshot",
2809 ),
2810 ),
2811 );
2805 } satisfies OrchestrationShellSnapshot;
28122806 }),
28132807 ),
28142808 Effect.mapError((error) => {
......@@ -2941,7 +2935,7 @@ pending_approval_requests AS (
29412935 sessionRows.map((row) => [row.threadId, mapSessionRow(row)] as const),
29422936 );
29432937
2944 const snapshot = {
2938 return {
29452939 snapshotSequence: computeSnapshotSequence(stateRows),
29462940 projects: Arr.filterMap(projectRows, (row) =>
29472941 row.deletedAt === null && activeProjectIds.has(row.projectId)
......@@ -2991,15 +2985,7 @@ pending_approval_requests AS (
29912985 planProgress: threadPlanProgress.getThreadPlanProgress(row.threadId),
29922986 })),
29932987 updatedAt: updatedAt ?? "1970-01-01T00:00:00.000Z",
2994 };
2995
2996 return yield* decodeShellSnapshot(snapshot).pipe(
2997 Effect.mapError(
2998 toPersistenceDecodeError(
2999 "ProjectionSnapshotQuery.getArchivedShellSnapshot:decodeShellSnapshot",
3000 ),
3001 ),
3002 );
2988 } satisfies OrchestrationShellSnapshot;
30032989 }),
30042990 ),
30052991 Effect.mapError((error) => {