Conversation
forgrabbit
commented
Mar 24, 2026
There was a problem hiding this comment.
Pull request overview
This PR updates the “Work” (chat/command stream) UI to improve the layout on mobile/desktop, streamline the composer controls, and adjust supporting server/store behavior and tests.
Changes:
- Revamps the embedded HTML/CSS/JS for the Work view: mobile slide-in sidebar, new action placement, infinite-scroll-ish chat history rendering, and a single voice toggle button.
- Hardens HTTP server lifecycle handling by ensuring the app is set before binding and guarding background task shutdown calls.
- Updates tests and package metadata artifacts to match the new UI markup and distribution info.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
tests/test_app.py |
Updates HTML string assertions for new Work layout IDs and removes an assertion tied to the deleted newline button. |
clawdone/web.py |
Initializes app earlier and guards background task cleanup during shutdown/server close. |
clawdone/store.py |
Renames unlocked todo listing helper to _list_todos_unlocked and keeps the locked public list_todos wrapper. |
clawdone/html.py |
Implements the updated Work UI structure, styling, mobile sidebar behavior, chat feed rendering changes, and voice/textarea UX updates. |
clawdone.egg-info/SOURCES.txt |
Adds LICENSE and newly included modules to source manifest. |
clawdone.egg-info/PKG-INFO |
Updates license metadata and replaces/refreshes the long description content. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| <button class="primary" id="startVoice">Start voice</button> | ||
| <button class="secondary" id="stopVoice">Stop voice</button> | ||
| <div class="composer-shell"> | ||
| <textarea id="command" class="chat-input" placeholder="Message the current thread…"></textarea> |
There was a problem hiding this comment.
The updated composer removes the explicit label for the command textarea. Relying on placeholder text alone hurts accessibility (screen readers) and can reduce usability when the field has content. Consider restoring a (it can be visually hidden) or adding an appropriate aria-label/aria-labelledby on the textarea.
| <textarea id="command" class="chat-input" placeholder="Message the current thread…"></textarea> | |
| <textarea id="command" class="chat-input" placeholder="Message the current thread…" aria-label="Message the current thread"></textarea> |
| const limit = Math.max( | ||
| CHAT_HISTORY_FETCH_LIMIT, | ||
| uiSettings.historyPageSize * Math.max(uiState.historyPage, 1), | ||
| uiSettings.historyPageSize |
There was a problem hiding this comment.
CHAT_HISTORY_FETCH_LIMIT is used with Math.max(...), which makes it a minimum fetch size rather than a limit. This will always request at least 500 history items, potentially increasing payload size and slowing the UI on mobile. Either rename the constant to reflect it’s a minimum, or change the calculation to cap the requested limit (e.g., use a min/cap strategy based on what the chat view actually needs).
| const limit = Math.max( | |
| CHAT_HISTORY_FETCH_LIMIT, | |
| uiSettings.historyPageSize * Math.max(uiState.historyPage, 1), | |
| uiSettings.historyPageSize | |
| const desired = uiSettings.historyPageSize * Math.max(uiState.historyPage, 1); | |
| const limit = Math.min( | |
| CHAT_HISTORY_FETCH_LIMIT, | |
| Math.max(desired, uiSettings.historyPageSize) |