Three workstreams implemented: W1 (Repo Split): Remove proprietary BloxServer files and docs, update pyproject.toml URLs to public GitHub, clean doc references, add CI workflow (.github/workflows/ci.yml) and CONTRIBUTING.md. W2 (Message Journal): Add DispatchHook protocol for dispatch lifecycle events, SQLite-backed MessageJournal with WAL mode for certified-mail delivery guarantees (PENDING→DISPATCHED→ACKED/FAILED), integrate hooks into StreamPump._dispatch_to_handlers(), add journal REST endpoints, and aiosqlite dependency. W3 (Hot Deployment): Add RestartOrchestrator for graceful restart with queue drain and journal stats collection, SIGHUP signal handler in CLI, POST /organism/restart endpoint, restart-aware app lifespan with journal recovery on boot, and os.execv/subprocess re-exec for Unix/Windows. All 439 tests pass (37 new tests for W2/W3). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
139 lines
3.2 KiB
Python
139 lines
3.2 KiB
Python
"""
|
|
message_bus — Stream-based message pump for AgentServer v2.1
|
|
|
|
The message pump handles message flow through the organism:
|
|
- YAML config → bootstrap → pump → handlers → responses → loop
|
|
|
|
Key classes:
|
|
StreamPump Main pump class (queue-backed, aiostream-powered)
|
|
SystemPipeline Entry point for external messages (console, webhook)
|
|
ConfigLoader Load organism.yaml and resolve imports
|
|
Listener Runtime listener with handler and routing info
|
|
MessageState Message flowing through pipeline steps
|
|
|
|
Usage:
|
|
from xml_pipeline.message_bus import StreamPump, SystemPipeline, bootstrap
|
|
|
|
pump = await bootstrap("config/organism.yaml")
|
|
system = SystemPipeline(pump)
|
|
|
|
# Inject from console
|
|
thread_id = await system.inject_console("@greeter Dan", user="admin")
|
|
|
|
await pump.run()
|
|
"""
|
|
|
|
from xml_pipeline.message_bus.stream_pump import (
|
|
StreamPump,
|
|
ConfigLoader,
|
|
Listener,
|
|
ListenerConfig,
|
|
OrganismConfig,
|
|
bootstrap,
|
|
get_stream_pump,
|
|
set_stream_pump,
|
|
reset_stream_pump,
|
|
# Event hooks
|
|
PumpEvent,
|
|
MessageReceivedEvent,
|
|
MessageSentEvent,
|
|
AgentStateEvent,
|
|
ThreadEvent,
|
|
ReloadEvent,
|
|
)
|
|
|
|
from xml_pipeline.message_bus.message_state import (
|
|
MessageState,
|
|
HandlerMetadata,
|
|
)
|
|
|
|
from xml_pipeline.message_bus.system_pipeline import (
|
|
SystemPipeline,
|
|
ExternalMessage,
|
|
)
|
|
|
|
from xml_pipeline.message_bus.sequence_registry import (
|
|
SequenceState,
|
|
SequenceRegistry,
|
|
get_sequence_registry,
|
|
reset_sequence_registry,
|
|
)
|
|
|
|
from xml_pipeline.message_bus.buffer_registry import (
|
|
BufferState,
|
|
BufferItemResult,
|
|
BufferRegistry,
|
|
get_buffer_registry,
|
|
reset_buffer_registry,
|
|
)
|
|
|
|
from xml_pipeline.message_bus.budget_registry import (
|
|
ThreadBudget,
|
|
ThreadBudgetRegistry,
|
|
BudgetExhaustedError,
|
|
get_budget_registry,
|
|
configure_budget_registry,
|
|
reset_budget_registry,
|
|
)
|
|
|
|
from xml_pipeline.message_bus.dispatch_hook import (
|
|
DispatchHook,
|
|
NullDispatchHook,
|
|
)
|
|
|
|
from xml_pipeline.message_bus.journal import (
|
|
MessageJournal,
|
|
JournalEntry,
|
|
JournalEntryStatus,
|
|
)
|
|
|
|
__all__ = [
|
|
# Pump
|
|
"StreamPump",
|
|
"ConfigLoader",
|
|
"Listener",
|
|
"ListenerConfig",
|
|
"OrganismConfig",
|
|
"bootstrap",
|
|
"get_stream_pump",
|
|
"set_stream_pump",
|
|
"reset_stream_pump",
|
|
# Event hooks
|
|
"PumpEvent",
|
|
"MessageReceivedEvent",
|
|
"MessageSentEvent",
|
|
"AgentStateEvent",
|
|
"ThreadEvent",
|
|
"ReloadEvent",
|
|
# Message state
|
|
"MessageState",
|
|
"HandlerMetadata",
|
|
# System pipeline
|
|
"SystemPipeline",
|
|
"ExternalMessage",
|
|
# Sequence registry
|
|
"SequenceState",
|
|
"SequenceRegistry",
|
|
"get_sequence_registry",
|
|
"reset_sequence_registry",
|
|
# Buffer registry
|
|
"BufferState",
|
|
"BufferItemResult",
|
|
"BufferRegistry",
|
|
"get_buffer_registry",
|
|
"reset_buffer_registry",
|
|
# Budget registry
|
|
"ThreadBudget",
|
|
"ThreadBudgetRegistry",
|
|
"BudgetExhaustedError",
|
|
"get_budget_registry",
|
|
"configure_budget_registry",
|
|
"reset_budget_registry",
|
|
# Dispatch hooks
|
|
"DispatchHook",
|
|
"NullDispatchHook",
|
|
# Journal
|
|
"MessageJournal",
|
|
"JournalEntry",
|
|
"JournalEntryStatus",
|
|
]
|