Skip to content

@tanstack/ai-acp@1.0.0

Choose a tag to compare

@github-actions github-actions released this 22 Oct 15:18
· 14 commits to main since this release
Immutable release. Only release title and notes can be modified.
5651e07

Major Changes

  • #1840 f1b3f65 - TanStack AI 1.0.0. This release removes every API that was deprecated in 0.x. Read the upgrade guide before you upgrade: https://tanstack.com/ai/latest/docs/migration/v1
    • Removed all @deprecated exports, options, fields, and type aliases. Each one has a replacement that already shipped in 0.x.
    • Removed addToolApprovalResponse() from ChatClient and every chat hook. Resolve the bound tool-approval interrupt with resolveInterrupt instead. The devtools event tools:approval:responded is also removed.
    • Removed the old wire formats: the CUSTOM approval-requested and tool-input-available events, the [DONE] SSE line, the data copy of forwardedProps, pre-binding interrupt descriptors and their approval_required and client_tool_input reasons, and the STEP events that adapters sent next to REASONING_* events. Use a 1.0 client with a 1.0 server.
    • Removed the toolName alias from TOOL_CALL_START chunks. Read toolCallName instead.
    • threadId is now required on useChat and every other chat hook, ChatClient, the generation hooks and clients, chat(), summarize(), the generation functions, codeModeWithSnippets(), selectRelevantSnippets(), CompactionContext, and SummarizeInput. TanStack AI no longer makes a thread id for you. Pass a stable id for each conversation. createChatHook factory options no longer take threadId: pass it on each hook call. Octane generation hooks take threadId instead of id. @tanstack/ai-sandbox removes resolveDurableThreadId and DurableThreadIdRequiredError.
    • The published @tanstack/ai-octane/ui types are now strict. UI.Messages, UI.Message, UI.Part, and UI.Interrupts type their render children. ToolProps types part.input and part.output for the named tool. toolsComponents and interruptsComponents are required when the chat options declare tools or named interrupts. Code that relied on the old loose types can fail to compile.
    • A connection adapter's connect() and send() need the run context (with threadId) as their fourth argument. ChatClient and the generation clients pass it.
    • @tanstack/ai-sandbox: createToolBridgeCore(), startHostToolBridge(), a ToolBridgeProvisioner, and executeHostTool() take a required threadId. Bridged tools get it in their context.
    • @tanstack/ai-sandbox: the harness tool bridge and executeHostTool() refuse a tool with needsApproval. Before, the tool ran with no approval. Remove needsApproval, or run the tool with an HTTP adapter.
    • stream() and rpcStream() pass the AG-UI RunAgentInput for the run as the fourth factory argument, the same body the HTTP adapters send. Read it on the server with chatParamsFromRequestBody() or generationParamsFromBody(), so threadId, runId, and interrupt resume reach a server function. RunAgentInput is exported from @tanstack/ai/client.
    • A generation fetcher gets threadId and runId in its second argument, next to signal and headers. Pass them to the server generation call.
    • generationParamsFromBody() and generationParamsFromRequest() read the generation input from forwardedProps. A server that reads body.data gets undefined. Read body.forwardedProps instead. They also require threadId and runId and return them as strings, the same as chatParamsFromRequestBody() and the AG-UI RunAgentInput. A body that holds only the input is rejected.
    • Removed the readers for data saved in old 0.x formats (old Cloudflare run-log records, a bare UIMessage[] from client persistence, artifact records without blobKey).
    • Removed provider models that are shut down.
    • @tanstack/ai-react-ui, @tanstack/ai-solid-ui, and @tanstack/ai-vue-ui get no 1.0 release. Import from @tanstack/ai-react/ui, @tanstack/ai-solid/ui, or @tanstack/ai-vue/ui.

Minor Changes

  • #1755 39c1c79 - @tanstack/ai-acp/agent adds createAcpAgent and serveAcp, which serve a harness as an ACP v2 agent (experimental, like the draft protocol). Each wait of a turn goes to the editor by its kind: an approval becomes a permission request (with allow_always only when the answer schema takes always), a question or a human wait becomes a form elicitation, and a sign-in becomes a URL elicitation, when the editor declares them in initialize. A wait that the editor cannot answer is cancelled. Cancel cancels the running turn, and image, audio, and embedded file blocks go to the media store of the session. A prompt takes its place in the queue before its media is saved, and gives the place back when the session is idle. session/list lists the sessions of the harness from the session index of the host. The user option is the user of the editor: each session opens as that user, and the list shows the sessions of that user. It is required on a host with access. The agent holds one session handle per ACP session. session/close releases it, and the close of the connection releases them all (a session whose prompt runs keeps its handle until that prompt ends), so the host closes each session on idle. @tanstack/ai-acp now uses @agentclientprotocol/sdk 1.8, pinned to ~1.8.0 because the agent uses its experimental v2 entry point. The existing ACP client adapters keep working.

    One agent app serves one connection, and reads the editor capabilities from that connection. A second connection gets a clear error. For more connections, make one app for each: new AcpServer({ createAgent: () => createAcpAgent(options) }). A session that the agent made or opened in its connection takes prompts after the agent released its handle, also on a host with no stores.sessions.

Patch Changes