124 lines
3.6 KiB
Python
124 lines
3.6 KiB
Python
"""Workshop world state API and WebSocket relay.
|
|
|
|
Serves Timmy's current presence state to the Workshop 3D renderer.
|
|
The primary consumer is the browser on first load — before any
|
|
WebSocket events arrive, the client needs a full state snapshot.
|
|
|
|
The ``/ws/world`` endpoint streams ``timmy_state`` messages whenever
|
|
the heartbeat detects a state change. It also accepts ``visitor_message``
|
|
frames from the 3D client and responds with ``timmy_speech`` barks.
|
|
|
|
Source of truth: ``~/.timmy/presence.json`` written by
|
|
:class:`~timmy.workshop_state.WorkshopHeartbeat`.
|
|
Falls back to a live ``get_state_dict()`` call if the file is stale
|
|
or missing.
|
|
"""
|
|
|
|
from fastapi import APIRouter
|
|
|
|
# Import submodule routers
|
|
from .bark import matrix_router as _bark_matrix_router
|
|
from .matrix import matrix_router as _matrix_matrix_router
|
|
from .state import router as _state_router
|
|
from .websocket import router as _ws_router
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Combine sub-routers into the two top-level routers that app.py expects
|
|
# ---------------------------------------------------------------------------
|
|
|
|
router = APIRouter(prefix="/api/world", tags=["world"])
|
|
|
|
# Include state routes (GET /state)
|
|
for route in _state_router.routes:
|
|
router.routes.append(route)
|
|
|
|
# Include websocket routes (WS /ws)
|
|
for route in _ws_router.routes:
|
|
router.routes.append(route)
|
|
|
|
# Combine matrix sub-routers
|
|
matrix_router = APIRouter(prefix="/api/matrix", tags=["matrix"])
|
|
|
|
for route in _bark_matrix_router.routes:
|
|
matrix_router.routes.append(route)
|
|
|
|
for route in _matrix_matrix_router.routes:
|
|
matrix_router.routes.append(route)
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Re-export public API for backward compatibility
|
|
# ---------------------------------------------------------------------------
|
|
|
|
# Used by src/dashboard/app.py
|
|
# Used by tests
|
|
from .bark import ( # noqa: E402, F401
|
|
_BARK_RATE_LIMIT_SECONDS,
|
|
_GROUND_TTL,
|
|
_MAX_EXCHANGES,
|
|
BarkRequest,
|
|
_bark_and_broadcast,
|
|
_bark_last_request,
|
|
_conversation,
|
|
_generate_bark,
|
|
_handle_client_message,
|
|
_log_bark_failure,
|
|
_refresh_ground,
|
|
post_matrix_bark,
|
|
reset_conversation_ground,
|
|
)
|
|
from .commitments import ( # noqa: E402, F401
|
|
_COMMITMENT_PATTERNS,
|
|
_MAX_COMMITMENTS,
|
|
_REMIND_AFTER,
|
|
_build_commitment_context,
|
|
_commitments,
|
|
_extract_commitments,
|
|
_record_commitments,
|
|
_tick_commitments,
|
|
close_commitment,
|
|
get_commitments,
|
|
reset_commitments,
|
|
)
|
|
from .matrix import ( # noqa: E402, F401
|
|
_DEFAULT_MATRIX_CONFIG,
|
|
_build_matrix_agents_response,
|
|
_build_matrix_health_response,
|
|
_build_matrix_memory_response,
|
|
_build_matrix_thoughts_response,
|
|
_check_capability_bark,
|
|
_check_capability_familiar,
|
|
_check_capability_lightning,
|
|
_check_capability_memory,
|
|
_check_capability_thinking,
|
|
_load_matrix_config,
|
|
_memory_search_last_request,
|
|
get_matrix_agents,
|
|
get_matrix_config,
|
|
get_matrix_health,
|
|
get_matrix_memory_search,
|
|
get_matrix_thoughts,
|
|
)
|
|
from .state import ( # noqa: E402, F401
|
|
_STALE_THRESHOLD,
|
|
_build_world_state,
|
|
_get_current_state,
|
|
_read_presence_file,
|
|
get_world_state,
|
|
)
|
|
from .utils import ( # noqa: E402, F401
|
|
_compute_circular_positions,
|
|
_get_agent_color,
|
|
_get_agent_shape,
|
|
_get_client_ip,
|
|
)
|
|
|
|
# Used by src/infrastructure/presence.py
|
|
from .websocket import ( # noqa: E402, F401
|
|
_authenticate_ws,
|
|
_broadcast,
|
|
_heartbeat,
|
|
_ws_clients, # noqa: E402, F401
|
|
broadcast_world_state, # noqa: E402, F401
|
|
world_ws,
|
|
)
|