| Files | Last commit | Last update |
|---|---|---|
Show the OpenCode Go monthly limit as a third usage bar (#4284) * Show the OpenCode Go monthly limit as a third usage bar OpenCode Go reports a 5-hour, a weekly and a monthly window. Usage showed only the one of the weekly and monthly windows that was closer to its end. Send the other one as an optional `tertiary` window on the IPC usage limit, and show it in the usage list. The rail ring and the chip keep the two windows that stop work first. The Team API does not send the new field. Closes #4279 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep the third OpenCode usage window on the ACP read path The rate limits decoder did not copy `tertiary`. A usage refresh through the OpenCode client then lost the third bar. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 9 days ago | |
Show subagents of all agents, and keep a running card in view (#4947) * Show subagents of all agents, and keep a running card in view OpenCode, Kimi, Cline and Hermes subagents now show a card in the chat with their task, state, time and steps. A Codex subagent card shows its steps while it works. An agent shows as working in the sidebar while one of its subagents runs, also after the turn ends. A failed subagent sends a desktop notification or an alert, as the agent's notification settings say. When you scroll away from a card whose subagents work, its header stays as a bar under the chat header, with the progress, the current step and the time. A click on the bar goes back to the card. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove the subagent thread entry of a turn with no subagent A Kimi, Cline or Hermes turn added one entry for each tool call and did not remove it when the turn had no subagent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Show the failed-subagent alert only at the "all" notification level The desktop notification already obeyed this level. The in-app alert also showed at "needs-me". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 6 days ago | |
Send fewer tool and prompt tokens in each Claude and Codex request (#5642) * Send fewer tool and prompt tokens in each Claude and Codex request - Show the model only the schema keywords that it needs. The router still decodes each call with the full schema. - Give the Claude SDK the advertised JSON Schema of each OpenBot tool. - Make OpenBot tool descriptions, tool guidance and reply protocol text shorter. - Use compact JSON in prompt blocks. - Add scripts/agent-tool-tokens-bench.ts. It writes .openbot-build/agent-tool-tokens-bench/report.json. * Describe the avatar seed format for the model The advertised schema no longer has the pattern, so the description gives the rule. | 2 days ago | |
Make channels feel like chats and run channel turns beside the own chat (#5790) * Make channels feel like chats and run channel turns beside the own chat - Show progress notes as separate messages when they are complete, and slide new channel messages in. - Group "Assigned to" rows, remove own-name labels from member messages, and show a sent message once. - Send mentions after a quote, several typed names and late names to the named members. - Give each channel its own mailbox lane and side thread, so a channel turn runs beside the member's own chat. An agent runs one channel turn at a time. Providers that run one turn at a time keep the serial order. * Keep channel turns apart from the own chat in failure, clear and stop - A failed channel turn no longer marks the own chat as failed. - Clear, delete history and compact wait for channel work only when the provider runs one turn at a time. - interrupt_agent tells the caller that a channel task still runs. - An empty streaming row that holds only the member's name stays hidden. - After a reconnect, channels load again so that no missed event stays lost. * Make the channel_assign description shorter to keep the context budget The task prompt already tells a member to do its assignment itself. * Give each sent channel message its own row key When a channel guess took the wrong stored message, the send's own id later mapped to the same pending row key, and two rows shared one key. | 1 day ago | |
Show email addresses to the agent in its memories and history (#5826) * Show email addresses to the agent in its memories and history The shared log redaction replaced every email with `[redacted-email]`, and the app also ran it on text that the agent reads: saved memories, memory tool results, the handoff of earlier messages, routine digests, `history_*` tool results and usage-limit continuation progress. The agent then could not see or show an address that the user gave it. Add `redactSecrets`, which is `redactText` without the email rule, and an MCP gateway variant for the agent. Use them only on those agent-context paths. Logs, diagnostics, tool steps, tags and chat-app replies keep `redactText`. Fixes #5820 * Share the MCP secret values of both gateway redactions, and correct the redactSecrets comment | 1 day ago | |
Release every recorded provider session when an agent is deleted (#4685) * Release every recorded provider session when an agent is deleted An agent delete closed only the provider sessions that the conversation listed as loaded. A shared client can hold a session that the conversation does not list: an exit or activation of any provider clears the loaded list of every provider, and a history read at start or after a Pi restart opens a Pi process in the agent folder. That process kept its working folder in the agent folder, and Windows refused the removal with EBUSY. The delete now also tells the current shared client of each recorded session's provider to release that session. Fixes #4346 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Narrow the release note of the agent delete fix Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 7 days ago | |
Add openbot-cli to run tasks on agents from local scripts (#2393) * Add openbot-cli to run a task on an agent from a script The Local scripts API could send a message but not tell a script when the turn ended or what the agent answered. It also could not change the model or the provider account of an agent. - GET /v1/agents/:agentId/deliveries/:deliveryId gives the delivery state and, when the delivery ended, the turn's answer. - POST /v1/agents/:agentId/settings changes provider, model, reasoning effort or provider account through AgentService.updateAgent. Other fields are refused. A refusal (for example, the agent works) gives 409. - resources/cli/openbot-cli.mjs (Node 18, no dependencies) uses these routes: list, run [--wait] [--json], status, agent set-account and agent set-model, with documented exit codes. - scripts/automation-cli-e2e.ts runs the CLI against the real AutomationServer and writes .openbot-build/automation-cli-e2e/report.json. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Start a new chat with an agent from a local script Adds POST /v1/agents/:agentId/context/clear to the Local scripts API and `openbot-cli agent new-chat <agent>`. Both do what New chat does in the agent's settings: the agent forgets the conversation, and its next turn starts a new provider session, while the profile, model, tools, memories, workspace and browser stay. While the agent works, or has messages in its queue, the answer is 409 with the reason. A long conversation is sent again with each tool call, so a script that starts a new chat before each task keeps an agent's context small. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Finish the review items for openbot-cli - The settings route uses the same model and effort resolution as the agent's update_profile tool (requestedRuntime in model-tools.ts). - Only AgentSettingsRefused gives 409. Another failure gives 500 and a log. - The CLI checks all flags before it sends a request. - A 404 after the agent lookup exits 1, not 5. - A wait continues when OpenBot restarts and reads the new URL and token. - A queued task behind a question exits 3. - CI runs test:automation-cli. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Check CLI arguments before the connection is read A usage error now exits 2 also when OpenBot is off, not 5. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Natan Pimentel <natanpimentel@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 24 days ago | |
Attach files that an agent answer names by path (#3514) * Attach files that an agent answer names by path At the end of a completed turn, the backend finds the absolute paths in the final answer and attaches each file to that answer. A file must pass the attachment checks (agent workspace or Shared, regular file, no symlink), be 25 MB or smaller, and have a supported type. SVG files, folders, missing files, paths outside the permitted folders and names that the turn already attached stay as paths. A failure never fails the turn. On desktop, an inline image preview now skips only attachments that show as cards, so an attached image that the answer names in a code span still shows once. Fixes #3505 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Attach only output files that an answer names, and fix turn-end publish - Attach only images, audio, video, ZIP, PDF, office documents, CSV, text and Markdown. Code, configuration, env and log files can hold secrets, so they stay as paths. - Do not remember the conversation signature after the attachment commit. Before, the turn end could skip the save and publish of its other changes. - Apply the 10-file limit to files that pass the checks, not to the paths found in the text. - Find paths in bold text, and paths with spaces in code spans. - On desktop, the inline image preview skips each attachment that the text does not name, also a generated image. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 13 days ago | |
Make agent permissions one setting with 3 levels (#2337) * Make agent permissions one setting with 3 levels Each agent has one Permissions select: Workspace only, Ask first or Full access. Claude shows only Workspace only and Full access. - Remove Turbo and the Auto approve switch in the model picker. Full access now also publishes public sites and runs built-in tools without asking. A v2 preference file with Turbo on loads as Full access for every agent. The new v3 file keeps the old files for a downgrade. - One auto-approve rule in the attention registry for provider approvals, built-in tools, hosted sites and MCP consent. - Local and remote edits go through agent-admin-v1. The host always sends autoApproveLocked false; the wire does not change. - "Always allow" shows only at Ask first. - Mobile uses the same 3-level picker. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep agent permission writes safe and make Claude Full access complete Write the narrower half of a permission change first, and run one change at a time. A Claude agent with full reach now also accepts built-in tool and hosted-site approvals, as its Full access level says. Remove the last Turbo mode text from the compare page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep asking for Claude agents that had Auto approve off Do not widen these agents. A Claude agent stored at full reach with no grant shows Ask first, and the select offers Ask first only then. Its built-in tool and site approvals still ask. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Stop exporting serverCanAdministerAgents Its last caller outside the file went away with the model-menu switch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Show Full access for a Turbo-locked agent and make Ask first text correct A released host with Turbo mode on answers autoApproveLocked. The desktop and web approval card now read it, so the card shows no "Always allow" for that agent. The Ask first note now says that the agent asks before an OpenBot tool or a site, and when its provider asks for approval. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Lower the type baseline for two files with fewer errors Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 24 days ago | |
Give the real reason when an attachment path fails (#4669) * Give the real reason when an attachment path fails attach_files_to_response turned every per-path failure (lstat, realpath and open errors, symbolic links, folders, the dev/ino check) into one containment message. On Windows the file exists in the workspace and in Shared, so that message hid the real cause. The error now names the failed check, or the Node error code and call, without the path. Refs #4564 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Name the release notes after the branch Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 7 days ago | |
Fill saved authenticator codes into code fields with no one-time-code mark (#6092) * Fill saved authenticator codes into code fields with no one-time-code mark A Vault, 1Password or Bitwarden code filled only fields with autocomplete="one-time-code". Older Keycloak pages (before 2024-09) and many other sites name the field otp with autocomplete="off", so the code card opened each time. A text, tel or number input with a strong code word (otp, totp, 2fa, mfa, authenticator, one-time code, verification code, two-factor) in its id, name or aria-label now counts as a code field. Backup and recovery code fields do not. These attributes are in the target fingerprint, so a change before the fill still stops it. The origin, agent-script and URL navigation guards do not change. Fixes #6040 * Match joined code words such as totpmfa in vault code fields The public TOTP test page authenticationtest.com names its field totpmfa, which the whole-word match missed. Match totp anywhere, as Bitwarden does, and joined otp, 2fa and mfa words. Fixes #6040 * Keep vault codes out of SMS, email, phone and recovery fields A name check found otp in smsOtp, twoFactorPhone and totpbackup. Reject names that also have backup, recovery, mail, phone, sms, name or label anywhere, and give the agent the full rule when it skips a fill. Fixes #6040 | 18 hours ago | |
Use one causeHelpers adapter for typed cause errors (#1472) * Use one causeHelpers adapter for typed cause errors Add causeHelpers(ErrorClass) to src/backend/effect-boundary.ts. It returns io, sync and rewrap. Replace 81 module-local Effect.try and Effect.tryPromise wrappers and 405 mapError calls that moved a cause into a new typed error. Each error class, tag and wrapper name stays. The AbortSignal variants (runtimeIO, cuaIO, githubCall, onePasswordCall) keep their names and still forward the signal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Move the no-span comment to the slackIo adapter Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Make two error classes private that only their module uses knip found AttentionOperationFailed and AvatarFileFailed unused outside their files after the rewraps moved to the to* helpers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 1 month ago | |
Send fewer tokens in background model calls (#5649) * Send fewer tokens in background model calls Memory reviews, channel summaries and profile drafts now run at the lowest reasoning effort that the model takes (`withBackgroundEffort`, from `minimal` up). Agent turns, routing turns, side questions and workflow steps keep the effort that the user chose. On Claude, a call without tools sends a plain system prompt with the OpenBot instructions. It does not send the `claude_code` preset, which holds the coding rules of an agent with tools. `scripts/background-call-bench.ts` runs the real path on the user's Claude and Codex sign-ins and writes .openbot-build/background-call-bench/report.json. On 2026-11-07 (2 runs): Claude Haiku input 3,168 -> 870 and 3,395 -> 1,096 tokens, output 817 -> 490 and 530 -> 382. Codex gpt-6-luna input did not change, and output went 119 -> 98 and 45 -> 45. * Fix the background call bench and release note scope The bench resolves only the CLIs of the selected providers. A failed run records its case and variant, and the other runs continue. The release note names all calls without tools that change on Claude, and says that the effort change applies to each provider with effort levels. | 2 days ago | |
Make channels feel like chats and run channel turns beside the own chat (#5790) * Make channels feel like chats and run channel turns beside the own chat - Show progress notes as separate messages when they are complete, and slide new channel messages in. - Group "Assigned to" rows, remove own-name labels from member messages, and show a sent message once. - Send mentions after a quote, several typed names and late names to the named members. - Give each channel its own mailbox lane and side thread, so a channel turn runs beside the member's own chat. An agent runs one channel turn at a time. Providers that run one turn at a time keep the serial order. * Keep channel turns apart from the own chat in failure, clear and stop - A failed channel turn no longer marks the own chat as failed. - Clear, delete history and compact wait for channel work only when the provider runs one turn at a time. - interrupt_agent tells the caller that a channel task still runs. - An empty streaming row that holds only the member's name stays hidden. - After a reconnect, channels load again so that no missed event stays lost. * Make the channel_assign description shorter to keep the context budget The task prompt already tells a member to do its assignment itself. * Give each sent channel message its own row key When a channel guess took the wrong stored message, the send's own id later mapped to the same pending row key, and two rows shared one key. | 1 day ago | |
Relay sign-ins from a joined server to this computer, and add a sign-in app for URL MCP servers (#1887) * Add a sign-in app for URL MCP servers An administrator can give a URL MCP server a pre-registered OAuth app (client ID, optional secret and scopes). Sign-in uses it when the server offers no dynamic client registration. The secret stays in the encrypted sign-in store and no answer contains it. The MCP callback tries 127.0.0.1:28417 first, so the callback URL is stable, and uses a random port when it is busy. Joined servers get the optional capability mcp-sign-in-app-v1 for the desktop app and the web client. Fixes #1872 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Bind a sign-in app to its first authorization server A sign-in app carried no issuer, so the SDK sent its client secret to any authorization server that the MCP resource named. The app is now bound to the first server that accepts it, as the SDK binds a registration, and a different server is refused before the SDK can register with it or receive the secret. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep the issuer binding of a sign-in app secret under a new client ID A saved secret stays bound to its authorization server when only the client ID changes. Before, the binding went, and the next sign-in could send the old secret to another authorization server. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Count mcp-sign-in-app-v1 in the current capability list test Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Relay sign-in callbacks from a joined server to this computer A joined server with sign-in-relay-v1 starts an MCP sign-in, and the page opens in the browser of the computer that asked. That computer takes the loopback callback on its own listener, on the host's port, or from a pasted address, and sends only the query to the host on the encrypted host connection. The host checks state and delivers the code once. Marketplace browser-sign-in apps install on such servers, and the browser client signs in through the paste step. Add docs/architecture/integrations.md, the guide to add a provider, an application or a connector. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Open a relayed sign-in page only when the user asks The host chooses the page of a relayed sign-in, so a host that is not honest could use this computer's browser to get a grant of another account. The client now: - opens the page only when the user clicks "Open sign-in page" in the dialog that shows its host name (new servers:mcp:open-sign-in-relay); - reads the callback port and path from the page's redirect_uri, not from the host's answer; - refuses a page with no state, so its listener hands on only the callback of this sign-in. The loopback listener now lets a page that is on its way finish before it closes, so the browser gets the "signed in" page when the callback ends the sign-in at once. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Relay provider, connector and agent-link sign-ins through a joined server - sign-in-relay-v1: provider/start (Codex, Claude, Gemini, Muse) with replay delivery to the CLI listener on the host, and link/start for a sign-in page that an agent of the host printed. - connectors-v1: the host's GitHub, Slack, Discord and Telegram connections. A Slack or Discord grant goes only to the server whose install this computer opened, once. - Browser client: provider Connect and Marketplace link apps. - Guide, PRIVACY.md and changelog. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Open only the clicked agent link, and accept only a whole recent link on the host - The client opens an agent link at once only when the page that the host names is the link that the user clicked. Any other page ends the sign-in unopened. - link/start accepts a link only when an agent message from the last hour holds it as a whole link, so a client cannot drop the end of a printed link. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Let the user paste the address of an agent's sign-in link When this computer cannot bind the callback port of an agent link, the conversation shows the paste dialog. The browser client gets the same dialog through the Team API, because it cannot listen for the callback. A link that the host does not relay opens as it is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Do not export the McpOAuthApp type, which only its own file uses Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Let a relayed sign-in remove only its own waiting entry A second sign-in of the same key replaces the first flow on the host. The first run then ends, and its cleanup removed the entry of the second run, so the callback of the second run had nowhere to go. Also do not export checkCallbackRequest, which only its own file uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Stop a relayed Codex sign-in on cancel, and keep a new web link sign-in Cancel stopped only CLI logins, so a cancelled Codex browser sign-in held its callback port. In the browser client, an old sign-in of the same link removed the paste wait of the new one when it ended. The browser client also showed GitHub for a host with no GitHub App. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * End a relayed agent-link sign-in when the user refuses it A refused link sign-in had no result, so the client waited until the flow expired after 10 minutes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Relay a refusal that reaches the MCP listener, and do not relay [::1] callbacks The MCP listener answered a refusal before the relay saw it, so a relayed sign-in waited until its deadline. The relay listener binds only 127.0.0.1, so a [::1] callback could never reach it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 29 days ago | |
Return browser upload failures to the agent as tool results (#2328) * Return browser upload failures to the agent as tool results upload_files goes through BrowserUploads, not BrowserHost.handleDynamicTool. Its failures (an ambiguous selector, a missing file, a quota) went out as a JSON-RPC error. Codex replaces that error with "dynamic tool request failed" and logs it on stderr, so the agent could not correct the call and the user saw a "Provider error" message. Return the redacted reason as a failed tool result, as the other browser tools do. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Log browser upload failures and check behavior in the smoke The router no longer reports upload failures, so log the redacted reason as a warning. The missing-file check now asserts a failed tool result, not the text of the smoke stub. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 24 days ago | |
Let a person's channel request create or change channels (#5226) In a channel task, create_channel and update_channel now work when this computer's user wrote the request that started the task. Routine runs, agent requests, member replies and team members on other computers stay refused. update_channel does not change the channel of the current task; the agent uses the channel_* tools for that channel. Fixes #5200 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 4 days ago | |
Show agent HTML pages as visual replies in the chat (#1511) * Show agent HTML pages as visual replies in the chat Agents can now check an HTML page with `html_preview` and show it with `html_render`. The page shows above the agent's reply in a sandboxed frame. The frame runs scripts and loads files from the network, but it cannot read app data. The app serves the page from its own protocol with a sandbox CSP. Mobile shows the page in a sandboxed frame. Markdown images open in the gallery. Data tables copy as Markdown or CSV. A Mermaid error shows the parser message. The file panel previews HTML files. Storybook shows each visual reply case. * Fix review findings in visual replies - A wrong html_render or html_preview argument goes back to the agent as a tool failure. The failure does not repeat the page, and the app shows no error. - html_render in a channel is a tool failure, not an app error. - One click in a page opens one link. - The preview window can be taller than the screen, so a tall page is drawn in full. - A window that does not open keeps no page in memory. * Show a visual reply page as its file on mobile In react-native-webview, a script in any frame can send messages to the bridge to the app. A page with scripts could open links without a tap, or send bad data to the bridge. Mobile now shows the page as its HTML file with the page title, as older clients do. The page still does not count as an unread message. * Keep the preview width limits local to the tool schema * Redact preview console lines and show the file in the web client - html_preview removes secrets from the console lines before it sends them to the provider. - The web client cannot load a visual reply page, so there the message shows its title and file, not "Cannot load". * Let the new optional props take undefined, as the type ratchet needs * Add the visual reply to the live conversation, not a copy A response attachment keeps the live conversation while it reads its files and then saves it. When html_render replaced that conversation with a copy, the later save deleted the visual reply from the database. html_render now adds the message in place and removes it when the save fails. * Save the visual reply page and its message in one commit html_render stored the page before it saved the message. When the message save failed, the page stayed in the mailbox and in exports, and a retry stored a second page. The page is now staged and saved with the message in one transaction, and it is discarded when the save fails. | 1 month ago | |
Add GitHub Copilot as a provider (#4951) * Add GitHub Copilot as a provider OpenBot downloads the GitHub Copilot CLI 1.0.105 as a managed runtime and runs it with `copilot --acp`. Sign-in uses `copilot login` in the browser, or `copilot login --device-code`. Disconnect sends the ACP `logout` call, because the CLI has no sign-out command. Workspace only agents cannot change the Copilot settings, hooks, skills and plugins in `~/.copilot`. Team API peers below protocol 8 do not see the new provider. Closes #4637 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix the Copilot review findings - Seatbelt: a confined process cannot make, remove or rename `.github`, so a folder renamed into its place cannot bring a protected path. - Make the Copilot `config.json` with `firstLaunchAt` when it is missing. Without it, a confined first start stops with no message. - Show the reason of a refused ACP sign-out, such as a token that Copilot does not manage. - Watch the Copilot `config.json` for sign-in changes. - Use one resolver for the latest GitHub release asset of Pi and Copilot. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 6 days ago | |
Add Hermes Agent as a provider (#4453) * Add Hermes Agent as a provider OpenBot uses the installed `hermes` with the user's own `~/.hermes`. Sign in with Nous Portal from the provider row, or set up other providers with `hermes setup`. The model menu groups models by the Hermes provider. A missing Nous sign-in shows sign-in required, and Hermes stderr goes to the log, not to error notifications. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix Hermes sign-in, profile and analytics gaps from review - Accept the Hermes shared Nous import: the login exits 0 with no link, so report it as connected. - Watch the Hermes sign-in files (auth.json, .env, config.yaml) and the Pi auth.json for changes. - Follow the active Hermes profile (`hermes profile use`) for the sign-in files and the confinement. - Confine Hermes with the `HERMES_HOME` of the agent environment. - Report `custom:<endpoint>:<model>` Hermes models as "custom" in analytics. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 8 days ago | |
Use less memory in tabs, provider processes and app windows (#5672) * Use less memory in tabs, provider processes and app windows - Keep only the 3 most recently used idle browser tabs loaded, and unload an idle tab after 15 min. - Release idle Claude, ACP, Pi and Codex sessions after 5 min, and keep one idle session loaded. - Stop the full process group of each provider CLI, so MCP server children do not stay. - Load only English and the shown language in each app window, not all 15 languages. - Keep fewer hidden side threads, chat images and long Markdown messages in the renderer. - Send the JavaScript heap of the app windows in the daily resource analytics. * Fix review findings in the memory changes - Wait for the saved language before the first render. - Do not stop ACP agents as a process group: some leave the user's servers in the agent's group. - Close other idle Pi threads in the background, so a failed close does not fail the turn. - Release idle threads once in each critical memory period, also when a release was in progress. - Forget the idle Codex sessions of a stopped client. - Share the lazy language catalog Vite plugin from packages/i18n. - Limit the Markdown lexer cache by characters, not by body size. * Do not export types that only their own file uses * Fix CI: type ratchet and the Antigravity MCP load failure test - Set `resumedSession` only when the session resumed, for exactOptionalPropertyTypes. - Only one idle ACP thread keeps its process, so the first thread can resume once more in the last turn of the Antigravity test. The two failed-turn resumes are still checked exactly. | 2 days ago | |
Show the provider reason when a Muse or ChatGPT sign-in fails (#5735) * Show the provider reason when a Muse or ChatGPT sign-in fails Muse and Codex send a reason with a failed sign-in, such as a Meta account that has no payment method (#5544). OpenBot dropped it and showed only "Try again". Show the reason, redacted and short, in the existing sign-in failure text. Without a reason, keep the old text. Move the redact-and-shorten step of the Gemini sign-in to a shared helper, and add a stand-in E2E check for Muse. * Keep a granted Muse sign-in when its message has an unknown type Decode the outcome and the message of account/loginCompleted separately. A message that is not a string no longer turns a granted sign-in into a failure. | 2 days ago | |
Send fewer prompt tokens to Codex, and add web search for agents with no search of their own (#5658) * Send fewer prompt tokens to Codex, and add openbot.web_search Codex threads now start with features.tool_suggest off, five unfit system skills off, and, for toolless threads, agents and sleep off. A key in the user's config.toml stays as the user set it. This removes about 1,050 tokens from each Codex request. Add the deferred openbot.web_search tool. A separate Codex session on the Codex sign-in of this computer runs the search and returns a short answer with source URLs. Only agents whose CLI has no web search of its own get the tool: Pi, Inception, DeepSeek, OpenRouter and custom ACP agents. Codex, Claude and the other CLIs keep their own search. Add smoke:codex-agent, bench:codex-prompt-settings and bench:codex-web-search. * Stop a web search on Stop, and keep the user's skill entries - Race openbot.web_search against the request's abort signal, as the browser tools do. Stop now ends the side Codex process. - A web search leaves one generation slot for the user's own work, and checks shutdown and free slots again after Codex starts. - Log why Codex was not ready for a web search. - A [[skills.config]] entry by path also names its skill, so OpenBot does not turn off a skill that the user turned on by path. Keep each user entry as it is. * Use one usage observer for side sessions, and remove an unused type Memory reviews and web searches now use sideSessionUsageObserver with a kind. Remove the CodexSkillConfig type, which knip reports as unused. * Set the expected answer only when the bench question has one This removes an exactOptionalPropertyTypes error that types:ratchet reports in codex-web-search-bench.ts. | 2 days ago | |
Send fewer prompt tokens to Codex, and add web search for agents with no search of their own (#5658) * Send fewer prompt tokens to Codex, and add openbot.web_search Codex threads now start with features.tool_suggest off, five unfit system skills off, and, for toolless threads, agents and sleep off. A key in the user's config.toml stays as the user set it. This removes about 1,050 tokens from each Codex request. Add the deferred openbot.web_search tool. A separate Codex session on the Codex sign-in of this computer runs the search and returns a short answer with source URLs. Only agents whose CLI has no web search of its own get the tool: Pi, Inception, DeepSeek, OpenRouter and custom ACP agents. Codex, Claude and the other CLIs keep their own search. Add smoke:codex-agent, bench:codex-prompt-settings and bench:codex-web-search. * Stop a web search on Stop, and keep the user's skill entries - Race openbot.web_search against the request's abort signal, as the browser tools do. Stop now ends the side Codex process. - A web search leaves one generation slot for the user's own work, and checks shutdown and free slots again after Codex starts. - Log why Codex was not ready for a web search. - A [[skills.config]] entry by path also names its skill, so OpenBot does not turn off a skill that the user turned on by path. Keep each user entry as it is. * Use one usage observer for side sessions, and remove an unused type Memory reviews and web searches now use sideSessionUsageObserver with a kind. Remove the CodexSkillConfig type, which knip reports as unused. * Set the expected answer only when the bench question has one This removes an exactOptionalPropertyTypes error that types:ratchet reports in codex-web-search-bench.ts. | 2 days ago | |
Stop and continue a Codex turn whose compaction loses the connection (#5914) * Stop and continue a Codex turn whose compaction loses the connection Codex waits with no end for a connection that stops answering during its own compaction inside a turn. The turn showed "Compacting context" until the user stopped it, and the task was lost. A refused connection ended the task with Codex's raw "Error running remote compact task" text. - A compaction that Codex starts inside a turn now has the compaction run deadline (20 min). At the deadline OpenBot sends turn/interrupt. - A turn that such a compaction ended (connection error, or the deadline) continues once with a short note, as a plan continuation does. The user message is not sent again. - A second failure in the same request shows a plain message. Fixes #5822 * Keep failover, one banner and a user Stop for a failed compaction - A turn that did no work yet still moves to a backup model when its compaction fails on the connection. - Show one banner when a failover error is also held. - A Stop from the user after the deadline stays a Stop, not a failure. - Only a connection failure or a timeout continues the turn. A server error keeps the provider's text. - When the deadline cannot stop a hung process and the process ends, show the plain error. - A continuation after a failed compaction keeps the no-progress check of the plan. * Keep the plan state of a request when a failed compaction continues it A continuation after a failed compaction now takes the plan of the failed turn and the open steps from before the request, as a plan continuation does. Correct the comment on the compaction deadline stop. | 23 hours ago | |
Stop a queue loop that filled a server disk with chat updates (#5908) * Stop a queue loop that filled a server disk with chat updates A hosted server wrote 1.7 million `conversation.snapshot-updated` events (66 GB) in 22 hours. A Claude agent waited on a question in a turn that the CLI started itself. A routine turn in the same chat ended and set the chat to idle. The queue then asked the busy CLI for a turn again and again, and each try saved every queued message again in the chats of the agent and of each sender. - A turn end keeps another turn that still runs in the same chat active. - After `ProviderTurnActiveError`, the lane waits until the next drain of the agent, for example the end of any of its turns. - A change of a queue position alone is shown, but not saved. Each reader takes positions from the mailbox again. - A chat update that the next update replaces whole is removed from the event log. A replay of the log gives the same chat. Adds scripts/queue-restore-loop-e2e.ts and scripts/conversation-update-supersede-e2e.ts. * Fix the review findings of the queue loop change - A turn end clears the chat's active turn as before, except when that turn is another turn that still runs. It no longer takes a different running turn, so a turn that never ended cannot hold the chat. - A start is not held after `ProviderTurnActiveError` when a drain call arrived during the start: that call can be the end of the turn. - The activity row of an update has a key from its sequence, so the removal finds it by key and does not read the whole table. - An update goes only when its command id has the generated form, and when the later message has the same author and, with no delivery, the same time, as a replay keeps them. - A page read takes the queue positions from the mailbox, because a move of the queue alone is no longer saved. - The loop check waits for the hold that the drain logs, not for a time. * Do not save queue moves on page reads The page read compares stored messages with the mailbox. It counted a moved queue position as a change and saved every queued message again. Both checks now compare messages with no queue position, through one helper. A page read takes the positions from the mailbox. | 1 day ago | |
Stop a queue loop that filled a server disk with chat updates (#5908) * Stop a queue loop that filled a server disk with chat updates A hosted server wrote 1.7 million `conversation.snapshot-updated` events (66 GB) in 22 hours. A Claude agent waited on a question in a turn that the CLI started itself. A routine turn in the same chat ended and set the chat to idle. The queue then asked the busy CLI for a turn again and again, and each try saved every queued message again in the chats of the agent and of each sender. - A turn end keeps another turn that still runs in the same chat active. - After `ProviderTurnActiveError`, the lane waits until the next drain of the agent, for example the end of any of its turns. - A change of a queue position alone is shown, but not saved. Each reader takes positions from the mailbox again. - A chat update that the next update replaces whole is removed from the event log. A replay of the log gives the same chat. Adds scripts/queue-restore-loop-e2e.ts and scripts/conversation-update-supersede-e2e.ts. * Fix the review findings of the queue loop change - A turn end clears the chat's active turn as before, except when that turn is another turn that still runs. It no longer takes a different running turn, so a turn that never ended cannot hold the chat. - A start is not held after `ProviderTurnActiveError` when a drain call arrived during the start: that call can be the end of the turn. - The activity row of an update has a key from its sequence, so the removal finds it by key and does not read the whole table. - An update goes only when its command id has the generated form, and when the later message has the same author and, with no delivery, the same time, as a replay keeps them. - A page read takes the queue positions from the mailbox, because a move of the queue alone is no longer saved. - The loop check waits for the hold that the drain logs, not for a time. * Do not save queue moves on page reads The page read compares stored messages with the mailbox. It counted a moved queue position as a change and saved every queued message again. Both checks now compare messages with no queue position, through one helper. A page read takes the positions from the mailbox. | 1 day ago | |
Keep Grok agents on their model when Grok first lists part of its models (#4750) * Keep Grok agents on their model when Grok first lists part of its models Grok 1.0.70 starts on its two built-in models when its sign-in has expired, renews the sign-in, and has its whole catalogue about a second later. A model/list in between lacks the newer models, so provider activation moved every agent on grok-4.7 to the default grok-4.6, and nothing moved it back once the list was whole again. A driver flag, catalog.partialListAtStart, marks such a CLI; only Grok sets it. When an agent's model is missing from the first list, the activation waits 5 s outside the endpoints lock and reads the lists again. Agents move only when that second list is fresh and comes from the same client; a process that replaced it has its own activation. New E2E: test:grok-partial-model-list, with a fake Grok whose first session setups after a start list only the built-in models. * Add the new AgentBrowserHost methods to the Grok partial list test stub #5021 added shareTab, unshareThread and agentTab to AgentBrowserHost. The stub in the new E2E test predates it, so typecheck:node failed after merging main. * Wait for each Grok restart to end in the partial model list test A restart while an earlier one is still pending does nothing. The fake logs a setup before it replies, so the test could restart Grok again before the first restart ended. In CI the second restart then did nothing and the test timed out. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Sniezka1927 <dygons14@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 4 days ago | |
Migrate service runtimes to Effect 4.0.0 (#1283) * refactor: migrate service runtimes to Effect 4 * refactor: make Effect the canonical service runtime * fix: preserve typed Effect failures and align CI test boundaries * test: await Effect test boundaries and lower lint baseline * fix: handle early provider exit and retain remote send errors * Simplify Effect composition and failure handling * Fix review findings in hosted sites, updates and WebRTC requests - Release a hosted-site idempotency claim on any failure, defects included. - Keep update downloads running after stop(), as before the migration. - Clean up a pending WebRTC request when the send is interrupted. - Compose the account switch in one Effect, without nested runPromise. - Remove single-effect generators in the WebRTC client transport. - Put the atomic-write JSDoc on writeFileAtomically; reuse writeJsonFileAtomically. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Run Effects at Promise boundaries through one runCauseEffect Replace the inline Effect.runPromise(x.pipe(Effect.mapError((error) => error.cause))) calls and the per-domain runners (runBrowserEffect, runMcpEffect, runArchiveEffect, runRemoteWorkflow, runDesktopEffect, runProviderClientEffect, runTestEffect) with runCauseEffect in src/backend/effect-boundary.ts. Behavior is unchanged: expected failures reject with their cause, and defects and interruption reject as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Mark concurrent test starts as not awaited runCauseEffect returns a Promise, so Biome now finds the operations that these tests start and do not wait for. Mark each with void. The start stays concurrent, and a rejection still fails the run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Send CentralAuth requests through the network-block detector The merge of main wrapped the options fetch, but CentralAuth sends its requests through the Effect transport. Build the transport from the wrapped fetch, and run the new test through Effect. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Run each account API entry point as one Effect Route handlers, the browser API, the Worker pre-routing and the cron now run one Effect each. Request body readers, the SMTP socket close and the remaining R2 and D1 calls are Effects. The skill icon read is now part of its Effect; before, the Effect returned a Promise. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Run the remaining service runtime in Effect Main: the automation server, Team API server start and stop, duplicate requests, Dynamic Island, the Computer Use highlight, trace flushes, update background work, sibling scans, upload slots, server mode, window bounds, attachment archives and uploads, and remote transport callbacks are Effects forked into their owner's scope. Backend: usage limit hooks and the channel requeue are Effects. Team client: request frames, Signal notices and connection failures run in the peer's work scope, and recovery loops inside its run. Site router: one Effect per request. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Run the picture-in-picture and permission help windows in Effect Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove the unused analytics runner The trace file forks its flush into its own scope now, so nothing calls runAnalytics. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep cron jobs, session ends and host starts complete after a failure - The cron waits for every job before it reports the first failure, so a failed delivery does not stop retention or a site cleanup midway. - A connection failure ends the logical session in an uninterruptible fork, so dispose does not stop it. - A dependency that throws while the Team API listener starts fails the start, so the host stops the listener. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 1 month ago | |
Let agents learn and revise skills from chats (#5945) * Let agents learn and revise skills from chats The background memory review can now find a skill in a chat. The server setting "Skill learning" sets what happens next: Automatic saves the skill, Ask first shows a skill card with Save in the chat, and Off does nothing. Save uses the background writer with no tools and no agent turn. The Team API capability skill-learning-v1 adds the setting routes, the Save route and the `skillSuggestion` key. Web and desktop clients copy the key back after the frozen codecs decode. A skill description with a colon now saves, because the library quotes the frontmatter value. * Fix the review findings of the skill learning change - A skill card for a new skill shows Saved only for a skill with its name, or for the skill that the agent made in answer to the card. - A second Save does not write the skill again while its line waits for the running turn, or when the line could not be added. - A skill name with no Latin letter gets a slug from its hash. - One frontmatter pattern for the skill package, library and learner. * Keep the skill revision text inside the agent context budget Show the in-turn skill revision line only when skill learning is Automatic. Remove the revise_skill guidance and shorten the skill tool descriptions. Remove the unused skill suggestion bench script. * Show the skill revision line only when skill learning is Automatic The line, the revise_skill guidance and the longer skill tool descriptions went over the agent context budget. Ask first and Off now leave the line out, so the agent changes a skill only when the user asks. * Reload the agent sessions when skill learning moves into or out of Automatic The skill revision line is in the instructions only with Automatic. A loaded session kept the old line until it unloaded, so an agent could still revise a skill after the user chose Ask first or Off. | 23 hours ago | |
Write only the streamed message on a delta flush (#534) A streaming flush arrives ten times a second per streaming message and called persistConversation, which puts the whole snapshot in the event payload, re-upserts every message in the thread and clones the history back to the caller. The cost of one flush therefore grew with the whole thread, on the main process, inside a write transaction every other agent queued behind. Six agents on 2500-message threads saturated it. persistStreamingMessage writes the one message that changed. The event carries the message whole rather than the delta, because item/completed replaces the text instead of adding to it, so summing deltas would not rebuild it; a whole message also makes each event idempotent and order-independent. Each flush drops the event it supersedes, and the next whole snapshot prunes the rest, so the log grows with the text rather than the square of it. Per-flush cost is now flat at ~0.2 ms from 100 to 2500 messages, where it was 7-31 ms and rising. An 80-second streaming turn on a 400-message thread costs 0.22 s of CPU rather than 4.63 s, with no database growth. Co-authored-by: Claude Opus 5 <noreply@anthropic.com> | 1 month ago | |
Measure the storage of a hosted server against its plan (#6264) * Measure the storage of a hosted server against its plan The account server sends the plan storage of a hosted server in the host list. The desktop storage card and Server settings > Storage use it. They do not count the 22 GB base image, and the card shows when less than 10 GB of the plan is free. Agents on a hosted server get one short line about the plan storage. * Correct the release notes for the plan storage warning * Read the hosted state of a host from its plan, with one lookup | 14 hours ago | |
Add fast mode for Claude agents (#6261) * Add fast mode for Claude agents Claude agents can use fast mode from the model picker when Claude Code reports that the model supports it. The turn sets the fastMode flag setting of the claude process. Before fast mode turns on for a Claude agent, a dialog asks the user to confirm the higher price. When Claude Code runs a turn at the standard speed, the chat shows the reason once. * Turn off fast mode on a provider change A provider change sets fastMode to false, so a Codex agent with fast mode does not use Claude fast mode without the price confirmation. The first Claude turn of a process also sends fast mode off, because a Claude settings file can start the process in fast mode. A pending confirmation ends when a different agent opens. The chat warning is marked as sent only when it was sent. The release notes file now has the branch name. * Turn off fast mode one time for Claude agents Before this release only Codex read fastMode. A Claude agent has the value true only from a provider change, and the user never confirmed the Claude price for it. At the first start of this release, the agent store sets fastMode to false for each Claude agent. The receipt of the command is the marker that stops a second run. * Add the fast mode resets to the release note * Keep fast mode across a backup model, and hide Claude fast mode from members | 14 hours ago | |
Add roles that set the agents that members can use (#2664) * Add roles that set the agents that members can use The host keeps a set of roles for each server in openbot-agent-access-v1.json. Each role gives each agent one level: none, view, chat or manage. A member gets the highest level of Everyone and of their roles. Owners and admins always get manage. The new Team API capability agent-access-v1 reads and sets the roles, and the host checks the level on the agent routes. Server settings get a Roles tab on desktop and web. Each member row on the Members page gets one menu for the server role and the roles. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Check roles on more routes and send events faster - Answers to prompts, approvals and browser requests need the chat level. - The memory inclusion route needs the manage level. - A save drops the levels of deleted agents, so the file does not grow. - A member removal reads the roles in the write lock. - An event reads the roles once for each member, after the skip checks. The shared conversation payload key holds all closed agents. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Copy the access of an agent to its duplicate A duplicate now gets the levels of its source before clients see it, so the copy does not open memories that the roles close. Live Activity reads the member's current role at each send. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 20 days ago | |
Add reliable error reports across app surfaces (#1533) * Add reliable error reports across app surfaces * Report structured provider failures once per turn * Exclude confirmation dialogs from notification reports * Keep saved mobile reports until the account is loaded * Omit absent optional fields from failure reports | 1 month ago | |
Show email addresses to the agent in its memories and history (#5826) * Show email addresses to the agent in its memories and history The shared log redaction replaced every email with `[redacted-email]`, and the app also ran it on text that the agent reads: saved memories, memory tool results, the handoff of earlier messages, routine digests, `history_*` tool results and usage-limit continuation progress. The agent then could not see or show an address that the user gave it. Add `redactSecrets`, which is `redactText` without the email rule, and an MCP gateway variant for the agent. Use them only on those agent-context paths. Logs, diagnostics, tool steps, tags and chat-app replies keep `redactText`. Fixes #5820 * Share the MCP secret values of both gateway redactions, and correct the redactSecrets comment | 1 day ago | |
Continue unfinished work after usage-limit fallback (#3145) * Continue unfinished work after usage-limit fallback (#3142) * Show the usage-limit continuation once and keep all its progress - Put the continuation block in the prompt one time when a batch has more than one delivery of the same interrupted turn. - Include the answer text of all interrupted turns in the chain, not only the newest turn. - Read the task queues only when the main queue is empty. - Make the trace step list only for a continuation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep a channel continuation when a backup refuses before work When a backup plan refuses a channel continuation before any work, the next ready backup now continues it in the same assignment. Before, the task went back to its channel without the earlier work, and the next backup started the task again. - At turn end, a delivery with a continuation keeps it. - At turn start, a refused channel delivery with a continuation goes back to the queue with it. - The failover E2E test checks a channel chain where the first backup refuses before work. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Check a quiet routine run by its delivery ID in history import A continuation turn has its own client ID. History import found the delivery from that ID, but checked the quiet routine run with the client ID, so the check was always false. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Stop the work-step read when the interrupted turn is complete The continuation read all turns of the session history to find the work steps of one turn. On a long session, the read could go past its 2-second limit, and the backup did not get the tool results. The read now stops when the interrupted turn is complete. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Aleksander Dygoń <48182795+Sniezka1927@users.noreply.github.com> Co-authored-by: Sniezka1927 <dygons14@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 15 days ago | |
Show email addresses to the agent in its memories and history (#5826) * Show email addresses to the agent in its memories and history The shared log redaction replaced every email with `[redacted-email]`, and the app also ran it on text that the agent reads: saved memories, memory tool results, the handoff of earlier messages, routine digests, `history_*` tool results and usage-limit continuation progress. The agent then could not see or show an address that the user gave it. Add `redactSecrets`, which is `redactText` without the email rule, and an MCP gateway variant for the agent. Use them only on those agent-context paths. Logs, diagnostics, tool steps, tags and chat-app replies keep `redactText`. Fixes #5820 * Share the MCP secret values of both gateway redactions, and correct the redactSecrets comment | 1 day ago | |
Let the user give an agent more folders to work in (#3821) * Let the user give an agent more folders to work in An agent in Workspace only mode can now change files in folders that the user adds. The agent settings have a Folders row with a + and a Folders page. A folder dropped on the chat is added too. - Every provider gets the folders as writable roots, and the developer instructions name them. A change starts a new session. - Main checks each folder: it must be a real directory, and it cannot be a disk root, the OpenBot folder or the app data. The limit is 32. - A folder that the agent can already change is not added again. A missing folder shows Locate. - The folders stay on this computer. The Team API does not send them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Make agent folder changes safe when they occur together - Do one folder change at a time for each agent, so an Undo does not save over a remove. - Open only one folder picker at a time. - Refuse a folder in the OpenBot folder, which holds the workspaces of the other agents. - Tell the agent and its sandbox only about folders that exist. - Undo of an added folder gives back the folders that it replaced. - A dropped item with no path on this computer gets a refusal, not an error. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Give back the replaced folders on Undo after a chat folder drop Main now returns the folders that an added folder replaced. Undo adds them again. Before, the page found them from its own list, and the chat drop has no list, so Undo lost them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Send a dropped folder through addAgentFolder The drop endpoint did the same work as addAgentFolder, with no more protection. Remove it. The preload now adds the dropped path with addAgentFolder. The preload bundle check names the hand-written method. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Close the chat drop overlay after a folder drop on the settings panel The panel stops the drop, so the chat did not close its overlay. The chat now closes it in the capture phase of each drop. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Start a new Codex session when an agent folder appears or goes The instructions and the sandbox name only the folders that exist. The Codex fingerprint now hashes the same folders, so an ejected or connected drive gives the agent new instructions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Check agent folders without blocking the main process A synchronous stat of a stale network share stopped every window. The backend now checks the added folders with an async stat before a turn, a session, an agent process or a hosted site starts. The sandbox roots, the instructions and the process key read the result of that check. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Put the attachmentImports comment above its own group again Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 12 days ago | |
Gate unused exports and types in knip:check (#872) * Gate unused exports and types in knip:check Remove the export keyword from 200 exports and types that no code imports, and delete the code that becomes unused. The frozen Team API protocol files keep their full API, so knip does not check their exports. * Keep the exports of the generated plugin catalog The catalog generator writes these exports, and build-plugin-catalog.test.ts requires its exact output. knip now ignores unused exports in that file. * Remove a stale comment about frozen agent service types After knip removed the AgentClientFactory re-export, the comment named a frozen pair of types that no longer exists. | 1 month ago | |
Remove backend files from the exact optional types baseline (#2406) Make the backend code obey exactOptionalPropertyTypes in 20 more files. When a value is not present, the code omits the key with a conditional spread. It does not write undefined. A rollback deletes the key when the old value was not present. Private fields that always exist now have the type "T | undefined". The browser target schema uses Zod exactOptional for role.name, role.exact and text.exact. The JSON schema that the tools send does not change. The behavior, the SQLite schemas and the wire shapes do not change. The baseline goes from 159 files and 321 errors to 139 files and 240 errors. For src/backend, it goes from 24 files and 87 errors to 4 files and 6 errors. These files stay in the baseline: - conversation-snapshots.ts and mailbox-store.ts (2 sites): a merge uses an explicit undefined to clear a stored value. - local-mcp-bridge.ts and mcp-probe.ts: the MCP SDK transport classes do not match the SDK Transport interface. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 23 days ago | |
refactor: extract backend agent domains and mock sidebar helper (#206) * refactor(backend): extract agent-service helpers into domain modules * refactor(renderer): extract mock sidebar layout helper with tests | 2 months ago | |
Let agents ask with interactive UI blocks (#2400) * Let agents ask with interactive UI blocks An agent can call ask_ui to show a choice, a confirm, a form, or quick replies. The block is stored as a question prompt with fallback questions, so a released client can answer it. - Add the optional ui-blocks-v1 capability on Team API protocol 7. The host sends uiBlock only to a client that advertises it. Protocol 6 and the wire of released clients do not change. - Refuse a privileged action from a member, also as a free-text answer. - Do not store a secret form value. - Expire the block when the turn ends. - Add scripts/ui-blocks-e2e.ts (bun run test:ui-blocks). Co-authored-by: sysrootix <sysrootix@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Make the secret form value claims exact - Tell the agent not to repeat a secret form value in a message or a thought. - Say in the docs and the changelog that the stored block and the prompt resolution leave the value out, but the provider transcript and the agent's own reply or thinking can keep it. The smoke test showed that the model can repeat the value in its thinking. - Give the ui-block response kind its own expired prompt result. Co-authored-by: sysrootix <sysrootix@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Add the empty uiBlock catalogs for Italian and Polish The i18n check needs a uiBlock.ts file in each language folder. Co-authored-by: sysrootix <sysrootix@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: sysrootix <sysrootix@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 24 days ago | |
Keep each agent's rules in its workspace AGENTS.md (#4143) * Keep each agent's rules in its workspace AGENTS.md The agent settings show an Instructions editor for AGENTS.md at the root of the agent's workspace (CLAUDE.md when only that file exists). The old 2,000-character field is now Description, a short summary for teammates. It keeps its Team API meaning, so no migration is necessary. The developer instructions tell the agent to keep its standing rules in that file. OpenBot adds the file text only for a CLI that does not read the file by itself (workspaceInstructionFiles in the provider descriptor), and for Claude in workspace-only mode. The Codex tool fingerprint includes the file when the instructions carry it. An empty profile title or description now shows as empty, so an agent does not save "General assistant" as its title. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Refuse an instructions save when the agent changed the file - The editor sends the text that the edit started from. Main refuses the save when the file is different now, and the editor shows the agent's text. - A save keeps the file mode. Reads allocate only the size of the file. - The prompt redacts the file text and escapes a closing agent_instructions tag. - The Codex fingerprint includes the file text, so a changed AGENTS.md starts a new session. - The profile tools call the field a description; rules go in the instruction file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep the agent prompt within its byte budget - Name the instruction file in the sentence about the user's instruction files. - Remove the added sentences from update_profile and the description field. - Call the field a description in the profile tool guidance. - Lower the agent context baseline to the new counts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Let Codex read the whole instructions file Codex reads 32 KiB of AGENTS.md by default. A file that the editor saves in a non-Latin script can be up to 128,000 bytes, so the Codex thread config sets project_doc_max_bytes to that size. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Show instructions as a preview and the agent's changes in the chat - Agent settings show the instruction file as formatted text. Edit opens the whole file in a dialog that saves only on Save. When the agent changed the file during the edit, the dialog keeps the user's text and says so; a second Save replaces the agent's version. - When a turn changes the file, the chat shows "Updated its instructions" with View and Undo. Undo saves the text from before the turn only while the file still has the agent's text. - A save in one place updates the preview and each chat line of the same agent. - The developer instructions ask for short bullets under headings. - The iPhone agent edit screen labels the field Description. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Do not show a user's save at turn end as the agent's change A turn end that read the file during a user's save, or after the write and before the save was reported, recorded the user's text as the agent's change. Undo then reverted the user's save. The change baseline now knows the save in progress and counts the saves. A chat line read that ended after an Undo set the old text again and showed Undo again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Do not add the instructions text when the CLI reads the file through a link When CLAUDE.md is a link to AGENTS.md, or the reverse, Claude reads the file by itself. The prompt then also carried the same text, up to 32,000 characters. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Show agent instructions as a page with a file bar The Instructions row in the Knows group opens a page, like Memories. A bar names the file and its folder, with Show in Finder and Edit. The file shows as formatted text, and Edit opens the editor on the same page. View in the chat line opens this page. Main finds the file from the agent id to show it in Finder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Clear the instructions request when settings close Settings opened again on the Instructions page after one click on View. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 10 days ago | |
| 1 day ago | ||
Stop a queue loop that filled a server disk with chat updates (#5908) * Stop a queue loop that filled a server disk with chat updates A hosted server wrote 1.7 million `conversation.snapshot-updated` events (66 GB) in 22 hours. A Claude agent waited on a question in a turn that the CLI started itself. A routine turn in the same chat ended and set the chat to idle. The queue then asked the busy CLI for a turn again and again, and each try saved every queued message again in the chats of the agent and of each sender. - A turn end keeps another turn that still runs in the same chat active. - After `ProviderTurnActiveError`, the lane waits until the next drain of the agent, for example the end of any of its turns. - A change of a queue position alone is shown, but not saved. Each reader takes positions from the mailbox again. - A chat update that the next update replaces whole is removed from the event log. A replay of the log gives the same chat. Adds scripts/queue-restore-loop-e2e.ts and scripts/conversation-update-supersede-e2e.ts. * Fix the review findings of the queue loop change - A turn end clears the chat's active turn as before, except when that turn is another turn that still runs. It no longer takes a different running turn, so a turn that never ended cannot hold the chat. - A start is not held after `ProviderTurnActiveError` when a drain call arrived during the start: that call can be the end of the turn. - The activity row of an update has a key from its sequence, so the removal finds it by key and does not read the whole table. - An update goes only when its command id has the generated form, and when the later message has the same author and, with no delivery, the same time, as a replay keeps them. - A page read takes the queue positions from the mailbox, because a move of the queue alone is no longer saved. - The loop check waits for the hold that the drain logs, not for a time. * Do not save queue moves on page reads The page read compares stored messages with the mailbox. It counted a moved queue position as a change and saved every queued message again. Both checks now compare messages with no queue position, through one helper. A page read takes the positions from the mailbox. | 1 day ago | |
Show the MCP Sign in card when a server lists its tools without a sign-in (#6148) Some MCP servers, such as Kalshi's, list their tools to anyone and ask for a sign-in only when a private tool runs. The agent's test_mcp_server tests without a browser, so it reported "ready" with signedIn: false and showed no Sign in card. The private tools failed, and the user could not sign in from the chat. When test_mcp_server connects without a sign-in, it now also reads the server's public protected-resource metadata, with the same check that Sign in in Server settings uses. If the metadata names an authorization server, the result stays "ready" with the tools, and the Sign in card shows in the chat. A row with a token, a row with a key in a header, and a server without such metadata do not change. Tool search does not read the metadata, so a search does not get slower. Fixes #6081 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 17 hours ago | |
Show the MCP Sign in card when a server lists its tools without a sign-in (#6148) Some MCP servers, such as Kalshi's, list their tools to anyone and ask for a sign-in only when a private tool runs. The agent's test_mcp_server tests without a browser, so it reported "ready" with signedIn: false and showed no Sign in card. The private tools failed, and the user could not sign in from the chat. When test_mcp_server connects without a sign-in, it now also reads the server's public protected-resource metadata, with the same check that Sign in in Server settings uses. If the metadata names an authorization server, the result stays "ready" with the tools, and the Sign in card shows in the chat. A row with a token, a row with a key in a header, and a server without such metadata do not change. Tool search does not read the metadata, so a search does not get slower. Fixes #6081 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 17 hours ago | |
Review agent memories in the background (#3747) * Review agent memories in the background Agents now save lasting facts from their chats and side threads. A background review starts after a number of completed turns, after a pause, when the user clears a chat, and when a side thread closes. It runs on the provider's smaller default model when the agent's model costs more. Memory search now also finds other forms of a word. Server settings > General > Memory review sets the cadence: every 10, 20 or 40 turns, or Off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Raise the default memory limit per agent to 256 Background reviews add memories without a request. The old default of 64 fills fast with one fact per entry. Only essential memories enter each prompt, within their own budget, so a larger limit adds no prompt cost. A limit that the user set stays as it is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep the memory review from changing what it cannot see - A review cannot forget or change a memory that it sees only redacted. - A review cannot add the text of a saved memory again. This would change the inclusion that the user set. - When a user turn takes the spare client while the model list loads, the review waits and reads those turns later. It does not lose them. - A review does not read the turn that is active when it starts. It reads that turn after the turn ends. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Say in PRIVACY.md that a review can use the lower-priced default model Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove the exports that only the memory review uses Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Review memories on the agent's own provider account - The review client signs in to the agent's provider account, as the side question does. Before, it used the provider's default sign-in. - Make the memory search instruction and tool description shorter, so that the agent context stays in its byte budget. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Let an admin set the memory review of a joined server Add the memory-review-v1 Team API capability. An owner or admin of a joined, hosted or self-hosted server reads and sets how often its agents review their memories, or turns the reviews off. The setting row uses the scoped host-admin calls for this computer and for a joined server, in place of the unreleased app-level calls. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 12 days ago | |
Use less memory in tabs, provider processes and app windows (#5672) * Use less memory in tabs, provider processes and app windows - Keep only the 3 most recently used idle browser tabs loaded, and unload an idle tab after 15 min. - Release idle Claude, ACP, Pi and Codex sessions after 5 min, and keep one idle session loaded. - Stop the full process group of each provider CLI, so MCP server children do not stay. - Load only English and the shown language in each app window, not all 15 languages. - Keep fewer hidden side threads, chat images and long Markdown messages in the renderer. - Send the JavaScript heap of the app windows in the daily resource analytics. * Fix review findings in the memory changes - Wait for the saved language before the first render. - Do not stop ACP agents as a process group: some leave the user's servers in the agent's group. - Close other idle Pi threads in the background, so a failed close does not fail the turn. - Release idle threads once in each critical memory period, also when a release was in progress. - Forget the idle Codex sessions of a stopped client. - Share the lazy language catalog Vite plugin from packages/i18n. - Limit the Markdown lexer cache by characters, not by body size. * Do not export types that only their own file uses * Fix CI: type ratchet and the Antigravity MCP load failure test - Set `resumedSession` only when the session resumed, for exactOptionalPropertyTypes. - Only one idle ACP thread keeps its process, so the first thread can resume once more in the last turn of the Antigravity test. The two failed-turn resumes are still checked exactly. | 2 days ago | |
Send fewer repeated memory and turn context tokens (#5645) * Send fewer repeated prompt tokens to Claude and Codex agents - Channel packets give the saved channel memories again only when they change. A delta with the same memories says that the session has them. - A Claude runtime refresh keeps the turn context of a session that the next turn resumes. A session that ends still forgets it. - The memory review saves its cursor in memory-review-cursors.json in the user data folder. A missing, damaged or stale cursor reads the latest messages, as before. No schema change. - Add scripts/claude-turn-context-e2e.ts (in CI) and extend the channel context and memory review E2E scripts. * Load the memory review cursors before each change, and do not wait for the save at turn end - The read holds the write permit, so a second call waits for the read, and no write can replace the file first. - A removal before the first review loads the file first, so it also removes the saved entry of a deleted agent or thread. - A turn end in which the agent saved a memory starts the cursor save in the background, so the next delivery starts at once. - A write that started ends before a stop, so no temporary file stays. - Use one conversation key in both files. | 2 days ago | |
Let agents learn and revise skills from chats (#5945) * Let agents learn and revise skills from chats The background memory review can now find a skill in a chat. The server setting "Skill learning" sets what happens next: Automatic saves the skill, Ask first shows a skill card with Save in the chat, and Off does nothing. Save uses the background writer with no tools and no agent turn. The Team API capability skill-learning-v1 adds the setting routes, the Save route and the `skillSuggestion` key. Web and desktop clients copy the key back after the frozen codecs decode. A skill description with a colon now saves, because the library quotes the frontmatter value. * Fix the review findings of the skill learning change - A skill card for a new skill shows Saved only for a skill with its name, or for the skill that the agent made in answer to the card. - A second Save does not write the skill again while its line waits for the running turn, or when the line could not be added. - A skill name with no Latin letter gets a slug from its hash. - One frontmatter pattern for the skill package, library and learner. * Keep the skill revision text inside the agent context budget Show the in-turn skill revision line only when skill learning is Automatic. Remove the revise_skill guidance and shorten the skill tool descriptions. Remove the unused skill suggestion bench script. * Show the skill revision line only when skill learning is Automatic The line, the revise_skill guidance and the longer skill tool descriptions went over the agent context budget. Ask first and Off now leave the line out, so the agent changes a skill only when the user asks. * Reload the agent sessions when skill learning moves into or out of Automatic The skill revision line is in the instructions only with Automatic. A loaded session kept the old line until it unloaded, so an agent could still revise a skill after the user chose Ask first or Off. | 23 hours ago | |
Let agents learn and revise skills from chats (#5945) * Let agents learn and revise skills from chats The background memory review can now find a skill in a chat. The server setting "Skill learning" sets what happens next: Automatic saves the skill, Ask first shows a skill card with Save in the chat, and Off does nothing. Save uses the background writer with no tools and no agent turn. The Team API capability skill-learning-v1 adds the setting routes, the Save route and the `skillSuggestion` key. Web and desktop clients copy the key back after the frozen codecs decode. A skill description with a colon now saves, because the library quotes the frontmatter value. * Fix the review findings of the skill learning change - A skill card for a new skill shows Saved only for a skill with its name, or for the skill that the agent made in answer to the card. - A second Save does not write the skill again while its line waits for the running turn, or when the line could not be added. - A skill name with no Latin letter gets a slug from its hash. - One frontmatter pattern for the skill package, library and learner. * Keep the skill revision text inside the agent context budget Show the in-turn skill revision line only when skill learning is Automatic. Remove the revise_skill guidance and shorten the skill tool descriptions. Remove the unused skill suggestion bench script. * Show the skill revision line only when skill learning is Automatic The line, the revise_skill guidance and the longer skill tool descriptions went over the agent context budget. Ask first and Off now leave the line out, so the agent changes a skill only when the user asks. * Reload the agent sessions when skill learning moves into or out of Automatic The skill revision line is in the instructions only with Automatic. A loaded session kept the old line until it unloaded, so an agent could still revise a skill after the user chose Ask first or Off. | 23 hours ago | |
Send fewer tool and prompt tokens in each Claude and Codex request (#5642) * Send fewer tool and prompt tokens in each Claude and Codex request - Show the model only the schema keywords that it needs. The router still decodes each call with the full schema. - Give the Claude SDK the advertised JSON Schema of each OpenBot tool. - Make OpenBot tool descriptions, tool guidance and reply protocol text shorter. - Use compact JSON in prompt blocks. - Add scripts/agent-tool-tokens-bench.ts. It writes .openbot-build/agent-tool-tokens-bench/report.json. * Describe the avatar seed format for the model The advertised schema no longer has the pattern, so the description gives the rule. | 2 days ago | |
Let users delete chat and channel messages (#4798) * Let users delete chat and channel messages Right-click a message and select Delete. A dialog asks for confirmation. The message leaves the chat view, the history, and the attachments of the chat. The agent can still remember it. - Agent chats and side task threads: tombstone table (migration 54). - Channels: tombstone row in the channel projection. - Remote servers: Team API capability message-delete-v1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix review findings in message delete - Read the current chat after the mailbox step, so the delete keeps the active turn that started during the wait and publishes an evicted chat. - Keep deleted teammate messages in the copy map, so their provider copy leaves the chat. - Refuse to delete a message of a running channel task. - Say in the channel store comment that a summary keeps its text. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove exports that no other module uses Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 6 days ago | |
Make a hosted server ready sooner after a wake (#5386) * Make a hosted server ready sooner after a wake A hosted server that wakes from an archive gets its disk back over the network. The first read of each file waits for that file. - Run OpenBot from its AppImage file, mounted at /run/openbot-app, not from more than 1,000 unpacked files. The host restores one file. openbot-hosted-update changes a server from an older release at its next update check. - Start the host connection first: load the bridge window while the account server answers, and request the member list and the Signal ticket at the same time. - While a hosted server starts, the client attempt waits on Signal for the host, so it connects when the host publishes. - While the disk is restored, give provider checks a longer limit, and start update checks after the restore ends. - Prefetch only small files and the database of ~/.config/OpenBot. - Leave dependency source maps out of the package. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Leave the npm cache out of hosted server snapshots openbot-hosted-update writes /home/user/.boatignore with the npm cache, next to the boat pre-stop hook. A file that OpenBot did not write stays. Files that an earlier snapshot saved stay, because each save keeps only what changed. A comment above mount_release says why root reads the AppImage first: when the service user read it first, boat put it 15th in the playbook and the start was about 10 s slower. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Correct the npm cache release note A test box did not restore the old npm cache after its second wake with the ignore rule. The first wake still restored it. The note and the earlier commit message said that an existing server keeps its old cache; it does not. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Run the hosted server from the unpacked release again A bench on boat showed that the AppImage layout made a cold wake slower: 84 s and 107 s to ready, against 32 s for main. The mount before the start took about 21 s, because the first read of the AppImage waits while boat restores the whole file. Keep the other wake fixes: the npm cache exclusion, the profile read-ahead, the keyring wait, the display poll and the stop fix. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Let the boat playbook order the first reads of a wake The profile prefetch read boat's internal restore markers and did the job that the boat playbook does: boat records the files a wake opens first and downloads them first at the next wake. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep agent CLIs out of hosted servers until the user asks The boat image has commands for Hermes, Cursor, OpenClaw and Vibe that install the CLI the first time they run. OpenBot runs each provider command when it starts, so each hosted server installed about 3 GB of CLIs, and each wake restored them. Remove these placeholders when the hosting files are installed; OpenBot downloads the CLIs on request. Also use the keyring start and the display wait of main again. They gave no measured gain, and the branch restarted on 2 of 4 wakes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Read only the first two lines of a boat command The placeholder check runs before each OpenBot start. A full read of an installed CLI binary would wait for its restore during a wake. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 3 days ago | |
| 6 days ago | ||
Tell the agent why list_models has no models for a provider (#6116) list_models left out a provider that was on but had no models, and gave no reason. For Hermes Agent without its Nous Portal sign-in, the agent got {"providers":[]} and could not tell the user to sign in. list_models now adds unavailableProviders: each provider that is on, has no listed model, and is in the sign-in-required, outdated or error state, with the message of its settings row and where to fix it (Server settings > Providers). Providers that are off or not installed stay out. The tool description does not change, so the agent context budget holds. Fixes #6053 | 18 hours ago | |
Show the provider reason when a Muse or ChatGPT sign-in fails (#5735) * Show the provider reason when a Muse or ChatGPT sign-in fails Muse and Codex send a reason with a failed sign-in, such as a Meta account that has no payment method (#5544). OpenBot dropped it and showed only "Try again". Show the reason, redacted and short, in the existing sign-in failure text. Without a reason, keep the old text. Move the redact-and-shorten step of the Gemini sign-in to a shared helper, and add a stand-in E2E check for Muse. * Keep a granted Muse sign-in when its message has an unknown type Decode the outcome and the message of account/loginCompleted separately. A message that is not a string no longer turns a granted sign-in into a failure. | 2 days ago | |
Add a server on another computer with one command (#6174) * Add a server on another computer with one command The add server menu has "New server on another computer". The dialog shows a one-time command that installs OpenBot on a Linux computer or VPS and signs it in to the account. The command works once, for 15 minutes. An agent in a chat can also install OpenBot on a server over SSH. The user approves the command, and a card in the chat shows when the server connects. The claim goes to bash on standard input, not as an argument or a sudo variable, because sudo logs both. * Fix the review findings of the server install - Offer "Set up with an agent" only on this computer or a server that the user owns. - Refuse the install tool before the approval card when the owner is not signed in. - Find the server of a card that showed after the server signed in, by its name. - Do not say Copied when the clipboard refuses the text. - Stop the install before the download on a server that is signed in. - Remove a stale note about the claim in the process arguments. * Import the server install watch type by name, so that knip sees its use * Match the install card's server only by the command's name When the command gives a name, another new server does not show in the card. The card records the known servers only after the server list loads. * Keep the server install tool inside the agent context budget Remove the tool's line from the developer instructions and shorten its texts. The catalog and the visible tool list still grow by the new tool, so their baseline grows by the measured bytes. | 17 hours ago | |
Stop and continue a Codex turn whose compaction loses the connection (#5914) * Stop and continue a Codex turn whose compaction loses the connection Codex waits with no end for a connection that stops answering during its own compaction inside a turn. The turn showed "Compacting context" until the user stopped it, and the task was lost. A refused connection ended the task with Codex's raw "Error running remote compact task" text. - A compaction that Codex starts inside a turn now has the compaction run deadline (20 min). At the deadline OpenBot sends turn/interrupt. - A turn that such a compaction ended (connection error, or the deadline) continues once with a short note, as a plan continuation does. The user message is not sent again. - A second failure in the same request shows a plain message. Fixes #5822 * Keep failover, one banner and a user Stop for a failed compaction - A turn that did no work yet still moves to a backup model when its compaction fails on the connection. - Show one banner when a failover error is also held. - A Stop from the user after the deadline stays a Stop, not a failure. - Only a connection failure or a timeout continues the turn. A server error keeps the provider's text. - When the deadline cannot stop a hung process and the process ends, show the plain error. - A continuation after a failed compaction keeps the no-progress check of the plan. * Keep the plan state of a request when a failed compaction continues it A continuation after a failed compaction now takes the plan of the failed turn and the open steps from before the request, as a plan continuation does. Correct the comment on the compaction deadline stop. | 23 hours ago | |
Show agent plans as task lists, and show teammate replies in a waiting block (#960) * Show agent plans as task lists, and show teammate replies in a waiting block An agent's plan was lost, and an agent that asked teammates showed nothing until the answers came. The answers then showed in the queue like the person's own messages, with Steer and Edit. - Each turn with a plan shows one task list in the chat. It updates in place and stays in history. Codex update_plan, Claude TodoWrite and TaskCreate/TaskUpdate, and ACP plans all feed it. The plan is saved in the message JSON, so there is no migration. - Codex gets tools.update_plan. The Claude CLI gets CLAUDE_CODE_ENABLE_TODO_TOOLS, because without a terminal it gives the newer models no plan tool. - A "Waiting for replies" block above the composer lists each teammate that the agent asked, and the child tasks of a waiting channel task. Each row shows asked, working, replied or failed. The answers leave the queue panel. - A plan is never the preview, the unread count or the result that goes back to a teammate. - Peers and mobile get the plan as checklist text. The Team API wire does not change. * Leave plans out of the unread counts, and fix four review findings - The agent and channel unread counts in the backend leave out plan rows, as the renderer does. The channel divider walk skips plans too. - The activity line skips the plan row, which streams for the whole turn, so it still shows the latest commentary. - A paused channel sub-task does not show as failed in the waiting block. It shows in the stopped tasks with Resume. - A new Claude turn drops the finished tasks of earlier turns. A TaskUpdate with a subject for an unknown task, after a runtime release, adds it again. - Remove two unused exports (knip) and the unused chat.taskList.state.failed key. * Remove a turn's plan when the agent deletes its last task An empty plan update was dropped, so the old list stayed in the transcript. Now it removes the plan message of the running turn. * Accept a missing value in the optional task list and avatar props The type ratchet found new exactOptionalPropertyTypes errors in the task list, the waiting block, and their callers. * Lower the type baseline for the avatar callers that no longer fail | 1 month ago | |
Let a custom endpoint run on Pi (#4031) * Let a custom endpoint run on Pi Add a "Runs on" field (OpenCode or Pi) to each custom endpoint. An endpoint on Pi registers through a Pi extension. The key and the headers go through an environment variable and are not in the extension file. Endpoints saved before keep running on OpenCode. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Exclude an endpoint only on the harnesses that restart A change to an endpoint excluded its id on OpenCode and on Pi. Only the harness that runs it, and the one it moves to, restart and give the exclusion back. Thus Pi models of a built-in provider with the same id stayed hidden, and a removal moved Pi agents off them. When an endpoint moves to a harness that is not running, start that harness if agents wait for it. Before, the agents stayed on the old harness, which no longer lists the endpoint. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Move only the agents of an endpoint that changes harness An endpoint id can also name a provider of the harness's own, such as `openai`. The move found the agents by the model prefix only, so an agent on a built-in `openai/...` model could move to the other harness. Now an edit records the agents on the endpoint when it changes harness, and only those agents move. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * List only the usable harnesses in "Runs on" As the default provider select does: the list shows the harnesses that can run the endpoint now and the saved one, so it stays one control for any number of harnesses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Download a harness from "Runs on" A harness that is not downloaded now shows in "Runs on" with a Download button. A choice of it selects it and starts the download. The field shows the progress, and a failed download shows Retry and the error. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Send the harness of each custom endpoint to a joined server Add the custom-provider-harness-v1 Team API capability. Its list, save and delete routes are the providers-v1 custom endpoint routes, and each endpoint in a response also names its harness: opencode or pi. A save names no harness, so a peer still adds an endpoint on OpenCode. The desktop and web clients use these routes when the host advertises the capability, and the released routes for an older host. Before, a peer took each endpoint as an OpenCode endpoint, so it showed the models of an endpoint on Pi in the wrong place. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Move waiting agents off an endpoint when its new harness does not start When an endpoint moves to a harness that does not start, the agents that wait for the move now move to a model that their harness lists. Before, they stayed on a model that no harness listed, and each turn failed. When the user removes an endpoint while its agents wait to move to it, those agents now also move to a listed model. Before, only the harness of the endpoint restarted, so they stayed on a model that was gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Move only the agents whose move to a harness stopped When a harness does not start, OpenBot now moves only the agents that waited for it, and it does this after an endpoint change that runs. An edit that moves the endpoint back during that time keeps the agents on their model. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 10 days ago | |
Migrate service runtimes to Effect 4.0.0 (#1283) * refactor: migrate service runtimes to Effect 4 * refactor: make Effect the canonical service runtime * fix: preserve typed Effect failures and align CI test boundaries * test: await Effect test boundaries and lower lint baseline * fix: handle early provider exit and retain remote send errors * Simplify Effect composition and failure handling * Fix review findings in hosted sites, updates and WebRTC requests - Release a hosted-site idempotency claim on any failure, defects included. - Keep update downloads running after stop(), as before the migration. - Clean up a pending WebRTC request when the send is interrupted. - Compose the account switch in one Effect, without nested runPromise. - Remove single-effect generators in the WebRTC client transport. - Put the atomic-write JSDoc on writeFileAtomically; reuse writeJsonFileAtomically. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Run Effects at Promise boundaries through one runCauseEffect Replace the inline Effect.runPromise(x.pipe(Effect.mapError((error) => error.cause))) calls and the per-domain runners (runBrowserEffect, runMcpEffect, runArchiveEffect, runRemoteWorkflow, runDesktopEffect, runProviderClientEffect, runTestEffect) with runCauseEffect in src/backend/effect-boundary.ts. Behavior is unchanged: expected failures reject with their cause, and defects and interruption reject as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Mark concurrent test starts as not awaited runCauseEffect returns a Promise, so Biome now finds the operations that these tests start and do not wait for. Mark each with void. The start stays concurrent, and a rejection still fails the run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Send CentralAuth requests through the network-block detector The merge of main wrapped the options fetch, but CentralAuth sends its requests through the Effect transport. Build the transport from the wrapped fetch, and run the new test through Effect. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Run each account API entry point as one Effect Route handlers, the browser API, the Worker pre-routing and the cron now run one Effect each. Request body readers, the SMTP socket close and the remaining R2 and D1 calls are Effects. The skill icon read is now part of its Effect; before, the Effect returned a Promise. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Run the remaining service runtime in Effect Main: the automation server, Team API server start and stop, duplicate requests, Dynamic Island, the Computer Use highlight, trace flushes, update background work, sibling scans, upload slots, server mode, window bounds, attachment archives and uploads, and remote transport callbacks are Effects forked into their owner's scope. Backend: usage limit hooks and the channel requeue are Effects. Team client: request frames, Signal notices and connection failures run in the peer's work scope, and recovery loops inside its run. Site router: one Effect per request. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Run the picture-in-picture and permission help windows in Effect Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove the unused analytics runner The trace file forks its flush into its own scope now, so nothing calls runAnalytics. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep cron jobs, session ends and host starts complete after a failure - The cron waits for every job before it reports the first failure, so a failed delivery does not stop retention or a site cleanup midway. - A connection failure ends the logical session in an uninterruptible fork, so dispose does not stop it. - A dependency that throws while the Team API listener starts fails the start, so the host stops the listener. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 1 month ago | |
Send fewer prompt tokens to Codex, and add web search for agents with no search of their own (#5658) * Send fewer prompt tokens to Codex, and add openbot.web_search Codex threads now start with features.tool_suggest off, five unfit system skills off, and, for toolless threads, agents and sleep off. A key in the user's config.toml stays as the user set it. This removes about 1,050 tokens from each Codex request. Add the deferred openbot.web_search tool. A separate Codex session on the Codex sign-in of this computer runs the search and returns a short answer with source URLs. Only agents whose CLI has no web search of its own get the tool: Pi, Inception, DeepSeek, OpenRouter and custom ACP agents. Codex, Claude and the other CLIs keep their own search. Add smoke:codex-agent, bench:codex-prompt-settings and bench:codex-web-search. * Stop a web search on Stop, and keep the user's skill entries - Race openbot.web_search against the request's abort signal, as the browser tools do. Stop now ends the side Codex process. - A web search leaves one generation slot for the user's own work, and checks shutdown and free slots again after Codex starts. - Log why Codex was not ready for a web search. - A [[skills.config]] entry by path also names its skill, so OpenBot does not turn off a skill that the user turned on by path. Keep each user entry as it is. * Use one usage observer for side sessions, and remove an unused type Memory reviews and web searches now use sideSessionUsageObserver with a kind. Remove the CodexSkillConfig type, which knip reports as unused. * Set the expected answer only when the bench question has one This removes an exactOptionalPropertyTypes error that types:ratchet reports in codex-web-search-bench.ts. | 2 days ago | |
Add OpenBot as a co-author of agent git commits (#5981) * Add OpenBot as a co-author of agent git commits Agents end each git commit message that they write with "Co-authored-by: OpenBot <335604065+openbotgit[bot]@users.noreply.github.com>". The address is the GitHub noreply address of the openbotgit[bot] account. The setting is on by default. Settings > Agents > "Credit OpenBot in commits" turns it off for all agents. A change reloads the agent sessions. Claude keeps no co-author line of its own (empty attribution). The developer instructions grow by 134 bytes, so the agent-context budget increases by the same amount. Fixes #5954 * Keep the OpenBot trailer when the user gives the commit message A Claude Haiku agent left out the trailer when the user gave the exact git commit command, because the rule named only messages that the agent writes. The rule now covers each commit that the agent creates or amends. Refs #5954 * Name the release note after the branch * Correct the comment about the Claude co-author line | 21 hours ago | |
Send fewer tool and prompt tokens in each Claude and Codex request (#5642) * Send fewer tool and prompt tokens in each Claude and Codex request - Show the model only the schema keywords that it needs. The router still decodes each call with the full schema. - Give the Claude SDK the advertised JSON Schema of each OpenBot tool. - Make OpenBot tool descriptions, tool guidance and reply protocol text shorter. - Use compact JSON in prompt blocks. - Add scripts/agent-tool-tokens-bench.ts. It writes .openbot-build/agent-tool-tokens-bench/report.json. * Describe the avatar seed format for the model The advertised schema no longer has the pattern, so the description gives the rule. | 2 days ago | |
Close a pending question when the user writes in the same chat (#5753) * Close a pending question when the user writes in the same chat An agent turn that waits on an ask_user question or an ask_ui block read no new chat message until the card was answered, and a queued message started only when the turn ended. So the agent did not reply. A user message to a chat or task with an active turn now closes that turn's open questions and UI blocks there as skipped, as the user's own Skip does. The agent gets a note to follow the new message. Approvals, MCP elicitations, browser takeovers and forms that save a key or a Vault item stay open. Fixes #5746 * Share one close path for expired and skipped prompts | 2 days ago | |
Add an Anthropic API key for Claude and fix agent cache and usage counts (#3071) * Add an Anthropic API key for Claude and fix agent cache and usage counts - Claude: a saved Anthropic API key starts each Claude process with ANTHROPIC_API_KEY. Claude Code uses it before a claude.ai sign-in. An account after the first does not get the key. Local and joined servers show the key when the host advertises claude-api-key-v1 (a marker capability with no routes; the providers-v1 key routes save the key). - A custom provider on api.anthropic.com now uses the @ai-sdk/anthropic adapter, so OpenCode sends cache_control breakpoints. Anthropic's OpenAI-compatible endpoint does not cache. - OpenCode usage: each prompt is its own counter, and inputTokens is the uncached input. A missing cache or thinking field is 0. - Provider download failures send a failure code from the catalog key, not "unknown". E2E: claude-api-key, opencode-anthropic-cache (needs the OpenCode binary), opencode-usage-metering. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Release usage limit holds when a provider key changes A saved or removed key replaces the credential of the provider's own sign-in. A usage limit of the old credential held the agents until its reset. Now the credential change ends those holds. Claude's Sign in on an older joined host does not open the key dialog, because that host does not read the key. The Codex usage reset e2e has a case for the credential change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep the provider key object across server-list updates The key object read the active server, and each server-list update gives new server objects. So each update cleared the key badges and read the key status again. A boolean memo now holds the Claude key capability, and it notifies only when the value changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove the unused Claude apiKeyInUse flag Nothing read apiKeyInUse for Claude: the key card reads the key status. The flag is Gemini only again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Let each agent choose between the Claude plan and the API key A saved Anthropic key is now its own Claude account, "API key", with a fixed id that all released account checks accept. Select it in an agent's model menu to bill that agent to the key; the other agents keep the Claude plan. When Claude has no sign-in, the own sign-in uses the key, so all agents work with no change. Removing the key removes the account and moves its agents back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep Claude plan holds when the key does not serve the own sign-in A claude.ai login does not use the saved key, so a key change no longer releases the usage-limit holds of that plan. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove the Claude key account before the key is cleared The idle check of the key account now runs before the key is deleted. When an agent on the account has work, the request fails and the key stays, so no agent stays on the account without its key. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Refuse a Claude key removal while Claude is busy, before the account goes The key change refuses while a Claude turn runs. That check now also runs before the key account is removed, so a busy refusal keeps both the key and its account. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 16 days ago | |
Wait for a slow start in the check of each provider account (#5936) * Keep provider accounts signed in when their check starts slowly The check of each extra provider account started a new CLI process with only the 30 s request timeout, and all checks started together. On a busy computer, each check timed out. The account then showed "Sign in again", and that action signed out a token that still worked. Give each account check the long start wait that the check after a sign-in already gets. When a check of a connected account still times out, keep the account connected: a slow start says nothing about the sign-in. Fixes #5927 * Show a timed-out check of a connected account as a failure again A timed-out check of a connected account kept the account connected. That can hide a real failure: a token refresh that hangs, or a wrong new key. The long start wait alone fixes the slow checks of #5927. | 1 day ago | |
Show a provider's MCP server failure as that server's, with a link to MCP settings (#5451) * Show a provider's MCP server failure as the server's, with a link to MCP settings When a provider cannot use an MCP server from OpenBot's list, the toast now names the server under "MCP server not started" and has an "Open MCP settings" button. A server that asks for a sign-in (Grok's `AuthRequired`) tells the user to sign in. The provider row keeps no error, because the provider works without the server. The server is now found by its URL host as well as its name. Grok's `rmcp` line quotes only the OAuth metadata URL, so a server whose name was not in that line went to the log and the user saw nothing. Each server and kind shows once per run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Match MCP failures more strictly and keep built-in servers on the old path - A failed MCP tool call that names its server is not a server that did not start. It goes to the log, as before. - A server name must be a whole word: `git` is not in `github`. - Two servers on one host: the longest path that matches wins. - The built-in GitHub and Computer Use servers are not in the MCP settings. Their failure stays a provider error, as before. - The whole line is read for the URL, before it is shortened. - A bare `401`, such as a port, is not a sign-in request. - The "Open MCP settings" button shows only to a user who can manage the server's MCP settings. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Match an MCP server's host only as a whole URL authority `example.com` no longer matches inside `mcp.example.com`, and `localhost:3000` no longer matches inside `localhost:30001`. A server from the user's own CLI files on such a host goes to the log, as intended. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 3 days ago | |
Add fast mode for Claude agents (#6261) * Add fast mode for Claude agents Claude agents can use fast mode from the model picker when Claude Code reports that the model supports it. The turn sets the fastMode flag setting of the claude process. Before fast mode turns on for a Claude agent, a dialog asks the user to confirm the higher price. When Claude Code runs a turn at the standard speed, the chat shows the reason once. * Turn off fast mode on a provider change A provider change sets fastMode to false, so a Codex agent with fast mode does not use Claude fast mode without the price confirmation. The first Claude turn of a process also sends fast mode off, because a Claude settings file can start the process in fast mode. A pending confirmation ends when a different agent opens. The chat warning is marked as sent only when it was sent. The release notes file now has the branch name. * Turn off fast mode one time for Claude agents Before this release only Codex read fastMode. A Claude agent has the value true only from a provider change, and the user never confirmed the Claude price for it. At the first start of this release, the agent store sets fastMode to false for each Claude agent. The receipt of the command is the marker that stops a second run. * Add the fast mode resets to the release note * Keep fast mode across a backup model, and hide Claude fast mode from members | 14 hours ago | |
Wait for a slow start in the check of each provider account (#5936) * Keep provider accounts signed in when their check starts slowly The check of each extra provider account started a new CLI process with only the 30 s request timeout, and all checks started together. On a busy computer, each check timed out. The account then showed "Sign in again", and that action signed out a token that still worked. Give each account check the long start wait that the check after a sign-in already gets. When a check of a connected account still times out, keep the account connected: a slow start says nothing about the sign-in. Fixes #5927 * Show a timed-out check of a connected account as a failure again A timed-out check of a connected account kept the account connected. That can hide a real failure: a token refresh that hangs, or a wrong new key. The long start wait alone fixes the slow checks of #5927. | 1 day ago | |
Start provider CLIs with the login shell PATH (#2713) * Start provider CLIs with the login shell PATH An app that Finder, the Dock, or a login item starts has a short PATH. An npm Codex is a `#!/usr/bin/env node` script, so `codex --version` and the app server failed with exit code 127, and OpenBot reported that Codex was not found or could not start. - Move the cached login-shell PATH (loginSearchPath) and agentLaunchPath to cli.ts, and use them for CLI lookup instead of `command -v`. - Run the version probe with the CLI's launch PATH, and keep it in the CLI info (launchPath). The Codex app server, sign-in and sign-out, Muse, Pi and ACP processes start with it. - On macOS, use $SHELL when it is a known shell, not always zsh. - Search ~/.npm-global/bin, ~/.volta/bin, ~/.bun/bin and the pnpm home. - Keep the resolver's catalog message in the provider status, and say whether the managed copy or the user's copy of Codex or Claude did not start. Error codes and states do not change. - On Windows, pick a `where` result that PATHEXT can run. Add the test:codex:login-path E2E script. Fixes #2686 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep the CLI folder on PATH for Claude sessions and xterm sign-in - Claude sessions start with the CLI's launch PATH, so a system Claude found in a fallback folder keeps its own folder, as in the version check. - The Pi sign-in in xterm on Linux gets the launch PATH. - A folder with the CLI's name is not a CLI: lookup now checks for a file. - Run test:codex:login-path in CI. - Do not export loginShellCommand. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 19 days ago | |
Show a steered message in its side thread at once (#5300) * Show a steered message in its side thread at once A side thread reads no mailbox copies, so the steer path, which only syncs mailbox messages, never added the steered message to the live thread. The message reached the provider but showed only after a restart. The steer path now adds it to a side thread at the steer time, with the same message shape that the drain uses for a message that starts a turn. Fixes #5263 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Build the steered thread message as provider history does A restart rebuilds a side thread from provider history with promptMessage, which keeps the queue time of the delivery. The live message now uses the same builder, so it keeps its place after a restart. This removes the new helper and the drain change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 4 days ago | |
Show how to fix a zero real-time limit when Linux stops a provider (#5180) On Linux, show the rtkit and xdg-desktop-portal fix when a zero RLIMIT_RTTIME makes the system stop a provider. Keep the downloaded copy, skip updates while the limit stays at 0, and keep the fix text after OpenBot stops starting the provider. Refs #4848 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 4 days ago | |
Let an agent mark its routine run failed (#2893) * Let an agent mark its routine run failed (#2804) Add the OpenBot tool `routine_report_failure` with one `reason` argument. In a routine run, the call keeps the queue delivery `completed` and writes the redacted reason to its `error`. The run then goes from `running` to `failed` with that reason, and later reconciles keep it failed. No migration. - A failed run is never quiet, also after `routine_no_update`. - A provider error or an interrupt still wins. - In a flow, the owner step or the linked step fails, and the agents after it are skipped. A linked step does not change the owner's run. - A result destination gets the answer of a reported failure. - The run history shows the reason of a failed run. - Every routine prompt names the tool, the Test run too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep a reported routine failure out of quiet runs - A `routine_no_update` call after `routine_report_failure` answers `shown`, so the agent still writes its answer. - The provider history import keeps the answers of a turn whose routine delivery completed with an error. - The run history row gives the failure reason to screen readers. - Correct two comments that said only succeeded runs get a result. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 18 days ago | |
Run agent routines in the main chat again, with a switch for a separate thread (#5156) * Run agent routines in the main chat again, with a switch for a separate thread Since 0.61.0 each agent routine ran in its own thread, so a routine that must report back hid its report from the main chat. Agent routines now run in the main chat again. A new "Run in a separate thread" switch moves one routine to its own thread. - Migration adds projection_agent_routines.run_in ('chat' or 'thread'). All saved routines get 'chat'. - The scheduler, the digest and the "Open thread" link use the routine thread only for 'thread' routines. - The switch shows only on the local host. The Team API does not carry the field, so a save from a remote client keeps the saved value. - The create and update routine tools accept runIn. Fixes #5073 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Use the run place of each routine run in all routine paths - Give the routine thread the reply digest only when the run ran in that thread. - Read the routine record one time for each run. - Let the webhook routine tools set `runIn`. - Find webhook routines too when the chat decides on the "Open thread" link. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fit the routine run place to the agent context budget and the routine E2E tests The runIn text in the four routine tool schemas is shorter. The schema baseline goes up by 588 bytes, for one optional field in four tools. The routine session and routine failure report E2E tests check runs in a routine thread, so their routines now set runIn to thread. The routine session test also checks that a routine with no run place answers in the chat and gets no thread. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 5 days ago | |
Run agent routines in the main chat again, with a switch for a separate thread (#5156) * Run agent routines in the main chat again, with a switch for a separate thread Since 0.61.0 each agent routine ran in its own thread, so a routine that must report back hid its report from the main chat. Agent routines now run in the main chat again. A new "Run in a separate thread" switch moves one routine to its own thread. - Migration adds projection_agent_routines.run_in ('chat' or 'thread'). All saved routines get 'chat'. - The scheduler, the digest and the "Open thread" link use the routine thread only for 'thread' routines. - The switch shows only on the local host. The Team API does not carry the field, so a save from a remote client keeps the saved value. - The create and update routine tools accept runIn. Fixes #5073 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Use the run place of each routine run in all routine paths - Give the routine thread the reply digest only when the run ran in that thread. - Read the routine record one time for each run. - Let the webhook routine tools set `runIn`. - Find webhook routines too when the chat decides on the "Open thread" link. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fit the routine run place to the agent context budget and the routine E2E tests The runIn text in the four routine tool schemas is shorter. The schema baseline goes up by 588 bytes, for one optional field in four tools. The routine session and routine failure report E2E tests check runs in a routine thread, so their routines now set runIn to thread. The routine session test also checks that a routine with no run place answers in the chat and gets no thread. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 5 days ago | |
Show a backup model that a provider error holds as not available (#5806) A provider error holds its model and account for all agents, for 10 minutes or until the reset that the error names. The switch to a backup model passes over a held model, but the runtime snapshot sent only usage limits. So the backup models list showed the held model as ready, and the switch went to the next backup with no message. The usage-limit gate now sends its provider-error holds in the runtime snapshot as `failedModels`, and sends a snapshot when a hold starts or ends. The backup models page of a local agent shows a held saved backup as "Not available now · skipped". The "Add backup model" list, the usage-limit ask card and the switch itself do not change. Released Team API snapshots project a fixed key list, so the new field stays local. Fixes #5802 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 1 day ago | |
Let agents capture the screen after the user approves each capture (#2052) * Add screen capture for agents Agents can capture one display, one window, or an area of a display with capture_screen. They get the display and window ids from list_capture_sources. The user approves each capture first. The image shows in the conversation and goes to the model. The Computer Use switch of the agent turns the tools on or off. On macOS, the app checks the Screen Recording permission before each capture and tells the agent how to grant it. Closes #1968 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ask macOS for Screen Recording on a denied grant, and bound window thumbnails Chromium reads a Screen Recording grant that was never asked for as denied. The first refusal in a process now makes one probe capture, so macOS shows its prompt. A window capture now draws each window thumbnail at most at the bounded capture size, not at the size of the largest display. The approval step gives the real capture failure, and the main process logs the cause of a failed capture. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove screen capture exports that nothing imports Knip failed the Check job on four unused exports. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep screen captures out of shared threads, and draw windows at a small size A Slack, Discord or Telegram link sends each agent attachment of the turn to the platform, and a channel shares its conversation. capture_screen and list_capture_sources now refuse in those threads. desktopCapturer draws every open window at the thumbnail size to return one window. The window box is now 1920x1920, not up to 4.2 MP. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Save screen captures and HTML pages through one helper html_render and capture_screen both stage a generated file, add its message, and save the two together with the same rollback. They now use one helper, so a fix to the rollback reaches both. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Type the generated message item type as a string The helper took ConversationMessage["itemType"], which includes undefined, and the exactOptionalPropertyTypes ratchet failed. Both callers give a string. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 27 days ago | |
Refactor ACP and add native Pi and Muse providers (#1715) * Refactor ACP and add native Pi and Muse providers * Fix provider secrets, usage, and live settings updates * Name each provider setting reset action * Allow retry when provider settings are not ready * Remove unused provider exports and declare the Linux terminal * Fix provider redaction, v7 creation, and saved ACP settings | 1 month ago | |
Let agents learn and revise skills from chats (#5945) * Let agents learn and revise skills from chats The background memory review can now find a skill in a chat. The server setting "Skill learning" sets what happens next: Automatic saves the skill, Ask first shows a skill card with Save in the chat, and Off does nothing. Save uses the background writer with no tools and no agent turn. The Team API capability skill-learning-v1 adds the setting routes, the Save route and the `skillSuggestion` key. Web and desktop clients copy the key back after the frozen codecs decode. A skill description with a colon now saves, because the library quotes the frontmatter value. * Fix the review findings of the skill learning change - A skill card for a new skill shows Saved only for a skill with its name, or for the skill that the agent made in answer to the card. - A second Save does not write the skill again while its line waits for the running turn, or when the line could not be added. - A skill name with no Latin letter gets a slug from its hash. - One frontmatter pattern for the skill package, library and learner. * Keep the skill revision text inside the agent context budget Show the in-turn skill revision line only when skill learning is Automatic. Remove the revise_skill guidance and shorten the skill tool descriptions. Remove the unused skill suggestion bench script. * Show the skill revision line only when skill learning is Automatic The line, the revise_skill guidance and the longer skill tool descriptions went over the agent context budget. Ask first and Off now leave the line out, so the agent changes a skill only when the user asks. * Reload the agent sessions when skill learning moves into or out of Automatic The skill revision line is in the instructions only with Automatic. A loaded session kept the old line until it unloaded, so an agent could still revise a skill after the user chose Ask first or Off. | 23 hours ago | |
Use one causeHelpers adapter for typed cause errors (#1472) * Use one causeHelpers adapter for typed cause errors Add causeHelpers(ErrorClass) to src/backend/effect-boundary.ts. It returns io, sync and rewrap. Replace 81 module-local Effect.try and Effect.tryPromise wrappers and 405 mapError calls that moved a cause into a new typed error. Each error class, tag and wrapper name stays. The AbortSignal variants (runtimeIO, cuaIO, githubCall, onePasswordCall) keep their names and still forward the signal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Move the no-span comment to the slackIo adapter Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Make two error classes private that only their module uses knip found AttentionOperationFailed and AvatarFileFailed unused outside their files after the rewraps moved to the to* helpers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 1 month ago | |
Let agents learn and revise skills from chats (#5945) * Let agents learn and revise skills from chats The background memory review can now find a skill in a chat. The server setting "Skill learning" sets what happens next: Automatic saves the skill, Ask first shows a skill card with Save in the chat, and Off does nothing. Save uses the background writer with no tools and no agent turn. The Team API capability skill-learning-v1 adds the setting routes, the Save route and the `skillSuggestion` key. Web and desktop clients copy the key back after the frozen codecs decode. A skill description with a colon now saves, because the library quotes the frontmatter value. * Fix the review findings of the skill learning change - A skill card for a new skill shows Saved only for a skill with its name, or for the skill that the agent made in answer to the card. - A second Save does not write the skill again while its line waits for the running turn, or when the line could not be added. - A skill name with no Latin letter gets a slug from its hash. - One frontmatter pattern for the skill package, library and learner. * Keep the skill revision text inside the agent context budget Show the in-turn skill revision line only when skill learning is Automatic. Remove the revise_skill guidance and shorten the skill tool descriptions. Remove the unused skill suggestion bench script. * Show the skill revision line only when skill learning is Automatic The line, the revise_skill guidance and the longer skill tool descriptions went over the agent context budget. Ask first and Off now leave the line out, so the agent changes a skill only when the user asks. * Reload the agent sessions when skill learning moves into or out of Automatic The skill revision line is in the instructions only with Automatic. A loaded session kept the old line until it unloaded, so an agent could still revise a skill after the user chose Ask first or Off. | 23 hours ago | |
Open file chips for files that an agent read with a shell command (#5321) * Open file chips for files that an agent read with a shell command A chip with only a file name looks in the agent workspace, then in the files that the agent read, wrote or edited with a tool in the same thread. A file that the agent showed with `cat`, `tail` or `sed -n` was not in that list, so a chip for `main.log` from the logs folder failed. Codex shell reads (`commandActions` of type "read") and the file paths in a Claude `Bash` read command now go into the thread file history. Fixes #5298 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Record only finished local shell reads, and try older history matches A shell read now goes into the thread file history only when its step completed. Remote reads through ssh, docker, podman and kubectl are not recorded. Only Claude `Bash` commands are split as text; Codex steps use their own `commandActions`. In double quotes, a backslash escapes only the characters that a shell escapes there. A chip now tries each history file with its name, newest first, so a file that is gone does not hide an older one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep the history lookup error when a file is not missing A history file that fails for a reason other than a missing path, such as a permission error, again stops the lookup with that error, as before the walk over older files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Skip a remote shell line before it is split into commands A remote command such as `ssh host 'tail a; cat b'` holds several commands in quotes. The split at `;` made the later reads look local. The whole line is now checked for a remote command first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 4 days ago | |
Let agents learn and revise skills from chats (#5945) * Let agents learn and revise skills from chats The background memory review can now find a skill in a chat. The server setting "Skill learning" sets what happens next: Automatic saves the skill, Ask first shows a skill card with Save in the chat, and Off does nothing. Save uses the background writer with no tools and no agent turn. The Team API capability skill-learning-v1 adds the setting routes, the Save route and the `skillSuggestion` key. Web and desktop clients copy the key back after the frozen codecs decode. A skill description with a colon now saves, because the library quotes the frontmatter value. * Fix the review findings of the skill learning change - A skill card for a new skill shows Saved only for a skill with its name, or for the skill that the agent made in answer to the card. - A second Save does not write the skill again while its line waits for the running turn, or when the line could not be added. - A skill name with no Latin letter gets a slug from its hash. - One frontmatter pattern for the skill package, library and learner. * Keep the skill revision text inside the agent context budget Show the in-turn skill revision line only when skill learning is Automatic. Remove the revise_skill guidance and shorten the skill tool descriptions. Remove the unused skill suggestion bench script. * Show the skill revision line only when skill learning is Automatic The line, the revise_skill guidance and the longer skill tool descriptions went over the agent context budget. Ask first and Off now leave the line out, so the agent changes a skill only when the user asks. * Reload the agent sessions when skill learning moves into or out of Automatic The skill revision line is in the instructions only with Automatic. A loaded session kept the old line until it unloaded, so an agent could still revise a skill after the user chose Ask first or Off. | 23 hours ago | |
Let agents learn and revise skills from chats (#5945) * Let agents learn and revise skills from chats The background memory review can now find a skill in a chat. The server setting "Skill learning" sets what happens next: Automatic saves the skill, Ask first shows a skill card with Save in the chat, and Off does nothing. Save uses the background writer with no tools and no agent turn. The Team API capability skill-learning-v1 adds the setting routes, the Save route and the `skillSuggestion` key. Web and desktop clients copy the key back after the frozen codecs decode. A skill description with a colon now saves, because the library quotes the frontmatter value. * Fix the review findings of the skill learning change - A skill card for a new skill shows Saved only for a skill with its name, or for the skill that the agent made in answer to the card. - A second Save does not write the skill again while its line waits for the running turn, or when the line could not be added. - A skill name with no Latin letter gets a slug from its hash. - One frontmatter pattern for the skill package, library and learner. * Keep the skill revision text inside the agent context budget Show the in-turn skill revision line only when skill learning is Automatic. Remove the revise_skill guidance and shorten the skill tool descriptions. Remove the unused skill suggestion bench script. * Show the skill revision line only when skill learning is Automatic The line, the revise_skill guidance and the longer skill tool descriptions went over the agent context budget. Ask first and Off now leave the line out, so the agent changes a skill only when the user asks. * Reload the agent sessions when skill learning moves into or out of Automatic The skill revision line is in the instructions only with Automatic. A loaded session kept the old line until it unloaded, so an agent could still revise a skill after the user chose Ask first or Off. | 23 hours ago | |
Send fewer prompt tokens to Codex, and add web search for agents with no search of their own (#5658) * Send fewer prompt tokens to Codex, and add openbot.web_search Codex threads now start with features.tool_suggest off, five unfit system skills off, and, for toolless threads, agents and sleep off. A key in the user's config.toml stays as the user set it. This removes about 1,050 tokens from each Codex request. Add the deferred openbot.web_search tool. A separate Codex session on the Codex sign-in of this computer runs the search and returns a short answer with source URLs. Only agents whose CLI has no web search of its own get the tool: Pi, Inception, DeepSeek, OpenRouter and custom ACP agents. Codex, Claude and the other CLIs keep their own search. Add smoke:codex-agent, bench:codex-prompt-settings and bench:codex-web-search. * Stop a web search on Stop, and keep the user's skill entries - Race openbot.web_search against the request's abort signal, as the browser tools do. Stop now ends the side Codex process. - A web search leaves one generation slot for the user's own work, and checks shutdown and free slots again after Codex starts. - Log why Codex was not ready for a web search. - A [[skills.config]] entry by path also names its skill, so OpenBot does not turn off a skill that the user turned on by path. Keep each user entry as it is. * Use one usage observer for side sessions, and remove an unused type Memory reviews and web searches now use sideSessionUsageObserver with a kind. Remove the CodexSkillConfig type, which knip reports as unused. * Set the expected answer only when the bench question has one This removes an exactOptionalPropertyTypes error that types:ratchet reports in codex-web-search-bench.ts. | 2 days ago | |
Show subagents of all agents, and keep a running card in view (#4947) * Show subagents of all agents, and keep a running card in view OpenCode, Kimi, Cline and Hermes subagents now show a card in the chat with their task, state, time and steps. A Codex subagent card shows its steps while it works. An agent shows as working in the sidebar while one of its subagents runs, also after the turn ends. A failed subagent sends a desktop notification or an alert, as the agent's notification settings say. When you scroll away from a card whose subagents work, its header stays as a bar under the chat header, with the progress, the current step and the time. A click on the bar goes back to the card. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove the subagent thread entry of a turn with no subagent A Kimi, Cline or Hermes turn added one entry for each tool call and did not remove it when the turn had no subagent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Show the failed-subagent alert only at the "all" notification level The desktop notification already obeyed this level. The in-app alert also showed at "needs-me". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 6 days ago | |
Open channel file links to files outside the agent workspace (#5588) * Open channel file links to files outside the agent workspace A chip that names a file with no folder uses the tool history of the agent when the workspace has no such file. The history lookup read only the agent's main thread. A channel runs the agent in a different thread, so a link in a channel did not find a file that the agent used outside its workspace. The lookup now reads the main thread first, then the other threads of the agent, the most recent thread first. The channel file link E2E checks this case. Its quote step now closes the side panel, because the side panel hides the preview close button. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Name the release note after the branch Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Forget the file history of deleted threads A deleted channel, a deleted channel history, a forgotten messaging thread, and a deleted task no longer give files to links in other threads. The E2E steps now have the numbers of their run order. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 2 days ago | |
Let agents send bug reports and ideas to the OpenBot team (#5785) * Add Report a problem to the Help menu Help → Report a problem opens the GitHub bug report form with the OpenBot version, the platform and the system filled in. Before, the desktop app had no path to the bug form, and many reports did not pass the form check. * Add openbot.report_problem for agents Agents make a link to the GitHub bug report form, with the OpenBot version, the system, their provider and its CLI version filled in. The user checks the form and submits it. The tool is deferred, so it adds only its name to the catalog. The text is redacted before it goes into the link. * Send approved bug reports to GitHub from the app openbot.report_problem now shows the full issue text to the owner for approval. On approval, the app sends the report to the account service with the account session. The new route POST /v1/bug-reports opens the issue in nightly-labs/openbot as openbotgit[bot], and the agent gives the issue link. The issue does not show the account. The Worker does not store or log the report, and limits each account to 3 reports a minute. When the user is not signed in, or the send fails, the tool gives the prefilled form link, as before. Help > Report a problem keeps the form link. The report has every required field of the bug form, because the form check does not check issues from openbotgit[bot]. * Show a short bug report approval in plain words Most reporters are not developers. The agent now writes only the title, what went wrong and the steps that it saw, and it does not ask technical questions. The area, severity, frequency and earlier-version answers are optional; the issue reads "No response" for a missing answer. The approval card shows the report title as its heading, the report as plain text, one line that says the app version and the system go with it, and Send report / Don't send. The card finds the report from its fixed notice text, so the contracts and the Team API do not change. Older clients and the phone show the same short text in the usual card. * Tell agents that they can report OpenBot bugs The agent instructions now say: when the user meets a bug in OpenBot itself, offer to report it with openbot.report_problem. The tool is deferred, so before this an agent found it only with a search, and a search for "bug" did not find it. The tool description now says "bug". Raise the agent context baseline by hand for the new tool: 93 bytes in each request for the instruction, and the deferred schema, description and guidance of report_problem, which load only when an agent asks. * Let agents send feature ideas, not only bug reports openbot.report_problem is now openbot.send_feedback, with kind "bug" or "idea". An idea becomes a "[Feature]: " issue with the sections of feature_request.yml and the enhancement label. The fallback link opens that form. The tool guidance sends security problems to a private advisory and open questions to Discussions. The Worker route is now POST /v1/feedback, with FEEDBACK_RATE_LIMITER. Neither is deployed yet. The approval button now says "Send". * Show a bold feedback offer and a thank-you card The agent offers the feedback card without a request when the user meets an OpenBot bug or wants a change. The card shows a wiggling bug or idea emoji, the title and text as a quote, "Not now" and "Send to the OpenBot team". Send shows a loader until the issue is open. Then a thank-you card shows with a link to the GitHub issue. The activity line now says "Sending your feedback to the OpenBot team…" while the tool runs. The agent tells the user that the issue is public and does not show their name, and it does not offer the card again after "Not now". * Fix feedback review findings - Open the issue link of the thank-you card outside the app. The desktop window does not open a new window for a plain link. - Do not show the feedback card in a routine, a channel task, an external chat or a message from another agent. Only a person's message can send feedback, so an unattended run does not wait. - Tell the agent that nobody answered when the card is cancelled, not that the user selected Not now. - Keep the title on one line, so the card and the issue show the same title. - Name a provider that the form does not list in the version line. - Look up the GitHub App installation again after a failed token mint. * Limit feedback to 10 issues a day for each account The Worker limited feedback only to 3 issues a minute, so one account could open thousands of public issues a day. D1 now counts the issues of each account for each UTC day, in one statement that also checks the limit. It keeps no feedback text, and it deletes the counts of earlier days and of deleted accounts. PRIVACY.md now says that the card shows the title and text, and names the daily count. * Fix the NorbiAI feedback findings - Give the form link before the card when nobody is signed in. - Give back the daily count when GitHub does not open the issue. - Test the real count statement, from a module with no Worker imports. - Restore the Start Register block in the generated route tree. * Fit the feedback guidance in the agent context budget Shorter send_feedback guidance and instructions, with the same rules, so the budget goes down, not up. | 1 day ago | |
Measure the storage of a hosted server against its plan (#6264) * Measure the storage of a hosted server against its plan The account server sends the plan storage of a hosted server in the host list. The desktop storage card and Server settings > Storage use it. They do not count the 22 GB base image, and the card shows when less than 10 GB of the plan is free. Agents on a hosted server get one short line about the plan storage. * Correct the release notes for the plan storage warning * Read the hosted state of a host from its plan, with one lookup | 14 hours ago | |
fix: keep tool-call idempotency keys under the identifier limit (#1538) Custom ACP thread ids carry the agent id and a folder tag before the session UUID, so `${threadId}:${turnId}:${callId}` reaches 139 characters and MailboxStore.enqueue rejects send_message and the interrupt notice with "The idempotency key is too long." A key that would pass the limit now replaces the thread and call ids with their SHA-256 digest. The turn id stays the second-to-last segment, because the mailbox reads it back to tie the message to the sender's turn. Co-authored-by: 634634624 <macbook@Adams-MacBook-Air.local> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 1 month ago | |
Keep numbers and lists in Kimi tool_call arguments (#5749) * Keep numbers and lists in Kimi tool_call arguments Kimi Code CLI gives each tool schema without a type the type string. The tool_call arguments values had an empty schema, so the Kimi model sent numbers and arrays as strings, and tools such as openbot.revise_skill refused them. For Kimi only, advertise the values as an anyOf of the JSON types, which Kimi keeps. The call decode and other providers are unchanged. Fixes #5742 * Build the Kimi tools from the Kimi definitions and correct the type array comment | 2 days ago | |
Show the error of a failed tool step in the turn steps (#5635) * Show the error of a failed tool step in the turn steps A failed tool step showed only "failed". The user could not see why the agent tried again. The host now sends a short, redacted error with the failed step, keeps it in the trace, and the step shows a "Show error" toggle that opens the text. Fixes #4041 Co-authored-by: Luis Araya <35828647+Totopo27@users.noreply.github.com> Co-authored-by: CyanPersica <105734843+fanjiahe@users.noreply.github.com> * Keep the error panel open and read failures from more providers - A failed step keeps its mounted line when the list changes, so an open error does not close when the next step arrives. - A Claude Bash, ACP execute or Pi bash step keeps the end of its output, as a Codex command does. - The redaction reads a bounded window of the result. Claude keeps both ends of a long error, so no cut is near the text that the step shows. - A cut does not leave half of a surrogate pair. - An ACP tool that fails puts its content on the item, because Gemini sends the error only there. - The preview mock gives its failed search step an error. * Show the error of a failed tool step in the Trace A click on a failed tool step in the Trace opens its error under the step. The handoff line moves and grows by the open errors. --------- Co-authored-by: Luis Araya <35828647+Totopo27@users.noreply.github.com> Co-authored-by: CyanPersica <105734843+fanjiahe@users.noreply.github.com> | 2 days ago | |
Let agents send bug reports and ideas to the OpenBot team (#5785) * Add Report a problem to the Help menu Help → Report a problem opens the GitHub bug report form with the OpenBot version, the platform and the system filled in. Before, the desktop app had no path to the bug form, and many reports did not pass the form check. * Add openbot.report_problem for agents Agents make a link to the GitHub bug report form, with the OpenBot version, the system, their provider and its CLI version filled in. The user checks the form and submits it. The tool is deferred, so it adds only its name to the catalog. The text is redacted before it goes into the link. * Send approved bug reports to GitHub from the app openbot.report_problem now shows the full issue text to the owner for approval. On approval, the app sends the report to the account service with the account session. The new route POST /v1/bug-reports opens the issue in nightly-labs/openbot as openbotgit[bot], and the agent gives the issue link. The issue does not show the account. The Worker does not store or log the report, and limits each account to 3 reports a minute. When the user is not signed in, or the send fails, the tool gives the prefilled form link, as before. Help > Report a problem keeps the form link. The report has every required field of the bug form, because the form check does not check issues from openbotgit[bot]. * Show a short bug report approval in plain words Most reporters are not developers. The agent now writes only the title, what went wrong and the steps that it saw, and it does not ask technical questions. The area, severity, frequency and earlier-version answers are optional; the issue reads "No response" for a missing answer. The approval card shows the report title as its heading, the report as plain text, one line that says the app version and the system go with it, and Send report / Don't send. The card finds the report from its fixed notice text, so the contracts and the Team API do not change. Older clients and the phone show the same short text in the usual card. * Tell agents that they can report OpenBot bugs The agent instructions now say: when the user meets a bug in OpenBot itself, offer to report it with openbot.report_problem. The tool is deferred, so before this an agent found it only with a search, and a search for "bug" did not find it. The tool description now says "bug". Raise the agent context baseline by hand for the new tool: 93 bytes in each request for the instruction, and the deferred schema, description and guidance of report_problem, which load only when an agent asks. * Let agents send feature ideas, not only bug reports openbot.report_problem is now openbot.send_feedback, with kind "bug" or "idea". An idea becomes a "[Feature]: " issue with the sections of feature_request.yml and the enhancement label. The fallback link opens that form. The tool guidance sends security problems to a private advisory and open questions to Discussions. The Worker route is now POST /v1/feedback, with FEEDBACK_RATE_LIMITER. Neither is deployed yet. The approval button now says "Send". * Show a bold feedback offer and a thank-you card The agent offers the feedback card without a request when the user meets an OpenBot bug or wants a change. The card shows a wiggling bug or idea emoji, the title and text as a quote, "Not now" and "Send to the OpenBot team". Send shows a loader until the issue is open. Then a thank-you card shows with a link to the GitHub issue. The activity line now says "Sending your feedback to the OpenBot team…" while the tool runs. The agent tells the user that the issue is public and does not show their name, and it does not offer the card again after "Not now". * Fix feedback review findings - Open the issue link of the thank-you card outside the app. The desktop window does not open a new window for a plain link. - Do not show the feedback card in a routine, a channel task, an external chat or a message from another agent. Only a person's message can send feedback, so an unattended run does not wait. - Tell the agent that nobody answered when the card is cancelled, not that the user selected Not now. - Keep the title on one line, so the card and the issue show the same title. - Name a provider that the form does not list in the version line. - Look up the GitHub App installation again after a failed token mint. * Limit feedback to 10 issues a day for each account The Worker limited feedback only to 3 issues a minute, so one account could open thousands of public issues a day. D1 now counts the issues of each account for each UTC day, in one statement that also checks the limit. It keeps no feedback text, and it deletes the counts of earlier days and of deleted accounts. PRIVACY.md now says that the card shows the title and text, and names the daily count. * Fix the NorbiAI feedback findings - Give the form link before the card when nobody is signed in. - Give back the daily count when GitHub does not open the issue. - Test the real count statement, from a module with no Worker imports. - Restore the Start Register block in the generated route tree. * Fit the feedback guidance in the agent context budget Shorter send_feedback guidance and instructions, with the same rules, so the budget goes down, not up. | 1 day ago | |
Use one causeHelpers adapter for typed cause errors (#1472) * Use one causeHelpers adapter for typed cause errors Add causeHelpers(ErrorClass) to src/backend/effect-boundary.ts. It returns io, sync and rewrap. Replace 81 module-local Effect.try and Effect.tryPromise wrappers and 405 mapError calls that moved a cause into a new typed error. Each error class, tag and wrapper name stays. The AbortSignal variants (runtimeIO, cuaIO, githubCall, onePasswordCall) keep their names and still forward the signal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Move the no-span comment to the slackIo adapter Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Make two error classes private that only their module uses knip found AttentionOperationFailed and AvatarFileFailed unused outside their files after the rewraps moved to the to* helpers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 1 month ago | |
Tell agents about saved logins that arrive after their chat started (#5694) * Tell agents about saved logins that arrive after their chat started The saved-logins rule was only in the system prompt. A provider that keeps the system prompt of a loaded session (Codex, Claude, ACP) did not get it when the user saved a login after the session started, so the agent opened the sign-in page and asked for the password. For clients that send turn context, the rule now goes with the user turns as an <openbot_saved_logins> block. A change in the vault state resumes the thread, and the next turn sends one block: the rule, or a note that the logins are no longer shared. The rule also tells the agent to call list_logins before request_takeover for a signed-out site. * Keep one saved-logins condition and drop the repeated routine rule The no-longer-shares block does not repeat the routine takeover rule: the system prompt of a turn-context client always keeps it. * Read the routine saved-login rule from the first turn in the routine e2e Codex now gets the saved-login rules with the user turn, not in the developer instructions. | 2 days ago | |
Tell the requesting agent when a teammate turn ends with no result (#6101) A teammate turn that completed with no answer text sent the agent that asked no result and no failure note: the relay ran only with answer text, and the failure note only for a failed turn. The request was marked done, and the agent that asked could stay idle. Now such a turn sends an OpenBot note in the reply format ("Status: blocked"), through the same relay and with the same guards. A turn that passed work on to another teammate with a request gets no note, because its result comes later. Fixes #6044 | 18 hours ago | |
Let one agent run tasks at the same time as its chat (#2207) * Let one agent run tasks at the same time as its chat (#1807) An agent can start tasks next to its chat: "New task" and "Run as task" in the chat menu, or the start_task tool. Each task has its own thread, conversation, queue, progress, stop, error and result. Migration 38 adds projection_agent_tasks. - "Tasks at once" (1 to 4, default 2) limits the task turns of one agent. A custom ACP agent runs one turn at a time. A waiting task shows why. - The redacted error of a failed task is kept after a restart. - Tasks have their own browser tabs and run without Computer Use, so only the agent's chat controls the screen. - A provider change waits for running tasks; after it, each task thread gets a handoff on the new provider. - The transfer file keeps "Tasks at once". - The chat header has one menu for the panels, agent settings and tasks. - scripts/agent-tasks-e2e.ts checks the limit, Stop and the provider switch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Stop a task lane loop, and keep a close from leaving work behind - Schedule a task lane only when its next message can start. A start that stayed "starting" made the lane schedule itself again with no end. - Refuse to close a task while a message of it waits, starts or runs, so its turn still counts toward the task limit and turn slots. - Cancel a task message that arrives after its task closes, and drain the agent when a task opens again. - Clear the per-task state of every task when an agent is deleted. - Shorten the task message box placeholder, which repeated the full title. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Update the database tests for migration 38, and remove unused exports - The database tests now expect version 38. The events test removes version 38 with the later versions when it makes a version 29 database. - Three task names are used only in their files, so they are not exported. knip reported them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Limit open tasks to the task list, and clear the task draft on a task change - The user can have at most 50 open tasks, the size of the task list. A start, a move to a task, or a reopen past the limit fails with an error. Before, more open tasks ran, but the list did not show them, so the user could not stop or close them. - The task panel clears its draft when it shows another task. Before, text typed for one task went to the next task. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove the unused source message column from migration 38 No code wrote source_message_id, so it was always null. Migration 38 is not released, so the column goes before it is in a user's database. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep task threads out of the startup thread repair The repair gave an unclaimed thread to its agent when the agent had no chat. A task thread was unclaimed, so a new agent could get its task's thread as its own chat, and the two conversations mixed. The repair now skips task threads, so it also stops the warning for them at each start. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep task messages out of the chat search A search result opens the agent's own chat. A task message is not in that chat, so the message and file searches now skip task threads, as they skip channel threads. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 25 days ago | |
Show the error of a failed tool step in the turn steps (#5635) * Show the error of a failed tool step in the turn steps A failed tool step showed only "failed". The user could not see why the agent tried again. The host now sends a short, redacted error with the failed step, keeps it in the trace, and the step shows a "Show error" toggle that opens the text. Fixes #4041 Co-authored-by: Luis Araya <35828647+Totopo27@users.noreply.github.com> Co-authored-by: CyanPersica <105734843+fanjiahe@users.noreply.github.com> * Keep the error panel open and read failures from more providers - A failed step keeps its mounted line when the list changes, so an open error does not close when the next step arrives. - A Claude Bash, ACP execute or Pi bash step keeps the end of its output, as a Codex command does. - The redaction reads a bounded window of the result. Claude keeps both ends of a long error, so no cut is near the text that the step shows. - A cut does not leave half of a surrogate pair. - An ACP tool that fails puts its content on the item, because Gemini sends the error only there. - The preview mock gives its failed search step an error. * Show the error of a failed tool step in the Trace A click on a failed tool step in the Trace opens its error under the step. The handoff line moves and grows by the open errors. --------- Co-authored-by: Luis Araya <35828647+Totopo27@users.noreply.github.com> Co-authored-by: CyanPersica <105734843+fanjiahe@users.noreply.github.com> | 2 days ago | |
Queue a provider change during a turn and apply it before the next turn (#3116) * Queue a provider change during a turn and apply it before the next turn You can now change the provider, account, or custom agent while a turn or a task runs. The running work keeps its sessions. OpenBot stores the change as the pending runtime and applies it before the next turn or queued message starts. The "After this turn" badge shows the running and the next runtime. - Apply the pending runtime with started-only checks, so queued messages do not block it. - Queue only user or agent requests that change only runtime fields. Automatic usage-limit, provider-error and endpoint moves still wait. - Remove a pending runtime that fails on an idle agent. - Remove the picker lock and the providerBusy text. Closes #3059. Co-authored-by: rick-schultz <rick-schultz@hotmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix the review findings for the queued provider change - The busy check sees a turn that the database still records, so a queued change waits for it and is not dropped. - An effort change edits the queued change also on an idle agent that a hold keeps from applying it. - The queued effort is checked against the queued model. - A move to a backup model is not queued, because pendingRuntime does not keep the model to go back to. - A Team API request keeps the refusal: its protocol has no pendingRuntime. - The update_agent and update_agents tools report pendingRuntime. - A queued runtime without an account shows the provider's own sign-in. - A pending change that is gone lets the drain make a due usage-limit move. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Refuse a Team API account change during work The Team API account route used the default that queues the change. The released protocol has no pendingRuntime, so the remote user did not see the queued change. Refuse it, as the agent PATCH route does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Move a queued account change when the account is removed Removing an account changed only the agents that used it. A queued change to that account failed before the next turn and was lost. Move the queued change to the provider's own sign-in, as the agents that use the account move. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep a queued change on a Team API model or effort change A Team API client cannot see pendingRuntime. Its effort or model change deleted the queued local change, and the next turn ran on the old provider. Only a handover from a Team API client now ends the change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: rick-schultz <rick-schultz@hotmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 15 days ago | |
Send fewer prompt tokens to Codex, and add web search for agents with no search of their own (#5658) * Send fewer prompt tokens to Codex, and add openbot.web_search Codex threads now start with features.tool_suggest off, five unfit system skills off, and, for toolless threads, agents and sleep off. A key in the user's config.toml stays as the user set it. This removes about 1,050 tokens from each Codex request. Add the deferred openbot.web_search tool. A separate Codex session on the Codex sign-in of this computer runs the search and returns a short answer with source URLs. Only agents whose CLI has no web search of its own get the tool: Pi, Inception, DeepSeek, OpenRouter and custom ACP agents. Codex, Claude and the other CLIs keep their own search. Add smoke:codex-agent, bench:codex-prompt-settings and bench:codex-web-search. * Stop a web search on Stop, and keep the user's skill entries - Race openbot.web_search against the request's abort signal, as the browser tools do. Stop now ends the side Codex process. - A web search leaves one generation slot for the user's own work, and checks shutdown and free slots again after Codex starts. - Log why Codex was not ready for a web search. - A [[skills.config]] entry by path also names its skill, so OpenBot does not turn off a skill that the user turned on by path. Keep each user entry as it is. * Use one usage observer for side sessions, and remove an unused type Memory reviews and web searches now use sideSessionUsageObserver with a kind. Remove the CodexSkillConfig type, which knip reports as unused. * Set the expected answer only when the bench question has one This removes an exactOptionalPropertyTypes error that types:ratchet reports in codex-web-search-bench.ts. | 2 days ago | |
Show a backup model that a provider error holds as not available (#5806) A provider error holds its model and account for all agents, for 10 minutes or until the reset that the error names. The switch to a backup model passes over a held model, but the runtime snapshot sent only usage limits. So the backup models list showed the held model as ready, and the switch went to the next backup with no message. The usage-limit gate now sends its provider-error holds in the runtime snapshot as `failedModels`, and sends a snapshot when a hold starts or ends. The backup models page of a local agent shows a held saved backup as "Not available now · skipped". The "Add backup model" list, the usage-limit ask card and the switch itself do not change. Released Team API snapshots project a fixed key list, so the new field stays local. Fixes #5802 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 1 day ago | |
Show the Pi session cost on the Usage page (#5377) * Show the Pi session cost on the Usage page Pi, DeepSeek, OpenRouter and Inception turns now book the cost that Pi reports in `get_session_stats`. The cost is a session total, so each turn books the difference from the last report. A model with no rates reports 0 and stays unpriced. An Antigravity model ID that keeps its effort, such as `gemini-3.8-flash-high`, now gets the price of its base model. Add `test:pi-usage-cost`, an E2E test that runs the real Pi binary against a fake model server and books the usage in a real database. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Price only Pi-family turns from the session cost Other ACP providers keep their list-price estimate. A Pi turn that adds 0 to the session cost stays unpriced, but the session keeps the 0 as its start, so a later turn on a priced model gets a cost. The E2E now checks a model change in one session and that each turn adds one record. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 3 days ago | |
Pace plan usage reads on the host (#3909) * Pace plan usage reads on the host Each desktop window, web tab and phone polls the host every five minutes, and the host read the provider's own sign-in again for each poll, with no wait after a failure. Claude's usage endpoint allows few reads an hour for each login, so more views or a 429 could keep it refused for a long time. UsageReadGate now paces the reads of each provider sign-in and each extra account: one read at a time, a reading answers for four minutes, and after a failure the next read waits 5, 10, 20 and 40 minutes, up to an hour, while the last reading stays on the rail. A credential change, another login, a new key or a removed account drops the gate. This follows t3code (one refresh in five minutes for each host), CodexBar and openusage. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Name the release notes after the branch Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix the usage gate findings of the local review A window that had already reset when the provider sent the reading made each poll read again. Now only a window that resets after the last read skips the interval. A login change reset the gate while a read held it, so its result went to a gate that was no longer used; the gate now resets in place, and a read that started before the reset sets nothing. The first sign-in of a provider does not reset it. A read of the dock's reading outside the poll, such as when Codex starts, counts as a read. The read after a usage limit has no model, so it resets the gate of a provider whose limits depend on the model in place of keeping its reading. The docs say when the last reading stays and that the gate cannot read `Retry-After`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix the NorbiAI findings on the usage gate An account check kept its reading but did not tell the account's gate, so the next poll read the account again. A credential change or another login reset the gate but kept the old login's reading, so a failed first read showed the old reading for the whole wait. A reading whose window had reset before the read left the rail between reads. Now an account check counts as a read, a reset also forgets the kept reading and reset credits, and the kept reading answers as it is. The E2E covers the last two. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 11 days ago | |
Let agents watch online videos with read_video (#5953) * Let agents watch online videos with read_video Agents could not read a video from a link: the browser shows only the page around it. The new openbot.read_video tool downloads a public video with a pinned, checksum-verified yt-dlp to a temporary folder, takes frames and decodes the sound in a hidden, sandboxed window in its own session, and transcribes the sound with the local voice model. It gives the agent the title, author, counts, description, a timed transcript and the frames. The temporary folder is deleted after each call. * Do not decode a silent video's picture file as sound, and prefer non-HEVC pictures When yt-dlp gives no sound format, the reader decoded the picture file as sound and told the agent that the sound could not be decoded. Now the note says that the video has no sound. HEVC pictures come last, because Chromium decodes them only with hardware or system support. * Keep video details when frames or sound fail, and transcribe only with a set-up voice model A picture or sound that does not decode now gives a note to the agent, not a failed read. read_video no longer downloads a voice model: only a model that the user set up transcribes. The tool notes and errors go through the MCP redaction. PRIVACY.md lists the new outbound requests. * Send read_video sound on the dictation route, and remove unused exports A voice server that does dictation now transcribes the video sound, as it does for dictation. ElevenLabs takes only a stream, so it gets the note that no model for recordings is set up. * Keep read_video inside the agent context budget Remove the read_video line from the developer instructions and shorten the tool texts. The catalog and the tool_search list still grow by the new tool, so their baseline grows by the measured bytes. * Queue voice transcriptions instead of refusing a second one Dictation and the 60 s parts of a video read used one busy flag, so one failed with "busy" while the other ran. Now each transcription waits for the one before it. The error.voice.busy text has no use, so it goes. | 22 hours ago | |
Add workflows: connect agents and steps on a canvas (#3062) * Add workflow IPC contracts Types and guards for workflows: graph, summary, detail, runs, steps, versions and their inputs. Add the input limits and the workflows-changed agent event. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Add the workflow tables (migration 46) Migration 45 only creates tables and indexes: workflows, nodes, edges, versions, triggers, trigger webhooks, webhook receipts, runs, steps and output deliveries. No row of an existing table changes. The same SQL is the tail of the latest schema for new databases. - workflow-migration.test.ts covers every schema from 8 to 44, rollback and retry, newer and incomplete histories, foreign keys and cascades. - The older migration tests expect version 45 as the latest. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Add the workflow store and graph rules The store saves graphs with a revision check, keeps up to 50 versions, and keeps trigger rows. Deleting an agent removes it from workflow nodes and keeps the step history. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Add the workflow IPC endpoints The host answers list, get, create, rename, delete, save, versions and restore. A joined server says that it does not support workflows yet. The preview keeps workflows in memory. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Add workflow runs Run a workflow from the start, from a trigger, or from one node, and run one node alone. Agent steps go through the routine sender, so an agent answers in its own chat. Model and condition steps use a tool-less generation; a condition answers yes or no. Approvals wait for a decision, and a rejection stops the run. Notify outputs show a desktop notification. A sweep at startup settles agent steps from their delivery and fails model steps that a restart interrupted. Channel outputs fail with outputPending until the messaging-place output lands. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Add the workflow run view and rail button - WorkflowFeatures and the v1 set of node kinds, triggers and outputs. - A pure run view: pages of runs, run and step changes, and the run state of each node. - The Workflows rail button (Waypoints) and app.rail.workflows in all languages. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Move the workflow nodes into shared UI - The board, camera, picker, tool art and one file per node kind move to packages/ui/src/features/workflows, with their styles. Their icons go through the shared icon exports. - Nodes read agents, models, places, image models and files from WorkflowCatalogs on the board. No story data or simulated runs. - The agent node writes agentId; a channel output writes connectionId and placeId, as the contract says. - 199 English keys in the workflow module. Result times are ISO and formatted in the reader's locale. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Split the workflow canvas into shared UI Move the canvas from the prototype into packages/ui as a controlled component. The host gives the workflow, runs, versions and catalogs, and gets each graph change. Remove the run simulation, presence and local ids. Add the canvas keys in English, the Workflows stories over the preview mock, and the Storybook icon link. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Add the Workflows page to the desktop window The Waypoints rail button opens a titled page with the workflow canvas of the server. The page saves the graph 400 ms after the last edit, one save at a time on its base revision, and loads it again after a change from another device. A joined server without workflows shows a notice. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Add workflow triggers, place outputs and workflows-v1 - Schedule triggers: WorkflowTriggers is a routine due source. A missed time gives one run, and a time is skipped while a run is open. - Webhook triggers: a third webhook route owner. The first secret makes the route. Receipts stop a second run for the same delivery. - Place outputs: an output posts the result to a messaging place, once, and an interrupted post becomes uncertain at the next start. - workflows-v1: the frozen Team API routes, codecs and event, the host route with its grant rules, the team client and the remote IPC branches. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Translate the workflow catalog Add the 302 workflow keys in de, es, fr, it, ja, pl, pt, ru and tr. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Edit trigger schedules and webhook secrets on the canvas A trigger node uses the routine schedule picker and saves the schedule on the node. A webhook trigger without an address has a button that makes the first secret, and so the address. The preview gives the next run and the address. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Document workflows PRIVACY.md says what a workflow keeps on this computer and what an output and a webhook trigger send. The architecture notes describe the run engine, the timer source, the webhook owner and workflows-v1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix the workflows page height and the canvas after a delete The canvas is a direct child of the window page, so it gets the height of the pane. The page reads its host once, without a tracked read. When the host opens another workflow after a delete, the canvas shows again; a switch while the Undo toast is open keeps the delete. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Name migration 46 in the workflow docs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Scope workflow run and step keys to their workflow A copy of a workflow keeps its node ids, so its schedule and webhook keys were the same text as the first workflow's, and its runs were answered with the other workflow's run. The keys are now unique per workflow. Migration 46 is not released, so its tables change in place: steps check their kind, and the unused waiting status, trigger enabled and last_scheduled_for columns, delivery retry columns and the inactive receipt reason are gone. A refused delivery gets its own reason. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix workflow run starts, the sweep and schedule waits - A run, its version, its reused steps and its webhook receipt are one write. - A webhook request that the graph refuses gets an ignored receipt and 202. - A trigger of a workflow with an open run waits for the run to end. - One failing schedule trigger does not stop the others. - The sweep ends steps that a restart or an agent delete left open, and ends a stop that a restart cut off. - A run version is kept only when the graph changed. - Store errors carry a code; the Team API maps missing to 404 and a bad schedule to 400. The list reads every graph in one query. - The runs cursor names the run, so runs of the same millisecond stay. - The routine timer plans again only when a trigger changes or a run ends. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Share the workflow helpers with routines Use one placeholders, receipt cutoff, result text, node agent, node timezone, CHECK column and coalesced sweep helper. Build the edge maps in place. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix workflow canvas bugs in keys, drags, uploads and approvals - Agent and LLM pickers set model, provider and effort as one change. - Undo and redo stop a drag and cancel queued layout frames. - Keys, clipboard and Delete act only in the canvas, its portals or the page body. Menus and lists keep their letter keys. Delete and cut do nothing on a frozen or deleted workflow. - Drag and pointer listeners are removed on cancel, restore and unmount. - Slots and ports stop the resize observer when they go. - Asset uploads belong to the board. Their blob URLs are freed at unmount, a file is found by id, and the upload button follows features.uploads. - The canvas label names the workflow. The minimap is hidden from screen readers. The live region tells only the step status changes. - Ports set aria-pressed only while a line is drawn. - A new note saves the name of its author in its fields. - Picker tiles get the colour of their kind. - A new node does not cover a node at the centre of the view. - Search reads the text fields of the board, not the DOM. - An approval answer is for one step, and shows again when sending fails. - Each trigger gets its own new schedule object. - The search fields show a grey focus ring. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Make the workflow canvas do less work for each change - Selected, removed and locked nodes are projections. A node runs again only when its own state changes. - The list of nodes on the canvas and the trigger lookup are memos. - Fit to view and the minimap use the sizes from the resize observer. Fit reads the element only for a node that has no size yet. - A line that the user draws adds points in place. A move does not copy the line or put it in a store. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Open the workflows-v1 names and add the version graph read - The wire carries node kinds, edge types, statuses, sources, trigger types and version kinds as short names. A client maps a name it does not know: a node becomes a locked note, its edges go, and the workflow is read-only. - New workflows.versionGraph read (IPC and Team API). The host hides a version that names an agent the member cannot see. - The IPC parse keeps only known graph keys and refuses a graph over 1 MiB with its own sentence. - Align wire limits: runs limit 1-50, run number and attempt >= 1, runs cursor up to 64 characters. - Move the workflow decoders to remote-workflow-decoding.ts. Delete the unused team-client and web-runtime workflow requests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ask for the manage level to change a shared workflow - A member needs manage on each agent of the graph, before and after, to save, rename, delete or restore a workflow or to make a new webhook secret. A run, a stop and a decision still need chat. - Retry, stop and decide also check the agents of the run's own graph: a retry ran an agent that the current graph no longer names. - An owner or admin sees a workflow whose agent was deleted. - A save conflict answers as missing when the newer graph names an agent that the member cannot see. - Run answers empty the oldest step texts to fit one frame, as the run page does. A single step of a hidden agent answers 404, not 500. - Reuse runEventsEffect from route-events.ts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Share one workflows controller between the page and stories - Move the save queue, resets, restore, preview and delete into workflows-controller.ts. The page and the stories use it. - A version preview reads its graph from the host. - A conflict or a restore keeps the canvas edits on undo, and a toast tells the user. - A failed save keeps the edit for the next save. A restore or a delete saves the waiting edit first. A failed delete shows the workflow again. - A member without "Can manage" on each agent gets a read-only canvas. Only an admin can rotate a webhook secret. The channel output hides when there are no places. - Add the Korean workflow catalogs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Document workflow permissions and test agent steps Docs and the release note give the manage rule, the version-graph route and the sweep rules. A new e2e checks that an agent delete fails the open step, and that a restart ends a stopping run. The webhook e2e checks that a graph this version cannot run gives a refused receipt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix workflow canvas halt on restore and new node placement A restore that removed a node wrote the slot size store in a list cleanup, which halts Solid. The reset now drops the sizes of the removed nodes. A new node now moves past each card that it would cover, not only an exact corner. The controller reads the server role untracked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Read the first agent fields of an agent step untracked The catalog agent is a store, so a read of its model and provider in the component body warned that the value does not update. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove unused workflow exports and fix optional props for the type ratchet Knip found 13 exports that only their own file uses. The optional props that take an undefined value now say so, as exactOptionalPropertyTypes requires. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Document that workflows with no agent need no agent level Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep the workflow canvas and its toolbars on whole pixels Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fade workflow canvas parts in out of a blur instead of a move Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove the entry animations of the workflow canvas Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Match the workflow title to the other page titles and remove its icon Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Balance the paddings of the workflow title and HUD buttons Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Give the workflow top row the button size of the other pages' top rows Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Make the workflow canvas icons and node toolbars sharp On a screen with one device pixel for each CSS pixel, the canvas icons get a line of 2, so a line fills whole pixels. The node toolbar icons are 16px, as in the tool bar. After the camera, a node or the selection moves, the node toolbars and result strips move onto whole device pixels. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fill the icon of a pressed workflow canvas tool Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Snap the workflow node toolbars to whole pixels and enlarge their icons The earlier sharpness commit added the snap offsets in the canvas but not the CSS that reads them. The node toolbar and the result strip now add the offsets to their position, and the toolbar icons show at 16px. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fill the pressed Select arrow fully The part-fill rule matched the svg element too, so it had more specificity than the arrow rule, and the arrow stayed at 35%. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Give workflow sticky notes the corner radius of the other cards A note had a 6px corner that shrank with the zoom while its selection ring and resize arc kept their screen gap, so the corners did not look alike. Notes and their drop preview now use the card radius. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Allow loops in workflows A connection back to an earlier step is a loop. The run takes it as the next pass: the earlier step runs again with the loop's answer as one more input, and the steps after it follow. A loop has no pass limit; a condition, a failed or rejected step, or a stop ends it. The canvas draws a loop under its steps with a "Loop" badge, and with an "Endless loop" warning when no condition is in the loop. While the user connects, the draft line says that the connection makes a loop. A retry now runs every step after the retried step again, not only the skipped ones. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Do not select a workflow step on a press of its port A press on a port, a portal or the edge actions selected the step under it, so a new connection also moved the selection. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Show why a workflow Output or Condition step failed These cards have no result field, so a failed step showed only its status. They now show the error of the step. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Retry a workflow step with the node's current settings A retry used the settings that the run copied, so a fix made after the failure, such as a new output place, did not apply. A retry now uses the current node, and the run's copy only when the node is gone or is now another kind. The Team API already checks the agents of both graphs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Reuse a warm provider for workflow model steps and count their usage A model or condition step started a new provider process each time and recorded no tokens. Now one process without tools per provider stays for 5 idle minutes; each step still starts a new ephemeral thread and closes it after the turn. The process stops when the main client stops or changes, after a failed step, and at shutdown. The tokens of these steps go to one reserved usage row, WORKFLOWS_USAGE_ID, which the host report, the Team API filter and the usage panel accept. Agent steps still count under their agent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Report workflow runs and actions to product analytics The host sends system_workflow_run when a run ends (outcome, source, duration, step counts by kind) and workflow_count in the daily inventory. The window sends workflow_action for each user action on a workflow. No name, text, graph or ID is sent. Host generation 11, desktop 12. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Translate the workflow text to Simplified Chinese main added zh as a 12th language. Add the workflow and workflow error catalogs, and the Workflows rail, usage and notification keys, so zh has every key. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix workflow review findings before merge - Reuse steps in graph order, so a reused step does not make a node behind it due. - Build the input of a retried agent step again from the current task. - Show the Workflows usage row only to a peer with workflows-v1. - Keep the warm client state correct when a generation is interrupted, and wait for idle stops at shutdown. - Send the duration of a workflow run up to 30 days. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 16 days ago | |
Run agent routines in the main chat again, with a switch for a separate thread (#5156) * Run agent routines in the main chat again, with a switch for a separate thread Since 0.61.0 each agent routine ran in its own thread, so a routine that must report back hid its report from the main chat. Agent routines now run in the main chat again. A new "Run in a separate thread" switch moves one routine to its own thread. - Migration adds projection_agent_routines.run_in ('chat' or 'thread'). All saved routines get 'chat'. - The scheduler, the digest and the "Open thread" link use the routine thread only for 'thread' routines. - The switch shows only on the local host. The Team API does not carry the field, so a save from a remote client keeps the saved value. - The create and update routine tools accept runIn. Fixes #5073 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Use the run place of each routine run in all routine paths - Give the routine thread the reply digest only when the run ran in that thread. - Read the routine record one time for each run. - Let the webhook routine tools set `runIn`. - Find webhook routines too when the chat decides on the "Open thread" link. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fit the routine run place to the agent context budget and the routine E2E tests The runIn text in the four routine tool schemas is shorter. The schema baseline goes up by 588 bytes, for one optional field in four tools. The routine session and routine failure report E2E tests check runs in a routine thread, so their routines now set runIn to thread. The routine session test also checks that a routine with no run place answers in the chat and gets no thread. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 5 days ago | |
Keep each agent's rules in its workspace AGENTS.md (#4143) * Keep each agent's rules in its workspace AGENTS.md The agent settings show an Instructions editor for AGENTS.md at the root of the agent's workspace (CLAUDE.md when only that file exists). The old 2,000-character field is now Description, a short summary for teammates. It keeps its Team API meaning, so no migration is necessary. The developer instructions tell the agent to keep its standing rules in that file. OpenBot adds the file text only for a CLI that does not read the file by itself (workspaceInstructionFiles in the provider descriptor), and for Claude in workspace-only mode. The Codex tool fingerprint includes the file when the instructions carry it. An empty profile title or description now shows as empty, so an agent does not save "General assistant" as its title. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Refuse an instructions save when the agent changed the file - The editor sends the text that the edit started from. Main refuses the save when the file is different now, and the editor shows the agent's text. - A save keeps the file mode. Reads allocate only the size of the file. - The prompt redacts the file text and escapes a closing agent_instructions tag. - The Codex fingerprint includes the file text, so a changed AGENTS.md starts a new session. - The profile tools call the field a description; rules go in the instruction file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep the agent prompt within its byte budget - Name the instruction file in the sentence about the user's instruction files. - Remove the added sentences from update_profile and the description field. - Call the field a description in the profile tool guidance. - Lower the agent context baseline to the new counts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Let Codex read the whole instructions file Codex reads 32 KiB of AGENTS.md by default. A file that the editor saves in a non-Latin script can be up to 128,000 bytes, so the Codex thread config sets project_doc_max_bytes to that size. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Show instructions as a preview and the agent's changes in the chat - Agent settings show the instruction file as formatted text. Edit opens the whole file in a dialog that saves only on Save. When the agent changed the file during the edit, the dialog keeps the user's text and says so; a second Save replaces the agent's version. - When a turn changes the file, the chat shows "Updated its instructions" with View and Undo. Undo saves the text from before the turn only while the file still has the agent's text. - A save in one place updates the preview and each chat line of the same agent. - The developer instructions ask for short bullets under headings. - The iPhone agent edit screen labels the field Description. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Do not show a user's save at turn end as the agent's change A turn end that read the file during a user's save, or after the write and before the save was reported, recorded the user's text as the agent's change. Undo then reverted the user's save. The change baseline now knows the save in progress and counts the saves. A chat line read that ended after an Undo set the old text again and showed Undo again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Do not add the instructions text when the CLI reads the file through a link When CLAUDE.md is a link to AGENTS.md, or the reverse, Claude reads the file by itself. The prompt then also carried the same text, up to 32,000 characters. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Show agent instructions as a page with a file bar The Instructions row in the Knows group opens a page, like Memories. A bar names the file and its folder, with Show in Finder and Edit. The file shows as formatted text, and Edit opens the editor on the same page. View in the chat line opens this page. Main finds the file from the agent id to show it in Finder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Clear the instructions request when settings close Settings opened again on the Instructions page after one click on View. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 10 days ago | |
Let the user exclude folders from an agent's writes (#3874) * Let the user exclude folders from an agent's writes In Workspace only mode, the Folders page has an "Excluded" group. The user can exclude a folder in the workspace, the shared folder or an added folder. Claude and the sandboxed providers block writes there; Codex gets an instructions line only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Move a duplicated agent's exclusions to its own workspace Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Stop a rename of a folder that holds an excluded folder On macOS, Workspace only agents could rename a parent folder of an excluded folder. The excluded folder then moved out of its Seatbelt rule and became writable. The profile now denies unlink and rename of each folder between a writable root and an excluded folder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 12 days ago |
| Files | Last commit | Last update |
|---|---|---|
| 9 days ago | ||
| 6 days ago | ||
| 2 days ago | ||
| 1 day ago | ||
| 1 day ago | ||
| 7 days ago | ||
| 24 days ago | ||
| 13 days ago | ||
| 24 days ago | ||
| 7 days ago | ||
| 18 hours ago | ||
| 1 month ago | ||
| 2 days ago | ||
| 1 day ago | ||
| 29 days ago | ||
| 24 days ago | ||
| 4 days ago | ||
| 1 month ago | ||
| 6 days ago | ||
| 8 days ago | ||
| 2 days ago | ||
| 2 days ago | ||
| 2 days ago | ||
| 2 days ago | ||
| 23 hours ago | ||
| 1 day ago | ||
| 1 day ago | ||
| 4 days ago | ||
| 1 month ago | ||
| 23 hours ago | ||
| 1 month ago | ||
| 14 hours ago | ||
| 14 hours ago | ||
| 20 days ago | ||
| 1 month ago | ||
| 1 day ago | ||
| 15 days ago | ||
| 1 day ago | ||
| 12 days ago | ||
| 1 month ago | ||
| 23 days ago | ||
| 2 months ago | ||
| 24 days ago | ||
| 10 days ago | ||
| 1 day ago | ||
| 1 day ago | ||
| 17 hours ago | ||
| 17 hours ago | ||
| 12 days ago | ||
| 2 days ago | ||
| 2 days ago | ||
| 23 hours ago | ||
| 23 hours ago | ||
| 2 days ago | ||
| 6 days ago | ||
| 3 days ago | ||
| 6 days ago | ||
| 18 hours ago | ||
| 2 days ago | ||
| 17 hours ago | ||
| 23 hours ago | ||
| 1 month ago | ||
| 10 days ago | ||
| 1 month ago | ||
| 2 days ago | ||
| 21 hours ago | ||
| 2 days ago | ||
| 2 days ago | ||
| 16 days ago | ||
| 1 day ago | ||
| 3 days ago | ||
| 14 hours ago | ||
| 1 day ago | ||
| 19 days ago | ||
| 4 days ago | ||
| 4 days ago | ||
| 18 days ago | ||
| 5 days ago | ||
| 5 days ago | ||
| 1 day ago | ||
| 27 days ago | ||
| 1 month ago | ||
| 23 hours ago | ||
| 1 month ago | ||
| 23 hours ago | ||
| 4 days ago | ||
| 23 hours ago | ||
| 23 hours ago | ||
| 2 days ago | ||
| 6 days ago | ||
| 2 days ago | ||
| 1 day ago | ||
| 14 hours ago | ||
| 1 month ago | ||
| 2 days ago | ||
| 2 days ago | ||
| 1 day ago | ||
| 1 month ago | ||
| 2 days ago | ||
| 18 hours ago | ||
| 25 days ago | ||
| 2 days ago | ||
| 15 days ago | ||
| 2 days ago | ||
| 1 day ago | ||
| 3 days ago | ||
| 11 days ago | ||
| 22 hours ago | ||
| 16 days ago | ||
| 5 days ago | ||
| 10 days ago | ||
| 12 days ago |