Skip to content

rename service → operator, orchestrator/operator session → minibuffer - #1252

Merged
edwin-zvs merged 5 commits into
mainfrom
rename-operator-switchboard
Aug 16, 2026
Merged

rename service → operator, orchestrator/operator session → minibuffer#1252
edwin-zvs merged 5 commits into
mainfrom
rename-operator-switchboard

Conversation

@edwin-zvs

@edwin-zvs edwin-zvs commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Renames the two core standing-agent nouns across the entire stack, ahead of growing operators into role-specialized agents with fleet-internal (inbox) channels. Pure rename — no behavior change beyond the names. Follows the canvas→program playbook (#562): full wire rename, lazy idempotent data migration.

The new vocabulary

  • operator — a named, durable definition that answers messages arriving on its attached channels by spawning sessions (previously service)
  • minibuffer — the daemon-created dispatcher session in the TUI bottom strip / web panel (previously orchestrator as the session kind, operator as the UI label). One concept, one name: the widget everyone already called the minibuffer.
  • the user — prose that used "the operator" for the human at the controls
  • Channels stay channels. Recorded as specs/0199-operator-and-minibuffer-naming.md.

What changed

  • Wire protocol: service.* IPC → operator.*; Service* types → Operator*; service/channel-publication-stateoperator/…; MCP construct_service_replyconstruct_operator_reply; SessionKind::OrchestratorSessionKind::Minibuffer
  • Config: definitions in <config>/operators/; [orchestrator] config table → [minibuffer]; smith ambient-loop env vars CONSTRUCT_OPERATOR_*CONSTRUCT_MINIBUFFER_*
  • TUI: /operator, /operators slash commands (/service, /services accepted as aliases; /serve still opens the create editor); smith's /operator enable|disable/minibuffer enable|disable; the transient input-line widget (which owned the name Minibuffer internally) becomes Prompt so "minibuffer" unambiguously means the session
  • Docs/specs: docs/services.mddocs/operators.md; specs 0002, 0019–0024 and the twelve service specs renamed (files + content); new spec 0199 records the decision

Back-compat / migration

  • Serde aliases keep old persisted data loading: orchestrator session kind, operator_loop_disabled, the [orchestrator] config table
  • One-shot idempotent boot migration renames <config>/services/<config>/operators/ and <data>/services/<data>/operators/ (only when old exists and new doesn't)
  • load_summary lazily rewrites service:<name> session-title prefixes to operator:<name> so pre-rename routed sessions stay attached to their operator
  • CONSTRUCT_OPERATOR_* env spellings still honored as fallback for the minibuffer tuning knobs

Deliberately untouched

macOS keychain "service", denial-of-service, Anthropic "service tier", "service signup" (README), Slack's own bot/app-token vocabulary, and xterm.js's internal coreService API (one sed casualty caught by e2e and restored).

Verification

  • cargo build — green
  • cargo test --workspace — all crates green (2,600+ tests; one smith tab-completion expectation updated: /m is now ambiguous between /model and /minibuffer)
  • cargo test -p construct-e2e — 21 targets green after the coreService fix
  • Manual isolated-daemon smoke test: legacy config/services/ + data/services/ migrate on boot with log lines, daemon healthy

🤖 Generated with Claude Code

The daemon-created dispatcher session — SessionKind::Orchestrator, shown
as the "operator" panel — is now simply the minibuffer, matching the
widget it lives in (one concept, one name):

- SessionKind::Orchestrator -> SessionKind::Minibuffer, with a serde
  alias so pre-rename meta.json files keep loading; same for the
  persisted operator_loop_disabled -> minibuffer_loop_disabled flag and
  the [orchestrator] -> [minibuffer] config table.
- CONSTRUCT_SESSION_KIND now says "minibuffer"; smith's ambient-loop
  tuning env vars move to CONSTRUCT_MINIBUFFER_* with the old
  CONSTRUCT_OPERATOR_* spellings still honored as fallback.
- The TUI's transient input-line widget, which already owned the name
  Minibuffer internally, becomes Prompt (PromptIntent, handle_prompt_key,
  app/prompt.rs) so the term minibuffer unambiguously means the session
  and its panel.
- Prose that used "the operator" for the human at the controls now says
  "the user"; prose about the session says "the minibuffer".
- Specs 0002 and 0019-0024 renamed (files + content).
Services — the named definitions that answer channels by spawning
sessions — are now operators, ahead of giving them fleet-internal
channels (inboxes) beyond slack/http:

- Wire protocol: service.* IPC methods -> operator.*, Service* types ->
  Operator*, the service/channel-publication-state notification ->
  operator/, and construct_service_reply (MCP) -> construct_operator_reply.
- Config: definitions live in <config>/operators/ (one TOML per
  operator); routing state in <data>/operators/. A one-shot idempotent
  boot migration renames the legacy services/ directories, and
  load_summary lazily rewrites persisted service:<name> session-title
  prefixes to operator:<name> so routed sessions stay attached.
- TUI: /operator and /operators (with /service and /services accepted
  as pre-rename aliases); /serve still opens the create editor.
- Docs: docs/services.md -> docs/operators.md; the twelve service
  specs renamed to operator (files + content).
- Deliberately untouched: keychain service, denial-of-service,
  service tier, and similar unrelated uses; Slack's own bot/app token
  vocabulary in the channel editor.
/m now matches both /model and /minibuffer, so Tab at /m is a no-op;
completing from /mo still yields /model.
xterm.js exposes term._core.coreService; the service→operator sweep must
not touch vendored xterm API names.
@edwin-zvs
edwin-zvs merged commit 76c39b1 into main Aug 16, 2026
1 check passed
@edwin-zvs
edwin-zvs deleted the rename-operator-switchboard branch August 16, 2026 18:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant