# Set SLACK_*, DISCORD_*, and/or TELEGRAM_BOT_TOKEN — the bot starts an adapter # for each platform whose secrets are present (any one, or several at once). # ── Slack credentials (from api.slack.com/apps → your app) ────────────── # Set both to run on Slack; leave blank to skip Slack. # Bot Token: OAuth & Permissions page, "Bot User OAuth Token" (xoxb-...) SLACK_BOT_TOKEN=xoxb-... # App-Level Token: Basic Information → App-Level Tokens → generate with the # "connections:write" scope (xapp-...) SLACK_APP_TOKEN=xapp-... # ── Discord credentials (from discord.com/developers/applications → your app) ── # Set both to run on Discord; leave blank to skip Discord. Bot page → "Reset # Token"; under "Privileged Gateway Intents" enable BOTH Message Content and # Server Members (both required). Application ID is on General Information. # DISCORD_BOT_TOKEN= # DISCORD_APP_ID= # Optional: a guild (server) id registers slash commands instantly during dev # (global commands can take up to ~1h). Omit in production. # DISCORD_GUILD_ID= # ── Telegram credentials (from @BotFather on Telegram) ────────────────── # Set to run on Telegram; leave blank to skip Telegram. Message @BotFather → # /newbot → copy the token it gives you. Long-polling is the default ingress # (no public URL or webhook setup needed). # TELEGRAM_BOT_TOKEN= # ── Agent backend (runtime.ts) ────────────────────────────────────────── # The AG-UI endpoint the bridge POSTs to. Default points at the local # CopilotKit runtime started by `pnpm runtime`. AGENT_URL=http://localhost:8200/api/copilotkit/agent/triage/run # Optional auth header forwarded to the agent (for a deployed runtime). # AGENT_AUTH_HEADER=Bearer ... # Model for the BuiltInAgent. provider/model — the runtime resolves the # provider and reads the matching API key below. Defaults to openai/gpt-5.5. # AGENT_MODEL=anthropic/claude-sonnet-4.5 OPENAI_API_KEY=sk-... # ANTHROPIC_API_KEY=sk-ant-... # GOOGLE_API_KEY=... # ── Intelligence Channel mode — app/managed.ts (`pnpm channel`) ────────── # The Channel variant runs the SAME bot over the Intelligence realtime gateway # instead of a native adapter — it holds NO Slack tokens (Intelligence owns the # Slack edge). Set these to run `pnpm channel`; the native `pnpm dev` ignores # them. The agent brain reuses AGENT_URL / AGENT_AUTH_HEADER above. # Gateway runner WebSocket URL (the /runner socket hosting the bot-IO channel). # INTELLIGENCE_GATEWAY_WS_URL=wss://gateway.intelligence.example/runner # Project runtime API key (cpk-…) — presented as the socket authToken. # INTELLIGENCE_API_KEY=cpk-... # Product organization id (as issued by Intelligence). # INTELLIGENCE_ORG_ID=org_... # Numeric project id (the channel topic is channels:project:). # INTELLIGENCE_PROJECT_ID=123 # Channel id + immutable project-unique channel name (from Intelligence Channel setup). # INTELLIGENCE_CHANNEL_ID=channel_... # INTELLIGENCE_CHANNEL_NAME=triage # Optional: stable runtime instance id; a random rti_… is generated if unset. # INTELLIGENCE_RUNTIME_INSTANCE_ID=rti_... # ── Linear MCP ────────────────────────────────────────────────────────── # The hosted Linear MCP accepts a raw API key as a bearer token (no OAuth # dance). Create one at linear.app → Settings → API → Personal API keys. # Leave LINEAR_API_KEY blank to run without Linear. LINEAR_API_KEY=lin_api_... # Override only if you front the MCP yourself; default is the hosted server. # LINEAR_MCP_URL=https://mcp.linear.app/mcp # Default Linear team the bot files/queries against. LINEAR_TEAM_KEY=CPK # ── Notion MCP ────────────────────────────────────────────────────────── # Run the official Notion MCP as a Streamable-HTTP sidecar: `pnpm notion-mcp`. # NOTION_TOKEN is the Notion integration secret the sidecar uses to call the # Notion API (notion.so → Settings → Connections → develop integrations). # NOTION_MCP_AUTH_TOKEN is the bearer the sidecar requires on its HTTP # transport; the agent sends it. Pick any strong string and use it in both # `pnpm notion-mcp` and here. Leave NOTION_MCP_AUTH_TOKEN blank to run # without Notion. NOTION_TOKEN=ntn_... NOTION_MCP_AUTH_TOKEN=choose-a-strong-shared-secret # Override only if the sidecar runs elsewhere; default is the local sidecar. # NOTION_MCP_URL=http://127.0.0.1:3001/mcp # ── WhatsApp Cloud API (optional — omit to run Slack-only) ────────────── # From your Meta App → WhatsApp → API Setup. Leave WHATSAPP_ACCESS_TOKEN blank # to disable the WhatsApp adapter entirely. Use a System User token in prod # (the temporary token expires in 24h). WHATSAPP_ACCESS_TOKEN= WHATSAPP_PHONE_NUMBER_ID= WHATSAPP_APP_SECRET= WHATSAPP_VERIFY_TOKEN=choose-any-string-and-paste-it-in-the-webhook-config # Webhook path (default /webhook). The server listens on $PORT — Railway injects # it and routes the service's public domain there; locally it defaults to 3000. # WHATSAPP_PATH=/webhook