CREATE TABLE IF NOT EXISTS auth_profile_stores ( store_key TEXT NOT NULL PRIMARY KEY, store_json TEXT NOT NULL, updated_at INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS auth_profile_state ( store_key TEXT NOT NULL PRIMARY KEY, state_json TEXT NOT NULL, updated_at INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS diagnostic_events ( scope TEXT NOT NULL, event_key TEXT NOT NULL, payload_json TEXT NOT NULL, created_at INTEGER NOT NULL, PRIMARY KEY (scope, event_key) ); CREATE INDEX IF NOT EXISTS idx_diagnostic_events_scope_created ON diagnostic_events(scope, created_at, event_key); CREATE TABLE IF NOT EXISTS diagnostic_stability_bundles ( bundle_key TEXT NOT NULL PRIMARY KEY, reason TEXT NOT NULL, generated_at TEXT NOT NULL, bundle_json TEXT NOT NULL, created_at INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_diagnostic_stability_bundles_created ON diagnostic_stability_bundles(created_at DESC, bundle_key); CREATE TABLE IF NOT EXISTS state_leases ( scope TEXT NOT NULL, lease_key TEXT NOT NULL, owner TEXT NOT NULL, expires_at INTEGER, heartbeat_at INTEGER, payload_json TEXT, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL, PRIMARY KEY (scope, lease_key) ); CREATE INDEX IF NOT EXISTS idx_state_leases_expiry ON state_leases(expires_at, scope, lease_key) WHERE expires_at IS NOT NULL; CREATE INDEX IF NOT EXISTS idx_state_leases_owner ON state_leases(owner, updated_at DESC); CREATE TABLE IF NOT EXISTS exec_approvals_config ( config_key TEXT NOT NULL PRIMARY KEY, raw_json TEXT NOT NULL, socket_path TEXT, has_socket_token INTEGER NOT NULL, default_security TEXT, default_ask TEXT, default_ask_fallback TEXT, auto_allow_skills INTEGER, agent_count INTEGER NOT NULL, allowlist_count INTEGER NOT NULL, updated_at_ms INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS schema_meta ( meta_key TEXT NOT NULL PRIMARY KEY, role TEXT NOT NULL, schema_version INTEGER NOT NULL, agent_id TEXT, app_version TEXT, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS device_pairing_pending ( request_id TEXT NOT NULL PRIMARY KEY, device_id TEXT NOT NULL, public_key TEXT NOT NULL, display_name TEXT, platform TEXT, device_family TEXT, client_id TEXT, client_mode TEXT, role TEXT, roles_json TEXT, scopes_json TEXT, remote_ip TEXT, silent INTEGER, is_repair INTEGER, ts INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_device_pairing_pending_device ON device_pairing_pending(device_id, ts DESC); CREATE TABLE IF NOT EXISTS device_pairing_paired ( device_id TEXT NOT NULL PRIMARY KEY, public_key TEXT NOT NULL, display_name TEXT, platform TEXT, device_family TEXT, client_id TEXT, client_mode TEXT, role TEXT, roles_json TEXT, scopes_json TEXT, approved_scopes_json TEXT, remote_ip TEXT, tokens_json TEXT, created_at_ms INTEGER NOT NULL, approved_at_ms INTEGER NOT NULL, last_seen_at_ms INTEGER, last_seen_reason TEXT ); CREATE INDEX IF NOT EXISTS idx_device_pairing_paired_approved ON device_pairing_paired(approved_at_ms DESC, device_id); CREATE TABLE IF NOT EXISTS device_bootstrap_tokens ( token_key TEXT NOT NULL PRIMARY KEY, token TEXT NOT NULL, ts INTEGER NOT NULL, device_id TEXT, public_key TEXT, profile_json TEXT, redeemed_profile_json TEXT, pending_profile_json TEXT, issued_at_ms INTEGER NOT NULL, last_used_at_ms INTEGER ); CREATE INDEX IF NOT EXISTS idx_device_bootstrap_tokens_ts ON device_bootstrap_tokens(ts); CREATE TABLE IF NOT EXISTS node_pairing_pending ( request_id TEXT NOT NULL PRIMARY KEY, node_id TEXT NOT NULL, display_name TEXT, platform TEXT, version TEXT, core_version TEXT, ui_version TEXT, device_family TEXT, model_identifier TEXT, client_id TEXT, client_mode TEXT, caps_json TEXT, commands_json TEXT, permissions_json TEXT, remote_ip TEXT, silent INTEGER, ts INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_node_pairing_pending_node ON node_pairing_pending(node_id, ts DESC); CREATE TABLE IF NOT EXISTS node_pairing_paired ( node_id TEXT NOT NULL PRIMARY KEY, token TEXT NOT NULL, display_name TEXT, platform TEXT, version TEXT, core_version TEXT, ui_version TEXT, device_family TEXT, model_identifier TEXT, client_id TEXT, client_mode TEXT, caps_json TEXT, commands_json TEXT, permissions_json TEXT, remote_ip TEXT, bins_json TEXT, created_at_ms INTEGER NOT NULL, approved_at_ms INTEGER NOT NULL, last_connected_at_ms INTEGER, last_seen_at_ms INTEGER, last_seen_reason TEXT ); CREATE INDEX IF NOT EXISTS idx_node_pairing_paired_approved ON node_pairing_paired(approved_at_ms DESC, node_id); CREATE TABLE IF NOT EXISTS device_identities ( identity_key TEXT NOT NULL PRIMARY KEY, device_id TEXT NOT NULL, public_key_pem TEXT NOT NULL, private_key_pem TEXT NOT NULL, created_at_ms INTEGER NOT NULL, updated_at_ms INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_device_identities_device ON device_identities(device_id, updated_at_ms DESC); CREATE TABLE IF NOT EXISTS device_auth_tokens ( device_id TEXT NOT NULL, role TEXT NOT NULL, token TEXT NOT NULL, scopes_json TEXT NOT NULL, updated_at_ms INTEGER NOT NULL, PRIMARY KEY (device_id, role) ); CREATE INDEX IF NOT EXISTS idx_device_auth_tokens_updated ON device_auth_tokens(updated_at_ms DESC, device_id, role); CREATE TABLE IF NOT EXISTS android_notification_recent_packages ( package_name TEXT NOT NULL PRIMARY KEY, sort_order INTEGER NOT NULL, updated_at_ms INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_android_notification_recent_packages_order ON android_notification_recent_packages(sort_order, package_name); CREATE TABLE IF NOT EXISTS macos_port_guardian_records ( pid INTEGER NOT NULL PRIMARY KEY, port INTEGER NOT NULL, command TEXT NOT NULL, mode TEXT NOT NULL, timestamp REAL NOT NULL ); CREATE INDEX IF NOT EXISTS idx_macos_port_guardian_records_port ON macos_port_guardian_records(port, timestamp DESC); CREATE TABLE IF NOT EXISTS workspace_setup_state ( workspace_key TEXT NOT NULL PRIMARY KEY, workspace_path TEXT NOT NULL, version INTEGER NOT NULL, bootstrap_seeded_at TEXT, setup_completed_at TEXT, updated_at INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_workspace_setup_state_path ON workspace_setup_state(workspace_path); CREATE TABLE IF NOT EXISTS native_hook_relay_bridges ( relay_id TEXT NOT NULL PRIMARY KEY, pid INTEGER NOT NULL, hostname TEXT NOT NULL, port INTEGER NOT NULL, token TEXT NOT NULL, expires_at_ms INTEGER NOT NULL, updated_at_ms INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_native_hook_relay_bridges_expires ON native_hook_relay_bridges(expires_at_ms, relay_id); CREATE TABLE IF NOT EXISTS model_capability_cache ( provider_id TEXT NOT NULL, model_id TEXT NOT NULL, name TEXT NOT NULL, input_text INTEGER NOT NULL, input_image INTEGER NOT NULL, reasoning INTEGER NOT NULL, supports_tools INTEGER, context_window INTEGER NOT NULL, max_tokens INTEGER NOT NULL, cost_input REAL NOT NULL, cost_output REAL NOT NULL, cost_cache_read REAL NOT NULL, cost_cache_write REAL NOT NULL, updated_at_ms INTEGER NOT NULL, PRIMARY KEY (provider_id, model_id) ); CREATE INDEX IF NOT EXISTS idx_model_capability_cache_provider_updated ON model_capability_cache(provider_id, updated_at_ms DESC, model_id); CREATE TABLE IF NOT EXISTS agent_model_catalogs ( catalog_key TEXT NOT NULL PRIMARY KEY, agent_dir TEXT NOT NULL, raw_json TEXT NOT NULL, updated_at INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_agent_model_catalogs_agent_dir ON agent_model_catalogs(agent_dir, updated_at DESC); CREATE TABLE IF NOT EXISTS managed_outgoing_image_records ( attachment_id TEXT NOT NULL PRIMARY KEY, session_key TEXT NOT NULL, message_id TEXT, created_at TEXT NOT NULL, updated_at TEXT, retention_class TEXT, alt TEXT NOT NULL, original_media_id TEXT NOT NULL, original_media_subdir TEXT NOT NULL, original_content_type TEXT NOT NULL, original_width INTEGER, original_height INTEGER, original_size_bytes INTEGER, original_filename TEXT, record_json TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_managed_outgoing_images_session ON managed_outgoing_image_records(session_key, created_at DESC, attachment_id); CREATE INDEX IF NOT EXISTS idx_managed_outgoing_images_message ON managed_outgoing_image_records(session_key, message_id, attachment_id) WHERE message_id IS NOT NULL; CREATE TABLE IF NOT EXISTS channel_pairing_requests ( channel_key TEXT NOT NULL, account_id TEXT NOT NULL, request_id TEXT NOT NULL, code TEXT NOT NULL, created_at TEXT NOT NULL, last_seen_at TEXT NOT NULL, meta_json TEXT, PRIMARY KEY (channel_key, account_id, request_id) ); CREATE INDEX IF NOT EXISTS idx_channel_pairing_requests_code ON channel_pairing_requests(channel_key, code); CREATE INDEX IF NOT EXISTS idx_channel_pairing_requests_created ON channel_pairing_requests(channel_key, created_at, request_id); CREATE TABLE IF NOT EXISTS channel_pairing_allow_entries ( channel_key TEXT NOT NULL, account_id TEXT NOT NULL, entry TEXT NOT NULL, sort_order INTEGER NOT NULL, updated_at INTEGER NOT NULL, PRIMARY KEY (channel_key, account_id, entry) ); CREATE INDEX IF NOT EXISTS idx_channel_pairing_allow_account ON channel_pairing_allow_entries(channel_key, account_id, sort_order, entry); CREATE TABLE IF NOT EXISTS web_push_subscriptions ( endpoint_hash TEXT NOT NULL PRIMARY KEY, subscription_id TEXT NOT NULL UNIQUE, endpoint TEXT NOT NULL, p256dh TEXT NOT NULL, auth TEXT NOT NULL, created_at_ms INTEGER NOT NULL, updated_at_ms INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_web_push_subscriptions_updated ON web_push_subscriptions(updated_at_ms DESC, subscription_id); CREATE TABLE IF NOT EXISTS web_push_vapid_keys ( key_id TEXT NOT NULL PRIMARY KEY, public_key TEXT NOT NULL, private_key TEXT NOT NULL, subject TEXT NOT NULL, updated_at_ms INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS apns_registrations ( node_id TEXT NOT NULL PRIMARY KEY, transport TEXT NOT NULL, token TEXT, relay_handle TEXT, send_grant TEXT, installation_id TEXT, topic TEXT NOT NULL, environment TEXT NOT NULL, distribution TEXT, token_debug_suffix TEXT, updated_at_ms INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_apns_registrations_updated ON apns_registrations(updated_at_ms DESC, node_id); CREATE TABLE IF NOT EXISTS node_host_config ( config_key TEXT NOT NULL PRIMARY KEY, version INTEGER NOT NULL, node_id TEXT NOT NULL, token TEXT, display_name TEXT, gateway_host TEXT, gateway_port INTEGER, gateway_tls INTEGER, gateway_tls_fingerprint TEXT, updated_at_ms INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS voicewake_triggers ( config_key TEXT NOT NULL, position INTEGER NOT NULL, trigger TEXT NOT NULL, updated_at_ms INTEGER NOT NULL, PRIMARY KEY (config_key, position) ); CREATE INDEX IF NOT EXISTS idx_voicewake_triggers_trigger ON voicewake_triggers(config_key, trigger); CREATE TABLE IF NOT EXISTS voicewake_routing_config ( config_key TEXT NOT NULL PRIMARY KEY, version INTEGER NOT NULL, default_target_mode TEXT NOT NULL, default_target_agent_id TEXT, default_target_session_key TEXT, updated_at_ms INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS voicewake_routing_routes ( config_key TEXT NOT NULL, position INTEGER NOT NULL, trigger TEXT NOT NULL, target_mode TEXT NOT NULL, target_agent_id TEXT, target_session_key TEXT, updated_at_ms INTEGER NOT NULL, PRIMARY KEY (config_key, position), FOREIGN KEY (config_key) REFERENCES voicewake_routing_config(config_key) ON DELETE CASCADE ); CREATE INDEX IF NOT EXISTS idx_voicewake_routing_routes_trigger ON voicewake_routing_routes(config_key, trigger); CREATE TABLE IF NOT EXISTS update_check_state ( state_key TEXT NOT NULL PRIMARY KEY, last_checked_at TEXT, last_notified_version TEXT, last_notified_tag TEXT, last_available_version TEXT, last_available_tag TEXT, auto_install_id TEXT, auto_first_seen_version TEXT, auto_first_seen_tag TEXT, auto_first_seen_at TEXT, auto_last_attempt_version TEXT, auto_last_attempt_at TEXT, auto_last_success_version TEXT, auto_last_success_at TEXT, updated_at_ms INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS config_health_entries ( config_path TEXT NOT NULL PRIMARY KEY, last_known_good_json TEXT, last_promoted_good_json TEXT, last_observed_suspicious_signature TEXT, updated_at_ms INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS installed_plugin_index ( index_key TEXT NOT NULL PRIMARY KEY, version INTEGER NOT NULL, host_contract_version TEXT NOT NULL, compat_registry_version TEXT NOT NULL, migration_version INTEGER NOT NULL, policy_hash TEXT NOT NULL, generated_at_ms INTEGER NOT NULL, refresh_reason TEXT, install_records_json TEXT NOT NULL, plugins_json TEXT NOT NULL, diagnostics_json TEXT NOT NULL, warning TEXT, updated_at_ms INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_installed_plugin_index_generated ON installed_plugin_index(generated_at_ms DESC, index_key); CREATE TABLE IF NOT EXISTS gateway_restart_sentinel ( sentinel_key TEXT NOT NULL PRIMARY KEY, version INTEGER NOT NULL, kind TEXT NOT NULL, status TEXT NOT NULL, ts INTEGER NOT NULL, session_key TEXT, thread_id TEXT, delivery_channel TEXT, delivery_to TEXT, delivery_account_id TEXT, message TEXT, continuation_json TEXT, doctor_hint TEXT, stats_json TEXT, payload_json TEXT NOT NULL, updated_at_ms INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_gateway_restart_sentinel_ts ON gateway_restart_sentinel(ts DESC, sentinel_key); CREATE TABLE IF NOT EXISTS gateway_restart_intent ( intent_key TEXT NOT NULL PRIMARY KEY, kind TEXT NOT NULL, pid INTEGER NOT NULL, created_at INTEGER NOT NULL, reason TEXT, force INTEGER, wait_ms INTEGER, updated_at_ms INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS gateway_restart_handoff ( handoff_key TEXT NOT NULL PRIMARY KEY, kind TEXT NOT NULL, version INTEGER NOT NULL, intent_id TEXT NOT NULL, pid INTEGER NOT NULL, process_instance_id TEXT, created_at INTEGER NOT NULL, expires_at INTEGER NOT NULL, reason TEXT, restart_trace_started_at INTEGER, restart_trace_last_at INTEGER, source TEXT NOT NULL, restart_kind TEXT NOT NULL, supervisor_mode TEXT NOT NULL, updated_at_ms INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_gateway_restart_handoff_expiry ON gateway_restart_handoff(expires_at, pid); CREATE TABLE IF NOT EXISTS acp_sessions ( session_key TEXT NOT NULL PRIMARY KEY, session_id TEXT, backend TEXT NOT NULL, agent TEXT NOT NULL, runtime_session_name TEXT NOT NULL, identity_json TEXT, mode TEXT NOT NULL, runtime_options_json TEXT, cwd TEXT, state TEXT NOT NULL, last_activity_at INTEGER NOT NULL, last_error TEXT, updated_at INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_acp_sessions_state_activity ON acp_sessions(state, last_activity_at DESC, session_key); CREATE INDEX IF NOT EXISTS idx_acp_sessions_agent_activity ON acp_sessions(agent, last_activity_at DESC, session_key); CREATE TABLE IF NOT EXISTS acp_replay_sessions ( session_id TEXT NOT NULL PRIMARY KEY, session_key TEXT NOT NULL, cwd TEXT NOT NULL, complete INTEGER NOT NULL, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL, next_seq INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_acp_replay_sessions_key_updated ON acp_replay_sessions(session_key, complete, updated_at DESC, session_id); CREATE INDEX IF NOT EXISTS idx_acp_replay_sessions_updated ON acp_replay_sessions(updated_at DESC, session_id); CREATE TABLE IF NOT EXISTS acp_replay_events ( session_id TEXT NOT NULL, seq INTEGER NOT NULL, at INTEGER NOT NULL, session_key TEXT NOT NULL, run_id TEXT, update_json TEXT NOT NULL, PRIMARY KEY (session_id, seq), FOREIGN KEY (session_id) REFERENCES acp_replay_sessions(session_id) ON DELETE CASCADE ); CREATE INDEX IF NOT EXISTS idx_acp_replay_events_session_seq ON acp_replay_events(session_id, seq); CREATE TABLE IF NOT EXISTS agent_databases ( agent_id TEXT NOT NULL, path TEXT NOT NULL, schema_version INTEGER NOT NULL, last_seen_at INTEGER NOT NULL, size_bytes INTEGER, PRIMARY KEY (agent_id, path) ); CREATE TABLE IF NOT EXISTS plugin_state_entries ( plugin_id TEXT NOT NULL, namespace TEXT NOT NULL, entry_key TEXT NOT NULL, value_json TEXT NOT NULL, created_at INTEGER NOT NULL, expires_at INTEGER, PRIMARY KEY (plugin_id, namespace, entry_key) ); CREATE INDEX IF NOT EXISTS idx_plugin_state_expiry ON plugin_state_entries(expires_at) WHERE expires_at IS NOT NULL; CREATE INDEX IF NOT EXISTS idx_plugin_state_listing ON plugin_state_entries(plugin_id, namespace, created_at, entry_key); CREATE TABLE IF NOT EXISTS channel_ingress_events ( queue_name TEXT NOT NULL, event_id TEXT NOT NULL, channel_id TEXT NOT NULL, account_id TEXT NOT NULL, status TEXT NOT NULL, lane_key TEXT, payload_json TEXT NOT NULL, metadata_json TEXT, received_at INTEGER NOT NULL, updated_at INTEGER NOT NULL, claim_token TEXT, claim_owner TEXT, claimed_at INTEGER, attempts INTEGER NOT NULL DEFAULT 0, last_attempt_at INTEGER, last_error TEXT, failed_reason TEXT, failed_at INTEGER, completed_at INTEGER, completed_metadata_json TEXT, PRIMARY KEY (queue_name, event_id) ); CREATE INDEX IF NOT EXISTS idx_channel_ingress_pending ON channel_ingress_events(queue_name, status, received_at, event_id); CREATE INDEX IF NOT EXISTS idx_channel_ingress_claims ON channel_ingress_events(queue_name, status, claimed_at); CREATE INDEX IF NOT EXISTS idx_channel_ingress_lane ON channel_ingress_events(queue_name, status, lane_key); CREATE TABLE IF NOT EXISTS plugin_blob_entries ( plugin_id TEXT NOT NULL, namespace TEXT NOT NULL, entry_key TEXT NOT NULL, metadata_json TEXT NOT NULL, blob BLOB NOT NULL, created_at INTEGER NOT NULL, expires_at INTEGER, PRIMARY KEY (plugin_id, namespace, entry_key) ); CREATE INDEX IF NOT EXISTS idx_plugin_blob_expiry ON plugin_blob_entries(expires_at) WHERE expires_at IS NOT NULL; CREATE INDEX IF NOT EXISTS idx_plugin_blob_listing ON plugin_blob_entries(plugin_id, namespace, created_at, entry_key); CREATE TABLE IF NOT EXISTS media_blobs ( subdir TEXT NOT NULL, id TEXT NOT NULL, content_type TEXT, size_bytes INTEGER NOT NULL, blob BLOB NOT NULL, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL, PRIMARY KEY (subdir, id) ); CREATE INDEX IF NOT EXISTS idx_media_blobs_created ON media_blobs(created_at); CREATE TABLE IF NOT EXISTS skill_uploads ( upload_id TEXT NOT NULL PRIMARY KEY, kind TEXT NOT NULL, slug TEXT NOT NULL, force INTEGER NOT NULL, size_bytes INTEGER NOT NULL, sha256 TEXT, actual_sha256 TEXT, received_bytes INTEGER NOT NULL, archive_blob BLOB NOT NULL, created_at INTEGER NOT NULL, expires_at INTEGER NOT NULL, committed INTEGER NOT NULL, committed_at INTEGER, idempotency_key_hash TEXT UNIQUE ); CREATE INDEX IF NOT EXISTS idx_skill_uploads_expiry ON skill_uploads(expires_at); CREATE INDEX IF NOT EXISTS idx_skill_uploads_idempotency ON skill_uploads(idempotency_key_hash) WHERE idempotency_key_hash IS NOT NULL; CREATE TABLE IF NOT EXISTS capture_sessions ( id TEXT NOT NULL PRIMARY KEY, started_at INTEGER NOT NULL, ended_at INTEGER, mode TEXT NOT NULL, source_scope TEXT NOT NULL, source_process TEXT NOT NULL, proxy_url TEXT ); CREATE TABLE IF NOT EXISTS capture_blobs ( blob_id TEXT NOT NULL PRIMARY KEY, content_type TEXT, encoding TEXT NOT NULL, size_bytes INTEGER NOT NULL, sha256 TEXT NOT NULL, data BLOB NOT NULL, created_at INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS capture_events ( id INTEGER NOT NULL PRIMARY KEY, session_id TEXT NOT NULL, ts INTEGER NOT NULL, source_scope TEXT NOT NULL, source_process TEXT NOT NULL, protocol TEXT NOT NULL, direction TEXT NOT NULL, kind TEXT NOT NULL, flow_id TEXT NOT NULL, method TEXT, host TEXT, path TEXT, status INTEGER, close_code INTEGER, content_type TEXT, headers_json TEXT, data_text TEXT, data_blob_id TEXT, data_sha256 TEXT, error_text TEXT, meta_json TEXT, FOREIGN KEY (session_id) REFERENCES capture_sessions(id) ON DELETE CASCADE, FOREIGN KEY (data_blob_id) REFERENCES capture_blobs(blob_id) ON DELETE SET NULL ); CREATE INDEX IF NOT EXISTS capture_events_session_ts_idx ON capture_events(session_id, ts); CREATE INDEX IF NOT EXISTS capture_events_flow_idx ON capture_events(flow_id, ts); CREATE TABLE IF NOT EXISTS sandbox_registry_entries ( registry_kind TEXT NOT NULL, container_name TEXT NOT NULL, session_key TEXT, backend_id TEXT, runtime_label TEXT, image TEXT, created_at_ms INTEGER, last_used_at_ms INTEGER, config_label_kind TEXT, config_hash TEXT, cdp_port INTEGER, no_vnc_port INTEGER, entry_json TEXT NOT NULL, updated_at INTEGER NOT NULL, PRIMARY KEY (registry_kind, container_name) ); CREATE INDEX IF NOT EXISTS idx_sandbox_registry_updated ON sandbox_registry_entries(registry_kind, updated_at DESC, container_name); CREATE INDEX IF NOT EXISTS idx_sandbox_registry_session ON sandbox_registry_entries(registry_kind, session_key, last_used_at_ms DESC, container_name) WHERE session_key IS NOT NULL; CREATE INDEX IF NOT EXISTS idx_sandbox_registry_last_used ON sandbox_registry_entries(registry_kind, last_used_at_ms DESC, container_name) WHERE last_used_at_ms IS NOT NULL; CREATE TABLE IF NOT EXISTS commitments ( id TEXT NOT NULL PRIMARY KEY, agent_id TEXT NOT NULL, session_key TEXT NOT NULL, channel TEXT NOT NULL, account_id TEXT, recipient_id TEXT, thread_id TEXT, sender_id TEXT, kind TEXT NOT NULL, sensitivity TEXT NOT NULL, source TEXT NOT NULL, status TEXT NOT NULL, reason TEXT NOT NULL, suggested_text TEXT NOT NULL, dedupe_key TEXT NOT NULL, confidence REAL NOT NULL, due_earliest_ms INTEGER NOT NULL, due_latest_ms INTEGER NOT NULL, due_timezone TEXT NOT NULL, source_message_id TEXT, source_run_id TEXT, created_at_ms INTEGER NOT NULL, updated_at_ms INTEGER NOT NULL, attempts INTEGER NOT NULL, last_attempt_at_ms INTEGER, sent_at_ms INTEGER, dismissed_at_ms INTEGER, snoozed_until_ms INTEGER, expired_at_ms INTEGER, record_json TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_commitments_scope_due ON commitments(agent_id, session_key, status, due_earliest_ms, due_latest_ms); CREATE INDEX IF NOT EXISTS idx_commitments_status_due ON commitments(status, due_earliest_ms, due_latest_ms); CREATE INDEX IF NOT EXISTS idx_commitments_scope_dedupe ON commitments(agent_id, session_key, channel, dedupe_key, status); CREATE TABLE IF NOT EXISTS cron_run_logs ( store_key TEXT NOT NULL, job_id TEXT NOT NULL, seq INTEGER NOT NULL, ts INTEGER NOT NULL, status TEXT, error TEXT, summary TEXT, diagnostics_summary TEXT, delivery_status TEXT, delivery_error TEXT, delivered INTEGER, session_id TEXT, session_key TEXT, run_id TEXT, run_at_ms INTEGER, duration_ms INTEGER, next_run_at_ms INTEGER, model TEXT, provider TEXT, total_tokens INTEGER, entry_json TEXT NOT NULL, created_at INTEGER NOT NULL, PRIMARY KEY (store_key, job_id, seq) ); CREATE INDEX IF NOT EXISTS idx_cron_run_logs_store_ts ON cron_run_logs(store_key, ts DESC, seq DESC); CREATE INDEX IF NOT EXISTS idx_cron_run_logs_job_status ON cron_run_logs(store_key, job_id, status, ts DESC, seq DESC); CREATE INDEX IF NOT EXISTS idx_cron_run_logs_delivery ON cron_run_logs(store_key, delivery_status, ts DESC, seq DESC) WHERE delivery_status IS NOT NULL; CREATE TABLE IF NOT EXISTS cron_jobs ( store_key TEXT NOT NULL, job_id TEXT NOT NULL, name TEXT NOT NULL, description TEXT, enabled INTEGER NOT NULL, delete_after_run INTEGER, created_at_ms INTEGER NOT NULL, agent_id TEXT, session_key TEXT, schedule_kind TEXT NOT NULL, schedule_expr TEXT, schedule_tz TEXT, every_ms INTEGER, anchor_ms INTEGER, at TEXT, stagger_ms INTEGER, session_target TEXT NOT NULL, wake_mode TEXT NOT NULL, payload_kind TEXT NOT NULL, payload_message TEXT, payload_model TEXT, payload_fallbacks_json TEXT, payload_thinking TEXT, payload_timeout_seconds INTEGER, payload_allow_unsafe_external_content INTEGER, payload_external_content_source_json TEXT, payload_light_context INTEGER, payload_tools_allow_json TEXT, delivery_mode TEXT, delivery_channel TEXT, delivery_to TEXT, delivery_thread_id TEXT, delivery_account_id TEXT, delivery_best_effort INTEGER, delivery_completion_mode TEXT, delivery_completion_to TEXT, failure_delivery_mode TEXT, failure_delivery_channel TEXT, failure_delivery_to TEXT, failure_delivery_account_id TEXT, failure_alert_disabled INTEGER, failure_alert_after INTEGER, failure_alert_channel TEXT, failure_alert_to TEXT, failure_alert_cooldown_ms INTEGER, failure_alert_include_skipped INTEGER, failure_alert_mode TEXT, failure_alert_account_id TEXT, next_run_at_ms INTEGER, running_at_ms INTEGER, last_run_at_ms INTEGER, last_run_status TEXT, last_error TEXT, last_duration_ms INTEGER, consecutive_errors INTEGER, consecutive_skipped INTEGER, schedule_error_count INTEGER, last_delivery_status TEXT, last_delivery_error TEXT, last_delivered INTEGER, last_failure_alert_at_ms INTEGER, job_json TEXT NOT NULL, state_json TEXT NOT NULL DEFAULT '{}', runtime_updated_at_ms INTEGER, schedule_identity TEXT, sort_order INTEGER NOT NULL DEFAULT 0, updated_at INTEGER NOT NULL, PRIMARY KEY (store_key, job_id) ); CREATE INDEX IF NOT EXISTS idx_cron_jobs_store_updated ON cron_jobs(store_key, sort_order ASC, updated_at DESC, job_id); CREATE INDEX IF NOT EXISTS idx_cron_jobs_enabled_next_run ON cron_jobs(store_key, enabled, next_run_at_ms, job_id) WHERE next_run_at_ms IS NOT NULL; CREATE INDEX IF NOT EXISTS idx_cron_jobs_agent_session ON cron_jobs(agent_id, session_key, updated_at DESC, job_id) WHERE agent_id IS NOT NULL OR session_key IS NOT NULL; CREATE TABLE IF NOT EXISTS command_log_entries ( id TEXT NOT NULL PRIMARY KEY, timestamp_ms INTEGER NOT NULL, action TEXT NOT NULL, session_key TEXT NOT NULL, sender_id TEXT NOT NULL, source TEXT NOT NULL, entry_json TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_command_log_entries_timestamp ON command_log_entries(timestamp_ms DESC, id); CREATE INDEX IF NOT EXISTS idx_command_log_entries_session ON command_log_entries(session_key, timestamp_ms DESC, id); CREATE TABLE IF NOT EXISTS delivery_queue_entries ( queue_name TEXT NOT NULL, id TEXT NOT NULL, status TEXT NOT NULL, entry_kind TEXT, session_key TEXT, channel TEXT, target TEXT, account_id TEXT, retry_count INTEGER NOT NULL DEFAULT 0, last_attempt_at INTEGER, last_error TEXT, recovery_state TEXT, platform_send_started_at INTEGER, entry_json TEXT NOT NULL, enqueued_at INTEGER NOT NULL, updated_at INTEGER NOT NULL, failed_at INTEGER, PRIMARY KEY (queue_name, id) ); CREATE INDEX IF NOT EXISTS idx_delivery_queue_pending ON delivery_queue_entries(queue_name, status, enqueued_at, id); CREATE INDEX IF NOT EXISTS idx_delivery_queue_failed ON delivery_queue_entries(queue_name, status, failed_at, id); CREATE INDEX IF NOT EXISTS idx_delivery_queue_session ON delivery_queue_entries(queue_name, status, session_key, enqueued_at, id) WHERE session_key IS NOT NULL; CREATE INDEX IF NOT EXISTS idx_delivery_queue_target ON delivery_queue_entries(queue_name, status, channel, target, enqueued_at, id) WHERE channel IS NOT NULL AND target IS NOT NULL; CREATE TABLE IF NOT EXISTS task_runs ( task_id TEXT NOT NULL PRIMARY KEY, runtime TEXT NOT NULL, task_kind TEXT, source_id TEXT, requester_session_key TEXT, owner_key TEXT NOT NULL, scope_kind TEXT NOT NULL, child_session_key TEXT, parent_flow_id TEXT, parent_task_id TEXT, agent_id TEXT, run_id TEXT, label TEXT, task TEXT NOT NULL, status TEXT NOT NULL, delivery_status TEXT NOT NULL, notify_policy TEXT NOT NULL, created_at INTEGER NOT NULL, started_at INTEGER, ended_at INTEGER, last_event_at INTEGER, cleanup_after INTEGER, error TEXT, progress_summary TEXT, terminal_summary TEXT, terminal_outcome TEXT ); CREATE INDEX IF NOT EXISTS idx_task_runs_run_id ON task_runs(run_id); CREATE INDEX IF NOT EXISTS idx_task_runs_status ON task_runs(status); CREATE INDEX IF NOT EXISTS idx_task_runs_runtime_status ON task_runs(runtime, status); CREATE INDEX IF NOT EXISTS idx_task_runs_cleanup_after ON task_runs(cleanup_after); CREATE INDEX IF NOT EXISTS idx_task_runs_last_event_at ON task_runs(last_event_at); CREATE INDEX IF NOT EXISTS idx_task_runs_owner_key ON task_runs(owner_key); CREATE INDEX IF NOT EXISTS idx_task_runs_parent_flow_id ON task_runs(parent_flow_id); CREATE INDEX IF NOT EXISTS idx_task_runs_child_session_key ON task_runs(child_session_key); CREATE TABLE IF NOT EXISTS subagent_runs ( run_id TEXT NOT NULL PRIMARY KEY, child_session_key TEXT NOT NULL, controller_session_key TEXT, requester_session_key TEXT NOT NULL, requester_display_key TEXT NOT NULL, requester_origin_json TEXT, task TEXT NOT NULL, task_name TEXT, cleanup TEXT NOT NULL, label TEXT, model TEXT, agent_dir TEXT, workspace_dir TEXT, run_timeout_seconds INTEGER, spawn_mode TEXT, created_at INTEGER NOT NULL, started_at INTEGER, session_started_at INTEGER, accumulated_runtime_ms INTEGER, ended_at INTEGER, outcome_json TEXT, archive_at_ms INTEGER, cleanup_completed_at INTEGER, cleanup_handled INTEGER, suppress_announce_reason TEXT, expects_completion_message INTEGER, announce_retry_count INTEGER, last_announce_retry_at INTEGER, last_announce_delivery_error TEXT, ended_reason TEXT, pause_reason TEXT, wake_on_descendant_settle INTEGER, frozen_result_text TEXT, frozen_result_captured_at INTEGER, fallback_frozen_result_text TEXT, fallback_frozen_result_captured_at INTEGER, ended_hook_emitted_at INTEGER, pending_final_delivery INTEGER, pending_final_delivery_created_at INTEGER, pending_final_delivery_last_attempt_at INTEGER, pending_final_delivery_attempt_count INTEGER, pending_final_delivery_last_error TEXT, pending_final_delivery_payload_json TEXT, completion_announced_at INTEGER, payload_json TEXT NOT NULL DEFAULT '{}' ); CREATE INDEX IF NOT EXISTS idx_subagent_runs_child_session_key ON subagent_runs(child_session_key, created_at DESC, run_id); CREATE INDEX IF NOT EXISTS idx_subagent_runs_requester_session_key ON subagent_runs(requester_session_key, created_at DESC, run_id); CREATE INDEX IF NOT EXISTS idx_subagent_runs_controller_session_key ON subagent_runs(controller_session_key, created_at DESC, run_id); CREATE INDEX IF NOT EXISTS idx_subagent_runs_archive_at ON subagent_runs(archive_at_ms, cleanup_handled, run_id); CREATE INDEX IF NOT EXISTS idx_subagent_runs_ended_cleanup ON subagent_runs(ended_at, cleanup_handled, run_id); CREATE TABLE IF NOT EXISTS current_conversation_bindings ( binding_key TEXT NOT NULL PRIMARY KEY, binding_id TEXT NOT NULL, target_agent_id TEXT NOT NULL, target_session_id TEXT, target_session_key TEXT NOT NULL, channel TEXT NOT NULL, account_id TEXT NOT NULL, conversation_kind TEXT NOT NULL, parent_conversation_id TEXT, conversation_id TEXT NOT NULL, target_kind TEXT NOT NULL, status TEXT NOT NULL, bound_at INTEGER NOT NULL, expires_at INTEGER, metadata_json TEXT, record_json TEXT NOT NULL, updated_at INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_current_conversation_bindings_target ON current_conversation_bindings(target_agent_id, target_session_key, updated_at DESC, binding_key); CREATE INDEX IF NOT EXISTS idx_current_conversation_bindings_conversation ON current_conversation_bindings(channel, account_id, conversation_kind, conversation_id); CREATE INDEX IF NOT EXISTS idx_current_conversation_bindings_expires ON current_conversation_bindings(expires_at, binding_key); CREATE TABLE IF NOT EXISTS plugin_binding_approvals ( plugin_root TEXT NOT NULL, channel TEXT NOT NULL, account_id TEXT NOT NULL, plugin_id TEXT NOT NULL, plugin_name TEXT, approved_at INTEGER NOT NULL, PRIMARY KEY (plugin_root, channel, account_id) ); CREATE INDEX IF NOT EXISTS idx_plugin_binding_approvals_plugin ON plugin_binding_approvals(plugin_id, approved_at DESC); CREATE TABLE IF NOT EXISTS tui_last_sessions ( scope_key TEXT NOT NULL PRIMARY KEY, session_key TEXT NOT NULL, updated_at INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_tui_last_sessions_session_key ON tui_last_sessions(session_key, updated_at DESC, scope_key); CREATE TABLE IF NOT EXISTS task_delivery_state ( task_id TEXT NOT NULL PRIMARY KEY, requester_origin_json TEXT, last_notified_event_at INTEGER, FOREIGN KEY (task_id) REFERENCES task_runs(task_id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS flow_runs ( flow_id TEXT NOT NULL PRIMARY KEY, shape TEXT, sync_mode TEXT NOT NULL DEFAULT 'managed', owner_key TEXT NOT NULL, requester_origin_json TEXT, controller_id TEXT, revision INTEGER NOT NULL DEFAULT 0, status TEXT NOT NULL, notify_policy TEXT NOT NULL, goal TEXT NOT NULL, current_step TEXT, blocked_task_id TEXT, blocked_summary TEXT, state_json TEXT, wait_json TEXT, cancel_requested_at INTEGER, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL, ended_at INTEGER ); CREATE INDEX IF NOT EXISTS idx_flow_runs_status ON flow_runs(status); CREATE INDEX IF NOT EXISTS idx_flow_runs_owner_key ON flow_runs(owner_key); CREATE INDEX IF NOT EXISTS idx_flow_runs_updated_at ON flow_runs(updated_at); CREATE TABLE IF NOT EXISTS migration_runs ( id TEXT NOT NULL PRIMARY KEY, started_at INTEGER NOT NULL, finished_at INTEGER, status TEXT NOT NULL, report_json TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_migration_runs_started ON migration_runs(started_at DESC, id); CREATE TABLE IF NOT EXISTS migration_sources ( source_key TEXT NOT NULL PRIMARY KEY, migration_kind TEXT NOT NULL, source_path TEXT NOT NULL, target_table TEXT NOT NULL, source_sha256 TEXT, source_size_bytes INTEGER, source_record_count INTEGER, last_run_id TEXT NOT NULL, status TEXT NOT NULL, imported_at INTEGER NOT NULL, removed_source INTEGER NOT NULL DEFAULT 0, report_json TEXT NOT NULL, FOREIGN KEY (last_run_id) REFERENCES migration_runs(id) ON DELETE CASCADE ); CREATE INDEX IF NOT EXISTS idx_migration_sources_path ON migration_sources(source_path, migration_kind, target_table); CREATE INDEX IF NOT EXISTS idx_migration_sources_run ON migration_sources(last_run_id, source_path); CREATE TABLE IF NOT EXISTS backup_runs ( id TEXT NOT NULL PRIMARY KEY, created_at INTEGER NOT NULL, archive_path TEXT NOT NULL, status TEXT NOT NULL, manifest_json TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_backup_runs_created ON backup_runs(created_at DESC, id);