Extensions
Installed extensions: their settings, their readiness, their updates and their processes
On this page(15 sections)
- Installed extensions
- Write a new extension in place
- An extension's settings
- Change an extension's settings
- Turn an extension on or off
- Record what an extension just used
- Whether an extension is fit to share
- Look for extension updates now
- What an update would change
- Update an extension
- Go back to the previous version
- How an extension should handle its own updates
- Whether an extension's background process is up
- Start an extension's background process
- Stop an extension's background process
The runtime half of the extension format documented under Developers. These routes enumerate what is installed, read and write each one's settings, switch it on or off, check for updates and apply or undo one, and start or stop the long-running processes an extension declares.
15 calls. Pick one to open it, or use the list on the right.
GET/extensionsInstalled extensions
Every extension installed here, resolved to the manifest the owner approved, which is what the app boots its extension host from. The code itself is served separately, because raw script bytes are not a JSON answer.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
extensionsWhat is installed | object[] |
idThe extension's id | string |
manifestWhat it declares about itself: what… | object |
$schemaThe authoring schema, for editor completion… | string |
publisher | string |
name | string |
versionYour own semver, display and identity… | string |
categoryWhich section of the Extensions tab… | string |
artThis extension's own mark, as a… | string |
logoA simple-icons slug, fetched from a… | string |
iconA name from the host's own… | string |
enginesA semver range over the host's… | object |
intentic | string |
entryRepo-relative path of your prebuilt single-file… | string |
serverRepo-relative path of your prebuilt single-file… | string |
permissionsHow far this extension may reach… | object |
sandboxDaemon routes your UI half may… | string[] |
daemonDaemon routes your SERVER half may… | string[] |
contributes | object |
viewsSidebar elements this extension may register… | object[] |
filesWhich workspace files back your views,… | object[] |
viewersFile formats this extension can render | object[] |
documentsPer-directory documents this extension can offer | object[] |
commandsCommands this extension may register handlers… | object[] |
settingsTyped settings the host renders into… | object[] |
processesLong-lived background processes the daemon runs… | object[] |
agentDeclare that this checkout is also… | object |
environmentA Dockerfile fragment baked into the… | object |
capabilitiesCapability cards this pack adds to… | object[] |
listenerA realtime event source this extension… | object |
automationTemplatesStarting points this pack offers in… | object[] |
binA checkout-relative directory of executables the… | string |
commitExactly which commit is installed | string |
sourceWhere the code comes from: baked… | "builtin" | "installed" | "workspace" |
enabledThe owner's switch | boolean |
essentialIts switch is fixed on, because… | boolean |
usageHow much of the reach it… | object |
backendPresent only for an extension that… | object |
stateHow its server half is doing | "running" | "error" | "absent" | "incompatible" … (6) |
detailWhat went wrong, so a backend… | string |
updateA newer version waiting | object |
refThe commit being offered | string |
versionWhat it calls itself | string |
urlWhere it comes from | string |
pathWhere inside that repository it lives | string |
trustWhether anybody vouched for it, or… | "verified" | "listed" |
securityFixThis release fixes a security problem… | boolean |
registryWhich registry said so | string |
atWhen it was published | string |
needsReviewWhy this one was not taken… | string |
reviewAn agent has already read the… | object |
conversationIdWhere to read what it found | string |
atWhen it looked | string |
advisoryA security warning about the installed… | object |
reasonWhy the registry pulled the listing,… | string |
registryWhich registry said so | string |
atWhen | string |
autoDisabledWhether the sandbox has already switched… | boolean |
healthHow it has behaved since the… | object |
stateHow it has behaved since the… | "watching" | "healthy" | "unhealthy" |
detailWhat is going wrong, when something… | string |
fromRefWhich version it was updated from,… | string |
atWhen the watching started | string |
autoRevertedThe update was already rolled back… | boolean |
previousThe version kept one step back,… | object |
refThe commit that was running before | string |
versionWhat it called itself | string |
updatePolicyThe owner's standing answer for this… | object |
updates | "notify" | "agent" | "auto" |
advisories | "auto-disable" | "notify" |
invalidExtensions written here that could not… | object[] |
dirWhich folder | string |
errorWhy it could not be read | string |
updatesCheckedAtWhen updates were last looked for | string |
curl "$SANDBOX/extensions" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.extensions.list();POST/extensions/workspaceWrite a new extension in place
Scaffolds a working extension into this workspace and installs it. The only call here that creates one, and it exists because that folder is otherwise reachable only through an agent's file tools, which is a fine way to change an extension and a poor way to meet the idea of one.
What you send
| Field | Type | Where |
|---|---|---|
publisherrequiredWho it is by, which together… | string | body |
namerequiredWhat it is called | string | body |
What comes back
| Field | Type |
|---|---|
idThe id it was given | string |
dirWhere its files are, so you… | string |
curl -X POST "$SANDBOX/extensions/workspace" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"publisher":"…","name":"nightly changelog"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.extensions.create({
"publisher": "…",
"name": "nightly changelog"
});GET/extensions/{id}/settingsAn extension's settings
The current values for the settings this extension declared it has.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich connection | string | address |
What comes back
| Field | Type |
|---|---|
settingsThe values, minus anything marked secret | object |
secretsSetWhich of its secret settings actually… | string[] |
curl "$SANDBOX/extensions/a1b2c3d4/settings" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.extensions.settings({
"id": "a1b2c3d4"
});POST/extensions/{id}/settingsChange an extension's settings
Writes new values. A key the extension never declared is refused rather than quietly stored, the same honesty rule that governs everything else an extension claims.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich extension | string | address |
settingsrequiredThe values to write | object | body |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/extensions/a1b2c3d4/settings" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"settings":{"src/app.ts":"…","README.md":"…"}}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.extensions.setSettings({
"id": "a1b2c3d4",
"settings": {
"src/app.ts": "…",
"README.md": "…"
}
});POST/extensions/{id}/enabledTurn an extension on or off
The owner's switch. Turning one off stops its background processes at once. What it contributes to an agent's tools is rebuilt at the start of the next turn, and anything it adds to the sandbox image only at the next rebuild.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich extension | string | address |
enabledrequiredOn or off | boolean | body |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/extensions/a1b2c3d4/enabled" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.extensions.setEnabled({
"id": "a1b2c3d4",
"enabled": true
});POST/extensions/{id}/usageRecord what an extension just used
Written by the app rather than measured by the daemon, because the permission gate runs in the browser: from the sandbox's side an extension's traffic is indistinguishable from anyone else's. This is how the record of which powers an extension actually exercises gets kept.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich extension | string | address |
usedrequiredWhich of its declared powers it… | object | body |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/extensions/a1b2c3d4/usage" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"used":{"src/app.ts":9,"README.md":9}}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.extensions.recordUsage({
"id": "a1b2c3d4",
"used": {
"src/app.ts": 9,
"README.md": 9
}
});GET/extensions/{id}/readinessWhether an extension is fit to share
The checks that can be answered from an extension's own files, for an author about to publish. Read on demand rather than carried on the list, because it reads the code off disk each time.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich connection | string | address |
What comes back
| Field | Type |
|---|---|
checksEverything that can be checked from… | object[] |
idWhich check | string |
labelWhat it is called | string |
statusHow it went | "pass" | "warn" | "fail" |
detailWhat it found | string |
curl "$SANDBOX/extensions/a1b2c3d4/readiness" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.extensions.readiness({
"id": "a1b2c3d4"
});POST/extensions/updates/checkLook for extension updates now
Compares every installed extension against its source and reports what is newer, what carries an advisory and what looks unhealthy. This also happens on a schedule; call it to check on demand.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
okThe check ran | true |
checkedAtWhen, so a screen can date… | string |
curl -X POST "$SANDBOX/extensions/updates/check" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.extensions.checkUpdates();POST/extensions/{id}/update/previewWhat an update would change
The read before the click: which versions are involved and exactly which powers the new code asks for that the running one does not. Costs one throwaway copy of the source, the same as browsing a registry entry.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich extension | string | address |
refWhich commit, in full | string | body |
What comes back
| Field | Type |
|---|---|
refThe commit this would install | string |
versionWhat that version calls itself | string |
installedVersionWhat is running now | string |
enginesWhich sandbox versions the new one… | string |
compatibleWhether this sandbox is one of… | boolean |
powersExactly what the new code asks… | object |
addedWhat the new version asks for… | string[] |
removedWhat it no longer asks for | string[] |
unchangedWhat stays the same | string[] |
curl -X POST "$SANDBOX/extensions/a1b2c3d4/update/preview" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"ref":"refs/heads/main"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.extensions.updatePreview({
"id": "a1b2c3d4",
"ref": "refs/heads/main"
});POST/extensions/{id}/updateUpdate an extension
The whole swap as one transaction: fetch, check, quiet the running one, replace it while keeping the outgoing copy one step back, restart and watch it come up. The existing configuration is kept, so a token for a private source survives what removing and re-adding would lose. Owner only, because it changes what code runs.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich extension | string | address |
refWhich commit, in full | string | body |
What comes back
| Field | Type |
|---|---|
okIt went through | true |
refWhich commit is now running | string |
rebuildNeededThe new version changes what the… | boolean |
curl -X POST "$SANDBOX/extensions/a1b2c3d4/update" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"ref":"refs/heads/main"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.extensions.applyUpdate({
"id": "a1b2c3d4",
"ref": "refs/heads/main"
});POST/extensions/{id}/revertGo back to the previous version
Swaps the copy kept from before the last update back into place. Owner only, for the same reason updating is.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich connection | string | address |
What comes back
| Field | Type |
|---|---|
okIt went through | true |
refWhich commit is now running | string |
rebuildNeededThe new version changes what the… | boolean |
curl -X POST "$SANDBOX/extensions/a1b2c3d4/revert" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.extensions.revert({
"id": "a1b2c3d4"
});POST/extensions/{id}/update-policyHow an extension should handle its own updates
The owner's standing answer for one extension: tell me, have an agent look at it, or just do it. Security advisories can be opted out of separately.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich extension | string | address |
updatesWhat to do about a newer… | "notify" | "agent" | "auto" | body |
advisoriesWhat to do about a security… | "auto-disable" | "notify" | body |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/extensions/a1b2c3d4/update-policy" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"updates":"notify","advisories":"auto-disable"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.extensions.setUpdatePolicy({
"id": "a1b2c3d4",
"updates": "notify",
"advisories": "auto-disable"
});GET/extensions/{id}/processes/{name}Whether an extension's background process is up
The state of one process an extension declared, with the port it was given and its preview address if it has one.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich extension | string | address |
namerequiredWhich of its declared processes | string | address |
What comes back
| Field | Type |
|---|---|
nameWhich process | string |
runningWhether it is up | boolean |
portThe port it was given | number |
previewUrlWhere to open it, when it… | string |
curl "$SANDBOX/extensions/a1b2c3d4/processes/nightly%20changelog" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.extensions.processStatus({
"id": "a1b2c3d4",
"name": "nightly changelog"
});POST/extensions/{id}/processes/{name}/startStart an extension's background process
Brings one of an extension's declared processes up in an attachable terminal.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich extension | string | address |
namerequiredWhich of its declared processes | string | address |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/extensions/a1b2c3d4/processes/nightly%20changelog/start" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.extensions.processStart({
"id": "a1b2c3d4",
"name": "nightly changelog"
});POST/extensions/{id}/processes/{name}/stopStop an extension's background process
Shuts one of an extension's declared processes down and frees its port.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich extension | string | address |
namerequiredWhich of its declared processes | string | address |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/extensions/a1b2c3d4/processes/nightly%20changelog/stop" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.extensions.processStop({
"id": "a1b2c3d4",
"name": "nightly changelog"
});