fix#14330
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Improved print-to-PDF rendering by enforcing a consistent light theme,
ensuring better readability and visual consistency in exported PDF
documents.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This PR contains the following updates:
| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@googleapis/androidpublisher](https://redirect.github.com/googleapis/google-api-nodejs-client)
| [`^31.0.0` →
`^35.0.0`](https://renovatebot.com/diffs/npm/@googleapis%2fandroidpublisher/31.0.0/35.1.1)
|

|

|
---
### Release Notes
<details>
<summary>googleapis/google-api-nodejs-client
(@​googleapis/androidpublisher)</summary>
###
[`v35.1.0`](https://redirect.github.com/googleapis/google-api-nodejs-client/blob/HEAD/CHANGELOG.md#13510-2024-04-30)
##### Features
- add API version to request
([b0fe3c6](b0fe3c63e7))
###
[`v35.0.0`](https://redirect.github.com/googleapis/google-api-nodejs-client/blob/HEAD/CHANGELOG.md#13500-2024-04-04)
[Compare
Source](https://redirect.github.com/googleapis/google-api-nodejs-client/compare/v34.0.0...v35.0.0)
##### ⚠ BREAKING CHANGES
- This release has breaking changes.
- **storagetransfer:** This release has breaking changes.
- **storage:** This release has breaking changes.
- **looker:** This release has breaking changes.
- **logging:** This release has breaking changes.
- **language:** This release has breaking changes.
- **discoveryengine:** This release has breaking changes.
- **dataform:** This release has breaking changes.
- **connectors:** This release has breaking changes.
- **compute:** This release has breaking changes.
- **cloudbuild:** This release has breaking changes.
##### Features
- **admin:** update the API
([939730c](939730cc60))
- **aiplatform:** update the API
([bee5953](bee5953b97))
- **alloydb:** update the API
([811596d](811596da7a))
- **analyticsadmin:** update the API
([6a12917](6a129176d3))
- **analyticshub:** update the API
([620e881](620e88110e))
- **appengine:** update the API
([363be51](363be514b9))
- **apphub:** update the API
([6acbca7](6acbca76ad))
- **artifactregistry:** update the API
([f660310](f660310c8a))
- **authorizedbuyersmarketplace:** update the API
([ce3b9d9](ce3b9d9cd6))
- **beyondcorp:** update the API
([7912c1c](7912c1c607))
- **bigquery:** update the API
([bb0336c](bb0336c60f))
- **bigtableadmin:** update the API
([2ffb49d](2ffb49daad))
- **chat:** update the API
([2ac1b12](2ac1b12dc6))
- **chromemanagement:** update the API
([131c12a](131c12acfa))
- **cloudbilling:** update the API
([b7cf2f0](b7cf2f0220))
- **cloudbuild:** update the API
([5ed8cc6](5ed8cc66f9))
- **clouddeploy:** update the API
([7537bf0](7537bf0701))
- **cloudfunctions:** update the API
([d94398d](d94398def4))
- **cloudidentity:** update the API
([ba88c53](ba88c53f37))
- **cloudresourcemanager:** update the API
([de01fce](de01fce516))
- **composer:** update the API
([0893491](089349119e))
- **compute:** update the API
([65016d0](65016d05e4))
- **connectors:** update the API
([d81f31d](d81f31d620))
- **containeranalysis:** update the API
([26dd897](26dd897117))
- **container:** update the API
([0642926](06429263ae))
- **content:** update the API
([6a26ecc](6a26ecc24d))
- **dataform:** update the API
([ad1b4a6](ad1b4a63cf))
- **dataplex:** update the API
([14a6f0e](14a6f0e581))
- **dataportability:** update the API
([28a4af4](28a4af46a4))
- **dialogflow:** update the API
([3d7fb88](3d7fb8880f))
- **discoveryengine:** update the API
([e5ab8e6](e5ab8e651d))
- **dlp:** update the API
([37c56f8](37c56f8ad7))
- **dns:** update the API
([ab06b13](ab06b132a7))
- **file:** update the API
([ff74297](ff74297097))
- **gkehub:** update the API
([105445d](105445d344))
- **language:** update the API
([1972ea6](1972ea604b))
- **logging:** update the API
([2df1a80](2df1a80842))
- **looker:** update the API
([36a47c8](36a47c8bb2))
- **metastore:** update the API
([805d5a3](805d5a3647))
- **networkmanagement:** update the API
([c98987c](c98987cb96))
- **networksecurity:** update the API
([4187916](41879162ad))
- **places:** update the API
([6eba24a](6eba24ad49))
- **playdeveloperreporting:** update the API
([49b07d6](49b07d639a))
- **redis:** update the API
([5163287](5163287f3f))
- regenerate index files
([ce9aead](ce9aead7b3))
- **retail:** update the API
([bf50f07](bf50f07fcb))
- run the generator
([#​3456](https://redirect.github.com/googleapis/google-api-nodejs-client/issues/3456))
([a865e81](a865e81539))
- **run:** update the API
([7c08e19](7c08e19e0e))
- **secretmanager:** update the API
([a9269af](a9269af282))
- **serviceusage:** update the API
([b9c0c7c](b9c0c7c637))
- **slides:** update the API
([2f1749c](2f1749cf58))
- **spanner:** update the API
([420bebb](420bebbe23))
- **sqladmin:** update the API
([f17c99a](f17c99aed6))
- **storagetransfer:** update the API
([e2ad916](e2ad916923))
- **storage:** update the API
([7c5e1b3](7c5e1b3a32))
- **tasks:** update the API
([0ea6252](0ea62529dc))
- **workloadmanager:** update the API
([d8ded70](d8ded700ca))
- **workstations:** update the API
([e26e7bc](e26e7bc4f8))
- **youtube:** update the API
([b0cfa8e](b0cfa8e1b2))
##### Bug Fixes
- **bigqueryreservation:** update the API
([f3a175e](f3a175e2cd))
- **cloudsupport:** update the API
([ae1260a](ae1260a4fd))
- **cloudtasks:** update the API
([aeed97f](aeed97f086))
- **contactcenterinsights:** update the API
([318ae1a](318ae1a598))
- **dataproc:** update the API
([25dc88c](25dc88ca86))
- **displayvideo:** update the API
([0a0acce](0a0acce896))
- **doubleclickbidmanager:** update the API
([d0ec267](d0ec267bc5))
- **firebaseappcheck:** update the API
([cc3dda9](cc3dda9a04))
- **firestore:** update the API
([1e04a1a](1e04a1a792))
- **gkeonprem:** update the API
([1da4ff6](1da4ff6a70))
- **iamcredentials:** update the API
([0970e64](0970e64300))
- **marketingplatformadmin:** update the API
([0fd37f9](0fd37f9c20))
- **migrationcenter:** update the API
([dceb089](dceb089463))
- **monitoring:** update the API
([98f0bb0](98f0bb02dd))
- **networkconnectivity:** update the API
([069adea](069adea86f))
- **networkservices:** update the API
([6354932](6354932164))
- **notebooks:** update the API
([4793392](4793392057))
- **pubsub:** update the API
([3422f11](3422f112fb))
- **walletobjects:** update the API
([fb7c2ce](fb7c2ceebc))
###
[`v34.0.0`](https://redirect.github.com/googleapis/google-api-nodejs-client/blob/HEAD/CHANGELOG.md#13400-2024-03-12)
##### ⚠ BREAKING CHANGES
- This release has breaking changes.
- This release has breaking changes.
- This release has breaking changes.
##### Features
- **androidpublisher:** update the API
([e4b9a48](e4b9a484eb))
- **composer:** update the API
([079615e](079615eea2))
- **compute:** update the API
([38e7737](38e7737b08))
- **dataform:** update the API
([3b30605](3b306058e8))
- regenerate index files
([f453603](f453603e5a))
- run the generator
([#​3434](https://redirect.github.com/googleapis/google-api-nodejs-client/issues/3434))
([f0db524](f0db524bb2))
- run the generator
([#​3441](https://redirect.github.com/googleapis/google-api-nodejs-client/issues/3441))
([f832463](f832463312))
- run the generator
([#​3447](https://redirect.github.com/googleapis/google-api-nodejs-client/issues/3447))
([873b559](873b55950b))
- **testing:** update the API
([a188b41](a188b41878))
##### Bug Fixes
- **bigquerydatatransfer:** update the API
([05c5eb7](05c5eb7ff5))
- change packageJson sideEffects to boolean
([#​3435](https://redirect.github.com/googleapis/google-api-nodejs-client/issues/3435))
([e9aabeb](e9aabebf0e)),
closes
[#​3428](https://redirect.github.com/googleapis/google-api-nodejs-client/issues/3428)
- **cloudidentity:** update the API
([f35c89f](f35c89f62b))
- **cloudtasks:** update the API
([1415619](14156190b6))
- **networkconnectivity:** update the API
([55a5a31](55a5a31890))
- **notebooks:** update the API
([c0cafa8](c0cafa8d41))
###
[`v32.0.0`](https://redirect.github.com/googleapis/google-api-nodejs-client/blob/HEAD/CHANGELOG.md#13200-2024-02-02)
[Compare
Source](https://redirect.github.com/googleapis/google-api-nodejs-client/compare/v31.0.0...v32.0.0)
##### ⚠ BREAKING CHANGES
- **vmwareengine:** This release has breaking changes.
- **storage:** This release has breaking changes.
- **script:** This release has breaking changes.
- **sasportal:** This release has breaking changes.
- **prod\_tt\_sasportal:** This release has breaking changes.
- **discoveryengine:** This release has breaking changes.
- **dataflow:** This release has breaking changes.
- **compute:** This release has breaking changes.
- **blockchainnodeengine:** This release has breaking changes.
- **bigtableadmin:** This release has breaking changes.
- **bigquery:** This release has breaking changes.
- **alloydb:** This release has breaking changes.
- **aiplatform:** This release has breaking changes.
##### Features
- **aiplatform:** update the API
([cba6496](cba6496a2e))
- **alertcenter:** update the API
([4149165](4149165d17))
- **alloydb:** update the API
([46e2226](46e2226241))
- **analyticsadmin:** update the API
([88bd2db](88bd2db2f6))
- **androidmanagement:** update the API
([80c827b](80c827b2ff))
- **androidpublisher:** update the API
([990f7dc](990f7dc3b0))
- **apphub:** update the API
([93e48d3](93e48d3c8d))
- **artifactregistry:** update the API
([19c744c](19c744c7fc))
- **batch:** update the API
([afcbf80](afcbf805b2))
- **bigquery:** update the API
([489bf2f](489bf2ffd8))
- **bigtableadmin:** update the API
([05611d8](05611d8a95))
- **blockchainnodeengine:** update the API
([ec5ff13](ec5ff1392d))
- **calendar:** update the API
([70b4f02](70b4f02fad))
- **chat:** update the API
([9025eed](9025eed774))
- **chromepolicy:** update the API
([57109aa](57109aabfc))
- **cloudasset:** update the API
([c1e4ab0](c1e4ab0341))
- **clouddeploy:** update the API
([862139c](862139c06e))
- **cloudfunctions:** update the API
([608ff76](608ff76c62))
- **cloudidentity:** update the API
([1217ce4](1217ce4ce2))
- **cloudsupport:** update the API
([663b770](663b7701f2))
- **composer:** update the API
([e4d1687](e4d1687982))
- **compute:** update the API
([014e200](014e200c79))
- **connectors:** update the API
([102625b](102625b204))
- **contactcenteraiplatform:** update the API
([076984f](076984f0bc))
- **contactcenterinsights:** update the API
([c4aa133](c4aa133219))
- **container:** update the API
([ac3a11c](ac3a11cc7e))
- **dataflow:** update the API
([83ba2b6](83ba2b6ab8))
- **dataform:** update the API
([ba04837](ba048379ba))
- **datastore:** update the API
([8287f11](8287f1158e))
- **datastream:** update the API
([a5d1c9c](a5d1c9c4c4))
- **dialogflow:** update the API
([e8db16f](e8db16f0b6))
- **discoveryengine:** update the API
([ce0ec76](ce0ec76e61))
- **displayvideo:** update the API
([d50a81a](d50a81acf1))
- **dlp:** update the API
([c32baf0](c32baf03ae))
- **documentai:** update the API
([24d2893](24d28932bb))
- **drive:** update the API
([3862e92](3862e92b35))
- **firebaseappcheck:** update the API
([34aea86](34aea86b6b))
- **firestore:** update the API
([ccbb1f0](ccbb1f08c6))
- **gkehub:** update the API
([c7e634b](c7e634b035))
- **healthcare:** update the API
([f968248](f9682484b7))
- **logging:** update the API
([ce04723](ce04723a83))
- **migrationcenter:** update the API
([d374bff](d374bff802))
- **networkmanagement:** update the API
([48d5fd8](48d5fd8f36))
- **notebooks:** update the API
([f0fd05d](f0fd05d9da))
- **paymentsresellersubscription:** update the API
([78e1410](78e141073f))
- **policysimulator:** update the API
([499a27d](499a27dfb9))
- **prod\_tt\_sasportal:** update the API
([869d102](869d102347))
- **pubsub:** update the API
([a84da31](a84da3194b))
- **recaptchaenterprise:** update the API
([abe83f6](abe83f6639))
- **recommender:** update the API
([0879e9a](0879e9a5ba))
- regenerate index files
([d69ca14](d69ca14b68))
- **retail:** update the API
([a681493](a6814939d6))
- **sasportal:** update the API
([c979d58](c979d58c46))
- **script:** update the API
([1c78889](1c78889c76))
- **secretmanager:** update the API
([74282ab](74282ab1a5))
- **securitycenter:** update the API
([1f28c20](1f28c2008e))
- **spanner:** update the API
([7c371a3](7c371a3d51))
- **speech:** update the API
([d77180a](d77180a378))
- **sqladmin:** update the API
([a80b25a](a80b25a556))
- **storagetransfer:** update the API
([43173f6](43173f6399))
- **storage:** update the API
([5bc62e5](5bc62e590c))
- **texttospeech:** update the API
([1464272](1464272e8e))
- **tpu:** update the API
([02ec90d](02ec90d5a3))
- **vmwareengine:** update the API
([8f0ad46](8f0ad460fc))
- **walletobjects:** update the API
([47a7c9a](47a7c9a994))
- **workflowexecutions:** update the API
([22dabc5](22dabc50c8))
- **workloadmanager:** update the API
([a399523](a399523589))
- **workstations:** update the API
([5d55518](5d555180a3))
- **youtube:** update the API
([dc515e2](dc515e21eb))
##### Bug Fixes
- **accesscontextmanager:** update the API
([aa12f37](aa12f375ad))
- **analyticsdata:** update the API
([5847c48](5847c48697))
- **analyticshub:** update the API
([7df077f](7df077f664))
- **apigateway:** update the API
([6bb703f](6bb703fa39))
- **beyondcorp:** update the API
([4cd4b2c](4cd4b2c617))
- **bigqueryconnection:** update the API
([9a7ce77](9a7ce7711a))
- **bigquerydatapolicy:** update the API
([7b84678](7b84678a8e))
- **binaryauthorization:** update the API
([e242588](e24258843b))
- **cloudbilling:** update the API
([576eded](576ededec3))
- **cloudbuild:** update the API
([7c89f36](7c89f364d1))
- **cloudchannel:** update the API
([6dbfcbe](6dbfcbe73a))
- **cloudprofiler:** update the API
([effed14](effed14dee))
- **cloudresourcemanager:** update the API
([c2fba36](c2fba36af0))
- **cloudtasks:** update the API
([4099041](4099041178))
- **containeranalysis:** update the API
([478d5c9](478d5c9c3a))
- **content:** update the API
([6715e9e](6715e9e073))
- **datacatalog:** update the API
([6f7a6cc](6f7a6ccd58))
- **datafusion:** update the API
([5d11c89](5d11c89eb2))
- **datamigration:** update the API
([d4a6afd](d4a6afd8f8))
- **dataplex:** update the API
([2ed8677](2ed867728e))
- **dataportability:** update the API
([f7f9bae](f7f9bae5a3))
- **dataproc:** update the API
([d983519](d983519273))
- **deploymentmanager:** update the API
([3a175ff](3a175ffef5))
- **dns:** update the API
([fde40df](fde40dfd46))
- **domains:** update the API
([3ab647b](3ab647b49c))
- **doubleclicksearch:** update the API
([22efec1](22efec1b0f))
- **eventarc:** update the API
([da2e5a6](da2e5a6c5c))
- **gkebackup:** update the API
([55025a0](55025a034c))
- **iam:** update the API
([c67391f](c67391f6de))
- **iap:** update the API
([8bcea17](8bcea170bc))
- **identitytoolkit:** update the API
([9b113bd](9b113bd57d))
- **looker:** update the API
([f9609d8](f9609d830a))
- **managedidentities:** update the API
([8136966](81369665e9))
- **memcache:** update the API
([7c5efc3](7c5efc3f97))
- **metastore:** update the API
([b720258](b720258d75))
- **ml:** update the API
([5fb7d7c](5fb7d7c277))
- **networkconnectivity:** update the API
([9cc489f](9cc489f4e8))
- **networksecurity:** update the API
([d16ebd1](d16ebd1b2e))
- **networkservices:** update the API
([e97d268](e97d268f06))
- **osconfig:** update the API
([aaaf733](aaaf733832))
- **places:** update the API
([14129bb](14129bb351))
- **policytroubleshooter:** update the API
([820160f](820160f8ee))
- **privateca:** update the API
([5b06ea2](5b06ea26cd))
- **redis:** update the API
([1b34fef](1b34feff07))
- **run:** update the API
([d6e4c9e](d6e4c9edd6))
- **servicedirectory:** update the API
([f3bec00](f3bec00a8b))
- **servicemanagement:** update the API
([01229e3](01229e3654))
- **sourcerepo:** update the API
([3dad20b](3dad20b96d))
- **sts:** update the API
([b0d4b75](b0d4b75f83))
- **translate:** update the API
([dd89550](dd895505b4))
- **vmmigration:** update the API
([5ae80ff](5ae80ff878))
- **workflows:** update the API
([57e6cd8](57e6cd8ebf))
- **workspaceevents:** update the API
([ef0420c](ef0420cb87))
</details>
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box
---
This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45Mi4xIiwidXBkYXRlZEluVmVyIjoiNDIuOTIuMSIsInRhcmdldEJyYW5jaCI6ImNhbmFyeSIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
#### PR Dependency Tree
* **PR #14348** 👈
This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Added a dedicated S3-compatible client package and expanded
S3-compatible storage config (endpoint, region, forcePathStyle,
requestTimeoutMs, minPartSize, presign options, sessionToken).
* Document sync now broadcasts batched/compressed doc updates for more
efficient real-time syncing.
* **Tests**
* New unit and benchmark tests for base64 utilities and S3 multipart
listing; updated storage-related tests to match new formats.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Summary
Fixed the slash menu not appearing when typing `/` on mobile web
browsers.
## Problem
Mobile browsers don't reliably fire keyboard events (`keyDown`) when
using virtual keyboards. This caused the slash menu trigger to fail on
mobile devices.
## Solution
- Changed from handling `keyDown` events to `beforeInput` events
- `InputEvent` is fired consistently across all platforms (mobile and
desktop)
- Added proper handling for IME composition to avoid duplicate triggers
- Uses `waitForUpdate()` to ensure the input is processed before
checking for the trigger
## Test plan
- [x] Tested on mobile Safari (iOS)
- [x] Tested on mobile Chrome (Android)
- [x] Verified desktop browsers still work correctly
- [x] Verified IME input (e.g., Chinese/Japanese) doesn't trigger false
positives
Fixes#12910
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Improved slash menu input handling for better reliability and enhanced
IME (input method editor) composition support.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## What this PR does
Closes#13869
Adds a global setting to toggle image anti-aliasing in AFFiNE.
When disabled, images are rendered using nearest-neighbor scaling
(`image-rendering: pixelated`), preserving crisp pixels for pixel art,
sprites, icons, and low-resolution images.
## Why
Anti-aliasing causes small images to become blurry when scaled,
making it difficult to work with pixel art and technical assets.
## How to test
1. Open Settings → Appearance → Images
2. Toggle “Smooth image rendering”
3. Observe image scaling behavior:
- ON: smooth / anti-aliased
- OFF: pixelated / nearest-neighbor
## Notes
- Frontend-only change
- No backend required
# BEFORE
<img width="1911" height="909" alt="Screenshot 2026-01-18 202651"
src="https://github.com/user-attachments/assets/a40816c3-93fa-416d-90ec-38a919da182f"
/>
# AFTER
<img width="1919" height="910" alt="Screenshot 2026-01-18 202705"
src="https://github.com/user-attachments/assets/19fc348b-5f14-4e32-b6a8-a0905e569af5"
/>
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Added an Images section in Appearance with a toggle to switch image
antialiasing on/off (setting is persisted).
* **Style**
* When antialiasing is turned off, images render with pixelated scaling
for a crisp, non-smoothed look.
* **Localization**
* Added English labels and description for the new Images and
antialiasing options.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
fix#14296fix#14289
#### PR Dependency Tree
* **PR #14315** 👈
This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Improved inline editor stability for selection edge cases and
beforeinput handling, with better recovery and native-input protection.
* Fixed potential crashes when deleting with selections outside the
editor bounds, including Firefox-specific scenarios.
* **Tests**
* Added unit tests covering beforeinput behavior and added Firefox
end-to-end regression tests.
* **Chores**
* Reduced CI test parallelism to streamline pipeline.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
fix#14309
#### PR Dependency Tree
* **PR #14312** 👈
This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Added AI chat session deletion with confirmation dialogs and
success/failure notifications.
* Localized AI chat panel labels, loading messages, and session
management text across multiple languages.
* **Documentation**
* Added internationalization support for chat panel titles, history
loading states, and deletion confirmations.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
# Summary
This PR fixes a server-side cookie parsing edge case where malformed
cookie values throw `URI malformed`, causing socket.io auth to fail and
clients to get stuck in infinite workspace loading/syncing.
# Observed Behavior
- User creates a cloud-backed workspace and invites another user to it.
- Second user accepts the invite, awaits approval, and attempts to load
the workspace, getting stuck in infinite loading state.
- `api/workspaces/<id>/docs/<id>` return 404 for those users, as the
workspace they are trying to access was not synced to the server.
- Server logs show socket.io `CONNECT_ERROR` with `URI malformed`, then
connection closed.
# Confirmed Trigger
An externally-managed `auth_session` cookie containing a raw `%` symbol
causes `decodeURIComponent` to throw. This matches the observed
socket.io `CONNECT_ERROR`, explaining why some users were affected while
the rest were not.
# Root Cause
The `parseCookies` function calls `decodeURIComponent` on every cookie
key/value without guard, so when a malformed percent-encoded value is
encountered, `decodeURIComponent` throws, which bubbles into the
socket.io auth middleware, aborting the connection.
# Fix
Wrap `decodeURIComponent` calls in `try/catch`, on failure falling back
to the raw key/value.
# Testing
- Manually regenerating the bad cookie until no malformed parts are
present resolves the issue.
- With the guard in place, affected users can open shared workspaces
with sync successfully completing.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Improved cookie parsing robustness so malformed cookie values no
longer cause errors; the system now preserves raw cookie values when
decoding fails.
* **Tests**
* Added test coverage to ensure cookie parsing handles invalid/malformed
cookie values without throwing.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
#### PR Dependency Tree
* **PR #14258**
* **PR #14259** 👈
This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Refactor**
* Split AI initialization into separate editor, app, and shared
registries; removed legacy chat-panel and replaced it with a
component-based editor chat, updating wiring and public exports.
* Propagated server/subscription/model services into chat/playground
components and improved session lifecycle and UI composition.
* **Tests**
* Added tests for AI effect registration and chat session resolution;
extended DOM/test utilities and assertions.
* **Chores**
* Added happy-dom for runtime and test environments.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Expose is requierd for automatic port finding with load balancers like
Traefik without having to configure the port explict.
> error="service \"affine-affine\" error: port is missing"
container=affine-affine-a76ca4362da101be5a53279db7aac67595a9df0783b0026efc3e5431009cbd66
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Chores**
* Updated deployment configuration for container port exposure.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Problem
In Kanban view, clicking the `Empty` value for the Member property can
cause the member popover layout to overflow/break due to a fixed
container width.
### Before ScreenShot
<img width="410" height="119" alt="image"
src="https://github.com/user-attachments/assets/e0d28a37-2ea4-4a65-afca-e4ef10af37dd"
/>
## Repro
1. Open a Database in Kanban view
2. Ensure the Member property has some cards with `Empty`
3. Click the `Empty` member value
4. Observe the popover layout overflow/broken UI
## Solution
Make the popover container responsive by using `width: 100%` with
`maxWidth: 415px` to preserve the original intended size while
preventing overflow in narrow containers.
### After ScreenShot
<img width="410" height="146" alt="image (1)"
src="https://github.com/user-attachments/assets/d97e6b8b-eabc-499a-9f04-0422505c67bf"
/>
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Style**
* Improved member selector popover styling: unified padding, made width
responsive with a max width limit, and added box-sizing for more
consistent layout and spacing across screen sizes.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This pr fixes#14273.
I have implemented two minor CSS adjustments to resolve the navbar
interaction issue on the sign-in page:
- Removed position: relative and z-index: 1 from signInPageContainer.
- Set z-index: 1 on the SignInPanel div (prevent SignInBackgroundArts
from overlapping the SignInPanel)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Style**
* Adjusted z-index layering for the sign-in page component.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
### What
Adds support for rendering an optional image above the document title
using document metadata.
### Why
Provides a visual identifier for documents and improves readability for
users who rely on visual cues.
### How
- Reads `headerImage` from document metadata (if present)
- Renders the image above the editor when present
- Fully optional and non-breaking
- No BlockSuite or data model changes
### Related
fix#14240
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Documents can now display header images in the page editor. When a
header image is available, it appears above the editor content,
enhancing visual presentation and providing better context for your
documents.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Summary
This PR adds write capabilities to AFFiNE's MCP (Model Context Protocol)
integration, enabling external tools (Claude, GPT, etc.) to create and
modify documents programmatically.
**New MCP Tools:**
- `create_document` - Create new documents from markdown content
- `update_document` - Update document content using structural diffing
for minimal changes (preserves document history and enables real-time
collaboration)
**Implementation:**
- `markdown_to_ydoc.rs` - Converts markdown to AFFiNE-compatible y-octo
binary format
- `markdown_utils.rs` - Shared markdown parsing utilities (used by both
ydoc-to-md and md-to-ydoc)
- `update_ydoc.rs` - Structural diffing implementation for updating
existing documents
- `DocWriter` service - TypeScript service for document operations
- Exposes `markdownToDocBinary` and `updateDocBinary` via napi bindings
**Supported Markdown Elements:**
- Headings (H1-H6)
- Paragraphs
- Bullet lists and numbered lists
- Code blocks (with language detection)
- Blockquotes
- Horizontal dividers
- Todo items (checkboxes)
**y-octo Changes:**
This PR reverts the y-octo sync (ca2462f, a5b60cf) which introduced a
concurrency bug causing hangs when creating documents with many nested
block structures. It also ports the improved `get_node_index` binary
search fix from upstream that prevents divide-by-zero panics when
decoding documents.
## Test Results ✅
### Unit Tests (47/47 passing)
| Test Suite | Tests | Status |
|------------|-------|--------|
| markdown_to_ydoc | 16/16 | ✅ Pass |
| markdown_utils | 11/11 | ✅ Pass |
| update_ydoc | 13/13 | ✅ Pass |
| delta_markdown | 2/2 | ✅ Pass |
| affine (doc parser) | 5/5 | ✅ Pass |
### End-to-End MCP Testing ✅
Tested against local AFFiNE server with real MCP client requests:
| Tool | Result | Notes |
|------|--------|-------|
| `tools/list` | ✅ Pass | Returns all 5 tools with correct schemas |
| `create_document` | ✅ Pass | Successfully created test documents |
| `update_document` | ✅ Pass | Successfully updated documents with
structural diffing |
| `read_document` | ✅ Pass | Existing tool, works correctly |
| `keyword_search` | ✅ Pass | Existing tool, works correctly |
**E2E Test Details:**
- Started local AFFiNE server with PostgreSQL, Redis, and Manticore
- Created test user and workspace via seed/GraphQL
- Verified MCP endpoint at `/api/workspaces/:workspaceId/mcp`
- Tested JSON-RPC calls with proper SSE streaming
- Confirmed documents are stored and indexed correctly (verified via
server logs)
## Test Plan
- [x] All Rust unit tests pass (47 tests)
- [x] Native bindings build successfully (release mode)
- [x] Document creation via MCP works end-to-end
- [x] Document update via MCP works end-to-end
- [x] CodeRabbit feedback addressed
- [ ] Integration testing with Claude/GPT MCP clients
Closes#14161
---
**Requested by:** @realies
**Key guidance from:** @darkskygit (use y-octo instead of yjs for memory
efficiency)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Create documents from Markdown: generate new documents directly from
Markdown content with automatic title extraction
* Update documents with Markdown: modify existing documents using
Markdown as the source with automatic diff calculation for efficient
updates
* Copilot integration: new tools for document creation and updates
through Copilot's interface
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
#### PR Dependency Tree
* **PR #14258** 👈
This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
## Release Notes
* **Removed Features**
* Web search functionality has been removed from AI chat and related AI
features. Users will no longer see network search options or toggles in
chat preferences and panels.
* AI chat requests no longer support external web search capabilities.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
#### PR Dependency Tree
* **PR #14258** 👈
* **PR #14259**
This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)
#### PR Dependency Tree
* **PR #14251** 👈
This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Current user profile now exposes access tokens, revealed tokens, and
detailed calendar accounts/subscriptions.
* Workspace now exposes permissions, calendars, calendar events, and a
workspace-scoped blob upload part URL.
* New document-update mutation for applying doc updates.
* **API Changes**
* validateAppConfig is now a query (mutation deprecated).
* Several legacy top-level calendar/blob endpoints deprecated in favor
of user/workspace fields.
* **Refactor**
* Calendar, blob-upload and access-token surfaces reorganized to use
user/workspace-centric fields.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
#### PR Dependency Tree
* **PR #14250** 👈
This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Backend Optimization**
* Faster document retrieval via a native binary fetch path.
* Native-accelerated merging of document updates for improved
performance and consistency.
* **Indexing & Reliability**
* Indexing now only proceeds on valid parse results, with clearer
warnings and richer metadata on failures.
* More consistent sync behavior and enhanced diagnostic logging for
indexing operations.
* **Tests**
* Expanded tests to cover native binary retrieval error handling.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
fix#14170fix#13893fix#13673fix#13543fix#13308fix#7607
#### PR Dependency Tree
* **PR #14247**
* **PR #14248** 👈
This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Integrations panel in Account Settings to link/unlink calendar
providers.
* Collapsible settings wrapper for improved layout.
* **Improvements**
* Calendar system reworked: per-account calendar groups, simplified
toggles with explicit Save, richer event display (multi-dot date
indicators), improved event time/title handling across journal views.
* **Localization**
* Added calendar keys: save-error, no-journal, no-calendar; removed
legacy duplicate-error keys.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
#### PR Dependency Tree
* **PR #14247** 👈
* **PR #14248**
This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Google Calendar integration (disabled by default): link/unlink
accounts, OAuth flow, webhooks, real-time push, background sync,
workspace calendars with customizable items and date-range event
viewing.
* **GraphQL / Client**
* New queries & mutations for accounts, subscriptions, events,
providers, and workspace calendar management.
* **Localization**
* Added localized error message for calendar provider request failures.
* **Tests**
* Backend tests covering sync, webhook renewal, and error/error-recovery
scenarios.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
#### PR Dependency Tree
* **PR #14243** 👈
This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Batch management API for coordinated document mutations and change
tracking.
* New document accessors (IDs, state snapshots, change/delete set
queries) and subscriber count.
* **Chores**
* Upgraded Rust edition across packages to 2024.
* Repository-wide formatting, stylistic cleanups and test adjustments.
* **Breaking Changes**
* Removed the Node native bindings package and its JS/TS declarations
and tests (no longer published/available).
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Refactors the compareString function to safely handle null and undefined
inputs and improves overall string comparison logic. This prevents
incorrect sort behavior and ensures consistent ordering when comparing
mixed or missing values, particularly in table view sorting scenarios.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Improved string comparison used for sorting: empty values are
consistently placed last, numeric parts sort numerically before
non-numeric parts, and mixed-type and case variations are handled more
predictably for stable, consistent ordering across data views.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Chores**
* Updated backend service dependencies to the latest stable versions for
improved performance and security.
* Upgraded UI component library dependencies to the latest minor
releases.
* **Improvements**
* Enhanced web search functionality for better search results on
standard AI models.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
**Problem**
Slash menu can be prematurely aborted when the query is still in
`no_result`
due to async query updates after deletion.
**Solution**
Keep the slash menu alive on text input while in `no_result`,
preventing aborts based on a stale query state.
**Repro**
1. Type `/eeee`
2. Delete to `/`
3. Type `h`
4. Slash menu should recover and show results
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Enhanced slash-menu keyboard interaction: users can now continue
typing to refine queries when no results are displayed, instead of the
menu closing unexpectedly. Keyboard navigation and other controls remain
responsive.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
close#13952
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Chores**
* Upgraded the shared theme library from v1.1.16 to v1.1.23 across the
project (core components, UI widgets, content blocks, and frontend
apps), delivering the latest styling and design refinements
platform-wide.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: L-Sun <zover.v@gmail.com>
The old code hardcoded 0.0.0.0 which means the server only listened for
ipv4 connections, making it not work on ipv6-only networks.
This change adds a LISTEN_ADDR env var which allows the server to bind
to ipv6 as well.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Server listen address is now configurable via the LISTEN_ADDR
environment variable (default: 0.0.0.0), enabling IPv4/IPv6 or
interface-specific binding.
* Configuration schemas and admin UI now expose the listen address
option so deployments can view and override it.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Fix https://github.com/toeverything/AFFiNE/issues/14059
With the help of Claude Opus 4.5
Improve handling of keyCode fallback for non-standard keyboards by only
applying it when modifier keys are pressed. This change prevents
incorrect fallback behavior for non-ASCII characters, ensuring users can
type intended characters without triggering shortcuts.
After
https://github.com/user-attachments/assets/00ab4fb2-4bc2-4ca7-a284-9782686d298c
Event dump for Cyrillic x
```json
{
"key": "х",
"keyCode": 219,
"which": 219,
"code": "BracketLeft",
"location": 0,
"altKey": false,
"ctrlKey": false,
"metaKey": false,
"shiftKey": false,
"repeat": false
}
```
blocksuite commit
4c0d39890f (diff-68c46455e0eece88312235df85f8ce27ae254efccde6fb987f2505180730bd8c)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Refined keyboard input handling to properly support non-ASCII
characters (e.g., Cyrillic, Greek) by ensuring user-typed characters are
preserved instead of inadvertently triggering keyboard shortcuts. The
fix maintains keyboard shortcut functionality while improving
compatibility with international keyboards and input methods.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-01-04 09:18:03 +00:00
695 changed files with 28734 additions and 14184 deletions
"description":"The config for the s3 compatible storage provider. directly passed to aws-sdk client.\n@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html",
"description":"The config for the S3 compatible storage provider.",
"properties":{
"endpoint":{
"type":"string",
"description":"The S3 compatible endpoint. Example: \"https://s3.us-east-1.amazonaws.com\" or \"https://<account>.r2.cloudflarestorage.com\"."
},
"region":{
"type":"string",
"description":"The region for the storage provider. Example: \"us-east-1\" or \"auto\" for R2."
},
"forcePathStyle":{
"type":"boolean",
"description":"Whether to use path-style bucket addressing."
},
"requestTimeoutMs":{
"type":"number",
"description":"Request timeout in milliseconds."
},
"minPartSize":{
"type":"number",
"description":"Minimum multipart part size in bytes."
"description":"Expiration time in seconds for presigned URLs."
},
"signContentTypeForPut":{
"type":"boolean",
"description":"Whether to sign Content-Type for presigned PUT."
}
}
},
"credentials":{
"type":"object",
"description":"The credentials for the s3 compatible storage provider.",
@@ -348,6 +382,9 @@
},
"secretAccessKey":{
"type":"string"
},
"sessionToken":{
"type":"string"
}
}
}
@@ -369,8 +406,42 @@
},
"config":{
"type":"object",
"description":"The config for the s3 compatible storage provider. directly passed to aws-sdk client.\n@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html",
"description":"The config for the S3 compatible storage provider.",
"properties":{
"endpoint":{
"type":"string",
"description":"The S3 compatible endpoint. Example: \"https://s3.us-east-1.amazonaws.com\" or \"https://<account>.r2.cloudflarestorage.com\"."
},
"region":{
"type":"string",
"description":"The region for the storage provider. Example: \"us-east-1\" or \"auto\" for R2."
},
"forcePathStyle":{
"type":"boolean",
"description":"Whether to use path-style bucket addressing."
},
"requestTimeoutMs":{
"type":"number",
"description":"Request timeout in milliseconds."
},
"minPartSize":{
"type":"number",
"description":"Minimum multipart part size in bytes."
"description":"Expiration time in seconds for presigned URLs."
},
"signContentTypeForPut":{
"type":"boolean",
"description":"Whether to sign Content-Type for presigned PUT."
}
}
},
"credentials":{
"type":"object",
"description":"The credentials for the s3 compatible storage provider.",
@@ -380,6 +451,9 @@
},
"secretAccessKey":{
"type":"string"
},
"sessionToken":{
"type":"string"
}
}
},
@@ -458,8 +532,42 @@
},
"config":{
"type":"object",
"description":"The config for the s3 compatible storage provider. directly passed to aws-sdk client.\n@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html",
"description":"The config for the S3 compatible storage provider.",
"properties":{
"endpoint":{
"type":"string",
"description":"The S3 compatible endpoint. Example: \"https://s3.us-east-1.amazonaws.com\" or \"https://<account>.r2.cloudflarestorage.com\"."
},
"region":{
"type":"string",
"description":"The region for the storage provider. Example: \"us-east-1\" or \"auto\" for R2."
},
"forcePathStyle":{
"type":"boolean",
"description":"Whether to use path-style bucket addressing."
},
"requestTimeoutMs":{
"type":"number",
"description":"Request timeout in milliseconds."
},
"minPartSize":{
"type":"number",
"description":"Minimum multipart part size in bytes."
"description":"Expiration time in seconds for presigned URLs."
},
"signContentTypeForPut":{
"type":"boolean",
"description":"Whether to sign Content-Type for presigned PUT."
}
}
},
"credentials":{
"type":"object",
"description":"The credentials for the s3 compatible storage provider.",
@@ -469,6 +577,9 @@
},
"secretAccessKey":{
"type":"string"
},
"sessionToken":{
"type":"string"
}
}
}
@@ -490,8 +601,42 @@
},
"config":{
"type":"object",
"description":"The config for the s3 compatible storage provider. directly passed to aws-sdk client.\n@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html",
"description":"The config for the S3 compatible storage provider.",
"properties":{
"endpoint":{
"type":"string",
"description":"The S3 compatible endpoint. Example: \"https://s3.us-east-1.amazonaws.com\" or \"https://<account>.r2.cloudflarestorage.com\"."
},
"region":{
"type":"string",
"description":"The region for the storage provider. Example: \"us-east-1\" or \"auto\" for R2."
},
"forcePathStyle":{
"type":"boolean",
"description":"Whether to use path-style bucket addressing."
},
"requestTimeoutMs":{
"type":"number",
"description":"Request timeout in milliseconds."
},
"minPartSize":{
"type":"number",
"description":"Minimum multipart part size in bytes."
"description":"Expiration time in seconds for presigned URLs."
},
"signContentTypeForPut":{
"type":"boolean",
"description":"Whether to sign Content-Type for presigned PUT."
}
}
},
"credentials":{
"type":"object",
"description":"The credentials for the s3 compatible storage provider.",
@@ -501,6 +646,9 @@
},
"secretAccessKey":{
"type":"string"
},
"sessionToken":{
"type":"string"
}
}
},
@@ -595,6 +743,11 @@
"description":"Multiple hosts the server will accept requests from.\n@default []",
"default":[]
},
"listenAddr":{
"type":"string",
"description":"The address to listen on (e.g., 0.0.0.0 for IPv4, :: for IPv6).\n@default \"0.0.0.0\"\n@environment `LISTEN_ADDR`",
"default":"0.0.0.0"
},
"port":{
"type":"number",
"description":"Which port the server will listen on.\n@default 3010\n@environment `AFFINE_SERVER_PORT`",
@@ -629,6 +782,45 @@
}
}
},
"telemetry":{
"type":"object",
"description":"Configuration for telemetry module",
"properties":{
"allowedOrigin":{
"type":"array",
"description":"Allowed origins for telemetry collection.\n@default [\"localhost\",\"127.0.0.1\"]",
"default":[
"localhost",
"127.0.0.1"
]
},
"ga4.measurementId":{
"type":"string",
"description":"GA4 Measurement ID for Measurement Protocol.\n@default \"\"\n@environment `GA4_MEASUREMENT_ID`",
"default":""
},
"ga4.apiSecret":{
"type":"string",
"description":"GA4 API secret for Measurement Protocol.\n@default \"\"\n@environment `GA4_API_SECRET`",
"default":""
},
"dedupe.ttlHours":{
"type":"number",
"description":"Telemetry dedupe TTL in hours.\n@default 24",
"default":24
},
"dedupe.maxEntries":{
"type":"number",
"description":"Telemetry dedupe max entries.\n@default 100000",
"default":100000
},
"batch.maxEvents":{
"type":"number",
"description":"Max events per telemetry batch.\n@default 25",
"default":25
}
}
},
"client":{
"type":"object",
"description":"Configuration for client module",
@@ -640,8 +832,42 @@
},
"versionControl.requiredVersion":{
"type":"string",
"description":"Allowed version range of the app that allowed to access the server. Requires 'client/versionControl.enabled' to be true to take effect.\n@default \">=0.20.0\"",
"default":">=0.20.0"
"description":"Allowed version range of the app that allowed to access the server. Requires 'client/versionControl.enabled' to be true to take effect.\n@default \">=0.25.0\"",
"default":">=0.25.0"
}
}
},
"calendar":{
"type":"object",
"description":"Configuration for calendar module",
"description":"The config for the s3 compatible storage provider. directly passed to aws-sdk client.\n@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html",
"description":"The config for the S3 compatible storage provider.",
"properties":{
"endpoint":{
"type":"string",
"description":"The S3 compatible endpoint. Example: \"https://s3.us-east-1.amazonaws.com\" or \"https://<account>.r2.cloudflarestorage.com\"."
},
"region":{
"type":"string",
"description":"The region for the storage provider. Example: \"us-east-1\" or \"auto\" for R2."
},
"forcePathStyle":{
"type":"boolean",
"description":"Whether to use path-style bucket addressing."
},
"requestTimeoutMs":{
"type":"number",
"description":"Request timeout in milliseconds."
},
"minPartSize":{
"type":"number",
"description":"Minimum multipart part size in bytes."
"description":"Expiration time in seconds for presigned URLs."
},
"signContentTypeForPut":{
"type":"boolean",
"description":"Whether to sign Content-Type for presigned PUT."
}
}
},
"credentials":{
"type":"object",
"description":"The credentials for the s3 compatible storage provider.",
@@ -874,6 +1134,9 @@
},
"secretAccessKey":{
"type":"string"
},
"sessionToken":{
"type":"string"
}
}
}
@@ -895,8 +1158,42 @@
},
"config":{
"type":"object",
"description":"The config for the s3 compatible storage provider. directly passed to aws-sdk client.\n@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html",
"description":"The config for the S3 compatible storage provider.",
"properties":{
"endpoint":{
"type":"string",
"description":"The S3 compatible endpoint. Example: \"https://s3.us-east-1.amazonaws.com\" or \"https://<account>.r2.cloudflarestorage.com\"."
},
"region":{
"type":"string",
"description":"The region for the storage provider. Example: \"us-east-1\" or \"auto\" for R2."
},
"forcePathStyle":{
"type":"boolean",
"description":"Whether to use path-style bucket addressing."
},
"requestTimeoutMs":{
"type":"number",
"description":"Request timeout in milliseconds."
},
"minPartSize":{
"type":"number",
"description":"Minimum multipart part size in bytes."
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.