K-10 pipeline transcripciones + settings IA + cache-aside + session doc
Nuevos modulos: - services/ai.ts: cliente IA provider-agnostico (OpenRouter, MiniMax) - services/db.ts: Dexie core con tabla settings + project_docs - services/storage.ts: Cache-Aside + Write-Through (L1 Map → L2 Dexie → L3 localStorage) - services/parse-transcription.ts: parser .docx/.vtt/.txt/.md - services/session-analyzer.ts: extraccion IA de sesiones (resumen, tareas, decisiones) - services/project-doc.ts: documento maestro MD (Bloque 1 resumen + Bloque 2 sesiones) - stores/settings.ts: proveedores IA, modelos, API keys separadas por provider - stores/transcriptions.ts: pipeline upload → analyze → create HU en KAPPA - views/SettingsView.vue: configuracion IA (OpenRouter, MiniMax, OpenCode bridge) - views/TranscriptionsView.vue: subida multiple + analisis sesion + visor MD + calendario - components/AiProjectChat.vue: chat contextual por proyecto con selector de modelo Cambios en existentes: - stores/auth.ts, kappa-api.ts, upload-hu.ts: migrados a storage service (Dexie + localStorage) - stores/projects.ts, workitems.ts: kappa_last_project via storage - DashboardView.vue: descripcion reemplazada por AiProjectChat - NewDashboardView.vue: tabs transcriptions + settings + navigate-settings events - NavMain.vue: items Transcripciones + Configuracion - SiteHeader.vue: labels tabs + language via storage - LoginView.vue: remember_email via storage - i18n: +80 keys español/ingles - vite.config.ts: proxy CORS para MiniMax - package.json: +mammoth.js
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
import { callAI } from '@/services/ai'
|
||||
|
||||
export interface SessionExtraction {
|
||||
sessionTitle: string
|
||||
summary: string
|
||||
objectives: { text: string; isNew: boolean }[]
|
||||
pendingTasks: { description: string; origin: string; priority: string }[]
|
||||
commitments: { description: string; responsible: string; dueDate: string; status: string }[]
|
||||
decisions: string[]
|
||||
completedTasks: string[]
|
||||
keyPoints: string[]
|
||||
}
|
||||
|
||||
const SESSION_SYSTEM_PROMPT = `Eres un asistente de gestión de proyectos. Analizás transcripciones de reuniones y extraés información estructurada.
|
||||
|
||||
Reglas:
|
||||
1. Identificá el título de la sesión basado en el contenido y fecha
|
||||
2. Extraé un resumen ejecutivo de 2-3 oraciones
|
||||
3. Listá objetivos mencionados, marcando cuáles son NUEVOS vs existentes
|
||||
4. Extraé tareas pendientes con su origen y prioridad (Alta/Media/Baja)
|
||||
5. Identificá compromisos con responsable, fecha límite y estado
|
||||
6. Listá decisiones tomadas durante la sesión
|
||||
7. Detectá tareas completadas (si hay evidencia)
|
||||
8. Incluí puntos clave, bloqueos o descubrimientos
|
||||
9. No inventes información que no esté en la transcripción
|
||||
10. Respondé SOLO con JSON válido
|
||||
|
||||
Formato de respuesta JSON:
|
||||
{
|
||||
"sessionTitle": "Título descriptivo de la sesión",
|
||||
"summary": "Resumen ejecutivo de 2-3 oraciones",
|
||||
"objectives": [
|
||||
{ "text": "Descripción del objetivo", "isNew": true }
|
||||
],
|
||||
"pendingTasks": [
|
||||
{ "description": "Descripción de la tarea", "origin": "Sesión o contexto", "priority": "Alta|Media|Baja" }
|
||||
],
|
||||
"commitments": [
|
||||
{ "description": "Compromiso", "responsible": "Nombre", "dueDate": "YYYY-MM-DD", "status": "Pendiente|Cumplido|Vencido" }
|
||||
],
|
||||
"decisions": ["Decisión 1", "Decisión 2"],
|
||||
"completedTasks": ["Tarea completada 1"],
|
||||
"keyPoints": ["Punto clave 1"]
|
||||
}`
|
||||
|
||||
export async function analyzeSession(
|
||||
transcription: string,
|
||||
projectName: string,
|
||||
signal?: AbortSignal
|
||||
): Promise<SessionExtraction> {
|
||||
const userContent = `Proyecto: ${projectName}\n\nTranscripción:\n${transcription}`
|
||||
|
||||
console.log(`[Alpha] Session analyze — project: ${projectName}, text: ${transcription.length} chars`)
|
||||
|
||||
const content = await callAI(
|
||||
[
|
||||
{ role: 'system', content: SESSION_SYSTEM_PROMPT },
|
||||
{ role: 'user', content: userContent },
|
||||
],
|
||||
0.3,
|
||||
4096,
|
||||
signal,
|
||||
)
|
||||
|
||||
try {
|
||||
const jsonStr = content.replace(/```json\s*/gi, '').replace(/```\s*$/g, '').trim()
|
||||
const result: SessionExtraction = JSON.parse(jsonStr)
|
||||
console.log(`[Alpha] Session analysis complete — ${result.pendingTasks.length} tasks, ${result.decisions.length} decisions`)
|
||||
return result
|
||||
} catch (e) {
|
||||
console.error('[Alpha] Failed to parse session analysis:', content)
|
||||
throw new Error('No se pudo parsear el análisis de la sesión')
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user