Skip to content

Configuration Files Reference

This is a reference doc. It covers all workspace/*.yaml schemas and environment variables for each plugin.


VariableRequiredDescription
LLM_GATEWAY_URLNoLiteLLM Proxy base URL for all in-process agent LLM calls (default: http://gateway:4000/v1)
OPENAI_API_KEYYes (for agents)Bearer token for the gateway — set to your gateway API key
DISABLE_AGENT_RUNTIMENoSet to any value to skip loading AgentRuntimePlugin
DISABLE_SKILL_BROKERNoSet to any value to skip loading SkillBrokerPlugin (use once all agents are migrated in-process)
VariableRequiredDescription
AGENTS_YAMLNoPath to external A2A agent registry (default: /workspace/agents.yaml)
AVA_API_KEYIf using the protoMaker teamAPI key injected as X-API-Key header. Env var name kept for historical reasons — the logical agent slug is protomaker.
AVA_APP_IDFor chain commentsGitHub App ID — chain responses post as @ava[bot]
AVA_APP_PRIVATE_KEYFor chain commentsGitHub App private key (PKCS#1 PEM)
VariableRequiredDescription
GITHUB_TOKENYesPAT — enables the plugin; posts comment replies
GITHUB_WEBHOOK_SECRETRecommendedValidates X-Hub-Signature-256 on inbound payloads
GITHUB_WEBHOOK_PORTNoWebhook HTTP server port (default: 8082)
QUINN_APP_IDFor bot commentsGitHub App ID — Quinn’s responses post as protoquinn[bot]
QUINN_APP_PRIVATE_KEYFor bot commentsGitHub App private key (PKCS#1 PEM)
VariableRequiredDescription
DISCORD_BOT_TOKENYesBot token — enables the plugin
DISCORD_GUILD_IDYesGuild ID for slash command registration
DISCORD_DIGEST_CHANNELNoFallback channel ID for cron pushes (overridden by discord.yaml)
VariableRequiredDescription
PLANE_WEBHOOK_SECRETYesHMAC key for webhook signature validation
PLANE_API_KEYYesFor /api/v1/ reads and writes
PLANE_BASE_URLNoDefaults to http://ava:3002
PLANE_WORKSPACE_SLUGNoDefaults to protolabsai
VariableRequiredDescription
GOOGLE_CLIENT_IDYesOAuth2 client ID — enables the plugin
GOOGLE_CLIENT_SECRETYesOAuth2 client secret
GOOGLE_REFRESH_TOKENYesLong-lived refresh token
VariableRequiredDescription
QDRANT_URLYes (for vector)http://qdrant:6333
QDRANT_VECTOR_SIZENoEmbedding dimensions (default: 768)
OLLAMA_URLYes (for embeddings)http://ollama:11434
OLLAMA_EMBED_MODELNoEmbedding model (default: nomic-embed-text)
VariableRequiredDescription
TZNoSystem timezone (e.g., America/New_York). Affects default cron timezone.

The following files contain deployment-specific config and are not committed to the repo. Each has a .example counterpart — copy it to bootstrap a new deployment:

FileCopy from
workspace/agents/<name>.yamlworkspace/agents/<name>.yaml.example — one file per in-process agent
workspace/agents.yamlworkspace/agents.yaml.example — external A2A agent registry
workspace/projects.yamlworkspace/projects.yaml.example
workspace/discord.yamlworkspace/discord.yaml.example
workspace/google.yamlworkspace/google.yaml.example
workspace/incidents.yamlworkspace/incidents.yaml.example

Schema/behavior files (actions.yaml, goals.yaml, ceremonies/) are tracked and committed as-is.


Per-agent definition for the in-process AgentRuntimePlugin. One file per agent under workspace/agents/. Files ending in .example are skipped. All files in this directory are gitignored.

name: quinn # unique agent key — used in skill routing
role: qa # orchestrator | qa | devops | content | research | general
# LLM model alias — resolved by the gateway (LiteLLM Proxy at LLM_GATEWAY_URL)
model: claude-sonnet-4-6
systemPrompt: |
You are Quinn, the QA Engineer for protoLabs AI.
...
# Workstacean bus tools this agent may call.
# Available: publish_event, get_world_state, get_incidents, report_incident,
# get_ceremonies, run_ceremony
tools:
- publish_event
- get_world_state
- report_incident
# Agents this agent may delegate to (orchestrator role only, DeepAgent pattern)
canDelegate:
- researcher
# Max agentic turns per invocation (-1 = unlimited, default: 10)
maxTurns: 15
# Skills this agent handles — matched against agent.skill.request skillHint
skills:
- name: bug_triage
description: Triage a bug report — severity, root cause, Plane issue
- name: pr_review
description: Review a pull request diff

role drives the agent profile and delegation rules:

  • orchestrator — protoMaker team pattern; can delegate to canDelegate agents
  • qa, devops, content, research, general — ReAct subagent; no delegation. Use general for conversational agents like the in-process ava chat agent.

tools is a whitelist — the agent subprocess only sees the tools listed here, plus proto CLI built-ins (file, bash, search).

model is any alias the LiteLLM gateway recognises. See your gateway config for the full alias list.


Source of truth for the external A2A agent registry. Used by SkillBrokerPlugin to dispatch skills to remote agents over JSON-RPC 2.0. Agents listed here run as separate services (Docker containers or remote hosts).

agents:
# protoMaker team — multi-agent runtime for board ops, feature lifecycle,
# onboarding, and planning. Historical env var name AVA_* kept; the
# logical agent slug is `protomaker`.
- name: protomaker
team: dev
url: http://automaker-server:3008/a2a
apiKeyEnv: AVA_API_KEY # env var holding the API key (not the key itself)
skills:
- sitrep
- manage_feature
- auto_mode
- board_health
- onboard_project
- plan
- name: quinn
team: dev
url: http://quinn:7870/a2a
skills:
- qa_report
- board_audit
- bug_triage
- pr_review
- security_triage
chain:
bug_triage: protomaker # after bug_triage, call protomaker/manage_feature
- name: frank
team: dev
url: http://frank:7880/a2a
skills:
- infra_health
- deploy
- monitoring

chain is optional. When chain[skill] is set, the named agent is called with the first agent’s response as context. One level deep only.

Note: workspace/agents/<name>.yaml (in-process) and workspace/agents.yaml (external A2A) coexist. In-process agents like the ava chat agent run inside workstacean via ProtoSdkExecutor; external agents like the protoMaker team are called via A2AExecutor. Both register into the same ExecutorRegistry, so skill dispatch is identical from the bus’s perspective.


Source of truth for the project registry. Consumed by Quinn and protoMaker via GET /api/projects. Written to during onboard_project.

Webhook URLs are never stored here — use webhookEnv to point at an env var holding the URL.

projects:
- slug: your-org-your-repo
title: Your Project
github: your-org/your-repo
defaultBranch: main
status: active
agents: [protomaker, quinn]
discord:
dev:
channelId: ""
webhookEnv: DISCORD_WEBHOOK_YOURPROJECT_DEV # env var name, not the URL
release:
channelId: ""
webhookEnv: DISCORD_WEBHOOK_YOURPROJECT_RELEASE

channels:
digest: "" # channel ID for cron-triggered posts and message.outbound.discord.push.*
welcome: "" # new member welcome messages (blank = disabled)
modLog: "" # reserved for future moderation logging
moderation:
rateLimit:
maxMessages: 5 # max messages per user per window
windowSeconds: 10 # rolling window in seconds
spamPatterns: # regex strings, case-insensitive, matched messages silently deleted
- "free\\s*nitro"
- "discord\\.gift/"
commands:
- name: mybot
description: "Bot description shown in Discord"
subcommands:
- name: status
description: "Subcommand description"
content: "/status" # text sent as payload.content
skillHint: qa_report # optional — routes to specific A2A skill
options:
- name: version
description: "Option description"
type: string # string | integer | boolean
required: false
autocomplete: false # true enables live Discord filtering; project options load from projects.yaml

mentionHandle: "@protoquinn" # case-insensitive handle to watch for
skillHints:
issue_comment: bug_triage # comment @mention on issue
issues: bug_triage # new issue body @mention
pull_request_review_comment: pr_review # review comment @mention
pull_request: pr_review # PR body @mention

drive:
orgFolderId: "" # root org Drive folder ID
templateFolderId: "" # per-project template folder ID (optional)
calendar:
orgCalendarId: "" # shared org calendar ID (from Google Calendar settings)
pollIntervalMinutes: 60 # polling interval
gmail:
watchLabels: [] # Gmail label names to monitor
pollIntervalMinutes: 5
routingRules: # label → skillHint mappings
- label: "bug-report"
skillHint: bug_triage

id: daily-digest # unique, kebab-case — used as filename
type: cron # "cron" or "once" (auto-detected if omitted)
schedule: "0 14 * * *" # cron expression (recurring) or ISO datetime (one-shot)
timezone: "America/New_York" # IANA timezone (system default if omitted)
topic: "cron.daily-digest" # bus topic to publish on fire
payload:
content: "Generate the daily QA digest"
sender: "cron"
channel: "signal" # reply channel or Discord channel ID
skillHint: qa_report
enabled: true
lastFired: "2026-04-01T14:00:00.000Z" # auto-updated by SchedulerPlugin

Workspace plugins are TypeScript/JavaScript files exporting a default object implementing the Plugin interface. Loaded on container startup. See reference/plugins.md for the full interface contract.