events.iterate.com

Event type reference

Public documentation generated from the stream processor contracts in OS: every processor, the event types it owns, their payload schemas and example events, and how processors consume, emit, and depend on each other.

14 processors · 93 event types

corev0.1.0

Maintains the stream's own reduced state.

events.iterate.com/stream/child-stream-createdRecords the immediate child stream segment under this stream.payload: { childPath }events.iterate.com/stream/configuredConfigures core stream runtime policy.payload: { config }events.iterate.com/stream/createdInitializes the core reduced state for a stream.payload: { projectId, path }events.iterate.com/stream/error-occurredRecords a structured stream or processor runner error.payload: { message, error? }events.iterate.com/stream/pausedRecords that the stream is paused and should reject ordinary appends.payload: { reason? }events.iterate.com/stream/processor-revivedA recovery-wired stream processor was revived after its incarnation died owing background work (in-flight obligations lost to an eviction). Appended by the platform's recovery keepalive, never emitted by a processor; the payload's processorSlug names which processor was revived (the type string is shared by every recovery-wired processor). Consumption is optional and only needed when the processor reacts to the fact itself; an unconsumed tail still receives the runner's eventless at-head turn so open obligations are not stranded.payload: { processorSlug, revivals, version }events.iterate.com/stream/resumedRecords that the stream has resumed accepting ordinary appends.payload: { reason? }events.iterate.com/stream/subscriber-connectedA delivery connection to one subscriber opened. Appended by the stream itself, once per actual open — which is why presence facts carry no idempotency keys: a re-handshake after a transient break genuinely is a new connection and must re-land on the roster. It is always the tail of any batch it shares (appended after the handshake fixes the replay offset), so state-at-event equals batch-final state.payload: { subscriptionKey, subscriptionType, subscriber? }events.iterate.com/stream/subscriber-disconnectedA delivery connection to one subscriber closed. Appended by the stream itself, once per actual close.payload: { subscriptionKey, reason }events.iterate.com/stream/subscription-configuredConfigures or replaces a durable subscription for this stream (wake or push delivery; latest event per subscriptionKey wins). Re-configuring keeps the existing delivery cursor unless `deliver` is set, and clears any parked state — new config is a fresh chance.payload: { subscriptionKey, delivery, description?, selector?, deliver?, onPoison?, includeEphem…events.iterate.com/stream/subscription-cursor-setOperator/agent verb: THE seek — explicitly moves a push subscription's cursor (exclusive afterOffset semantics: 0 replays everything). The audited form of replay — the cursor row itself is storage, but moving it deliberately is a fact. For a parked subscription, follow with `subscription-resumed` to restart delivery.payload: { subscriptionKey, afterOffset }events.iterate.com/stream/subscription-parkedDelivery for one subscription gave up after sustained failure and stopped. Appended by the stream's own delivery spine, idempotent per (subscriptionKey, atOffset). Parked is a fact, loud by design; resume it explicitly with subscription-resumed.payload: { subscriptionKey, atOffset, attempts, error? }events.iterate.com/stream/subscription-removedRemoves a durable subscription. Deleting the config is revocation: the stream is the only holder of the delivery machinery, and its cursor row is dropped with it.payload: { subscriptionKey }events.iterate.com/stream/subscription-resumedOperator/agent verb: un-parks a subscription and kicks delivery, resuming at the cursor where it stopped. Moving the cursor is a different act with its own fact — append `subscription-cursor-set` first for a redrive (skip past a bad offset, replay a window).payload: { subscriptionKey }events.iterate.com/stream/wokenRecords that a Durable Object incarnation has started running this stream.payload: { incarnationId }

projectv0.2.0

Project root: births the sibling processors every project gets (root capability host, primary scheduler, config repo, email router, notification facet), marks the project ready once its default worker answers, catalogs the project's streams and domain objects, manages custom-domain routing, and holds the egress-approval policy.

events.iterate.com/project/createdBirth certificate for this project processor.payload: { config }events.iterate.com/project/custom-domain-add-requestedA custom domain should be provisioned and routed to this project.payload: { hostname }events.iterate.com/project/custom-domain-cloudflare-observedCloudflare custom-hostname status observed for a project custom domain.payload: { cloudflareHostnameId?, error?, hostname, hostnameStatus?, ownershipVerification?, ssl…events.iterate.com/project/custom-domain-direct-observedThe hostname routes to this project directly: a platform-owned apex served by worker routes plus an operator-primed hostname-directory registration, with no Cloudflare-for-SaaS custom hostname behind it. Appended by platform operators, never by this processor; recording it keeps the settings UI honest without starting any provisioning lifecycle — add/refresh/remove requests for a direct hostname are inert.payload: { hostname }events.iterate.com/project/custom-domain-provision-failedCustom-domain provisioning failed before an observed Cloudflare status.payload: { error, hostname }events.iterate.com/project/custom-domain-refresh-requestedRefresh Cloudflare status for a custom domain.payload: { hostname }events.iterate.com/project/custom-domain-remove-requestedA custom domain should be removed from this project.payload: { hostname }events.iterate.com/project/custom-domain-removedA custom domain was removed from Cloudflare and routing KV.payload: { hostname }events.iterate.com/project/egress-rules-configuredReplace the project's egress approval rules wholesale. Every outbound request is matched against the ordered list at the Project DO's egress decision point (first match wins, no match allows): a `hold` verdict parks the request until a human grants or rejects it on this stream, `deny` refuses it outright.payload: { rules }events.iterate.com/project/human-approval-grantedA human approved a held egress request. When the project has active approval keys, `keyId` + `signature` (raw 64-byte r‖s ECDSA P-256 over the canonical approval.v1 message, base64) are required and verified before the request is released.payload: { approvalRequestEventOffset, keyId?, signature? }events.iterate.com/project/human-approval-key-addedEnroll a public key whose holder may grant held egress requests. Once any active key exists, grants MUST carry a valid ECDSA P-256 signature over the canonical approval message (approval.v1) — unsigned grants are ignored. Rejections never require a signature.payload: { keyId, publicKey, label? }events.iterate.com/project/human-approval-key-revokedRevoke an enrolled approval key; signatures from it stop being accepted.payload: { keyId }events.iterate.com/project/human-approval-rejectedA held egress request was refused — by a human, or automatically when its hold expired. Rejections are deliberately unsigned: deny is the fail-safe direction.payload: { approvalRequestEventOffset, reason }events.iterate.com/project/human-approval-requestedAn outbound request matched a `hold` rule and is parked at the egress door awaiting a human. Everything is placeholder form — getSecret(...) references, never material. The requested event's offset IS the held request's identity: grants and rejections reference it as approvalRequestEventOffset.payload: { method, url, headers, body?, secretPaths?, ruleKey, ruleDescription?, streamContext?,…events.iterate.com/project/human-approval-settledWhat actually happened after a granted request was released: the upstream status, or the delivery failure. Approval and outcome are separate facts — audits want both.payload: { approvalRequestEventOffset, status?, error? }events.iterate.com/project/onboarding-completedThe project owner completed the onboarding agent flow.payload: { agentPath }events.iterate.com/project/readyThe project bootstrap saga completed and its default worker is ready.payload: {}

repov0.6.0

Projects repo lifecycle, Git activity, and linked GitHub default-branch imports.

events.iterate.com/github/webhook-receivedOne GitHub push delivery, captured as decoded JSON on the connection stream and cross-posted here by the repo's linkGithub subscription. The trusted envelope is structural while the vendor body stays loose.payload: { body, delivery, installationId }events.iterate.com/repo/cloudflare-artifact-event-receivedA Cloudflare Artifacts lifecycle or Git event captured from the deployment's event queue and routed to this repo stream.payload: { artifactName, body, cloudflareEventType?, namespace }events.iterate.com/repo/commit-completedThe repo's default branch advanced, normalized from a Cloudflare Artifacts pushed event. This includes pushes made outside OS through Git.payload: { beforeCommitOid, branch, commitOid }events.iterate.com/repo/github-import-completedA GitHub import obligation completed, including when Artifacts was already at the current GitHub head.payload: { branch, commitOid, requestId, requestedCommitOid }events.iterate.com/repo/github-import-failedA GitHub import obligation failed without blocking later repo events; a later push or explicit sync can retry.payload: { branch, error, requestId, requestedCommitOid }events.iterate.com/repo/github-import-requestedA linked GitHub default-branch push opened a durable import obligation.payload: { branch, requestId, requestedCommitOid }events.iterate.com/repo/github-import-startedThe repo processor durably began a GitHub import attempt — journaled BEFORE the sync body runs, so an attempt that dies with its incarnation is visibly owed.payload: { branch, requestId, requestedCommitOid }events.iterate.com/repo/github-link-configuredThe repo was linked to a GitHub repository (mirror commits out and import fast-forward default-branch pushes).payload: { connection, installationId, owner, repo, repositoryId }events.iterate.com/repo/github-push-completedA mirror push delivered the branch head to the linked GitHub repository.payload: { branch, commitOid, owner, repo }events.iterate.com/repo/github-push-failedA mirror push to the linked GitHub repository failed. Best-effort mirroring self-heals: the next commit's push carries every missing commit, and repo.pushToGithub() repairs on demand.payload: { branch, commitOid, error, owner, repo }events.iterate.com/repo/github-syncedThe repo adopted the linked GitHub repository's branch head (syncFromGithub or resetFromGithub).payload: { branch, commitOid, forced, owner, previousCommitOid, repo, reset? }events.iterate.com/repo/github-unlinkedThe repo's GitHub link was removed.payload: { connection, owner, repo, repositoryId }events.iterate.com/repos/create-failedThe repo creation saga reached a terminal failure and did not declare the repo created. Fail-closed: nothing else ever reacts on a failed repo's stream.payload: { error, request }events.iterate.com/repos/create-requestedRequests the repo creation saga: seed an empty repo, import a private GitHub repo at depth one, or import a public GitHub repo through Cloudflare Artifacts (full history unless depth is set). Terminates in repos/created or repos/create-failed.payload: { type } | { type, connection, owner, repo } | { type, connection, depth?, owner, repo }events.iterate.com/repos/createdThe repo creation saga completed and its backing Artifact is ready — the repo's birth certificate.payload: { request, artifactName, defaultBranch, remote }

agentv5.0.0

Maintains model-visible history, schedules debounced offset-identified LLM turns, runs them through the Workers AI transport, and executes scripts through the capability host.

events.iterate.com/agent/binding-setSets or enriches the typed external object this agent represents. Bindings are normally emitted atomically with integration agent creation, never inferred from paths. Contract-owned but reduced by integration processors, not by the agent.payload: { type, connection, channelId, threadTs, channelName?, url? } | { type, connection, cha…events.iterate.com/agent/configuredMerges a partial configuration into the agent's config; omitted keys keep their current values.payload: { config }events.iterate.com/agent/createdThe agent exists. Payload is open — provenance may ride along.payload: { …any }events.iterate.com/agent/llm-request-requestedThe recorded INTENT to run one LLM turn. Carries no id: the request's identity is the offset this event gets on commit. The reduce ignores it when no trigger is pending or a request already is open — a late debounced intent is a harmless stream fact.payload: { model, expiresAt }events.iterate.com/agent/llm-request-settledThe ONE terminal fact for an LLM request (succeeded | failed | cancelled), pointing back at the requested event's offset. Idempotency-keyed on that offset, so a zombie driver racing a fresh incarnation or an interrupt collapses to one settlement.payload: { requestOffset, durationMs?, result }events.iterate.com/agent/llm-response-chunkOne streamed chunk received from the transport, verbatim. Ephemeral: it reaches ephemeral subscriptions (browser feed, TUI) but is excluded from default reads, never delivered to durable subscribers, and evictable — the durable truth is the assistant context item / llm-request-settled pair.payload: { chunk, llmRequestOffset, sequence }events.iterate.com/agent/pausedThe agent stopped scheduling turns (autonomous-loop breaker, or an operator). Mirrors stream/paused. The next external message resumes it; self-driven triggers stay parked.payload: { reason? }events.iterate.com/agent/resumedThe agent resumed scheduling turns. Mirrors stream/resumed.payload: { reason? }events.iterate.com/agent/summary-updatedUpdates the agent's human-readable summary. Omitted fields remain unchanged, null clears an optional field, and pinned false unpins. The same event is used whether an agent or a human initiated the edit; the processor's own conditional waiting clear ({ waitingFor: null, clearWaitingForThroughOffset }) only clears a wait established at or before the waking input's offset.payload: { title?, description?, activity?, waitingFor?, pinned? } | { waitingFor, clearWaitingF…events.iterate.com/agent/token-usage-reportedNormalized token counts and the model's context window for a successful LLM request. The processor translates vendor usage dialects (input_tokens vs prompt_tokens) at source, so consumers — the state tally, cost views, and compaction — see one shape.payload: { llmRequestOffset, model, maxContextTokens, inputTokens, outputTokens, cachedInputToke…events.iterate.com/agents/context-addedModel-visible context arrived (user message, developer note, assistant output, system item). The single source of truth for what the LLM sees.payload: { role, content, key?, files?, refs?, actor?, llmRequestPolicy?, llmRequestOffset?, com…events.iterate.com/agents/web-message-sentA visible agent message was sent to the web UI (itx.chat.sendMessage). The processor mirrors it back into context as assistant history so the model sees what it sent.payload: { message, files? }

capability-hostv0.4.0

A tiny dynamic capability table and script execution stream.

events.iterate.com/capability-host/capability-providedA capability was mounted at a path.payload: { type, path, instructions?, types?, flattenNestedPaths? } | { type, path, expression, …events.iterate.com/capability-host/capability-revokedA dynamic capability was removed.payload: { path, providedAtOffset? }events.iterate.com/capability-host/createdCreates a capability-host processor on this stream. The birth certificate records the scope's `fallback`: the itx expression a capability miss follows (usually straight to the project root host), or null at the root.payload: { config, fallback? }events.iterate.com/capability-host/script-run-requestedA script should run in this capability scope. Before any attempt starts, the code is typechecked against the scope's capability types: a script with a PROVABLE error — a syntax error, or a near-miss typo where the compiler names the fix ("Did you mean 'get'?") — settles straight to an error completion carrying the compiler errors, without ever running (no started event). Everything less certain runs: capabilities are provided dynamically and declared types can lag the runtime, so bare property/argument mismatches, unknown/untyped capabilities, non-async block shapes, and checker failures all let the script run unchecked.payload: { code, executionId, expiresAt }events.iterate.com/capability-host/script-run-settledThe one durable settlement for a script obligation. Failures classify where execution stopped, whether script code may have run, and whether cancellation can prove external work ended.payload: { executionId, settlement }events.iterate.com/capability-host/script-run-startedAn attempt to run the script began. Appended BEFORE the script body executes, so requested-without-started provably never ran (safe to start late) while started-without-settled died mid-run (settled as failure, never re-run).payload: { executionId }

secretv0.7.0

Reduces one path-addressed secret — birth policy, encrypted material, egress pin, refresh strategy, usage audit — without ever exposing material.

sandboxv0.4.1

Sandbox lifecycle: explicit create/start/sleep/destroy commands and their completions, workspace snapshot/restore persistence, and configuration changes.

events.iterate.com/sandbox/backup-created/workspace was snapshotted to R2 (an explicit sleep() or the idle timer); this backup is what the next start restores.payload: { backupId }events.iterate.com/sandbox/backup-failedA workspace snapshot failed; the container still stops, and the previous good backup (if any) remains the restore source.payload: { error }events.iterate.com/sandbox/configuredThe sandbox's env-var map changed (setEnvVars, or `env` at create). `env` is the map set in this change (key → value; null = key unset); values are conventionally `getSecret(path)` placeholders substituted only at egress, or non-secret literals. NEVER put raw secret material in a value — it lands on this durable stream.payload: { env }events.iterate.com/sandbox/create-requesteditx.sandboxes.get(path).create was called: the claimed path, the requested instance type (fixed for the sandbox's whole life) and any initial config. UNLIKE every other sandbox event this lands on the /sandboxes CATALOGUE stream, idempotency-keyed by path — the append IS the atomic name claim, and its instance type is what routes get(path) to the right container namespace. Setup follows; `created` (on the sandbox's own stream) confirms it.payload: { path, instanceType, sleepAfter?, keepAlive?, env? }events.iterate.com/sandbox/createdThe sandbox exists: identity and configuration are durably stored and itx.sandboxes.get(path) resolves it. No container is running yet — the first command (or start()) boots one.payload: { config }events.iterate.com/sandbox/destroy-requesteddestroy() was called: tear the sandbox down permanently. `destroyed` confirms.payload: {}events.iterate.com/sandbox/destroyedThe sandbox is permanently gone: container torn down and the identity tombstoned — the path can never be created again (pick a new name). Workspace snapshots in R2 age out on their ttl.payload: {}events.iterate.com/sandbox/kill-requestedkill() was called: the current Durable Object incarnation is deliberately aborted after this fact is durably reduced. The container lifecycle and reduced running state are unchanged; the next request boots a fresh object around the same sandbox.payload: {}events.iterate.com/sandbox/sleep-requestedsleep() was called (Cloudflare's word for what the idle timer does, on demand): snapshot /workspace, then tear the container down. The sandbox stays created — the next start (or command) boots a fresh container and restores the snapshot. The SDK's stop() forwards here so no spelling skips the snapshot.payload: {}events.iterate.com/sandbox/start-requestedstart() was called: boot the container now (rather than lazily on the first command). `started` confirms the boot.payload: {}events.iterate.com/sandbox/startedThe sandbox container booted (the SDK's onStart hook) — after an explicit start() OR implicitly because a command reached a stopped sandbox. /workspace is restored from the newest snapshot before commands run.payload: {}events.iterate.com/sandbox/stoppedThe sandbox container exited (the SDK's onStop hook) — after an explicit sleep(), the idle timer (sleepAfter), or a destroy. May be appended on a LATER wake: the SDK delivers a stop that happened while the Durable Object was hibernated on the next wake.payload: {}events.iterate.com/sandbox/workspace-restored/workspace was restored from the named R2 snapshot into the fresh container — what makes stop/sleep survivable: files under /workspace come back, everything else on the container disk is gone.payload: { backupId }

workspacev0.3.0

Workspace lifecycle and configuration: birth certificate plus the mount table (mount path → repo, with a per-mount commit policy) that routes the workspace's fall-through reads and commits.

slackv0.3.0

Routes raw Slack webhooks into Slack-backed agent streams: reduces a `channel:thread_ts → stream path` routing table, births the routed agent stream on first contact, and forwards each webhook unchanged. It never interprets webhooks as agent context — that is the slack-agent processor's job.

slack-agentv0.11.0

Handles Slack-specific behavior for one routed Slack agent stream: transcribes forwarded webhooks into agent context (mention-gated LLM wake), compiles !bang commands into script runs, and paints the agent's summary/runtime onto Slack's assistant thread UI.

This processor owns no event types.

telegramv0.4.0

Routes raw Telegram webhook updates into Telegram-backed agent streams.

telegram-agentv0.3.0

Handles Telegram-specific behavior for one routed Telegram agent stream.

browser-raw-eventsv0.1.0

Mirrors raw stream events into the browser SQLite events table.

This processor owns no event types.

browser-feedv0.4.0

Browser-side projector reducing every stream event into the single feed_items table (pretty agent rows and grouped raw rows in one total order) plus live in-flight agent state.

This processor owns no event types.