feat(bot): dialog engine — scrub → safety → FSM → monitoring, consent, age gate, crisis
CI / ruff · pytest (pull_request) Successful in 25s
CI / ruff · pytest (pull_request) Successful in 25s
- Engine.handle registered via register_engine; lexicon-first safety (no LLM on ACUTE), fixed crisis script once per open crisis, POSSIBLE → C-SSRS screen - FSM registry (@state/@on_enter/@trigger) with auto-loaded flows; core flow: new → consent → age_gate → module onboarding → idle, crisis, consent_revoked - reusable scale session (buttons, extract_item + clarify, item 9 / C-SSRS buttons-only, crisis flags), execution of monitoring dialog actions, texts in config/texts/dialog.yaml Refs #10 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
"""Dialog flows. Each module here registers its FSM states at import time (`@state`, `@on_enter`, `@trigger`).
|
||||
|
||||
A new direction (veteran #36/#37, family, depression) is a new file `app/dialog/flows/<module>.py`; it is picked
|
||||
up automatically by `load_flows()` — the engine is not edited.
|
||||
"""
|
||||
|
||||
import pkgutil
|
||||
from importlib import import_module
|
||||
|
||||
|
||||
def load_flows() -> None:
|
||||
"""Import every flow module of this package (core first, so flows may override core triggers)."""
|
||||
import_module(f"{__name__}.core")
|
||||
for info in sorted(pkgutil.iter_modules(__path__), key=lambda m: m.name):
|
||||
if info.name != "core" and not info.name.startswith("_"):
|
||||
import_module(f"{__name__}.{info.name}")
|
||||
Reference in New Issue
Block a user