Skip to content
Open
Show file tree
Hide file tree
Changes from all 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.

131 changes: 92 additions & 39 deletions packages/birmel/.env.example
Original file line number Diff line number Diff line change
@@ -1,60 +1,113 @@
# 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
SCHEDULER_MAX_CONCURRENT_JOBS=5

# 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