Commit graph

10004 commits

Author SHA1 Message Date
Timothy Jaeryang Baek
1457000ba6 refac 2026-08-31 10:27:01 -04:00
Timothy Jaeryang Baek
471b5cbbb1 refac 2026-08-31 01:41:17 -04:00
Timothy Jaeryang Baek
a6f9751401 refac 2026-08-31 01:37:36 -04:00
Timothy Jaeryang Baek
2daa610cba refac 2026-08-31 01:28:40 -04:00
Classic298
89716ea880
perf: stop scanning every socket.io payload for binary data (#28180)
* perf: stop scanning every socket.io payload for binary data

Every socket.io event the backend sends was first walked recursively to check whether any value was a bytes object needing binary attachment framing. Open WebUI never emits binary, so the walk always came back empty and the work was thrown away. It has no early exit and allocates at every level, so it scaled with the full size of the message, and the messages are the big ones: chat streaming re-emits the whole assistant message on every update, note collaboration sends document state as a JSON array with one entry per byte. With the Redis manager it ran once per instance per emit on top of that, since every instance builds its own copy of the packet.

The server now installs a Packet subclass with binary events off, through python-socketio's own serializer hook, the same mechanism its msgpack serializer uses. Inbound binary attachments are decoded to int lists rather than refused, so the one frontend path that sends a raw Uint8Array keeps working and handlers can still echo client data straight back out. One scan remains in multi-instance setups: python-socketio's Redis manager calls it on the base Packet class directly, where the serializer hook cannot reach.

Measured per encode:

| payload | before | after |
|---|---|---|
| chat completion re-emit (7.5 KB JSON) | 30 us | 13 us |
| collaborative document state (292 KB JSON) | 9.0 ms | 1.7 ms |

With ENABLE_ORJSON=true, where the scan is nearly the whole encode cost: 20 us to 2.3 us, and 7.8 ms to 0.14 ms.

Closes #28164

* fix: match the other Yjs emits and send the full state as an array

Collaboration.ts sent the initial full-document state as a raw Uint8Array while the other two Yjs emit sites convert with Array.from first. socket.io framed that one as a binary attachment, so with the JSON-only packet class the server turns it into a list of ints and re-broadcasts it as JSON: a 10240-byte state update becomes 36561 JSON characters. Converting at the emit site keeps the wire form uniform across all three sites.

Also trims the JSONOnlyPacket docstring, which claimed attachments already arrive as int lists when the override is what converts them, and annotates the new reconstruct_binary parameters.
2026-08-31 01:22:06 -04:00
Timothy Jaeryang Baek
5d74df95ed chore: format 2026-08-31 01:11:41 -04:00
Classic298
b75e2670b7
fix: keep a custom recurrence rule when the editor reopens it (#29260)
Loading an automation whose rule the visual controls cannot represent switched the schedule to Custom but left the bookkeeping the seeding block reads on the previous value, so that block immediately replaced the rule with a freshly built default. The rule was lost when the editor opened, before anything was saved, and cloning carried the default across as well. Recording the switch alongside it leaves the stored rule in place.

Verified in a browser against the same build without this line: a minutely rule and a yearly rule now survive reopen and save byte for byte, cloning keeps the original, and every schedule the editor itself produces, along with switching to Custom by hand, behaves exactly as before.
2026-08-31 00:08:28 -05:00
TOM
949876f9c0
fix(i18n): disable key/ns separator splitting at runtime to match i18next-parser config (#29161) 2026-08-31 00:54:08 -04:00
Classic298
188fc83a79
fix: surface files the browser cannot read during a knowledge base directory sync (#29135)
* fix: surface files the browser cannot read during a knowledge base directory sync

Syncing a local folder into a knowledge base could fail with nothing but "Error accessing directory": no failing file name, no network request, no server log, and no console output either, because production builds strip console.error. On Windows this happens once the absolute path of a file passes the platform limit, at which point the browser refuses to open a file it just listed.

The directory scan now handles that per file. It names the first failing path and how many files are affected, and stops before anything is uploaded. Stopping is the point: a file missing from the manifest is treated as deleted by the sync, so continuing would remove the knowledge base copy of a file that still exists on disk.

Dragging a folder in hit the same failure and reported nothing at all, and the Firefox picker path returned its promise without awaiting it, so a rejection escaped the error handler and surfaced only as an unhandled rejection. Both report through the existing handler now, and production builds keep console.error so the underlying exception stays visible.

* fix: narrow the change to the silent drag-and-drop folder failure

Dropping a folder onto a knowledge base did nothing at all when the browser refused to open one of the files inside it: the rejection escaped the async drop listener, so the user got no toast, no upload and no clue why. The listener now routes that failure through the same error handler the directory picker already uses, so one path and one message cover both ways of adding a folder.

The rest of the branch is reverted. Dropping `console.error` from the esbuild `pure` list un-stripped 597 call sites across 103 files from every production bundle, which is a repo-wide logging policy change that needs its own argument. The picker-side collect-and-count machinery only reworded a toast the existing catch already showed, and the Firefox `return await` fix is a different bug in a different path.
2026-08-31 00:45:26 -04:00
Timothy Jaeryang Baek
e8bdbd716b refac 2026-08-31 00:33:43 -04:00
Timothy Jaeryang Baek
7a11154182 refac 2026-08-31 00:32:46 -04:00
G30
95032b6c61
fix: let the model defaults capability and prompt suggestion sections scroll (#29235) 2026-08-31 00:11:34 -04:00
Timothy Jaeryang Baek
84d0940da1 refac 2026-08-31 00:11:04 -04:00
G30
9a669197c8
fix: let setting row controls shrink so long values do not squeeze the label (#29229) 2026-08-31 00:06:37 -04:00
Timothy Jaeryang Baek
09163ccc73 refac 2026-08-31 00:06:05 -04:00
Timothy Jaeryang Baek
64e6c9f010 refac 2026-08-30 23:56:01 -04:00
Timothy Jaeryang Baek
97c5f52bbc refac 2026-08-30 23:55:29 -04:00
Timothy Jaeryang Baek
e4dbfb1276 refac 2026-08-30 23:50:30 -04:00
Timothy Jaeryang Baek
df495a7945 refac 2026-08-30 23:42:35 -04:00
G30
039976ef24
fix: unregister a sidebar folder from the registry when it unmounts (#29121) 2026-08-30 23:35:34 -04:00
Timothy Jaeryang Baek
d5e35ea6f4 refac 2026-08-30 23:32:42 -04:00
Timothy Jaeryang Baek
6c2e0d3fe8 chore: format 2026-08-30 23:31:23 -04:00
Timothy Jaeryang Baek
b3ba6823a9 refac
Co-Authored-By: G30 <50341825+silentoplayz@users.noreply.github.com>
2026-08-30 21:41:03 -04:00
Timothy Jaeryang Baek
ddc886fdc1 refac 2026-08-30 21:39:13 -04:00
Timothy Jaeryang Baek
120409ef01 refac 2026-08-30 17:45:50 -04:00
Timothy Jaeryang Baek
e4694f82eb refac 2026-08-30 17:45:18 -04:00
Timothy Jaeryang Baek
b356b80f8c refac 2026-08-30 17:44:39 -04:00
Timothy Jaeryang Baek
492ccf3ac0 refac 2026-08-30 17:39:56 -04:00
Timothy Jaeryang Baek
78d8c9166f refac 2026-08-30 17:38:45 -04:00
Timothy Jaeryang Baek
e250be48ee refac 2026-08-30 17:30:11 -04:00
Timothy Jaeryang Baek
f0ffa7508e refac 2026-08-30 17:26:03 -04:00
Classic298
0e65c65cc7
fix: stop counted schedules being rewritten as one-offs on save (#29263)
* fix: stop labelling a counted schedule as a one-off

The schedule label treated any rule whose text contained COUNT=1 as a single run, so counts such as 10, 12 and 14 were shown as "Once" together with the date of the first run, on the automations list and on the automation page alike. The label now matches a count of exactly one.

This covers the two places that render the label. The schedule editor reads the count the same way and changes separately. Rules that carry a start date still fall through to the raw rule text, exactly as they already did without a count; that parsing gap changes separately too.

Verified in a browser against the same build without these lines: ten ordinary schedules render identically in both places, and a genuine single-run schedule is still labelled as one.

* fix: stop counted schedules being rewritten as one-offs on save

The schedule editor decides that a rule is a one-off by looking for the text COUNT=1 anywhere in it. A rule that runs ten times carries COUNT=10, which contains that text, so opening such an automation shows it as a single run and saving writes a genuine one-off rule back. One open and save is enough to silently turn a ten run schedule into a one run schedule, with whatever date happened to sit in the rule. The check now requires that no further digit follows, the same test the two schedule labels already use.

The same screens also failed to read counted rules at all. Both label helpers and the editor parser split the stored rule on semicolons after stripping the RRULE prefix, so when the rule carries a DTSTART line the first piece is that whole line and the frequency is never found. The automations list then printed the raw rule text where a human label belongs, and the editor fell back to a plain daily schedule, quietly discarding the weekly or monthly settings on the next save. All three sites now drop the DTSTART part before splitting. They split on whitespace, so the newline form and the space separated form are both handled, matching how the backend already strips it.
2026-08-30 16:12:43 -04:00
Timothy Jaeryang Baek
cfa2d25317 refac 2026-08-30 12:42:13 -04:00
Timothy Jaeryang Baek
b9765fe979 refac 2026-08-30 12:36:16 -04:00
Timothy Jaeryang Baek
22379ded1a refac 2026-08-30 12:22:32 -04:00
Timothy Jaeryang Baek
58a3fadbf3 refac 2026-08-30 12:13:06 -04:00
G30
6fa50a6558
fix: keep select dropdowns inside the viewport (#29226) 2026-08-30 12:06:27 -04:00
joaoback
f76fd904b3
i18n: add pt-BR translations for newly added UI items and consistency pass (#29217)
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-08-30 11:58:03 -04:00
Aindriú Mac Giolla Eoin
1c59d2b1b0
i18n: Updated Irish translation (#29247) 2026-08-30 11:56:59 -04:00
Classic298
1f529c4eb3
fix: structured output renderer crashing on an empty output slot (#29250)
A chat could hard-fail in the browser with "TypeError: can't access property content" and stop rendering the assistant message until a reload.

Streamed response items and content parts were placed at the index the provider reports. That index is not bounded by the length of the array the client has built up, so an entry could land past the end and leave a gap behind. Spreading the array on the next event turned that gap into a real empty entry, and the renderer then dereferenced it while looking for message text.

Output items that would land past the end are now appended, since later events locate them by id anyway. Content and summary parts are padded up to the index instead, because a part carries no id and the text streamed for it is addressed by that same index. The renderer and the structured editor now skip an empty entry as well, so chats already saved in the broken state still display and edit.

Fixes #29244
2026-08-30 11:56:41 -04:00
Classic298
26074e0a46
i18n: complete and correct German (de-DE) translations (#29179)
Fills the two remaining untranslated strings in the German catalog and corrects a number of existing entries.

The catalog addresses the user formally with "Sie" in over two hundred strings but had drifted to the informal "du" in around thirty, including "Wählen Sie ein Modell" sitting directly alongside "Wähle eine Option". Those now use "Sie", or the infinitive where the surrounding labels already use it. The "Du" chat bubble label and the two model-facing system prompts are deliberately left informal.

"Explored" carried a trailing ": " that the English source and every other translated locale lack. The summary text beside it only renders when there are tool calls or code interpreter runs, so a details group containing only reasoning items rendered a dangling "Untersucht:" in German.

"Persistent" was left in English beside its already translated sibling option "Ephemeral" ("Flüchtig"), leaving a half translated storage dropdown. The calendar tool description promised listing, searching, creating, updating and deleting calendars, when it acts on calendar events.

The remaining changes fix compounds written as two words ("Skill Beschreibung", "Datei upload", "Audio tag"), replace the non-word "managen" with "verwalten", correct a grammatical gender and a plural, and normalize the only two ellipsis characters in the file to the three periods used by every other entry.

Only de-DE is touched. No catalog regeneration, no other locale files.
2026-08-29 14:53:42 -04:00
G30
fe947f7e68
fix: prevent valve inputs from overflowing the valves modal (#29203) 2026-08-29 14:52:29 -04:00
TOM
b2050bcd4d
Polish translation update (#29184) 2026-08-28 20:31:09 -04:00
Classic298
83556188f5
fix: hide file preview zoom buttons on touch devices (#29176)
On a phone the file preview zoom bar shows plus and minus buttons that duplicate pinch-to-zoom and sit on top of an already small preview. They are hidden on coarse pointers now, so touch users get the preview area back and still zoom the way they expect.

The check is the pointer type rather than the viewport width, because what matters is whether the person can pinch, not how narrow their window is. A narrow desktop window keeps the buttons, a tablet does not.

The zoom percentage doubles as the reset control and has no gesture equivalent, so it stays visible, along with all page and slide navigation. Keyboard zoom is unaffected. Word document previews are left alone: they have no pinch support at all, so hiding their buttons would remove zooming entirely.

Fixes #29152
2026-08-28 18:46:53 -04:00
Timothy Jaeryang Baek
a235bf076c refac 2026-08-28 17:50:37 -04:00
spoofy
afb9f3c2d1
fix: name the Folder modal close button (WCAG 4.1.2) (#29160) 2026-08-28 17:49:22 -04:00
Timothy Jaeryang Baek
233681464f refac 2026-08-28 13:45:56 -04:00
Timothy Jaeryang Baek
797b4c51d1 refac 2026-08-28 13:40:45 -04:00
Timothy Jaeryang Baek
99cb8257f7 refac 2026-08-28 13:34:10 -04:00
G30
12d4b4ac59
fix: give the underline marked extension a renderer (#29118) 2026-08-28 12:23:06 -04:00