Minor Changes
-
ba3ccfd: The CLIs now say that they collect anonymous usage data, the first time they would send any, and
agent-native telemetry status|enable|disable|resetcontrols it for both CLIs.AGENT_NATIVE_TELEMETRY_DEBUG=1prints each event and sends nothing. Crash reports no longer carry raw messages, logs, paths, hostnames or anything from your code, and CLI Sentry reports follow the same off switches. Unknown commands are reported asunknowninstead of verbatim. See https://agent-native.com/docs/telemetry for everything the CLIs can send. -
6552f04: Let organizations hide Agent-Native.com hosted apps in Dispatch, group Dispatch's app pages into Pinned apps, Apps, and Agent-Native.com hosted apps, and keep the sidebar to pinned apps.
- Organization owners and admins get a "Show Agent-Native.com hosted apps" switch under Settings › Organization › Apps, backed by the new
get-hosted-apps-settingsandset-hosted-apps-settingsactions (recorded in Dispatch's audit log, on by default). When it is off, Agent-Native.com hosted apps leave Dispatch's app lists,list_apps, and the Dispatch agent's app context;list-connected-agentsstill returns them markedhiddenFromLaunchers, andcall-agentby name still reaches them. An unreadable stored value hides Agent-Native.com hosted apps and Settings offers to repair it. - Core adds
registerAgentContextAgentFilteranddiscoverAgentContextAgentsso an app can narrow the peers its own agent is shown (<available-apps>, relevant apps, @-mention Connected Agents,describe-workspace-apps) without changingdiscoverAgentsrouting. - Home, New chat, and All apps show Pinned apps, Apps, and Agent-Native.com hosted apps sections. The sidebar shows pinned apps, or until something is pinned, three suggested apps, above an All apps link. Every app row has a visible pin button, and pins stay in sync across surfaces. The toolkit apps rail accepts optional
sectionsandonTogglePinned(pin changes go to the host instead of a whole layout); without them it renders as before.
- Organization owners and admins get a "Show Agent-Native.com hosted apps" switch under Settings › Organization › Apps, backed by the new
-
810b9e0: Two writers changing one record no longer silently overwrite each other. Core adds
saveIfCurrentin@agent-native/core/save-conflict/server, which writes only when the record still has the revision the caller read and otherwise throws a typedsave_conflictcarrying the current value, andsaveWithMergein@agent-native/core/save-conflict, which merges and saves again before asking anyone. Toolkit addsuseSaveConflictPromptin@agent-native/toolkit/app/save-conflict, the one prompt for when both writers changed the same field. Forms, Clips and Mail use them first.
Patch Changes
- e3954dc: Docs, the workspace note
createprints, and the agent's scaffolding hint now saypnpm exec agent-native add-appinstead ofnpx @agent-native/core@latest add-app, so adding an app runs the workspace's installed CLI instead of downloading the latest Core each time. - 7c0e9ed: Stop reporting the abort AgentKit raises when a chat client is disposed as an unhandled browser error.
- c410ff4: Export
authorizeAutomationRunNowfrom@agent-native/core/triggers: the permission checkqueueAutomationRunNowmakes, without queuing a run, so a caller that runs in the request can be held to the same rule. - 01f229f:
set-resource-visibilitytakesresourceIdsto change up to 100 resources of one type in one call. It checks every resource before changing any, puts back earlier writes if a later one fails, and lists each resource as changed or unchanged. - e9a3946: Dispatch's home page checks which workspace apps you can open in a handful of database queries instead of about a dozen per app, so the app list no longer slows down as the workspace grows. Core gains
resolveAccessManyto check many resources of one type at once, with the same results asresolveAccess. - af3350d: Report a build step killed by a signal (usually an out-of-memory kill on a small CI host) as its own error issue instead of grouping it with ordinary build failures.
- c410ff4: Export
resolveBuilderOAuthRequestAccessStateand itsBuilderOAuthRequestAccessStatetype from@agent-native/core/server, so an app's readiness check can tell a saved Builder.io sign-in this deployment cannot decrypt (unreadable) from no sign-in (not_connected) instead of reading both as "not connected". - c410ff4: Report a stored Builder.io sign-in that this deployment's encryption key cannot open as
builder_credential_unreadable, instead of as an expired sign-in (builder_auth_error, "Sign in to Builder.io again"). A database copied from another deployment, or a rotated key, now says so. - 9b9e1bb: Export the collaboration outbox localStorage key prefixes from
@agent-native/core/collab/outbox-keys, so tests and tools that look for unsent edits match every format the client reads. - d5dd14b: Export
runInBackgroundfrom@agent-native/core/server, so an app can hand best-effort work to the platform'swaitUntil, or wait for it at most a moment where the platform has none, instead of holding its answer for the whole job. - 431c15a: Send tool-result images we host, like Design's screenshots, to the Builder gateway as image bytes instead of URLs. Claude models on Vertex refused URL images ("URL sources are not supported"), so a Design chat on Claude failed right after the agent took a screenshot to check its work, and every retry failed the same way. The saved chat keeps the URL; images we do not host are unchanged.
- 221972d: Fix
getDb()select subqueries (e.g.inArray(col, db.select(...).from(t))) throwing "unresolved query chain" on the first query after a cold start. - aea3de5: Stop refusing agent tool calls that pair
nullplaceholders with an empty list, which left models that pad every field, such as GPT-6 Luna, unable to run Design'sgenerate-design. - 264f987: An app can name a tool's card as an embed target without exposing a directory route, by setting
directoryRoute: falseon itsdirectoryProfile. Embeds that run in place, the way Claude shows them, now load and keep saving: the shell asks for the app page as HTML, sends a write's body as bytes rather than as a stream, and renews an expired session through the host. When the shell opens a tab itself, it now reports whether the browser blocked it, so a blocked tab no longer counts as opened and an opened one no longer makes the app open a second. - Release all public npm packages with a patch version bump.
- 9e1d54e: A database failure over MCP now names its driver error code without the query, as in
The database request failed (57014).. MCP analytics records the same code as the error type. A failure with no well-formed code keeps the plain text. - 4e36f27: Agent runs no longer end on
write_tool_outcome_unknownwhen a write action rejects its input before anything is saved. The framework now watches the database statements and the HTTP requests (any method but GET, HEAD or OPTIONS) a call sends, so a validation error thrown before the first write lets the agent correct the arguments and retry, while a failure after a write still stops the run; aSELECTthat calls a built-in function with side effects, such aspg_notifyorsetval, counts as a write; analytics, error reports, model calls, table locks and the framework's own schema setup do not count as writes. Actions that write somewhere the framework cannot watch, such as a socket, a file or a vendor SDK, callnoteExternalWrite(channel)before sending, and a write a retry provably cannot repeat can opt out withwithoutWriteObservation, both from@agent-native/core/action. - 13c7051:
presignS3GetUrltakestrustedEndpoint, so an app whose S3 endpoint comes from its deployment can sign links for a plain-HTTP endpoint such as a local MinIO. Without it, links still need HTTPS.readS3ErrorTextalso no longer throws when an error body fails partway, so a failed S3 request keeps its status in the error message. - 0b1ae94: Answer every session read on a page load from the shell's bootstrap read, even after the page wraps
fetch, and addfirstSessionReadAnswerandsubscribeFirstSessionReadAnswerso an app can tell whether reads it sent before the session answered still belong to the signed-in account. - f8879a0: Refuse agent tool calls that pair
nullplaceholders with an empty list again, unless the action setsemptyListsEraseNothing, so a model that pads every field can't wipe a stored list such as a Content view's hidden columns. Design'sgenerate-designsets it and keeps running under GPT-6 Luna. - dc3a21e: Treat null on an optional action field as "not provided" for every call prepared through
actionCallIntent(agent loop, MCP, HTTP, A2A, scripts), not only the agent loop. A padded call still refuses when it would clear data: a null on a nullable field, or an empty value that differs from the schema default. Declared read-only calls and empty values equal to the default run. The strip also walks nested unions. - 2bf999e: New apps and workspaces pin every
@agent-native/*package to the exact version released with the Core that created them, instead oflatestor a^range. A scaffold made shortly before a new release no longer installs a newer Dispatch, OTel, or Toolkit beside the older Core, which used to crashpnpm devwith missing exports such asappServerPath. - 0b1ae94: Read the session again when another tab broadcast a session change while this tab's app code was still loading. The early session read in the document head now records the broadcast marker it was sent under, and the session module compares it when it starts listening, so a sign-in elsewhere that nothing heard no longer leaves the tab on the previous account's session.
- 0b1ae94: Add
sessionReadIdentity()andsessionReadIdentityStatus()touse-session, so a request can record whom it was sent as (the session read open when it left, and the transport it went out on) and be checked against the session the tab accepts before its answer is shown. A routine session re-check holds requests sent while it is out until it answers, and keeps what it already accepted shown unless it finds another account. The embed auth interceptor and the MCP host runtime announce a change of fetch transport (FETCH_TRANSPORT_CHANGED_EVENT), and the session is read again over the new one. The demo-mode fetch wrapper passes the transport of the fetch underneath through, and the backend wrapper, which sends requests to the app server's origin, has a transport of its own for each transport underneath and server origin, so the page's session answer is never taken for it. Under either, an embed token change still reads as a new transport, and only the current bearer token is kept.sessionReadIdentity()takes the transport a request went out on ({ transport }) instead of its fetch, and the shell's bootstrap session read records its transport as it is sent (fetchTransportScript), so a token that changes before the app takes the answer makes it another transport's. A session answer taken from the shell's bootstrap read ages from when that read answered. A session read that hangs past the retry budget is abandoned without invalidating what is accepted, and the session keeps being read in the background, backing off, until the read it was waiting on answers. - 0b1ae94: Share a session answer only between reads sent with the same credentials, so a read that carries an embed token is never answered with the page's cookie session, or the reverse.
- bd816b3: Find-and-replace edits that miss only because of spacing around
: ; , < >(for example Prettier'spadding: 4pxagainst storedpadding:4px) now report the stored text as the closest match, and a multi-line quote against shorter content no longer returns an empty hint. The edit is still never applied loosely. - 8a7ba43: Download first-party templates over HTTPS by fetching only the files they need instead of the whole-repository archive, cutting
create,add-app, andtemplate syncdownloads from minutes to seconds. Downloads no longer needgitinstalled, and they retry for ten seconds when GitHub is unavailable. - 3bf6395: Add
syncInvalidationsAfter()touse-db-sync, which tells a read that answered with a sync cursor which invalidations sync asked for changes after it, including ones asked before anything watched for that read. ExportgetCurrentPollBaseline()from@agent-native/core/serverso an action can return the cursor it read at. - eee07e5: The WebMCP manifest now revalidates behind a host that compresses it. A compressed response reaches the browser with
-dfon its tag and the browser sends that tag back, so the server's exact comparison missed and every load downloaded the manifest again. The comparison now ignores that suffix, so a warm load gets the bodyless 304. - cb95f4f: Fix
pnpm devin multi-app workspaces failing withspawn pnpm ENOENTon Windows when only apnpm.cmdshim is on PATH. - 559011e: Start pnpm through a shell on Windows, where it is a
pnpm.cmdshim.agent-native createno longer says pnpm is missing when it is installed,agent-native amplify-streamcan run its build,agent-native deploycan build a workspace's apps, and Dispatch can add an app to a workspace there. - 5be202c: Fix background chat runs with image attachments failing with
submission_payload_attachments_mismatch: the worker no longer re-checks client attachment fingerprints against the sanitized durable dispatch payload. - 7abe86d: New-workspace-app instructions now tell the agent to keep
configureClientRouterBasename()inapp/entry.client.tsx, matching the shipped templates. - 2fe85f4: New apps scaffolded from the default template serve their root when mounted in a workspace at
/<app-id>, instead of returning 404. Workspace and starter guidance now points atconfigureClientRouterBasename()for mounted apps and atagent-native add-appfor adding an app to a workspace. - 4f32324:
WORKSPACE_DEFAULT_APPnow works from the workspace root.envinagent-native dev(variables already in the environment still win), and workspace Netlify and Vercel deploys send/to that app at build time instead of always sending it to Dispatch. - 89e73f0: Start a workspace's new app sooner and report it ready only once it serves: a
WORKSPACE_DEFAULT_APPthat isn't created yet starts as soon as it appears (without booting Dispatch), apps that need dependencies share one install, the install no longer stalls without a terminal, and non-browser requests to/are answered by the default app instead of a redirect. - Updated dependencies
- @agent-native/agentkit@0.224.0
- @agent-native/recap-cli@0.5.96