Skip to content

The manifest, schedules, and type methods

A wasm realm ships dist/manifest.json in the same manifest format as TS handlers — hand-authored for the single-file JS path, generated by the build for a src/ TypeScript project. The schemas drive the typed LLM surface exactly as for docker-hosted functions and are enforced by the host at invocation. outputSchema describes the unwrapped payload — the value the handler returns, before the host wraps it in the wire envelope — never the envelope itself. Two entry fields matter here:

Field Meaning
schedule A cron expression (Spring 6-field, evaluated in the host’s timezone). Installation makes the schedule available but does not activate it. It starts only after adoption under the same digest-bound grant as a routine, and a realm update pauses it until that grant is valid again. A host shows a realm’s Manifest Schedules as routines of an agent it proposes for the realm, so they are adopted the same way. A Manifest Schedule passes empty args ({}), so every inputSchema field must be optional. (A scheduled routine in agents/ instead passes {trigger: "cron", firedAt} under a different input contract; see routines that call a Realm Function.)
onType The function is a method on a declared type — callable as <obj>.<name>(args) on an in-scope object, not as a bare gateway function. The handler receives the object as input.self and the caller’s arguments as input.args. schedule does not combine with onType: a scheduled invocation has no receiver.

A Trigger Registration has one discriminated identity everywhere it appears in adoption, dispatch, receipts, and audit: routine:<agent name, routine name, routine revision> for a routine in agents/, or manifest-schedule:<namespace, name, schedule revision> for a manifest entry. The schedule revision is a canonical digest of the entry’s schedule and invocation schema; realmDigest still pins the rest of the package.

{
"version": 1,
"generatedAt": "2026-08-01T00:00:00Z",
"entries": [
{
"namespace": "chatops",
"name": "digest",
"description": "Summarize ingested channel activity — counts per channel and the most recent messages.",
"schedule": "0 30 * * * *",
"inputSchema": {
"type": "object",
"properties": { "limit": { "type": "number" } },
"required": []
},
"outputSchema": {
"type": "object",
"properties": {
"totalMessages": { "type": "number" },
"channels": { "type": "array" },
"recent": { "type": "array" }
}
}
}
]
}