Skip to content

Fix crash when session.todos is not an array#823

Open
chaehyun2 wants to merge 6 commits intoslopus:mainfrom
chaehyun2:fix/todos-array-check
Open

Fix crash when session.todos is not an array#823
chaehyun2 wants to merge 6 commits intoslopus:mainfrom
chaehyun2:fix/todos-array-check

Conversation

@chaehyun2
Copy link

Summary

  • Add Array.isArray guard in ActiveSessionsGroup.tsx to prevent .filter() crash on non-array todos
  • Add Array.isArray guard in reducer.ts to ensure todos output is always an array or undefined
  • Add HAPPY_SERVER_URL build arg to Dockerfile.webapp for custom server URL injection

Problem

When session.todos contains a non-array value, the app crashes with:

  • Web: t.todos.filter is not a function
  • Android: undefined is not a function

Test plan

  • Verified web UI no longer crashes with malformed todos data
  • Android app should also be fixed once this is included in a new build

🤖 Generated with Claude Code

Chaehyun Lee and others added 6 commits March 7, 2026 14:49
Add Array.isArray guards to prevent "undefined is not a function"
errors when todos data is not in expected array format.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Preserve empty interior cells when parsing tables (fixes column
  misalignment when first header cell is empty)
- Add selectable prop to table text elements (enables text selection
  and copy on web, matching other markdown blocks)

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Empty cells had no text content causing lineHeight to not apply,
resulting in cells ~1/3 the height of populated cells.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Users can now paste images from clipboard in the web chat input.
Images are sent alongside text messages through the full pipeline:
web UI → sync → CLI → Claude Code SDK (as base64 content array).

- MultiTextInput.web.tsx: onPaste handler extracts clipboard images
- AgentInput.tsx: image preview thumbnails with remove button
- SessionView.tsx: image state management
- sync.ts: images field in sendMessage
- typesRaw.ts + legacyProtocol.ts: schema support for images
- MessageQueue2.ts: images carried through queue batching
- claudeRemote.ts: buildContent constructs SDK content array
- claudeRemoteLauncher.ts + runClaude.ts: pass images through

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
- Use type assertion for images field access (zod inference limitation)
- Fix formatOptionalDetail to accept null parameter

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
The server validates max 100 messages per POST request. When
pendingOutbox accumulated more than 100 messages (e.g. during
long conversations), flushOutbox would fail with a 400 error
and never clear the outbox, permanently blocking all message
delivery to the web UI.

Now splits into chunks of 100 and sends sequentially.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant