SDKs
- bma-executor-sdk 1.5.1 (Go, TypeScript, Python). Go: a user’s image reaches a local brain (
ACPAgent) as an ACPimagecontent block when the agent declarespromptCapabilities.image(bma-dsh-acp >= 0.2.2) and the host can fetch the file (ACPAgentOptions.InputFiles, or the turn’s tools endpoint withPlatformTools); an image it cannot hand over ends the turn with a visiblesession.error(Anthropic API limits: PNG/JPEG/GIF/WebP, 5 MB, 8000 px, 100 images). APlatformToolRoutestale_turnrenewal waits for the reconnecting executor channel, and the Claude Code profile’s tool calls stream (MCP Streamable HTTP, SSE) so a call can run past Claude Code’s 60 s first-byte budget (approval waits, long commands). SeeCHANGELOG.md(1.5.1).
SDKs
- bma-executor-sdk 1.5.0 (Go, TypeScript, Python). Go: a local DSH brain (
ACPAgent) runs the model and thinking level a turn asks for: the host lists the models a turn may choose inACPAgentOptions.Models(capabilitymodels), a turn.startconfig.modeloutside that list is refused with -32602, andconfig.thinking_levelgoes upstream as the request’sreasoning_effort(bma-dsh-acp >= 0.2.2). Idle sessions no longer hold a slot:max_sessionscounts running turns, and resident sessions beyondMaxResidentSessionsare suspended least recently used first and resumed on their next turn.examples/local-dshadds-modelsand-allowed-root. SeeCHANGELOG.md(1.5.0). - bma-executor-sdk 1.4.1 (Go, TypeScript, Python). Go: when the platform refuses a turn’s tool credential (
stale_turn, as after the brain’s executor reconnects and the session moves to a new epoch),PlatformToolRoutegets a fresh one throughtools_token.refreshand sends the same call again with its idempotency key, so a tool answer lost in the outage still arrives (one execution). SeeCHANGELOG.md(1.4.1). - bma-executor-sdk 1.4.0 (Go, TypeScript, Python). Brain and hands on two computers (ADR-0029). Go:
ToolRoute,PlatformToolRouteandLocalToolRouteare public;AgentTurn.Tools()sends a turn’s tool calls to the platform’s tool gateway when its hands are on another machine,AgentTurn.EnvironmentInfo(),AgentTurn.ApprovalID(),Client.RefreshToolsToken/AgentTurn.RefreshToolsToken(tools_token.refresh); a tool answer lost to a network drop is fetched again with the call’s idempotency key (one execution).Options.LabelsandOptions.RemoteBrain.ACPAgenthosts the official Claude Code ACP agent with the node owner’s own credentials (ACPProfileClaudeCode, pinned claude-agent-acp 0.101.0, prewarmed), answersturn.startat once, and takes a host ceiling on tool permissions (ToolPolicy);CoreOptions.FileAccess,LaunchandToolOutputDir. Test packageconformance(cases T1–T11) for third-party brains and hands. Contract 1.4.0 snapshot (fs.skills_per_session). SeeCHANGELOG.md(1.4.0).
Platform
- Per-session skills.
sessions.createwithagent_with_overrides.skillsreplaces the agent’s skills for that session (omit to inherit,[]ornullto clear; creation only). Every session freezes each skill at the version resolved at creation (skr_…insession.agent.skills[].version); later uploads do not change running sessions. See Skills.
SDKs
- bma-sdk 2.1.0 (Go
github.com/beeos-ai/bma-sdk/v2, TypeScript@beeos-ai/bma-sdk, Pythonbma-sdk). NewSendAndStream/sendAndStream/send_and_stream: send the events, then open the resumable stream withLast-Event-IDset to thebma_resume_cursorof the send response, so frames written before the subscription are not lost. Within one sequence theuser.messagecan come aftersession.status_running; the send response id is the input (ain_…), matched to theuser.messageon the stream throughbma_input_id. Additive, no breaking change. See bma-sdk. - bma-executor-sdk 1.3.0 (Go, TypeScript, Python). Contract 1.4.0 (additive):
AgentCapability.harnesses[](the singleharnessis deprecated),AgentTurnConfig.harness,agent.custom_tool_use/agent.custom_tool_resultwithrequestCustomTool/respondCustomToolResult, andtools_token.refresh. Go only:Client.RefreshModelToken/AgentTurn.RefreshModelToken(model_token.refresh);ACPAgenthosts a local ACP brain (the platform model credential, refreshed when at most 10 minutes remain, and the deterministicappr_approval id) and re-checks every local tool call against the turn’s policy. Additive; seeMIGRATION.md(1.3.0).
SDKs
- bma-executor-sdk 1.2.0 (Go, TypeScript, Python). New
machine_idoption (defaultBMA_MACHINE_ID); token exchange and renewal use the executor’s own resource,POST /v1/machines/{machine_id}/tokenorPOST /v1/environments/{environment_id}/token. A machine token without a machine id keeps working through the legacyPOST /api/v1/executors/tokenalias. Also declares thefscapability and thefs.mount/fs.unmountmethods. Sessions that use custom tools run on a registered machine like any other session. Additive; seeMIGRATION.md(1.2.0).
SDKs
- SDK 1.0.0.
bma-sdkandbma-executor-sdk1.0.0 are published for Go, TypeScript and Python (npm, PyPI, Go module proxy).bma-sdkis a resource-style client (bma.agents.sessions.create,client.Agents.Sessions.New) with retries, auto-pagination and a typed event stream that reconnects like EventSource; the base URL is the API origin.bma-executor-sdkregisters one typed handler per tool (client.tools.bash.handle). Upgrading from 0.4: seeMIGRATION.mdin each repository.
Platform
- Ask before creating a machine. A tool with
always_asknow asks before the session’s machine is created; a denied or unanswered call provisions nothing. create_machineworks for agents created through/v1.
Platform
- Lazy machines. A session gets its machine on the first tool call that needs one. Chat-only sessions never hold a machine.
- Idle pause. Pools can pause idle machines instead of deleting them; paused machines keep disk and memory, do not count against quota, and resume on the next use.
- Subagents belong to their session. Results and questions return to the spawning session; a subagent sees only that session’s machines.
Platform
- Automatic session titles after the first turn, announced with
session.updated. - Environment desktop wallpaper (
config.desktop.wallpaper.file_id).
SDKs
- SDKs split by role.
bma-sdk(REST and/v1extensions, 0.4.2) andbma-executor-sdk(Executor Protocol, 0.4.9) replace the archivedbma-sdksrepository. Package names are unchanged. On PyPI the latest published versions are 0.4.1 and 0.4.8.