Skip to content

v0.85.0

Choose a tag to compare

@davidfarah2003 davidfarah2003 released this 17 Oct 22:41
d5a621e

Cotal 0.85.0 is out!

Grab it: npm i cotal-ai@0.85.0

Changes in this release

  • A detached Claude Code spawn no longer fails its startup confirmation when Claude skips the development-channels warning and opens its input screen. Claude 2.1.301 does that when channels are off for the session, for example under a Team or Enterprise organization that has not set channelsEnabled: true in managed settings. Such a seat now stays up, and gets mesh messages through its hooks only, so a message does not wake it while it is idle. When the warning appears it is still answered with one Enter, and an unknown startup dialog still gets no key and fails within 15 seconds. A launch recipe can now declare LaunchSpec.confirmReady, texts that show the harness reached its input screen. Seeing one on two screen reads in a row ends the startup watch with no key. The PTY, tmux, cmux, Orca and Herdr runtimes honour it; a custom runtime that ignores it keeps failing such a launch as before.
  • A detached Claude Code spawn into a folder Claude has not trusted no longer fails its startup confirmation when Claude draws the trust dialog as a numbered list with Yes first and selected. The managed launch now confirms that layout with Enter, and still answers the layout with No first by moving to Yes before confirming. It never confirms while No is selected. A startup choice can now be marked optional, so a choice that never appears does not block the next one. A custom runtime that answers LaunchSpec.confirmBefore with its own matcher must honour that flag; runtimes that use the core or seat startup sequence get it already.
  • The manager's turn command schemas now live in @cotal-ai/core as TURN_INPUT_SCHEMA and TURN_OUTPUT_SCHEMA. The manager registers them unchanged, so its cluster document and contract digests stay the same. The five runtime suites that serve a manager-shaped turn compile the same objects instead of their own copies, which had drifted from the manager's contract and could not notice it changing.
  • A process record that exists but cannot be read now fails with an error that names its path. readPidfile passed the underlying read error through unchanged, and an error raised at the read, such as EISDIR for a directory at .cotal/nats.pid, carries no path, so cotal down printed only EISDIR: illegal operation on a directory, read. The error now reads cannot read <path>: <reason> and keeps the original as its cause. A missing record still reads as absent.
  • The AG-UI mapping smoke's comments now name JsonlFileSource.read for the seal check at the cursor offset and for the fresh-adopt branch, and the durable-source.ts module doc for cursor opacity. They used to cite durable-source.ts by line number, and two of those lines had drifted onto unrelated code. No behavior changes.
  • AgentConfig.userAuth accepts bearer, a function returning a fresh bearer, in place of bearerCmd. A service that runs agents in its own process can now renew each agent's user-mode credential without executing a command per refresh. Such an agent has no manager-call bearer, so its spawn, despawn, persona and run calls are refused with a message that says so. Launched seats keep using bearerCmd unchanged.
  • @cotal-ai/connector-core now exports handleGatewayRequest, which serves one HTTP request to a remote gateway endpoint with the package's own MCP server and Streamable HTTP transport. A service that embeds the gateway authenticates the request and passes the result in. It no longer builds an MCP server, so its own MCP SDK or zod version cannot conflict with the one the tools use. The endpoint is stateless: each POST gets a fresh server and a JSON response, and GET and DELETE answer 405. GATEWAY_INSTRUCTIONS is the default server instructions text.
  • @cotal-ai/connector-core now exports registerCotalGatewayTools, the Cotal tool surface for a remote MCP server that serves many conversations at once. Each conversation calls cotal_connect with a name and passes the returned connection_id on every other call. A taken name moves to name_2 and onward only when the host reports a real name collision, and an invalid name is refused before anything is issued. A missing, unknown or other-account handle runs nothing and never falls back to another connection. The embedding service supplies authentication, credential issuance, revocation and storage through GatewayHost. cotalToolSpecs takes an optional set of offered tool names, and the orientation card lists only those.
  • cotal_send without a channel no longer defaults to a channel the agent may only read. On a mesh that enforces ACLs, the default is now the first channel the agent reads and may post to, so a read-only announcements channel listed first is skipped. An agent that may post to none of the channels it reads gets a clear refusal before anything is sent, instead of a broker permissions violation. On an open mesh the default is unchanged. The remote gateway's advertised cotal_send text says the same.

What's Changed

  • fix(claude): recognize current detached startup screens by @davidfarah2003 in #3948
  • fix(claude): get detached spawns past the current Claude Code startup screens by @mar-alsharif in #3940
  • feat(connector-core): add the remote gateway tool surface by @davidfarah2003 in #3953
  • feat(connector-core): accept a host bearer function for user-mode agents by @davidfarah2003 in #3954
  • feat(connector-core): serve gateway requests with the package's own MCP server by @davidfarah2003 in #3956
  • fix(connector-core): default cotal_send to a channel the agent may post to by @davidfarah2003 in #3957
  • test(connector-claude-code): name durable-source symbols instead of line numbers in the agui-map smoke by @davidfarah2003 in #3964
  • fix(remotion): build the header variants' bus paths with one shared helper by @davidfarah2003 in #3971
  • fix(remotion): derive the multicast out-wire afterglow from the shared cast by @davidfarah2003 in #3973
  • fix(remotion): check the unicast card's addressee when it renders by @davidfarah2003 in #3983
  • fix(workspace): name the record when a pidfile cannot be read by @davidfarah2003 in #3984
  • fix(runtime): compile the manager's turn contract in the stand-in suites by @davidfarah2003 in #3986

Full Changelog: v0.84.0...v0.85.0