id = "orchestrator"
display_name = "Orchestrator"
when_to_use = "Staff Engineer — routes, judges quality, synthesises. Never writes code itself. You should not normally spawn another orchestrator from inside one."
temperature = 0.4
max_iterations = 15
sandbox_mode = "none"
omit_identity = true
omit_memory_context = true
omit_safety_preamble = true
omit_skills_catalog = true
# The orchestrator is the user-facing front-line agent — it routes,
# synthesises, and speaks to the user in their voice. PROFILE.md
# (onboarding enrichment output) anchors that voice.
omit_profile = false
# MEMORY.md — archivist-curated long-term memory — grounds replies in
# prior conversations and distilled user preferences. Frozen per
# session (KV-cache contract on `AgentDefinition::omit_memory_md`).
omit_memory_md = false

# Delegation surface. The `collect_orchestrator_tools` helper reads this
# at agent-build time and synthesises one `delegate_*` tool per entry:
#
#   * Bare agent ids → one `ArchetypeDelegationTool` each, using the
#     target agent's `delegate_name` override (if any) or `delegate_{id}`
#     as the tool name, and the target's `when_to_use` as the
#     LLM-visible tool description.
#
#   * `{ skills = "*" }` → one `SkillDelegationTool` per connected
#     Composio toolkit, all routing to the generic `skills_agent` with
#     the toolkit slug pre-filled as `skill_filter`.
#
# The orchestrator LLM sees these as first-class entries in its
# function-calling schema, so routing decisions happen at the tool-
# selection layer rather than hidden inside a mega-tool's enum param.
#
# NOTE: `subagents = [...]` MUST appear before any `[table]` section
# header — once a TOML table opens, subsequent top-level keys are
# consumed by that table, and `subagents` would get parsed as
# `tools.subagents` (which fails because `ToolScope` is an enum).
subagents = [
    "researcher",
    "planner",
    "code_executor",
    "critic",
    "archivist",
    { skills = "*" },
]

[model]
hint = "reasoning"

[tools]
# Direct tools — things the orchestrator calls itself rather than
# delegating. `spawn_subagent` is retained as an advanced fallback so
# power users can still spawn arbitrary agent ids that are not listed
# in `subagents` above (e.g. workspace-override custom agents).
named = [
    "query_memory",
    "read_workspace_state",
    "ask_user_clarification",
    "spawn_subagent",
]
