83 lines
2.6 KiB
Markdown
83 lines
2.6 KiB
Markdown
# MeetVault — Agent Guide
|
|
|
|
## Repo layout
|
|
|
|
```text
|
|
MeetVault/
|
|
├── Overview/ # Architecture docs, schema, data flow
|
|
│ └── README.md
|
|
├── Wireframes/ # Desktop client design notes
|
|
│ └── Desktop/
|
|
│ ├── Desktop_README.md
|
|
│ └── Desktop-Demo/ # Runnable Tauri + React demo
|
|
│ └── speech-engine/ # Local Whisper transcription engine
|
|
```
|
|
|
|
## Core architecture (remember this)
|
|
|
|
- **User machine**: records audio/video, runs local Whisper for STT, sends transcript to backend. Keeps compute and cost on the device.
|
|
- **Backend API**: auth, meeting metadata, presigned upload URLs, transcript ingestion, summarization jobs, task extraction, reminder scheduling.
|
|
- **PostgreSQL**: structured app data + `processing_jobs` table used as a job queue (no external broker needed for MVP).
|
|
- **SeaweedFS**: S3-compatible object storage for large media files.
|
|
|
|
## PostgreSQL gotchas
|
|
|
|
### Enable UUID generation first
|
|
|
|
```sql
|
|
CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
|
```
|
|
|
|
### Always set `updated_at` manually
|
|
|
|
PostgreSQL does not auto-update it. Create a shared trigger function and apply to every table that tracks changes:
|
|
|
|
```sql
|
|
CREATE OR REPLACE FUNCTION set_updated_at()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = NOW();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- then attach per-table triggers, e.g.:
|
|
CREATE TRIGGER trg_meetings_updated_at
|
|
BEFORE UPDATE ON meetings FOR EACH ROW EXECUTE FUNCTION set_updated_at();
|
|
```
|
|
|
|
### Job queue pattern (no external broker)
|
|
|
|
Workers pick jobs with this exact query:
|
|
|
|
```sql
|
|
SELECT *
|
|
FROM processing_jobs
|
|
WHERE status = 'queued'
|
|
AND available_at <= NOW()
|
|
ORDER BY priority DESC, created_at
|
|
FOR UPDATE SKIP LOCKED
|
|
LIMIT 1;
|
|
```
|
|
|
|
Key indexes for workers:
|
|
|
|
```sql
|
|
CREATE INDEX idx_schedules_due ON meeting_schedules(status, scheduled_at);
|
|
CREATE INDEX idx_processing_jobs_queue ON processing_jobs(status, available_at, priority DESC);
|
|
```
|
|
|
|
### SeaweedFS object paths
|
|
|
|
Files live under: `meeting-storage/users/{user_id}/meetings/{meeting_id}/original/`
|
|
|
|
## Testing flow
|
|
|
|
1. Run the desktop demo locally (Tauri + React) to verify UI and local transcription without backend dependencies.
|
|
2. Spin up PostgreSQL, run the schema SQL from `Overview/README.md`, then start the backend API.
|
|
3. End-to-end: record a short clip on the desktop client → upload via presigned URL → ingest transcript → trigger summarization job → verify summary appears in DB.
|
|
|
|
## What is intentionally out of scope for MVP
|
|
|
|
- Kafka, Elasticsearch, Kubernetes, vector DBs, Redis (unless job volume grows), microservices. PostgreSQL + SeaweedFS + workers is sufficient.
|