Commit Graph
18450 Commits
Author SHA1 Message Date
spoofy 02efa6ed10 i18n: ru uk new UI strings (#29794)
* i18n: translate new UI strings into Russian and Ukrainian

* i18n: preserve established Ukrainian Valves terminology

* i18n: shorten Russian Modified label

* i18n: shorten Ukrainian Modified label

* i18n: shorten Russian and Ukrainian default labels
2026-09-08 13:23:41 -04:00
Timothy Jaeryang Baek 254e29b9af refac 2026-09-08 13:19:14 -04:00
Timothy Jaeryang Baek ba34bee2d1 refac 2026-09-08 12:45:11 -04:00
Timothy Jaeryang Baek aaaf26fb8e refac 2026-09-08 12:38:07 -04:00
Timothy Jaeryang Baek 9a4b643130 chore: i18n 2026-09-08 11:39:57 -04:00
Timothy Jaeryang Baek e723dcda58 refac 2026-09-08 01:45:35 -04:00
Timothy Jaeryang Baek 3572e01a71 refac 2026-09-08 01:04:12 -04:00
Timothy Jaeryang Baek 98a920168e refac 2026-09-07 14:46:52 -04:00
Timothy Jaeryang Baek 675b9839f1 refac 2026-09-07 13:26:30 -04:00
G30 d49e424874 fix: enable ask_user submit when the last question uses the other field (#29494) 2026-09-07 13:21:12 -04:00
G30 2f2f4c872f fix(retrieval): drain playwright route handlers before the page closes (#29325) 2026-09-07 13:20:59 -04:00
G30 2823bf64e1 fix: scale dropdown menu item text with the UI scale setting (#29493) 2026-09-07 13:20:43 -04:00
Timothy Jaeryang Baek 9e634c0c56 refac 2026-09-07 13:19:16 -04:00
Timothy Jaeryang Baek e1bfefdf9f refac 2026-09-07 13:13:25 -04:00
Timothy Jaeryang Baek f5fcf4c89f refac 2026-09-07 12:40:44 -04:00
Timothy Jaeryang Baek f9f815c862 refac 2026-09-07 12:21:23 -04:00
Timothy Jaeryang Baek b141fdc49e refac 2026-09-07 12:18:23 -04:00
Timothy Jaeryang Baek 3cda47cdb4 refac 2026-09-07 12:16:09 -04:00
Timothy Jaeryang Baek b71744b178 refac 2026-09-07 12:15:20 -04:00
G30 3aabbfebfe fix: wait for a pending note save before navigating away (#29745) 2026-09-07 11:26:45 -04:00
Timothy Jaeryang Baek 57acc2b68f refac 2026-09-06 23:23:59 -04:00
Timothy Jaeryang Baek 3795d5b292 refac 2026-09-06 19:37:59 -04:00
Timothy Jaeryang Baek d418840aa9 refac 2026-09-06 19:36:17 -04:00
Timothy Jaeryang Baek 7eefeef4f1 refac 2026-09-06 19:32:31 -04:00
Timothy Jaeryang Baek 6c7aa3543d refac 2026-09-06 19:02:44 -04:00
Classic298 4b10190096 refac: move the connection index role check into the listing handlers (#29619)
The Ollama and OpenAI model listing handlers now check the caller's role themselves instead of declaring it as a route-level dependency.
2026-09-06 18:30:31 -04:00
Timothy Jaeryang Baek 57fc344873 refac 2026-09-06 18:30:00 -04:00
Timothy Jaeryang Baek 77d2000eb7 refac 2026-09-06 18:29:46 -04:00
Classic298 ae01ef9c95 fix: skip image, media and font requests in the Playwright web loader (#29742)
Fetching a page with many media files through the Playwright web loader was extremely slow or timed out, while raw Playwright loaded the same page in a couple of seconds. The loader routes every request the page makes through the backend HTTP client and downloads the full body before the browser sees any of it, and the browser cancelling a media request once it has enough never reaches that download. On a page with a few dozen audio players every file was pulled in full for a text extraction that never reads it.

Image, media and font requests are now aborted in the interceptor before any fetch is made. None of them feed the text extraction. Measured on the page from the report with the default timeout on the same connection:

| | requests fetched | bytes downloaded | elapsed |
|---|---|---|---|
| before | 151 | 55.0 MB | 10.1 s |
| after | 45 | 3.9 MB | 2.6 s |

Fixes #29741
2026-09-06 17:01:00 -05:00
Timothy Jaeryang Baek 649c012ecf refac 2026-09-06 17:53:02 -04:00
Timothy Jaeryang Baek de1203f9b5 refac 2026-09-06 17:46:35 -04:00
Classic298 2e16a761ee refactor: scope tool export to tools the caller can write (#29310)
The bulk tool export returned every tool the caller could read, while the per-tool export path returns only what the caller can write. This aligns the two, matching how model export already scopes its query.

Callers still export their own tools and any tool shared with them for writing; admins running with BYPASS_ADMIN_ACCESS_CONTROL are unaffected.
2026-09-06 17:44:45 -04:00
Timothy Jaeryang Baek f3eade42ae refac 2026-09-06 17:43:17 -04:00
Timothy Jaeryang Baek 30eed12513 refac 2026-09-06 17:38:21 -04:00
Timothy Jaeryang Baek a1c02098aa refac 2026-09-06 17:35:49 -04:00
Timothy Jaeryang Baek 508de20779 refac 2026-09-06 17:27:30 -04:00
Timothy Jaeryang Baek 98fcb844e1 refac 2026-09-06 17:24:23 -04:00
Timothy Jaeryang Baek 0fa4dea5ff refac 2026-09-06 17:21:57 -04:00
Timothy Jaeryang Baek f1c803d36b refac 2026-09-06 17:18:16 -04:00
Timothy Jaeryang Baek d27aa72ab4 refac 2026-09-06 17:13:32 -04:00
Timothy Jaeryang Baek c4a349651e refac 2026-09-06 17:10:01 -04:00
Classic298 1932ca649e fix: stop sending OpenAPI tool server path and query parameters in the request body (#29717)
Tool calls to an OpenAPI tool server put every argument the model returned into the JSON request body, including the parameters that were already substituted into the URL. Servers that validate their input strictly (additionalProperties: false) answered 422 "unexpected property", so reads worked and every write through an endpoint with a path or query parameter failed.

The body is now built from the model's arguments minus the operation's declared parameters, keeping any name the requestBody schema declares as a property of its own, so an endpoint that wants the resource id in the body as well as in the path still gets it.

The filter only runs when the resolved body schema lists its properties. A free-form, composed or non-JSON body offers nothing to check a name against, so those requests go out exactly as before.

src/lib/apis/index.ts carries the same request builder for direct tool server connections and had the same bug, so it gets the same fix.

Fixes #29716
2026-09-06 17:01:26 -04:00
Classic298 66e021a926 fix: normalize a tool call name sent as null (#29690)
Some endpoints stream a tool call whose function name is JSON null instead of a string. Nothing normalized it, so the null stayed on the tool call, was written into the stored message, and was sent back to the endpoint in the assistant message on the next turn, where a null is not a valid function name.

The delta accumulator now replaces a null name with an empty string, at the same point it already normalizes the arguments field. The call still fails as an unknown tool, which is the right outcome for a call that has no name, so the result is one failed tool call instead of a follow-up request the endpoint has to reject.

This is done where the delta enters the accumulator rather than at the consumers, because the name is emitted to the client and persisted while the response is still streaming, before anything downstream could clean it up.

Checked against 1261 streaming delta sequences: behaviour is unchanged except where the delta that creates the tool call carries a null name.

Seen in #29686 with a custom sglang build.
2026-09-06 17:00:03 -04:00
Timothy Jaeryang Baek 3361a972b3 refac 2026-09-06 16:59:40 -04:00
Classic298 cd68a66fba Gate the channel webhook profile image endpoint on channel access (#29703)
Any authenticated user could fetch a channel webhook's avatar, or be redirected to its external profile image URL, without belonging to the channel or holding any read access to it. This was the only webhook route with neither a channel check nor the channels feature gate.

The route now applies the same read gate every other route in this router uses: active membership for group and direct message channels, admin or a channel read grant otherwise, answering with 403 on denial and 404 when the webhook's channel row no longer exists. It also runs the channels feature and permission gate, so with channels disabled, or the permission withdrawn from regular users, the endpoint now refuses where it previously served the image.

Avatars keep rendering for channel members, and a denied request shows the default logo rather than a broken image, because the avatar component already falls back on an image error.
2026-09-06 16:58:50 -04:00
Classic298 517617b601 chore: stop shipping uv in the Docker image (#29728)
The Docker image gets about 50 MB smaller on disk (about 20 MB off the pull). uv is only needed to run the requirements install, but it is pip-installed into the image and stays there. It is now bind-mounted from the uv image for that RUN only, pinned to 0.12.10, so the runtime image never contains it. This is the pattern uv's own Docker guide recommends for the case.

Uninstalling uv at the end of the same RUN would also keep it out of the layer; the mount was preferred because it fixes the uv version and the mounted layer is cached by the builder across rebuilds.

pip stays available in the container, so hand-installing optional packages the way requirements.txt describes keeps working; only running uv inside the container goes away. The build now requires BuildKit (the syntax directive alone was a comment to the classic builder, this line makes it mandatory), needs access to ghcr.io next to PyPI, and the uv version is a pin to bump by hand, like the base images.

Part of #29721.
2026-09-06 16:58:05 -04:00
Timothy Jaeryang Baek 91f8775b28 refac 2026-09-06 16:55:28 -04:00
joaoback 53cc969e64 i18n: add pt-BR translations for newly added UI items and consistency pass (#29740)
New **pt-BR** translations for items introduced in the latest releases, plus a consistency/quality pass across existing strings (grammar, tone, capitalization, pluralization). Placeholders and hotkeys preserved. No logic changes.
2026-09-06 16:55:06 -04:00
Classic298 831b3b0df2 refac: validate the citation embed URL before use (#29701)
A citation's embed_url now has to be an http or https URL, or protocol-relative, before it is opened or handed to the embed panel. Anything else falls back to the citation modal, which already renders the source.
2026-09-06 16:54:44 -04:00
Timothy Jaeryang Baek cb942bb94c refac 2026-09-06 16:48:30 -04:00