* fix: Integrations list missing when language is not English
The group filter on the Integrations settings page compared against the
hardcoded string "Integrations" instead of the translated value from
t("Integrations"), causing no integrations to appear in non-English locales.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: Sidebar shows unconnected integrations in non-English locales
Same hardcoded "Integrations" string comparison issue as the main
integrations page — the sidebar filter skipped the connected-check
when the translated group name didn't match the English literal.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Wrap collection and document names in the header breadcrumb with
ContextMenu components, enabling right-click menus with relevant
actions. Each breadcrumb item type has its own component to scope
hooks. Breadcrumb links prevent navigation when a context menu is open.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* Preload share popover data on hover with useShareDataLoader hook
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: Route programmatic closes through handleOpenChange and fix race conditions
- closePopover now calls handleOpenChange(false) so reset() fires on all
close paths, including programmatic closes via onRequestClose
- Reset requestedRef when entity id changes so preload fires for new targets
- Use request counter to prevent stale loading state when reset() is called
during an in-flight request
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: Add support for Docker Swarm style secrets
* fix: Handle empty-string env values and bare _FILE key in resolveFileSecrets
Use undefined check instead of truthiness so empty-string values are
treated as "already set" and not overridden by _FILE variants. Skip
processing when the key is exactly "_FILE" to avoid creating an
empty-key entry.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The group filter on the Integrations settings page compared against the
hardcoded string "Integrations" instead of the translated value from
t("Integrations"), causing no integrations to appear in non-English locales.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: Map creator/updater IDs to existing users during JSON import
When importing documents from JSON, resolve the original document author
to an internal user by matching on user ID first, then email, falling
back to the importing user. Results are cached to avoid redundant queries.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: Add negative caching for user resolution during import
Cache misses (not just hits) in resolveUserId so that repeated lookups
for users that don't exist in the target team are served from cache
instead of hitting the database for every document.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs: Fix resolveUserId JSDoc to match actual behavior
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix: Mammoth converts docx images to <img> tags with base64 data URIs but no width/height attributes
* fix: Bound memory usage and prevent infinite loop in image dimension parsing
Decode only a 64 KB prefix of base64 data URIs instead of the full payload,
cap the JPEG marker scan at 64 KB, and bail on malformed segment lengths
(< 2 or overflowing the buffer) to prevent an infinite loop on truncated data.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: Extract search into pluggable provider system
Refactors the monolithic SearchHelper into a pluggable search provider
architecture, enabling alternative search backends (Elasticsearch,
Turbopuffer, etc.) while preserving PostgreSQL full-text search as the
default. The SEARCH_PROVIDER env var selects the active provider.
- Add BaseSearchProvider abstract class and SearchProviderManager
- Add Hook.SearchProvider to the plugin system
- Move PostgreSQL search logic into plugins/postgres-search/
- Add SearchIndexProcessor for event-driven index sync
- Update all callers to use the provider manager directly
- Keep SearchHelper as a deprecated thin wrapper for backwards compat
Closes#11347
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: Remove deprecated SearchHelper wrapper
All callers now use SearchProviderManager directly, so the thin
delegation wrapper is no longer needed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: Rename postgres-search plugin to search-postgres
Renames the plugin folder and id so that future search provider plugins
(e.g. search-elasticsearch, search-turbopuffer) will be colocated
alphabetically.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: Remove special-case plugin import from SearchProviderManager
Make PluginManager.loadPlugins resilient to individual plugin load
failures so SearchProviderManager can use the standard getHooks path
without needing to directly import the search-postgres plugin.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test: Add missing search provider tests for full coverage parity
Adds all tests that existed in the old SearchHelper.test.ts but were missing
from PostgresSearchProvider.test.ts, including searchTitlesForUser status
filters, collection filtering, group memberships, and sorting tests.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feedback
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix: Upgrade mermaid to 11.13.0
Includes a fix for incorrect viewBox casing in Radar and Packet diagram
renderers (mermaid-js/mermaid#7076) and other improvements.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: Use visibility:hidden for mermaid rendering element
Instead of positioning the temporary render element offscreen at
-9999px, use visibility:hidden with position:fixed so the browser
computes correct bounding boxes for SVG elements. Offscreen elements
can produce incorrect getBBox() results, leading to wrong viewBox
dimensions and diagrams rendering too big or too small.
Fixes#11782
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add session storage for generated diagrams to reduce relayout
* fix: Use LRU eviction for mermaid sessionStorage cache
Track access order via a dedicated LRU index key so the cache evicts
least-recently-used entries rather than arbitrary ones.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: Strip comment marks from documents in presentation mode
Move removeMarks to shared ProsemirrorHelper and use it to strip comment
marks before rendering slides. Make server ProsemirrorHelper extend the
shared class to eliminate duplication and remove SharedProsemirrorHelper
imports from server code.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: Use Set for mark lookup and cloneDeep for browser compat
Use a Set for O(1) mark lookups in removeMarks traversal. Replace
structuredClone with lodash/cloneDeep to support older browsers
that lack the native API.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test: Add tests for ProsemirrorHelper.removeMarks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: Support simplified mention syntax in markdown for MCP clients
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Restore translations
* PR feedback
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Show all search results by passing keywords to Fuse.js, display search
context as subtitle, track recently viewed documents for empty state,
and move SharedSearchActions outside KBarPortal to prevent mount flicker.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
When navigating to a document from search results, the search term is
highlighted via FindAndReplace but the popover is not open, so there was
no way to dismiss the highlights. This adds an Escape key binding to the
FindAndReplace extension that clears highlights when active.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix: Prevent comment sidebar from opening unexpectedly
Guard against stale cross-document focused comments opening the sidebar
by checking the comment's documentId matches the current document. Also
stop restoring rightSidebar state from localStorage on app load so the
sidebar always starts closed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: Restore rightSidebar persistence on page reload
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Replace the SearchPopover in the shared sidebar with a command bar that
opens via Cmd+K or a search button. Search results are scoped to the
share and navigate to shared document paths with highlight support.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix: Data always included in list_documents response
* Remove resources, add fetch tool
Fix pagination arguments do not accept string
* type -> resource
* Add URL resolving
* Add create_attachment tool to get a presigned POST for file upload bypassing context
* fix: Data always included in list_documents response
* Remove resources, add fetch tool
Fix pagination arguments do not accept string
* type -> resource
* Add URL resolving