One Go core, thin typed clients
Auth, streaming, retries and error mapping are written once in Go and reused by every client. A new language is a thin typed shim — not a full port.
One product system
Start with one machine. Grow into a fleet.
Drive your whole fleet from code with typed Python and Node clients for machine commands, agent-assisted tasks, streaming output, and bots.
Drive your whole fleet from code with typed Python and Node clients for machine commands, agent-assisted tasks, streaming output, and bots.
Every platform ships baked inside one wheel and one npm package — no cmdop agent install, no notarization, no per-platform download. A runtime resolver picks the right build for the host at spawn time.
Python — PyPI
Node — npm
cmdop 1.1.1 on PyPI · @cmdop/sdk 1.1.0 on npm
The headline op streams a machine’s AI agent through the relay, surfaced as a clean async iterator with live output, completion, errors and approval prompts.
Auth, streaming, retries and error mapping are written once in Go and reused by every client. A new language is a thin typed shim — not a full port.
All five platform binaries ride inside one fat wheel and one npm package. End users just pip install or npm i — no cmdop agent, no optionalDependencies, no Gatekeeper notarization.
Drive your whole fleet from code with typed Python and Node clients for machine commands, agent-assisted tasks, streaming output, and bots.
Stream a machine’s AI agent as a typed async iterator, with approval prompts when work needs confirmation. The same interaction model as the app, now scriptable.
Telegram, Discord and Slack bots are now hosted entirely inside the SDK core. Start one with client.bots.run(...) and the Go binary runs the channel loop, driving machines.ask() per message. The SDK absorbed bots.
Every relay op is mirrored in both clients and gated by a cross-language parity check — a method in one language but not the other fails CI.
machineslist · get · info · spend · ask · messages · active_sessionfleetscrud · members · attach · detachtunnelsopen · close · list · get · sessionsschedulescrud · trigger · runskeyslist · issue · revokeskillslist · install · publishbotsrun · management (Telegram · Discord · Slack)Full reference for every namespace, the streaming model, and error handling.
The programmatic core every other cmdop product is built on. Install it, import it, ship.
import asynciofrom cmdop import Clientasync def main():async with Client() as client: # API token from envstream = client.machines.ask(machine="work-mbp",prompt="What's eating disk on /var?",)async for frame in stream:if frame.kind == "event":print(frame.text, end="", flush=True)elif frame.kind == "done":breakasyncio.run(main())