internalEventPublisher is null for a deploy's schedule sync, which has no
topic and whose changes are not an operator's activity.
Schedules start on background-worker's queue rather than the platform worker's.
StaticinstanceThe process control plane of platform-temporal
namespace names; { namespace: "background" } is background-
Optionalpolicies?: TemporalSchedulePolicyInputOptionalstate?: { note: string; paused: boolean }Set by a deploy to create a schedule that starts held. Omitted → running.
OptionaltaskQueue?: stringOptionalworkflowArgs?: unknown[]Arguments the scheduled workflow starts with. Defaults to none.
Remove a schedule. Runs it already started are left to finish. Only the
worker's registry calls this, for an id a registry entry replaces.
Describe a single schedule. Returns status: "not_scheduled"
(not an error) when the schedule does not exist — the create-bootstrap
affordance keys off exactly this.
Past runs come back with outcome: "started"; call enrichRuns to
resolve terminal outcomes (a per-run workflow describe).
Resolve terminal outcomes for the given runs by describing each workflow
execution once. Best-effort per run: a run whose execution can't be
described (retention-aged-out, transient) keeps its prior outcome.
Runs already "running" are left as-is.
One run's input, activities and failure, read from its event history.
undefined when the run does not exist or has aged out of retention;
infra faults throw.
List recent executions of a workflow type via Temporal visibility, optionally narrowed to a workflowId prefix (client-side filter — prefix operators aren't portable across visibility stores). Newest-first.
Surfaces runs the schedule doesn't track (e.g. manually started backfills). Like describe, this is a read: infra faults (temporal-api or Temporal unreachable) throw.
OptionalexcludeWorkflowIdInfix?: stringSkip ids containing this substring. Both filters run inside the paging
loop, before limit is counted — a caller excluding fan-out children
(whose ids extend their parent's, so they share its prefix and can
outnumber it 80:1) would otherwise get a page of nothing but children.
Optionallimit?: numberOptionalworkflowIdPrefix?: stringPause a schedule with an audit note (carries the actor id).
Trigger a single immediate run, overriding the overlap policy for this one
action so a manual run is never silently dropped by a SKIP policy.
Returns SCHEDULE_NOT_FOUND (not a throw) when the schedule is
missing, so the UI can steer the operator to create it first.
Undo pause-on-failure on one schedule in a single update: turn the policy off, and resume the schedule if Temporal itself paused it after a failed run. An operator's pause stays, as does everything else on the schedule. Skips the write when neither applies, which is every boot after the first.
Resume a paused schedule with an audit note (carries the actor id).
Edit a schedule's cadence and policies in place. The workflow action
(type / task queue) is preserved from the existing schedule; only the spec,
policies, and (when given) workflow args the operator controls are
replaced. workflowArgs replaces the action's args wholesale — pass the
complete argument list, not a patch. Pause-on-failure is always written
off, whatever the schedule carried.
note stamps the schedule's state note the same way pause / unpause
do, so a cadence edit leaves the same audit trail as a pause. Temporal has
no dedicated note argument on update, so it is written through
state.note; omitting it preserves whatever note is already there rather
than clearing another actor's stamp.
Operator-facing control plane for Temporal schedules, backing every admin-dashboard surface that masters one: Reports, Victor transaction sync, and the System › Schedules surface (ACH file generation, card clearing, Solana nonce pool). The dashboard is the sole master of these schedules — the temporal-worker no longer upserts them, so create / edit / pause / trigger here are authoritative and survive worker deploys.
Modeled on CacheBusterService: it wraps an infra client (Temporal, not Valkey), and a missing schedule is returned as data (
status: "not_scheduled") rather than thrown, because "this thing has no schedule yet" is a state the page must render, not a crash. Genuine non-functional faults (temporal-api or Temporal unreachable) still throw.