From f01572b3eadff773313c27e32656a97027fceb0c Mon Sep 17 00:00:00 2001 From: Guido Vizoso Date: Wed, 21 Oct 2026 17:46:55 -0300 Subject: [PATCH] Put Connections and Capabilities beside Bots, with Connections as one list Connections (/connections) is its own page and one searchable list: your apps, apps on the organisation's account, and your GitHub and Slack links, each opening its own page. Capabilities (/capabilities) holds Skills and Memory as tabs under its title. The sidebar is Bots, Capabilities, Connections. Old addresses under /settings and /skills redirect, carrying their query parameters. Every settings screen shares one 720px column. Explore agents on the home page shows white cards with the avatar on top. --- .claude/skills/openbot-screen-layout/SKILL.md | 5 +- CHANGELOG.md | 25 + README.md | 6 +- app/src/components/agents/agent-card.tsx | 27 +- .../components/app-sidebar/app-sidebar.tsx | 30 +- app/src/components/bot-profile/access.tsx | 5 +- .../capabilities/capabilities-shell.tsx | 60 ++ .../components/channels/connect-app-card.tsx | 2 +- .../computer/demonstration-recorder.tsx | 2 +- .../connections/identity-connection-page.tsx | 144 ++++ app/src/components/layout/page-shell.tsx | 9 +- app/src/components/memory/memories.tsx | 21 +- .../components/plugins/app-access-action.tsx | 7 +- .../new-responsibility-dialog.tsx | 2 +- .../components/settings/github-sources.tsx | 2 +- .../settings/linked-accounts.test.tsx | 27 + .../components/settings/linked-accounts.tsx | 48 +- .../components/settings/settings-sidebar.tsx | 17 - .../components/settings/team-bot-consents.tsx | 56 ++ app/src/components/skills/edit-skill.tsx | 2 +- app/src/components/skills/new-skill.tsx | 2 +- app/src/components/skills/proposed-skill.tsx | 2 +- app/src/lib/agents/legacy-routes.ts | 2 +- app/src/lib/connections/rows.ts | 137 ++++ app/src/lib/plugins/provider-vocabulary.ts | 4 +- app/src/routeTree.gen.ts | 139 ++++ .../_authed/_app/bots.$agentId.memory.tsx | 2 +- .../_authed/_app/capabilities.index.tsx | 8 + .../_authed/_app/capabilities.memory.tsx | 18 + .../_authed/_app/capabilities.skills.tsx | 350 ++++++++++ app/src/routes/_authed/_app/capabilities.tsx | 9 + .../routes/_authed/_app/connections.$key.tsx | 658 ++++++++++++++++++ .../routes/_authed/_app/connections.index.tsx | 512 ++++++++++++++ app/src/routes/_authed/_app/index.tsx | 2 +- app/src/routes/_authed/_app/skills.tsx | 355 +--------- .../routes/_authed/admin/components/index.tsx | 2 +- app/src/routes/_authed/settings/approvals.tsx | 2 + .../settings/components-gallery/index.tsx | 2 +- .../settings/connected-accounts/$key.tsx | 640 +---------------- .../settings/connected-accounts/index.tsx | 650 +---------------- app/src/routes/_authed/settings/memory.tsx | 21 +- app/tests/app-access-action.test.tsx | 10 +- app/tests/app-access-card.test.tsx | 4 +- app/tests/arcade-index.test.tsx | 2 +- app/tests/bot-access-apps.test.tsx | 2 +- app/tests/brokered-account-row.test.tsx | 35 +- .../composio-unconfigured-account.test.tsx | 29 +- app/tests/connect-app-card.test.tsx | 6 +- .../connected-account-confirmation.test.tsx | 20 +- app/tests/connected-account-grants.test.tsx | 20 +- .../connected-account-landing-param.test.tsx | 20 +- ...nected-accounts-authorized-notice.test.tsx | 2 +- app/tests/connected-accounts-list.test.tsx | 2 +- ...connected-accounts-oneshot-params.test.tsx | 8 +- app/tests/connection-rows.test.ts | 119 ++++ app/tests/legacy-agent-routes.test.ts | 2 +- app/tests/plugin-read-failure.test.tsx | 30 +- app/tests/shared-connected-accounts.test.tsx | 23 +- app/tests/skills-read-failure.test.tsx | 2 +- docs/architecture.md | 2 +- docs/configuration.md | 20 +- docs/plugins/arcade.md | 6 +- docs/plugins/composio.md | 6 +- docs/plugins/google-drive.md | 8 +- docs/plugins/notion.md | 4 +- server/src/delivery/opentag-agent.ts | 4 +- server/src/identity/github-callback.ts | 4 +- server/src/memory/ingestion.ts | 4 +- server/src/plugins/arcade.ts | 4 +- server/src/plugins/oauth.ts | 2 +- server/tests/arcade-adapter.test.ts | 2 +- server/tests/arcade-errors.test.ts | 4 +- .../tests/arcade-journey.integration.test.ts | 4 +- server/tests/arcade-live.test.ts | 2 +- .../tests/arcade-vendor-error-engine.test.ts | 2 +- server/tests/arcade-verify.test.ts | 4 +- server/tests/assertion-shape.test.ts | 14 +- server/tests/broker-return-url-voice.test.ts | 5 +- server/tests/composio-adapter.test.ts | 23 +- server/tests/composio-broker-seam.test.ts | 34 +- server/tests/delivery-routes.test.ts | 2 +- server/tests/identity-app-wiring.test.ts | 6 +- ...entity-github-callback.integration.test.ts | 7 +- server/tests/identity-github-callback.test.ts | 7 +- server/tests/memory-store.integration.test.ts | 2 +- server/tests/plugin-oauth-callback.test.ts | 5 +- server/tests/plugin-oauth.test.ts | 14 +- server/tests/plugin-routes.test.ts | 3 +- server/tests/sole-definition.test.ts | 2 +- server/tests/test-network-guard.test.ts | 2 +- 90 files changed, 2641 insertions(+), 1917 deletions(-) create mode 100644 app/src/components/capabilities/capabilities-shell.tsx create mode 100644 app/src/components/connections/identity-connection-page.tsx create mode 100644 app/src/components/settings/team-bot-consents.tsx create mode 100644 app/src/lib/connections/rows.ts create mode 100644 app/src/routes/_authed/_app/capabilities.index.tsx create mode 100644 app/src/routes/_authed/_app/capabilities.memory.tsx create mode 100644 app/src/routes/_authed/_app/capabilities.skills.tsx create mode 100644 app/src/routes/_authed/_app/capabilities.tsx create mode 100644 app/src/routes/_authed/_app/connections.$key.tsx create mode 100644 app/src/routes/_authed/_app/connections.index.tsx create mode 100644 app/tests/connection-rows.test.ts diff --git a/.claude/skills/openbot-screen-layout/SKILL.md b/.claude/skills/openbot-screen-layout/SKILL.md index 958b5a1204..e27a721a4f 100644 --- a/.claude/skills/openbot-screen-layout/SKILL.md +++ b/.claude/skills/openbot-screen-layout/SKILL.md @@ -51,8 +51,9 @@ PageShell the page: header (title, description, action, backButton) then PageEmpty what a section says when it has nothing to list ``` -`PageShell` takes a `width`: `prose` (`max-w-2xl`) is the default because configuration is mostly -reading, and a row of label-and-control has no business being wider than the sentence explaining it. +`PageShell` takes a `width`: `prose` (`max-w-3xl`, 720px here) is the default, and every +configuration screen uses it so no screen is wider than another. Sentences inside it are held to +`max-w-prose`, so the column has room for a label beside its control without stretching the text. `wide` (`max-w-5xl`) exists for one screen — `admin/audit.tsx`, because an audit log is a table to be scanned and prose width would wrap every row. It is not a licence for anything else to be wide. diff --git a/CHANGELOG.md b/CHANGELOG.md index 7582826b80..3baa354ed8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,31 @@ Newest first. `Unreleased` is what is on `main` and not yet tagged. request for an administrator to switch on a work app, grant it to a Bot, or connect a Shared app's team account is kept, with who answered it and when. It starts empty and nothing is backfilled. +### Every settings screen is the same, slightly wider column + +Settings, Admin, Connections, Capabilities and each Bot's pages share one column width, now 720px instead of 630px, so +no screen is wider than another and a row has room for its label beside its control. Sentences keep +their comfortable reading width inside it. The audit log stays wider, because it is a table. + +### Capabilities and Connections sit beside Bots in the sidebar + +The sidebar's Skills entry becomes two, below Bots: **Capabilities** (`/capabilities`), with Skills +(`/capabilities/skills`) and Memory (`/capabilities/memory`) as tabs under its title, Memory leaving +Settings; and **Connections** (`/connections`), the apps your Bots use as you, which leaves Settings +too. On the home page, Explore agents shows each Bot as a white card with its avatar on top, the same +card as elsewhere. The old +addresses — `/skills`, `/settings/connected-accounts` with any account beneath it, and +`/settings/memory` — redirect to the new ones, keeping `?connected=`, `?linked=` and a skill being +written or edited, so a consent begun before upgrading still lands on its page. OAuth, GitHub linking +and the Slack link confirmation now send people to `/connections`. + +Connections is one searchable list. Apps you connect, apps on your organisation's account (marked +"Team account") and your GitHub and Slack links are rows of the same kind, with those already in use +first, and each opens its own page. GitHub's page holds your link, the repositories whose events can +start a responsibility (formerly "GitHub events"), and a way to a Composio GitHub app where one is +enabled, so GitHub is listed once; linking GitHub now comes back to that page. The reset for what +you let shared Bots use moves to Settings → Approvals, as **Shared Bots**. + ### Each app on a Bot says whether you can use it, and you can ask an administrator for the rest A Bot's page now says, for every work app the Bot holds, what that app is for the person looking: diff --git a/README.md b/README.md index 7d5b936777..1d5891d817 100644 --- a/README.md +++ b/README.md @@ -193,14 +193,14 @@ Leave `EMBEDDED_POSTGRES` off and set `DATABASE_URL` to point at a database you | `/bots/:id/reach` | Continue a conversation with the Bot in Slack, Microsoft Teams, or by text message. | | `/bots/:id/memory` | Which connected apps feed the Bot facts, and its background research. | | `/bots/:id/approvals` | What the Bot may do without asking you first. | -| `/skills` | Create and enable personal skills. | +| `/connections` | Connect your apps so your Bots can work with them. | +| `/capabilities/skills` | Create and enable personal skills. | +| `/capabilities/memory` | What your Bots remember about you, and facts you tell them. | | `/routines` | See the routines that are standing, and stop one. | | `/settings` | User preferences. | -| `/settings/connected-accounts` | Connect your apps so your Bots can work with them. | | `/settings/passwords` | Logins you saved when signing a Bot in to a website. | | `/settings/notifications` | Where updates go, your devices, and recent deliveries. | | `/settings/approvals` | Whether your Bots ask before acting, and rules for every Bot. | -| `/settings/memory` | What your Bots remember about you, and facts you tell them. | | `/admin/credentials` | Store write-only encrypted credentials. | | `/admin/approvals` | Team approval settings, team rules, and shared account requests. | | `/admin/computers` | View, stop, and reset Bot computers. | diff --git a/app/src/components/agents/agent-card.tsx b/app/src/components/agents/agent-card.tsx index 74f2a8216c..67cc270a06 100644 --- a/app/src/components/agents/agent-card.tsx +++ b/app/src/components/agents/agent-card.tsx @@ -1,6 +1,5 @@ import { IconArrowRight } from "@tabler/icons-react"; import { Link } from "@tanstack/react-router"; -import Avatar from "boring-avatars"; import { AbstractAvatar } from "@/components/agents/abstract-avatar"; import { Button } from "@/components/ui/button"; import type { AgentProfile } from "@/lib/agents/queries"; @@ -10,21 +9,23 @@ export function AgentCard({ appearance = "compact", }: { agent: AgentProfile; - appearance?: "compact" | "artwork"; + appearance?: "compact" | "tile"; }) { - if (appearance === "artwork") { + if (appearance === "tile") { return ( -
-