Skip to content

v0.121.2

Choose a tag to compare

@davidfarah2003 davidfarah2003 released this 29 Oct 00:47
18d75b8

Install or update: npm i -g cotal-ai@0.121.2

Changes in this release

  • Report a remote signed-in user's current read, post, direct-message and capability grant in cotal whoami. The stock issuer returns the authoritative grant beside each fresh bearer, while unavailable, refused and older issuers remain unknown instead of being inferred from the token or a successful exchange.

  • Report the recorded connection failure when sends or DMs cannot bind, including a
    refused first presence write. Inbox replies now identify a connection that is not
    ready while continuing to return locally buffered messages.

    A timed-out presence update reports that its outcome is unknown and may have landed.

  • Report the concrete publish subject and unknown storage outcome when a channel send or direct message times out. A missing publish acknowledgement does not prove that the broker rejected the message.

  • Keep static managed seats' self-stop, persona and spawn calls bound to their launching manager without changing their class-only credential grants.

  • assertValidKind validates endpoint kinds ("agent" or "endpoint"). CotalEndpoint, configFromEnv, loadAgentFile, and saveAgentFile share it, so COTAL_KIND and card.kind refuse any other value instead of passing an unvalidated string through to the card.

  • Derive Frame.depth and EngineFrame.depth from keys.path.length as a getter instead of storing a separate constructor field and incrementing it alongside keys.branch.

  • Keep the signed sender principal stable across one-shot sends from the same OS login and host on a static-auth mesh. Each send retains a fresh, short-lived credential with the existing operator permissions. Explicit credentials and signed-in user identities are unchanged.

  • Explain confirmed Claude Code hook deliveries when a later inbox read has no unread messages. The receipt names the latest handoff without returning message bodies again or changing acknowledgements.

  • Keep Claude Code hook context below its inline output limit. Deliver only complete messages that fit, count the remainder, and leave omitted or oversized messages unacknowledged for the inbox or a later hook.

  • Retain SIGINT and SIGTERM in the host's final shutdown diagnostic so a pty manager can name the received signal without inventing its sender.

  • Name an OpenAI-compatible model-not-found refusal during Jcode startup even when the harness wraps it as an internal error. Keep provider output private.

  • Validate terminal.tail in orca.readScreen so malformed terminal read --screen --json responses throw an error naming the command and terminal handle instead of a raw TypeError.

  • currentTerminal and currentTerminalForWait now share resolveTerminal and isGoneCode, so the synchronous status probe and the asynchronous exit wait resolve a terminal from terminal list and terminal show by one rule and classify gone error codes in one place. When a terminal's ptyId leaves terminal list, currentTerminal returns undefined without calling terminal show on the stale handle, and when terminal show returns an ok envelope with no terminal for a handle-only seat, currentTerminal throws the same authoritative-state error as currentTerminalForWait instead of returning the caller's input.

  • Both barrier evictors build their unverified eviction result, and the note they use when the delivery-admin rail cannot be reached, through one helper each. A change to that result or that note can no longer land in only one evictor. The helper logs through the options it is given, on each call, so a logger that reads its options keeps them.

  • cotal service add <name> --preset broker works again. A preset option named in camelCase, such as the broker's logFile, now takes its dashed flag (--log-file, as cotal up spells it) instead of refusing the whole preset as UNSUPPORTED.

  • A legacy bare cotal down now reads the delivery lease after it stops the delivery daemon. The daemon gives its lease release two seconds after the signal and then exits anyway, and down used to report it stopped and delete its credential in every case. When the release had not landed, the next cotal up could not recognise the row as the stopped daemon's, and its new daemon was refused with "a live lease already exists". When the row still names the stopped daemon's credential, or the lease cannot be read, down now keeps the credential and prints a line saying so, and the next up waits the row out and starts the new daemon.

  • Name cotal attach --name <seat> in backticks in the refusals for a Claude selection menu and for input that cannot be inspected.

  • Refuse terminal text input at Claude selection menus with guidance to attach and use arrow keys, instead of confirming the highlighted answer.

What's Changed

Full Changelog: v0.121.1...v0.121.2