Saltar a contenido

Calendario y reuniones

Responsabilidad

Calendario agrega los eventos locales del vault y los de las cuentas conectadas de Google Calendar y CalDAV. Permite seleccionar calendarios, crear, leer, actualizar y eliminar eventos, enviar invitaciones, responder a ellas (RSVP), consultar disponibilidad, geocodificar, gestionar recordatorios y eventos ocultos, exportar ICS, grabar reuniones, transcribirlas y generar notas con IA.

El frontend features/calendar/, estrictamente tipado, gestiona la página de calendario, la selección de fuentes, la búsqueda, la coordinación de recurrencias y los diálogos de la página. Su entrada pública conserva el límite original de carga diferida. Los componentes de renderizado del calendario que también consumen Vault y Mail siguen compartidos fuera de la feature de ruta; no cambian los adaptadores de proveedores, los observadores de recordatorios ni los payloads de eventos.

features/meetings/ gestiona la grabadora flotante, su controlador de captura y subida, y la presentación de recordatorios. Su entrada pública difiere de forma independiente los módulos de grabación y recordatorios. El shell los monta con los mismos controles de plugins; el traslado no cambia los permisos de grabación, las consultas periódicas, la navegación ni los payloads.

La frontera HTTP está tipada estrictamente y conserva el contrato de respuesta existente. La normalización de etiquetas de Photon, el rechazo de URL, la validación de resultados y la deduplicación pertenecen al dominio de geocodificación de Calendar, no al módulo de rutas; los payloads de proveedores se validan en esa frontera de adaptación.

El servicio híbrido de proveedores está estrictamente tipado y mantiene Google como un adaptador junto al CalDAV genérico. La detección de cuentas CalDAV admite Nextcloud, iCloud, Fastmail, Radicale y servidores compatibles mediante URL configuradas, sin comportamiento ligado al proveedor de almacenamiento.

La ruta híbrida consulta directamente a los proveedores externos. Abrir el calendario no inicia un segundo espejo del proveedor hacia el vault, por lo que los refrescos del índice de páginas no pueden duplicar ni retrasar las lecturas de Google y CalDAV. El Markdown existente bajo Calendar/External sigue siendo datos del usuario y esta transición nunca lo elimina, pero el entorno web ya no actualiza ese espejo heredado.

Agregación de eventos

La capa de rutas resuelve el contexto del workspace y las integraciones seleccionadas, y normaliza los eventos de proveedores y los eventos Markdown locales en una respuesta común. Los identificadores de proveedor conservan su cuenta y calendario de origen; un identificador aislado no garantiza la unicidad global necesaria para modificar un evento.

Los eventos ocultos se registran en una capa local superpuesta. Ocultar un evento no lo elimina del proveedor. Volver a mostrarlo elimina esa marca local, de modo que la siguiente agregación lo incluya de nuevo.

Flujo de mutación

sequenceDiagram
    participant UI as Calendar UI
    participant API as Calendar routes
    participant Resolver as Integration resolver
    participant Provider as Google or CalDAV
    participant Vault as Local event page
    UI->>API: Create, patch, delete, RSVP, or invite
    API->>Resolver: Resolve account and enforce editor role
    alt Remote event
        Resolver->>Provider: Provider-specific operation
        Provider-->>API: Normalized event or error
    else Vault event
        Resolver->>Vault: Contained Markdown operation
        Vault-->>API: Updated local event
    end
    API-->>UI: Unified response

Recordatorios y notas de reunión

Los ajustes de recordatorios determinan la antelación y el comportamiento. La recopilación combina los próximos eventos y deduplica las peticiones concurrentes para evitar recordatorios duplicados. El observador del frontend muestra los recordatorios activos y permite ir al calendario o descartarlos.

La persistencia de recordatorios restringe su estado JSON a ajustes explícitos, claves de notificaciones ya emitidas y objetos de recordatorios activos. El análisis temporal acepta valores de proveedores en un único límite, las etiquetas de asistentes se normalizan a cadenas y la salida de IA se convierte antes de almacenarse. El bloqueo de todo el ciclo y la fusión con el estado recién leído siguen resolviendo las condiciones de carrera entre planificador y API.

La grabación de reuniones sube audio de tamaño acotado a un flujo de trabajo en segundo plano. Las consultas periódicas de estado distinguen grabación, transcripción, resumen, creación de notas, finalización y fallo. Las notas generadas se escriben mediante operaciones seguras del vault y conservan el contexto del evento y de la fuente. El servicio en segundo plano normaliza el resultado de la ruta heredada del vault a un mapeo concreto antes de leer el identificador de la página creada; los handlers dinámicos de compatibilidad no atraviesan el límite tipado del trabajo. Las respuestas de grabación y consulta de estado pasan por modelos Pydantic específicos, pero siguen devolviendo los mismos diccionarios directamente indexables que utilizan los llamadores existentes.

Invariantes

  • La identidad del evento del proveedor incluye el contexto de cuenta y calendario.
  • Las escrituras de calendario requieren un contexto con permisos de editor.
  • Los eventos locales identificados por ruta permanecen dentro del vault activo.
  • La ocultación es local y reversible; la eliminación utiliza el proveedor autoritativo.
  • Los recordatorios resisten condiciones de carrera y no se duplican para el mismo evento y ventana temporal.
  • La ausencia de proveedores de transcripción o IA hace fallar el trabajo de la reunión, no el calendario.
  • La salida del ICS utiliza zonas horarias normalizadas y no expone credenciales privadas.

Enfoque de verificación

Pruebe el confinamiento de rutas locales, la normalización de eventos, las recurrencias, los eventos ocultos, las condiciones de carrera de recordatorios, la selección de cuentas, las zonas horarias y los flujos de creación, edición y eliminación con Playwright. La QA de reuniones debe grabar o subir un archivo de prueba, observar el estado en segundo plano y verificar la página resultante del vault.