General
@@ -626,7 +628,9 @@ export function Settings({ ) .map((adapter) => ({ adapter, - view: integrationView(adapter, snapshot.sessions), + view: integrationView(adapter, snapshot.sessions, { + enabled: cfg.adapters[adapter.id]?.enabled, + }), optIn: adapter.kind === "community" && !isHostAttributed(adapter.id), })); @@ -646,8 +650,11 @@ export function Settings({ ]; const activeId = selectedIntegration; const selected = views.find((item) => item.adapter.id === activeId); - const nextStep = selected - ? setupNextStep(selected.adapter.id) + const guidance = selected + ? integrationGuidance(selected.adapter.id, selected.adapter.state, { + enabled: cfg.adapters[selected.adapter.id]?.enabled, + label: selected.view.label, + }) : null; const openAppLabel = selected ? openableHostApp(selected.adapter.id) @@ -656,15 +663,16 @@ export function Settings({Integrations
- Click any tile for details. Cursor, Factory, T3 Code, and OpenCode - install on first click when they're off; they turn green or - Limited only after that host talks to Microbridge (reload / - restart / pair). + Click any tile for details and next steps. Cursor, Factory, T3 + Code, and OpenCode install on first click when they're off; + they turn green or Limited only after that host talks to + Microbridge (reload / restart / pair).
- Synara and the desktop apps share Claude/Codex journals — no - separate adapter. For T3 controls, enable Network access in T3 Code - Settings → Connections, then paste a pairing link below. + Synara and the desktop apps share Claude/Codex journals — Idle + means waiting for sessions, not a broken setup. For T3 controls, + enable Network access in T3 Code Settings → Connections, then + paste a pairing link below.
{adapterMessage && (@@ -702,7 +710,12 @@ export function Settings({ busy={adapterBusy.has(adapter.id)} onSelect={() => { selectIntegration(adapter.id); - if (optIn && adapter.state === "disabled") { + if ( + optIn && + (adapter.state === "disabled" || + (adapter.state === "needs_setup" && + cfg.adapters[adapter.id]?.enabled === false)) + ) { requestAnimationFrame(() => { void runAdapterOperation(adapter.id, () => setAdapterEnabled(adapter.id, true), @@ -736,30 +749,12 @@ export function Settings({ iconSrc={integrationIcon(selected.adapter.id)} diagnostic={selected.view.diagnostic} theme={t} + guidance={ + guidance + ? { title: guidance.title, steps: guidance.steps } + : null + } > - {(selected.adapter.state === "needs_setup" || - selected.adapter.state === "disabled") && - nextStep && ( -
{nextStep}
- {selected.adapter.state === "needs_setup" && ( -- {selected.view.diagnostic} -
- )} -