Skip to main content
A process is a stateful execution unit in cyrnel. When a client submits code, cyrnel creates a process record with a stable identifier (id), runs it on the active environment module, captures its output, and persists the result to the database. Process execution does not block the client request unless block: true is set.

Process Model

Each process has the following fields:
  • id: stable database identifier (auto-incrementing integer, persists across restarts)
  • ref: optional reference label (trimmed; must be non-empty if present, unique)
  • state: lifecycle phase (see below)
  • exitState: execution outcome (see below)
  • error: error message if the process failed, otherwise null
  • code: the submitted source
  • options.timeoutMs: per-process timeout in milliseconds, or null to disable
  • output: structured key/value payload emitted by cyrnel.output(...)
  • stdout, stderr: captured text output
  • createdAt: ISO-8601 timestamp of creation
  • completedAt: ISO-8601 timestamp of completion, or null if still running
Process creation records and execution results are persisted in the database. Runtime state (running/queued/terminating) is ephemeral and held in memory, restarting the API clears active executions but the creation record and any completed results survive.

Process states

StateMeaning
queuedWaiting for the environment to pick it up.
runningCurrently executing inside the environment.
terminatingA kill signal was issued; the runtime is winding it down.
idleNot executing. Either it hasn’t been run yet, or it has finished.

Process exit states

Exit stateMeaning
nullNo outcome yet.
successCode completed without throwing.
failedCode threw, or the environment reported failure. error is populated.
timeoutExecution exceeded options.timeoutMs.
canceledA kill signal interrupted the execution.

Create a Process

POST /processes
{
  "code": "string",
  "ref": "optional unique reference",
  "autorun": true,
  "options": {
    "timeout": 30000
  }
}
Rules:
  • code is required and must be a string.
  • ref is optional, trimmed, unique if provided, and must be non-empty if present.
  • options.timeout is in milliseconds. Must be a positive integer, or null to disable. Default: 30000.
  • autorun controls whether execution starts immediately. When true (default), the process is queued and runs right away. When false, the process is created in idle state and must be started via the run signal.
Response (201):
{ "id": 1 }
If block: true and autorun: true, cyrnel polls until state === "idle" before responding. The HTTP status is still 201.

Run an Existing Process

POST /processes/:id/signals/run
{ "force": false, "block": false }
  • The process must currently be idle.
  • If the process has stored outputs (any of exitState, output, stdout, stderr is non-empty), force: true is required to overwrite them.
  • block: true waits until the run completes.
Response (200): the process record.

Kill a Process

POST /processes/:id/signals/kill
  • If the process is queued, it transitions straight to idle with exitState = "canceled".
  • If running, it moves to terminating first, then to idle with exitState = "canceled" once the environment confirms.
  • If already idle, the call returns 409.
Response (200): the process record.

Inspect a Process

MethodPathReturns
GET/processes{ processes: ProcessRecord[] } (filterable)
GET/processes/:idthe process record
GET/processes/:id/codesubmitted source as text/plain
GET/processes/:id/outputstructured output as JSON
GET/processes/:id/stdoutcaptured stdout as text/plain
GET/processes/:id/stderrcaptured stderr as text/plain
/output, /stdout, and /stderr return 409 unless the process is idle.

Filtering /processes

Query parameters:
  • state: One of idle | queued | running | terminating
  • status: One of success | failed | timeout | canceled | null
  • ref: Exact match (trimmed, non-empty)
Results include both active in-memory processes and historical processes from the database.

Delete a Process

DELETE /processes/:id The process must be idle. The record is permanently removed from the database.
Last modified on June 25, 2026