This release focuses on workflows and runtime reliability. Workflows gain a Test mode for running a saved workflow (or a single node) on demand, first-class loops and condition error handling, and structured JSON output. Alongside that, several changes make agent turns and workflow errors visible, and the credential proxy now handles binary uploads and downloads. This version also replaces the Gmail push trigger with a polling model, adds an edit flow for MCP servers, and introduces the Dropbox and Wise integrations.
Workflows
Test mode
Workflows can now be exercised on demand without waiting for a real trigger.
- Run a full workflow or a single node with a user-supplied trigger payload, and see per-node results overlaid directly on the canvas as the run proceeds.
- A single node can be run in isolation by passing
testNodeIdplusseededOutputsfor its upstream dependencies. Test runs execute even when the workflow is disabled. - Test runs are seeded from real data where a provider supports it:
POST /:provider/samplefetches the latest real event (Gmail, Outlook, Google Forms) to use as the payload, without advancing the trigger's cursor. - Web: a Test button in the builder, a test-run store, the
WorkflowTestDialog,NodeTestOverlay, andRunDataViewcomponents, plus a status poller that refreshes every 3 seconds while a run is active.
Loops
- Nodes inside a loop body that are not explicitly mapped now receive the current item (
{{loop.item}}, withindexandtotal) instead of the entire source array. Loop instructions are templated the same way. resolveItemsToArraykeeps arrays raw and unwraps a single-array wrapper object so common shapes resolve to a clean list.- A loop records the
{ index, item, output }of the last executed body node, which is what downstream nodes read. - The builder gains a guided item picker (
LoopConfigForm) with a live count preview, clearer "loop start" / "loop end" labels onLoopNode, and a warning when a loop resolves to no items.
MCP servers
This version marks the stable release of the MCP server feature.
- An edit dialog is added for MCP servers (
mcp-add-dialogis renamed tomcp-server-dialogwith a create-or-edit mode, and an Edit button is wired into the list page). Editing changes name, URL, transport, auth, and headers through the existingPUT /:idand redactedGET /:id/dataendpoints, so the tool cache and agent assignments survive. - Header values are masked and echoed back as sentinels; the real secret never reaches the browser.
McpService.unredactDatais generalized into a nesting-aware sentinel restore (headers,stdio.env, oauth), fixingstdio.envsecrets being overwritten with the literal__REDACTED__and nested oauth/stdio being clobbered by the old shallow merge.
Runtime reliability
- Long-running turns can refresh their sandbox proxy token: the backend issues a refresh token alongside the 15-minute access token,
ProxyClient.authedFetchsingle-flights a refresh on a 401, andPOST /v1/runtime/refresh-tokenexchanges it. This keeps runs alive past the access-token lifetime.
LLM and tools
call_apisupportsmultipart/relateduploads (multipartSubtypewith ordered typed parts) for Google Drive-style uploads, and therun_coderequired parameters are clarified.
Binary support in call_api
call_api was text-only end to end (JSON string body, response.text()), which corrupted binary files through UTF-8/JSON encoding. Binary is now supported in both directions, with bytes referenced by workspace file path and base64 used only on the internal sandbox-to-host hop, so raw bytes never enter the LLM context.
- New tool inputs:
bodyFile(raw binary body),multipart[](form-data with file parts), andresponseFile(save a binary response to the workspace), with a 25 MB binary cap, reusingresolveWorkspacePathand thewrite_filemkdir path.
Chat context compaction
A thread's conversation can be summarized so the agent receives [summary] + [messages since] instead of the full history, reducing context-token occupancy. This is soft compaction: the visible scrollback is preserved, and only the LLM-facing view is shortened.
agent_threadsgainscontext_summaryandcompacted_atcolumns.AgentLlmProxyService.compactThread()summarizes viacomplete(), resetscontext_tokens, and emits acontext_compactedSSE event.- The internal messages route filters at the boundary and injects the summary in-memory, reusing the file-attachment injection pattern.
POST /:agentId/threads/:threadId/compacttriggers it, and a/compactchannel command exposes it on Telegram and Discord through the same shared method.- Web UI: a
ChatUsageBarbutton, a thread-menu item, and a "context compacted" divider.
Triggers: email polling replaces Gmail push
The Gmail app trigger previously used users.watch with Google Cloud Pub/Sub push, which cannot run or be tested without a public HTTPS endpoint, a per-user Pub/Sub topic and subscription, and 7-day watch renewal — so it never worked on localhost. It is replaced with a polling model, and the polling algorithm is factored into a reusable core.
Integrations
- Dropbox — an OAuth2 credential (
token_access_type=offlinefor refresh tokens,app_folder/full_dropbox) plus an access-token option.DropboxProvideraccepts it for knowledge-base import, and the docs are rewritten into access-token versus OAuth2 options. - Wise — a new integration.
- Google service scopes are now user-definable. The OAuth2 scope for Gmail, Google Analytics, Google Calendar, Google Docs, Google Forms, and Google Sheets moves from a fixed
oauth2.scopevalue to an editablescopeproperty with a default. Users can trim the default (for example, to request read-only access) when creating a credential.
Full Changelog: v1.1.0...v1.2.0