Repository navigation
feat(web): add workspace-wide project chat dock - #259
Merged
Merged
Conversation
kinqsradio
reviewed
Nov 5, 2026
kinqsradio
left a comment
Member
There was a problem hiding this comment.
Works well in the browser. One fix is needed before merge, and one load issue is worth addressing.
Must fix
- CI fails at
npm run format:check:web/src/app/workspace/controller.tssplitsPrepareReasonacross lines, and this repo's Prettier rejects that.npx prettier --write web/src/app/workspace/controller.tsfixes it. Nothing else in CI failed.
Should fix
- Extra API load. A cold Today load goes from 37 to 39 requests and from 1 to 3 fetches of
/projects. The list is also re-fetched on every window focus and on project/organize news. Each project opened in the dock mounts a fullAssistantWorkspacewith its own projects, prefs and capabilities reads. The API limit is 180 requests a minute per address. Suggest fetching the list only when the dock opens, and passing shared data into the embedded Assistant. useProjectChat()throws without its provider, soprojects/Detail.tsxwould crash on the plainShellfallback inApp.tsx. It can't happen today becauseRETENTION_ADMISSION_READYistrue, but falling back to the old/app/assistant?project=link would remove the risk.
For the UI review
- The dock collapses on every page change. The draft is kept and returns on reopen.
- The open dock covers the bottom-right of the page on desktop, and about half the screen on phone with no scrim.
- Sessions are never pruned, so each visited project keeps a mounted Assistant until reload.
Verified locally on 92900ca8
- typecheck, web build, code organization, project docs,
.github/testsandweek-scenepass, and your 28 tests pass - In Chrome against the real local API:
- drafts stay per project across a project switch and a real move to Calendar
- reload and sign-out still check dock drafts through
prepareAll - Escape collapses the dock and returns focus to the launcher
- no page errors, and no horizontal overflow at 390 px
Review prepared with Claude Code (Opus 5.5) and checked by me.
Format the PrepareReason union so CI passes. Read the projects list only after the dock is first opened, skip the embedded Assistant's own projects read, and let useProjectChat fall back to the Assistant links outside the workspace dock instead of throwing. Co-authored-by: Luan Nguyen <luannn010@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s load Collapse on focus only for controls the panel hides, not frame bodies. Add a phone scrim and bottom sheet and reserve scroll space on desktop. Cap mounted chat sessions at 3 without dropping drafts or running chats. Read planner prefs, AI capabilities and agent settings once for all embedded chats.
…d share its reads Collapse only for focus that follows a Tab, never for frame containers. Count an unconfirmed project draft as unsent. Share one assistant controls instance and refresh identity when the dock opens. Skip scroll reserve on short desktops and keep focus inside the phone sheet.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Change
Project chat was only reachable inside an individual project. Add one persistent bottom dock across the authenticated workspace, including the Projects list, with an explicit project picker and retained conversations/drafts for each visited project.
Reuse the existing Assistant transcript, composer, saved chats, cancellation and proposal controls. Route project chat entry points into the shared dock. Add shell-owned exit guards so workspace navigation retains drafts while reload/sign-out checks them. Hide cached conversation presentation when the selected project becomes unavailable.
The published diff contains web client code, frontend contract tests, and the collaboration-directory ignore rule. Backend code, schemas and provider configuration have an empty diff.
Related follow-up #258 is assigned to kinqsradio and requests project grounding plus chat interactions with views/workspaces. This PR supplies the frontend foundation. It does not close that integration issue.
Checks and limits
npm run typecheck -w webandnpm run build -w webpassed.node --import tsx --test backend/tests/web-workspace.unit.test.ts web/tests/workspace-chat-guards.test.tspassed all 28 tests. The backend test file was executed as an existing pure web-controller contract suite and was not modified.git diff --checkpassed.python -X utf8 scripts/check-code-organization.pypassed.Workspace
repo/, and read the relevant project guides.Project knowledge was not traced because the local project key was unregistered. Task handoffs, configuration, screenshots, logs and credentials are excluded from this PR.
Agent disclosure
dd9a1b4cf9f67ca2e326f646d93e101b2778db30, MIT. No implementation code or text was copied. Source23ca8e299fafdc88b0beebc5e41cf331bf12f5bd, MIT. Source