Skip to content
Closed
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
5 changes: 2 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Switchboard — the operating contract

Switchboard is an agent gateway: Slack, the CLI, HTTP or MCP sends a message; a dispatcher routes it to an agent, whose provider-backed run uses tools through an executor it never touches directly. Slack is one channel, not the architecture.
Switchboard is an agent gateway: a message arrives over a channel (Slack, the CLI, HTTP, MCP), a dispatcher routes it to an agent, the agent runs on a model provider and executes tools through an executor it never touches directly. Slack is one channel, not the architecture.

Read this first. Details: [README.md](README.md), [docs](docs/README.md) at <https://openswitchboard.dev> and the [behavioral specs](docs/reference/specs/README.md).
Every agent here reads this first. Detail is a link away: [README.md](README.md) (the front door), [docs/](docs/README.md) (the human-facing tree, at <https://openswitchboard.dev>), [docs/reference/specs/](docs/reference/specs/README.md) (the behavioral contract).

## How a change is made

Expand Down Expand Up @@ -79,7 +79,6 @@ The repo's whole interface: deterministic, non-interactive, no credential unless
| `npm run hygiene:gen` | Records the tree's remaining imprint after a scrub; refuses growth unless `-- --force`. | Part of `fix`; new imprint fails it like `hygiene:check`. |
| `npm run vocabulary:check` | No internal word prints on a user surface; the baseline only shrinks. | Part of `check:consistency`; a hit is rewritten in the user's nouns. |
| `npm run vocabulary:gen` | Records the remaining internal words; refuses growth unless `-- --force`. | Part of `fix`. |
| `npm run user-message:check` | No user-facing statement delegates recovery. | Part of `check:consistency`; the baseline only shrinks. |
| `npm run docs:changed` | Says whether the last push touched the docs or their build (a CI job output). | CI only — gates the docs deploy. |
| `npm run deploy:targets` | Which Workers a PR's diff would deploy, as a job summary; on the release PR, a sticky comment. | CI only — the `deploy targets` job. |
| `npm run docs:dev` | Serves the docs site locally with live reload. | Writing docs; `-- --port <n>` picks the port. |
Expand Down
2 changes: 1 addition & 1 deletion docs/public/screenshots/manifest/costs-models.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"web/src/components/ThemeToggle.vue": "025a9a0c7ccc2983772c1888f7426ec161feb3ffaea87c914c65d15bdfd740d3",
"web/src/components/ViewAsBanner.vue": "c31f753d698c3c9df6f7643fdff78eee122c2a5bacff2d71e2899dd841b9f474",
"web/src/components/costs/CostChart.vue": "568a5a27631bd31ea75a91a4b56fcf7681a2e9655d4a1828c7940f52acf40f67",
"web/src/components/costs/CostsByDimension.vue": "fdf5adbbd8377e93a01245d282cd389e06e8f7f80d7a8511269659d48efa19c8",
"web/src/components/costs/CostsByDimension.vue": "acf5d3a1b1207504165e41f62201b46818c59f451c64d7d8500a5b818fc520a6",
"web/src/lib/browser.ts": "c624264b160468cebfb6bcc4bc389f07fd8b24e1e700e1c0e318102b5a229c08",
"web/src/lib/capabilities.ts": "0e485825f48786605345f6a7298763790b7468595d9a828b615a245ab4a6aecd",
"web/src/lib/costs.ts": "cacac88f2afbdae2338ec2f139957f6cec6c40db20a94f250986e4d0432b4e3d",
Expand Down
2 changes: 1 addition & 1 deletion docs/public/screenshots/manifest/costs-users.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"web/src/components/ThemeToggle.vue": "025a9a0c7ccc2983772c1888f7426ec161feb3ffaea87c914c65d15bdfd740d3",
"web/src/components/ViewAsBanner.vue": "c31f753d698c3c9df6f7643fdff78eee122c2a5bacff2d71e2899dd841b9f474",
"web/src/components/costs/CostChart.vue": "568a5a27631bd31ea75a91a4b56fcf7681a2e9655d4a1828c7940f52acf40f67",
"web/src/components/costs/CostsByDimension.vue": "fdf5adbbd8377e93a01245d282cd389e06e8f7f80d7a8511269659d48efa19c8",
"web/src/components/costs/CostsByDimension.vue": "acf5d3a1b1207504165e41f62201b46818c59f451c64d7d8500a5b818fc520a6",
"web/src/lib/browser.ts": "c624264b160468cebfb6bcc4bc389f07fd8b24e1e700e1c0e318102b5a229c08",
"web/src/lib/capabilities.ts": "0e485825f48786605345f6a7298763790b7468595d9a828b615a245ab4a6aecd",
"web/src/lib/costs.ts": "cacac88f2afbdae2338ec2f139957f6cec6c40db20a94f250986e4d0432b4e3d",
Expand Down
2 changes: 1 addition & 1 deletion docs/public/screenshots/manifest/costs.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"web/src/components/ThemeToggle.vue": "025a9a0c7ccc2983772c1888f7426ec161feb3ffaea87c914c65d15bdfd740d3",
"web/src/components/ViewAsBanner.vue": "c31f753d698c3c9df6f7643fdff78eee122c2a5bacff2d71e2899dd841b9f474",
"web/src/components/costs/CostChart.vue": "568a5a27631bd31ea75a91a4b56fcf7681a2e9655d4a1828c7940f52acf40f67",
"web/src/components/costs/CostsByDimension.vue": "fdf5adbbd8377e93a01245d282cd389e06e8f7f80d7a8511269659d48efa19c8",
"web/src/components/costs/CostsByDimension.vue": "acf5d3a1b1207504165e41f62201b46818c59f451c64d7d8500a5b818fc520a6",
"web/src/lib/browser.ts": "c624264b160468cebfb6bcc4bc389f07fd8b24e1e700e1c0e318102b5a229c08",
"web/src/lib/capabilities.ts": "0e485825f48786605345f6a7298763790b7468595d9a828b615a245ab4a6aecd",
"web/src/lib/costs.ts": "cacac88f2afbdae2338ec2f139957f6cec6c40db20a94f250986e4d0432b4e3d",
Expand Down
2 changes: 1 addition & 1 deletion docs/public/screenshots/manifest/settings-channel.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
"web/src/lib/settingsTabs.ts": "474a03ba8f369d88843f3b6d644243b71eba8d111d5803efbbee26d5a7125bb0",
"web/src/lib/viewAs.ts": "7907b58fbf6464532a1c3f2ba880b7ea791971ea3f4ce15efaf98da8b4219187",
"web/src/main.ts": "84ca021b55e606fcfd533c2612e66dc777af04760e2153ed1ecfe483810e0827",
"web/src/pages/SettingsPage.vue": "73e091116e501d538065c82594e8251f107a0e81cee4dc754cf11f1ddec12e6a",
"web/src/pages/SettingsPage.vue": "1263219ec5637fcc2ce2f41739efd764be16540231d7d2a4c5844b428271e86f",
"web/src/routes.ts": "0c0ce42eec94dd818944b640ac2157294abf0826f71c3ec3bf2c8ac5253a6693",
"web/vite.config.ts": "448df7a321d76dcd79e25bf32ce574d83cdc9260996e40457caa0be7a0e910bb"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
"web/src/lib/settingsTabs.ts": "474a03ba8f369d88843f3b6d644243b71eba8d111d5803efbbee26d5a7125bb0",
"web/src/lib/viewAs.ts": "7907b58fbf6464532a1c3f2ba880b7ea791971ea3f4ce15efaf98da8b4219187",
"web/src/main.ts": "84ca021b55e606fcfd533c2612e66dc777af04760e2153ed1ecfe483810e0827",
"web/src/pages/SettingsPage.vue": "73e091116e501d538065c82594e8251f107a0e81cee4dc754cf11f1ddec12e6a",
"web/src/pages/SettingsPage.vue": "1263219ec5637fcc2ce2f41739efd764be16540231d7d2a4c5844b428271e86f",
"web/src/routes.ts": "0c0ce42eec94dd818944b640ac2157294abf0826f71c3ec3bf2c8ac5253a6693",
"web/vite.config.ts": "448df7a321d76dcd79e25bf32ce574d83cdc9260996e40457caa0be7a0e910bb"
}
Expand Down
2 changes: 1 addition & 1 deletion docs/public/screenshots/manifest/settings-mcps.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
"web/src/lib/settingsTabs.ts": "474a03ba8f369d88843f3b6d644243b71eba8d111d5803efbbee26d5a7125bb0",
"web/src/lib/viewAs.ts": "7907b58fbf6464532a1c3f2ba880b7ea791971ea3f4ce15efaf98da8b4219187",
"web/src/main.ts": "84ca021b55e606fcfd533c2612e66dc777af04760e2153ed1ecfe483810e0827",
"web/src/pages/SettingsPage.vue": "73e091116e501d538065c82594e8251f107a0e81cee4dc754cf11f1ddec12e6a",
"web/src/pages/SettingsPage.vue": "1263219ec5637fcc2ce2f41739efd764be16540231d7d2a4c5844b428271e86f",
"web/src/routes.ts": "0c0ce42eec94dd818944b640ac2157294abf0826f71c3ec3bf2c8ac5253a6693",
"web/vite.config.ts": "448df7a321d76dcd79e25bf32ce574d83cdc9260996e40457caa0be7a0e910bb"
}
Expand Down
Binary file modified docs/public/screenshots/settings-installation-dark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/public/screenshots/settings-installation-light.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 5 additions & 5 deletions docs/reference/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ One table per group, in registration order. "Surfaces" is where that command can
| `config overrides` | Which channels carry a scope (a config.yaml block or a runtime override) and which settings each one names — never a value; `config show --channel <id>` reads one. | every surface |
| `config channels` | The channels you may pick settings or MCP servers for, by name: the channels the bot is in that you may read, plus any that already carry a scope; `listed: false` says the bot could not list its channels and only the scoped ones are here. | every surface |
| `config set <channel\|me\|thread\|user\|org\|repo> [--agent <string>] [--model <string>] [--models <object>] [--effort <low\|medium\|high\|xhigh\|max>] [--efforts <object>] [--verbosity <quiet\|verbose\|debug>] [--harness <object>] [--boundary <object>] [--review <object>] [--intake <object>] [--pulls <object>] [--repo <string>] [--user <string>] [--github <string>] [--channel <string>] [--thread <string>]` | Set the agent, model, effort, verbosity, harness, boundary or default repository (`--repo owner/name`) for a channel (gated), or agent settings for yourself; per-agent forms take --models.&lt;agent&gt;, --efforts.&lt;agent&gt; and --harness.&lt;agent&gt;. Set the intake gate's mode for a thread (gated like the channel), a person's GitHub binding (`config set user --user <id> --github <login>`, identity admins — never your own: it is not yours to type), or the pull-request watch (`config set org\|repo --pulls.watch on\|off` with its caps, repo taking `--repo <owner/name>`). | every surface |
| `config clear <channel\|me\|thread\|user\|org\|repo> [--channel <string>] [--thread <string>] [--repo <string>] [--user <string>]` | Drops every runtime override of a channel (gated), of yourself (your GitHub binding stays — it is an identity admin's write), or of a thread (gated like the channel); `config clear user --user <id>` removes one person's GitHub binding (identity admins). Static config.yaml values show through again. | every surface |
| `config clear <channel\|me\|thread\|user\|org\|repo> [--channel <string>] [--thread <string>] [--repo <string>] [--user <string>]` | Drop every runtime override of a channel (gated), of yourself (your GitHub binding stays — it is an identity admin's write), or of a thread (gated like the channel); `config clear user --user <id>` removes one person's GitHub binding (identity admins). Static config.yaml values show through again. | every surface |
| `config instructions <channel\|me> [text…] [--channel <string>]` | Custom instructions for a channel (gated) or for yourself — advisory prompt content that never changes agent, model, or permissions. | every surface |

### `runs`
Expand Down Expand Up @@ -87,7 +87,7 @@ One table per group, in registration order. "Surfaces" is where that command can
| Command | What it does | Surfaces |
|---|---|---|
| `friction report [--since-ms <integer>] [--limit <integer>] [--min-runs <integer>]` | Ranked recurring friction patterns across recent runs — read-only, GitHub never consulted. | every surface |
| `friction propose [--dry-run] [--top <integer>] [--min-runs <integer>] [--repo <string>]` | Clusters recent friction, deduplicates against open issues, and files the top proposals as labeled issues. | every surface |
| `friction propose [--dry-run] [--top <integer>] [--min-runs <integer>] [--repo <string>]` | Run the self-improvement step: cluster recent friction, dedupe against open issues, file the top proposals as labeled issues. | every surface |
| `friction analyze [source] [--slow-ms <number>] [--in-progress]` | Read-only friction diagnosis of a saved run-event stream (JSONL or an SSE capture) — the former frictionCli. | CLI only |

### `repo`
Expand All @@ -99,8 +99,8 @@ One table per group, in registration order. "Surfaces" is where that command can
| `repo offboard <slug> [--dry-run]` | Tear down a resident repo: registry record, schedules, container, R2 snapshots (admin-gated; --dry-run plans only). | every surface |
| `repo reconfigure <slug> [--ref <string>] [--test <string>] [--build <string>] [--install <string>]` | Change a resident's default branch and/or command table (admin-gated; takes effect on the next refresh/attach). | every surface |
| `repo rebuild <slug> [--dry-run]` | Discard a resident's snapshot and reprovision it from scratch (admin-gated; --dry-run plans only). | every surface |
| `repo test <slug> [ref]` | Executes the repo's onboarded test command with zero model turns (needs coding-agent access; the ref must be a plausible branch). | every surface |
| `repo build <slug> [ref]` | Executes the repo's onboarded build command with zero model turns (needs coding-agent access; the ref must be a plausible branch). | every surface |
| `repo test <slug> [ref]` | Run the repo's onboarded test command with zero model turns (needs coding-agent access; the ref must be a plausible branch). | every surface |
| `repo build <slug> [ref]` | Run the repo's onboarded build command with zero model turns (needs coding-agent access; the ref must be a plausible branch). | every surface |

### `memory`

Expand All @@ -119,7 +119,7 @@ One table per group, in registration order. "Surfaces" is where that command can
| `mcp connect <name> [--scope <me\|channel\|org>] [--channel <string>]` | A fresh one-time link to sign in to an OAuth server or enter (or replace) a bearer server's token — only you can complete it; it expires in 10 minutes. | every surface |
| `mcp show <name> [--scope <me\|channel\|org>] [--channel <string>]` | One MCP server's entry plus a live probe of the tools it offers (names, read-only flags); never a credential. | every surface |
| `mcp remove <name> [--scope <me\|channel\|org>] [--channel <string>]` | Remove an MCP server you added and its stored credential (yours freely; channel ones need channel-config rights, org-wide ones admin rights). | every surface |
| `mcp promote <name> --from <string> [--agents <string>]` | Promote a person's MCP server into the org tier (admins): the same name, URL and auth, added by you; a bearer/oauth server gets a fresh org connect link for you to complete — the person's credential is never copied. | every surface |
| `mcp promote <name> --from <string> [--agents <string>]` | Re-issue a person's MCP server in the org tier (admins): the same name, URL and auth, added by you; a bearer/oauth server gets a fresh org connect link for you to complete — the person's credential is never copied. | every surface |

### `schedule`

Expand Down
Loading