Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions .buildkite/scripts/smoke-app-in-image.ts
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ const commands: Record<
"test -x node_modules/youtube-dl-exec/bin/yt-dlp",
"timeout 10s node_modules/youtube-dl-exec/bin/yt-dlp --version",
"set +e",
'output="$(timeout 30s bun run src/index.ts 2>&1)"',
'output="$(timeout 30s bun run scripts/start.ts 2>&1)"',
"status=$?",
String.raw`printf '%s\n' "$output"`,
String.raw`[ "$status" -eq 124 ] || printf "%s\n" "$output" | grep -iE "` +
Expand All @@ -210,11 +210,10 @@ const commands: Record<
].join("\n"),
env: {
DISCORD_TOKEN: "smoke-test-dummy",
DISCORD_CLIENT_ID: "smoke-test-dummy",
DISCORD_CLIENT_ID: "1".repeat(18),
ANTHROPIC_API_KEY: "smoke-test-dummy",
OPENAI_API_KEY: "smoke-test-dummy",
DATABASE_URL: "file:/tmp/smoke-test.db",
MEMORY_DB_PATH: "file:/tmp/birmel-memory.db",
TELEMETRY_ENABLED: "false",
},
},
Expand Down
3 changes: 1 addition & 2 deletions .quality-baseline.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,12 @@
},
"prettier-ignore": {},
"hermeticity-exempt": {},
"updated": "2026-07-11",
"updated": "2026-08-08",
"test-skips": {
"packages/discord-plays-pokemon/packages/backend/src/emulator/audio/audio-fingerprint.test.ts": 1,
"packages/homelab/src/helm-types/src/real-world-charts.test.ts": 4
},
"placeholder-assertions": {
"packages/birmel/src/agent-tools/tools/automation/automation.test.ts": 7,
"packages/discord-plays-pokemon/packages/backend/src/emulator/audio/audio-fingerprint.test.ts": 1,
"packages/homelab/src/helm-types/src/type-converter.test.ts": 1,
"packages/homelab/src/helm-types/src/yaml-preprocessing.test.ts": 1,
Expand Down
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ packages/
├── anki/ # Anki flashcard tools
├── astro-opengraph-images/ # Astro OpenGraph image generation (npm)
├── better-skill-capped/ # Browser extension
├── birmel/ # Discord bot (VoltAgent + Claude AI)
├── birmel/ # Discord bot (AI SDK explicit agent runtime)
├── cooklang-for-obsidian/ # Cooklang Obsidian plugin
├── cooklang-rich-preview/ # Cooklang rich link preview site
├── discord-plays-pokemon/ # Discord Plays Pokemon (headless emulator + Go-Live stream)
Expand Down Expand Up @@ -344,7 +344,7 @@ Feature PRs are created and updated with `git-spice` as stacks; a single PR is a

Each package has its own AGENTS.md with specific instructions:

- `packages/birmel/AGENTS.md` - VoltAgent setup, Discord bot config
- `packages/birmel/AGENTS.md` - explicit agent runtime, Discord bot config
- `packages/homelab/AGENTS.md` - K8s, cdk8s, OpenTofu infrastructure
- `packages/scout-for-lol/AGENTS.md` - Match analysis pipeline
- `packages/resume/AGENTS.md` - Resume site
Expand Down
333 changes: 3 additions & 330 deletions bun.lock

Large diffs are not rendered by default.

130 changes: 91 additions & 39 deletions packages/birmel/.env.example
Original file line number Diff line number Diff line change
@@ -1,60 +1,112 @@
# Required - Discord Bot Credentials
# Required credentials
DISCORD_TOKEN=
DISCORD_CLIENT_ID=

# Required - AI Services
ANTHROPIC_API_KEY=
OPENAI_API_KEY=

# Trusted capability boundary: JSON array of Discord user snowflakes.
# Omit to use the repository's documented allowlist; malformed JSON/IDs fail startup.
# TRUSTED_USER_IDS=["186665676134547461"]

# Models and bounded agent runtime
OPENAI_MODEL=gpt-5.6-sol
OPENAI_CLASSIFIER_MODEL=gpt-5.4-nano
OPENAI_MEMORY_MODEL=gpt-5.4-nano
OPENAI_EMBEDDING_MODEL=text-embedding-3-small
OPENAI_REASONING_EFFORT=medium
OPENAI_TEXT_VERBOSITY=low
OPENAI_MAX_TOKENS=4096
AGENT_MAX_STEPS=8
AGENT_RESPONSE_TIMEOUT_MS=120000
AGENT_ROUTER_TIMEOUT_MS=30000

# Product database. The historical mastra-memory.db is intentionally not configured.
DATABASE_URL=file:./data/birmel.db

# Optional - Database
DATABASE_PATH=./data/birmel.db
# Conversational admission and bounded raw transcript
RESPONDER_ENABLED=true
RESPONDER_ENGAGEMENT_WINDOW_MS=180000
RESPONDER_TRANSCRIPT_WINDOW_MS=3600000
RESPONDER_TRANSCRIPT_MAX_MESSAGES=50

# Optional - Daily Posts
# Scheduler and durable jobs
SCHEDULER_ENABLED=true
SCHEDULER_TICK_INTERVAL_MS=10000
SCHEDULER_SHUTDOWN_TIMEOUT_MS=30000
SCHEDULER_MAX_TASKS_PER_GUILD=100
SCHEDULER_MAX_RECURRING_TASKS=50

# Daily posts
DAILY_POSTS_ENABLED=true
DAILY_POST_TIME=09:00
DAILY_POST_TIMEZONE=America/Los_Angeles

# Optional - Voice/TTS
# Browser automation
BROWSER_ENABLED=true
BROWSER_PROVIDER=pinchtab
BROWSER_HEADLESS=true
BROWSER_VIEWPORT_WIDTH=1280
BROWSER_VIEWPORT_HEIGHT=720
BROWSER_MAX_SESSIONS=5
BROWSER_SESSION_TIMEOUT_MS=300000
PINCHTAB_BASE_URL=http://localhost:9867
PINCHTAB_TOKEN=
PINCHTAB_PROFILE=birmel
# BROWSER_USER_AGENT=

# Shell, editor, and external APIs
SHELL_ENABLED=true
SHELL_DEFAULT_TIMEOUT=30000
SHELL_MAX_TIMEOUT=300000
EDITOR_ENABLED=false
EDITOR_ALLOWED_REPOS=[]
EDITOR_MAX_SESSION_DURATION_MS=1800000
EDITOR_MAX_SESSIONS_PER_USER=1
EDITOR_OAUTH_HOST=0.0.0.0
EDITOR_OAUTH_PORT=4112
EDITOR_GITHUB_CLIENT_ID=
EDITOR_GITHUB_CLIENT_SECRET=
EDITOR_GITHUB_CALLBACK_URL=
NEWS_API_KEY=
RIOT_API_KEY=
WEB_SEARCH_PROVIDER=openai

# Persona and scheduled social features
PERSONA_ENABLED=true
PERSONA_DEFAULT=virmel
PERSONA_STYLE_MODEL=gpt-5.4-nano
BIRTHDAYS_ENABLED=true
BIRTHDAYS_DEFAULT_TIMEZONE=UTC
BIRTHDAYS_ANNOUNCEMENT_CHANNEL_ID=
BIRTHDAYS_ROLE_ID=
ACTIVITY_TRACKING_ENABLED=true
ACTIVITY_ROLE_TIERS=[]
ELECTIONS_ENABLED=true
ELECTION_CHANNEL_ID=
ELECTION_START_TIME=17:00
ELECTION_END_TIME=19:00
ELECTION_TIMEZONE=America/Los_Angeles

# Health and observability
HEALTH_PORT=8080
LOG_LEVEL=info
TELEMETRY_ENABLED=true
TELEMETRY_SERVICE_NAME=birmel
OTLP_ENDPOINT=http://tempo.tempo.svc.cluster.local:4318
SENTRY_ENABLED=false
SENTRY_DSN=
SENTRY_ENVIRONMENT=development
SENTRY_SAMPLE_RATE=1
SENTRY_TRACES_SAMPLE_RATE=0
SENTRY_DEBUG=false

# Voice/music and live E2E
ANTHROPIC_API_KEY=replace-with-anthropic-key
VOICE_ENABLED=true
TTS_VOICE=nova
TTS_SPEED=1.0
VOICE_ENABLED=true

# Optional - live music E2E (`bun run test:e2e:music`) and YouTube stream E2E (`bun run test:e2e:youtube-stream`)
BIRMEL_E2E_GUILD_ID=
BIRMEL_E2E_TEXT_CHANNEL_ID=
BIRMEL_E2E_VOICE_CHANNEL_ID=
BIRMEL_E2E_YOUTUBE_QUERY=
BIRMEL_E2E_PLAYBACK_SECONDS=5
BIRMEL_E2E_TIMEOUT_MS=45000

# Optional - External APIs
NEWS_API_KEY=
RIOT_API_KEY=
WEB_SEARCH_PROVIDER=openai

# Optional - Browser automation
BROWSER_PROVIDER=pinchtab
PINCHTAB_BASE_URL=http://localhost:9867
PINCHTAB_TOKEN=
PINCHTAB_PROFILE=birmel

# Optional - Observability
LOG_LEVEL=info
# SENTRY_DSN=https://4fec575b459a4afe9b1230d29313a64c@bugsink.sjer.red/7
# OTLP_ENDPOINT=http://tempo.tempo.svc.cluster.local:4318
# TELEMETRY_ENABLED=true

# Optional - Memory store
# MEMORY_DB_PATH=file:/app/data/birmel-memory.db

# Optional - Conversational responder (GPT-nano follow-up trigger + transcript)
# RESPONDER_ENABLED=true
# RESPONDER_ENGAGEMENT_WINDOW_MS=180000
# RESPONDER_TRANSCRIPT_MIN_MESSAGES=25
# RESPONDER_TRANSCRIPT_WINDOW_MS=3600000
# RESPONDER_TRANSCRIPT_MAX_MESSAGES=100
# OPENAI_CLASSIFIER_MODEL=gpt-5.4-nano
Loading