10110 Commits
Author SHA1 Message Date
b2b41dd3ca fix: Remap internal links when duplicating a document tree (#13270)
* fix: Remap internal links when duplicating a document tree

Duplicating a document tree now assigns the identifiers of every duplicate
before any content is written, so links and mentions between the documents
being duplicated point at the copies rather than the originals.

* fix: Remap fully qualified links when duplicating a document tree

Links written as a full url to this installation are now remapped alongside
relative ones, and stay fully qualified. Where a link is displayed as its own
url the text is updated to match.

Also trims surrounding whitespace in sanitizeUrl, which otherwise failed
validation and prepended a second scheme to an already qualified url.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: Remap links across trees when duplicating a collection

The collection duplication task duplicated each root document separately, so
only links within a single tree were remapped. It now duplicates the whole
collection as one unit, with identifiers assigned across every tree before any
content is written.

* fix: Match document links by identifier rather than host when duplicating

An installation can be reached through more than one host, so comparing a
link's host against the configured url left fully qualified links to a
document in the duplicated set unmapped. The document a link identifies now
decides whether it is replaced, and the host it was written with is kept.

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 22:44:06 -04:00
000f2f98fb feat: Add TextPack (.textpack) support (#13235)
* feat: Add TextPack (.textpack) import support

Adds a single-document importer for TextPack, the zipped variant of
TextBundle used by Bear, Ulysses, iA Writer and others. Bare .textbundle
directories are not supported, as a directory cannot be delivered through
a browser file input.

The bundle's text entry may use any extension, per the spec, with
info.json's type deciding whether it can be read as markdown. Assets are
inlined as data URIs for the existing attachment pipeline to pick up,
bounded by the attachment size limit and a memory ceiling, and only for
media types markdown-it accepts as a link destination.

Also fixes an existing bug where a file embedded in an HTML or email
import as a data URI was stored in the document as base64 rather than
being uploaded as an attachment.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Refactor to individual converters

* refactor

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 20:42:05 -04:00
Tom MoorandGitHub 33c8d51e08 perf: Avoid membership joins in search (#13269)
* perf: Avoid membership joins in search

* feedback
2026-08-02 18:29:16 -04:00
Tom MoorandGitHub 03ec96fd91 Return a compact success payload from MCP mutation tools (#13257)
* fix: Return a compact success payload from MCP mutation tools

Mutation tools serialized the entire resource — and for documents the
full markdown body — back to the client on every write, which the caller
already has. They now acknowledge the write with the identifying fields
needed to reference the resource.

The one exception is update_document with editMode "patch", which still
echoes the resulting content so the caller can verify what was replaced.

For move_document and restore_document the breadcrumb is now resolved
after the transaction commits, so it reflects the new location rather
than the cached pre-move document structure.

* test: Update MCP scope enforcement tests for the new response shape

* test: Assert the success acknowledgement across all mutation tool variants
2026-08-02 15:06:25 -04:00
d1ed467ba0 perf: Preload route chunks on sidebar hover intent (#13263)
The main app scenes were created with bare lazyWithRetry, so the sidebar
had no way to warm a route's chunk ahead of navigation — every click paid
the full fetch. Move them to createLazyComponent in a leaf module that
both the routes and the sidebar can import without a cycle, then preload
on the existing hover intent handlers.

Document and Collection links already prefetched their data on hover, so
the chunk preload rides along on the same event.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 15:04:05 -04:00
Tom MoorandGitHub d6d11171c3 Rename Members -> Users (#13262) 2026-08-02 14:46:20 -04:00
7992179978 fix: Multi-select swallows taps on mobile document list items (#13261)
The icon column stretched to the full height of a list item, so on mobile
– where items are tall enough to wrap a context snippet and meta – a large
strip down the left of every item toggled selection instead of navigating.
Hug the icon so that only a click on the icon itself begins a selection.

Also limit revealing the checkbox to real hover. On touch devices `hover`
resolves to `active`, and the rule additionally matched focus, so simply
tapping an item to navigate swapped its icon for an empty checkbox and the
state persisted. There the checkbox now appears once a selection is active.


Claude-Session: https://claude.ai/code/session_01WUpKTb4aEtvUwfQQoMC53v

Co-authored-by: Claude <noreply@anthropic.com>
2026-08-02 14:07:34 -04:00
e5170b75b0 fix: Show roles as a selection list in the user role menu (#13260)
The user role submenu labelled each item "Promote to…" or "Demote to…"
depending on the target user's current role, and hid the role they
already had. Show the plain role names with a checkmark against the
current one, matching the group member role menu.


Claude-Session: https://claude.ai/code/session_01LfzcABi86HH7n6j9QrY4po

Co-authored-by: Claude <noreply@anthropic.com>
2026-08-02 14:07:16 -04:00
73f960a544 fix: Invalid sort comparator for frequently used items (#13258)
* fix: Invalid sort comparator for frequently used items (#13241)

Extracts frequency tracking for icons, emojis, and code languages into a
shared FrequencyTracker with a spec-compliant, stable sort.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Snapshot frequently used icons while picker is open

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Sync frequent custom emojis to tracked ids, preserving order

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 08:43:28 -04:00
36b05130b6 fix: Suppress event before guard clauses in Templatize action (#13256)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 12:07:50 +00:00
Tom MoorandGitHub b1b3db3430 Update all MCP tools to Markdown (#13234)
* Update all MCP tools to MD input+output

* feedback
2026-08-02 07:58:15 -04:00
273a146381 fix: Shared with me section disappears when page one holds only deleted docs (#13255)
Memberships pointing at soft-deleted or archived documents were still
returned by userMemberships.list and groupMemberships.list, consuming
slots in the first page the sidebar requests. Inner join the document so
they are excluded from the query entirely.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 07:56:42 -04:00
4bb422425c fix: Bound plain text cache in command bar search index (#13252)
* fix: Bound plain text cache in command bar search index

Adds a shared LRUCache utility with optional sessionStorage persistence
and uses it for the command bar plain text cache, which previously grew
without limit, and for the Mermaid diagram cache, which had its own
bespoke LRU implementation.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: Avoid double lookup in LRUCache.get

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: Read persisted LRUCache values lazily

Hydration now loads only the key index, reading each value from storage
on first access. This avoids a synchronous read and parse of the entire
cache on first use, and keeps in memory only the entries the session
actually touches.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* test: Assert lazy LRUCache reads without a storage spy

Spying on Storage.prototype missed the calls under Node 26, where a
native Storage global shadows the jsdom one. Replacing the stored value
after hydration asserts the same behavior independently of environment.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 07:56:28 -04:00
257c2bfdc0 fix: Whitelist fields in URL unfurl presenter (#13254)
Restores field-level picking in presentURL instead of casting the entire
UnfurlData blob, so transient metadata attached by unfurl plugins or
internal callers is never serialized into API responses.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 07:41:50 -04:00
0e7c4bc756 fix: Don't show success toast when batch operation fails entirely (#13253)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 11:28:17 +00:00
Tom MoorandGitHub bc3b3b3f97 fix: Log failures when scheduling collection duplication task (#13251) 2026-08-02 11:21:16 +00:00
Tom MoorandGitHub efc68de4a0 fix: error id guards break for non-Error throwables (#13250)
Widen the narrowed instanceof Error checks introduced in the TypeScript 6
upgrade with a shared errToId helper that accepts any object carrying a
string id, restoring the login email-matching recovery path.
2026-08-02 07:19:24 -04:00
9ee3c1c999 fix: Missing revision on restore returns 404 instead of authorization error (#13249)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 07:18:42 -04:00
Tom MoorandGitHub 890f0451a8 feat: Multi-select documents (#13041)
* first pass

* refactor

* refactor

* wip

* Fix BatchableApiMethods docs; remove ApiClient batch test

* Refactor actions

* refactor batch send to share error code handling

* Remove multi-select from read-only
Refactor performBatch to common

* refactor
2026-08-01 20:45:20 -04:00
Tom MoorandGitHub 8bcf4a43a7 Add control to collapse pinned docs (#13233)
* Add control to collapse pinned docs

* feedback
2026-08-01 20:36:12 -04:00
Tom MoorandGitHub fd5dfdb47e fix: Empty collaborators displayed on fresh model (#13231) 2026-08-01 22:47:49 +00:00
13b9b2c62d feat: Add support for web page and eml import (#13229)
* feat: Add support for web page and email import

* fix: Type mailparser result explicitly

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Combine HTML and Web Page

* fix: Validate mime type before inlining MIME archive parts

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 18:30:06 -04:00
Tom MoorandGitHub 93638564cf feat: Adds user profile cards on hover (#13230)
* wip

* Add option to suppress hover card
2026-08-01 18:12:09 -04:00
8b35f7bd17 feat: Import file dialog (#13228)
* feat: Replace import document file picker with a modal

Choosing "Import document" now opens a dialog that lists the supported
file formats with an icon for each, and accepts files either dropped onto
it or chosen with the system file picker.

Also closes the gaps between the formats the dialog advertises and those
the importer actually accepts:

- `.tsv` was offered by the file picker but rejected by the server, it is
  now converted to a table like CSV
- `.csv` and `.htm` are now recognised by extension, so they still import
  when the browser reports an unhelpful mime type
- `.markdown` is now offered by the file picker, it was already supported

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dj1UnjnRX336CQcdzw3ott

* Add intermediate dialog for file import

* tweaks, polish

* Update failure message

* test

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-08-01 17:46:47 -04:00
396ac980a8 Show search highlight chip on shared documents (#13227)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 16:29:25 -04:00
Tom MoorandGitHub f5b39aba8f fix: CMD-Enter in table within toggle block does not add row (#13226)
* fix: CMD-Enter in table within toggle block does not add newline

* simplify
2026-08-01 16:15:40 +00:00
Translate-O-TronandGitHub d949199aee New Crowdin updates (#13218)
* fix: New Catalan translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Chinese Traditional translations from Crowdin [ci skip]

* fix: New Romanian translations

* fix: New French translations

* fix: New Spanish translations

* fix: New Catalan translations

* fix: New Czech translations

* fix: New Danish translations

* fix: New German translations

* fix: New Hebrew translations

* fix: New Hungarian translations

* fix: New Italian translations

* fix: New Japanese translations

* fix: New Korean translations

* fix: New Dutch translations

* fix: New Polish translations

* fix: New Portuguese translations

* fix: New Swedish translations

* fix: New Turkish translations

* fix: New Ukrainian translations

* fix: New Chinese Simplified translations

* fix: New Chinese Traditional translations

* fix: New Vietnamese translations

* fix: New Portuguese, Brazilian translations

* fix: New Indonesian translations

* fix: New Persian translations

* fix: New Thai translations

* fix: New English, United Kingdom translations

* fix: New Norwegian Bokmal translations

* fix: New French translations

* fix: New Romanian translations

* fix: New Spanish translations

* fix: New Catalan translations

* fix: New Czech translations

* fix: New Danish translations

* fix: New German translations

* fix: New Hebrew translations

* fix: New Hungarian translations

* fix: New Italian translations

* fix: New Japanese translations

* fix: New Korean translations

* fix: New Dutch translations

* fix: New Polish translations

* fix: New Portuguese translations

* fix: New Swedish translations

* fix: New Turkish translations

* fix: New Ukrainian translations

* fix: New Chinese Simplified translations

* fix: New Chinese Traditional translations

* fix: New Vietnamese translations

* fix: New Portuguese, Brazilian translations

* fix: New Indonesian translations

* fix: New Persian translations

* fix: New Thai translations

* fix: New Norwegian Bokmal translations
2026-08-01 11:48:20 -04:00
Tom MoorandGitHub bb520666ba Add time support to date mentions (#13222) 2026-08-01 11:47:46 -04:00
Tom MoorandGitHub a6b5898283 fix: Silence false positive sequelize class fields warning (#13224)
sequelize-strict-attributes defines per-instance accessors for attributes
omitted from a query's selection, which trips Sequelize's public class field
detection. The removed `Fix` decorator used to suppress this per model; do it
once on the base model instead.
2026-08-01 11:47:37 -04:00
Tom MoorandGitHub b67b7a24a8 Add nightly docker builds (#13223)
* Add nightly docker builds

* Separate environment to ungate nightly builds from manual approval
2026-08-01 11:07:22 -04:00
Tom MoorandGitHub eb88df4825 Add Danish and Indonesian to the language options (#13221) 2026-08-01 10:26:54 -04:00
Tom MoorandGitHub 1108d2c014 Update crowdin.yml 2026-08-01 08:18:22 -04:00
Tom MoorandGitHub 3b6a3f45e3 Add contextual menu to group table (#13220)
* Add contextual menu to group table

* feedback
2026-08-01 12:15:23 +00:00
Tom MoorandGitHub e6908c1511 feat: Inline read-only comments (#13209)
* feat: Inline read-only comments

* Improve anchor disambiguation

* fix: Spurious edits from inline comments
2026-08-01 08:08:52 -04:00
Tom MoorandGitHub a6f25dcded chore: Restructure CI required checks (#13219)
* chore: Restructure CI required checks

* Add bundle-size
2026-08-01 11:54:09 +00:00
Translate-O-TronandGitHub bc4073a797 New Crowdin updates (#13216)
* fix: New Hebrew translations from Crowdin [ci skip]

* fix: New Hungarian translations from Crowdin [ci skip]

* fix: New Italian translations from Crowdin [ci skip]

* fix: New Dutch translations from Crowdin [ci skip]

* fix: New Polish translations from Crowdin [ci skip]

* fix: New Portuguese translations from Crowdin [ci skip]

* fix: New Swedish translations from Crowdin [ci skip]

* fix: New Turkish translations from Crowdin [ci skip]

* fix: New Ukrainian translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Chinese Traditional translations from Crowdin [ci skip]

* fix: New Vietnamese translations from Crowdin [ci skip]

* fix: New Indonesian translations from Crowdin [ci skip]

* fix: New Persian translations from Crowdin [ci skip]

* fix: New Thai translations from Crowdin [ci skip]

* fix: New English, United Kingdom translations from Crowdin [ci skip]

* fix: New Norwegian Bokmal translations from Crowdin [ci skip]

* fix: New French translations from Crowdin [ci skip]

* fix: New Danish translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]

* fix: New Catalan translations from Crowdin [ci skip]

* fix: New Spanish translations from Crowdin [ci skip]

* fix: New Czech translations from Crowdin [ci skip]

* fix: New Romanian translations from Crowdin [ci skip]

* fix: New German translations from Crowdin [ci skip]

* fix: New Hebrew translations from Crowdin [ci skip]

* fix: New Hungarian translations from Crowdin [ci skip]

* fix: New Italian translations from Crowdin [ci skip]

* fix: New Dutch translations from Crowdin [ci skip]

* fix: New Polish translations from Crowdin [ci skip]

* fix: New Portuguese translations from Crowdin [ci skip]

* fix: New Swedish translations from Crowdin [ci skip]

* fix: New Turkish translations from Crowdin [ci skip]

* fix: New Ukrainian translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Chinese Traditional translations from Crowdin [ci skip]

* fix: New Vietnamese translations from Crowdin [ci skip]

* fix: New Indonesian translations from Crowdin [ci skip]

* fix: New Persian translations from Crowdin [ci skip]

* fix: New Thai translations from Crowdin [ci skip]

* fix: New English, United Kingdom translations from Crowdin [ci skip]

* fix: New Norwegian Bokmal translations from Crowdin [ci skip]

* fix: New French translations from Crowdin [ci skip]

* fix: New Danish translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]

* fix: New Catalan translations from Crowdin [ci skip]

* fix: New Spanish translations from Crowdin [ci skip]

* fix: New Czech translations from Crowdin [ci skip]

* fix: New Romanian translations from Crowdin [ci skip]

* fix: New German translations from Crowdin [ci skip]

* fix: New Hebrew translations from Crowdin [ci skip]

* fix: New Hungarian translations from Crowdin [ci skip]

* fix: New Italian translations from Crowdin [ci skip]

* fix: New Dutch translations from Crowdin [ci skip]

* fix: New Polish translations from Crowdin [ci skip]

* fix: New Portuguese translations from Crowdin [ci skip]

* fix: New Swedish translations from Crowdin [ci skip]

* fix: New Turkish translations from Crowdin [ci skip]

* fix: New Ukrainian translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Chinese Traditional translations from Crowdin [ci skip]

* fix: New Vietnamese translations from Crowdin [ci skip]

* fix: New Indonesian translations from Crowdin [ci skip]

* fix: New Persian translations from Crowdin [ci skip]

* fix: New Thai translations from Crowdin [ci skip]

* fix: New English, United Kingdom translations from Crowdin [ci skip]

* fix: New Norwegian Bokmal translations from Crowdin [ci skip]

* fix: New French translations from Crowdin [ci skip]

* fix: New Danish translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]

* fix: New Catalan translations from Crowdin [ci skip]

* fix: New Spanish translations from Crowdin [ci skip]

* fix: New Czech translations from Crowdin [ci skip]

* fix: New Romanian translations from Crowdin [ci skip]

* fix: New German translations from Crowdin [ci skip]

* fix: New Hebrew translations from Crowdin [ci skip]

* fix: New Hungarian translations from Crowdin [ci skip]

* fix: New Italian translations from Crowdin [ci skip]

* fix: New Dutch translations from Crowdin [ci skip]

* fix: New Polish translations from Crowdin [ci skip]

* fix: New Portuguese translations from Crowdin [ci skip]

* fix: New Swedish translations from Crowdin [ci skip]

* fix: New Turkish translations from Crowdin [ci skip]

* fix: New Ukrainian translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Chinese Traditional translations from Crowdin [ci skip]

* fix: New Vietnamese translations from Crowdin [ci skip]

* fix: New Indonesian translations from Crowdin [ci skip]

* fix: New Persian translations from Crowdin [ci skip]

* fix: New Thai translations from Crowdin [ci skip]

* fix: New English, United Kingdom translations from Crowdin [ci skip]

* fix: New Norwegian Bokmal translations from Crowdin [ci skip]

* fix: New German translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New German translations from Crowdin [ci skip]

* fix: New Italian translations from Crowdin [ci skip]

* fix: New French translations from Crowdin [ci skip]

* fix: New Danish translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]

* fix: New Catalan translations from Crowdin [ci skip]

* fix: New Spanish translations from Crowdin [ci skip]

* fix: New Czech translations from Crowdin [ci skip]

* fix: New Romanian translations from Crowdin [ci skip]

* fix: New German translations from Crowdin [ci skip]

* fix: New Hebrew translations from Crowdin [ci skip]

* fix: New Hungarian translations from Crowdin [ci skip]

* fix: New Italian translations from Crowdin [ci skip]

* fix: New Dutch translations from Crowdin [ci skip]

* fix: New Polish translations from Crowdin [ci skip]

* fix: New Portuguese translations from Crowdin [ci skip]

* fix: New Swedish translations from Crowdin [ci skip]

* fix: New Turkish translations from Crowdin [ci skip]

* fix: New Ukrainian translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Chinese Traditional translations from Crowdin [ci skip]

* fix: New Vietnamese translations from Crowdin [ci skip]

* fix: New Indonesian translations from Crowdin [ci skip]

* fix: New Persian translations from Crowdin [ci skip]

* fix: New Thai translations from Crowdin [ci skip]

* fix: New English, United Kingdom translations from Crowdin [ci skip]

* fix: New Norwegian Bokmal translations from Crowdin [ci skip]

* fix: New Persian translations from Crowdin [ci skip]

* fix: New French translations from Crowdin [ci skip]

* fix: New Danish translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]

* fix: New Catalan translations from Crowdin [ci skip]

* fix: New Spanish translations from Crowdin [ci skip]

* fix: New Czech translations from Crowdin [ci skip]

* fix: New Romanian translations from Crowdin [ci skip]

* fix: New German translations from Crowdin [ci skip]

* fix: New Hebrew translations from Crowdin [ci skip]

* fix: New Hungarian translations from Crowdin [ci skip]

* fix: New Italian translations from Crowdin [ci skip]

* fix: New Dutch translations from Crowdin [ci skip]

* fix: New Polish translations from Crowdin [ci skip]

* fix: New Portuguese translations from Crowdin [ci skip]

* fix: New Swedish translations from Crowdin [ci skip]

* fix: New Turkish translations from Crowdin [ci skip]

* fix: New Ukrainian translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Chinese Traditional translations from Crowdin [ci skip]

* fix: New Vietnamese translations from Crowdin [ci skip]

* fix: New Indonesian translations from Crowdin [ci skip]

* fix: New Persian translations from Crowdin [ci skip]

* fix: New Thai translations from Crowdin [ci skip]

* fix: New English, United Kingdom translations from Crowdin [ci skip]

* fix: New Norwegian Bokmal translations from Crowdin [ci skip]

* fix: New Persian translations from Crowdin [ci skip]

* fix: New Persian translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New Ukrainian translations from Crowdin [ci skip]

* fix: New French translations from Crowdin [ci skip]

* fix: New Danish translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]

* fix: New Catalan translations from Crowdin [ci skip]

* fix: New Spanish translations from Crowdin [ci skip]

* fix: New Czech translations from Crowdin [ci skip]

* fix: New Romanian translations from Crowdin [ci skip]

* fix: New German translations from Crowdin [ci skip]

* fix: New Hebrew translations from Crowdin [ci skip]

* fix: New Hungarian translations from Crowdin [ci skip]

* fix: New Italian translations from Crowdin [ci skip]

* fix: New Dutch translations from Crowdin [ci skip]

* fix: New Polish translations from Crowdin [ci skip]

* fix: New Portuguese translations from Crowdin [ci skip]

* fix: New Swedish translations from Crowdin [ci skip]

* fix: New Turkish translations from Crowdin [ci skip]

* fix: New Ukrainian translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Chinese Traditional translations from Crowdin [ci skip]

* fix: New Vietnamese translations from Crowdin [ci skip]

* fix: New Indonesian translations from Crowdin [ci skip]

* fix: New Persian translations from Crowdin [ci skip]

* fix: New Thai translations from Crowdin [ci skip]

* fix: New English, United Kingdom translations from Crowdin [ci skip]

* fix: New Norwegian Bokmal translations from Crowdin [ci skip]

* fix: New Italian translations from Crowdin [ci skip]

* fix: New Norwegian Bokmal translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Polish translations from Crowdin [ci skip]

* fix: New Polish translations from Crowdin [ci skip]

* fix: New Romanian translations from Crowdin [ci skip]

* fix: New French translations from Crowdin [ci skip]

* fix: New Spanish translations from Crowdin [ci skip]

* fix: New Catalan translations from Crowdin [ci skip]

* fix: New Czech translations from Crowdin [ci skip]

* fix: New Danish translations from Crowdin [ci skip]

* fix: New German translations from Crowdin [ci skip]

* fix: New Hebrew translations from Crowdin [ci skip]

* fix: New Hungarian translations from Crowdin [ci skip]

* fix: New Italian translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New Dutch translations from Crowdin [ci skip]

* fix: New Polish translations from Crowdin [ci skip]

* fix: New Portuguese translations from Crowdin [ci skip]

* fix: New Swedish translations from Crowdin [ci skip]

* fix: New Turkish translations from Crowdin [ci skip]

* fix: New Ukrainian translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Chinese Traditional translations from Crowdin [ci skip]

* fix: New Vietnamese translations from Crowdin [ci skip]

* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]

* fix: New Indonesian translations from Crowdin [ci skip]

* fix: New Persian translations from Crowdin [ci skip]

* fix: New Thai translations from Crowdin [ci skip]

* fix: New English, United Kingdom translations from Crowdin [ci skip]

* fix: New Norwegian Bokmal translations from Crowdin [ci skip]

* fix: New French translations from Crowdin [ci skip]

* fix: New French translations from Crowdin [ci skip]

* fix: New Spanish translations from Crowdin [ci skip]

* fix: New Catalan translations from Crowdin [ci skip]

* fix: New Czech translations from Crowdin [ci skip]

* fix: New Danish translations from Crowdin [ci skip]

* fix: New German translations from Crowdin [ci skip]

* fix: New Hebrew translations from Crowdin [ci skip]

* fix: New Hungarian translations from Crowdin [ci skip]

* fix: New Italian translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New Dutch translations from Crowdin [ci skip]

* fix: New Polish translations from Crowdin [ci skip]

* fix: New Portuguese translations from Crowdin [ci skip]

* fix: New Swedish translations from Crowdin [ci skip]

* fix: New Turkish translations from Crowdin [ci skip]

* fix: New Ukrainian translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Chinese Traditional translations from Crowdin [ci skip]

* fix: New Vietnamese translations from Crowdin [ci skip]

* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]

* fix: New Indonesian translations from Crowdin [ci skip]

* fix: New Persian translations from Crowdin [ci skip]

* fix: New Thai translations from Crowdin [ci skip]

* fix: New Norwegian Bokmal translations from Crowdin [ci skip]
2026-08-01 07:25:13 -04:00
Tom MoorandGitHub 6e8b20e35f fix: OIDC forced secure cookie (#13217)
closes #13180
2026-08-01 07:24:31 -04:00
Translate-O-Tron 189c5fe7c6 Update Crowdin configuration file
[ci skip]
2026-07-31 22:31:35 -04:00
Tom MoorandGitHub 9264db2ce1 fix: Restore v3 i18n (#13215) 2026-07-31 21:43:59 -04:00
Tom MoorandGitHub 23d20d749d fix: policy serialization (#13211)
* fix: Membership IDs not serialized correctly in policies

* fix: Policy serialization
2026-07-31 21:41:16 -04:00
Tom MoorandGitHub a01b38665e fix: Shared content should not resolve for a suspended workspace (#13213) 2026-07-31 21:41:01 -04:00
Tom Moor 2d357a505b chore: upgrade brace-expansion 2026-07-31 21:34:58 -04:00
Tom MoorandGitHub aae3e4b81a perf: Reduce connections required for findByPk (#13214) 2026-07-31 13:19:40 -04:00
Tom MoorandGitHub 17accab55a fix: Strip comments for diffing (#13212)
* fix: Strip comments for diffing

* feedback
2026-07-31 08:03:16 -04:00
Tom MoorandGitHub 9a50a980f8 Update CSRF handling to set secure host-bound where possible (#13203) 2026-07-30 17:27:11 -04:00
a15e66740a perf: Reduce data loading on revisions.list endpoint (#13202)
* perf: Reduce data loading on revisions.list endpoint

* test: Cover includeContent option on Document.findByPk

Also fixes a JSDoc typo on the includeViews option.

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-07-30 08:34:17 -04:00
Tom MoorandGitHub 2c161b8158 fix: Incorrect text wrap in version control (#13200) 2026-07-30 07:26:30 -04:00
uditandGitHub 64b931aad8 fix: Revision diff not shown when previous revision loads late (#13140)
The revision editor builds its extensions once, on mount, and is remounted
via its `key` when they change. Since revisions.list stopped returning
content in #12822 the previous revision's data is fetched after the first
render, so the Diff extension is created on a later render — by which point
the editor has already been built without it and the key, which only
tracked `compareTo`, does not change.

The result is a revision view with neither diff highlights nor a change
count, which appears intermittent because it works whenever the previous
revision's content already happens to be in the store.

Include the diff inputs in the editor key so the editor is rebuilt when the
comparison content arrives, when the compared-against revision changes, and
when changes are toggled on or off.

Closes #12964
2026-07-29 23:15:52 -04:00
yoominhoandGitHub 647352f6a0 perf: O(1) title lookup in markdown import merge (#13117)
collectDocumentsAndAttachments merged a folder/file sharing a title by scanning
the sibling list with out.find(d => d.title === child.title) once per child —
O(n²) over the number of siblings in one directory, which for a flat import can
be large. Index the siblings by title in a Map and look up in O(1). First
occurrence wins, matching find; the merge still mutates the same object.
2026-07-29 23:04:08 -04:00
Tom MoorandGitHub d54281cdb6 fix: Archived collections have incorrect depth (#13199) 2026-07-29 23:03:39 -04:00