| Files | Last commit | Last update |
|---|---|---|
Let members manage MCP servers on the phone (#5886) A host with mcp-member-access-v1 lets a member manage its MCP servers, and the phone already sends the capability. The phone now uses the same rule as the desktop serverCanManageMcp, so a member sees the MCP settings and can connect Marketplace apps. Generated with [Devin](https://devin.ai) Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> | 2 hours ago | |
Use one registry for side panel panes (#5587) * Use one registry for side panel panes Each side panel pane now has its id, label key and icon in one record, SIDE_PANEL_PANES. The tabs, the Add menu and the launcher read it. The panel mode of a pane is its id, so a new pane needs no mode map. The work that one pane does when it opens or closes is in one typed record, sidePanelPaneActions. The common open and close code does not name a pane. Add docs/architecture/side-panel.md, which tells how to add a pane, show its content, control availability and release resources. Add scripts/side-panel-panes-e2e.ts, which checks the pane lifecycle in Storybook. Closes #4805 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Show panes in registry order and give new panes the panel width The launcher and the Add menu now show the available panes in the order of SIDE_PANEL_PANES. Before, they used the order of the list in ConversationPanels. The browser panel width now applies to each side panel view except Agent settings, so a new pane gets it with no change. Remove the paneOfMode wrapper. The side panel E2E reads only the pane tabs, and checks that a second agent keeps its own tabs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 1 day ago | |
Show the What's new notes in the app language (#5725) * Show the What's new notes in the app language The desktop What's new dialog and the Help menu news list read whats-new/<locale>.json for the app language. A release that a file does not have shows in English. Add the translations of 0.56.0 to 0.65.0 for the 14 translated languages. The headline split now finds the end of a sentence in Chinese, Japanese, Russian, Arabic, Hebrew and Korean. scripts/whats-new-translations.ts checks that each file has the shape of the English notes. release:preflight and the tag workflow run it, so a release cannot ship without its translations. * Load the What's new notes again when the language changes - The dialog loads the notes again when the shown language changes during a load or while it is open. The saved language can load after start. - The Help menu drops the result of a load for the previous language. - Load the English and translated files together, so a failed English load is never an unhandled rejection. - Split a sentence before Spanish ¿ or ¡, and after a German closing quote. - CI runs the translation shape check on each PR. | 1 day ago | |
Install the latest release when an older OpenBot opens newer data (#4983) * Install the latest release when an older OpenBot opens newer data An older OpenBot that starts over a database that a newer one migrated now installs the latest release through the in-app updater and opens again. When it cannot update, it shows a dialog with Download, Open guide and Quit, in place of the error box with only OK. The troubleshooting guide gets a section for this case. Fixes #4969 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Respect the update preference and report a failed install over newer data The recovery shows the download dialog when automatic downloads are off, when the install fails after the handover, and it does not install after the user chose Quit. It reuses the download link of the app archive warning. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Show the update box and the stalled-install dialog over newer data The main window never loads after the start stops, so the update box no longer waits for it: it shows with no parent on Windows and Linux, and on the shown window on macOS. The forced exit after a recovery install waits 10 minutes longer than the install timeout, so the download dialog shows after a stalled install. The electron-updater loader and the cache directory move to update-service.ts, and the preference file name to update-preference-store.ts, so both update paths use one copy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 4 days ago | |
Let users set the local scripts limit for each hour (#5232) * Let users set the local scripts limit for each hour Local scripts could send each agent only 30 messages and routine runs in one hour. A voice agent that sends many messages stopped at this limit. Add the account default "Requests an hour" in Settings > Agents > Local scripts: 30, 60, 120, 300 or 1,000. It is in its own "Limit" card, because no agent can override it. The scripts API reads the value for each request, so a change applies at once. A missing or invalid value in the preference file gives 30. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep the limit presets read-only and wrap the docs paragraph Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 3 days ago | |
Document AWS ECS and accept a small /dev/shm in the Docker image (#1820) * Document AWS ECS and accept a small /dev/shm in the Docker image Add docs/aws-ecs.md: run the image as an ECS service on EC2, with the seccomp profile in daemon.json, an EBS data volume, ECS Exec sign-in and CloudWatch logs. Fargate is not supported: it cannot set a seccomp profile, and SQLite WAL does not work on EFS. When /dev/shm is smaller than 1 GiB, the container entry script starts Electron with --disable-dev-shm-usage, so Chromium uses /tmp. Refs #1817 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix the ECS user data and the IMDS exposure in the ECS guide Use /dev/sdf and the volume UUID instead of nvme1n1, require IMDSv2 with a hop limit of 1, refuse to overwrite an existing daemon.json, get the seccomp profile of the image version, and say that the log is in CloudWatch. Link the guide from the README. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 29 days ago | |
Send Discord embeds from the messaging_post tool (#5895) * Send Discord embeds from the messaging_post tool An agent can give up to 10 Discord embed objects to messaging_post. The text is optional when the post has embeds. A long text goes in more than one post, and the embeds go on the last post. Each embed text and link is redacted, the same as the post text. Signal validates each embed with Discord's limits and sends it as it is. A host sends the embeds key only with at least one embed, so a plain post continues to work with an older Signal. Deploy Signal before the hosts. The tool shows an embed as an object with no fixed keys, and decodes the call with the full schema. The catalog budget goes up by 164 bytes. Fixes #5882 * Rename the release notes file to the branch name * Put Discord embeds on the first post of a long text When Signal or Discord refuses the embeds, nothing is posted now. Before, the first parts of a long text stayed posted and its last part was lost. messaging_post also accepts an empty embeds list as no embeds. * Let Signal read a Discord call with 10 embeds Signal refused a JSON Discord call larger than 64 KB. A post with 10 embeds can have 60 links of up to 2,048 characters, so a post that both checks accept got 413. The limit is now 512 KB. | 1 hour ago | |
Add Mistral as a built-in provider through Mistral Vibe (#5582) * Add Mistral as a built-in provider through Mistral Vibe OpenBot downloads Mistral Vibe 3.1.0 as a managed runtime and runs vibe-acp over ACP. Users sign in with the browser or set MISTRAL_API_KEY. Disconnect signs the CLI out with _auth/signOut. The sandbox keeps Vibe state in VIBE_HOME and trusts the workspace. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix two comments about ACP settings and additional directories Move the timeout comment back to #timed, and say in the comment that a flavor can also send additionalDirectories. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 1 day ago | |
Branch a conversation from an agent answer (#4208) * Branch a conversation from an agent answer "Branch in new thread" on the last agent answer of a finished turn, and "Branch from here" in the message menu, copy the conversation through that answer into a new side thread. The new tab opens with focus. A divider "Branched from {source}" follows the copied history and opens the source. The thread menu nests each branch under its source. - Migration 48 adds the branch link to projection_agent_threads. - The copy, the attachment clones, and the title come in one transaction. A retry with the same request id gives the same branch. A source with a running turn is refused. - Team API: new agent-thread-branches-v1 capability (protocol 9). - The HTTP client now reads the capabilities of the negotiated protocol. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep title numbers and stop a repeated jump after a branch - A branch of a thread titled "Fix login bug #4521" keeps "#4521" in its title. Only the " #N" of a branch with an automatic title is replaced. - The scroll to a message after "Branched from" ends when another tab opens, so the source does not scroll there again when it shows again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Show an archived source that the thread list leaves out The task list holds at most 50 threads, so an archived source can be absent. The branch link now has the source title from the host, null for a deleted source. The divider shows "deleted" only for a null title, and a click on an unlisted source restores it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Do not export the branch columns type Only the thread store uses it, so knip reported it as unused. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 9 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. | 1 day ago | |
Add Hebrew as an interface language (#5539) * Add Hebrew as an interface language Hebrew (he) is now a language in Settings, on desktop, web and mobile. The layout mirrors from right to left, as for Arabic, and the macOS window buttons move to the top right. The catalog has all keys, with the CLDR Hebrew plural forms one, two and other. The Polish label for the named default browser is now shorter, so that it fits in the Settings menu and the i18n e2e run checks all languages. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Translate three site texts that stayed in English in Hebrew Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Add the iPhone app release note for Hebrew Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Translate the new browser typing error in Hebrew Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 2 days ago | |
Register MCP sign-in again with localhost when 127.0.0.1 is refused (#5599) * Register MCP sign-in again with localhost when 127.0.0.1 is refused Some MCP authorization servers refuse a `127.0.0.1` redirect address at registration with `invalid_client_metadata`, and accept `localhost`. The MCP authorization specification names `localhost` redirects. OpenBot sent only `127.0.0.1`, so the sign-in stopped with "Client registration failed." before the browser opened. When the registration answer is 400 `invalid_redirect_uri` or `invalid_client_metadata`, OpenBot now registers one more time with the `localhost` form of the same address. The listener already answers both names. A stored registration that names the `localhost` form keeps it, and `/authorize` and `/token` send that form. Servers that accept `127.0.0.1` see no change. Fixes #5584 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Say that the localhost redirect comes only from a registration Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 1 day ago | |
| 2 days ago | ||
Remove unit tests and keep E2E and protected tests (#2051) * Remove unit tests and keep E2E and protected tests Delete 591 vitest unit test files and their test-only harnesses. Keep E2E and smoke scripts under scripts/, and keep vitest files only for migrations, schema parity, the renderer-to-main trust boundary, secret redaction, and check-rule fixtures. Remove the test runners that have no tests now (site-router, remote/api, contracts, brand, auth-api client), their CI jobs, and the transfer budget report. Remove code and dependencies that only the deleted tests used. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Set the E2E-only test policy and remove references to deleted tests AGENTS.md now permits vitest files only for migrations, the trust boundary, secret redaction and check-rule fixtures. All other behaviour gets an E2E script under scripts/. Remove references to deleted tests, harnesses and commands from docs, AGENTS.md files and skills. The release-upgrade-safety gates that ran a deleted test now use a manual check. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep migration tests and fix CI checks after the test removal Move the migration cases out of the deleted mixed test files into three migration test files: the v15 agent usage upgrade and rollback, the read-state baseline from schema v2, and the remote control plane and permanent invitation D1 migrations. Keep error.agent.noStartingModel for the text that older hosts send, and let i18n-check accept it. Lower two type baseline entries. Correct comments and docs that named removed tests or test commands. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove the empty test patterns from the knip configuration Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Add E2E checks for Signal secrets, IPC input decoding and analytics redaction - scripts/signal-security-e2e.ts starts the real Signal service with throwaway secrets. It checks the Telegram secret header, the Slack signature, signed account events, remote and route tickets, webhook headers, and that no frame or log line holds the bot token. CI runs it in the new Signal E2E job. - scripts/ipc-input-e2e.ts sends malformed requests from a running dev app and checks that the main process decoders refuse them. - scripts/analytics-redaction-e2e.ts checks that no captured analytics or failure report request holds a seeded secret. For this, OPENBOT_ANALYTICS_CAPTURE_URL sends analytics to a loopback capture server. Only an unpackaged build reads it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Check the renderer analytics path and path traversal in the E2E scripts The analytics E2E now loads the window again and waits for the renderer event, so the renderer send path cannot pass with no request. The IPC input E2E now sends an attachment id and a shared file path that try to leave their folder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove an unused optional parameter from the read-state migration test The parameter gave one exactOptionalPropertyTypes error, which the type ratchet refuses for a new file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 26 days ago | |
Show all apps in one Marketplace layout and add seven catalog apps (#3327) * Show all apps in one Marketplace layout and add seven catalog apps - The Marketplace has a side panel with Apps, Agents, Skills and "Your apps". Apps show in groups by category, in compact rows. - Every app page uses one layout: header, alerts, sections with one card each, Information, and a danger zone named for the app. - Connectors move from Server settings into Marketplace > Apps. Slack, Discord and Telegram get a danger zone that disconnects all. - Connector headers show a short tagline. The full description is in Information. - An expired plugin sign-in uses "Sign in again" in every place. - Add Neon, Prisma, Netlify, Railway, Atlassian, Todoist and Hugging Face to the catalog. The developer of each app is a name, not a web address. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep row edits on reconnect and reset the page on a side panel jump - A reconnect of a Marketplace app starts from the saved server row, so the user's own headers, environment and address stay. - An older read of the sign-in states does not replace a newer one. - When the side panel opens another app page at the same depth, the page scrolls to the top and forgets the place of the old page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Stop exporting two names that only their own file uses Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 13 days ago | |
Document provider terms for Claude subscriptions (#1477) * Document provider terms for Claude subscriptions Add docs/provider-terms.md. It tells how OpenBot runs Claude, quotes Anthropic's legal and compliance page, gives the risk for each use, and tells how to use an API key. Link it from the README and the hosted server sign-in section. Refs #1345 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Say that Connect starts the Claude.ai sign-in Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Shorten the provider terms page Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Say which Claude executable OpenBot runs first Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 1 month ago | |
Run Signal on two machines at the same time (#4209) * Run Signal on two machines at the same time The account service gives each server a home Signal machine (`REMOTE_SIGNAL_HOMES`). When the home stops, the server and its devices ask for a new home and move to the other machine. Auth events go to each Signal, and only failed targets get a retry. A cron checks the entry name `signal.openbot.run` and moves it to a healthy machine. TURN relays spread over more than one machine. All of this stays off until the production settings are set. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Do not export the entry check types that only its file uses Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep device peers when no other Signal can take the host - The host and its devices ask for a new Signal machine only when their ticket names a home. The entry Signal moves by DNS, so a new ticket for it names the same URL, and the host kept its device peers before. - When the account service gives the same home again, the host keeps its device peers and lets the hidden window connect again. - A released host build sends no signalHome. Its ticket request now removes the stored home, so its members do not wait on the old home. Ingress and the webhook relay send signalHome false and keep it. - A REMOTE_SIGNAL_URL that is not a ws or wss URL fails closed, so the entry check does not throw. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Wait longer between host checks while a device waits - A device that waits for an offline host doubles the wait after each ticket check that finds no move, up to 5 minutes, and starts again at 10 s after `ready` or a move. - The deployment note now says that a released host build removes its stored home. - The entry check e2e passes an empty zone instead of undefined. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 9 days ago | |
Let Hermes Agent install and sign in on a self-hosted server (#4999) * Let Hermes Agent install on a self-hosted server The Hermes Agent installer downloads a Node.js that needs libatomic.so.1. The server image and the VPS packages did not have libatomic1, and the openbot service user cannot install packages, so the install stopped. - Add libatomic1 to scripts/hosting/packages.txt. - Tell how to install Hermes for the service user, on Ubuntu and in Docker, in docs/self-hosted-server.md and the VPS guide. - Add scripts/hermes-server-e2e.ts (bun run test:hermes-server). It installs Hermes in the server image, starts the server, and runs a turn and a resume through the Hermes driver against a mock model. Refs #4881 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Add Download and Connect for Hermes Agent The Hermes row in Providers now has Download on a server and on a Mac or Linux computer. OpenBot runs the pinned official installer (v0.22.7, SHA-256 checked) as the OpenBot user, shows its stages as progress, and can cancel it. When Hermes is installed, the row shows Connect for the Nous Portal code. Windows and OPENBOT_HERMES_PATH keep the install guide. The desktop and web client now offer the code sign-in of a providers-v8 host for each provider that has a device code, as the iPhone app does. Before, Hermes, Kimi and GitHub Copilot had no Connect on a server. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Read server provider support from the descriptor A new provider on a providers-v8 host needs no Team API edit. The iPhone app shows Download for an installer provider, such as Hermes, and the routes e2e derives the hidden providers from each protocol's frozen vocabulary. The add-a-provider steps now say this. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep the Hermes install safe on errors and installed hosts - Show only catalog text on the row. A system error names private paths, so it goes to the log. - Do not run the pinned installer over an installed Hermes. It would move a Hermes that "hermes update" changed back to the pinned version. - Look for the Hermes command after the install, so a refresh that does nothing does not show a good install as failed. - End a stage wait when the stage exits, also when another process keeps its pipes open. - Record no install result when the host stops sending a status. - Use one download path in the renderer for both runtime kinds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Add Hermes stories to the server Providers settings The stories show the install guide, Download, the install progress with Cancel, and Connect. The story now gives the modal named values, not ternary props: the modal reads its props in effect callbacks, where a compiled ternary prop cannot create its memo, and each story stopped with PRIMITIVE_IN_EFFECT_CALLBACK. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove two exports that only their own file uses knip failed the Check job: HERMES_INSTALLER and parseManagedProviderId have no other user now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Do not offer Check for updates on an installed Hermes row An installed Hermes has the runtime phase ready, so the row offered Check for updates. The update store manages only managed runtimes and threw for Hermes. An installer provider now gets no update offer, as on the iPhone app. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 4 days ago | |
Send license emails from licenses@openbot.run (#4470) * Send license emails from licenses@openbot.run Send a thank-you email at the first payment of a license or a bundle. Send an email when a renewal payment fails, once for each invoice, with a link to the Stripe invoice page. Send an email when a paid license ends. A paid renewal, a cancel, and a trial send no email. EMAIL_LICENSE_FROM sets the sender. An empty value uses EMAIL_FROM. Account analytics generation 13 adds the `license` kind of `email_sent`. Closes #4399 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix license email edge cases from the review - Send the payment failed email only at Stripe's first try of an invoice. The claim stays only 7 days, and Stripe tries again for longer. - Send no payment failed email when the failed payment ended the license. - A trial whose first payment fails gets the welcome email when it is paid, and no ended email when it is not paid. Stripe keeps trial_end after the trial. - A discounted license shows no list price in the welcome email. - Add the license-trial-failed E2E scenario, and wait for the payment failed send line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep the license email input types private to their file knip reports them as unused exports. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 7 days ago | |
Send status webhooks to the tools of the team (#2392) * Send status webhooks to the tools of the team The notify job of the status-page workflow sends signed webhooks for incidents, maintenance and service check changes. Subscriptions are in the STATUS_WEBHOOKS secret. State and waiting deliveries are on the status-notify branch. Failed deliveries are tried again for about 11 hours. Slack and Discord formats are available. The feed stays the public way to follow the page. Closes #2335 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Send removal events and fix the review findings of the status webhooks - Send incident.removed and maintenance.cancelled when an open entry leaves the page for 2 runs. - Do not send the first update of a new incident or maintenance alone. - Sign <timestamp>.<delivery>.<body>, as the webhook routines do. - Alert only when the update or deploy job of the previous run failed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Add a notify script so that knip finds the status webhook script Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 23 days ago | |
Add a transparent window option on macOS (#2955) * Add a transparent window option on macOS Settings > General has a Transparent window switch under Theme, on macOS only. When it is on, main gives the main window the under-window vibrancy and a clear background. The page tints only the frame, the content card and the pages in the card; dialogs, menus and cards stay solid. While the switch is on, main sets nativeTheme.themeSource to the theme, because the blur takes its shade from it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Let knip accept screencapture in the appearance E2E script Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 16 days ago | |
Pin pages to the page rail (#3117) * Pin pages to the page rail Add a More button under the rail pages. Its menu lists Routines, Workflows, Tasks, Schedule and Usage. Each row opens its page, and a pin at the end of the row adds the page to the rail or removes it. Workflows and Usage start pinned. The renderer keeps the pin choices in localStorage, on the desktop app and on the web app. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep rail pins in step with other windows - Keep the More menu at the place where it opened, so a pin that moves the trigger does not move the rows under the pointer. - Open a page from the menu after the menu closes, so the page gets the focus. - Read the saved pins before a change, and read them again when another window or tab changes them. Keep choices for pages that this version does not know. - Show each pin on a touch screen. - Keep one list of pinnable pages in PageRail. - Update the page rail in docs/web-client.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 14 days ago | |
Accept Standard Webhooks requests on webhook routines (#4788) * Accept Standard Webhooks requests on webhook routines Composio, Svix, Clerk and Resend sign webhooks in the Standard Webhooks format and make their own signing secret. Before this change, a webhook routine accepted only the X-OpenBot headers, so an agent told the user that a Composio trigger could not connect to OpenBot. - Signal accepts the webhook-* and svix-* headers. It relays them only to a host that names "standard-webhooks" in its ingress hello. An older host gets 401. - The host checks the v1 signature with the raw secret or the base64 key after whsec_. The complete body becomes the event data, so a filter can read /metadata/trigger_slug. - A person can paste the sender's secret in the routine editor or on the chat card. Remote hosts advertise this with webhook-sender-secret-v1. The secret goes in the existing encrypted column: no migration. - Agent guidance names Composio, and request_api_key also covers passwords for local services such as IMAP or Proton Mail Bridge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix the review findings of the Standard Webhooks change - Signal checks the webhook format on the socket that gets the frame, not only before it reads the body. - Signal drops a webhookFormats list that it does not know, not the hello. - A whsec_ secret gives a base64 key only when it is exact base64 of at least 16 bytes. - A Standard Webhooks timestamp sets occurredAt only when it is ISO 8601. - The joined-server capability check needs webhook-sender-secret-v1. - The sender-secret dialog focuses its field, submits on Enter, disables the field while it saves, and has no delete icon. The action also shows beside a new secret, and a saved sender secret finishes step 2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep the secret row actions in one cell The secret row had four grid items in three columns, so the sender-secret action went to a new line. The actions now share the last column. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Do not export the Signal webhook delivery response type Knip reports it as an unused export. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 5 days ago |
| Files | Last commit | Last update |
|---|---|---|
| 2 hours ago | ||
| 1 day ago | ||
| 1 day ago | ||
| 4 days ago | ||
| 3 days ago | ||
| 29 days ago | ||
| 1 hour ago | ||
| 1 day ago | ||
| 9 days ago | ||
| 1 day ago | ||
| 2 days ago | ||
| 1 day ago | ||
| 2 days ago | ||
| 26 days ago | ||
| 13 days ago | ||
| 1 month ago | ||
| 9 days ago | ||
| 4 days ago | ||
| 7 days ago | ||
| 23 days ago | ||
| 16 days ago | ||
| 14 days ago | ||
| 5 days ago |