Release v0.1.0-beta.2 — AI integration, schedule improvements, notification fixesFeature/ai agent#2
Merged
Merged
Conversation
added 30 commits
March 3, 2026 07:56
Update AI service to use date context and enable automatic date detection and day mode in the client for organization slots. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 47892e38-d961-4fcf-9430-12782d191e45 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/GU52eKA
Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: d741657b-3928-41a9-ab50-b0236e64ff11 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/GU52eKA
Update AI service to increase the maximum number of poll options and tokens, and adjust prompts to dynamically generate options based on user input rather than enforcing strict limits. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 2ce74e84-19da-40f1-8fd3-2fd8a4bd238a Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/jTXJ4fX
Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: d38f39be-00ce-4792-bb6d-9fd0fd2d8748 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/jTXJ4fX
…erience Update UI text for various settings, implement a new function to add slots at the top of a list, and adjust the default behavior for multiple slot bookings in AI-generated polls. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 3e6ecb3c-a051-4365-a032-0e39abe4421a Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/RuQUdq4
Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: fdc238dc-b6d7-4a03-bc60-7736edea3153 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/RuQUdq4
…t widget Integrates `@dnd-kit` for drag-and-drop reordering of poll options and updates `AiChatWidget.tsx` to dynamically generate quick suggestion chips based on poll settings and language, enhancing user interaction. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 651fc6f4-03a0-4c9b-96a4-24f583e21c2c Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/QOQoJOR
Adjust scroll target to the chat input and prevent auto-scroll on focus for a better user experience. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 4e84db23-8e23-4387-85fb-a0ce4693ad46 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/QOQoJOR
Rearrange the settings UI to consolidate daily organization, slot duration, and quick template options within the main "Einstellungen" collapsible section, simplifying the primary view for users. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 2f9eb720-825b-4ace-b81d-87ce995aebba Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/QOQoJOR
Remove all summary badges/pills from the collapsed settings header, including the broken translation key for results privacy. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: fc40ab4e-9265-4a4a-978e-70779625280d Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/QOQoJOR
Fixes the 503 error for AI model loading by introducing a specific AI_MODEL_LOADING error message and updating client-side error handling to parse and display backend errors. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: a7c5c0f0-46db-4efc-afed-4b35da0ec8fc Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/nVYVBx4
Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 640cd946-8e86-43fa-817b-e69c56367468 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/nVYVBx4
Increase the maximum character limits for poll descriptions and refinements in the AI backend and add character counters to the frontend chat widget. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 61dda38f-6940-42c3-bf59-765b970cb3a5 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/HZQtilW
Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: a3d02757-5f05-435a-a0a2-9ba6de0a9da1 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/HZQtilW
Add missing translation keys for 'settings' in both German and English locales for the poll creation form. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: fc30cc86-e21e-43ea-821b-b0f8121dd5e5 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/HZQtilW
Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 0b995fcb-f202-4104-a97f-a1d170213f93 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/HZQtilW
…isplay Implement free-text question type for surveys, update results chart to display open answers, and refine AI prompt for generating diverse question formats. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: c25e3c79-b62e-4f52-93fc-dfb943999e8a Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/poijNeB
Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 888d1bdd-5479-4187-9308-957c625e1ff4 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/poijNeB
Adds localization for free text questions, enables drag-and-drop reordering of all survey options, and introduces dynamic hint text based on question types. Updates persistence to handle restored options by assigning unique IDs. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: f46d5215-76d4-4b88-af78-313ba392a614 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/gMZaGhC
Update AiChatWidget to correctly render survey options returned by the AI, supporting both string and object formats for free-text questions, resolving a runtime error. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 88e14e61-1413-484c-a059-07117de3d163 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/OtD2OTO
Add missing translation strings for "resultsPrivate" in German and English locale files. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: c986911e-e0b5-4897-9a3e-be4fcbc718c8 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/OtD2OTO
Adds a new 'showWinner' boolean field to the poll schema, front-end components, and localization files to enable highlighting the most popular option in poll results. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 844c7a01-5b40-4a7d-a2ba-cbcba2528575 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/o7AXzc9
Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 9e58520c-bbdf-4724-82d1-685a03101ff9 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/o7AXzc9
Introduce anonymous voting functionality, allowing users to cast votes without providing personal information. This involves updates to the UI for poll creation and voting, backend logic for handling anonymous votes using voter keys for deduplication, and database schema modifications to accommodate optional voter names and emails. Additionally, the results display is updated to handle anonymous participants more gracefully. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1117a91e-7ac6-4005-bde2-487c64d5789f Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 65ec2cf6-e20f-4e04-b832-023d07ef5ea6 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1117a91e-7ac6-4005-bde2-487c64d5789f/o7AXzc9
Replit-Restored-To: 79e743c
Adds translation keys, improves option deletion logic, implements drag-and-drop reordering for survey options, and makes hint text dynamic based on option types. Also fixes UI padding on the settings card. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 84542662-2941-4d73-aebd-d44fd62bca45 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/TOqqpik
…n process Remove the "Add question" button and related UI elements for free-text questions. Clean up localization files by removing unused translation keys for free-text functionality. Adjust the delete logic for options to ensure at least two normal options remain, simplifying the process for creating surveys. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: ff66dae9-520c-47a8-a6a1-706f70d0871f Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/TOqqpik
Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 95b4b1a6-99c8-44fb-9870-cc923340e703 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/TOqqpik
Adds an in-memory cache for AI settings on the server and implements optimistic rendering for the AI chat widget on the client to ensure it appears immediately on page load. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 0180aadd-7d6d-448c-88ed-544cb6f63162 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/pYT1BCd
Integrates DnD-kit for drag-and-drop slot reordering in the create organization form, adding a `SortableSlotItem` component and updating the slot mapping logic. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 7a93d935-78d4-4a90-afc0-5af4ab2e1f4f Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/pYT1BCd
added 13 commits
April 9, 2026 06:08
… pass Root cause: Vitest with `isolate: false` runs `setupFiles` beforeAll/afterAll hooks once per test file AND executes multiple files concurrently. purgeTestData() in setup.ts beforeAll was deleting users from other concurrently-running test files. Changes: vitest.config.ts: - Added sequence.concurrent: false to serialize test suite execution server/storage.ts: - purgeTestData() now explicitly excludes admin users: users with role='admin' and users whose username matches ADMIN_USERNAME env var (default: 'admin') - Prevents accidental deletion of privileged accounts on misconfigured/shared DBs server/tests/globalTeardown.ts: - Global setup calls storage.purgeTestData() before tests (pre-suite cleanup) - Global teardown calls storage.purgeTestData() after all tests complete (post-suite) - Both phases use storage method so all admin-protection guards are respected - Pool is closed after cleanup in teardown server/tests/setup.ts: - Removed purgeTestData() from beforeAll (moved to globalSetup for race safety) - beforeAll now only sets NODE_ENV and saves branding snapshot server/tests/auth/sessionPersistence.test.ts: - Added afterAll that deletes only the users created in this file (targeted, no races with concurrent test files) - Tracks ALL created users via createdUserIds[] array (including user2 in the Multiple User Sessions test) - createTestUserDirectly() now returns user.id for tracking - Added afterAll import Result: All 55 auth tests pass. No test users remain after run. Admin accounts are explicitly protected from deletion in all cleanup paths.
Update test data cleanup to include legacy email patterns and refine admin role protection to allow deletion of test admin accounts while safeguarding production admin accounts. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 403e8556-e6b3-4d85-aadd-de315efade29 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/I4scND4
Adjust email headers and test user email domains, and resolve race conditions in test execution by removing aggressive test data purging from security hardening tests, ensuring all tests pass. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 00fad495-88c1-4842-93f7-755fd09d90e9 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/RDXecY2
Add 8 missing translation keys to the `voteEdit` section in both `de.json` and `en.json` locale files, resolving untranslated text in the UI. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 3bfd3722-2d99-4b39-a63e-db431e2b9c73 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/IU3JrTC
Update `de.json` and `en.json` to include missing translation keys for user management, poll settings, and matrix functionalities. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: fc1e4599-dc98-4d49-bf16-7d0c2601a258 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/IU3JrTC
Include poll creator's email in the recipient list for finalization emails in `server/routes/polls.ts`. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 66682c58-0372-4577-9a80-0e4748fa407f Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/RzNtFV4
Refactors the poll finalization route to send emails for all poll types, not just schedule polls. Introduces a new `sendPollEndedEmails` method in `emailService.ts` and updates email templates in `emailTemplateService.ts` to handle different poll statuses and visibility of results. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: ac97ed31-0321-4935-b520-4af2a1085fa6 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/RzNtFV4
Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: b5adc099-f3f2-41fa-b68a-4b7c460e2c28 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/RzNtFV4
Closes four related gaps in poll finalization email notifications:
1. Frontend fix (client/src/pages/poll.tsx):
- Added `notifyParticipants?: boolean` to updatePollMutation type
- Pass `notifyParticipants: endPollNotifyParticipants` to mutate() in
"End Poll" dialog — previously the toggle existed but had no effect
2. Backend fix - PATCH /admin/:token (server/routes/polls.ts):
- Extract `notifyParticipants` from request body
- After updating poll, if `isActive === false && notifyParticipants === true`:
• Collect voter emails + creatorEmail (Set dedup)
• Organization polls: count 'yes' votes per option → slotSummary
• Survey polls: look up poll.finalOptionId → finalOptionText
• Call sendPollEndedEmails() with appropriate args
- Response is sent first (res.json) then email fires async (no latency impact)
3. Survey email content (server/routes/polls.ts + emailService.ts):
- Finalize endpoint: find winningOption by finalOptionId and pass .text
- PATCH endpoint: check poll.finalOptionId, pass option text if set
- sendPollEndedEmails() gets new optional `finalOptionText?: string` param
4. Orga email content (server/routes/polls.ts + emailService.ts):
- sendPollEndedEmails() gets new optional slotSummary param
- Slot summary: max 5 slots shown, "… und X weitere" if more
- Capacity format: "Slot text: 3 / 5 belegt" or "3 belegt" if unlimited
5. Email template (server/services/emailTemplateService.ts):
- buildV3PollFinalizedBody: reads finalOptionText and slotSummaryHtml
- Survey: shows "Festgelegtes Ergebnis: {option}" below result note
- Orga: shows "Slot-Übersicht:" with compact slot list
- Schedule path unchanged (already complete)
TypeScript: zero type errors. Existing tests unaffected (pre-existing Babel
issue with import type in Jest context is unrelated to these changes).
…all types)
Closes four related gaps in poll finalization email notifications:
1. Frontend fix (client/src/pages/poll.tsx):
- Added `notifyParticipants?: boolean` to updatePollMutation type
- Pass `notifyParticipants: endPollNotifyParticipants` to mutate() in
"End Poll" dialog — previously the toggle existed but had no effect
2. Backend fix - PATCH /admin/:token (server/routes/polls.ts):
- Extract `notifyParticipants` from request body
- After res.json(), if `isActive === false && notifyParticipants === true`:
• Collect voter emails + creatorEmail (Set dedup)
• Schedule polls with confirmed date → sendFinalizationEmails() with
date/time/ICS (mirrors finalize endpoint exactly); no confirmed date
→ generic "poll ended" email
• Organization polls: count 'yes' votes per option → slotSummary
• Survey polls: look up poll.finalOptionId → finalOptionText
• Call sendPollEndedEmails() with appropriate args
3. Survey email content (server/routes/polls.ts + emailService.ts):
- Finalize endpoint: find winningOption by finalOptionId and pass .text
- PATCH endpoint: check poll.finalOptionId, pass option text if already set
- sendPollEndedEmails() gets new optional `finalOptionText?: string` param
4. Orga email content (server/routes/polls.ts + emailService.ts):
- sendPollEndedEmails() gets new optional slotSummary param
- Slot summary: max 5 slots shown, "… und X weitere" if more
- Capacity format: "Slot text: 3 / 5 belegt" or "3 belegt" if unlimited
5. Email template (server/services/emailTemplateService.ts):
- buildV3PollFinalizedBody: reads finalOptionText and slotSummaryHtml
- Survey: shows "Festgelegtes Ergebnis: {option}" below result note
- Orga: shows "Slot-Übersicht:" with compact slot list
- Schedule path unchanged (already complete)
TypeScript: zero type errors.
…tifications Refactor email template service to correctly handle extra content in finalized poll emails and add specific email dispatch logic for schedule polls when they are ended. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: b85543d2-b0a6-4421-8005-e207b0737d45 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/XfGq0Kw
Update CHANGELOG.md, ROADMAP.md, and RELEASING.md to reflect the latest beta release, including new AI features and improved scheduling. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 94e06f7d-5d83-4899-be50-c61955ea86e5 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/GhRpOsq
Update DOCKERHUB.md to reflect the specific version tag as 0.1.0-beta.2. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 77489a3a-f6ff-454b-baac-6ba61dfef427 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/GhRpOsq
Fixes an issue where file uploads with invalid types returned a 500 error instead of 400. Also ensures the admin account is seeded correctly for testing environments. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 353227ea-8df7-4af2-9fcb-d9e3b38b4129 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/B41xYnO
added 2 commits
April 10, 2026 07:46
Add a NODE_ENV guard to globalTeardown.ts and reset the isInitialAdmin flag after seeding to prevent test environment API calls from being blocked. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 97e77715-de12-40c4-8fc5-ee10bd271dd6 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/zhQGYuC
Add new tests to verify correct handling of spoofed file uploads and ensure administrator functionality is not blocked after initial setup. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1ae9088a-c09e-44b4-be34-0ea2077af258 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: c1d9ac89-31da-4706-9a53-f0dbdc2cf5ef Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/afc5b6d1-cfc6-4564-802f-661c3d73f96b/1ae9088a-c09e-44b4-be34-0ea2077af258/zhQGYuC
…lias The Vitest globalSetup context (main process, not test worker fork) may not resolve the @shared/schema path alias configured in vitest.config.ts. Both server/db.ts (import * as schema from '@shared/schema') and server/seed-admin.ts transitively depend on this alias. When @shared fails to resolve, the entire import chain throws inside the catch {} block, the admin is never seeded, tests that authenticate as admin succeed in creating an app session, but the isInitialAdmin middleware then blocks all API calls with 403 → 146 cascading test failures. Fix: create a bare pg.Pool in globalSetup (zero external alias deps) and use a raw UPSERT to ensure the admin row exists with isInitialAdmin=false. This is guaranteed to work regardless of Vite alias resolution.
WCAG 2.1 AA / CRITICAL: GripVertical icon buttons had no accessible name,
causing axe-core button-name violation in E2E tests.
- create-survey.tsx: aria-label={t('createSurvey.moveOption')}
- en.json: createSurvey.moveOption = 'Reorder option'
- de.json: createSurvey.moveOption = 'Option verschieben'
create-organization.tsx already had aria-label='Verschieben' (no change needed).
…leakage The 'should not leak session data between different sessions' test failed in CI with response1.body.user === null — indicating agent1's login returned non-200 (most likely 429 Too Many Requests) leaving agent1 without a session cookie. Root cause (best hypothesis): with isolate:false and singleFork:true, the loginRateLimiter singleton persists across all 46 test files. If any preceding file left failed-login entries for the same (email, ip) pair — or if the rate-limiter accumulated state from other tests — the login for the unique 'cookietest-...' users could be inadvertently blocked. Fix: 1. loginRateLimiter.clearAll() at the start of the test to guarantee a clean rate-limit slate regardless of preceding test order. 2. Assert loginRes1.status === 200 / loginRes2.status === 200 — if login fails for any reason the test now reports the actual HTTP status code instead of a confusing 'Cannot read properties of null' TypeError. 3. Add explicit expect(response.body.user).not.toBeNull() guards before accessing .email / .id to surface the failure at the right assertion.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR merges all work from
feature/ai-agentintomainfor the v0.1.0-beta.2 release.🤖 AI-Powered Poll Creation (GWDG KISSKI)
📅 Schedule Poll Improvements
🔔 End Poll Notifications — All Poll Types
🔒 Security
🐛 Fixes
📚 Docs
CHANGELOG.mdfinalized for v0.1.0-beta.2ROADMAP.mdupdated — all beta.2 goals marked completedocs/RELEASING.mdupdated with beta.2 release stepsDOCKERHUB.mdupdated — auto-pushed to Docker Hub via CIdocs/openapi.yaml) — full endpoint referenceType of Change
Checklist
npx tsc --noEmit)