From 35214a59d34c474ea5746b2c650cb735c449b329 Mon Sep 17 00:00:00 2001 From: David McKay Date: Thu, 5 Nov 2026 20:24:49 -0800 Subject: [PATCH 1/2] Write the 0.3.1 changelog from the code Rebuilt from each change since v0.3.0 (#1037, #995, #996, #1041, #1040, #1039, #1042, #1043) and the open #1044, every line checked against its diff. The terminal entry #1037 added under 0.3.0 moves to Unreleased, since v0.3.0 does not contain it. --- CHANGELOG.md | 181 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 171 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7832b66614..2fcb5711c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,177 @@ Newest first. `Unreleased` is what is on `main` and not yet tagged. ## Unreleased +**Before upgrading.** There are no migrations: the database stays at `0077_channel_opening`. Eight +things change for an existing deployment: +- On OpenBot Desktop, the first Start after the app updates to this release moves the installed + OpenBot to it too. Until now an installation kept the release it was installed at until you moved + it under Runtime updates. While the old release keeps running, Start checks the installation + against its release's published manifest and downloads the new release and its images; then it + stops OpenBot, backs up the database, installs the new release and starts it, which can take a few + minutes. A move that fails is undone, database included, and the old release starts. Pinned builds + (internal and candidates), and an installation already on a newer release than the app, are left + as they are (below). +- OpenBot Desktop installations signed in to CopilotKit with no Composio key get one at their next + Start: the bundled CopilotKit CLI asks CopilotKit for this installation's own Composio project, + and the key goes to the app's protected store, never to `.env`. Apps, unavailable on Desktop since + 0.3.0, become available. A `COMPOSIO_API_KEY` in `~/OpenBot/.env` or the environment, or an Arcade + choice, still wins, and then nothing is asked (below). +- Built-in Bots, and the Bot framework picked at setup when it is OpenBot's own LangGraph or Claude + Agent SDK harness, now answer on the middle of the provider's current line when nobody has picked + a model, instead of `BOT_MODEL`: the newest model of each line, ordered by price, and the one in + the middle (on 2026-11-05, `gpt-6.1-terra`, `claude-sonnet-5-5`, `gemini-3.8-flash` and + `grok-4.7`). This holds whether or not people may pick, within the model allowlist when it is on. + `BOT_MODEL` stays the default only behind a gateway in `OPENAI_BASE_URL` that lists it, or while + the provider's model list cannot be read. A ChatGPT plan answers only on a model its own list + offers (below). +- The server now reads the provider's model list (a plan's own, through its harness) and + `https://models.dev/api.json` when it starts and every six hours after, whether or not people may + pick, and again at once, at most once a minute, when a provider refuses a model as unknown or + unsupported. A refresh that fails keeps the last good list. `OPENBOT_MODEL_CAPABILITIES_URL` + points at a mirror of models.dev, or `off` reads none, and then the default is the configured + model while the provider lists it. +- With `OPENBOT_SINGLE_USER=true` (OpenBot Desktop among them), "Let people choose a model" under + Admin → Providers is now on until somebody turns it off. A deployment that saved it off keeps it + off. +- A Bot's commands now run in one interactive bash on its computer, one for each Bot a person uses, + instead of a fresh `bash -c` each (below). `cd` and exported variables carry over to the next + command. A command's stdout and stderr come back together as its output, with `stderr` empty, as a + terminal shows them. Something a command starts in the background with `&` keeps running after the + command returns, even while it still prints; such a process used to hold the command open until + its time limit stopped both. Two commands from the same Bot and person run one after the other, + and the wait counts against each one's time limit. Commands see `TERM=xterm-256color`, and + `PAGER=cat`, `GIT_PAGER=cat` and `GIT_TERMINAL_PROMPT=0` unless `COMPUTER_SHELL_ENV` passes + others. +- Upgrade the server and its computers together. A computer from 0.3.0 has no terminal for the + Computer panel's new Terminal tab to connect to, and refuses every pointer move made with no + button held, which the live screen now sends as you hover. +- The Python LangGraph and Pydantic AI Bots set no upper bound on `google-genai`, so an image of + either built from source since 3.0.0 came out on 2026-11-06 installed it, and 3.0.0 sends Gemini + requests to `/v1` instead of `/v1beta`. Both now hold `google-genai` at 2.34 or later and below 3, + and the Google ADK Bot names the same range, so Gemini is called on `/v1beta` as before. + +### A Bot's commands run in one live shell you can watch and take control of + +The Computer panel has a Terminal tab beside the Screen: a real terminal where you watch each of the +Bot's commands typed and its output stream, in colour. Whoever may watch a Bot's screen may watch +its terminal. Take control gives you its keyboard, as it does the browser's, and the Bot waits until +you hand back, then carries on in the same shell. The panel opens on the view the Bot last worked +in, the terminal after a command and the screen after a page; a tab you pick, or a command you click +in the conversation, holds until the panel closes. + +- **The Bot gets what it got before.** Each command's output and exit code come back within the same + time limit (120 seconds unless the Bot asks for up to 600) and the same 64 KB of output, and + approvals and policy for commands are unchanged. What changes is under Before upgrading. +- **Commands in the conversation and in Activity are terminal blocks**: the prompt and the command, + the last lines of output with "Show all N lines" for the rest, and how it ended, as "Exit 0", + "Exit 1", "Running", "Blocked", "Declined" or "Done by you". Clicking one opens the Computer panel + on its terminal. +- **A shell left busy is not typed over.** If you hand back with something still running in the + foreground, the Bot's next command is not run and the Bot is told why. A command the Bot sends + unfinished (an unclosed quote, bracket or here-document) is abandoned at once with exit code 2, + instead of waiting out its time limit. +- **The shell ends** when the computer is stopped or reset, or after an hour nobody used or watched + it, and a new one starts when it is next needed. + +### Taking over a Bot's screen feels like using your own browser + +- **Clicks land at once.** Your browser sends at most one pointer position per screen refresh and + adds scrolls together, and the Bot's computer replaces a waiting move with the newer one instead + of playing every move before your click. Clicks, keys and pastes are never merged or dropped, and + land in the order you made them. +- **The picture is the page as it is now.** The computer sends the next frame only once the last has + gone out, with at most two on their way to your browser, and a newer frame replaces one still + waiting, so a slow connection no longer shows frames seconds old. The once-a-second screenshot + stops while the full-size live view is open, and a hidden tab draws nothing until you come back. +- **Keys and the mouse behave as on your own page.** Hovering is a hover, not a drag with the left + button held. Letting go of the mouse outside the screen lets go on the page, and releasing Command + releases the keys held with it. Emoji type as text, Firefox scrolls normal distances, and the + cursor is an arrow rather than a crosshair. +- **A missed input is a note, not an error screen.** One key or click that doesn't land shows a + short note in the corner for a few seconds, and the screen stays live. One missed check of who has + control no longer pauses your input; two in a row do, and the computer still refuses input from + anyone not in control. A click made the moment the screen appears is held until the connection to + the computer opens, not lost. + +### OpenBot Desktop moves your OpenBot to the app's release when it starts + +An updated app used to keep running the OpenBot it was first installed with, so server fixes never +reached an existing installation. Now Start moves a stable app's installation to the app's own +release, through the same path as Runtime updates, and says "Updating OpenBot from v0.3.0 to v0.3.1. +Your Bots, sign-ins and data stay as they are." while it runs. A modified installation is refused +before anything stops. + +- A move that fails before OpenBot stopped changes nothing, and the next Start tries again. One that + fails after is undone, the database restored from its backup, and the old release starts with a + note saying so. Start does not try that release again by itself; Runtime updates can. +- Stop or Quit during a move stops it, and the next Start recovers it as any interrupted update. +- Runtime updates, and this move, download only the images this installation runs: eight for 0.3.0, + where the release names nineteen. Staging an update no longer fails on an Apple silicon Mac with + "no matching manifest for linux/arm64/v8" over the all-in-one `openbot` image, which Desktop never + runs and which 0.3.0 published for x86-64 only. + +### OpenBot Desktop gets your apps from your CopilotKit sign-in again + +0.3.0 started every Desktop installation without a Composio key, so apps were unavailable unless you +put your own `COMPOSIO_API_KEY` in `~/OpenBot/.env`. The Account step now connects your apps once +you have signed in ("Connecting your apps…"): the bundled CopilotKit CLI, with its own sign-in, +makes or reuses this installation's Composio project, and the app keeps the key in its protected +store. If that fails, the step says so, with Connect apps to try again and Continue to go on without +apps, and every Start tries again by itself without ever stopping Start. An installation signed in +under 0.3.0 gets its key at its next Start, without signing in again. + +### Signing in with ChatGPT in Desktop setup no longer ends on "localhost refused to connect" + +- A browser tab that comes back after the sign-in finished (from "Open the sign-in page", or from + approving again at OpenAI) gets an OpenBot page saying OpenBot is signed in and the tab isn't + needed. OpenBot answers that address for 15 minutes after a sign-in ends, then gives the port up, + and gives it up sooner to a new sign-in or to the Codex CLI. +- Starting a sign-in again no longer fails with "port is already allocated". The earlier sign-in is + stopped first, and so is one you leave by picking another provider, Change, Escape or leaving the + screen, whose tab then says the sign-in ended rather than "You're signed in". Quit stops it too. +- A tab left over from an earlier attempt can no longer end the attempt in progress: it is told its + link is out of date. + +### Pick the model and thinking effort for every Bot, from the provider's live list + +The composer's model picker is now a text button naming the model and its thinking effort ("Claude +Sonnet 5.5 · High"), and its list adds a Thinking group with the levels the model in use accepts, +its default marked. A model is only ever shown, saved and sent the levels it takes, and switching to +a model that doesn't take the chosen effort clears it. The pick is still kept per person and +conversation, and a new conversation saves both before its first message. + +- **More Bots and every sign-in.** It is offered for the Bot framework picked at setup when it is + OpenBot's own LangGraph or Claude Agent SDK harness, and on OpenAI, Anthropic, Google and xAI keys + and sign-ins, any OpenAI-compatible endpoint, and ChatGPT and Claude plans, each listed from its + own source (see The model list in `docs/configuration.md`). A Bot on any other framework, or a + harness somebody brought, still picks its own model. +- **Fixed: every message failed on a ChatGPT plan** with "The 'gpt-5.5' model is not supported when + using Codex with a ChatGPT account". A plan now runs only a model its own list offers. +- **Out of credit says so.** A provider refusing because the account is out of credit or at its + spending limit now reads as that, naming the provider and quoting it, on built-in Bots (which + showed "Forbidden" or a retry count) and on the LangGraph harness (which asked you to sign in + again, and flagged the sign-in as failed). Any other refusal from the provider ends the harness's + run with the provider's own words, where the run used to stop with no answer. +- Admin → Providers names who serves the model: OpenAI, Anthropic, Google, xAI, ChatGPT plan, Claude + plan or OpenAI-compatible endpoint, with Google, xAI and Claude marks beside OpenAI's and + Anthropic's. Each run logs one `run-model` line with its Bot, run id, model and effort. +- `CHATGPT_CODEX_CLIENT_VERSION` (default `0.167.0`) is the Codex client version the LangGraph + harness names when it reads a ChatGPT plan's list. + +### Every step a Bot takes with one of OpenBot's own tools reads as words + +Each tool OpenBot itself gives a Bot is named in words chosen for it, in the present while it runs +and the past once done ("Using a skill", then "Used a skill"; "Saved a memory"; "Checked existing +Bots"), where most showed words split from their identifier ("Copilotkit load skill", "Remember +personal fact"). That covers skills, memory, follow-ups, check-ins, responsibilities, asking a +person or another Bot, subtasks, the browser, and files and commands on the Bot's computer or yours. + +### The Mastra Bot's image installs from a lockfile + +The Mastra Bot was the one Bot image built from version ranges with no lockfile, so two builds of +one release could ship different code, and a build could fail on a package npm had only just +published. It now installs from `agent-mastra/bun.lock` with `--frozen-lockfile`. + ## 0.3.0 **Before upgrading.** Forty things change for an existing deployment: @@ -159,16 +330,6 @@ Newest first. `Unreleased` is what is on `main` and not yet tagged. `secrets` restarts the server. - Migration `0077_channel_opening` adds a nullable `channels.opening`. -### A Bot's commands run in one live shell you can watch and take control of - -The Computer panel has a Terminal tab beside the screen: a real terminal where you watch each of the -Bot's commands typed and its output stream, in colour. Take control gives you the keyboard there, as -it does in the browser, and the Bot waits until you hand it back, then carries on in the same shell. -`cd` and exported variables carry over from one command to the next. The Bot still gets each -command's output and exit code within the same time and size limits, and approvals and policy for -commands are unchanged. A command's stdout and stderr now come back as one stream, as a terminal -shows them. - ### Teach a Bot: do a task once in your own browser, and your Bots learn it The OpenBot Recorder is a Chrome and Edge extension that records a task while a person does it and From da24f6ac426174077982213d223edf5071c8225f Mon Sep 17 00:00:00 2001 From: David McKay Date: Thu, 5 Nov 2026 21:18:58 -0800 Subject: [PATCH 2/2] Match the 0.3.1 changelog to #1044's final head An operator's model is the default while the credential lists it, nothing writes one on their behalf, one person picks from every listed model, a team picks among the models an admin allows, and a pick applies from the next message. Checked against 90d2201e. --- CHANGELOG.md | 54 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fcb5711c9..0e32cba389 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ Newest first. `Unreleased` is what is on `main` and not yet tagged. ## Unreleased -**Before upgrading.** There are no migrations: the database stays at `0077_channel_opening`. Eight +**Before upgrading.** There are no migrations: the database stays at `0077_channel_opening`. Ten things change for an existing deployment: - On OpenBot Desktop, the first Start after the app updates to this release moves the installed OpenBot to it too. Until now an installation kept the release it was installed at until you moved @@ -23,23 +23,42 @@ things change for an existing deployment: and the key goes to the app's protected store, never to `.env`. Apps, unavailable on Desktop since 0.3.0, become available. A `COMPOSIO_API_KEY` in `~/OpenBot/.env` or the environment, or an Arcade choice, still wins, and then nothing is asked (below). -- Built-in Bots, and the Bot framework picked at setup when it is OpenBot's own LangGraph or Claude - Agent SDK harness, now answer on the middle of the provider's current line when nobody has picked - a model, instead of `BOT_MODEL`: the newest model of each line, ordered by price, and the one in - the middle (on 2026-11-05, `gpt-6.1-terra`, `claude-sonnet-5-5`, `gemini-3.8-flash` and - `grok-4.7`). This holds whether or not people may pick, within the model allowlist when it is on. - `BOT_MODEL` stays the default only behind a gateway in `OPENAI_BASE_URL` that lists it, or while - the provider's model list cannot be read. A ChatGPT plan answers only on a model its own list - offers (below). +- When nobody has picked a model, built-in Bots now answer on `BOT_MODEL` while the provider lists + it, and otherwise on the middle of the provider's current line: the newest model of each line, + ordered by price, and the one in the middle (on 2026-11-05, `gpt-6.1-terra`, `claude-sonnet-5-5`, + `gemini-3.8-flash` and `grok-4.7`). With no `BOT_MODEL`, that replaces the tenant package's + `default_model` (`gpt-5.6-terra` in the bundled packages) or, on Anthropic, `claude-sonnet-5-5`. + On OpenAI's own API, `BOT_MODEL` now applies to built-in Bots, where it used to be ignored. A + `BOT_MODEL` the provider doesn't list gives way to the middle: a ChatGPT plan given `gpt-5.5` runs + the plan's middle model. Behind a gateway in `OPENAI_BASE_URL`, the configured model stays the + default while the gateway lists it, and until the provider's list has been read the configured + model is used. The Bot framework picked at setup, when it is OpenBot's own LangGraph or Claude + Agent SDK harness, is sent the same model on every run (below). +- Nothing writes a `BOT_MODEL` on your behalf any more, so an unset one means the middle of the + line. `docker-compose.yml` gives the picked harness an empty `BOT_MODEL` when it is unset, rather + than `gpt-5.5`. OpenBot Desktop no longer writes `BOT_MODEL=claude-sonnet-5-5` for an Anthropic + key, and takes out the one it wrote at the next Start; a model chosen on a Desktop setup screen + (an OpenAI-compatible endpoint's, or a Google or xAI sign-in's) is still written and stays the + default. The harness answers on the model the server sends each run, and only when the server + sends none, because it has not read the provider's list, on the provider spec file's model for it + (`gpt-4o-mini` on OpenAI). - The server now reads the provider's model list (a plan's own, through its harness) and - `https://models.dev/api.json` when it starts and every six hours after, whether or not people may - pick, and again at once, at most once a minute, when a provider refuses a model as unknown or + `https://models.dev/api.json` when it starts and every six hours after, whether or not anybody + picks, and again at once, at most once a minute, when a provider refuses a model as unknown or unsupported. A refresh that fails keeps the last good list. `OPENBOT_MODEL_CAPABILITIES_URL` points at a mirror of models.dev, or `off` reads none, and then the default is the configured model while the provider lists it. -- With `OPENBOT_SINGLE_USER=true` (OpenBot Desktop among them), "Let people choose a model" under - Admin → Providers is now on until somebody turns it off. A deployment that saved it off keeps it - off. +- With `OPENBOT_SINGLE_USER=true` (OpenBot Desktop and the personal edition among them), the one + person is offered every model the provider lists, with no switch and no allowlist. Admin → + Providers shows neither, and a model allowlist saved earlier no longer applies. +- In a team, people pick among the models an admin allows under Admin → Providers → Allowed models, + plus the default, and "Let people choose a model" is gone. Until an admin allows one, people get + the default and see no picker: a team that let people pick before upgrading has no picker until + models are allowed there, and one whose list already holds models now shows them, whatever the old + switch said. A pick on a model no longer allowed, or no longer listed by the provider, runs on the + default and is kept for when it is offered again. "Only allowed models" still refuses a run on any + model not allowed, the default included, so with it on, allow the new default (above) or runs + nobody picked a model for are refused. - A Bot's commands now run in one interactive bash on its computer, one for each Bot a person uses, instead of a fresh `bash -c` each (below). `cd` and exported variables carry over to the next command. A command's stdout and stderr come back together as its output, with `stderr` empty, as a @@ -145,8 +164,13 @@ The composer's model picker is now a text button naming the model and its thinki Sonnet 5.5 · High"), and its list adds a Thinking group with the levels the model in use accepts, its default marked. A model is only ever shown, saved and sent the levels it takes, and switching to a model that doesn't take the chosen effort clears it. The pick is still kept per person and -conversation, and a new conversation saves both before its first message. +conversation, a change applies from the next message, and a new conversation saves both before its +first message. +- **Who picks from what.** One person on their own machine picks from every model the provider + lists. In a team, people pick among the models an admin allows under Admin → Providers → Allowed + models, which lists each with its maker's mark and thinking levels, and see no picker until one is + allowed (above). - **More Bots and every sign-in.** It is offered for the Bot framework picked at setup when it is OpenBot's own LangGraph or Claude Agent SDK harness, and on OpenAI, Anthropic, Google and xAI keys and sign-ins, any OpenAI-compatible endpoint, and ChatGPT and Claude plans, each listed from its