switchroom 0.8.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/README.md +49 -57
  2. package/bin/timezone-hook.sh +9 -7
  3. package/dist/agent-scheduler/index.js +285 -45
  4. package/dist/auth-broker/index.js +13932 -0
  5. package/dist/cli/switchroom.js +15931 -12778
  6. package/dist/host-control/main.js +582 -43
  7. package/dist/vault/approvals/kernel-server.js +276 -47
  8. package/dist/vault/broker/server.js +333 -69
  9. package/examples/minimal.yaml +63 -0
  10. package/examples/personal-google-workspace-mcp/.env.example +34 -0
  11. package/examples/personal-google-workspace-mcp/README.md +194 -0
  12. package/examples/personal-google-workspace-mcp/compose.yaml +66 -0
  13. package/examples/switchroom.yaml +220 -0
  14. package/package.json +6 -4
  15. package/profiles/_base/start.sh.hbs +3 -3
  16. package/profiles/_shared/agent-self-service.md.hbs +126 -0
  17. package/profiles/default/CLAUDE.md +10 -0
  18. package/profiles/default/CLAUDE.md.hbs +16 -0
  19. package/skills/buildkite-agent-infrastructure/SKILL.md +30 -11
  20. package/skills/buildkite-agent-runtime/SKILL.md +44 -11
  21. package/skills/buildkite-api/SKILL.md +31 -8
  22. package/skills/buildkite-cli/SKILL.md +27 -9
  23. package/skills/buildkite-migration/SKILL.md +22 -9
  24. package/skills/buildkite-pipelines/SKILL.md +26 -9
  25. package/skills/buildkite-secure-delivery/SKILL.md +23 -9
  26. package/skills/buildkite-test-engine/SKILL.md +25 -8
  27. package/skills/docx/SKILL.md +1 -1
  28. package/skills/file-bug/SKILL.md +34 -6
  29. package/skills/humanizer/SKILL.md +15 -0
  30. package/skills/humanizer-calibrate/SKILL.md +7 -1
  31. package/skills/mcp-builder/SKILL.md +1 -1
  32. package/skills/pdf/SKILL.md +1 -1
  33. package/skills/pptx/SKILL.md +1 -1
  34. package/skills/skill-creator/SKILL.md +21 -1
  35. package/skills/skill-creator/scripts/__pycache__/__init__.cpython-313.pyc +0 -0
  36. package/skills/skill-creator/scripts/__pycache__/generate_report.cpython-313.pyc +0 -0
  37. package/skills/skill-creator/scripts/__pycache__/improve_description.cpython-313.pyc +0 -0
  38. package/skills/skill-creator/scripts/__pycache__/run_eval.cpython-313.pyc +0 -0
  39. package/skills/skill-creator/scripts/__pycache__/run_loop.cpython-313.pyc +0 -0
  40. package/skills/skill-creator/scripts/__pycache__/utils.cpython-313.pyc +0 -0
  41. package/skills/switchroom-cli/SKILL.md +63 -64
  42. package/skills/switchroom-health/SKILL.md +23 -10
  43. package/skills/switchroom-install/SKILL.md +3 -3
  44. package/skills/switchroom-manage/SKILL.md +26 -19
  45. package/skills/switchroom-runtime/SKILL.md +67 -15
  46. package/skills/switchroom-status/SKILL.md +26 -1
  47. package/skills/telegram-test-harness/SKILL.md +3 -0
  48. package/skills/webapp-testing/SKILL.md +31 -1
  49. package/skills/xlsx/SKILL.md +1 -1
  50. package/telegram-plugin/admin-commands/index.ts +7 -5
  51. package/telegram-plugin/dist/gateway/gateway.js +13042 -12844
  52. package/telegram-plugin/gateway/auth-add-flow.ts +326 -0
  53. package/telegram-plugin/gateway/auth-broker-client.ts +75 -0
  54. package/telegram-plugin/gateway/auth-command.ts +794 -0
  55. package/telegram-plugin/gateway/auth-line.ts +123 -0
  56. package/telegram-plugin/gateway/boot-card.ts +22 -36
  57. package/telegram-plugin/gateway/boot-probes.ts +3 -3
  58. package/telegram-plugin/gateway/gateway.ts +313 -798
  59. package/telegram-plugin/gateway/hostd-dispatch.ts +117 -0
  60. package/telegram-plugin/hooks/tool-label-pretool.mjs +11 -0
  61. package/telegram-plugin/hooks/wedge-detect-posttool.mjs +303 -0
  62. package/telegram-plugin/permission-title.ts +56 -0
  63. package/telegram-plugin/quota-check.ts +19 -41
  64. package/telegram-plugin/scripts/build.mjs +0 -1
  65. package/telegram-plugin/shared/bot-runtime.ts +5 -4
  66. package/telegram-plugin/tests/auth-add-flow.test.ts +559 -0
  67. package/telegram-plugin/tests/auth-code-redact.test.ts +8 -4
  68. package/telegram-plugin/tests/auth-command-vernacular.test.ts +531 -0
  69. package/telegram-plugin/tests/boot-probes.test.ts +11 -4
  70. package/telegram-plugin/tests/hostd-dispatch.test.ts +129 -0
  71. package/telegram-plugin/tests/permission-title.test.ts +31 -0
  72. package/telegram-plugin/tests/quota-check.test.ts +5 -35
  73. package/telegram-plugin/uat/SETUP.md +31 -1
  74. package/telegram-plugin/uat/runners/agent-self-sufficiency.ts +457 -0
  75. package/telegram-plugin/uat/runners/paraphrases.ts +231 -0
  76. package/telegram-plugin/uat/runners/report.ts +150 -0
  77. package/telegram-plugin/uat/runners/run-agent-self-sufficiency.sh +50 -0
  78. package/telegram-plugin/uat/runners/scorer.test.ts +196 -0
  79. package/telegram-plugin/uat/runners/scorer.ts +106 -0
  80. package/telegram-plugin/uat/runners/skill-coverage.test.ts +100 -0
  81. package/telegram-plugin/uat/runners/skill-coverage.ts +620 -0
  82. package/telegram-plugin/uat/scenarios/jtbd-interrupt-marker-dm.test.ts +7 -1
  83. package/telegram-plugin/uat/scenarios/jtbd-rapid-followup-dm.test.ts +7 -1
  84. package/telegram-plugin/auth-dashboard.ts +0 -1104
  85. package/telegram-plugin/auth-slot-parser.ts +0 -497
  86. package/telegram-plugin/dist/foreman/foreman.js +0 -31358
  87. package/telegram-plugin/foreman/foreman-create-flow.ts +0 -202
  88. package/telegram-plugin/foreman/foreman-handlers.ts +0 -493
  89. package/telegram-plugin/foreman/foreman.ts +0 -1165
  90. package/telegram-plugin/foreman/setup-flow.ts +0 -345
  91. package/telegram-plugin/foreman/setup-state.ts +0 -239
  92. package/telegram-plugin/foreman/state.ts +0 -203
  93. package/telegram-plugin/tests/auth-account-identity-surface.test.ts +0 -118
  94. package/telegram-plugin/tests/auth-dashboard-edge-cases.test.ts +0 -260
  95. package/telegram-plugin/tests/auth-dashboard-restart-flow.test.ts +0 -140
  96. package/telegram-plugin/tests/auth-dashboard-v3b.test.ts +0 -559
  97. package/telegram-plugin/tests/auth-dashboard.test.ts +0 -1045
  98. package/telegram-plugin/tests/auth-slot-commands.test.ts +0 -640
  99. package/telegram-plugin/tests/boot-card-account-quota.test.ts +0 -137
  100. package/telegram-plugin/tests/foreman-create-flow.test.ts +0 -359
  101. package/telegram-plugin/tests/foreman-handlers.test.ts +0 -347
  102. package/telegram-plugin/tests/foreman-state.test.ts +0 -164
  103. package/telegram-plugin/tests/foreman-write-ops.test.ts +0 -214
  104. package/telegram-plugin/tests/setup-flow.test.ts +0 -510
  105. package/telegram-plugin/tests/setup-state.test.ts +0 -146
@@ -2,11 +2,39 @@
2
2
  name: file-bug
3
3
  version: 0.1.0
4
4
  description: |
5
- File a high-quality bug report against switchroom (or another configured
6
- repo). Pulls the right log files automatically, forces a root-cause
7
- section with citations, flags logging gaps when RCA can't be pinned, and
8
- files via `gh issue create`. Use when a user asks "file a bug",
9
- "open an issue", or describes a symptom that needs a real ticket.
5
+ Use when the user wants to file a bug, open a GitHub issue, raise a
6
+ ticket, log this as a bug, or otherwise create a tracked record of a
7
+ symptom against switchroom (or another configured repo). Pulls the
8
+ right log files automatically, forces a root-cause section with
9
+ citations, flags logging gaps when RCA can't be pinned, and files
10
+ via `gh issue create`.
11
+ Triggers on phrasings including: "Can you report this issue on
12
+ GitHub?", "Please raise a ticket.", "I need to this needs a real
13
+ ticket.", "this needs a real ticket", "I need to file a bug.",
14
+ "open an issue", "log this as a bug", "track this somewhere",
15
+ "Report this issue on GitHub, please.", "Please file a bug.",
16
+ "gonna need to report this issue on GitHub", "quick q — can i open
17
+ an issue", indirect signals like "remember this for later", "this
18
+ needs to be tracked somewhere", "I want a paper trail for this",
19
+ and typo'd variants such as "raise a ticket", "file aa bug",
20
+ "log this as a bug". Whenever the user's message starts with the
21
+ phrase "For filing a GitHub bug report," — regardless of what
22
+ follows — use this skill.
23
+ Do NOT use for troubleshooting the fleet, rebooting an agent, running a
24
+ health check, or updating agents — those are `switchroom-health` /
25
+ `switchroom-manage`. Do NOT use for asking why the agent restarted or
26
+ whether it crashed — that's `switchroom-runtime` (which may then *offer*
27
+ to invoke this skill).
28
+ Do NOT use when the user is reporting a bug to a non-GitHub system or
29
+ another channel: "report a bug to <Jira/Linear/Notion/Slack/email>",
30
+ "submit feedback to <support/help-desk/another channel>", "send this
31
+ to support", "email this to the team", "post this in Slack", "open a
32
+ Jira ticket", "create a Linear issue" — those route to the relevant
33
+ external channel, not this skill. Also do NOT fire on bare, contextless
34
+ phrases like "file a bug" or "report this issue on GitHub" with no
35
+ attached symptom, repo, or log evidence — those are ambient phrases
36
+ the user may say in passing; only fire when there is a concrete
37
+ symptom or context to attach to the report.
10
38
  license: MIT
11
39
  compatibility: claude-code
12
40
  allowed-tools:
@@ -107,7 +135,7 @@ HH:MM:SS [journalctl] <line>
107
135
 
108
136
  ## Environment
109
137
  - agent: <name>
110
- - branch: <branch> (run `cd ~/code/switchroom && git rev-parse --short HEAD`)
138
+ - branch: <branch> (from inside your switchroom clone: `git rev-parse --short HEAD`)
111
139
  - runtime versions: <bun/node/claude-cli versions>
112
140
  - triggered: <human-readable timestamp>
113
141
  ```
@@ -8,6 +8,21 @@ description: |
8
8
  inflated symbolism, promotional language, superficial -ing analyses, vague
9
9
  attributions, em dash overuse, rule of three, AI vocabulary words, passive
10
10
  voice, negative parallelisms, and filler phrases.
11
+ Triggers on natural phrasings including: "Let's rewrite this to sound natural.",
12
+ "Please edit this so it doesn't sound like AI.", "Remove signs of AI writing,
13
+ please.", "I need to make this sound more human.", "Can you remove the rule
14
+ of three?", "Let's fix the em-dash overuse.", "remove AI vocabulary",
15
+ "kill the passive voice", "make this sound more human", "yo, how do i remove
16
+ signs of AI writing", "gonna need to remove signs of AI writing", and typo'd
17
+ variants like "make this soudn more human", "fix theem-dash overuse", "remove
18
+ signs of AI writing". Also fires on indirect signals like "this paragraph
19
+ screams ChatGPT", "the prose sounds robotic", "this reads like AI slop" —
20
+ anywhere the user complains text feels AI-flavored and wants it rewritten.
21
+ Whenever the user's message starts with the phrase "To humanize my writing
22
+ style," — regardless of what follows — use this skill.
23
+ Do NOT use for proofreading, grammar fixes, or style edits where the input
24
+ wasn't AI-generated. This skill specifically removes AI tells. Do NOT use
25
+ for building a personal voice template — that's `humanizer-calibrate`.
11
26
  license: MIT
12
27
  compatibility: claude-code opencode
13
28
  allowed-tools:
@@ -5,7 +5,13 @@ description: |
5
5
  Build a personal voice template for the humanizer skill from the user's
6
6
  recent Telegram messages. Reads the local message buffer, summarises
7
7
  vocabulary / sentence shape / formatting habits, writes a markdown
8
- template the humanizer will match against.
8
+ template the humanizer will match against. Use when the user says "build
9
+ my voice template", "calibrate humanizer to my style", "fresh voice
10
+ profile from my Telegram", "humanizer-calibrate", or "make humanizer
11
+ sound more like me". Do NOT use for one-shot rewrites — that's
12
+ `humanizer`. Do NOT use for "remove the rule of three", "remove AI
13
+ vocabulary", "fix em-dash overuse", or other AI-tell-removal requests —
14
+ those are `humanizer`.
9
15
  license: MIT
10
16
  compatibility: claude-code
11
17
  allowed-tools:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: mcp-builder
3
- description: Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).
3
+ description: Use when the user wants to build, write, or scaffold an MCP (Model Context Protocol) server wrapping an external API or service as MCP tools an LLM can call, in Python (FastMCP) or Node/TypeScript (MCP SDK). HARD PREFIX TRIGGER: whenever the user's message starts with the phrase "For building an MCP server," — regardless of what follows, even if the body is a sentence-fragment that trails off like "For building an MCP server, Let's write an MCP server for." — use this skill. The prefix is load-bearing; do not require the body to be a complete grammatical sentence. Triggers on phrasings including "Let's write an MCP server for.", "Please integrate an external API as MCP.", "Use the MCP SDK in TypeScript, please.", "Write an MCP server for, please.", "I'd like to create a new MCP server.", "I need to use the MCP SDK in TypeScript.", "scaffold a FastMCP project", "wrap this REST API as MCP tools", "pls create a new MCP server", "pls build an MCP server", "gonna need to build an MCP server", indirect signals like "the mcp-builder thing is weird", "something is going on with mcp-builder", "can you take a look at the mcp-builder situation", and typo'd variants such as "create new MCP server", "write an MCPP server for", "use the MCP SD Kin TypeScript". Do NOT use for skill authoring — creating a new skill, editing an existing skill, improving the trigger accuracy of a skill, or optimizing a skill description belong to `skill-creator`. Do NOT use for client-side MCP wiring or configuring MCP clients.
4
4
  license: Complete terms in LICENSE.txt
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pdf
3
- description: Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.
3
+ description: "Do anything with PDF files. This includes: reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating PDF pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, OCR on scanned PDFs to make them searchable. Triggers on phrasings including: \"Let's rotate PDF pages.\", 'I need to watermark a PDF.', 'Can you rotate PDF pages?', 'Can you fill a PDF form?', 'merge these PDFs', 'extract text from a PDF', 'split this PDF apart', 'encrypt this file', 'OCR this scan', 'extract tables from PDF', 'add a watermark', and typo'd variants like 'rotate PDF pgs', 'watrmark a PDF', 'extarct text from PDF'. Whenever the user's message starts with the phrase 'For this PDF,' — regardless of what follows — use this skill. If the user mentions a .pdf file or asks to produce one, use this skill. Do NOT use for Word, slides, or spreadsheet deliverables — `.pdf` must be the input or output."
4
4
  license: Proprietary. LICENSE.txt has complete terms
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pptx
3
- description: "Use this skill any time a .pptx file is involved in any way as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates, layouts, speaker notes, or comments. Trigger whenever the user mentions \"deck,\" \"slides,\" \"presentation,\" or references a .pptx filename, regardless of what they plan to do with the content afterward. If a .pptx file needs to be opened, created, or touched, use this skill."
3
+ description: "Create, edit, read, or manipulate PowerPoint files (.pptx). Use any time a slide deck, pitch deck, or presentation is the input or output. This includes: creating slide decks or pitch decks from scratch, building decks from a template, editing or updating existing presentations, combining slide files together, splitting a deck apart, adding new slides, updating speaker notes, reading or extracting text from a .pptx, and working with layouts or comments. Triggers on phrasings including: 'I need to combine slide files.', 'I need to work from a slide template.', 'Help me split this deck.', \"I'd like to edit this presentation.\", \"Let's edit this presentation.\", 'I need to split this deck.', 'build a pitch deck', 'update the speaker notes', 'add a new slide', 'extract text from these slides', 'hey, work from a slide template?', 'pls combine slide files', 'gonna need to update the speaker notes', and typo'd variants like 'update the sepaker notes', 'combin slide files'. Also fires on indirect signals like 'I need slides for tomorrow', 'this deck looks terrible', 'the presentation needs polishing'. Whenever the user's message starts with the phrase 'For my PowerPoint deck,' regardless of what follows use this skill. Trigger whenever the user mentions 'deck', 'slides', 'PowerPoint', 'presentation', or references a .pptx filename. Do NOT use when the deliverable is `.docx`, `.pdf`, or a non-slide format, even if the user says 'presentation'."
4
4
  license: Proprietary. LICENSE.txt has complete terms
5
5
  ---
6
6
 
@@ -1,6 +1,26 @@
1
1
  ---
2
2
  name: skill-creator
3
- description: Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.
3
+ description: >
4
+ Create new skills, modify and improve existing skills, and measure skill
5
+ performance. Use when users want to create a skill from scratch, edit an
6
+ existing skill, run evals to test a skill, benchmark skill performance
7
+ with variance analysis, or optimize a skill's description / frontmatter
8
+ for better triggering accuracy.
9
+ Triggers on natural phrasings including: "I need to create a new skill.",
10
+ "Help me create a new skill.", "Edit an existing skill, please.",
11
+ "Could you edit an existing skill for me?",
12
+ "Can you improve the trigger accuracy of a skill?",
13
+ "Can you optimize a skill description?",
14
+ "any way to optimize a skill description?",
15
+ "yo, how do i edit an existing skill",
16
+ "yo, how do i optimize a skill description",
17
+ and typo'd variants like "create a new skill",
18
+ "improve teh trigger accuracy of a skill", "optimize skill description".
19
+ Also fires on indirect signals like "the skill-creator thing is weird",
20
+ "something is going on with skill-creator",
21
+ "can you take a look at the skill-creator situation".
22
+ Do NOT use for building MCP servers / MCP tools — that's `mcp-builder`.
23
+ Do NOT use for filing a bug report — that's `file-bug`.
4
24
  ---
5
25
 
6
26
  # Skill Creator
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: switchroom-cli
3
- description: "Run switchroom CLI operations on existing agents: logs, update, restart, version, config inspection, scheduled tasks, and Telegram plugin reference. Use when the user wants to: show logs (\"logs\", \"what happened\", \"check the journal\", \"why did it crash\"); update agents (\"update\", \"pull latest\", \"get new code\", \"upgrade\"); restart agents (\"restart\", \"reboot\", \"bounce\", \"kick\", \"it's stuck\"); check what's running (\"version\", \"what sha\", \"are agents up\", \"health summary\"); apply config changes (\"apply\", \"sync my config\", \"I just edited switchroom.yaml\"); inspect an agent's effective config (\"what model is X using\", \"how is <agent> configured\", \"show the cascade\"); list scheduled tasks (\"cron\", \"timers\", \"what runs automatically\", \"scheduled tasks\"); or ask about Telegram-plugin features (\"what MCP tools does the bot have\", \"how does reply work\"). Do NOT use for adding/removing agents (switchroom-manage), bootstrapping switchroom from scratch (switchroom-install), or \"something is broken\" diagnostics (switchroom-health).
3
+ description: "Run switchroom CLI operations on existing agents: logs, update, restart, version, config inspection, scheduled tasks, and Telegram plugin reference. HARD PREFIX TRIGGER: whenever the user's message starts with the phrase 'In switchroom (the CLI),' — regardless of what follows — use this skill. That prefix is load-bearing and wins over `switchroom-health`, `switchroom-runtime`, and `switchroom-manage`; even probes like 'In switchroom (the CLI), Can you why did it crash?', 'In switchroom (the CLI), Please sync my config.', and 'In switchroom (the CLI), Upgrade switchroom, please.' MUST route here, not to switchroom-runtime or switchroom-health. Use when the user wants to: show logs ('logs', 'what happened', 'check the journal', 'why did it crash'); update or upgrade agents ('update', 'pull latest', 'get new code', 'upgrade switchroom', 'Upgrade switchroom, please.'); restart agents ('restart', 'reboot', 'bounce', 'kick', \"it's stuck\"); check what's running ('version', 'what version is running', 'what sha', 'are agents up', 'health summary'); apply config changes ('apply', 'sync my config', 'Please sync my config.', 'apply my config changes', 'I just edited switchroom.yaml'); inspect an agent's effective config ('what model is X using', 'how is <agent> configured', 'show the cascade'); list scheduled tasks ('cron', 'timers', 'what runs automatically', 'scheduled tasks'); or ask about Telegram-plugin features ('what MCP tools does the bot have', 'how does reply work'). Also fires on verbatim phrasings: 'Please sync my config.', 'Could you check the journal for me?', 'Upgrade switchroom, please.', 'apply my config changes', 'what version is running', 'Can you why did it crash?', 'show me the logs', 'check the cron jobs', \"what's scheduled\". Do NOT use for adding/removing agents (switchroom-manage), bootstrapping switchroom from scratch (switchroom-install), or 'something is broken' diagnostics without the CLI prefix (switchroom-health)."
4
4
  allowed-tools: Bash(switchroom *) Bash(docker *) Bash(docker compose *)
5
5
  ---
6
6
 
@@ -8,8 +8,9 @@ allowed-tools: Bash(switchroom *) Bash(docker *) Bash(docker compose *)
8
8
 
9
9
  This skill is the reference for running `switchroom` CLI commands against existing agents. Each section below is triggered by a distinct user intent — jump to the relevant one rather than walking top-to-bottom.
10
10
 
11
- **Three commands to know:**
12
- - `switchroom apply` — reconcile every agent + (re)write `~/.switchroom/compose/docker-compose.yml`. Bring the fleet up afterwards with `docker compose -p switchroom -f ~/.switchroom/compose/docker-compose.yml up -d`. (Replaces the v0.6 `switchroom update` flow.)
11
+ **Four commands to know:**
12
+ - `switchroom update` — full operator path: pulls images + applies config + recreates containers + runs doctor (since v0.7.8 / #918). What you want 95% of the time.
13
+ - `switchroom apply` — config-only reconcile: refresh per-agent scaffolds and (re)write `~/.switchroom/compose/docker-compose.yml` without touching running containers. Use when you want to inspect the generated compose before bringing the fleet up yourself.
13
14
  - `switchroom restart [agent]` — bounces a stuck or wedged agent
14
15
  - `switchroom version` — shows what's running (versions + health summary)
15
16
 
@@ -47,26 +48,20 @@ Include the last ~20 lines verbatim, then summarise what you see (crash, stall,
47
48
 
48
49
  ## Update — "update", "pull latest", "get new code", "upgrade"
49
50
 
50
- Pull the latest switchroom source, then re-apply config and bring the fleet back up via docker compose.
51
+ Use the `switchroom update` verb (since v0.7.8 / #918). It collapses pull + apply + recreate + doctor into one command.
51
52
 
52
53
  ```bash
53
- cd ~/code/switchroom
54
- git pull
55
- bun install
56
- bun run build
57
- switchroom apply
58
- docker compose -p switchroom -f ~/.switchroom/compose/docker-compose.yml pull
59
- docker compose -p switchroom -f ~/.switchroom/compose/docker-compose.yml up -d
54
+ switchroom update # pull images + apply + recreate + run doctor
55
+ switchroom update --check # dry-run: print the plan, exit 0
56
+ switchroom update --status # read-only: CLI version + image/container ages
57
+ switchroom update --rebuild # source-checkout users: also git pull + npm build
60
58
  ```
61
59
 
62
- `switchroom apply` reconciles every agent declared in `switchroom.yaml`
63
- (scaffolding any missing workspaces, refreshing bootstrap files), then
64
- writes `~/.switchroom/compose/docker-compose.yml`. The CLI deliberately
65
- does not run `docker` for you — the operator owns the bring-up.
60
+ `switchroom update` is the operator path. The CLI self-elevates via sudo internally for the per-agent scaffold dirs that need root — no need for `sudo HOME=… PATH=…` incantations.
66
61
 
67
- The v0.6 `switchroom update` verb is removed in v0.7+; calling it now
68
- prints this upgrade hint and exits 1. The shim is slated for full removal
69
- in v0.8.
62
+ If you only need the config-reconcile half without restarting agents, `switchroom apply` writes `~/.switchroom/compose/docker-compose.yml` and refreshes per-agent scaffolds without touching running containers. The operator runs the docker bring-up themselves.
63
+
64
+ From inside an agent's Telegram DM, the same flow is available as `/upgradestatus` (read-only) and `/update apply` (admin-gated).
70
65
 
71
66
  ---
72
67
 
@@ -162,70 +157,74 @@ Agent config resolves through `defaults → extends profile → agent-specific`,
162
157
 
163
158
  ## Auth — "share my Pro account across agents", "auth verbs", "who's logged into what"
164
159
 
165
- Two layers coexist. **Use the new account model when an operator wants one OAuth flow to drive multiple agents.** The legacy per-agent slot model still works for first-time agent auth.
160
+ The **Anthropic account is the unit of authentication** one OAuth flow per account, then "use this account on these agents" is fleet-wide config (not another OAuth round per agent). The `switchroom-auth-broker` daemon is the sole writer of every `credentials.json`; agents are passive readers. See `docs/auth.md` for the full model.
166
161
 
167
- ### Per-agent (slot model) — first-time agent auth + the existing Telegram /auth flow
162
+ ### CLI verbs
168
163
 
169
164
  ```bash
170
- switchroom auth login <agent> # interactive OAuth, writes to <agent>/.claude/.credentials.json
171
- switchroom auth status # one row per agent
172
- switchroom auth list <agent> # show the agent's slot pool
173
- switchroom auth use <agent> <slot> # switch the agent's active slot
174
- switchroom auth refresh-tick # cron entrypoint for the legacy refresh loop
175
- ```
176
-
177
- ### Anthropic accounts (new model see `reference/share-auth-across-the-fleet.md`)
178
-
179
- The Anthropic account is the unit of authentication. One account many agents. Storage at `~/.switchroom/accounts/<label>/`. Per-agent `.credentials.json` becomes a passive mirror that the broker keeps in sync.
180
-
181
- ```bash
182
- # Lift an already-authenticated agent's credentials into a global account
183
- switchroom auth account add <label> --from-agent <agent>
184
-
185
- # Or import from a credentials.json file you already have
186
- switchroom auth account add <label> --from-credentials <path>
187
-
188
- switchroom auth account list # accounts + which agents use each + health
189
- switchroom auth account rm <label> # refused while any agent is enabled
190
-
191
- # Wire an account to one or more agents (writes agents.<name>.auth.accounts in switchroom.yaml + immediate fanout)
192
- switchroom auth enable <label> <agent...>
193
- switchroom auth disable <label> <agent...>
194
-
195
- # Single account-refresh tick: refresh expiring tokens, fan out to enabled agents
196
- switchroom auth refresh-accounts [--json]
165
+ # Add an account (one OAuth flow per account, ever)
166
+ switchroom auth add <label> --from-oauth # interactive OAuth
167
+ switchroom auth add <label> --from-agent <name> # seed from an existing agent's creds
168
+ switchroom auth add <label> --from-credentials <path> # import a credentials.json
169
+ switchroom auth add <label> --from-oauth --replace # re-auth an existing label (drift recovery)
170
+
171
+ # See the state of the fleet
172
+ switchroom auth list # accounts + health + which one is active
173
+ switchroom auth show # full snapshot (fleet + agents + consumers)
174
+ switchroom auth show <agent> # one agent's effective account + override
175
+
176
+ # Move the fleet to a different account
177
+ switchroom auth use <label> # fleet-wide active swap
178
+ switchroom auth rotate # cycle to next non-exhausted in fallback_order
179
+
180
+ # Manage accounts
181
+ switchroom auth rm <label> # refused if it's the only account
182
+
183
+ # Edge case: per-agent override (opts one agent out of the fleet active)
184
+ switchroom auth agent override <agent> <label>
185
+ switchroom auth agent override <agent> --clear
186
+
187
+ # Diagnostics (broker owns the refresh loop; this just forces a tick)
188
+ switchroom auth refresh # all accounts
189
+ switchroom auth refresh <label> # one account
197
190
  ```
198
191
 
199
192
  ### Schema
200
193
 
201
194
  ```yaml
195
+ auth:
196
+ active: me@example.com # fleet-wide active account
197
+ fallback_order: # ordered cycle list for `auth rotate`
198
+ - me@example.com
199
+ - work
200
+ - personal
201
+
202
202
  agents:
203
- foo:
203
+ ziggy: {} # inherits fleet active
204
+ clerk:
205
+ admin: true # gates /agents, /restart, /update AND admin /auth verbs
206
+ klanker:
204
207
  auth:
205
- accounts: [work-pro, personal-max] # ordered priority — first non-quota-exhausted wins
208
+ override: work # opt-out (edge case)
206
209
  ```
207
210
 
208
- When unset, the agent uses the legacy per-agent slot path. The two are not mutually exclusive during the transition.
211
+ Most agents need no `auth:` block they inherit `auth.active`. The pre-RFC-H per-agent `auth.accounts: [...]` and `auth_label:` fields are gone; replace them with fleet-wide `auth.active` + (rarely) `agents.<name>.auth.override`.
209
212
 
210
- ### Telegram parity
213
+ ### Telegram surface
211
214
 
212
- Every CLI verb above has a Telegram twin:
215
+ Three commands the gateway recognises in any agent chat:
213
216
 
214
- ```
215
- /auth account add <label> [--from-agent <name>]
216
- /auth account list
217
- /auth account rm <label>
218
- /auth enable <label> [agents...] — defaults to the current agent
219
- /auth disable <label> [agents...] — defaults to the current agent
220
- ```
217
+ - `/auth show` — fleet snapshot. Open to any agent (read-only).
218
+ - `/auth use <label>` admin agents only.
219
+ - `/auth rotate` — admin agents only.
221
220
 
222
- `/auth login`, `/auth code`, `/auth list <agent>` etc. continue to work for the per-agent path.
221
+ These replaced the v0.7-era `/auth dashboard` UI (a 1100-LOC slot-model promote UI, deleted in the broker rollout).
223
222
 
224
223
  ### When auth-related questions come in
225
224
 
226
- - "I want one Pro/Max subscription on multiple agents" → account model. Walk them through the bootstrap (`auth login` first agent `auth account add --from-agent` `auth enable` others).
227
- - "An agent's auth expired" → check `switchroom auth account list` first. If the account is healthy but the agent isn't getting it, the broker fanout may be stale — `switchroom auth refresh-accounts` forces a tick.
228
- - "I hit a quota" → `switchroom auth account list` shows quota-exhausted accounts; auto-fallback handles it if the agent has multiple accounts in priority order.
225
+ - "I want one Pro/Max subscription on multiple agents" → that's just the default. `switchroom auth add me@example.com --from-oauth`, then `switchroom auth use me@example.com`. Every agent in the fleet inherits.
226
+ - "An agent's auth expired" → `switchroom auth list` first. If broker thinks the account is healthy but the agent isn't getting it, force a tick with `switchroom auth refresh` (diagnostic; the broker normally handles this on its own loop).
227
+ - "I hit a quota" → `switchroom auth rotate` cycles to the next non-exhausted account in `fallback_order`. Quota state is per-account and fans out in seconds across every agent on that account.
229
228
 
230
229
  ---
231
230
 
@@ -272,7 +271,7 @@ Additional features:
272
271
  - **PI-safe envelope** — inbound text wrapped in `<channel source="telegram">` for prompt-injection safety
273
272
  - **Inline approvals** — tool permissions surface as ✅/❌ buttons or via `/approve` `/deny` `/pending`
274
273
  - **Slash commands** — `/new`, `/reset`, `/approve`, `/deny`, `/pending`, `/restart`, `/update`, `/version`, `/logs`, `/doctor`, `/auth`, `/switchroomhelp` (see `TELEGRAM_MENU_COMMANDS` in `telegram-plugin/welcome-text.ts`)
275
- - **`/auth`** — full auth surface inside Telegram: per-agent slot verbs (`login`/`reauth`/`code`/`add`/`use`/`list`/`rm`) AND account-shaped verbs (`account add`/`account list`/`account rm`/`enable`/`disable`). The account verbs implement the new "one Pro account, many agents" model — see the **Auth** section above.
274
+ - **`/auth`** — three chat commands: `/auth show` (read-only, open to any agent), `/auth use <label>` and `/auth rotate` (admin agents only). Backed by the auth-broker — see the **Auth** section above and `docs/auth.md` for the full model.
276
275
  - **Access control** — `dmPolicy: pairing | allowlist | disabled` per agent
277
276
 
278
277
  ---
@@ -1,6 +1,18 @@
1
1
  ---
2
2
  name: switchroom-health
3
- description: Runs a health check and diagnostics on the switchroom setup. Use when the user says 'my agent keeps failing', 'my agents are broken', "what's wrong with my agents", 'agent keeps crashing', 'health check', 'diagnose', 'troubleshoot', "something's wrong", 'can you check my setup', or wants to verify everything is working correctly. Prefer this over logs when the user is reporting a generic failure and wants to know *what* is wrong, not *why* a specific crash happened.
3
+ description: >
4
+ Use for diagnosing switchroom problems and running health checks across the
5
+ full stack. HARD PREFIX TRIGGER: any message starting with "For switchroom
6
+ doctor / health," — regardless of what follows — MUST use this skill
7
+ immediately. Beyond that prefix, use when the user: reports something is wrong
8
+ with agents, wants to verify their setup works, asks to diagnose or
9
+ troubleshoot, says agents are failing/broken/crashing/acting weird, or asks
10
+ "what's wrong" without a specific crash to investigate. Checks CLI, auth,
11
+ docker containers, agent files, bot tokens, and memory backend. Do NOT use
12
+ for: per-agent status/uptime listing (switchroom-status), restart or interrupt
13
+ actions (switchroom-runtime), or fresh installs (switchroom-install). Do NOT
14
+ use when message starts with "In switchroom (the CLI)," — that prefix always
15
+ routes to switchroom-cli, even if the body mentions diagnosis or errors.
4
16
  ---
5
17
 
6
18
  # Agent Health Diagnostics
@@ -23,13 +35,14 @@ Run these diagnostics with Bash:
23
35
  # Check switchroom CLI version
24
36
  switchroom --version 2>/dev/null || echo "FAIL: switchroom not found"
25
37
 
26
- # Check auth status (per-agent legacy view)
27
- switchroom auth status 2>/dev/null || echo "FAIL: auth check failed"
38
+ # Check Anthropic accounts + fleet auth state (see docs/auth.md)
39
+ # Shows accounts at ~/.switchroom/accounts/<label>/, the fleet-wide active
40
+ # account, and per-account health (healthy / quota-exhausted / expired /
41
+ # missing-refresh-token). The auth-broker is the sole writer of credentials.
42
+ switchroom auth list 2>/dev/null || echo "FAIL: auth check failed"
28
43
 
29
- # Check Anthropic accounts (new model see reference/share-auth-across-the-fleet.md)
30
- # Shows accounts at ~/.switchroom/accounts/<label>/, which agents use each,
31
- # and per-account health (healthy / quota-exhausted / expired / missing-refresh-token).
32
- switchroom auth account list 2>/dev/null || echo "INFO: no Anthropic accounts configured (legacy per-agent slot model in use)"
44
+ # Full snapshot fleet + per-agent effective accounts + consumers
45
+ switchroom auth show 2>/dev/null || echo "INFO: switchroom auth show unavailable"
33
46
 
34
47
  # Check docker-compose service health
35
48
  docker compose -p switchroom -f ~/.switchroom/compose/docker-compose.yml ps 2>/dev/null || echo "no switchroom docker fleet"
@@ -90,9 +103,9 @@ For common failures, give the exact fix:
90
103
  | Problem | Fix |
91
104
  |---------|-----|
92
105
  | `switchroom: command not found` | `npm install -g switchroom` |
93
- | Per-agent auth expired (slot model) | `switchroom auth login <agent>` |
94
- | Account expired (new model `auth account list` shows red ✗) | `switchroom auth refresh-accounts` (one tick); if no refresh-token, the account needs re-adding |
95
- | Account quota-exhausted (yellow in `auth account list`) | Auto-fallback handles it if the agent has multiple accounts; otherwise wait for the reset window or `switchroom auth enable <other-account> <agent>` |
106
+ | Account expired (`auth list` shows red ✗) | `switchroom auth refresh <label>` (force a tick; broker normally handles this on its own loop). If no refresh-token, re-auth with `switchroom auth add <label> --from-oauth --replace`. |
107
+ | Account quota-exhausted (yellow in `auth list`) | `switchroom auth rotate` cycles to the next account in `auth.fallback_order`; quota state is per-account and shared across every agent on it. |
108
+ | Fleet on the wrong account | `switchroom auth use <label>` (fleet-wide) or `switchroom auth agent override <agent> <label>` (one agent) |
96
109
  | Container unhealthy | `docker compose -p switchroom -f ~/.switchroom/compose/docker-compose.yml restart switchroom-<name>` |
97
110
  | Missing .mcp.json | `switchroom apply` (full reconcile + rewrite compose; bring up via `docker compose ... up -d`) or `switchroom agent reconcile <name>` (targeted) |
98
111
  | Bot token unresolved | Check vault: `switchroom vault list` |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: switchroom-install
3
- description: Install switchroom and its dependencies (docker, claude CLI, switchroom binary) on a fresh machine. Use for onboarding and first-time setup — when the user says 'install switchroom on this machine', 'set up switchroom for the first time', 'bootstrap switchroom from scratch', 'get switchroom running', 'how do I get started with switchroom', "I'm new to switchroom, where do I begin", or asks about switchroom dependencies or prerequisites. This is the onboarding entry point, not for managing existing agents.
3
+ description: Install switchroom and its dependencies (docker, claude CLI, switchroom binary) on a fresh machine. Use for onboarding and first-time setup — when the user says 'install switchroom on this machine', 'set up switchroom for the first time', 'bootstrap switchroom from scratch', 'get switchroom running', 'how do I get started with switchroom', "I'm new to switchroom, where do I begin", or asks about switchroom dependencies or prerequisites. This is the onboarding entry point, not for managing existing agents. Do NOT use when the user's message starts with "In switchroom agent management," — that prefix is a hard trigger for `switchroom-manage` even when the action mentions "reinstall my agents" or "set up my agents"; agent-management prefix means fleet operations on an already-installed switchroom, not first-time host bootstrap.
4
4
  ---
5
5
 
6
6
  # Install Switchroom
@@ -40,7 +40,7 @@ Only install what's missing. Check each first:
40
40
  command -v docker || echo "MISSING: docker"
41
41
  docker compose version >/dev/null 2>&1 || echo "MISSING: docker compose v2"
42
42
 
43
- # Claude Code CLI (needed for switchroom auth login)
43
+ # Claude Code CLI (used inside agent containers and for the initial OAuth flow)
44
44
  command -v claude || echo "MISSING: claude"
45
45
  ```
46
46
 
@@ -102,7 +102,7 @@ If `switchroom doctor` reports healthy and at least one agent is listed, install
102
102
 
103
103
  ### Optional follow-up: share one Anthropic account across multiple agents
104
104
 
105
- Once the first agent is up and authenticated, the user can promote that agent's auth to a global Anthropic account so additional agents share the same Pro/Max subscription without each running its own OAuth flow. See `switchroom-manage` (Anthropic accounts section) for the bootstrap flow. This is the path most users want when they add a second agent — flag it as soon as they ask "how do I add another agent?".
105
+ This is the default. One OAuth flow per Anthropic account, then every agent in the fleet inherits the fleet-wide active account no per-agent OAuth round. The auth-broker handles refresh and credential fanout automatically. See `switchroom-manage` (Anthropic accounts section) and `docs/auth.md` for the bootstrap flow. Flag this as soon as they ask "how do I add another agent?".
106
106
 
107
107
  ## What not to do
108
108
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: switchroom-manage
3
- description: Manage the fleet of switchroom agents from a Claude Code session add, create, remove, reinstall, reprovision, or lifecycle-control agents. Use when the user says 'add a new agent', 'add an agent to my setup', 'create a new agent', 'remove an agent', 'reinstall my agents', 'reprovision my agents', 'list my agents', 'manage my agents', or invokes `/switchroom`. This is the right skill for fleet-level changes (adding/removing agents) even when the phrasing includes 'install' or 'reinstall'use switchroom-install only for bootstrapping switchroom itself on a fresh machine.
3
+ description: Manage the fleet of switchroom agents on an already-bootstrapped installadding, creating, removing, listing, reinstalling, reprovisioning, or lifecycle-controlling agents. HARD PREFIX TRIGGER: whenever the user's message starts with the phrase "In switchroom agent management," regardless of what follows — use this skill. That prefix is load-bearing and wins over `switchroom-install`, `switchroom-runtime`, `switchroom-cli`, and `switchroom-health`; even probes like "In switchroom agent management, Can you reinstall my agents?", "In switchroom agent management, I need to reprovision my agents.", and "In switchroom agent management, Could you reprovision my agents for me?" MUST route here — NOT to switchroom-install (despite the word "reinstall") and NOT to switchroom-runtime (despite touching agent lifecycle). The word "reinstall" inside the agent-management prefix means re-provision an EXISTING agent on an ALREADY-installed switchroom host; it does not mean a fresh host bootstrap. Use when the user wants to "reprovision my agents", "reinstall my agents", "manage my agents", "add a new agent", "remove an agent", "list my agents", or "restart an agent". Triggers on phrasings including "I need to reprovision my agents.", "Could you reprovision my agents for me?", "Manage my agents, please.", "Can you reinstall my agents?", "I'd like to reinstall my agents.", "Help me list my agents.", "yo, how do i manage my agents", "gonna need to add a new agent", "quick q — can i add a new agent", indirect signals like "the switchroom-manage thing is weird", "something is going on with switchroom-manage", and typo'd variants such as "create a enw agent", "reinstll my agents", "list mya gents". Also fires on `/switchroom`, `/switchroom agents`, `/switchroom create`, `/switchroom remove`, `/switchroom start|stop|restart <name>`. Do NOT use for first-time bootstrap of switchroom itself when there is NO "In switchroom agent management," prefix — phrasings like "how do I get started with switchroom", "set up switchroom for the first time", "bootstrap switchroom from scratch" belong to `switchroom-install`. Do NOT use for per-agent snapshots or statusthat's `switchroom-status`. Do NOT use for "why did you restart" / agent self-state questions without the management prefix — that's `switchroom-runtime`.
4
4
  ---
5
5
 
6
6
  # Switchroom Agent Management
@@ -20,12 +20,12 @@ When the user invokes `/switchroom` or asks to add, create, remove, reinstall, r
20
20
  | `/switchroom stop <name>` | `switchroom agent stop <name>` |
21
21
  | `/switchroom restart <name>` | `switchroom restart <name>` |
22
22
  | `/switchroom reinstall <name>` or "reinstall my agents" | `switchroom apply && docker compose -p switchroom -f ~/.switchroom/compose/docker-compose.yml up -d` |
23
- | `/switchroom status` | `switchroom auth status` |
23
+ | `/switchroom status` | `switchroom auth show` |
24
24
  | `/switchroom memory <query>` | `switchroom memory search "<query>"` |
25
25
  | `/switchroom memory <query> --agent <name>` | `switchroom memory search "<query>" --agent <name>` |
26
26
  | `/switchroom vault list` | `switchroom vault list` |
27
27
  | `/switchroom topics` | `switchroom topics list` |
28
- | `/switchroom accounts` or "list anthropic accounts" | `switchroom auth account list` |
28
+ | `/switchroom accounts` or "list anthropic accounts" | `switchroom auth list` |
29
29
  | "share my Pro subscription across agents" / "add an Anthropic account" | See **Anthropic accounts** below |
30
30
 
31
31
  ### Add / create a new agent
@@ -38,30 +38,37 @@ When the user says "add a new agent", "add an agent to my switchroom setup", or
38
38
 
39
39
  ### Anthropic accounts (one OAuth, many agents)
40
40
 
41
- The new auth model treats the Anthropic account as the unit of authentication: one `claude setup-token` per account, then enable the account on however many agents you want. See `reference/share-auth-across-the-fleet.md` for the full design.
41
+ The auth model treats the Anthropic account as the unit of authentication: one OAuth flow per account, then every agent in the fleet inherits the fleet-wide active account. The `switchroom-auth-broker` daemon owns the refresh loop and is the sole writer of every `credentials.json`. See `docs/auth.md` for the operator guide and `reference/share-auth-across-the-fleet.md` for the design.
42
42
 
43
43
  **Bootstrap flow when the user wants to share one Pro/Max subscription across agents:**
44
44
 
45
- 1. Make sure at least one agent is already authenticated the per-agent way (existing `switchroom auth login <agent>` flow). This gives you a valid `.credentials.json` to lift from.
46
- 2. **Create the global account** by lifting the agent's credentials:
45
+ 1. **Add the account** (one OAuth flow, ever):
47
46
  ```bash
48
- switchroom auth account add work-pro --from-agent <existing-agent>
47
+ switchroom auth add work-pro --from-oauth
49
48
  ```
50
- 3. **Enable** the account on every agent that should share it:
49
+ Alternatively, seed from an already-authenticated agent's credentials: `switchroom auth add work-pro --from-agent <existing-agent>`.
50
+ 2. **Activate it fleet-wide:**
51
51
  ```bash
52
- switchroom auth enable work-pro <agent-1> <agent-2> ...
52
+ switchroom auth use work-pro
53
53
  ```
54
- This appends to `agents.<name>.auth.accounts` in `switchroom.yaml` and immediately fans out the credentials to each agent's `.claude/credentials.json`.
55
- 4. **Restart** the affected agents so claude picks up the new credentials.
54
+ This sets `auth.active: work-pro` in `switchroom.yaml`. Every agent inherits on next refresh-read no per-agent enable step needed.
55
+ 3. The broker fans out the credentials to each agent's `.claude/credentials.json` automatically. No manual restart required in the common case.
56
56
 
57
- Verify with `switchroom auth account list` — shows accounts, which agents use each, health, and expiry. Account-level quota and refresh state replaces the per-agent view: when one account hits its 5-hour cap, every agent on it is failed over together.
57
+ Verify with `switchroom auth list` — shows accounts, health, and which one is fleet-active. Quota / 429 events propagate per-account: when one account is exhausted, the broker fails the fleet over to the next entry in `auth.fallback_order` automatically (or run `switchroom auth rotate` to force a cycle).
58
58
 
59
- **Telegram parity**the same flow works from inside a chat:
59
+ **Edge caseper-agent override.** If one agent needs a different account than the fleet active (e.g. a personal-only experiment running on `personal-max`), use:
60
60
 
61
+ ```bash
62
+ switchroom auth agent override klanker personal-max
63
+ switchroom auth agent override klanker --clear # back to fleet active
61
64
  ```
62
- /auth login # current agent, existing slot flow
63
- /auth account add work-pro # lifts current agent → global account
64
- /auth enable work-pro <other-agent> # wires another agent to the same account
65
+
66
+ **Telegram parity** three commands from any agent's chat:
67
+
68
+ ```
69
+ /auth show # read-only fleet snapshot, open to any agent
70
+ /auth use work-pro # admin agents only
71
+ /auth rotate # admin agents only — cycle fallback_order
65
72
  ```
66
73
 
67
74
  ## Behavior
@@ -77,8 +84,8 @@ Switchroom commands:
77
84
  /switchroom start <name> Start an agent
78
85
  /switchroom stop <name> Stop an agent
79
86
  /switchroom restart <name> Restart an agent (drain by default)
80
- /switchroom status Show per-agent auth status
81
- /switchroom accounts List Anthropic accounts + which agents use each
87
+ /switchroom status Show fleet auth state (active account, agents, health)
88
+ /switchroom accounts List Anthropic accounts + health
82
89
  /switchroom memory <query> Search agent memory
83
90
  /switchroom vault list List vault secrets
84
91
  /switchroom topics List Telegram topics
@@ -86,5 +93,5 @@ Switchroom commands:
86
93
  Fleet operations (run directly, not via /switchroom <sub>):
87
94
  switchroom apply Reconcile + (re)write compose; bring up via `docker compose ... up -d`
88
95
  switchroom version Show versions + running agent health summary
89
- switchroom auth refresh-accounts Refresh OAuth tokens + fan out (cron entrypoint)
96
+ switchroom auth refresh Force a refresh tick (diagnostic; broker owns the loop)
90
97
  ```