CREATE TABLE lifeos_migrations ( user_id TEXT PRIMARY KEY, migrated_at TEXT NOT NULL ); CREATE TABLE lifeos_meta ( user_id TEXT NOT NULL, kind TEXT NOT NULL CHECK (kind IN ('profile', 'settings', 'system')), value_json TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1, updated_at TEXT NOT NULL, PRIMARY KEY (user_id, kind) ); CREATE TABLE lifeos_memories ( user_id TEXT NOT NULL, id TEXT NOT NULL, memory_date TEXT, value_json TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1, updated_at TEXT NOT NULL, deleted_at TEXT, PRIMARY KEY (user_id, id) ); CREATE INDEX idx_lifeos_memories_user_date ON lifeos_memories(user_id, memory_date DESC) WHERE deleted_at IS NULL; CREATE TABLE lifeos_memory_tags ( user_id TEXT NOT NULL, memory_id TEXT NOT NULL, tag TEXT NOT NULL, PRIMARY KEY (user_id, memory_id, tag), FOREIGN KEY (user_id, memory_id) REFERENCES lifeos_memories(user_id, id) ); CREATE INDEX idx_lifeos_memory_tags_user_tag ON lifeos_memory_tags(user_id, tag); CREATE TRIGGER lifeos_memory_tags_insert AFTER INSERT ON lifeos_memories WHEN NEW.deleted_at IS NULL BEGIN INSERT OR IGNORE INTO lifeos_memory_tags(user_id, memory_id, tag) SELECT NEW.user_id, NEW.id, value FROM json_each(NEW.value_json, '$.tags') WHERE type = 'text' AND value <> ''; END; CREATE TRIGGER lifeos_memory_tags_update AFTER UPDATE OF value_json, deleted_at ON lifeos_memories BEGIN DELETE FROM lifeos_memory_tags WHERE user_id = NEW.user_id AND memory_id = NEW.id; INSERT OR IGNORE INTO lifeos_memory_tags(user_id, memory_id, tag) SELECT NEW.user_id, NEW.id, value FROM json_each(NEW.value_json, '$.tags') WHERE NEW.deleted_at IS NULL AND type = 'text' AND value <> ''; END; CREATE TABLE lifeos_goals ( user_id TEXT NOT NULL, id TEXT NOT NULL, target_date TEXT, done INTEGER NOT NULL DEFAULT 0, value_json TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1, updated_at TEXT NOT NULL, deleted_at TEXT, PRIMARY KEY (user_id, id) ); CREATE INDEX idx_lifeos_goals_user_status_date ON lifeos_goals(user_id, done, target_date) WHERE deleted_at IS NULL; CREATE TABLE lifeos_tasks ( user_id TEXT NOT NULL, id TEXT NOT NULL, goal_id TEXT, due_date TEXT, done INTEGER NOT NULL DEFAULT 0, value_json TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1, updated_at TEXT NOT NULL, deleted_at TEXT, PRIMARY KEY (user_id, id) ); CREATE INDEX idx_lifeos_tasks_user_status_date ON lifeos_tasks(user_id, done, due_date) WHERE deleted_at IS NULL; CREATE INDEX idx_lifeos_tasks_user_goal ON lifeos_tasks(user_id, goal_id) WHERE deleted_at IS NULL; CREATE TABLE lifeos_favorites ( user_id TEXT NOT NULL, id TEXT NOT NULL, memory_id TEXT, value_json TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1, updated_at TEXT NOT NULL, deleted_at TEXT, PRIMARY KEY (user_id, id) ); CREATE INDEX idx_lifeos_favorites_user_memory ON lifeos_favorites(user_id, memory_id) WHERE deleted_at IS NULL;