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; the API responds immediately and the process runs
asynchronously.
Process Model
Each process has the following fields:id: stable database identifier (auto-incrementing integer, persists across restarts)pid: ephemeral in-memory process identifier, ornullwhen the process is not in active memory (see Unload a Process)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, otherwisenullcode: the submitted sourcetimeoutMs: per-process timeout in milliseconds.null= no enforcement,undefined= 30s defaultenvConfig: opaque configuration passed through to the environment moduleoutput: structured key/value payload emitted bycyrnel.output(...)stdout,stderr: captured text outputcreatedAt: ISO-8601 timestamp of creationcompletedAt: ISO-8601 timestamp of completion, ornullif 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
codeis required and must be a string.refis optional, trimmed, unique if provided, and must be non-empty if present.timeoutMsis in milliseconds. Must be a positive integer, ornullto disable enforcement, orundefinedto use the default (30s). This is a hard enforcement ceiling, execution is terminated when the wall clock exceeds this value.envConfigis optional, opaque configuration passed through to the environment module. Its shape is environment-dependent and validated by the module itself.autoruncontrols whether execution starts immediately. Whentrue(default), the process is queued and runs right away. Whenfalse, the process is created inidlestate and must be started via the run signal.
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,stderris non-empty),force: trueis required to overwrite them.
id with a fresh pid and executes again.
If the historical record has stored outputs, force: true is required;
re-running overwrites the stored outputs.
Response (200): the process record.
Kill a Process
POST /processes/:id/signals/kill
- If the process is
queued, it transitions straight toidlewithexitState = "canceled". - If
running, it moves toterminatingfirst, then toidlewithexitState = "canceled"once the environment confirms. - If already
idle: including historical processes that only exist in the database - the call returns409.
200): the process record.
Unload a Process
POST /processes/:id/signals/unload
Removes an idle process from active memory while keeping its database
record and outputs intact. The process id remains valid, and a subsequent
run signal revives it under
the same id with a fresh pid. This is useful for releasing memory while
preserving history.
Rules:
- The process must be
idle. Queued, running, and terminating processes return409(unloading would orphan the execution). - If the process is already outside active memory, the call returns
409. - Unknown ids return
404.
pid: null and state: "idle" and is
listed among historical database processes. Unloading is not destructive:
the code, outputs, stdout, and stderr remain available.
Response (200): the process record.
Automatic unloading
WhenCYRNEL_MAX_IDLE_PROCESSES is set, idle processes are unloaded
automatically (least recently executed first) once the in-memory idle pool
exceeds the cap. The behavior is identical to an explicit unload - the
database record and outputs are preserved, and the process can be revived
with a run signal. The cap
is checked whenever a process becomes idle or is created without
autorun; queued and running processes are never unloaded. The cap is
unlimited when the variable is unset.
Inspect a Process
/output, /stdout, and /stderr return 409 unless the process is
idle.
Filtering /processes
Query parameters:
state: One ofidle | queued | running | terminatingstatus: One ofsuccess | failed | timeout | canceled | nullref: Exact match (trimmed, non-empty)
Pagination
GET /processes returns the paginated envelope { items, nextCursor, hasMore }; see Pagination for the cursor rules,
limit semantics, and error codes.
Delete a Process
DELETE /processes/:id
The process must be idle. The record is permanently removed from the
database (including code, outputs, stdout, and stderr). Historical processes
that only exist in the database can be deleted directly; they are always
idle.
The response is 200 with the deleted process record in the body.