RuimteDocs

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

FieldWhat it holds
idTwo parts joined by a dot, lowercase letters, digits and hyphens: acme.standup. Never changes.
nameWhat a person reads, up to 80 characters.
versionSemantic version, such as 1.2.0 or 2.0.0-beta.1.
apiThe version of the extension API it was written for. Today that is 1, a preview that can still change; see Changes to the API.
descriptionOne or two sentences, up to 280 characters.
publisherWho made it.
categoryA word to group it by.
colorThe ground of its mark, as #rrggbb.
permissionsWhat it asks for, each with the reason a person reads before installing.
themesThe paths of its theme files. See Themes.
activationWhen the client part loads. Without it, with the app.
autostartStarts 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 as file: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.

PermissionWhat it allows
canvas.writeCreate, change, link and arrange nodes. Opening a terminal also needs it.
views.writeCreate and rename views.
files.readRead and list files in the project folder.
files.writeWrite files in the project folder.
git.readRead status, diffs and the log.
database.readRun one read-only SELECT or WITH statement on a project's database.
context.readRead what an agent would read of nodes and views.
chats.readList chats and read their threads.
chats.sendSend a message to a chat, which wakes it.
agents.runRun a hidden prompt on one of the person's CLIs.
agents.startStart a chat a person sees, supervised at most.
agents.statusRead what every agent is doing.
agents.toolsOffer agents a tool.
usage.readRead how much of their plans the person used.
launches.readList and read launches.
launches.runStart, restart and stop launches.
routines.readList routines.
routines.runRun, pause and resume routines.
artifacts.readList and read what is in Output.
artifacts.writePublish to Output.
browser.controlRead and drive any browser node of the project.
devices.controlRead and operate any simulator or phone node of the project.
terminals.readRead a terminal's screen.
languages.serversAdd a language server, which starts without asking.
clockRun 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: