intentic
Create your workspace
The sandbox itself

System

The daemon itself: its identity, its event stream, its terminals, its browsers, its helpers

On this page(14 sections)

The group with the widest job. The identity read is what the daemon says it is, including the routes it implements, which is the one call that tells a newer client what this sandbox can do. The event stream is the sandbox-wide live feed. The rest is the machinery an agent leaves running: terminals and their history, browsers, and the records of helpers it delegated to.

14 calls. Pick one to open it, or use the list on the right.

GET/infoWhat this sandbox is

The sandbox's own identity and state: which workspace it holds, which image it runs, what it is called, and the list of calls it actually implements. Start here, because a browser is routinely newer than the sandbox it is talking to and this is how it finds out what is there.

What you send

Nothing. Call it as it is.

What comes back

FieldType
nameWhat this sandbox is calledstring
imageThe image it is runningstring
versionThe version of that imagestring
latestThe newest published version on its…string
updateAvailableWhether those two differboolean
runtimesWhich agent runtimes can serve a…object
channelWhich release channel this sandbox followsstring
previousImageThe image the last update replaced,…string
updateNotesWhat is in the update, in…string[]
moreUpdateNotesHow many further notes there are…number
breakingNotesWhat the update takes away, uncapped,…string[]
stagedAn update already downloaded and built…object
versionWhat the downloaded build says it…string
channelWhich channel it was taken fromstring
atWhen the download finished, in milliseconds,…number
Try itanswered in this tab
curl
curl "$SANDBOX/info" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.system.info();
GET/system/manifest-problemsSettings files the sandbox could not read

Anything the daemon tripped over in its own configuration on disk: a file it had to fall back from, a key it did not recognise, an entry it skipped. Separate from the identity call because it goes stale for a different reason, namely a file changing.

What you send

Nothing. Call it as it is.

What comes back

FieldType
pathThe file, as a workspace pathstring
problemsEverything currently wrong with itobject[]
kindWhat to do about it"unreadable" | "unknownKey" | "invalidEntry"
detailWhat exactly was wrongstring
suggestionThe name it was probably meant…string
Try itanswered in this tab
curl
curl "$SANDBOX/system/manifest-problems" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.system.manifestProblems();
POST/system/sessionTrade a sign-in for a session

Exchanges a verified sign-in, or a session that has not expired yet, for a fresh session the daemon minted. That session is the credential every other call carries, and calling this again with a live one renews it.

What you send

Nothing. Call it as it is.

What comes back

FieldType
tokenThe credential every other call carriesstring
expiresAtWhen it stops working, in milliseconds,…number
emailWho the sandbox verified you asstring
Try itanswered in this tab
curl
curl -X POST "$SANDBOX/system/session" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.system.session();
GET/eventsThe live event streamstream

A stream held open for as long as you want it, carrying heartbeats so a caller notices the sandbox dying at once, batches of file changes so a tree or an editor can refresh itself, and the roster of who else is looking. Give it an id for this connection to appear in that roster; leave it out and you watch without being seen.

What you send

FieldTypeWhere
clientIdstringquery

What comes back

FieldType
when event is "message"shape
dataobject
when kind is "hello"shape
workspaceIdstring
routesstring[]
shapesobject
buildstring
bootobject
when kind is "heartbeat"shape
when kind is "boot"shape
readyboolean
startedAtnumber
stepsobject[]
when kind is "workspaceChanged"shape
pathsstring[]
when kind is "reposChanged"shape
reposstring[]
when kind is "refsChanged"shape
reposstring[]
when kind is "runtimeChanged"shape
domainsstring[]
when kind is "presence"shape
usersobject[]
when kind is "agents"shape
agentsobject[]
revnumber
idstring
retrynumber
when event is "done"shape
dataunknown
idstring
retrynumber
when event is "error"shape
dataunknown
idstring
retrynumber
Try itanswered in this tab
curl
curl -N "$SANDBOX/events" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.system.events();
POST/system/presenceSay what you are looking at

Reports which view, conversation or file this connection is on, or that it has gone idle. The daemon fans it back out on the event stream so everyone else's roster updates.

What you send

FieldTypeWhere
clientIdrequiredThis connection's own id, the same…stringbody
idlerequiredWhether the person has stopped doing…booleanbody
viewWhich view they are onstringbody
sessionIdWhich conversation they have openstringbody
pathWhich file they are looking atstringbody

What comes back

FieldType
okAlways truetrue
Try itanswered in this tab
curl
curl -X POST "$SANDBOX/system/presence" \
  -H "x-intentic-control: $INTENTIC_TOKEN" \
  -H "content-type: application/json" \
  -d '{"clientId":"a1b2c3d4","idle":true,"view":"…","sessionId":"a1b2c3d4","path":"src/app.ts"}'
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.system.presence({
  "clientId": "a1b2c3d4",
  "idle": true,
  "view": "",
  "sessionId": "a1b2c3d4",
  "path": "src/app.ts"
});
GET/system/usageWhat has been spent

Token and cost totals per account, added up from the record of every finished turn.

What you send

Nothing. Call it as it is.

What comes back

FieldType
accountsobject[]
providerstring
accountstring
turnsnumber
inputTokensnumber
outputTokensnumber
cacheReadTokensnumber
cacheCreationTokensnumber
costUsdnumber
Try itanswered in this tab
curl
curl "$SANDBOX/system/usage" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.system.usage();
GET/system/terminalsOpen terminals

The terminal sessions this sandbox is holding, which is what a terminal panel rebuilds its tabs from after a reload. The live typing and output run over a separate socket; this is the list.

What you send

Nothing. Call it as it is.

What comes back

FieldType
sessionsEvery live surface the sandbox is…object[]
nameIts id, and what the close…string
labelWhat to call it on screenstring
kindWhat sort of thing it is:…"shell" | "panel" | "agent" | "job" … (5)
runningWhether it is aliveboolean
activityAtWhen it last produced output, in…number
exitCodeHow the last thing in it…number
commandWhat is running in it right…string
extensionIdWhich extension declared this process, when…string
processNameWhich of that extension's processes it…string
helpThe agent has stopped at something…object
requestIdWhat to send back when you…string
messageWhat the agent needs, in its…string
requestedAtWhen it asked, in millisecondsnumber
Try itanswered in this tab
curl
curl "$SANDBOX/system/terminals" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.system.terminals();
DELETE/system/terminals/{name}Close a terminal

Destroys one terminal session and whatever was running inside it.

What you send

FieldTypeWhere
namerequiredWhich terminalstringaddress

What comes back

FieldType
okAlways truetrue
Try itanswered in this tab
curl
curl -X DELETE "$SANDBOX/system/terminals/nightly%20changelog" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.system.killTerminal({
  "name": "nightly changelog"
});
GET/system/terminals/{name}/scrollbackA terminal's history as plain text

What has scrolled past in one terminal, as text you can select and copy. The live view is a picture of a screen on the far side of a socket, with nothing in the page to select, so scrolling back and copying is this call rather than a gesture.

What you send

FieldTypeWhere
namerequiredWhich terminalstringaddress
linesHow far back to ask fornumberquery

What comes back

FieldType
nameWhich terminal this is fromstring
textThe history, oldest line first, with…string
linesHow many lines you gotnumber
truncatedIt stopped because you asked for…boolean
Try itanswered in this tab
curl
curl "$SANDBOX/system/terminals/nightly%20changelog/scrollback" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.system.terminalScrollback({
  "name": "nightly changelog"
});
GET/system/browsersBrowsers the agent has open

Every browser a conversation currently has running and the pages inside each one. The picture of what they are showing comes over a separate socket; this is the roster.

What you send

Nothing. Call it as it is.

What comes back

FieldType
sessionsEvery browser the agents have running,…object[]
nameIts id, and what the close…string
labelWhat to call it on screen:…string
serverWhich browser drives it: the credential-free…string
runningWhether it is still openboolean
activityAtWhen it last did anything, in…number
finishedAtWhen it closed, in millisecondsnumber
helpThe agent has hit something only…object
requestIdWhat to send back when you…string
messageWhat the agent needs, in its…string
requestedAtWhen it asked, in millisecondsnumber
pagesEvery page it has openobject[]
idStable for the life of the…string
titleThe page's titlestring
urlWhere it isstring
activeThe one the agent last touched,…boolean
Try itanswered in this tab
curl
curl "$SANDBOX/system/browsers" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.system.browsers();
DELETE/system/browsers/{name}Shut a browser down

Closes one of the agent's browsers. Its next attempt to use that browser then fails as though it had crashed, which is the honest account of somebody pulling the plug.

What you send

FieldTypeWhere
namerequiredWhich browserstringaddress

What comes back

FieldType
okAlways truetrue
Try itanswered in this tab
curl
curl -X DELETE "$SANDBOX/system/browsers/nightly%20changelog" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.system.closeBrowser({
  "name": "nightly changelog"
});
GET/system/subagentsHelpers the agents have started

Every helper agent this sandbox's conversations have delegated work to, whichever tool started it, with what each one is doing.

What you send

Nothing. Call it as it is.

What comes back

FieldType
sessionsEvery helper this sandbox's conversations have…object[]
idThe id of the tool call…string
kindWhat sort of helper: one the…"subagent" | "codex" | "grok"
conversationIdThe conversation whose turn started it,…string
agentTypeWhat kind of helper it isstring
descriptionWhat it was asked to do,…string
modelWhich model it runs onstring
spawnDepthHow deep in the chain it…number
backgroundThe parent carried on working instead…boolean
statusHow it is going"pending" | "running" | "blocked" | "completed" … (7)
startedAtWhen it started, in millisecondsnumber
endedAtWhen it finished, in millisecondsnumber
activityAtWhen it last did anything, in…number
tokensWhat it has spentnumber
toolUsesHow many tools it has usednumber
lastToolThe last one it reached forstring
summaryIts report: what it concluded, without…string
errorWhy it failed, when it didstring
terminalThe terminal its command runs in,…string
Try itanswered in this tab
curl
curl "$SANDBOX/system/subagents" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.system.subagents();
GET/system/subagents/{id}/transcriptA helper agent's record

The full record of one delegated helper, in the same shape as any other conversation. It comes live from the parent turn while the helper works, and from stored history once it has finished.

What you send

FieldTypeWhere
idrequiredstringaddress

What comes back

FieldType
messagesThe conversation, in orderobject[]
roleWho said it"user" | "assistant" | "notice"
textThe wordsstring
sentAtWhen it was sent, in millisecondsnumber
attachmentsFiles attached to this message, as…string[]
checkpointIdThe saved point this message can…string
thinkingWhat the agent was reasoning aboutstring
toolsThe tool calls this part of…object[]
idThe call's idstring
nameWhich toolstring
categoryWhat kind of thing it does:…"read" | "edit" | "delete" | "move" … (9)
statusHow it went"pending" | "in_progress" | "completed" | "failed"
targetWhat it acted on, in one…string
locationsThe files it touchedobject[]
pathThe file, as a workspace path,…string
lineWhich line, counting from onenumber
contentWhat it produced: text, a change…object[]
typePlain output"text"
textWhat the tool saidstring
childrenCalls a delegated helper made, nested…object[]
idThe call's idstring
nameWhich toolstring
categoryWhat kind of thing it does:…"read" | "edit" | "delete" | "move" … (9)
statusHow it went"pending" | "in_progress" | "completed" | "failed"
targetWhat it acted on, in one…string
locationsThe files it touchedobject[]
contentWhat it produced: text, a change…object[]
childrenCalls a delegated helper made, nested…object[]
thinkingWhat the agent was reasoning about…string
thinkingWhat the agent was reasoning about…string
notesWhat the sandbox added to this…object[]
titleThe one line a reader sees,…string
textThe note itself, which is also…string
placedA person wrote this in the…boolean
noticeActionA one-press follow-up this recorded notice…"tierHold"
Try itanswered in this tab
curl
curl "$SANDBOX/system/subagents/a1b2c3d4/transcript" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.system.subagentTranscript({
  "id": "a1b2c3d4"
});
POST/system/computers/{id}/sandboxes/{slug}Drive a sandbox on one of your own computersstream

Start, stop, restart, update, rebuild, roll back or remove a sandbox running on a machine you own, relayed over the connection that machine holds open. The answer is a stream because the slowest of these takes minutes, and it is the same stream whichever you ask for. The daemon adds no opinion: the machine enforces its own permissions and a refusal arrives as the last line, in the machine's words, naming the switch to flip.

What you send

FieldTypeWhere
idrequiredstringaddress
slugrequiredstringaddress
oprequired"start" | "stop" | "restart" | "prepare" … (9)body
hashstringbody

What comes back

FieldType
when event is "message"shape
dataobject
when kind is "line"shape
textstring
when kind is "result"shape
messagestring
when kind is "error"shape
messagestring
idstring
retrynumber
when event is "done"shape
dataunknown
idstring
retrynumber
when event is "error"shape
dataunknown
idstring
retrynumber
Try itanswered in this tab
curl
curl -N -X POST "$SANDBOX/system/computers/a1b2c3d4/sandboxes/nightly-changelog" \
  -H "x-intentic-control: $INTENTIC_TOKEN" \
  -H "content-type: application/json" \
  -d '{"op":"start","hash":"…"}'
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.system.manageMachineSandbox({
  "id": "a1b2c3d4",
  "slug": "nightly-changelog",
  "op": "start",
  "hash": ""
});
More in The sandbox itself

Type to search every page, in the docs and the API reference.