feat(v2): Connectors rows keyed by the capability catalog, parent states as rows, gates in the aside (TASK-010 B+D) - #1557
Merged
Merged
Conversation
…tes as rows, gates in the aside (D8 Phase 2 B+D)
Rows come from GET /api/installables (D1/D2): an unavailable provider is
"Not enabled on this instance" with no control; an available one offers
Connect; installing/activating and uninstalling parents read Setting up…/
Removing… and gain Cancel / Retry remove only once the claim is stale
(INSTALL_LOCK_TTL_MS); an error parent shows its errorMessage with Retry
(POST install { podId: boundPodId }) and Remove in the aside; a missing
projection under an active parent is a Retry row; a paused parent shows the
reason and `paused {rel}` with no owner control. A connected row whose
podId is unset reads "not linked to a pod" with Pick a pod (#1551).
The aside's What-the-channel-sees card gains the D4 gate list: one row per
pod the user is in, a switch per gate (the PATCH merges config one level
deep, so the whole gates map travels with each write, since included), mono
since/off, an `active` tag on the active pod, and behind each pod's name the
mode segment, a lead picker over the pod's bots, and Make active
(PATCH { podId }). Disconnect becomes Remove. The connect form's picker no
longer filters pod.type against community/showcase, which are not pod types.
Legacy pod-scoped rows still render from /api/integrations/user/all; an
installable row is keyed by the catalog and skipped there. If the catalog
cannot be read the page falls back to the two providers it drove before.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ses the whole map on one stale key (Vera) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…a wraps instead of ellipsising (lily-shen, 64026) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
lilyshen0722
added a commit
that referenced
this pull request
Sep 6, 2026
…ing at 390 (#1567) Two clips visible in the 390 capture of #1557 (64144): the unavailable row's first line ended in an ellipsis, and a long pod name in the gate list clipped to "Rewire Live…". Both predate the page PR; neither is meta, but the same system rule applies — shorten or wrap, never an ellipsis. Line 1 and the pod name now wrap under the mark; the invariants test pins both rules the way it already pins the meta line.
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.
TASK-010's page PR (B+D), per
docs/plans/d8-phase-2-gate-surface.mdD1/D2/D4 and #1551. Backend is on main (#1550 gates, #1552 catalog); this is frontend only.Rows keyed by the catalog (D2).
GET /api/installablesdecides each provider row: unavailable → Not enabled on this instance. /ask your operator, no control; available, no installation → the catalog description,not connected, Connect (opens the form with that provider selected);installing/activating→ Setting up… and, onceclaimedAtis older than 60 s, Cancel (bordered,DELETE);uninstalling→ Removing… then Retry remove;error→ the parent'serrorMessage, Retry (POST …/install { podId: boundPodId }) and Remove in the aside;activewith a missing/inactive/stale projection → The channel record is gone. + Retry;paused→ Paused by an administrator. {reason},paused {rel}fromadminPause.at, no owner control; a connected row withpodIdunset → {chat} · not linked to a pod, Pick a pod. The page polls the catalog while any parent is transient.422 provider_not_configuredand409 installation_pausedon install are named in the error line.Gates in the aside (D4). Under the mode controls: one row per pod the user is in (4px ink mark, name, mono
since {rel}/off, a switch), anactivetag on the active pod, and behind each name the mode segment (Default / Attention / Mirror), a lead picker over the pod's bots, and Make active (PATCH { podId }). WhenpodIdis unset the list opens expanded under Pick where your messages go. The PATCH mergesconfigone level deep, so every write sends the wholegatesmap withsincepreserved. Remove replaces Disconnect (two-click confirm).Removed: the picker's
community/showcasefilter — not pod types (communityis a visibility tier); membership is the server's only rule.Legacy rows (no installation) still come from
/api/integrations/user/all; an installable row is keyed by the catalog and skipped there. If the catalog cannot be read, the page falls back to the two providers it drove before.Tests:
V2ConnectorsPage.test.tsxgains ten catalog-row tests (unavailable/available, fresh vs stale claim → Cancel, error → Retry with the bound pod + Remove, stale uninstalling → Retry remove, paused with reason and no control, projection missing, not-linked → Make active, switch writes the whole gates map, mode/lead/Make active, catalog keys over legacy);v2-layout-invariantspins the gate mark, switch and tag. 116/116 pass;tsc --noEmitclean.Captures (fresh build served locally, fixtures via route interception, 1440 and 390): posted to the Connectors v2 pod, not committed.
Co-Authored-By: Claude Fable 5.1 noreply@anthropic.com
🤖 Generated with Claude Code