Server-side execution engine for the matrx scheduling spine (sch_* tables): scanner, claim, runner, cron parser, HTTP API.
Project description
matrx-scheduler
Server-side execution engine for the matrx scheduling spine (sch_* tables in
Supabase). Provides:
- a scanner loop that claims due tasks atomically,
- a runner that drives the host's agent_runner / tool_runner,
- an authoritative cron parser + next-due computation,
- and (since 0.3) an HTTP API surface (FastAPI) for task / trigger / run CRUD, manual fires, scanner status, and cron preview.
Any host application (aidream is the reference) wires it up via configure()
and either runs the scanner directly, mounts the HTTP routes, or both.
What it does (under the hood)
- Polls
sch_taskfor rows wherenext_due_at <= now()and the host surface is insurfaces[](or'any'). - Atomically claims a candidate by inserting a
sch_runwithclaim_tokenandclaim_expires_at(the lease). - Drives the matrx-ai agent runner (host-injected) against the claimed task,
or the host's tool_runner for
kind='tool'. - Writes back results (
status,result_summary,output_ref, etc.). - Recomputes the next fire time on recurring triggers; the DB cascade
updates
sch_task.next_due_atautomatically.
Capability-within, injection-without
matrx-scheduler doesn't import from a host app. It exposes a configure()
function the host calls at startup, passing in:
supabase_client— service-role client used by the SCANNER to read sch_task across users and update lease state.surface— the string this host identifies as insch_task.surfaces[](e.g.'server'for aidream,'desktop'for matrx-local).agent_runner— callable that runs an agent (kind='agent' tasks).tool_runner— optional callable for kind='tool' tasks. Hosts that don't claim tool tasks (e.g. aidream itself) leave this unset.user_supabase_factory— optional callable(user_jwt) -> AsyncClientused by the HTTP routes to build per-request user-scoped clients. If not provided, the package falls back to an env-based factory keyed onSUPABASE_MATRIX_URL+SUPABASE_MATRIX_PUBLISHABLE_KEY.get_app_context,emitter_factory,scan_interval_seconds,lease_seconds— see the_ext.configuredocstring.
Install with the host extra (pip install matrx-scheduler[host]) when
using it inside a full host app. Add the api extra
(pip install matrx-scheduler[api]) to mount the HTTP routes.
HTTP API
Available since 0.3. Optional — drop the import if you only want the scanner.
from fastapi import FastAPI
import matrx_scheduler
app = FastAPI()
# Host startup wiring (any host).
matrx_scheduler.configure(
supabase_client=service_role_client,
surface="server", # or "desktop", "extension", ...
agent_runner=my_agent_runner,
user_supabase_factory=my_user_client_factory, # optional
)
await matrx_scheduler.start_scanner()
# Mount the HTTP routes.
matrx_scheduler.api.include_routers(app, prefix="/scheduler")
Endpoints
All routes use matrx_connect.AppContext via Depends(context_dep). Every
write goes through a per-request Supabase client built from the caller's JWT;
RLS is the only line of authority on row ownership. The service-role client
(used by the scanner) is never accessible from these routes.
| Method | Path | Purpose |
|---|---|---|
| POST | /scheduler/tasks |
Create a task (optionally with agent_task + trigger) |
| GET | /scheduler/tasks |
List tasks (filter by kind, enabled) |
| GET | /scheduler/tasks/{id} |
Get task hydrated with agent_task, triggers, runs |
| PATCH | /scheduler/tasks/{id} |
Patch task fields (title, enabled, tags, etc.) |
| DELETE | /scheduler/tasks/{id} |
Soft-delete (set enabled=false) |
| POST | /scheduler/tasks/{id}/run-now |
Enqueue a manual run via sch_enqueue_manual_run |
| GET | /scheduler/triggers?task_id=... |
List triggers for a task |
| POST | /scheduler/triggers |
Create a trigger on an existing task |
| PATCH | /scheduler/triggers/{id} |
Patch a trigger (recomputes next_due_at if type/config changed) |
| DELETE | /scheduler/triggers/{id} |
Hard-delete a trigger |
| GET | /scheduler/runs?task_id=...&status=... |
List run history |
| GET | /scheduler/runs/{id} |
Get one run |
| POST | /scheduler/cron/validate |
Validate a cron expression + preview next N fires |
| POST | /scheduler/cron/preview-fires |
Preview next-fire times for any trigger config |
| POST | /scheduler/compute-next-due-at |
Compute the single next due_at for a trigger config |
| GET | /scheduler/status |
Scanner health (admin only) |
Co-existence with aidream's /scheduling/*
aidream had a small router at /scheduling/* (cron validation, run-now,
admin force-disable) before this surface existed. The package routes use
/scheduler/* (singular) so they don't collide. aidream can mount both
simultaneously, or migrate clients to the package routes opportunistically.
matrx-local mounts only the package routes; it has no /scheduling/* routes
to begin with.
See docs/SCHEDULING.md in the matrx-frontend repo for the full data-model
spec, trigger taxonomy, and lifecycle.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file matrx_scheduler-0.3.0.tar.gz.
File metadata
- Download URL: matrx_scheduler-0.3.0.tar.gz
- Upload date:
- Size: 40.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
539387d0604e094749ef73883483b1532b4f2ac66441e21a2ab1d6f349c39ff9
|
|
| MD5 |
b5cea677fae6e141e3ea37c68742c977
|
|
| BLAKE2b-256 |
7154a5cbcb8b4cf980843d3e5803a97fbf99583ed554077e4554ae55311ca84e
|
Provenance
The following attestation bundles were made for matrx_scheduler-0.3.0.tar.gz:
Publisher:
publish-package.yml on AI-Matrix-Engine/aidream
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
matrx_scheduler-0.3.0.tar.gz -
Subject digest:
539387d0604e094749ef73883483b1532b4f2ac66441e21a2ab1d6f349c39ff9 - Sigstore transparency entry: 1781294286
- Sigstore integration time:
-
Permalink:
AI-Matrix-Engine/aidream@aff98394e692c264b94c49c31b0f85de615d08ad -
Branch / Tag:
refs/tags/matrx-scheduler/v0.3.0 - Owner: https://github.com/AI-Matrix-Engine
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-package.yml@aff98394e692c264b94c49c31b0f85de615d08ad -
Trigger Event:
push
-
Statement type:
File details
Details for the file matrx_scheduler-0.3.0-py3-none-any.whl.
File metadata
- Download URL: matrx_scheduler-0.3.0-py3-none-any.whl
- Upload date:
- Size: 35.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
585496281292fd2b3d1807ade49a9279ce394613434308245b665d72c2e6fbc0
|
|
| MD5 |
74f55644f535681b4ccb60cd8baa5fe7
|
|
| BLAKE2b-256 |
94beac145022ab74b65c32d66f6403f07b71a5f134c650c81535465a81dcaaa0
|
Provenance
The following attestation bundles were made for matrx_scheduler-0.3.0-py3-none-any.whl:
Publisher:
publish-package.yml on AI-Matrix-Engine/aidream
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
matrx_scheduler-0.3.0-py3-none-any.whl -
Subject digest:
585496281292fd2b3d1807ade49a9279ce394613434308245b665d72c2e6fbc0 - Sigstore transparency entry: 1781294399
- Sigstore integration time:
-
Permalink:
AI-Matrix-Engine/aidream@aff98394e692c264b94c49c31b0f85de615d08ad -
Branch / Tag:
refs/tags/matrx-scheduler/v0.3.0 - Owner: https://github.com/AI-Matrix-Engine
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-package.yml@aff98394e692c264b94c49c31b0f85de615d08ad -
Trigger Event:
push
-
Statement type: