ntm now registers with the Python Agent Mail server, --robot-spawn can launch OpenCode panes, and --robot-capabilities is about half its former size. Follow-up to GitHub issue #333.
Upgrade notes
--robot-capabilitiessurfaces[]entries are slimmer. Each entry now carries only the surface-level metadata thatcommands[]lacks (paginated,paginated_reason,consumer_guidance,boundedness,follow_up,action_handoff,request_semantics,attention_ops,explainability,lifecycle) and joins tocommands[]byname. Flags, descriptions, parameters, examples and transports are no longer repeated there. A consumer that read those fields fromsurfaces[]should read them from the matchingcommands[]entry. The full document drops from 431 KB to 236 KB; nothing was removed from the document as a whole (2af3ec36, ee589e7e).
Added
--robot-spawn --spawn-oc=N[:model]launches OpenCode panes through the same command template asntm spawn --oc(the built-in default or[agents] oc); REST spawn takesoc_count, and jobs takeoc_model. There is no effort setting, since the OpenCode TUI has none.--spawn-waitwaits for OpenCode's own composer rather than a shell prompt. The capabilities document lists the flag with an example (a6d454a8, 2af3ec36).- The README documents OpenCode panes and how to let them run unattended (OpenCode 1.18+
--autovia[agents] oc, or OpenCode's ownpermissionconfig) (a6d454a8).
Fixed
ntm spawnfailed withensure_project failed (HTTP 400)against the Python Agent Mail server (GH #333). That server's/mcpendpoint, ntm's default, is a stateful MCP endpoint that rejects any request without a session ID, and ntm never ran the MCPinitializehandshake. When a server rejects a request for lack of a session, ntm now runs the handshake once, keeps the session ID for later calls, and retries. Concurrent first calls share one handshake, and a server that keeps rejecting the session gets one handshake per call, not a loop. Servers that answer one-shot requests (the Rust server,/api) never see a handshake. Error messages now quote the server's own text instead of a bare status line. The same server also rejected agent registration over the optionalpane_idargument; ntm retries once without the pane binding in exactly that case (2916aa5c, bb2d57f0).--robot-contextreportedmodel: unknownfor panes started with an explicit model such as--oc=1:MODEL, because it guessed from the pane title. It now reports the model recorded in the pane's launch spec and guesses only for panes without one. Robot-spawned panes of every type now record their resolved model, alias and effort, asntm spawnpanes already did. The context budget uses the recorded model only when the model registry knows it; otherwise it keeps the agent family's limit, so an agy pane keeps gemini's 1M window andopus[1m]keeps claude's (a6d454a8, a43f4a82).docs/openapi.jsonis regenerated for the slimmer capabilities surfaces and picks up routes and responses added since 2026-09-17 (ee589e7e).
Changed
- The full
--robot-capabilitiesdocument is 236 KB, down from 431 KB, and the e2e size budget is now 300 KB so the duplication cannot come back unnoticed (2af3ec36).
Install / upgrade
curl -fsSL https://raw.githubusercontent.com/Dicklesworthstone/ntm/main/install.sh | bashExisting installs: ntm upgrade. Homebrew: brew upgrade dicklesworthstone/tap/ntm. The VS Code extension is attached as ntm-vscode-1.36.1.vsix (code --install-extension ntm-vscode-1.36.1.vsix).
Each archive has a matching .sha256; SHA256SUMS covers all of them.
Full Changelog: v1.36.0...v1.36.1