7d299554bf
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
50 lines
1.7 KiB
TypeScript
50 lines
1.7 KiB
TypeScript
import * as XLSX from 'xlsx'
|
|
import { kappa } from '@/services/kappa-api'
|
|
import { storage } from '@/services/storage'
|
|
import type { HuDraftRecord } from '@/services/tauri-db'
|
|
|
|
const BASE = '/api'
|
|
|
|
async function uploadExcel(initiativeId: number, file: Blob): Promise<Response> {
|
|
const token = storage.get('kappa_token')
|
|
const formData = new FormData()
|
|
formData.append('file', file, 'HistoriasUsuario.xlsx')
|
|
return fetch(`${BASE}/userstorys/upload-excel/${initiativeId}/`, {
|
|
method: 'POST',
|
|
headers: token ? { 'Authorization': `Bearer ${token}` } : {},
|
|
body: formData,
|
|
})
|
|
}
|
|
|
|
export async function pushDraftsToKappa(drafts: HuDraftRecord[], initiativeId: number): Promise<{ ok: number; fail: number }> {
|
|
const wb = XLSX.utils.book_new()
|
|
|
|
const rows = drafts.map(d => ({
|
|
Titulo: d.hierarchy_path ? `[${d.hierarchy_path}] ${d.title}` : d.title,
|
|
Descripción: d.description || '',
|
|
'Story points': d.story_points ?? '',
|
|
Prioridad: null,
|
|
Asignado_a: d.assigned_to ?? null,
|
|
'Criterios aceptación': d.acceptance_criteria || '',
|
|
}))
|
|
|
|
const ws = XLSX.utils.json_to_sheet(rows)
|
|
XLSX.utils.book_append_sheet(wb, ws, 'HistoriasUsuario')
|
|
|
|
const wbOut = XLSX.write(wb, { bookType: 'xlsx', type: 'array' })
|
|
const blob = new Blob([wbOut], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
|
|
|
|
try {
|
|
const resp = await uploadExcel(initiativeId, blob)
|
|
if (resp.ok) {
|
|
return { ok: drafts.length, fail: 0 }
|
|
}
|
|
const text = await resp.text()
|
|
console.error('[Alpha] Upload failed:', resp.status, text)
|
|
return { ok: 0, fail: drafts.length }
|
|
} catch (e) {
|
|
console.error('[Alpha] Upload error:', e)
|
|
return { ok: 0, fail: drafts.length }
|
|
}
|
|
}
|