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
  • timeoutMs: per-process timeout in milliseconds. null = no enforcement, undefined = 30s default
  • envConfig: opaque configuration passed through to the environment module
  • 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

Process exit states

Create a Process

POST /processes
Rules:
  • code is required and must be a string.
  • ref is optional, trimmed, unique if provided, and must be non-empty if present.
  • timeoutMs is in milliseconds. Must be a positive integer, or null to disable enforcement, or undefined to use the default (30s). This is a hard enforcement ceiling, execution is terminated when the wall clock exceeds this value.
  • envConfig is optional, opaque configuration passed through to the environment module. Its shape is environment-dependent and validated by the module itself.
  • 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):
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
  • 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

/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 July 4, 2026