pub struct Agent {Show 17 fields
pub runtime: String,
pub model: Option<String>,
pub role_prompt: Option<RolePrompt>,
pub permission_mode: Option<String>,
pub autonomy: String,
pub can_dm: Vec<String>,
pub can_broadcast: Vec<String>,
pub reports_to: Option<String>,
pub on_rate_limit: Option<Vec<String>>,
pub effort: Option<EffortLevel>,
pub ultracode: bool,
pub interfaces: Option<AgentInterfaces>,
pub display_name: Option<String>,
pub hooks: Vec<HookSpec>,
pub mcps: BTreeMap<String, McpServer>,
pub subagents: Vec<PathBuf>,
pub skills: Vec<PathBuf>,
}Fields§
§runtime: String§model: Option<String>§role_prompt: Option<RolePrompt>§permission_mode: Option<String>§autonomy: String§can_dm: Vec<String>§can_broadcast: Vec<String>§reports_to: Option<String>§on_rate_limit: Option<Vec<String>>Override the global rate-limit hook chain for this agent.
effort: Option<EffortLevel>Per-agent reasoning effort. Renders as EFFORT=<value> in the
agent env file; the wrapper passes it to the runtime (e.g.
claude --effort <value>). Strict enum: typos like hgih fail
compose validation rather than silently falling back to the
wrapper default.
ultracode: bool#461: per-agent ultracode opt-in. When true, teamctl emits
"ultracode": true into the agent’s Claude Code settings JSON (the
file the wrapper passes via --settings); the resulting session
behavior is Claude Code’s, not teamctl’s. ultracode is a Claude Code
setting — not an effort level and not a CLI flag — so it’s
orthogonal to effort: above (which rides the --effort flag) and
the two compose freely. Like the enableAllProjectMcpServers key in
render_claude_settings, the name is vendor-owned: verified against
Claude Code 2.1.175, and a future rename would silently no-op.
claude-only v1: on non-claude runtimes the settings file is skipped
and a declared opt-in warns (codex/gemini have no equivalent).
Defaults to false → the settings JSON is byte-unchanged for agents
that don’t opt in.
interfaces: Option<AgentInterfaces>Per-manager human-facing interfaces. Today’s only adapter is
telegram; the shape is reserved for future adapters
(discord, imessage, …) so a manager can declare every
channel it speaks on in one place. Workers leave this unset.
display_name: Option<String>T-160: optional human-friendly label rendered by the TUI in
place of the agent id (roster, details header, mailbox row
attribution, statusline). Absent → render the agent id (current
behavior). Validation: non-empty, ≤64 chars, UTF-8 anything.
The agent id stays canonical for routing, tmux session names,
CLI args, and YAML cross-refs (can_dm, can_broadcast,
reports_to) — display_name is render-time only.
hooks: Vec<HookSpec>#383 Phase 2: per-agent Claude Code hooks, merged additively into
the per-agent settings.json that render already builds, on top
of the built-in interactive-prompt deny hook (which keeps
precedence — see render::render_claude_settings). Commands are
compose-root-relative paths, resolved like role_prompt.
claude-only v1: declared on a non-claude-code agent they render
nothing and render logs an “unsupported runtime” warning. Empty
(the default) → settings unchanged.
mcps: BTreeMap<String, McpServer>#383 Phase 4: per-agent MCP servers, merged into the rendered
per-agent MCP config alongside the built-in team mailbox server
(which stays unconditional and non-clobberable — a declared server
named team is rejected at validate and skipped at render). Unlike
hooks, MCP is runtime-agnostic: declared servers render for every
runtime whose descriptor sets supports_mcp, and are skipped with
a warning otherwise. Empty (the default) → MCP config unchanged.
subagents: Vec<PathBuf>#383 Phase 3a: per-agent Claude Code sub-agents declared in compose.
Each entry is a compose-root-relative path to a standard sub-agent
markdown file (frontmatter name / description / optional tools
/ model, body → the sub-agent’s system prompt), resolved like
role_prompt. render transforms the list into Claude Code’s
--agents inline JSON so each agent gets its own sub-agents
additively, on top of the project .claude/agents/ and the built-in
sub-agents (verified: --agents adds, never replaces), without an
arbitrary-path flag (the only cwd-stationary mechanism — see the
Phase-1 spike). claude-only v1: declared on a non-claude-code
agent they render nothing and render logs an “unsupported runtime”
warning. Empty (the default) → no --agents flag.
skills: Vec<PathBuf>#383 Phase 3b: per-agent Claude Code skills declared in compose.
Each entry is a compose-root-relative path to a skill directory
(the folder holding SKILL.md), resolved like role_prompt. render
materializes a per-agent scope dir under
state/agent-scope/<project>-<agent>/.claude/skills/ holding a
symlink to each declared skill, and the wrapper passes that scope
dir via claude --add-dir so the agent discovers its skills
additively, on top of the project .claude/skills/ (verified:
--add-dir adds, never replaces — see the Phase-1 spike §9-E1).
claude-only v1: declared on a non-claude-code agent they
materialize nothing and render logs an “unsupported runtime”
warning. Empty (the default) → no --add-dir flag.