Protocol

The raw messages a program sends and receives on the workspace API: the hello line, calls, answers, events and error codes, for any language.

The messages behind the SDKs, for writing a client in any language. This page reflects workspace API version 0.30.

Paste this into your coding agent to write a client for the workspace API in a language with no SDK.

Show the prompt
Using the messages on this page, write a client for the Hivemind workspace API in the language I name.

1. Ask me for the language and the workspace folder. Make a token with the smallest role it needs: `hive grant create <name> -w <folder> --role view --expires 7d --json`. Keep the token out of this chat and out of git: read it from the environment variable `HIVE_DRIVE_TOKEN`, with `HIVE_DRIVE_SOCK` and `HIVE_WORKSPACE`.
2. Connect to `HIVE_DRIVE_SOCK` (a Unix socket on Linux and macOS, a named pipe on Windows). Within 10 seconds send one line: `{"hello": {"token": "<token>", "workspace": "<folder>"}}`.
3. Send calls as one JSON line each, `{"id": n, "method": "...", "params": [...]}`. Match answers by `id`; they can come out of order. A line without an `id` is an event, or a JSON list of events.
4. Handle every error code in the table on this page.
5. Call `agent.list` for the folder, print the result, then print events for 30 seconds. Show me the output.

REFERENCE https://hivemind.griiken.com/guide/api-protocol.md

Find the socket

hive grant create prints the socket's path (socket with --json). By default it is:

SystemSocket
Linux~/.config/hivemind/drive.sock, or $XDG_CONFIG_HOME/hivemind/drive.sock
macOS~/Library/Application Support/hivemind/drive.sock
WindowsA named pipe. Use the path hive grant create prints.

The app or hive host must be running, with the workspace open.

Messages

Every message is one line of JSON, both ways.

Hello

Send this within 10 seconds of connecting:

{"hello": {"token": "hgr_…", "workspace": "/home/you/work/api"}}

workspace is the workspace's folder. Leave it out when the token reaches only one workspace.

You get backMeans
{"hello": {"api": "0.30", "as": {"client": "dashboard", "role": "view", "workspace": "/home/you/work/api"}}}You are in. role is what you may do.
{"error": {"code": "FORBIDDEN", "message": "…"}}Wrong, revoked or expired token, or a workspace it does not reach. The connection closes.
{"error": {"code": "BAD_REQUEST", "message": "…"}}No hello, no workspace named, or the workspace is not open. The connection closes.

Calls and answers

A call has an id you choose, a method and a list of params. Its answer has the same id, and either a result or an error:

{"id": 1, "method": "agent.list", "params": ["/home/you/work/api"]}
{"id": 1, "result": {"seq": 0, "agents": []}}
{"id": 2, "method": "agent.start", "params": ["/home/you/work/api", {"program": "claude", "prompt": "Run the tests"}]}
{"id": 2, "error": {"code": "FORBIDDEN", "message": "agent.start is not open to your role on this workspace"}}

Where a method takes a folder (repo), give the workspace's folder. Answers can come out of order, so match them by id.

Events

A line without an id is an event, {"event": "…", "params": [...]}, about the workspace's tiles. Several events from one moment may arrive as a JSON list on one line.

  • agent.changed: an agent appeared, changed or went.
  • agent.event: an agent finished replying (turnEnded), started waiting on you (waiting), was answered (answered), came, went, or reported.
  • status.changed: an agent's status changed.
  • terminal.data: output of a terminal you opened.
  • tile.lines: the last line of terminals you watch (tile.watchLines) changed, at most every 250 ms.
  • file.changed: files changed in the workspace.

Error codes

CodeMeans
FORBIDDENThe role does not allow it. Nothing ran.
BAD_REQUESTWrong params, or a path outside the workspace. Nothing ran.
UNKNOWN_METHODNo method by that name.
NOT_FOUNDNo such tile, frame or workspace.
ASLEEPThe agent is asleep: wake it first.
NO_AGENTThe tile runs no agent (a tool, a browser, a shell), and the method asks an agent's reply.
UNSUPPORTEDThe agent cannot do that: it does not tell Hivemind when it finishes replying, or keeps no sessions.
TIMEOUTWhat it waited on did not come in time.
UNAVAILABLEIt needs one of your windows open.
RATE_LIMITEDToo many started at once. Ask again later.
DEPTH_EXCEEDEDAgents started by agents, too many levels deep. Start it from higher up.
OCCLUDEDSomething is drawn over the tile tile.look would picture; the message names it. Nothing was pictured.
FAILEDIt ran and failed. message says why.

A whole example

This connects, lists the agents and tries to start one. With a view token the start is refused. Both run on Linux and macOS, over a Unix socket.

import json, os, socket

SOCK = os.environ["HIVE_DRIVE_SOCK"]
TOKEN = os.environ["HIVE_DRIVE_TOKEN"]
FOLDER = os.environ["HIVE_WORKSPACE"]

s = socket.socket(socket.AF_UNIX)
s.connect(SOCK)
f = s.makefile("rw")

def send(msg):
    f.write(json.dumps(msg) + "\n")
    f.flush()

def call(id, method, *params):
    send({"id": id, "method": method, "params": list(params)})
    while True:
        msg = json.loads(f.readline())
        if isinstance(msg, dict) and msg.get("id") == id:  # not an event
            return msg

send({"hello": {"token": TOKEN, "workspace": FOLDER}})
print(f.readline())                   # {"hello": {"api": "0.30", "as": {…}}}
print(call(1, "agent.list", FOLDER))  # {'id': 1, 'result': {'seq': 0, …}}
print(call(2, "agent.start", FOLDER, {"program": "claude", "prompt": "Run the tests"}))

Start an agent and wait for its reply

With an agents token:

{"id": 3, "method": "agent.start", "params": ["/home/you/work/api", {"program": "claude", "prompt": "Run the tests"}]}
{"id": 3, "result": {"tile": "…"}}
{"id": 4, "method": "agent.read", "params": ["<tile>", 600000]}
{"id": 4, "result": {"text": "…", "finalStatus": "turn", "truncated": false}}

agent.read waits up to the milliseconds you give for the agent to finish replying. finalStatus is turn, timeout, working, idle, closed or waiting. A tile that runs no agent is refused NO_AGENT, and an agent asleep ASLEEP.

The full protocol is spec/workspace-api.md in the repository.

Last validated for Hivemind 2026.10.3.

Edit on GitHub

On this page