Introduce GroupAiDialog component allowing users to chat with an AI assistant to generate or refine group notes.
Add useSpeechRecognition hook wrapping the Web Speech API for microphone support.
Implement converseAboutGroup server action to handle the AI conversation loop, supporting iterative questioning and final note generation.
Extract joinApiUrl helper in lib/ai-settings.ts for consistent endpoint URL construction.
- Add `AiSettingsCard` component and server actions for configuring an
OpenAI-compatible AI endpoint (e.g. OpenWebUI) from the admin panel
- Introduce `AiSettings` Prisma model with masked API key display and
connection testing UI
- Track `completedAt` on todos with a migration and backfill for existing
completed items
- Surface `createdAt`, `updatedAt`, and `completedAt` in the todo edit
dialog via a new `formatDateTime` utility
- Update `TodoDTO`, `getBoard`, `createTodo`, `toggleTodo`, and the board
context to carry and optimistically update timestamp fields
- Add `Select` UI component built on `@base-ui/react`
- Add Project model with owner-based access and cascade delete
- Restructure Category to belong to either Home (userId) or a Project (projectId), enforced by DB constraints and access filters
- Scope all board operations (create, update, delete, reorder) to the correct board context using `categoryAccessFilter` and `projectAccessFilter`
- Replace hardcoded `revalidatePath("/")` with dynamic `boardPath()` for proper cache invalidation
- Add `ProjectsProvider` and `ProjectsNavSection` for project sidebar navigation
- Make KanbanBoard accept `projectId` and `title` props to render Home or Project boards
- Extract `getBoard()` utility to centralize board data fetching
- Refactor group/todo/notes actions to derive board context from category membership rather than trusting caller input