Commit Graph
18327 Commits
Author SHA1 Message Date
Classic298 ac6a8c0082 chore: changelog (#29107)
* chore: add changelog entries for 0.11.2

Documents the commits landed on dev after the 0.11.1 changelog entry. Added covers the richer terminal file previews with page thumbnails, the reduced per-message overhead on deployments without pipelines, more room in file previews on touch screens, and the wider accessibility coverage. Fixed covers twelve user-facing corrections, among them stalled streaming on reasoning models, post-tool-call thinking leaking into replies, banners with underlined text failing to render, pinned models carrying the previous model's tools, disabled admin models, skill-mention text loss, and the workspace Knowledge list staying empty. Changed records the rename of High Contrast Mode to Accessibility Mode. Also records the Polish, Simplified Chinese, German, Catalan, and Portuguese (Brazil) translation updates. Issue template, pull request template, Docker workflow and locale catalog regeneration edits are omitted as they are not user-facing.

* chore: add the Redis Cluster stop and Valves overflow entries to 0.11.2

Documents the two user-facing commits landed on dev since the previous
changelog entry. Fixed gains the Redis Cluster stop signal, where the stop
button did not take effect when the request landed on a different instance
than the one streaming the reply, placed with the streaming and thinking
entries it shares a domain with; and the Valves dialog overflow, where a
valve with a long line of selected options stretched its input past the
edge of the dialog and over the page behind it, placed with the narrow
screen layout entry.

The section date moves to 2026-08-29 to cover the newer commits. The issue
and pull request template wording and the German locale catalog are omitted,
the former as contributor-facing rather than user-facing, the latter as
German is already named in the translation entry.

* chore: add the recurring calendar event entries to 0.11.2

Documents the calendar recurrence changes landed on dev after the previous
changelog commit. Fixed records repeating events working out their occurrences
from their own date and time rather than from a start date carried inside the
repeat rule, which could place them on the wrong weekday or hour. Changed
records the new limit refusing events that repeat more often than once a day.
The EXRULE handling and the timezone resolution rewrite are omitted: both reach
the same user-visible outcome as before, only by a clearer route.

* chore: add the security advisory notice to 0.11.2

Adds the standard advisory notice as the first item in the Fixed section. The
calendar recurrence work landed on dev under an unmarked commit message and
bounds the occurrences a single stored event can force the server to walk, so
the release carries a fix whose details are not spelled out in the entries
below it. The notice is the fixed wording and takes no reference links of its
own; the individual entries keep theirs.

* chore: add the structured output crash entry to 0.11.2

Fixed records the conversation that failed in the browser and stopped showing
the assistant reply until a reload, together with the recovery of chats already
saved in that state. It sits directly below the advisory notice as the most
disruptive correction in the section. The Irish catalog update joins the
translation entry; the Portuguese (Brazil) pass needs no change there, as that
language is already named.

* chore: add the dropdown, SQLite search and tool server entries to 0.11.2

Fixed gains the dropdown that opened past the edge of a narrow screen and the
dropdown list that ignored the interface theme, kept together as one group, plus
case-insensitive matching for accented and non-Latin text on SQLite installs,
placed beside the existing SQLite entry, and the tool server connection that was
sent an empty authorization header when saved without a key.

The advisory notice already stands at the top of the section, so the unmarked
backend commit needs no further flag there.

* chore: add the chat reload entry to 0.11.2

Fixed records the conversation that reloaded itself whenever any response in it
finished while an older unfinished reply sat in the history, now narrowed to the
reply the update concerns. It joins the response lifecycle group below the stop
entry. The commit carries no pull request or issue, so it is referenced by
commit.

* chore: add the interface font and touch resize entries to 0.11.2

Added gains the font family field in Interface settings, which applies a locally
installed font across the interface and falls back to the standard font when
cleared, and the side panel divider that can now be dragged by touch or stylus
while a mouse drag keeps tracking beyond the window edge. Both sit above the
reserved accessibility, general improvements and translation entries, with the
touch entry beside the existing touch screen one.

Each aspect of the font setting arrived in a single commit, so it is recorded as
one entry with no separate note for its configurability.

* chore: add the automation schedule and model registry entries to 0.11.2

Added records the model list refresh that no longer has every worker rewrite the
whole list to the shared cache when nothing changed, placed beside the existing
performance entry.

Fixed records the two automation schedule defects from the same pull request as
separate entries, because the symptoms differ: a counted schedule shown as a
single run and rewritten to one on save, and a schedule carrying a start date
losing its weekly or monthly setting and printing raw rule text in the list.
Both join the scheduling group below the recurring event entry.

* chore: extend the touch resize entry to the main sidebar

The sidebar divider received the same pointer handling the side panel dividers
got, so the existing entry now names the sidebar and carries both commits rather
than repeating itself as a second entry. The follow-up that moved the divider
border to the matching edge is listed with them, being a further correction to
the same divider and too small to record on its own.

* chore: record the preview focus and caveat changes in 0.11.2

Fixed gains the arrow keys that paged an open document or slide preview from
anywhere on the page, which also took those keys away from the field being typed
in, now confined to the focused preview.

The richer previews entry absorbs the removal of the notice warning that a
preview might differ from the download, the caveat having gone with the
approximation it described, and the accessibility entry absorbs the previews
becoming reachable by keyboard and announcing themselves. Neither warranted an
entry of its own, both being continuations of work already recorded.
2026-08-31 01:14:29 -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
Classic298 1976387808 fix: stop labelling a counted schedule as a one-off (#29261)
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.
2026-08-31 00:08:01 -05:00
Timothy Jaeryang Baek fd679e1dac refac 2026-08-31 01:06:15 -04:00
Classic298 9f680bb80b perf: skip the tool approval drain lookup for fresh chat messages (#29142)
Every chat completion request re-loads the target conversation's entire
message history from the database inside drain_approved_tool_calls() before
discovering there is nothing to drain: a fresh message always points at a
newly minted assistant message with no stored output, so the full-history
read (one SELECT of every chat_message row plus building the message map,
uncached, on top of the identical read process_chat_payload already did) is
pure overhead on every message.

Queued tool approvals can only ever be acted on by a resume or continue
request, and exactly those requests carry assistant_message_id in their
payload. The drain now returns early when the field is absent, removing one
O(conversation length) query per chat message while resume, continue, reject
and pause flows behave exactly as before, independent of the approval mode.
2026-08-30 23:57:11 -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
Timothy Jaeryang Baek 6609918bfe refac 2026-08-31 00:53:55 -04:00
Timothy Jaeryang Baek 9962d122c9 refac 2026-08-31 00:46:34 -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 8ed5487693 refac 2026-08-31 00:41:11 -04:00
Timothy Jaeryang Baek 1caf22b5a8 refac 2026-08-31 00:40:15 -04:00
Timothy Jaeryang Baek 873fb741c2 refac 2026-08-31 00:39:16 -04:00
Timothy Jaeryang Baek b6d5055228 refac 2026-08-31 00:35:17 -04:00
Timothy Jaeryang Baek e8bdbd716b refac 2026-08-31 00:33:43 -04:00
Timothy Jaeryang Baek e96b6464b4 refac 2026-08-31 00:33:05 -04:00
Timothy Jaeryang Baek 7a11154182 refac 2026-08-31 00:32:46 -04:00
Classic298 be958d7b04 fix: a rejected ask_user call ending the turn with no reply (#29252)
* fix: a rejected ask_user call ending the turn with no reply

The documented behaviour of the built-in ask_user tool is that a call breaking its rules comes back to the model as an error. Instead the reply stopped there: the error was recorded as the tool result, the model was never asked again, and the user was left with a dead chat and no answer.

The rejection is now handed back like any other failed tool result, so the model sees it and can correct itself within the normal tool-call iteration limit. Any ordinary tool the model emitted in the same turn still runs.

A call rejected for arriving alongside other ask_user calls also left those siblings without a result, which the UI shows as a tool call stuck on "Executing..." forever. Every invalid call now gets its own result. Two ask_user calls on their own also reported the wrong reason, saying the call must be made by itself rather than that only one is allowed per turn.

Fixes #29077

* Keep the original ask_user validation order

Restores the pre-existing check order and the unchanged output id fallback, so this change only alters the return shape needed for staging, and trims a comment that narrated the lines below it.

* Correct the ask_user sibling-call error message

* Shorten the ask_user sibling-call error message

* Drop the untrue sibling-call claim from the ask_user error

The ask_user error text told the user and the model "The others ran.", but that sentence is written into the turn output before any sibling tool call has executed, so it can be plainly false. Under a saved chat with tool approval set to ask, the turn pauses right afterwards and the siblings sit at pending/queued, so the user reads "The others ran" directly above the approval prompt for tools that have not run, and reads it again beside the rejection result if they decline. When the model sends two ask_user calls and nothing else, nothing runs at all and the sentence is emitted twice.

The staging helper cannot see what happens to the sibling calls, so it no longer narrates it. The remaining two sentences hold in every flow: ask_user really is dropped from the executed calls whenever this error is set, and calling it on its own is always the right retry.
2026-08-31 00:17:21 -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 756241b34a refac 2026-08-31 00:11:13 -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 2140c189e1 refac 2026-08-31 00:05:34 -04:00
Timothy Jaeryang Baek 81b9afb731 refac 2026-08-31 00:03:51 -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 aeb126b95d refac 2026-08-30 23:46:02 -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 7d694570aa refac 2026-08-30 21:47:28 -04:00
Timothy Jaeryang BaekandG30 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 49aab7451c refac 2026-08-30 21:36:17 -04:00
Classic298 d8133c905a fix: serve module scripts and wasm assets with the correct MIME type (#29139)
On Windows hosts the built-in code interpreter fails immediately with "Failed to fetch dynamically imported module: .../pyodide/pyodide.asm.mjs", and the browser console shows the server answered with a MIME type of "text/plain". Code execution is unusable for those users.

Python's mimetypes module reads the Windows registry after loading its own table, so a stray registry entry silently replaces the correct type for an extension and Starlette then labels the file with it. Browsers enforce strict MIME checking for module scripts and streaming WASM compilation, so the pyodide loader gets refused. The same workaround already existed for .js; this extends it to the two other extensions pyodide ships, and moves it out of the frontend-build branch so the unconditionally mounted /static assets are covered as well.

Fixes #29133
2026-08-30 21:32:31 -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
Classic298 b8f279b8fb perf: stabilize the model registry signature across workers (#29264)
The Redis-backed model registry skips its write when the content signature matches what is already stored. That skip has never worked across processes. Two of the values it hashes come out of Python sets, and set iteration order varies with each process's hash seed, so every worker computed a different signature for identical content and every worker rewrote the whole registry on every refresh.

Sorting both makes the signature depend on content alone. Measured on a 120 model registry, 522 KiB serialized: a refresh whose content already matches drops from GET, HKEYS, HSET and SET at 5.1 ms to a single GET at 2.2 ms per worker, and the 522 KiB write leaves the wire entirely.

Verified across 12 child processes with 12 distinct hash seeds: 12 different signatures before, 1 after. Filter execution order is unaffected, because the filter pipeline re-sorts by priority and id before running.
2026-08-30 16:12:31 -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