| Files | Last commit | Last update |
|---|---|---|
Keep the files of a Discord mention in GitHub outputs (#4633) * Keep the files of a Discord mention in GitHub outputs A workflow that a Discord mention starts now keeps the files of the message. The trigger payload has the name, type, size and address of each file, so agent steps can read them. A GitHub output that makes a new issue or a comment downloads the files from Discord and commits them to the orphan `openbot-attachments` branch of the target repository, with `[skip ci]`. The text links them there. GitHub has no attachment API for an App token. A file that is larger than 25 MB, or that cannot be copied, keeps its Discord link. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Copy Discord files before the GitHub change is recorded - Copy the files in a new `attachFiles` step before the action is recorded as `sending`. A restart during the copy runs the step again. - Give each download a 2 minute deadline. - A file that GitHub refuses keeps its Discord link. The other files still copy. - Copy up to 50 MB for each change. - Drop whole links when the links are longer than half of the GitHub text limit, so that the text stays. - Type the download error as `MessagingAdapterError`. - Name the files of the replied-to message in PRIVACY.md, the architecture notes and the changelog. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Give the upload of a file to GitHub a 2 minute deadline A file of 25 MB is about 33 MB of base64 JSON. A slow upload cannot send it in the usual 30 second deadline of a GitHub call. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 7 days ago | |
Let a GitHub workflow trigger watch many repositories (#4769) * Let a GitHub workflow trigger watch many repositories The trigger node keeps the list in the new `repositories` field, one name on each line. `repository` stays the first name, so older hosts and the mobile app continue to work. The reader uses the list only when its first line is the same as `repository`. - Backend: an event from any listed repository starts a run. "Run with last event" asks each repository in order. The "Same as trigger" output acts on the repository of the event. - UI: the repository row shows tags and a menu with check boxes, search, owner groups, and "Private" and "No events" chips. - Long tag names end with an ellipsis. The search divider no longer shows a bright focus line. Closes #4553 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix the review findings of the repository list - A check in the repository menu keeps the rows, so the keyboard focus stays on the row. Space now turns a check row on or off. - A waiting GitHub event of a repository that the trigger no longer watches does not start a run. The e2e script checks this. - The labels of the trigger's repositories are calculated once for each change, not for each tag. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove a stale repository list when the host saves a workflow An older client that changes the repository leaves the old list in the node. The host now removes that list on create and save, so it cannot come back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 7 days ago | |
Let a GitHub workflow trigger watch many repositories (#4769) * Let a GitHub workflow trigger watch many repositories The trigger node keeps the list in the new `repositories` field, one name on each line. `repository` stays the first name, so older hosts and the mobile app continue to work. The reader uses the list only when its first line is the same as `repository`. - Backend: an event from any listed repository starts a run. "Run with last event" asks each repository in order. The "Same as trigger" output acts on the repository of the event. - UI: the repository row shows tags and a menu with check boxes, search, owner groups, and "Private" and "No events" chips. - Long tag names end with an ellipsis. The search divider no longer shows a bright focus line. Closes #4553 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix the review findings of the repository list - A check in the repository menu keeps the rows, so the keyboard focus stays on the row. Space now turns a check row on or off. - A waiting GitHub event of a repository that the trigger no longer watches does not start a run. The e2e script checks this. - The labels of the trigger's repositories are calculated once for each change, not for each tag. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove a stale repository list when the host saves a workflow An older client that changes the repository leaves the old list in the node. The host now removes that list on create and save, so it cannot come back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 7 days ago | |
Add Slack as a workflow trigger and output (#4747) A workflow can start when someone mentions the OpenBot app in a Slack channel. Filters: workspace, channel, and text. A workflow can reply in the thread, post in a channel, or add a reaction in Slack. Migration 51 adds the 'slack' workflow run source. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 7 days ago | |
Add Telegram triggers and outputs to workflows (#4743) * Add Telegram triggers and outputs to workflows A new group conversation in a linked Telegram chat can start a workflow run. A Telegram output replies to the trigger message, posts in a chat, or adds a reaction. Migration 51 adds the "telegram" run source. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Put the chat in the Telegram workflow run key A Telegram message ID is unique only in its chat. Two chats can send the same ID, so the run key and the open-run check now include the connection. Before, the second message did not start a run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Share one mention loop for Discord and Telegram workflows The Discord and Telegram triggers now use one receiveMention helper, so a fix applies to both. Remove the export of the v50 run source line: the latest schema uses the v52 line now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Share one output send for Discord and Telegram workflows The Discord and Telegram outputs now use one sendChat helper. Only the plan, the place of the post and the send function are different. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 7 days ago | |
Add Slack as a workflow trigger and output (#4747) A workflow can start when someone mentions the OpenBot app in a Slack channel. Filters: workspace, channel, and text. A workflow can reply in the thread, post in a channel, or add a reaction in Slack. Migration 51 adds the 'slack' workflow run source. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 7 days ago | |
Keep the files of a Discord mention in GitHub outputs (#4633) * Keep the files of a Discord mention in GitHub outputs A workflow that a Discord mention starts now keeps the files of the message. The trigger payload has the name, type, size and address of each file, so agent steps can read them. A GitHub output that makes a new issue or a comment downloads the files from Discord and commits them to the orphan `openbot-attachments` branch of the target repository, with `[skip ci]`. The text links them there. GitHub has no attachment API for an App token. A file that is larger than 25 MB, or that cannot be copied, keeps its Discord link. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Copy Discord files before the GitHub change is recorded - Copy the files in a new `attachFiles` step before the action is recorded as `sending`. A restart during the copy runs the step again. - Give each download a 2 minute deadline. - A file that GitHub refuses keeps its Discord link. The other files still copy. - Copy up to 50 MB for each change. - Drop whole links when the links are longer than half of the GitHub text limit, so that the text stays. - Type the download error as `MessagingAdapterError`. - Name the files of the replied-to message in PRIVACY.md, the architecture notes and the changelog. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Give the upload of a file to GitHub a 2 minute deadline A file of 25 MB is about 33 MB of base64 JSON. A slow upload cannot send it in the usual 30 second deadline of a GitHub call. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 7 days ago | |
Add Discord triggers and outputs to workflows (#4531) * Add Discord triggers and outputs to workflows A workflow can start when a person mentions OpenBot in a Discord server. The trigger can filter by channel, role and text. A mention that a workflow takes does not go to the agent. A Discord output can reply to the message, post in a channel, or add a reaction. Migration 50 adds the 'discord' run source to workflow_runs. Only the owner or an admin can edit Discord nodes through the Team API. Signal now also passes on a mention of the bot's own role, which Discord's autocomplete often chooses instead of the bot. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix the Discord workflow review findings - A Discord output acts on a trigger message only in a run that a mention started. A webhook payload with the same frame cannot make OpenBot reply or react in Discord. - A Discord reply or post does not send the trigger's raw event. When the text is only that event, the step fails and tells the user to put an agent between the trigger and the output. - A mention that Signal gives again while its run is open is not skipped. After one run started, a later store failure does not send the mention to an agent too. - The Discord reply and post use the shared outbound post path. - Add scripts/workflow-discord-e2e.ts and run it in CI. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 8 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> | 10 days ago | |
Add Workflows to the mobile app (#3283) * Add Workflows to the mobile app The sidebar has Workflows. The phone shows the workflows of a server, their runs and the runs that wait for approval. It can pin, run, approve, retry and stop workflows, and it can edit and make workflows. The host's step connection rule moves to @openbot/contracts, so the phone checks a graph with the same rule before it saves. * Fix review findings in the mobile workflow editor - Show a file output as File, not as Notify me. - Save the graph only when it changed, and keep its new revision, so a failed rename does not cause a false conflict on retry. - Clear the schedule problem when the trigger page opens again. - Count a loose condition: do not connect it, and do not allow a second one. - Remove exports that knip reports as unused. * Use the app action colours for workflow buttons The main action uses the black or white action colour, and the other buttons use the plain control style. The HeroUI accent colours are not part of the OpenBot design. * Show the 3 newest runs on the mobile workflow page The workflow page grew with each run. It now shows the 3 newest runs and a row that opens a new Runs page. That page shows all runs, newest first, and loads older pages on request. | 14 days 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 | |
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 | |
Add Slack as a workflow trigger and output (#4747) A workflow can start when someone mentions the OpenBot app in a Slack channel. Filters: workspace, channel, and text. A workflow can reply in the thread, post in a channel, or add a reaction in Slack. Migration 51 adds the 'slack' workflow run source. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 7 days ago | |
Add Workflows to the mobile app (#3283) * Add Workflows to the mobile app The sidebar has Workflows. The phone shows the workflows of a server, their runs and the runs that wait for approval. It can pin, run, approve, retry and stop workflows, and it can edit and make workflows. The host's step connection rule moves to @openbot/contracts, so the phone checks a graph with the same rule before it saves. * Fix review findings in the mobile workflow editor - Show a file output as File, not as Notify me. - Save the graph only when it changed, and keep its new revision, so a failed rename does not cause a false conflict on retry. - Clear the schedule problem when the trigger page opens again. - Count a loose condition: do not connect it, and do not allow a second one. - Remove exports that knip reports as unused. * Use the app action colours for workflow buttons The main action uses the black or white action colour, and the other buttons use the plain control style. The HeroUI accent colours are not part of the OpenBot design. * Show the 3 newest runs on the mobile workflow page The workflow page grew with each run. It now shows the 3 newest runs and a row that opens a new Runs page. That page shows all runs, newest first, and loads older pages on request. | 14 days ago | |
Add Slack as a workflow trigger and output (#4747) A workflow can start when someone mentions the OpenBot app in a Slack channel. Filters: workspace, channel, and text. A workflow can reply in the thread, post in a channel, or add a reaction in Slack. Migration 51 adds the 'slack' workflow run source. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 7 days ago | |
Let workflow outputs post into OpenBot channels (#5572) * Let workflow outputs post into OpenBot channels Add the output target "chat-channel". The result shows in the channel as a note of the workflow: author kind "coordinator", id "workflow:<workflowId>", no task. No task starts and no agent answers it. The step id is the operation id, so a resumed step posts no second note. Only this computer offers the target. Over the Team API only an owner or admin can add or change one. Older clients show the workflow read-only (needsNewerApp). The phone shows the target and does not choose it. Rename the "Channel" target to "Slack, Discord or Telegram channel". Fixes #5559 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Name the messaging output target "Messaging place" The target also lists WhatsApp places, so "Slack, Discord or Telegram channel" was not correct. Use the name that the mobile app already uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Show one Channel target for OpenBot channels and messaging places "Send to" of a workflow output has one "Channel" choice again. Its channel list shows the OpenBot channels first, then the places of each messaging connection under the connection name, with a search field. An OpenBot channel stores the chat-channel target and a place stores the channel target, so saved workflows and the backend do not change. An OpenBot channel shows "Posts as: A note; no task starts". * Use a live OpenBot channel when an output goes back to Channel When the channel of the output is not in the list (for example, it is archived), the output takes the first open channel. --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 2 days 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 | |
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> | 10 days ago | |
Show which workflow branch has no answer at a model join (#5561) * Show which branch failed to the steps after a workflow join A join ran on the answers of the branches that ended well and dropped a failed or stopped branch with no mark. Now the join keeps the place of that branch with the reason it has no answer, and its error. An output step still posts only the answers. A retry of the failed branch runs the join again with every answer. Add scripts/workflow-join-e2e.ts. It checks the join, the retry and a restart on the real SQLite and workflow service. Fixes #5553 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep the missing-branch entries out of posts after a workflow join A condition and an approval hand their input on to the nodes after them. So an entry at such a join reached an output after it, and a post could show the error of a failed branch. Now only a model or agent join gets the entries, because those steps write new text. The error in an entry is cut at 300 characters, so a long provider error costs few tokens. The join E2E now also checks an approval join and an output after the approval. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Redact join entries and follow skipped steps to their failure A missing-answer entry goes into a provider prompt, so the error in it now goes through redactText. The error is cut by characters, so a cut never splits a surrogate pair. A stopped step now also gives its error. A step that was skipped because a step before it failed or stopped now gives that reason at the join. So a branch of two steps no longer drops out with no mark. A step after the branch that a condition did not choose still gives no entry. A run and a retry now use the same join rule: the forward edges of the node in the full graph. CI now runs the join E2E (test:workflow-join). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 3 days ago | |
Let workflow outputs post into OpenBot channels (#5572) * Let workflow outputs post into OpenBot channels Add the output target "chat-channel". The result shows in the channel as a note of the workflow: author kind "coordinator", id "workflow:<workflowId>", no task. No task starts and no agent answers it. The step id is the operation id, so a resumed step posts no second note. Only this computer offers the target. Over the Team API only an owner or admin can add or change one. Older clients show the workflow read-only (needsNewerApp). The phone shows the target and does not choose it. Rename the "Channel" target to "Slack, Discord or Telegram channel". Fixes #5559 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Name the messaging output target "Messaging place" The target also lists WhatsApp places, so "Slack, Discord or Telegram channel" was not correct. Use the name that the mobile app already uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Show one Channel target for OpenBot channels and messaging places "Send to" of a workflow output has one "Channel" choice again. Its channel list shows the OpenBot channels first, then the places of each messaging connection under the connection name, with a search field. An OpenBot channel stores the chat-channel target and a place stores the channel target, so saved workflows and the backend do not change. An OpenBot channel shows "Posts as: A note; no task starts". * Use a live OpenBot channel when an output goes back to Channel When the channel of the output is not in the list (for example, it is archived), the output takes the first open channel. --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 2 days ago |
| Files | Last commit | Last update |
|---|---|---|
| 7 days ago | ||
| 7 days ago | ||
| 7 days ago | ||
| 7 days ago | ||
| 7 days ago | ||
| 7 days ago | ||
| 7 days ago | ||
| 8 days ago | ||
| 10 days ago | ||
| 14 days ago | ||
| 16 days ago | ||
| 16 days ago | ||
| 7 days ago | ||
| 14 days ago | ||
| 7 days ago | ||
| 2 days ago | ||
| 16 days ago | ||
| 10 days ago | ||
| 3 days ago | ||
| 2 days ago |