migrate creates the necessary tables if they don't exist.
()
| 51 | |
| 52 | // migrate creates the necessary tables if they don't exist. |
| 53 | func (s *Service) migrate() error { |
| 54 | schema := ` |
| 55 | CREATE TABLE IF NOT EXISTS sessions ( |
| 56 | id TEXT PRIMARY KEY, |
| 57 | app_name TEXT NOT NULL, |
| 58 | user_id TEXT NOT NULL, |
| 59 | agent_id TEXT NOT NULL, |
| 60 | metadata TEXT, |
| 61 | created_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
| 62 | updated_at DATETIME DEFAULT CURRENT_TIMESTAMP |
| 63 | ); |
| 64 | |
| 65 | CREATE INDEX IF NOT EXISTS idx_sessions_app_user ON sessions(app_name, user_id); |
| 66 | CREATE INDEX IF NOT EXISTS idx_sessions_updated ON sessions(updated_at DESC); |
| 67 | |
| 68 | CREATE TABLE IF NOT EXISTS events ( |
| 69 | id TEXT PRIMARY KEY, |
| 70 | session_id TEXT NOT NULL, |
| 71 | invocation_id TEXT, |
| 72 | agent_id TEXT, |
| 73 | branch TEXT, |
| 74 | author TEXT, |
| 75 | content TEXT, |
| 76 | reasoning TEXT, |
| 77 | actions TEXT, |
| 78 | long_running_tool_ids TEXT, |
| 79 | metadata TEXT, |
| 80 | created_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
| 81 | FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE |
| 82 | ); |
| 83 | |
| 84 | CREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id, created_at); |
| 85 | CREATE INDEX IF NOT EXISTS idx_events_invocation ON events(invocation_id); |
| 86 | |
| 87 | CREATE TABLE IF NOT EXISTS session_state ( |
| 88 | session_id TEXT NOT NULL, |
| 89 | key TEXT NOT NULL, |
| 90 | value TEXT, |
| 91 | updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
| 92 | PRIMARY KEY (session_id, key), |
| 93 | FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE |
| 94 | ); |
| 95 | ` |
| 96 | |
| 97 | _, err := s.db.Exec(schema) |
| 98 | return err |
| 99 | } |
| 100 | |
| 101 | // Close closes the database connection. |
| 102 | func (s *Service) Close() error { |