Deploy: notebook search depth, dark mode, docs overview, and more#558
Merged
Deploy: notebook search depth, dark mode, docs overview, and more#558
Conversation
…vels Path traversal: - Validate uploadId format and source path containment in ProjectService - Add allowed-directory check in videoUploadService.extractAudio Sanitization: - Loop-until-stable HTML stripping in PollScraper, chatGraphController - Escape Markdown special chars in BriefingArchiveService source links - Sanitize SVG attribute interpolation in RemoteSvgIcon (9 alerts) Rate limiting: - Add IP-based rate limiters to ~30 previously unprotected routes - Covers auth, custom_generator, subtitler, share, boards, search, etc. Other: - Remove password from GET query params in shareController (header only) - Block prototype pollution keys in presentationStore.setNestedValue - MD5 → SHA-256 for SearxngService cache keys - Generic error message in voxtral transcription endpoint - Encode docId in docs server OG meta URL
- Add VisionService with Mistral vision model integration for image analysis - Add analyzeImage tool to ChatGraph tool registry - Classifier forces direct intent when image attachments are present - RespondNode includes image context in system message for vision-aware responses - Auto-switch to vision-capable model when images are attached - Extend OCR service to handle arbitrary MIME types (not just PDF) - Add root .expo/ to gitignore
…ents Refactor base64 extraction path to try self-hosted Docling first before falling back to Mistral OCR. Docling is free, EU-hosted, and handles PDF/DOCX/PPTX/XLSX with built-in OCR for scanned documents.
…rkplace - Tool icon buttons now use white background with shadow instead of eucalyptus - Removed white card background from tools wrapper - Removed GroupsSection (groups accessible via profile button) - Removed showCreateGroup prop and CREATE_GROUP_TOOL constant
…kflow Adds exponential-backoff retries (3 attempts), connect timeout, early exit on 401/403 auth failures, and upfront ADMIN_TOKEN validation step.
Removes social-media from content-sync matrix and creates a separate weekly workflow. Both now use peter-evans/create-pull-request for stats page updates instead of direct pushes to protected branches.
Adds an `aspect` prop ('9/16' | 'square') defaulting to '9/16' for
backward compatibility. Square variant is useful for mixed-content grids.
…cards Merges video items into the "Zuletzt erstellt" grid using square VideoCard with hover-to-play, replacing the separate ReelsSection. Also widens tool button label max-width.
…eoCard On touch devices, tapping the video area toggles play/pause instead of hover autoplay. When onTitleClick is provided, the title becomes a clickable button for navigation (e.g. to reel editor).
Removes buildAutoSearchQuery, useAutomaticSearch option from enrichment, and related types/config. Auto-search was superseded by the ChatGraph parallel multi-source search pipeline.
Removes AutoSaveIndicator, useTextAutoSave hook, automatic search toggle from FeatureIcons/ContentSelectorDialog, auto-document display from EnrichmentSourcesDisplay, and related beta feature flags and store state.
…ify PresseSocial submit Remove useUltraMode/useBedrock (never enabled from UI), useNotebookEnrich (completely dead), commented-out AI mode dropdown, unused toggle actions, and PR workflow/sharepic dead code from usePresseSocialSubmit (438→133 lines).
Replaces the 4-step wizard (Ebene → Rolle → Aufgabenbereich → Konkretes) with a multi-screen flow: Ebene → Bundesland → Gliederung → Rolle. Removes all task/template code — prompts are now AI-generated from the user profile. Supports German and Austrian organizational structures. Persists profile fields (ebene, rolle, bundesland, gliederung) to user_defaults for reuse across features.
Moves ChatSettingsPage from /chat/settings to /dein-gruenerator with backward-compat redirect. Updates ProfileButton nav item label to "Dein Grünerator".
Adds a backend proxy at /api/internal/gruene-api that calls app.gruene.de endpoints (divisions, organizations, roles, etc.) using the configured API key. Frontend test page at /admin/gruene-api displays results with status badges and expandable JSON views.
… pr-agent folder Dead code from the tab→mode refactoring: SharepicConfigPopup, SharepicEditorModal, GeneratorOutput wrapper, empty presse barrel, and the entire pr-agent feature folder (only consumer was the removed PR workflow).
…ofile prompt Replaces single-role wizard with multi-role management: users can add multiple roles (each with Ebene/Bundesland/Gliederung/Rolle), plus optional freetext instructions. Saves structured roles to user_defaults and generates a combined profile prompt to profiles.custom_prompt. Removes dependency on chat store (useAgentStore) and thread-level custom system prompts.
…e prompts Simplify buergeranfragen and rede frontend modes to use one text input each, removing extra fields (gremium, antwort, rolle). Update all Sonstige backend prompts: fix critical leichte_sprache duplicate taskInstructions bug (detailed rules were silently discarded), normalize rede prompt from Sie to du form, enrich buergeranfragen systemRole, and wrap wahlprogramm inhalt in XML tags for consistency.
Reads profiles.custom_prompt as userInstructions and injects it as a "PERSÖNLICHE ANWEISUNGEN" section in every chat system prompt — both the normal agent path and the custom system prompt path. Removes thread-level custom prompt resolution (getThreadSettings) since profile instructions are now user-level and always-on.
Each role now gets its own AI-generated system prompt via /generate-system-prompt. Shows spinner during generation. Role cards display a prompt preview. Per-role optional instructions are sent as context to the AI generation.
…le empty state Removes the "Persönliche Anweisungen" editor from the profile page since roles and instructions are now managed in Dein Grünerator. Removes redundant "Noch keine Rollen definiert" text from empty state.
Creates userProfileStore in packages/chat for cross-component role access. ChatPage hydrates it from user defaults. ChatOverview shows role pills that start a chat with that role's system prompt. ToolToggles replaces the static "eigener" mode with dynamic role entries from the store.
…nd selection Creates a reusable SmartInput component in packages/ui using cmdk (Command) + Popover for type-ahead filtering. Replaces the button grid in the Bundesland wizard step with the autocomplete input.
Replaces CommandPrimitive.Input with a plain HTML input element. The cmdk wrapper was intercepting keyboard events and preventing normal text input. Command is now only used in the dropdown list.
Uses plain input instead of cmdk input to fix keyboard event interception. Adds onSelect callback that fires with the chosen option, replacing the stale-state onSubmit pattern. Dropdown selection now directly advances the wizard step.
…button Instructions textarea is now a separate step after role selection, with "Rolle hinzufügen" and "Überspringen" buttons. Back navigation from instructions returns to rolle step.
Remove immersive layout mode from /scanner and /transfer routes so they use the default layout with sidebar and header. Convert scanner error display from unstyled CSS classes to Tailwind, replace marker class with state-driven conditional, and delete orphaned scanner.css (806 lines, never imported).
… subtype PostgreSQL's JSONB ? (contains-key) operator requires a TEXT operand on the right side. When the same parameter is used in both a UUID column comparison and a JSONB ? check, PG infers UUID type, causing "operator does not exist: jsonb ? uuid" errors. Adding ::text casts to all 10 occurrences across presentations, docs, boards, threads, and recent activity queries. Also adds 'docs' to COLLAB_SUBTYPES since 7 existing documents use this default subtype and were invisible to public access checks.
Move the circular icon-with-label button pattern from ToolsSection into reusable components in @gruenerator/ui, decoupled from react-router-dom.
Remove transform presets (Ergebnisprotokoll, Notizen, Text korrigieren) and their grid layout. Replace export dropdown items with visible IconButton actions from @gruenerator/ui. Default OCR to private docling with opt-in "Handschrift erkennen" toggle for Mistral OCR.
…zation Default to private faster-whisper processing (privacyMode: true, diarize: false). Replace "Privat verarbeiten" toggle with "Sprecher*innen erkennen" that enables Mistral diarization for podcasts/interviews while informing users about external data processing.
Use the Grünerator gear SVG as the sidebar home icon with currentColor fill for automatic dark/light mode adaptation.
Reuse the existing TUS server from subtitler at /api/audio/upload to support chunked resumable uploads for transcription. Adds two new endpoints (transcribe-upload, transcribe-upload/stream) that process files by uploadId from disk instead of multer memory. Frontend hook now uses tus-js-client with 5MB chunks and automatic retry, fixing 413 errors for large files exceeding nginx's 100M body limit.
…Better Auth IP detection - Add missing ESM __dirname pattern to videoUploadService.ts (was the only subtitler service file without it, causing crashes on video TUS uploads) - Configure Better Auth ipAddressHeaders for x-forwarded-for/x-real-ip so rate limiting works behind nginx reverse proxy
Agent mode (Pro-Modus) for presse/social produces truncated output. Disabling the UI toggle while investigating, adding pipeline debug logging and a test file for tracing.
…ection Match the DocsPage card style: HTML content preview with scaled rendering, colored subtype icons, frosted glass bottom bar, and relative dates. API now returns content and documentType for doc items.
…experimental sections - Remove workplace, groups, docs, scanner, boards beta feature flags — all now generally available - Split ToolsSection into "Weitere Tools" and "Experimentelle Tools" (scanner, audio, connect) - Mark vorlagen and transfer as dev-only via import.meta.env.DEV - Rename "Datenbank durchsuchen" to "Notebook-Daten durchsuchen" - Remove BetaFeatureWrapper lazy wrappers from routes (scanner, groups, boards) - Show WorkplacePage for all authenticated users, not just beta-enabled - Remove showDocs/showBoards props from RecentlyCreatedSection
…tlyCreatedSection Remove remaining workplace/docs/boards beta feature checks that were missed in the initial refactor — DesktopHome no longer gates menu items on workplace beta, RecentlyCreatedSection always enables boards.
The sidebar menu bar already has a "Neuer Chat" button, so the one directly above the chat thread list was redundant.
Add a desktop template carousel to the docs page showing document templates (with HTML mini-previews) and 4 kanban board templates (Standard, Redaktionsplan, Eventplanung, Wahlkampf) plus whiteboard. Board templates use the existing BoardInitialStructure pipeline via location.state. Group documents by personal vs group-shared, with section headers showing group names — matching the apps/docs pattern.
New layout mode that shows the sidebar but hides the fixed header bar. Applied to /docs route for a cleaner document overview experience.
…idebarOnly mode Replace the "Neu" creation menu with an "Importieren" outline button containing only file import and Wolke import options. Creation is now handled by the template carousel. Show the sidebar toggle (hamburger) in sidebarOnly layout mode so users can still open the sidebar navigation.
Move all hardcoded color hex values from @theme in index.css into variables.css as -val CSS variables with light/dark pairs. @theme now uses var() references only, making it a pure mapping layer. - Add ~60 -val token variables to variables.css with [data-theme="dark"] overrides - Add --color-popover/--color-popover-foreground for shadcn components - Delete separate [data-theme='dark'] override block from index.css - Fix hardcoded background: white in UploadAnimation.css, base-popup.css, image-slider.css - Add matching overrides to @media (prefers-color-scheme: dark) fallback
The gradient from-background wasn't re-declaring the Tailwind gradient stops in the dark variant context, leaving the main content area white in dark mode.
The docs package variables.css sets --background-color: #ffffff in :where(:root) inside layer(components). Because CSS layer ordering beats specificity, this always overrode the dark mode variables in layer(legacy), making the page background permanently white. Moving the import to layer(legacy) restores normal specificity-based cascade where [data-theme="dark"] correctly overrides :where(:root).
Document the -val token pattern, @layer ordering constraint, and dark: gradient re-declaration requirement.
Replace 2-column grid with full-width stacked sections so tool icons flow naturally in one line per group with consistent spacing.
Notebook @mentions in normal chat used limit=3/collection and cap=8 results, while dedicated notebook chats use limit=30 and cap=40. This boosts notebook- scoped searches to limit=10, cap=20, reranker 20→12, and 8000 char context budget — all gated on notebookCollectionIds so general chat is unaffected.
There was a problem hiding this comment.
CodeQL found more than 20 potential problems in the proposed changes. Check the Files changed tab for more details.
| elif database_url.startswith("mysql://"): | ||
| database_url = database_url.replace("mysql://", "mysql+aiomysql://", 1) | ||
| else: | ||
| database_url = database_url |
| """ | ||
| try: | ||
| # Check if running in PyInstaller bundle | ||
| base_path = sys._MEIPASS |
| existing_config = UserConfig(**json.load(f)) | ||
| except Exception: | ||
| print("Error while loading user config") | ||
| pass |
|
|
||
| except Exception as e: | ||
| print(f"Error sending request to webhook {subscription.id}: {e}") | ||
| pass |
|
|
||
| except Exception as e: | ||
| print(f"Error sending request to webhook {subscription.id}: {e}") | ||
| pass |
|
|
||
| # Create temporary directory for processing | ||
| with tempfile.TemporaryDirectory() as temp_dir: | ||
| if True: |
|
|
||
| # Create temporary directory for processing | ||
| with tempfile.TemporaryDirectory() as temp_dir: | ||
| if True: |
|
|
||
|
|
||
| # revision identifiers, used by Alembic. | ||
| revision: str = '00b3c27a13bc' |
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
Test plan