When the computer connected through Tether reconnected while the terminal's files panel was loading its working folder, a folder listing or a file, the load failed with "Tether connection interrupted". Reads like these are meant to be retried once Tether is back. They never were, because each of them went out with an empty upload attached, and an upload cannot be sent a second time. Requests with nothing to upload now go without one, so these reads are retried on the new connection. Uploads work as before.
Fixes#34394
* fix: Browser tab in Chrome mode keeps reconnecting when its chat is open in two windows
With the same chat open in two windows, the terminal hands the Chrome tab to the newer window, but the older window only saw a lost connection. It reconnected and took the tab back, so both windows kept flipping to "Reconnecting…" and the "Browser opened in another viewer." message never showed. The terminal's reason for ending the tab's connection now reaches the page, as it already does for the shell. The window that lost the tab shows that message and stops, and the other window keeps the page.
Fixes#34095
* fix: Browser tab in Chrome mode keeps reconnecting when its chat is open in two windows
Narrows the change to passing the terminal's close reason on to the page. The relay's existing handling of a broken connection stays as it was.
Sub-agents could only be switched on or off for the whole instance, so once they were on every user could spawn them and an admin had no way to keep the extra model usage to a pilot group. The user permissions now have a Sub-agents switch under Features, both in the default permissions and in each group, next to Memories and working the same way. Users without the permission no longer get the sub-agent tool in their chats, nor the timer tool that is part of the same feature. Admins are not restricted by it, and with sub-agents off in Admin Settings nobody gets them, admins included. The permission is on by default, so existing instances behave as before until an admin turns it off; the default can also be set with the USER_PERMISSIONS_FEATURES_SUBAGENTS environment variable.
Closes#34038
* feat: optional size limit for chat history tool results
Reading a long earlier chat through the Chat History tools could return far more text than a model's context window holds, so the next request failed. Admins can now set VIEW_CHAT_MAX_CHARS to cap what is returned. The newest messages are kept, older ones are dropped, and the result says it was cut and how many messages came back. Unset keeps the full chat as before.
Fixes#33608
* feat: set the chat read limit from the admin settings
The limit on how much of an earlier chat a model can read could only be set with an environment variable. It is now a Chat Read Limit field in Admin Settings under General, next to the skill limits. The environment variable still works as the starting value, and the setting saved in the panel takes precedence.
* fix: chat read limit failing on chats with empty or non-text messages
With a chat read limit set, reading an imported chat that held empty or non-text message content ended in an error instead of the chat. Such content is now counted and cut as plain text.
Saving a chat's view (the per-chat display state the app stores) looked at the request before it checked who was sending it. A signed-out client or a pending account sending broken data got "Invalid chat view" instead of being refused, unlike everywhere else that needs a signed-in user, and the server read up to 1 MB of data for callers it would turn away anyway. The caller is now checked first, so they get the usual 401 Unauthorized. Signed-in users see no change.
Fixes#33883
With the OpenAI image engine and the Model field left empty, requests go out for gpt-image-2 but still ask for base64 output, a parameter OpenAI does not support for GPT image models. Typing gpt-image-2 into the Model field already left it out. Whether that parameter is sent now depends on the model the request actually uses, so the empty default and the named model send the same request, and an image edit request that names its own model is handled the same way.
Fixes#33874
When the file panel or terminal view closes its live connection right after opening it, the server logged a full error traceback for a client that was already gone. Such a connection is now dropped quietly. Real authentication failures still close with the same error as before.
Fixes#33850
Diffing two versions of a skill, tool, function or prompt now refuses inputs above 5000 lines per version. All four history diff views share the same check.
Connection custom headers had no way to tell the upstream provider which client a request came from. Adding {{USER_IP}} and {{X_FORWARDED_FOR}} fills in the client address Open WebUI resolves for the request, for example {"X-Real-IP": "{{USER_IP}}"}. Both are empty when there is no client request, such as automations and background jobs. Headers that don't use them are unaffected.
Fixes#33819
Follow-up generation after a response and replies to channel mentions are now skipped when the account that triggered them has been deactivated in the meantime.