Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e2fe9c9
Add Email Summarizer Plugin and SMTP Email Service
AnkushMalaker Jan 17, 2026
d8c72e8
Refactor plugin management and introduce Email Summarizer setup
AnkushMalaker Jan 17, 2026
252f323
Merge branch 'feature/email-summarizer-plugin' into pre-release-candi…
AnkushMalaker Jan 17, 2026
f1dc63c
Enhance plugin configuration and documentation
AnkushMalaker Jan 17, 2026
623a0a9
Refactor plugin setup process to allow interactive user input
AnkushMalaker Jan 17, 2026
98195df
Add shared setup utilities for interactive configuration
AnkushMalaker Jan 17, 2026
accb880
Enhance plugin security architecture and configuration management
AnkushMalaker Jan 17, 2026
0a0a70e
Refactor backend components for improved functionality and stability
AnkushMalaker Jan 17, 2026
a2962cb
Refactor plugin setup timing to enhance configuration flow
AnkushMalaker Jan 17, 2026
1d63565
Refactor save_diarization_settings_controller to improve validation a…
AnkushMalaker Jan 17, 2026
8898b43
Refactor audio processing and conversation management for improved de…
AnkushMalaker Jan 18, 2026
d7f716d
Refactor audio and email handling for improved functionality and secu…
AnkushMalaker Jan 18, 2026
86d0975
Refactor audio upload functionality to remove unused parameters
AnkushMalaker Jan 18, 2026
0803f54
Refactor Email Summarizer plugin configuration for improved clarity a…
AnkushMalaker Jan 18, 2026
4f49de6
Update API key configuration in config.yml.template to use environmen…
roshatron2 Jan 18, 2026
152b24c
Refactor Redis job queue cleanup process for improved success tracking
AnkushMalaker Jan 18, 2026
e2886e9
fix tests
AnkushMalaker Jan 18, 2026
73f2d43
Update CI workflows to use 'docker compose' for log retrieval and add…
AnkushMalaker Jan 18, 2026
13ccb75
test fixes
AnkushMalaker Jan 18, 2026
ed6176c
FIX StreamingTranscriptionConsumer to support cumulative audio timest…
AnkushMalaker Jan 19, 2026
dbdf06c
Enhance test container setup and improve error messages in integratio…
AnkushMalaker Jan 19, 2026
fb8225d
Improve WebSocket closing logic and enhance integration test teardown
AnkushMalaker Jan 19, 2026
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
19 changes: 14 additions & 5 deletions .github/workflows/full-tests-with-api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -116,15 +116,23 @@ jobs:
echo "test_exit_code=$TEST_EXIT_CODE" >> $GITHUB_ENV
exit 0 # Don't fail here, we'll fail at the end after uploading artifacts

- name: Show service logs
- name: Save service logs to files
if: always()
working-directory: backends/advanced
run: |
echo "=== Backend Logs (last 50 lines) ==="
docker compose -f docker-compose-test.yml logs --tail=50 chronicle-backend-test
echo "Checking running containers..."
docker compose -f docker-compose-test.yml ps -a
echo ""
echo "=== Worker Logs (last 50 lines) ==="
docker compose -f docker-compose-test.yml logs --tail=50 workers-test
echo "Saving service logs to files..."
mkdir -p logs
docker compose -f docker-compose-test.yml logs chronicle-backend-test > logs/backend.log 2>&1 || true
docker compose -f docker-compose-test.yml logs workers-test > logs/workers.log 2>&1 || true
docker compose -f docker-compose-test.yml logs mongo-test > logs/mongo.log 2>&1 || true
docker compose -f docker-compose-test.yml logs redis-test > logs/redis.log 2>&1 || true
docker compose -f docker-compose-test.yml logs qdrant-test > logs/qdrant.log 2>&1 || true
docker compose -f docker-compose-test.yml logs speaker-service-test > logs/speaker.log 2>&1 || true
echo "✓ Logs saved to backends/advanced/logs/"
ls -lh logs/

- name: Check if test results exist
if: always()
Expand Down Expand Up @@ -200,6 +208,7 @@ jobs:
with:
name: robot-test-logs-full
path: |
backends/advanced/logs/*.log
backends/advanced/.env
tests/setup/.env.test
retention-days: 7
Expand Down
19 changes: 14 additions & 5 deletions .github/workflows/pr-tests-with-api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -110,15 +110,23 @@ jobs:
echo "test_exit_code=$TEST_EXIT_CODE" >> $GITHUB_ENV
exit 0 # Don't fail here, we'll fail at the end after uploading artifacts

- name: Show service logs
- name: Save service logs to files
if: always()
working-directory: backends/advanced
run: |
echo "=== Backend Logs (last 50 lines) ==="
docker compose -f docker-compose-test.yml logs --tail=50 chronicle-backend-test
echo "Checking running containers..."
docker compose -f docker-compose-test.yml ps -a
echo ""
echo "=== Worker Logs (last 50 lines) ==="
docker compose -f docker-compose-test.yml logs --tail=50 workers-test
echo "Saving service logs to files..."
mkdir -p logs
docker compose -f docker-compose-test.yml logs chronicle-backend-test > logs/backend.log 2>&1 || true
docker compose -f docker-compose-test.yml logs workers-test > logs/workers.log 2>&1 || true
docker compose -f docker-compose-test.yml logs mongo-test > logs/mongo.log 2>&1 || true
docker compose -f docker-compose-test.yml logs redis-test > logs/redis.log 2>&1 || true
docker compose -f docker-compose-test.yml logs qdrant-test > logs/qdrant.log 2>&1 || true
docker compose -f docker-compose-test.yml logs speaker-service-test > logs/speaker.log 2>&1 || true
echo "✓ Logs saved to backends/advanced/logs/"
ls -lh logs/

- name: Check if test results exist
if: always()
Expand Down Expand Up @@ -242,6 +250,7 @@ jobs:
with:
name: robot-test-logs-pr-labeled
path: |
backends/advanced/logs/*.log
backends/advanced/.env
tests/setup/.env.test
retention-days: 7
Expand Down
21 changes: 15 additions & 6 deletions .github/workflows/robot-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,15 +85,23 @@ jobs:
echo "test_exit_code=$TEST_EXIT_CODE" >> $GITHUB_ENV
exit 0 # Don't fail here, we'll fail at the end after uploading artifacts

- name: Show service logs
- name: Save service logs to files
if: always()
working-directory: backends/advanced
run: |
echo "=== Backend Logs (last 50 lines) ==="
docker compose -f docker-compose-test.yml logs --tail=50 chronicle-backend-test
echo "Checking running containers..."
docker compose -f docker-compose-test.yml ps -a
echo ""
echo "=== Worker Logs (last 50 lines) ==="
docker compose -f docker-compose-test.yml logs --tail=50 workers-test
echo "Saving service logs to files..."
mkdir -p logs
docker compose -f docker-compose-test.yml logs chronicle-backend-test > logs/backend.log 2>&1 || true
docker compose -f docker-compose-test.yml logs workers-test > logs/workers.log 2>&1 || true
docker compose -f docker-compose-test.yml logs mongo-test > logs/mongo.log 2>&1 || true
docker compose -f docker-compose-test.yml logs redis-test > logs/redis.log 2>&1 || true
docker compose -f docker-compose-test.yml logs qdrant-test > logs/qdrant.log 2>&1 || true
docker compose -f docker-compose-test.yml logs speaker-service-test > logs/speaker.log 2>&1 || true
echo "✓ Logs saved to backends/advanced/logs/"
ls -lh logs/

- name: Check if test results exist
if: always()
Expand Down Expand Up @@ -215,8 +223,9 @@ jobs:
if: failure()
uses: actions/upload-artifact@v4
with:
name: robot-test-logs
name: robot-test-logs-no-api
path: |
backends/advanced/logs/*.log
backends/advanced/.env
tests/setup/.env.test
retention-days: 7
Expand Down
25 changes: 25 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,31 @@ OLLAMA_BASE_URL=http://ollama:11434
SPEAKER_SERVICE_URL=http://speaker-recognition:8085
```

### Plugin Security Architecture

**Three-File Separation**:

1. **backends/advanced/.env** - Secrets (gitignored)
```bash
SMTP_PASSWORD=abcdefghijklmnop
OPENAI_API_KEY=sk-proj-...
```

2. **config/plugins.yml** - Orchestration (uses env var references)
```yaml
plugins:
email_summarizer:
enabled: true
smtp_password: ${SMTP_PASSWORD} # Reference, not actual value!
```

3. **plugins/{plugin_id}/config.yml** - Non-secret defaults
```yaml
subject_prefix: "Conversation Summary"
```

**CRITICAL**: Never hardcode secrets in `config/plugins.yml`. Always use `${ENV_VAR}` syntax.

## Quick API Reference

### Common Endpoints
Expand Down
46 changes: 45 additions & 1 deletion backends/advanced/.env.template
Original file line number Diff line number Diff line change
Expand Up @@ -58,5 +58,49 @@ LANGFUSE_SECRET_KEY=
# Tailscale auth key (for remote service access)
TS_AUTHKEY=

# Home Assistant long-lived access token (for voice control plugin)
# ========================================
# Plugin Configuration
# ========================================
# Plugin-specific configuration is in: backends/advanced/src/advanced_omi_backend/plugins/{plugin_id}/config.yml
# Plugin orchestration (enabled, events) is in: config/plugins.yml
# This section contains ONLY plugin secrets

# ---------------------------------------
# Home Assistant Plugin
# ---------------------------------------
# Enable in config/plugins.yml
# Configure in backends/advanced/src/advanced_omi_backend/plugins/homeassistant/config.yml

# Home Assistant server URL
HA_URL=http://homeassistant.local:8123

# Home Assistant long-lived access token
# Get from: Profile → Security → Long-Lived Access Tokens
HA_TOKEN=

# Wake word for voice commands (optional, default: vivi)
HA_WAKE_WORD=vivi

# Request timeout in seconds (optional, default: 30)
HA_TIMEOUT=30

# ---------------------------------------
# Email Summarizer Plugin
# ---------------------------------------
# Enable in config/plugins.yml
# Configure in backends/advanced/src/advanced_omi_backend/plugins/email_summarizer/config.yml

# SMTP server configuration
# For Gmail: Use App Password (requires 2FA enabled)
# 1. Go to Google Account → Security → 2-Step Verification
# 2. Scroll to "App passwords" → Generate password for "Mail"
# 3. Use the 16-character password below (no spaces)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USERNAME=your-email@gmail.com
SMTP_PASSWORD=your-app-password-here
SMTP_USE_TLS=true

# Email sender information
FROM_EMAIL=noreply@chronicle.ai
FROM_NAME=Chronicle AI
Loading
Loading