Files
MeetVault/AGENTS.md
2026-09-30 00:50:44 +07:00

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.