v0.6.23: MCP fixes, remove local state in favor of server state, mothership workflow edits via sockets, ui improvements#3935
Conversation
waleedlatif1
commented
Apr 4, 2026
- improvement(stores): remove deployment state from Zustand in favor of React Query (improvement(stores): remove deployment state from Zustand in favor of React Query #3923)
- fix(loading): remove jarring workflow loading spinners (fix(loading): remove jarring workflow loading spinners #3928)
- chore(stores): remove Zustand environment store and dead init scaffolding (chore(stores): remove Zustand environment store and dead init scaffolding #3929)
- refactor(stores): consolidate variables stores into stores/variables/ (refactor(stores): consolidate variables stores into stores/variables/ #3930)
- improvement(mothership): workflow edits via sockets (improvement(mothership): workflow edits via sockets #3927)
- fix(ui) Fix oauth redirect on connector modal (fix(ui) Fix oauth redirect on connector modal #3926)
- fix(mcp): resolve userId before JWT generation for agent block auth (fix(mcp): resolve userId before JWT generation for agent block auth #3932)
- Fix "fix in copilot" button (Fix "fix in copilot" button #3931)
- fix(modals): center modals in visible content area accounting for sidebar and panel (fix(modals): center modals in visible content area accounting for sidebar and panel #3934)
* fix(loading): remove jarring workflow loading spinners * fix(loading): remove home page skeleton loading state * fix(loading): remove plain spinner loading states from task and file view
…#3930) * refactor(stores): consolidate variables stores into stores/variables/ Move variable data store from stores/panel/variables/ to stores/variables/ since the panel variables tab no longer exists. Rename the modal UI store to useVariablesModalStore to eliminate naming collision with the data store. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: remove unused workflowId variable in deleteVariable Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* improvement(mothership): workflow edits via sockets * make embedded view join room * fix cursor positioning bug
* Fix oauth redirect on connector modal * Fix lint --------- Co-authored-by: Theodore Li <theo@sim.ai>
…3932) * fix(mcp): resolve userId before JWT generation for agent block auth * test(mcp): add regression test for agent block JWT userId resolution
* Fix "fix in copilot" button * Auto send message to copilot for fix in copilot --------- Co-authored-by: Theodore Li <theo@sim.ai>
…ebar and panel (#3934) * fix(modals): center modals in visible content area accounting for sidebar and panel * fix(modals): address pr feedback — comment clarity and document panel assumption
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
PR SummaryMedium Risk Overview Improves real-time consistency and OAuth connector flows. Copilot workflow edits now notify the socket server ( UI polish/cleanup. Modals/search are centered relative to visible workspace content (accounting for sidebar/panel), sidebar width defaults avoid non-workspace hydration mismatch, and several route-level loading spinners/skeletons are removed. Reviewed by Cursor Bugbot for commit 3267d8c. Configure here. |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 3267d8c. Configure here.
| variables: {}, | ||
| isLoading: false, | ||
| error: null, | ||
| isEditing: null, |
There was a problem hiding this comment.
Dead state fields never change from initial values
Low Severity
The new VariablesStore declares isLoading, error, and isEditing in both the type interface and the store initialization, but the old loadForWorkflow method that set isLoading and error was removed during the consolidation. No remaining actions in the store ever modify these fields, making them permanently stuck at their initial values (false, null, null). This is dead state carried over from the old store.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 3267d8c. Configure here.
| return result | ||
| } | ||
|
|
||
| return value |
There was a problem hiding this comment.
Regex with global flag shared across recursive calls
Medium Severity
The updateReferences helper uses pattern.test(value) with a regex created with the gi flags, then calls value.replace(pattern, ...). While replace resets lastIndex, the test() call inside the recursive traversal of arrays and objects mutates lastIndex on the shared regex. If test() matches a string inside a nested structure and then replace is NOT reached (e.g., a non-string branch returns early), subsequent test() calls can start from a non-zero lastIndex and miss matches in sibling values.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 3267d8c. Configure here.
Greptile SummaryThis is a wide-ranging v0.6.23 release that removes Zustand-managed server state in favour of React Query caches, fixes MCP JWT auth for agent blocks, closes the OAuth redirect loop on the KB connector modal, and wires copilot workflow edits through the socket layer so collaborators see changes immediately. Key changes:
Confidence Score: 5/5Safe to merge — all findings are P2 style/architectural suggestions with no correctness or data-integrity impact. The MCP JWT fix, OAuth redirect fix, and deployment-state migration are well-tested (new test cases added). The Zustand → React Query migration follows project conventions and the old initialization scaffolding is cleanly removed. The only concerns are P2: a Next.js routing import inside the emcn UI primitive, a globals.css edit that technically violates the custom rule (but is justified by the blocking-script design), and the lack of a retry path when
Important Files Changed
Sequence DiagramsequenceDiagram
participant Copilot as Copilot (server tool)
participant DB as Database
participant SocketSrv as Socket Server
participant Client as Browser Client
participant API as /api/workflows/[id]
Copilot->>DB: Persist workflow edits
Copilot-->>SocketSrv: POST /api/workflow-updated (fire & forget)
SocketSrv-->>Client: emit('workflow-updated', { workflowId })
alt hasActiveDiff == false
Client->>API: GET /api/workflows/[id]
API-->>Client: { data: { state } }
Client->>Client: replaceWorkflowState(state)
Client->>Client: useSubBlockStore.setState(subblockValues)
Client->>Client: pruneInvalidUndoRedoEntries(graph)
else hasActiveDiff == true
Client->>Client: log warn & skip reload (no retry scheduled)
end
|
…ose animation (#3937) * fix(modals): center modals in visible content area accounting for sidebar and panel * fix(modals): address pr feedback — comment clarity and document panel assumption * fix(modals): remove open/close animation from modal content

