Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,11 @@ Top to bottom:
conversations, not product sections.
3. **Footer rail** — Mission Control is pinned above the rail as its own
row. The first-run rail below it is Routines, Files, Skills, Agents,
Plugins, in that order. Insights and Evals join that rail only when
Tools, in that order. Insights and Evals join that rail only when
existing reads prove real usage (turns > 0 / at least one eval run).
These are utility destinations, not workbenches, and each is its own
top-level route (`/mission-control`, `/routines`, `/files`, `/skills`,
`/agents`, `/plugins`; plus `/insights`, `/evals` when reached).
`/agents`, `/tools`; plus `/insights`, `/evals` when reached).
4. **Account row** — avatar and name, anchoring the rail, plus a separate
settings icon beside it. The avatar+name half is a menu trigger
(weekly usage, feedback, log out) that pops upward; the gear is a
Expand Down Expand Up @@ -74,7 +74,7 @@ not home. The primary act is a prompt: say what the channel should do,
or pick a named-template shortcut underneath. Blank `+` / prompt mint
an empty channel and invite nobody. Named templates mint that same
empty channel with no host, then instantiate the picked Workbench
Definition — the agents, block workflows, and pending plugins it names
Definition — the agents, block workflows, and pending tools it names
(Myra joins only when the definition names her; Code review's three
reviewers do not) — and run its ordered onboarding walkthrough as an
in-room card the room itself posts, never a side effect of hosting an
Expand Down Expand Up @@ -107,7 +107,7 @@ example (`ConnectorRow` / `OAuthConnectorRow`,
Density over cards: one row per item, a small logo tile, name, a
single-line outcome sentence, a status/provenance caption, and one honest
action button that reflects the item's actual state. A browseable catalog
of installable things, each with its own status and actions — the plugins
of installable things, each with its own status and actions — the tools
gallery is the standing example — is the one case where a two-column card
catalog with status/category chip filters is the right idiom instead.
Extend an existing idiom to a new directory before inventing a fourth
Expand All @@ -116,7 +116,7 @@ pattern; three ways to list things is a defect, not a design system.
## Detail Pages

Anything with enough content to browse gets a full page, not a panel:
`/agents/<slug>`, `/skills/<slug>`, `/plugins/<slug>`, `/routines/<id>`,
`/agents/<slug>`, `/skills/<slug>`, `/tools/<slug>`, `/routines/<id>`,
`/files/<id>`, `/evals/<run-id>`.

Slugs are immutable once assigned and tenant-unique, enforced as a hard
Expand Down
2 changes: 1 addition & 1 deletion PRODUCT.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ existing teammate's capability before duplicating it.

## MCP

Myra can also reach any external MCP server: connect one in Plugins and
Myra can also reach any external MCP server: connect one in Tools and
its tools become callable the same way a native `@corbits/*` tool is,
with no separate integration per server.

Expand Down
2 changes: 1 addition & 1 deletion agents/myra/src/system-prompt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ export const ASSISTANT_SYSTEM_PROMPT =
"when you actually need a fact from earlier; never fabricate a " +
"recollection when a search comes back empty, and if memory isn't " +
"set up on this deployment, proceed without mentioning it. Any MCP " +
"server connected under Plugins is " +
"server connected under Tools is " +
"reachable with mcp_list_servers, mcp_list_tools, mcp_read, and " +
"mcp_call — discover once with mcp_list_tools (pattern search when " +
"unsure which server has the tool you want); use mcp_read for " +
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/app.css
Original file line number Diff line number Diff line change
Expand Up @@ -1140,7 +1140,7 @@ select:disabled,
}

/* Mission Control — pinned above the footer rail as its own row (DESIGN.md),
never a 7th button mixed into Routines/Files/Skills/Agents/Plugins/
never a 7th button mixed into Routines/Files/Skills/Agents/Tools/
Insights below. The border-bottom is what reads it as a separate band
rather than the first row of that rail. */
.shell-sidebar-mission-control {
Expand Down Expand Up @@ -1180,7 +1180,7 @@ select:disabled,
outline-offset: -1px;
}

/* Footer (reference shape): a Plugins row, then the account row that
/* Footer (reference shape): a Tools row, then the account row that
anchors the pop-up menu. Both are full-width quiet rows; the account
row has no top margin of its own so the two never read as separate
stacked bands. */
Expand Down
8 changes: 4 additions & 4 deletions apps/web/src/chat/strings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,12 @@ export const CHAT_STRINGS = {
eventBlockResponsePoll: "A vote was recorded",
eventBlockResponseForm: "A form was submitted",
/** Plain-text form of the settle notice. EventLine renders
* the same copy with "Plugins" as a `/plugins` link. */
* the same copy with "Tools" as a `/tools` link. */
eventConnectionConnected: (displayName: string): string =>
`${displayName} connected successfully. Manage in Plugins`,
eventConnectionConnectedBeforePlugins: (displayName: string): string =>
`${displayName} connected successfully. Manage in Tools`,
eventConnectionConnectedBeforeTools: (displayName: string): string =>
`${displayName} connected successfully. Manage in `,
eventConnectionConnectedPlugins: "Plugins",
eventConnectionConnectedTools: "Tools",
eventGeneric: (event: string) => event.replace(/[.\-_]+/g, " "),

inviteAgentAction: "Invite agent",
Expand Down
132 changes: 0 additions & 132 deletions apps/web/src/chat/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -549,138 +549,6 @@
color: var(--muted-foreground);
}

/* Plugins directory: a marketplace-style list, not a grid
of grey cards — one row per connector, search on top, Active before
Available. */
.plugins-directory-toolbar {
display: flex;
align-items: center;
gap: 0.75rem;
}

.plugins-directory-search {
max-width: 22rem;
flex: 1;
}

.plugins-directory-group {
display: flex;
flex-direction: column;
gap: 0.375rem;
}

.plugins-directory-group-label {
font-size: 0.65rem;
font-weight: 650;
letter-spacing: 0.07em;
text-transform: uppercase;
color: var(--muted-foreground);
}

.plugins-directory-list {
display: flex;
flex-direction: column;
}

.plugins-directory-row {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 0.6rem 0.125rem;
border-bottom: 1px solid color-mix(in srgb, var(--foreground) 10%, transparent);
}

.plugins-directory-list .plugins-directory-row:last-child {
border-bottom: 0;
}

.plugins-directory-logo {
display: inline-flex;
flex-shrink: 0;
align-items: center;
justify-content: center;
width: 2rem;
height: 2rem;
border: 1px solid color-mix(in srgb, var(--foreground) 10%, transparent);
border-radius: 0;
background: var(--card, var(--background));
}

.plugins-directory-logo-initial {
font-size: 0.8125rem;
font-weight: 650;
color: var(--muted-foreground);
}

.plugins-directory-text {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 0.1rem;
}

.plugins-directory-name-row {
display: flex;
align-items: baseline;
gap: 0.5rem;
}

.plugins-directory-name {
font-size: 0.875rem;
font-weight: 640;
}

.plugins-directory-description {
margin: 0;
font-size: 0.8125rem;
color: var(--muted-foreground);
}

/* Needs-attention is the one colored state on this page — every other
status (ownership included) reads as plain caption text. */
.plugins-directory-needs-attention {
font-size: 0.65rem;
font-weight: 650;
letter-spacing: 0.07em;
text-transform: uppercase;
color: var(--shell-accent, var(--primary));
}

.plugins-directory-ownership {
font-size: 0.65rem;
font-weight: 650;
letter-spacing: 0.07em;
text-transform: uppercase;
color: var(--muted-foreground);
}

.plugins-directory-action {
flex-shrink: 0;
}

/* Connect/Override read as quiet accent-text actions, not filled buttons —
`--shell-accent` only ever appears as text or a 2px inset edge, never a
filled rectangle. */
.plugins-directory-connect-action {
color: var(--shell-accent, var(--primary));
font-weight: 650;
}

/* Remove keeps `ConfirmButton`'s confirm-step behavior but never the red
fill it renders once armed — overriding the literal Tailwind utility
class it emits for that state, since that state is not otherwise
reachable from a variant prop. */
.plugins-directory-remove-action {
color: var(--muted-foreground);
font-weight: 600;
}

.plugins-directory-remove-action.bg-destructive {
background: transparent;
color: var(--destructive);
}

.chat-settings-choice-row {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(7rem, 1fr));
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/chat/timeline.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,12 @@ describe("friendlyEventText — workbench.agent-joined", () => {
});

describe("friendlyEventText — connection.connected", () => {
test("names the connected service and points at Plugins", () => {
test("names the connected service and points at Tools", () => {
const part: Part & { kind: "event" } = {
kind: "event",
event: "connection.connected",
data: { connectorId: "github", displayName: "GitHub" },
};
expect(friendlyEventText(part, [])).toBe("GitHub connected successfully. Manage in Plugins");
expect(friendlyEventText(part, [])).toBe("GitHub connected successfully. Manage in Tools");
});
});
6 changes: 3 additions & 3 deletions apps/web/src/chat/timeline.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -615,8 +615,8 @@ function EventLine({
collapsedText
) : connectedDisplayName !== undefined ? (
<>
{CHAT_STRINGS.eventConnectionConnectedBeforePlugins(connectedDisplayName)}
<a href="/plugins">{CHAT_STRINGS.eventConnectionConnectedPlugins}</a>
{CHAT_STRINGS.eventConnectionConnectedBeforeTools(connectedDisplayName)}
<a href="/tools">{CHAT_STRINGS.eventConnectionConnectedTools}</a>
</>
) : (
friendlyEventText(part, participants, agentDisplayNames)
Expand Down Expand Up @@ -1357,7 +1357,7 @@ function MessagePartsInner({
* connection" action — undefined renders no affordance at
* all, the same "no port, no feature" contract every other optional
* action here follows. No chat-ui component owns routing: the host
* decides where "fix" goes (Plugins' connect panel today). */
* decides where "fix" goes (Tools' connect panel today). */
readonly onFixConnection?: () => void;
readonly approvalActions?: ApprovalActions;
/** Host round-trip for the generic "connect-service" card. Undefined
Expand Down
10 changes: 5 additions & 5 deletions apps/web/src/chat/workbench-settings/model.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,16 +63,16 @@ describe("workbenchSettingsSections", () => {
]);
});

test("Myra/Keys & plugins/Inference are gone as distinct nav ids", () => {
test("Myra/Keys & tools/Inference are gone as distinct nav ids", () => {
const ids = workbenchSettingsSections("workbench").map((s) => s.id);
expect(ids).not.toContain("assistant");
expect(ids).not.toContain("keys-plugins");
expect(ids).not.toContain("keys-tools");
expect(ids).not.toContain("inference");
});

test("Plugins is global-only now — no workbench-scoped nav id", () => {
expect(workbenchSettingsSections("workbench").map((s) => s.id)).not.toContain("plugins");
expect(workbenchSettingsSections("chat", true).map((s) => s.id)).not.toContain("plugins");
test("Tools is global-only now — no workbench-scoped nav id", () => {
expect(workbenchSettingsSections("workbench").map((s) => s.id)).not.toContain("tools");
expect(workbenchSettingsSections("chat", true).map((s) => s.id)).not.toContain("tools");
});

test("Capacity is gone — sidecar placement is Interchange's own concern now", () => {
Expand Down
10 changes: 5 additions & 5 deletions apps/web/src/chat/workbench-settings/model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
// Agents is now the one place an agent participant's persona,
// capabilities, and history are edited — a click-through master-detail,
// not a separate "Myra" nav item duplicating the same editor for one
// hardcoded agent. Keys & plugins and Inference are gone as distinct
// hardcoded agent. Keys & tools and Inference are gone as distinct
// sections: inference provider+model assignment moves onto the Agents
// detail view, per agent, fed from the tenant-wide provider pool.
//
// Plugins are global-only for now (owner ruling): the workbench-scoped
// `plugins` section that used to live here is removed — connect/manage
// plugins from the bench-level Plugins page instead. Per-workbench
// Tools are global-only for now (owner ruling): the workbench-scoped
// `tools` section that used to live here is removed — connect/manage
// tools from the bench-level Tools page instead. Per-workbench
// credential rows written by that old section are left in place (nothing
// reads or writes them now); see the Plugins page for the surviving
// reads or writes them now); see the Tools page for the surviving
// surface.

import { CHAT_STRINGS } from "../strings";
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/command-palette/detail-paths.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@ describe("detailPath", () => {
});

test("the id fallback survives a segment that needs escaping", () => {
expect(detailPath("/plugins", { slug: "Not A Slug", id: "a/b" })).toBe("/plugins/a%2Fb");
expect(detailPath("/tools", { slug: "Not A Slug", id: "a/b" })).toBe("/tools/a%2Fb");
});
});
1 change: 0 additions & 1 deletion apps/web/src/lib/icons/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ export {
PlayCircle,
Plus,
Plugs,
PuzzlePiece,
PushPin,
PushPinSlash,
Repeat,
Expand Down
Loading
Loading