Appearance
Changelog
0.2.29 (2026-10-23)
Breaking changes
@grok/agent-sdk/extensions/cursor-grokbot-agentsis removed. Remove that import. The package has no replacement.
Behavior changes
- Rename commands and errors to agent-sdk
0.2.28 (2026-10-21)
Breaking changes
- Semantic search is removed. Use Grep. Read Migrate off semantic search.
CATCH_DELIVERY_ID_HEADERleft@grok/agent-sdk/channels. Remove that import. The npm package has no replacement.attachRelayMcpwas not a published export. Remove that import. The npm package has no replacement.CursorBackendClientwas not a published export. Remove that import. Clone a pull request with@grok/agent-sdk/scm.postRelaySlackMessagewas not a published export. Remove that import. The npm package has no replacement.
Behavior changes
- With deploy caps on,
agent-sdk deploystops at 20 deployments or 100 deploys in 24 hours. Read Limits. agent-sdk deployrefusespersistent: true. A running persistent deployment keeps serving.- A direct file-tool call respects
tools. A path outside the workspace fails. - With
local.sandboxon, file tools refuse a path outside the session workspace. @grok/agent-sdkdepends on@modelcontextprotocol/sdk1.32.1.- An MCP server that redirects to a different host or port fails.
agent-sdk initand the templates depend on zod 4.
New
claimIssueis newly public on@grok/agent-sdk/channels/issues.claimCheckpointis newly public on@grok/agent-sdk/channels/change-monitors.@grok/agent-sdk/scmis newly public.agent-sdk sessions --prodlists sessions on a Cursor-managed deployment.- Set
botScopesinslack-manifest.json, then runagent-sdk slack createagain. - Slack
post-fileacceptsalt_txtandinitial_comment. - Send
X-BDK-Session-Keyto keep one hosted session for that key. - A pull request on
<tenant>.ghe.comkeeps its own session. agent-sdk logs --prodprints process output and atool <name>line.agent-sdk session --prod --eventsprints the events.
Fixes
- A failed Slack file upload is reported on that thread.
0.2.27 (2026-10-16)
Breaking changes
- Each
handle.agentsentry is{ slug, url, info }. It no longer hasproject. Readinfoinstead.
Behavior changes
@grok/agent-sdkrequires@cursor/sdk1.0.38.- In project info, a function
needsApprovalis"dynamic"instead oftrue. - Project info has
schemaVersion: 1andarchitecture. Diagnostic paths are relative to the project directory. handle.projectis deprecated. Usehandle.agents.loadAgentProject,loadAgentProjects, andprojectInfoare deprecated. UseloadProject.rootondefineAgentis deprecated. Usefs. Setting both is an error.
New
loadProject(dir)loads a project without serving it. ItsinfomatchesGET /v1/info. Pass{ strict: true }to fail on warnings.serveaccepts a directory or aProjectfromloadProject.defineAgent({ fs })mounts your filesystem at/. Agent SDK mounts/tmpand/agent/skillsover it.- With
fs, the agent's skills are read-only at/agent/skills/<name>/SKILL.md. Setskills: falseto keep your own/agent/skills. - Listing a directory includes the files of mounts nested under it.
Fixes
- A local agent can use a model variant that needs Max Mode, such as Grok 4.7 with a 500k context window.
- A session that has been idle for 10 minutes releases its memory. Its next turn resumes the conversation.
0.2.26 (2026-10-16)
Breaking changes
serve({ otel })is removed. Deletebot/otel.ts,agent/otel.ts, andbot/instrumentation.ts. SetOTEL_*variables. Read Migrating from serve({ otel }).
Behavior changes
ctx.host.otelis deprecated. It still runs for this release. The first call emits one deprecation warning. SetOTEL_*variables. Record withmetrics.getMeterandtrace.getTracerfrom@opentelemetry/api.- A span started during a turn or a tool gets
cursor.conversation.idfrom the active context when the span does not set it. A metric does not. CallcurrentConversationIdfrom@grok/agent-sdk/oteland set the attribute yourself. See OpenTelemetry. - A turn waits for MCP OAuth only when a person can connect. That is a playground or HTTP chat turn, or a Slack message on a channel that shows Connect.
toolApprovals: trueshows Connect, and so doesbuildToolApprovalEventsinevents. A schedule, a reminder, a webhook, an eval, or a Slack channel without Connect does not wait. A required connection fails withReconnect <connection>. An optional connection is skipped. - A turn never waits to authorize an
optionalconnection, also in the playground. - A turn that waits for MCP OAuth stops after 10 minutes with
Reconnect <connection>.interrupt()also stops the wait. agent-sdk deployrejects a source host other than GitHub, gitlab.com, or Origin.- A new scaffold imports
zod/v4. A zod 3 schema and a zod 4 schema both still parse. agent-sdk deploywith no terminal lists a connector that needs sign-in as pending.
New
agent-sdk deploydeploys a bot from a gitlab.com repository.- When you omit
--cursor-events-repo, a GitLab deploy watches that project. A nested group is part of the path. - When that deploy cannot watch the project, the deploy still finishes. The CLI says the deployment is not watching the project.
- An agentic Slack reply can set
cards: { display: "plan" }. Slack shows thepost-cardsteps from that turn as one checklist. - A
titlenames that checklist. A title has at most 256 characters. - With no
cardsoption, Slack keeps one card for each step. send()returns a delivery id. SetdeliveryIdto choose it.nudge.deliveredandmessage.receivedinclude that id.
Fixes
- Public helper signatures use portable types. A webhook body is a
stringor aUint8Array. An environment map isRecord<string, string | undefined>. HostFilesApi.readtakes aHostFileTextEncoding. ABufferandprocess.envstill type-check.- OpenTelemetry ends each tool span when that tool finishes.
- With no OpenTelemetry endpoint, the process holds at most 2048 spans and 2048 log records.
- A follow-up after a redeploy resumes the same agent. A changed workspace path does not start a new conversation.
- In a Slack Connect channel, sender checks use the workspace where the app is installed.
- A
cursorAccountGitHub GraphQL call includes the repository. - A Slack bot with a lapsed MCP connection replies with a reconnect message.
0.2.25 (2026-10-14)
New
agent-sdk validate --jsonwrites one JSON object. Each diagnostic has a code.
Fixes
- OpenTelemetry metrics follow
OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE. The default stays delta. ctx.host.github.getOctokit()tries again after a failed lookup. A later call can succeed after a GitHub token becomes available.
0.2.24 (2026-10-13)
Breaking changes
- Install
zodin the project. The peer range is^3.25.0or^4.0.0. A new scaffold importszod/v3.
Behavior changes
setContinuationToken(null)releases the continuation key. The next delivery starts a new session.- Model fallback continues when a blocked model sends progress updates and no assistant text. Those updates are
user-message-appended,step-started, andstep-completed. - Read a secret inside a handler, a tool, or a callback. A
process.envread while the module is still loading returns an empty value on a Cursor-managed deploy. - In the Agentic Approver template, a
pathsglob is relative to the policy directory. - The package depends on
tsx4.23.15.
New
hmacSignatureAuthtakes an optionalseparator. One header can then carry several HMAC signatures. PagerDuty uses a comma.cursorCloudAgentsacceptscloud.teamMcpServers. The launch uses the team MCP servers you name.
Fixes
- On Cursor-managed hosting, OpenTelemetry reads the endpoint, the headers, and the resource after secrets load. You can remove a workaround that reads
OTEL_EXPORTER_OTLP_HEADERSagain.
0.2.23 (2026-10-09)
Behavior changes
agent-sdk migraterewrites a URL-secret MCP peer todefineConnection({ agent })in the migration pull request.agent-sdk migrateprints a checklist after the migration. It says when there is nothing to migrate.agent-sdk slack create --prodsays the deployment redeploys by itself.agent-sdk deployon a folder of several agents prints one command per agent. You run each command to deploy that agent.
New
- A Slack app can opt in to the
chat:write.customizescope. A post can then set its username and its icon. An app that leaves the scope off keeps its current scopes.