| Files | Last commit | Last update |
|---|---|---|
Start a sleeping hosted server when a webhook routine gets a delivery (#7232) * Start a sleeping hosted server when a webhook routine gets a delivery Signal answers 503 when the host is not connected, as before, and now also asks the account service to start a sleeping hosted server. The sender's retry then reaches the server. A per-host wake interval of 30 minutes and a per-address lookup limit stop abuse. An older account service rejects the new route platform, so nothing starts there. * Let a failed webhook wake try again and limit all webhook lookups A start that the account service did not confirm no longer blocks the host for 30 minutes. All addresses together ask the account service at most the message limit a minute. A route of a host ID that another owner registered again does not start that host. The docs say that a later retry, not the next one, reaches the server. * Ask again to start a hosted server that stays starting after a failed resume A failed resume keeps the server row running, so the account service answers starting. A webhook now asks for the start again in that state, at most once in the same 30-minute interval for each host. * Count each webhook wake request against the lookup limits After a failed wake, the cached sleeping answer let each request send a new wake request with no limit. Each wake request now passes the per-address and total lookup limits too. | 2 days ago | |
Start workflows from GitHub events and change GitHub from workflows (#4288) * Fix workflow node fades and ports in browsers without scroll timelines Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Add the GitHub workflow contract and the workflows-github-v1 capability GitHub is a trigger type, an output target and a run source. The new capability carries the GitHub catalog, repository options, event history and a run with the last event. A client shows a workflow with a trigger type or an output target that it does not know as read-only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Add migration 49 for GitHub workflow runs, deliveries and actions Migration 49 rebuilds workflow_runs to accept the github run source and keeps every run id. It adds three tables: - workflow_github_runs: the item of each run that a GitHub event started. - workflow_github_deliveries: the event history of each GitHub trigger, and the per-item queue (a waiting row keeps its payload until it starts). - workflow_github_actions: each change that a GitHub output made, so a retry does not repeat it and the loop guard can find its own events. The latest schema takes the same run source line and tables. Tests cover schemas 46 to 48, a late failure and retry, newer and missing histories, constraint refusals and cascades. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Route GitHub App events through Signal to the hosts that watch them Signal gets POST /v1/github/events. It checks the App signature, reads only the installation and repository IDs, and sends the exact body to every host whose GitHub route ticket names the repository. It keeps no body. The account service signs the 5-minute route ticket after it checks, with the host's GitHub sign-in, which watched repositories that sign-in can see. D1 keeps no GitHub route. The host ingress socket holds a GitHub route through the new GitHubRelay, answers github-delivery frames, and records the offline gaps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Start workflow runs from GitHub events, one run per item - Match GitHub events to triggers by repository, event and filters. - Queue an event when a run of its item is open; start it when that run ends. Runs of other items start at the same time. - Skip echoes of the workflow's own actions (self) and the fourth run in 10 minutes that OpenBot's bot caused on one item (chain). - Keep the newest 50 events per trigger and record offline gaps. - Add the refused skip reason and caused_by_bot to the unreleased v49 table. - Add scripts/github-workflow-e2e.ts (host level). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Make the changes of GitHub outputs as OpenBot's bot A GitHub output makes one of the 10 changes through the GitHub REST API with the App's installation token. "Agent chooses" asks a model once and keeps only the repository's own labels and people. Each change writes a `sending` row before the call and a `done` row after it, so a retry does not post twice and the loop guard knows the change's events. A restart sends again only a change that a second call does not repeat. "Run with last event" starts a run with the newest matching item. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Show GitHub triggers and outputs on the workflow canvas The trigger and output cards get GitHub rows: repository, event, filters, action, labels and people, with "Agent chooses". The Events row lists what GitHub sent. Access and event alerts open GitHub, and Connect opens the connect dialog of the GitHub settings page. The run bar lists the open runs and the waiting events, and the canvas shows the steps of the open run that the user views. The renderer reads the catalog, labels, people and event history from the host through new IPC reads and Team API routes. GitHub shows only for an owner or admin on a host with workflows-github-v1. Stories replace the prototype stories. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Translate the GitHub workflow text into 12 languages Name the GitHub event and action labels as literal catalog keys, and remove two keys that no code uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Test the redaction of GitHub errors, and document GitHub workflows Add a Vitest that checks that GitHub's error text and a failed request put no token into a step's failure. Document the GitHub trigger path, the delivery outcomes and the Team API routes, and add release notes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove unused GitHub exports, and fix an optional field in the e2e Knip and the exactOptionalPropertyTypes ratchet failed the Check job. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Send not_planned to GitHub when an output closes an issue as not planned The saved close reason is notPlanned. GitHub refused it with "Please specify a valid state reason." The adapter now maps each saved reason to the state_reason that GitHub accepts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep trigger events off GitHub, and add repository search and loading rows - A GitHub output removes the framed trigger event from its text. A comment that has only the event fails with a clear error and posts nothing. - The repository menus have a search field. - The Labels and Person menus show "Loading…" while the host reads them. - The log says that the GitHub output failed, not that it made no change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Make each loop pass change GitHub, and keep Telegram when a ticket fails - A GitHub output keys its change by run, node and pass. A loop pass makes its own change. A retry or a restart of the same pass does not make the change again. - When the trigger event comes back in a loop, the output also removes the empty "Input N:" names of the event. - A failed GitHub or webhook ticket does not stop Telegram or the other routes on the shared socket. - The connector reads the App events from GITHUB_ROUTE_EVENTS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Let Signal pass GitHub events of up to 512 KiB An issue_comment or pull_request event can hold two texts of 65,536 characters each. Signal refused such an event with 413, and GitHub does not send it again. - GITHUB_DELIVERY_BODY_BYTES_LIMIT is 512 KiB. - The pending budget for each host is 768 KiB, and the socket backpressure limit is 1 MiB, so the largest event fits. - nginx gets a /v1/github/events location with the same body limit, no access log, and the 10-second wait of GitHub. - The Signal e2e sends the largest event and one above the limit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep an end marker in a comment inside its event, and stop loading after a failed options read The event frame ends only at the marker on its own line. The JSON of the event keeps no line break, so a commenter cannot end the frame early and get text posted as the bot. A failed read of repository labels and people now stores empty options. The menus stop showing "Loading". A change on GitHub reads them again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 12 days ago | |
| 9 days ago | ||
Update compatible dependencies (#3225) * Update compatible dependencies Apply the Dependabot compatible-updates group (#3159) on current main with a fresh lockfile. The fresh install removes the nested @types/node 26 and the second Vite 8 that the Dependabot lockfile added. Move the dmg-builder, expo, expo-router and expo-splash-screen patches to the new versions. The old patches apply without change. Keep these packages at their current versions: - @biomejs/biome 2.5.13: 2.6 adds rules with false positives and formats Markdown and YAML. - lucide-solid 1.33.0: the Solid 2 patch does not apply to 1.61. - storybook-solidjs-vite 10.7.1: 10.7.4 types fail 115 stories. - react and react-dom 19.3.0, react-native-gesture-handler 3.3, react-native-keyboard-controller 1.22.7: Expo SDK 58 and React Native 0.88 pin these versions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep jsdom 30.0.1 and @paper-design/shaders 0.0.80 jsdom 30.1.3 keeps focus on an iframe after blur(), so the ChatVisual activation test fails. The site artwork hash includes the shaders version, so 0.0.82 marks all committed article images as out of date. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 18 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> | 30 days ago |
| Files | Last commit | Last update |
|---|---|---|
| 2 days ago | ||
| 12 days ago | ||
| 9 days ago | ||
| 18 days ago | ||
| 30 days ago |