mirror of
https://github.com/outbackdingo/optimclaw.git
synced 2026-08-27 08:00:17 +00:00
Introduce a unified EventBus as the single broadcast channel for all system events, replacing the 6 disconnected event mechanisms. Seal Thread/Turn/ContainerState fields behind private accessors with validated transitions to prevent invalid state mutations. Fix TOCTOU races in thread_ops and session_manager. Event bus (src/event_bus/): - SystemEvent envelope with EventPayload (Domain, StateChange, Telemetry, StateTransition, ToolExecution, AuthEvent, ConfigChange) - Four sinks: SSE (→SseManager), audit (→DB with JSONL fallback), state (→StateBus), metrics (→Observer) - AuditStore trait + implementations for PostgreSQL and libSQL - V13 audit_log migration for both backends - Wired into AppComponents and AgentDeps (Option<EventBus> for compat) - Worker dual-emit through bus alongside legacy SSE+DB paths Sealed state machines: - Thread.state private with state() accessor, can_transition_to(), set_processing(), reset_to_idle() - Turn.state private with state() accessor - ContainerHandle.state private with new() constructor, mark_running/stopped/failed(), can_transition_to() - TOCTOU fix: thread_ops moves safety validation before lock, then checks state + starts turn atomically under single lock - SessionManager TOCTOU fix: atomic check-and-insert with write lock held for entire UUID adoption sequence Startup verification: - AppComponents::verify_readiness() checks component presence vs config - ToolRegistry::verify_expected_tools() validates builtin registration - Config::validate() checks cross-field invariants (Docker, WASM dir) [skip-regression-check] Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
25 lines
1.1 KiB
SQL
25 lines
1.1 KiB
SQL
-- Append-only audit log for security-relevant system events.
|
|
-- No UPDATE or DELETE should ever be issued on this table.
|
|
|
|
CREATE TABLE IF NOT EXISTS audit_log (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
event_id BIGINT NOT NULL,
|
|
event_type VARCHAR(64) NOT NULL,
|
|
source_module VARCHAR(64) NOT NULL,
|
|
source_component VARCHAR(64) NOT NULL,
|
|
category VARCHAR(32) NOT NULL,
|
|
session_id UUID,
|
|
thread_id UUID,
|
|
job_id UUID,
|
|
user_id VARCHAR(255),
|
|
payload JSONB NOT NULL DEFAULT '{}',
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Indexes for common query patterns
|
|
CREATE INDEX IF NOT EXISTS idx_audit_log_created_at ON audit_log (created_at DESC);
|
|
CREATE INDEX IF NOT EXISTS idx_audit_log_job_id ON audit_log (job_id) WHERE job_id IS NOT NULL;
|
|
CREATE INDEX IF NOT EXISTS idx_audit_log_session_id ON audit_log (session_id) WHERE session_id IS NOT NULL;
|
|
CREATE INDEX IF NOT EXISTS idx_audit_log_user_id ON audit_log (user_id) WHERE user_id IS NOT NULL;
|
|
CREATE INDEX IF NOT EXISTS idx_audit_log_event_type ON audit_log (event_type);
|