dual storage: sesiones en BD + markdown como output
- db.ts: v3 con tablas sessions, session_summaries, project_state - transcriptions-db.ts: CRUD para sesiones, summaries, project state - project-doc.ts: generateMasterDoc() desde BD (no desde datos en memoria) - session-analyzer.ts: +sessionDate en prompt y extraction - TranscriptionsView: flujo parse -> guardar BD -> IA -> project_state -> MD - docs/arquitectura_transcripciones.md: documentacion oficial del patron
This commit is contained in:
@@ -0,0 +1,180 @@
|
||||
# Sistema de Transcripciones — Arquitectura
|
||||
|
||||
> Documentación oficial del pipeline transcripciones en Alpha.
|
||||
> Este patrón se hereda a RUMBO.
|
||||
|
||||
---
|
||||
|
||||
## Filosofía
|
||||
|
||||
```
|
||||
BD (Dexie/SQLite) = Fuente de verdad
|
||||
Markdown = Output generado (nunca se edita manualmente)
|
||||
```
|
||||
|
||||
El markdown es un **artefacto derivado**. Siempre se regenera desde la BD.
|
||||
Si necesitás modificar algo, se actualiza la BD y se regenera el `.md`.
|
||||
|
||||
---
|
||||
|
||||
## Estructura de Datos
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ DATABASE (Dexie/IndexedDB) │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ sessions │
|
||||
│ ├── id: number ← PK autoincrement │
|
||||
│ ├── projectId: number ← FK a proyectos │
|
||||
│ ├── date: string ← Fecha de la sesión │
|
||||
│ ├── title: string ← Título (ej: "Kickoff") │
|
||||
│ ├── fileName: string ← Archivo original subido │
|
||||
│ ├── fileType: string ← docx|vtt|txt|md │
|
||||
│ ├── fileSize: number ← bytes │
|
||||
│ ├── rawText: string ← Texto completo parseado │
|
||||
│ └── processedAt: string ← ISO timestamp │
|
||||
│ │
|
||||
│ session_summaries │
|
||||
│ ├── sessionId: number ← PK = FK → sessions.id │
|
||||
│ ├── summary: string ← Resumen ejecutivo │
|
||||
│ ├── objectives: string ← JSON array │
|
||||
│ ├── tasks: string ← JSON array │
|
||||
│ ├── commitments: string ← JSON array │
|
||||
│ ├── decisions: string ← JSON array │
|
||||
│ ├── keyPoints: string ← JSON array │
|
||||
│ └── modelUsed: string ← Modelo IA usado │
|
||||
│ │
|
||||
│ project_state │
|
||||
│ ├── projectId: number ← PK │
|
||||
│ ├── summary: string ← Resumen consolidado │
|
||||
│ ├── objectives: string ← JSON array (unificado) │
|
||||
│ ├── tasks: string ← JSON array (consolidado) │
|
||||
│ ├── commitments: string ← JSON array (consolidado) │
|
||||
│ └── updatedAt: string ← ISO timestamp │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ OUTPUT (Markdown) │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 📄 master-[proyecto].md │
|
||||
│ │
|
||||
│ ├── BLOQUE 1 — Consolidado Global │
|
||||
│ │ ├── Resumen ejecutivo (desde project_state) │
|
||||
│ │ ├── Objetivos │
|
||||
│ │ ├── Tareas pendientes (con checkbox) │
|
||||
│ │ └── Compromisos (con estados) │
|
||||
│ │ │
|
||||
│ └── BLOQUE 2 — Detalle por Sesión │
|
||||
│ ├── 📍 Sesión YYYY-MM-DD — Título │
|
||||
│ │ ├── Resumen │
|
||||
│ │ ├── Objetivos │
|
||||
│ │ ├── Tareas │
|
||||
│ │ ├── Compromisos │
|
||||
│ │ └── Transcripción completa │
|
||||
│ └── ... │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Flujo Completo
|
||||
|
||||
```
|
||||
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
|
||||
│ SUBIR │ → │ PARSEAR │ → │ GUARDAR │ → │ EXTRAER │
|
||||
│ .docx │ │ .vtt │ │ EN BD │ │ CON IA │
|
||||
│ .vtt │ │ .txt │ │ sessions │ │ │
|
||||
│ .txt │ │ .md │ │ │ │ │
|
||||
│ .md │ │ │ │ │ │ │
|
||||
└──────────┘ └──────────┘ └──────────┘ └──────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────┐
|
||||
│ GUARDAR │
|
||||
│ RESULT │
|
||||
│ EN BD │
|
||||
│summaries │
|
||||
└──────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────┐
|
||||
│ ACTUALIZ │
|
||||
│ project │
|
||||
│ _state │
|
||||
└──────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────┐
|
||||
│ GENERAR │
|
||||
│ .md │
|
||||
└──────────┘
|
||||
```
|
||||
|
||||
### Paso a paso
|
||||
|
||||
| Paso | Acción | Tabla afectada |
|
||||
|------|--------|----------------|
|
||||
| 1 | Usuario sube archivo(s) | — |
|
||||
| 2 | Parsear a texto plano (mammoth para .docx, regex para .vtt) | — |
|
||||
| 3 | Guardar transcripción cruda en BD | `sessions` (INSERT) |
|
||||
| 4 | Enviar a IA para extracción estructurada | — |
|
||||
| 5 | Guardar resultado de IA en BD | `session_summaries` (INSERT) |
|
||||
| 6 | Recalcular estado consolidado del proyecto | `project_state` (UPSERT) |
|
||||
| 7 | Regenerar documento markdown | — (derivado de BD) |
|
||||
|
||||
---
|
||||
|
||||
## Por qué dual storage (BD + Markdown)
|
||||
|
||||
| Problema | Solución con BD |
|
||||
|----------|----------------|
|
||||
| Buscar dentro de transcripciones viejas | `SELECT * FROM sessions WHERE rawText LIKE '%keyword%'` |
|
||||
| Marcar tarea como completada | `UPDATE project_state SET tasks = ...` sin re-procesar nada |
|
||||
| Regenerar Bloque 1 al agregar sesión nueva | Read de BD, no re-procesar sesiones anteriores |
|
||||
| Versiones históricas | Cada sesión es un registro independiente |
|
||||
| Compartir con alguien que no tiene la app | Exportar `.md` — es legible en cualquier editor |
|
||||
| Backup | La BD se puede respaldar; el `.md` es un snapshot legible |
|
||||
|
||||
### Por qué el markdown NO es fuente de verdad
|
||||
|
||||
- **No se edita manualmente.** Si alguien modifica el `.md`, esos cambios se pierden al regenerar.
|
||||
- **Es un snapshot.** Siempre se puede regenerar desde la BD.
|
||||
- **Es portable.** Se puede compartir, subir a GitHub, etc.
|
||||
|
||||
---
|
||||
|
||||
## Comparación con la implementación anterior
|
||||
|
||||
| Aspecto | Antes (v1) | Ahora (v2) |
|
||||
|---------|------------|------------|
|
||||
| Storage | Solo markdown en `project_docs` | BD estructurada + markdown generado |
|
||||
| Transcripciones | Solo en memoria | Persistidas en `sessions` |
|
||||
| Búsqueda | Imposible | Query SQL por texto |
|
||||
| Estado consolidado | Recalculado cada vez desde las sesiones | Cacheado en `project_state` |
|
||||
| Editar tarea | Había que re-procesar la sesión | UPDATE directo a `project_state` |
|
||||
| Sesiones individuales | Incrustadas en markdown | Registros independientes |
|
||||
|
||||
---
|
||||
|
||||
## Consideraciones para RUMBO
|
||||
|
||||
En RUMBO (Tauri + Turso/libSQL), el schema es idéntico pero cambia el engine:
|
||||
|
||||
```
|
||||
Alpha (browser): Dexie + IndexedDB → Markdown descargable
|
||||
RUMBO (desktop): Turso + libSQL → Markdown exportable + auto-sync
|
||||
```
|
||||
|
||||
Las tablas, tipos y flujo son los mismos. Solo cambia:
|
||||
- `db.sessions.put()` → `INSERT OR REPLACE INTO sessions`
|
||||
- El markdown se escribe a archivo en `~/RUMBO/projects/[id]/master.md`
|
||||
|
||||
---
|
||||
|
||||
*Documentado: 2026-05-28*
|
||||
*Validado en: Alpha*
|
||||
*Destino: RUMBO*
|
||||
Reference in New Issue
Block a user