Skip to content

Commit efb87f9

Browse files
committed
fix(app): add defensive Array.isArray checks for session diffs
Prevents 'e.diffs.map is not a function' crash when session_diff data from the server is undefined or not an array. Guards added at: - event-reducer (incoming data validation) - session.tsx (diffs and turnDiffs memos) - session-side-panel.tsx (diffs memo) Ref: upstream issues anomalyco#19217, anomalyco#19262, PR anomalyco#19261
1 parent 95c5f20 commit efb87f9

3 files changed

Lines changed: 16 additions & 4 deletions

File tree

‎packages/app/src/context/global-sync/event-reducer.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,8 @@ export function applyDirectoryEvent(input: {
160160
}
161161
case "session.diff": {
162162
const props = event.properties as { sessionID: string; diff: FileDiff[] }
163-
input.setStore("session_diff", props.sessionID, reconcile(props.diff, { key: "file" }))
163+
const diff = Array.isArray(props.diff) ? props.diff : []
164+
input.setStore("session_diff", props.sessionID, reconcile(diff, { key: "file" }))
164165
break
165166
}
166167
case "todo.updated": {

‎packages/app/src/pages/session.tsx‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,11 @@ export default function Page() {
414414
}
415415

416416
const info = createMemo(() => (params.id ? sync.session.get(params.id) : undefined))
417-
const diffs = createMemo(() => (params.id ? (sync.data.session_diff[params.id] ?? []) : []))
417+
const diffs = createMemo(() => {
418+
if (!params.id) return []
419+
const raw = sync.data.session_diff[params.id]
420+
return Array.isArray(raw) ? raw : []
421+
})
418422
const reviewCount = createMemo(() => Math.max(info()?.summary?.files ?? 0, diffs().length))
419423
const hasReview = createMemo(() => reviewCount() > 0)
420424
const reviewTab = createMemo(() => isDesktop())
@@ -545,7 +549,10 @@ export default function Page() {
545549
return open
546550
}, desktopReviewOpen())
547551

548-
const turnDiffs = createMemo(() => lastUserMessage()?.summary?.diffs ?? [])
552+
const turnDiffs = createMemo(() => {
553+
const raw = lastUserMessage()?.summary?.diffs
554+
return Array.isArray(raw) ? raw : []
555+
})
549556
const reviewDiffs = createMemo(() => (store.changes === "session" ? diffs() : turnDiffs()))
550557

551558
const newSessionWorktree = createMemo(() => {

‎packages/app/src/pages/session/session-side-panel.tsx‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,11 @@ export function SessionSidePanel(props: {
5555
const treeWidth = createMemo(() => (fileOpen() ? `${layout.fileTree.width()}px` : "0px"))
5656

5757
const info = createMemo(() => (params.id ? sync.session.get(params.id) : undefined))
58-
const diffs = createMemo(() => (params.id ? (sync.data.session_diff[params.id] ?? []) : []))
58+
const diffs = createMemo(() => {
59+
if (!params.id) return []
60+
const raw = sync.data.session_diff[params.id]
61+
return Array.isArray(raw) ? raw : []
62+
})
5963
const reviewCount = createMemo(() => Math.max(info()?.summary?.files ?? 0, diffs().length))
6064
const hasReview = createMemo(() => reviewCount() > 0)
6165
const diffsReady = createMemo(() => {

0 commit comments

Comments
 (0)