Skip to content

Deploy: notebook search depth, dark mode, docs overview, and more#558

Merged
Movm merged 171 commits intomasterfrom
test-branch
Mar 31, 2026
Merged

Deploy: notebook search depth, dark mode, docs overview, and more#558
Movm merged 171 commits intomasterfrom
test-branch

Conversation

@Movm
Copy link
Copy Markdown
Collaborator

@Movm Movm commented Mar 31, 2026

Summary

  • feat(api): increase search depth for notebook-scoped chat queries — notebook @mentions in normal chat now use limit=10/collection (was 3), reranker 20→12 (was 12→8), and 8000 char context budget (was 4000)
  • feat(web): docs overview with template carousel, document grouping, and sidebarOnly layout
  • fix(web): dark mode consolidation — single source of truth, CSS layer ordering fix, gradient dark variants
  • refactor(web): tools sections layout improvements
  • fix(chat): remove duplicate "Neuer Chat" button
  • Plus all prior test-branch commits (Better Auth migration, Presenton slides, boards comments, AI vision, docs improvements, and more)

Test plan

  • Verify notebook @mention searches return deeper results in normal chat
  • Verify general (non-notebook) chat search quality is unchanged
  • Test dark mode across all pages
  • Test docs overview page with template carousel
  • Smoke test auth flow, chat, docs, boards

Movm added 30 commits March 27, 2026 19:55
…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.
Movm added 27 commits March 31, 2026 14:11
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.
Copy link
Copy Markdown

@github-advanced-security github-advanced-security AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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'
@Movm Movm merged commit 57c6177 into master Mar 31, 2026
22 of 24 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants