Capabilities
The outside systems this sandbox is wired into, and connecting a new one
On this page(11 sections)
- Everything this sandbox is connected to
- Connect something, or change a connection
- Disconnect something
- Rename a connection
- Replace a stored credential
- Re-check one connection
- A connection's settings, credentials included
- Read a plugin marketplace
- Stop suggesting this connection
- Sign in to a connection by hand
- Mint a one-time code
A capability is a system the agent can reach: a forge account, a chat server, a database, one of your own machines. These routes connect and disconnect them, carry the credential each needs, report whether a connection is live, and drive the interactive parts of a sign-in, including a one-time code.
11 calls. Pick one to open it, or use the list on the right.
GET/capabilitiesEverything this sandbox is connected to
Each connection with its live state, the settings that are safe to show, and the names of the credentials it holds. The values of those credentials are never in the answer, on any route but one.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
capabilitiesWhat this sandbox is connected to | object[] |
idThe connection's id | string |
kindWhat sort of thing it is | "devops" | "monorepo" | "mcp" | "service" … (19) |
statusWhether it is working | object |
stateWhether it is live, still coming… | "active" | "pending" | "error" | "inactive" |
detailWhat is wrong, in words a… | string |
codeA short marker for that reason,… | string |
configIts settings, minus anything secret | object |
secretsWhich credentials it holds, by name | string[] |
recommendationsThings worth connecting, worked out from… | object[] |
cardWhich connection is being suggested | string |
evidenceWhat was seen that prompted it:… | string |
reasonThe same claim in words, without… | string |
prefillSettings the scan could read, to… | object |
curl "$SANDBOX/capabilities" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.capabilities.list();POST/capabilitiesConnect something, or change a connectionstream
Writes a connection and streams the work of applying it, because some kinds provision real infrastructure and take a while. Sending an id that already exists edits that connection: this is the edit as well as the create. Since a caller is never shown stored credentials, it marks the ones it is leaving alone and the daemon fills them in, which is the only way to change one setting without retyping a key.
What you send
| Field | Type | Where |
|---|---|---|
when kind is "devops" | shape | body |
idrequired | string | body |
configrequired | object | body |
when kind is "monorepo" | shape | body |
idrequired | string | body |
configrequired | object | body |
when kind is "mcp" | shape | body |
idrequired | string | body |
configrequired | object | body |
urlrequiredWhere the tool server answers | string | body |
tokenThe credential it needs, if any | string | body |
when kind is "service" | shape | body |
idrequired | string | body |
configrequired | object | body |
servicerequiredWhich service to provision | "signoz" | "outline" | "paperless" | "openproject" … (6) | body |
domainrequiredThe address it should answer on | string | body |
onrequiredWhich machine to put it on | string | body |
exposerequiredHow it should be reachable | string | body |
when kind is "integration" | shape | body |
idrequired | string | body |
configrequired | object | body |
providerrequiredWhich outside service's credential to make… | "stripe" | body |
when kind is "cli" | shape | body |
idrequired | string | body |
configrequired | object | body |
providerrequiredWhich tool to give the agent | string | body |
when kind is "plugin" | shape | body |
idrequired | string | body |
configrequired | object | body |
urlrequiredThe repository to take the plugin… | string | body |
refA branch, tag or commit to… | string | body |
pathWhere inside the repository the plugin… | string | body |
tokenA credential for a private repository | string | body |
when kind is "extension" | shape | body |
idrequired | string | body |
configrequired | object | body |
urlrequiredThe repository to take the extension… | string | body |
refrequiredThe exact commit to install, in… | string | body |
pathWhere inside the repository the extension… | string | body |
tokenA credential for a private repository | string | body |
tierWhether installing this donates credits to… | "free" | "premium" | body |
registryWhich registry this install came from,… | string | body |
when kind is "ssh" | shape | body |
idrequired | string | body |
configrequired | object | body |
when auth is "key" | shape | body |
hostrequiredThe machine's address | string | body |
portWhich port it listens on | number | body |
userrequiredWhich user to connect as | string | body |
privateKeyrequiredThe private key, whole | string | body |
when auth is "password" | shape | body |
hostrequiredThe machine's address | string | body |
portWhich port it listens on | number | body |
userrequiredWhich user to connect as | string | body |
passwordrequiredThe password | string | body |
when kind is "vpn" | shape | body |
idrequired | string | body |
configrequired | object | body |
when provider is "wireguard" | shape | body |
configrequired | string | body |
autoConnect | "on" | "off" | body |
when provider is "fortinet" | shape | body |
serverrequired | string | body |
port | integer | body |
usernamerequired | string | body |
passwordrequired | string | body |
trustedCert | string | body |
realm | string | body |
autoConnect | "on" | "off" | body |
when provider is "ipsec" | shape | body |
serverrequired | string | body |
presharedKeyrequired | string | body |
localId | string | body |
remoteId | string | body |
username | string | body |
password | string | body |
ikeVersion | "1" | "2" | body |
pfs | "on" | "off" | body |
dhGroup | "2" | "5" | "14" | "15" … (7) | body |
aggressive | "on" | "off" | body |
routedNetworks | string | body |
autoConnect | "on" | "off" | body |
when kind is "exit" | shape | body |
idrequired | string | body |
configrequired | object | body |
when provider is "tor" | shape | body |
country | string | body |
autoStart | "on" | "off" | body |
when provider is "vpngate" | shape | body |
country | string | body |
autoStart | "on" | "off" | body |
when provider is "wireguard" | shape | body |
configrequired | string | body |
country | string | body |
autoStart | "on" | "off" | body |
when kind is "docker" | shape | body |
idrequired | string | body |
configrequired | object | body |
gpu | "on" | "off" | body |
registryMirror | string | body |
insecureRegistries | string | body |
addressPool | string | body |
when kind is "browser" | shape | body |
idrequired | string | body |
configrequired | object | body |
platformrequired | string | body |
username | string | body |
password | string | body |
identity | string | body |
purpose | string | body |
openedAt | string | body |
exit | string | body |
when kind is "identity" | shape | body |
idrequired | string | body |
configrequired | object | body |
emailrequired | string | body |
password | string | body |
mailbox | string | body |
loginUrl | string | body |
openAccounts | "on" | "off" | body |
exit | string | body |
when kind is "host" | shape | body |
idrequired | string | body |
configrequired | object | body |
shell | "on" | "off" | body |
write | "on" | "off" | body |
screen | "on" | "off" | body |
control | "on" | "off" | body |
sandboxes | "on" | "off" | body |
sandboxRemove | "on" | "off" | body |
roots | string | body |
platformrequired | string | body |
when kind is "agent" | shape | body |
idrequired | string | body |
configrequired | object | body |
commandrequired | string | body |
name | string | body |
env | string | body |
loginCommand | string | body |
when kind is "endpoint" | shape | body |
idrequired | string | body |
configrequired | object | body |
baseUrlrequired | string | body |
protocol | "openai" | "anthropic" | body |
apiKey | string | body |
headers | string | body |
when kind is "localmodel" | shape | body |
idrequired | string | body |
configrequired | object | body |
modelrequired | string | body |
gpu | "on" | "off" | body |
url | string | body |
context | "16384" | "32768" | "65536" | "131072" | "custom" | body |
contextTokens | integer | body |
when kind is "wallet" | shape | body |
idrequired | string | body |
configrequired | object | body |
network | "eip155:8453" | "eip155:84532" | body |
address | string | body |
perPaymentMaxUsd | string | body |
autoApproveUnderUsd | string | body |
dailyCapUsd | string | body |
allow | string | body |
deny | string | body |
What comes back
| Field | Type |
|---|---|
when event is "message" | shape |
data | object |
kind | string |
id | string |
retry | number |
when event is "done" | shape |
data | unknown |
id | string |
retry | number |
when event is "error" | shape |
data | unknown |
id | string |
retry | number |
curl -N -X POST "$SANDBOX/capabilities" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"id":"a1b2c3d4","kind":"devops","config":{}}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.capabilities.add({
"id": "a1b2c3d4",
"kind": "devops",
"config": {}
});DELETE/capabilities/{id}Disconnect something
Tears a connection down. The kinds that own real infrastructure refuse, because deleting those would be losing data rather than losing a connection.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich connection | string | address |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X DELETE "$SANDBOX/capabilities/a1b2c3d4" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.capabilities.remove({
"id": "a1b2c3d4"
});POST/capabilities/{id}/renameRename a connection
Carries everything the old name keyed across with it: a browser profile and its logins, an enrolled machine, an extension's copy of its source. Removing and re-adding would lose exactly the state that made the connection worth keeping. Kinds whose name is part of what they are refuse.
What you send
| Field | Type | Where |
|---|---|---|
idrequired | string | address |
torequired | string | body |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/capabilities/a1b2c3d4/rename" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"to":"src/server.ts"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.capabilities.rename({
"id": "a1b2c3d4",
"to": "src/server.ts"
});POST/capabilities/{id}/secretReplace a stored credential
Swaps one connection's key or token for a new one and re-applies it, without touching any of its other settings.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich connection | string | address |
valuerequiredThe new credential | string | body |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/capabilities/a1b2c3d4/secret" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"value":"…"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.capabilities.setSecret({
"id": "a1b2c3d4",
"value": "…"
});GET/capabilities/{id}/statusRe-check one connection
Probes a single connection right now, for a screen that wants to refresh one row rather than the whole list.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich connection | string | address |
What comes back
| Field | Type |
|---|---|
stateWhether it is live, still coming… | "active" | "pending" | "error" | "inactive" |
detailWhat is wrong, in words a… | string |
codeA short marker for that reason,… | string |
curl "$SANDBOX/capabilities/a1b2c3d4/status" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.capabilities.status({
"id": "a1b2c3d4"
});GET/capabilities/{id}/connectionA connection's settings, credentials included
The one call that hands back stored secrets, so an extension's own backend can dial the service behind a connection. Never answered for a signed-in person: only a machine credential reaches it, and an extension's only if its manifest asked for this route out loud at install time.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich connection | string | address |
What comes back
| Field | Type |
|---|---|
idThe connection's id | string |
kindWhat sort of thing it is | string |
configIts settings exactly as stored, credentials… | object |
curl "$SANDBOX/capabilities/a1b2c3d4/connection" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.capabilities.connection({
"id": "a1b2c3d4"
});POST/capabilities/marketplaceRead a plugin marketplace
Resolves a plugin marketplace source into the list of connections you could install from it.
What you send
| Field | Type | Where |
|---|---|---|
urlrequiredThe registry to read | string | body |
tokenA credential for a private one | string | body |
What comes back
| Field | Type |
|---|---|
nameWhat the registry calls itself | string |
pluginsWhat it lists, each with the… | object[] |
name | string |
description | string |
version | string |
kind | "plugin" | "extension" |
trust | "verified" | "listed" | "blocked" |
trustReason | string |
securityReview | object |
sha | string |
url | string |
path | string |
policy | string |
reviewer | string |
reviewedAt | string |
runId | string |
deterministic | object |
policy | string |
scanner | string |
version | string |
runId | string |
admitted | boolean |
securityFix | boolean |
tier | "free" | "premium" |
category | string |
art | string |
logo | string |
icon | string |
homepage | string |
install | object |
url | string |
ref | string |
path | string |
stars | integer |
pushedAt | string |
checks | object |
sha | string |
manifest | string |
bundle | string |
engines | string |
curl -X POST "$SANDBOX/capabilities/marketplace" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"url":"https://sandbox-a1b2c3d4e5f6.intentic.dev","token":"ict_9wQ4rTz8kLmN3pXbV7hJ"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.capabilities.marketplace({
"url": "https://sandbox-a1b2c3d4e5f6.intentic.dev",
"token": "ict_9wQ4rTz8kLmN3pXbV7hJ"
});DELETE/capabilities/recommendations/{card}Stop suggesting this connection
Not needed, for now. Nothing is torn down. The suggestion comes back if what prompted it in the workspace changes, because what is remembered is the evidence, not the refusal.
What you send
| Field | Type | Where |
|---|---|---|
cardrequiredWhich suggestion to stop making | string | address |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X DELETE "$SANDBOX/capabilities/recommendations/%E2%80%A6" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.capabilities.dismiss({
"card": "…"
});POST/capabilities/{id}/loginSign in to a connection by hand
Opens the connection's own sign-in in a terminal a person can type into, for the flows that need a code pasted or a device confirmed. The answer names the terminal to attach to.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich connection | string | address |
What comes back
| Field | Type |
|---|---|
sessionThe terminal the sign-in is happening… | string |
curl -X POST "$SANDBOX/capabilities/a1b2c3d4/login" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.capabilities.login({
"id": "a1b2c3d4"
});GET/capabilities/{id}/otpMint a one-time code
Generates a single two-factor code from a stored seed. The one credential-adjacent read an agent is allowed, and it is safe because a code expires in seconds and never reveals the seed, so an agent can answer a prompt without ever holding the factor.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich connection | string | address |
What comes back
| Field | Type |
|---|---|
codeThe code | string |
secondsRemainingHow long it lasts | number |
curl "$SANDBOX/capabilities/a1b2c3d4/otp" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.capabilities.otp({
"id": "a1b2c3d4"
});