feat(settings): move Connections to Integrations + global toast monitor#975
Conversation
Wires the Integrations tab into the settings shell and moves the servers / MCP / LSP / plugins surface out of the right-panel Status section. The page reuses SettingsList / SettingsRow / Switch / Button and reads MCP, LSP and plugins off the per-directory global-sync child store; servers come from useServer plus a shared health probe. Connection health alerts are no longer a glanceable widget. A new ConnectionHealthProvider mounted at the app shell owns the 10s server HTTP probe and reactively observes MCP / LSP transitions. Healthy to broken transitions fire a coalesced, per-category toast that opens the new tab via a module-level openSettingsTab handle; the same broken state does not re-fire until the connection recovers, and an already-broken connection found on first probe at app start fires exactly once. LSP master toggle moves from General to Integrations. SessionStatusPanel keeps only the Summary block; the mobile status popover is untouched. Closes #862. Refs #604.
|
Warning Review limit reached
More reviews will be available in 24 minutes and 30 seconds. Learn how PR review limits work. Your organization has run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (17)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Suggested priority: P2 (includes user-path files (packages/app/src/app.tsx, packages/app/src/components/session/session-status-connections.tsx, packages/app/src/components/session/session-status-panel.tsx, packages/app/src/components/session/session-status-summary.tsx, packages/app/src/components/settings-general.tsx, packages/app/src/context/connection-health.tsx, packages/app/src/i18n/en.ts, packages/app/src/i18n/zh.ts, packages/app/src/pages/layout.tsx, packages/app/src/pages/settings/integrations.tsx, packages/app/src/pages/settings/settings-shell.tsx, packages/app/src/utils/settings-navigation.ts)).
P1/P0 are reserved for maintainer confirmation. Please relabel manually if this is a release blocker, security issue, data-loss risk, or updater/runtime failure.
There was a problem hiding this comment.
Code Review
This pull request migrates the connection health monitoring (Servers, MCP, LSP, and Plugins) from the session-scoped right-panel connections component to a new global ConnectionHealthProvider context and a dedicated "Integrations" tab in the Settings panel. It also introduces a global connection health monitor that triggers toasts when connections fail, and updates settings navigation, i18n dictionaries, and E2E tests accordingly. The review feedback identifies two critical reactivity issues in the new ConnectionHealthProvider where using createEffect(on(...)) on reactive store proxies prevents SolidJS from tracking nested property changes (such as MCP and LSP statuses). Removing the on wrapper is recommended to allow SolidJS's auto-tracking to work correctly.
Perf delta summaryComparator: pass
|
`createEffect(on(() => Object.entries(store.mcp ?? {}), ...))` only tracks
the outer keys array, not each entry's `.status` field — a MCP flipping
from connected to failed without changing keys would silently skip the
toast. Same hole for LSP, whose source returned `store?.lsp ?? []`.
Drop the `on(...)` wrapper and read `m?.status` / `item.status` inside
the effect body so SolidJS auto-tracks each nested field.
The right-panel Connections section moved to Settings.Integrations, so two @smoke tests broke: - home.spec.ts: route the "Manage servers" dialog test through the Integrations tab in Settings instead of the right-panel status panel. - settings-shell.spec.ts: Integrations is now a visible tab; bump the nav-list assertion to 6 tabs and drop the toHaveCount(0) guard.
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
Renamed `@smoke project home status panel can open the server picker dialog` to `@smoke settings integrations can open the server picker dialog` in 11aba5b; the inventory snapshot in e2e-smoke-tagging needs to match.
Bump PawWork desktop release version to 2026.5.29. Changes since v2026.5.28: - feat(settings): move Connections to Integrations + global toast monitor (#975) - feat(ui): display cache hit rate with one decimal place (#967) - fix: stabilize session opening state (#969) - fix(session): repair stale paginated question blockers (#962) - fix(ui): refit read-file icon into 0-20 viewBox (#964) - fix: allow running tools to expand - fix: add run lifecycle diagnostics - fix: harden Electron repair fallback - refactor: remove legacy theme choices - ci: stabilize e2e Playwright install and PR triage paths Verification: diff scope matches prior release bump (#958) — only the version string in packages/desktop-electron/package.json and the workspace entry in bun.lock. All CI checks green (e2e-artifacts required a rerun due to Playwright browser install flake unrelated to this change).
Summary
Closes #862. Refs #604.
Why
#862 closed on the architectural decision (Integrations placeholder created in PR #951) but the actual move never happened. The placeholder file still pointed at TODO. Splitting Connections from the session-scoped right panel into a global settings surface + ambient toast monitor delivers the agreed outcome and removes the only remaining duplicated configuration surface for connections.
Design notes
docs/design/scratch/2026-05-28-settings-integrations-compare.html(variant A — Settings-native, matching Worktrees / General).SettingsList+SettingsRow+Switch+Button+DialogSelectServer, no new shared component. Per-item rows use the same<li>shape asSettingsWorktreeRow.useGlobalSync().child(directory)for MCP / LSP / plugins,useServer()for servers, anduseConnectionHealth()for server probe results — no second 10s loop.openSettingsTab("integrations")via a module-level handle registered in Layout (mirrorssetNavigatefromnotification-click.ts).Acceptance check
bun typecheckcleanbun testclean (1619 pass)bun test packages/app/e2e/status/status-popover.spec.tsclean (3 passing — right-panel Status only shows Summary; mobile popover untouched)bun run snap settings-shell— grid covers General / Models / Integrations / Memory; PNG underdocs/design/preview/screenshots/settings-shell.pngbun run dev:desktopwalk on macOS — Integrations tab renders the 4 sections; "Manage servers" button + LSP master toggle land in the right places; startup Toast fires for the unreachable test server and "Open Integrations" jumps to the new tab; right-panel Status tab is summary-only.Out of scope
DialogSelectServer/DialogConnectProvider/DialogSelectMCPvisual rework.connection-fail-toastsnap target. The Toast component is from@opencode-ai/uiwith existing visual coverage; new wiring is only i18n + click handler, both covered by typecheck + the manual walk.Risk / residual