runtime-context turn text
The plugin registers three per-turn text providers under the turn-context name, so the runtime facts stay
fresh without changing the cached system prompt. The renderers live in packages/plugin-shared/runtimeContext.mjs
and are shared with voice calls, and ctx.timezone() is also the scheduler's operator clock.
Providers
runtimeClock(await ctx.timezone())— the current weekday, date, time and zone.runtimeIdentity(await ctx.currentIdentity())— the sender and the conversation surface.- The managed-Project note, registered with
{ placement: 'after-user' }: it is emitted only when the active access has amanagedproject andctx.workDir()matches^/[a-z0-9][a-z0-9-]*$. It readsExecution: isolated environment of project "<name>" (container; project files at <root>, host filesystem not reachable).
Clock line
Current date & time: Friday, 9 October 2026, 09:03 (Europe/Prague, midday).
The part of the day is derived from the hour: early morning before 5, morning before 9, midday before 12,
afternoon before 17, then night. evening is declared in DAYPARTS but unreachable in that order.
Identity line
You are speaking with Alex (Elowen account #12, the operator of this instance), on discord, in a shared room other people can read, so the sender changes from message to message. Their name is Alex.
An account without an elowenUserId renders as an unverified sender with no linked Elowen account. Surfaces
come from SURFACES: own (their own Elowen chat), direct (a 1:1 chat), shared (a read-shared room) and
delegated (a sub-agent run with no conversation of its own); an unknown key reads an unrecognised surface.
User-controlled fields pass safe(), which strips brackets and line breaks and truncates to 80 characters, so a
display name cannot forge another context line.
Timezone resolution
createTimezoneResolver(readTimezone, warn) reads the plugin's timezone setting on every call. An empty value
uses the server zone, and a failed read falls back to it too.
A configured value is validated with Intl.DateTimeFormat; an invalid one falls back to the server zone with a
warn-once message. Changes therefore apply from the next turn, while saving the setting still requests the
restart the manifest asks for.