auto(0129): agents_dashboard — secret_store_cpp_infra + CMakeLists register #4

Open
dataforge wants to merge 615 commits from auto/0129 into master
Showing only changes of commit 282c2e3ba8 - Show all commits
@@ -0,0 +1,71 @@
---
id: "0094"
title: "kanban: bocadillo del agente + PDF descargable en reporte diario"
status: open
created_at: 2026-05-14
priority: medium
app: kanban
---
## Problema
El reporte diario (issue 0093) muestra tablas y graficos pero no resume el dia en lenguaje natural ni permite compartir el listado de tareas con solicitantes externos.
## Solucion
### Backend
Migration 013 anade:
- `daily_summaries (date PK, summary, prompt, model, generated_at, generated_by)` para cachear el resumen del agente por dia.
- `settings (key PK, value, updated_at, updated_by)` clave/valor con un seed `daily_report_prompt` por defecto.
Funciones en `daily_summary.go`:
- `GetDailySummary(date)` / `UpsertDailySummary(rec)`.
- `GetSetting(key)` / `SetSetting(key, value, by)`.
- `runClaudePrompt(ctx, prompt)` ejecuta `claude -p --model <m>` con stdin = prompt y devuelve stdout. Reutiliza `claudeBinary()` y `claudeModel()` del chat.
- `BuildDailySummaryPrompt(template, report)` interpola la plantilla con el JSON del reporte.
- `GenerateDailySummary(ctx, date, tz, actor)` orquesta: report + template + claude + persist.
Endpoints:
- `GET /api/reports/daily/summary?date=YYYY-MM-DD` -> {exists, summary, prompt, model, generated_at, generated_by}.
- `POST /api/reports/daily/summary?date=...&tz=...` regenera y persiste.
- `GET /api/settings/{key}` -> {key, value}.
- `PUT /api/settings/{key}` body {value} -> 204.
### Frontend
`DailyReportView` ahora:
- Carga el resumen al abrir (`getDailySummary`). Si no existe, muestra placeholder "Aun no hay resumen del dia".
- Bocadillo visual: `Paper` azul claro con borde izquierdo gordo + icono `IconSparkles`, texto del resumen, fecha de generacion + modelo.
- Boton `IconRefresh` -> `generateDailySummary`. Loader durante la llamada.
- Boton `IconSettings` abre modal con el prompt actual (cargado via `getSetting`). Botones Guardar, Cancelar, Restablecer por defecto.
- Filtros nuevos en la tabla de tareas hechas: `Select` solicitante + `Select` asignado. La tabla y el contador "N k/total" reflejan el filtro.
- Boton "PDF": abre ventana nueva con HTML print-ready (page A4, CSS inline) que incluye:
* Cabecera + sub con filtros activos.
* 4 KPIs (Hechas filtradas, Lead time avg, Deadlines on-time, Reabiertas).
* Resumen del agente como blockquote azul (si existe).
* Tabla con links absolutos `${origin}/?card=${id}` para que el solicitante pueda saltar a cada card.
* Auto `window.print()` al cargar.
### Tests
`e2e/daily-summary-pdf.spec.ts`:
- CRUD roundtrip del setting `daily_report_prompt`.
- GET summary del dia devuelve estructura coherente (exists, summary).
- UI: modal del reporte expone boton PDF, boton Configurar prompt y boton Regenerar.
No invocamos `claude -p` real en CI (depende del binario externo). El generador se prueba manualmente.
## Criterios de aceptacion
- [ ] Migration 013 crea ambas tablas con seed del prompt por defecto.
- [ ] Bocadillo del agente arriba de "Tareas hechas".
- [ ] Boton Regenerar invoca al agente, persiste y actualiza la UI.
- [ ] Modal de configuracion permite editar y guardar el prompt; reset.
- [ ] Filtros solicitante/asignado actualizan tabla y PDF.
- [ ] PDF con tabla, KPIs y enlaces internos a cada card.
## Rama / commits
- Rama: `issue/0094-kanban-daily-summary-pdf`
- Merge `--no-ff` a master.