with one click
configuration
Schema-validated, reactive registry for named configuration entries — the migration target for per-worker config blocks currently in engine/config.yaml.
Schema-validated, reactive registry for named configuration entries — the migration target for per-worker config blocks currently in engine/config.yaml.
Ephemeral microVM sandboxes for running untrusted or agent-generated code in isolation — a one-call run path, a create/exec/stop lifecycle, and a set of filesystem operations.
Expose registered functions as HTTP endpoints via an `http` trigger, with a preHandler middleware chain for auth, rate limiting, and logging. Reach for it to serve REST without standing up a separate web server.
Connect this engine to another iii engine over a long-lived WebSocket so functions call across the boundary. Wire stable ids with `forward:`/`expose:`; `bridge.invoke` is the ad-hoc escape hatch.
Schedule any registered function on a 6- or 7-field cron expression, with once-only execution across a fleet when backed by the redis adapter. Its whole surface is the `cron` trigger type.
WebSocket-routed worker mesh — the engine's Function/Trigger/Worker model and the iii-sdk surface for authoring them. Teaches the ordered way to gain a capability before writing code — (1) check functions already registered in the engine, (2) search the public registry via iii-directory, (3) build a worker. Single self-contained skill — meant for system-prompt injection; do not re-fetch.
OpenTelemetry-backed tracing, structured logs, metrics with rollups, alerts, sampling, and baggage for the engine — emit and query telemetry through `engine::*` functions and react to logs with a `log` trigger.
| name | configuration |
| description | Schema-validated, reactive registry for named configuration entries — the migration target for per-worker config blocks currently in engine/config.yaml. |
The configuration worker is a server-side registry of named entries. Every entry has an id (e.g. iii-stream, billing-service), a human-readable name and description, a JSON Schema describing the value shape, and a JSON value validated against that schema. Workers call configuration::register once at startup to declare their schema and configuration::set to publish values; consumers call configuration::get / configuration::list to read and bind a configuration trigger to react to changes without polling.
The default fs adapter persists one YAML file per id under ./data/configuration and watches the directory for external edits, so manual edits to those files surface as configuration:updated events the same way SDK calls do. The bridge adapter delegates to a remote engine and re-broadcasts its events into the local fan-out — the function surface is identical across adapters. The worker is enabled by default in engine/config.yaml.
A per-id TTL (off by default) cleans up entries whose last subscriber trigger has unregistered, scoped to the lifecycle of ephemeral workers that come and go without an explicit teardown step.
engine/config.yaml and needs a typed, observable surface other workers can read and validate against.iii-state for free-form values.set always replaces the whole value. Build the new value client-side and ship it in one call.bridge adapter cannot delete entries on the remote engine; cleanup over the bridge happens via TTL or directly on the source engine.configuration::register — declare an id with name, description, JSON Schema, and an optional initial_value; idempotent re-registration replaces the schema and metadata.configuration::set — replace the value for a registered id; validates against the registered schema and emits configuration:updated.configuration::get — read one entry by id; expands ${VAR:default} against live env unless raw: true.configuration::list — enumerate every registered id with name, description, and schema; never returns the value.configuration::schema — read schema/name/description for one id without exposing the value.register and set are the only mutators; the read-side functions are cache-backed and cheap. Reads expand ${VAR:default} placeholders against the live process env on every call, so env changes propagate without restarts — pass raw: true to configuration::get when you need the stored template form.
Bind a configuration trigger when a function should run automatically on every register / set / delete — including external fs file edits and bridge-forwarded events from a remote engine. The engine invokes matching handlers asynchronously after each successful mutation and after TTL-driven cleanup, so a worker stays in sync with its configuration without polling.
Reach for it when:
If you only need the new value inside the same function that wrote it, configuration::set already returns old_value / new_value — register a trigger only when a different worker should react.
iii.registerFunction('stream::on-config-change', handler).iii.registerTrigger({
type: 'configuration',
function_id: 'stream::on-config-change',
config: {
configuration_id: 'iii-stream', // optional. Omit to receive every id.
event_types: ['configuration:updated'], // optional. Subset of configuration:registered|configuration:updated|configuration:deleted.
// condition_function_id is also supported — see get function info.
},
})
Mutations that fire triggers: configuration::register (:registered on first call, :updated on re-registration), configuration::set (:updated), TTL cleanup (:deleted), and external fs create/edit/delete events. Reads do not fire triggers.
The worker also respects per-id TTL: when ttl_seconds > 0 is configured and the last trigger bound to a configuration_id is unregistered, the entry is deleted after the TTL elapses. A new trigger registration before the countdown fires aborts the cleanup.
For the event payload shape, call iii get function info on the trigger type or handler function id.