The manifest
manifest.json says what an extension is and what it asks for. Ruimte reads it before any of its code runs.
{
"id": "acme.standup",
"name": "Standup",
"version": "1.2.0",
"api": 1,
"publisher": "Acme",
"description": "Collects what every agent did since yesterday.",
"color": "#0891b2",
"permissions": {
"chats.read": "Reads your chats to summarize them",
"canvas.write": "Writes the summary as a note"
},
"activation": ["node:summary"]
}Fields
| Field | What it holds |
|---|---|
id | Two parts joined by a dot, lowercase letters, digits and hyphens: acme.standup. Never changes. |
name | What a person reads, up to 80 characters. |
version | Semantic version, such as 1.2.0 or 2.0.0-beta.1. |
api | The version of the extension API it was written for. Today that is 1, a preview that can still change; see Changes to the API. |
description | One or two sentences, up to 280 characters. |
publisher | Who made it. |
category | A word to group it by. |
color | The ground of its mark, as #rrggbb. |
permissions | What it asks for, each with the reason a person reads before installing. |
themes | The paths of its theme files. See Themes. |
activation | When the client part loads. Without it, with the app. |
autostart | Starts the server part with the machine, for an extension that follows events with no client open. |
The mark
Ruimte draws assets/icon.svg, up to 64 KB, as one ink on color, so only its shape counts. Without an icon an extension gets a package symbol, and without a color a plain ground.
Activation
activation delays the client part until it is needed:
node:<type>loads it when a node of that type of yours is on the canvas.view:<id>loads it when that view of yours opens.file:<extension>loads it when a file with that extension is open, such asfile:csv.
Permissions
Reading what is on screen needs no permission. Everything else does, and the API refuses a call whose permission the manifest does not name.
| Permission | What it allows |
|---|---|
canvas.write | Create, change, link and arrange nodes. Opening a terminal also needs it. |
views.write | Create and rename views. |
files.read | Read and list files in the project folder. |
files.write | Write files in the project folder. |
git.read | Read status, diffs and the log. |
database.read | Run one read-only SELECT or WITH statement on a project's database. |
context.read | Read what an agent would read of nodes and views. |
chats.read | List chats and read their threads. |
chats.send | Send a message to a chat, which wakes it. |
agents.run | Run a hidden prompt on one of the person's CLIs. |
agents.start | Start a chat a person sees, supervised at most. |
agents.status | Read what every agent is doing. |
agents.tools | Offer agents a tool. |
usage.read | Read how much of their plans the person used. |
launches.read | List and read launches. |
launches.run | Start, restart and stop launches. |
routines.read | List routines. |
routines.run | Run, pause and resume routines. |
artifacts.read | List and read what is in Output. |
artifacts.write | Publish to Output. |
browser.control | Read and drive any browser node of the project. |
devices.control | Read and operate any simulator or phone node of the project. |
terminals.read | Read a terminal's screen. |
languages.servers | Add a language server, which starts without asking. |
clock | Run work on a clock of its own. |
net:<host> | Let a frame surface reach that host over HTTPS, such as net:api.example.com. |
Write the reason for a person: "Writes the summary as a note", not "Needs canvas access". They read it before installing, and again under Settings, Extensions: