2026-05-27 17:07:20 +02:00
|
|
|
"""Triggers domain: registry surface + built-in trigger packages.
|
|
|
|
|
|
2026-05-27 22:29:51 +02:00
|
|
|
Each trigger lives in its own subpackage (``schedule/``, ...) and
|
2026-05-27 17:07:20 +02:00
|
|
|
self-registers at import time via its ``definition`` module.
|
|
|
|
|
"""
|
2026-05-26 22:38:41 +02:00
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
feat(automation): add empty Capability / Action / Trigger registries
Three registries under app/automations/registries/, each as its own
folder with the same SRP-per-file split (types.py for the dataclass,
store.py for the in-memory dict + register/get/all functions). All
three start empty; concrete entries land when the user signs off on
which capabilities / actions / triggers to include (step 2).
Capability (locked at v1-minimum five fields — see commit 2):
- id, description, input_schema, output_schema, handler
- CapabilityHandler = Callable[[dict[str, Any]], Awaitable[Any]]
- Frozen, slotted dataclass (immutable post-registration).
ActionDefinition (v1-trim of design plan §4):
- type, name, description, config_schema, handler
- Defers output_contract (handled per-step by agent_task's
config.output_schema), uses_capabilities (no static analysis
needed until >1 action ships), and produces_artifacts (deferred
alongside the artifact pipeline).
TriggerDefinition (declarative, no handler):
- type, description, config_schema, payload_schema
- No handler field — firing is a single dispatcher's
responsibility, not a per-trigger one.
store.py contract for all three:
- register_*: idempotent at process startup, raises on duplicate
- get_*: returns None on miss
- all_*: returns a defensive copy of the registry dict
Verified by an inline smoke test (10 checks): empty initial state,
registration and lookup work, duplicates raise, frozen dataclasses
reject mutation, snapshots are copies, handlers are awaitable.
Isolation invariant audit: grep across the full app/automations/
tree shows only three app.* imports, all of them
``from app.db import BaseModel, TimestampMixin`` in the model files.
No imports from app.agents.*, app.services.*, app.tasks.*,
app.routes.*, or any other business-logic module.
2026-05-26 22:54:17 +02:00
|
|
|
from .store import all_triggers, get_trigger, register_trigger
|
|
|
|
|
from .types import TriggerDefinition
|
|
|
|
|
|
|
|
|
|
__all__ = [
|
|
|
|
|
"TriggerDefinition",
|
|
|
|
|
"all_triggers",
|
|
|
|
|
"get_trigger",
|
|
|
|
|
"register_trigger",
|
|
|
|
|
]
|
2026-05-27 13:58:57 +02:00
|
|
|
|
|
|
|
|
# Built-in triggers self-register at import time.
|
2026-05-27 22:29:51 +02:00
|
|
|
from . import schedule # noqa: E402, F401
|