Files
SubMiner/launcher/test-support/immersion-db-schema.d.ts
T
sudacode ffa183b1a1 feat(sync): headless --sync-cli mode so sync only needs the app installed
The Electron app now answers launcher-style sync argv (--sync-cli sync
[host|--snapshot|--merge] ... plus --help/--version) at entry, before any
window or display initialization, backed by a libsql binding of the shared
stats-sync engine. Works over SSH with no display server, so a remote
machine no longer needs the bun launcher. The launcher accepts --sync-cli
as a no-op so both invocation shapes stay equivalent.
2026-07-11 20:23:22 -07:00

2 lines
12 KiB
TypeScript

export declare const IMMERSION_DB_FIXTURE_DDL = "\n CREATE TABLE imm_schema_version (\n schema_version INTEGER PRIMARY KEY,\n applied_at_ms TEXT NOT NULL\n );\n CREATE TABLE imm_rollup_state(\n state_key TEXT PRIMARY KEY,\n state_value TEXT NOT NULL\n );\n CREATE TABLE imm_anime(\n anime_id INTEGER PRIMARY KEY AUTOINCREMENT,\n normalized_title_key TEXT NOT NULL UNIQUE,\n canonical_title TEXT NOT NULL,\n anilist_id INTEGER UNIQUE,\n title_romaji TEXT,\n title_english TEXT,\n title_native TEXT,\n episodes_total INTEGER,\n description TEXT,\n metadata_json TEXT,\n CREATED_DATE TEXT,\n LAST_UPDATE_DATE TEXT\n );\n CREATE TABLE imm_videos(\n video_id INTEGER PRIMARY KEY AUTOINCREMENT,\n video_key TEXT NOT NULL UNIQUE,\n anime_id INTEGER,\n canonical_title TEXT NOT NULL,\n source_type INTEGER NOT NULL,\n source_path TEXT,\n source_url TEXT,\n parsed_basename TEXT,\n parsed_title TEXT,\n parsed_season INTEGER,\n parsed_episode INTEGER,\n parser_source TEXT,\n parser_confidence REAL,\n parse_metadata_json TEXT,\n watched INTEGER NOT NULL DEFAULT 0,\n duration_ms INTEGER NOT NULL CHECK(duration_ms>=0),\n file_size_bytes INTEGER CHECK(file_size_bytes>=0),\n codec_id INTEGER, container_id INTEGER,\n width_px INTEGER, height_px INTEGER, fps_x100 INTEGER,\n bitrate_kbps INTEGER, audio_codec_id INTEGER,\n hash_sha256 TEXT, screenshot_path TEXT,\n metadata_json TEXT,\n CREATED_DATE TEXT,\n LAST_UPDATE_DATE TEXT,\n FOREIGN KEY(anime_id) REFERENCES imm_anime(anime_id) ON DELETE SET NULL\n );\n CREATE TABLE imm_sessions(\n session_id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_uuid TEXT NOT NULL UNIQUE,\n video_id INTEGER NOT NULL,\n started_at_ms TEXT NOT NULL, ended_at_ms TEXT,\n status INTEGER NOT NULL,\n locale_id INTEGER, target_lang_id INTEGER,\n difficulty_tier INTEGER, subtitle_mode INTEGER,\n ended_media_ms INTEGER,\n total_watched_ms INTEGER NOT NULL DEFAULT 0,\n active_watched_ms INTEGER NOT NULL DEFAULT 0,\n lines_seen INTEGER NOT NULL DEFAULT 0,\n tokens_seen INTEGER NOT NULL DEFAULT 0,\n cards_mined INTEGER NOT NULL DEFAULT 0,\n lookup_count INTEGER NOT NULL DEFAULT 0,\n lookup_hits INTEGER NOT NULL DEFAULT 0,\n yomitan_lookup_count INTEGER NOT NULL DEFAULT 0,\n pause_count INTEGER NOT NULL DEFAULT 0,\n pause_ms INTEGER NOT NULL DEFAULT 0,\n seek_forward_count INTEGER NOT NULL DEFAULT 0,\n seek_backward_count INTEGER NOT NULL DEFAULT 0,\n media_buffer_events INTEGER NOT NULL DEFAULT 0,\n CREATED_DATE TEXT,\n LAST_UPDATE_DATE TEXT,\n FOREIGN KEY(video_id) REFERENCES imm_videos(video_id)\n );\n CREATE TABLE imm_session_telemetry(\n telemetry_id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id INTEGER NOT NULL,\n sample_ms TEXT NOT NULL,\n total_watched_ms INTEGER NOT NULL DEFAULT 0,\n active_watched_ms INTEGER NOT NULL DEFAULT 0,\n lines_seen INTEGER NOT NULL DEFAULT 0,\n tokens_seen INTEGER NOT NULL DEFAULT 0,\n cards_mined INTEGER NOT NULL DEFAULT 0,\n lookup_count INTEGER NOT NULL DEFAULT 0,\n lookup_hits INTEGER NOT NULL DEFAULT 0,\n yomitan_lookup_count INTEGER NOT NULL DEFAULT 0,\n pause_count INTEGER NOT NULL DEFAULT 0,\n pause_ms INTEGER NOT NULL DEFAULT 0,\n seek_forward_count INTEGER NOT NULL DEFAULT 0,\n seek_backward_count INTEGER NOT NULL DEFAULT 0,\n media_buffer_events INTEGER NOT NULL DEFAULT 0,\n CREATED_DATE TEXT,\n LAST_UPDATE_DATE TEXT,\n FOREIGN KEY(session_id) REFERENCES imm_sessions(session_id) ON DELETE CASCADE\n );\n CREATE TABLE imm_session_events(\n event_id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id INTEGER NOT NULL,\n ts_ms TEXT NOT NULL,\n event_type INTEGER NOT NULL,\n line_index INTEGER,\n segment_start_ms INTEGER,\n segment_end_ms INTEGER,\n tokens_delta INTEGER NOT NULL DEFAULT 0,\n cards_delta INTEGER NOT NULL DEFAULT 0,\n payload_json TEXT,\n CREATED_DATE TEXT,\n LAST_UPDATE_DATE TEXT,\n FOREIGN KEY(session_id) REFERENCES imm_sessions(session_id) ON DELETE CASCADE\n );\n CREATE TABLE imm_daily_rollups(\n rollup_day INTEGER NOT NULL,\n video_id INTEGER,\n total_sessions INTEGER NOT NULL DEFAULT 0,\n total_active_min REAL NOT NULL DEFAULT 0,\n total_lines_seen INTEGER NOT NULL DEFAULT 0,\n total_tokens_seen INTEGER NOT NULL DEFAULT 0,\n total_cards INTEGER NOT NULL DEFAULT 0,\n cards_per_hour REAL,\n tokens_per_min REAL,\n lookup_hit_rate REAL,\n CREATED_DATE TEXT,\n LAST_UPDATE_DATE TEXT,\n PRIMARY KEY (rollup_day, video_id)\n );\n CREATE TABLE imm_monthly_rollups(\n rollup_month INTEGER NOT NULL,\n video_id INTEGER,\n total_sessions INTEGER NOT NULL DEFAULT 0,\n total_active_min REAL NOT NULL DEFAULT 0,\n total_lines_seen INTEGER NOT NULL DEFAULT 0,\n total_tokens_seen INTEGER NOT NULL DEFAULT 0,\n total_cards INTEGER NOT NULL DEFAULT 0,\n CREATED_DATE TEXT,\n LAST_UPDATE_DATE TEXT,\n PRIMARY KEY (rollup_month, video_id)\n );\n CREATE TABLE imm_words(\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n headword TEXT,\n word TEXT,\n reading TEXT,\n part_of_speech TEXT,\n pos1 TEXT,\n pos2 TEXT,\n pos3 TEXT,\n first_seen REAL,\n last_seen REAL,\n frequency INTEGER,\n frequency_rank INTEGER,\n UNIQUE(headword, word, reading)\n );\n CREATE TABLE imm_kanji(\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n kanji TEXT,\n first_seen REAL,\n last_seen REAL,\n frequency INTEGER,\n UNIQUE(kanji)\n );\n CREATE TABLE imm_subtitle_lines(\n line_id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id INTEGER NOT NULL,\n event_id INTEGER,\n video_id INTEGER NOT NULL,\n anime_id INTEGER,\n line_index INTEGER NOT NULL,\n segment_start_ms INTEGER,\n segment_end_ms INTEGER,\n text TEXT NOT NULL,\n secondary_text TEXT,\n CREATED_DATE INTEGER,\n LAST_UPDATE_DATE INTEGER,\n FOREIGN KEY(session_id) REFERENCES imm_sessions(session_id) ON DELETE CASCADE,\n FOREIGN KEY(event_id) REFERENCES imm_session_events(event_id) ON DELETE SET NULL,\n FOREIGN KEY(video_id) REFERENCES imm_videos(video_id) ON DELETE CASCADE,\n FOREIGN KEY(anime_id) REFERENCES imm_anime(anime_id) ON DELETE SET NULL\n );\n CREATE TABLE imm_word_line_occurrences(\n line_id INTEGER NOT NULL,\n word_id INTEGER NOT NULL,\n occurrence_count INTEGER NOT NULL,\n PRIMARY KEY(line_id, word_id),\n FOREIGN KEY(line_id) REFERENCES imm_subtitle_lines(line_id) ON DELETE CASCADE,\n FOREIGN KEY(word_id) REFERENCES imm_words(id) ON DELETE CASCADE\n );\n CREATE TABLE imm_kanji_line_occurrences(\n line_id INTEGER NOT NULL,\n kanji_id INTEGER NOT NULL,\n occurrence_count INTEGER NOT NULL,\n PRIMARY KEY(line_id, kanji_id),\n FOREIGN KEY(line_id) REFERENCES imm_subtitle_lines(line_id) ON DELETE CASCADE,\n FOREIGN KEY(kanji_id) REFERENCES imm_kanji(id) ON DELETE CASCADE\n );\n CREATE TABLE imm_media_art(\n video_id INTEGER PRIMARY KEY,\n anilist_id INTEGER,\n cover_url TEXT,\n cover_blob BLOB,\n cover_blob_hash TEXT,\n title_romaji TEXT,\n title_english TEXT,\n episodes_total INTEGER,\n fetched_at_ms TEXT NOT NULL,\n CREATED_DATE TEXT,\n LAST_UPDATE_DATE TEXT,\n FOREIGN KEY(video_id) REFERENCES imm_videos(video_id) ON DELETE CASCADE\n );\n CREATE TABLE imm_youtube_videos(\n video_id INTEGER PRIMARY KEY,\n youtube_video_id TEXT NOT NULL,\n video_url TEXT NOT NULL,\n video_title TEXT,\n video_thumbnail_url TEXT,\n channel_id TEXT,\n channel_name TEXT,\n channel_url TEXT,\n channel_thumbnail_url TEXT,\n uploader_id TEXT,\n uploader_url TEXT,\n description TEXT,\n metadata_json TEXT,\n fetched_at_ms TEXT NOT NULL,\n CREATED_DATE TEXT,\n LAST_UPDATE_DATE TEXT,\n FOREIGN KEY(video_id) REFERENCES imm_videos(video_id) ON DELETE CASCADE\n );\n CREATE TABLE imm_cover_art_blobs(\n blob_hash TEXT PRIMARY KEY,\n cover_blob BLOB NOT NULL,\n CREATED_DATE TEXT,\n LAST_UPDATE_DATE TEXT\n );\n CREATE TABLE imm_lifetime_global(\n global_id INTEGER PRIMARY KEY CHECK(global_id = 1),\n total_sessions INTEGER NOT NULL DEFAULT 0,\n total_active_ms INTEGER NOT NULL DEFAULT 0,\n total_cards INTEGER NOT NULL DEFAULT 0,\n active_days INTEGER NOT NULL DEFAULT 0,\n episodes_started INTEGER NOT NULL DEFAULT 0,\n episodes_completed INTEGER NOT NULL DEFAULT 0,\n anime_completed INTEGER NOT NULL DEFAULT 0,\n last_rebuilt_ms TEXT,\n CREATED_DATE TEXT,\n LAST_UPDATE_DATE TEXT\n );\n CREATE TABLE imm_lifetime_anime(\n anime_id INTEGER PRIMARY KEY,\n total_sessions INTEGER NOT NULL DEFAULT 0,\n total_active_ms INTEGER NOT NULL DEFAULT 0,\n total_cards INTEGER NOT NULL DEFAULT 0,\n total_lines_seen INTEGER NOT NULL DEFAULT 0,\n total_tokens_seen INTEGER NOT NULL DEFAULT 0,\n episodes_started INTEGER NOT NULL DEFAULT 0,\n episodes_completed INTEGER NOT NULL DEFAULT 0,\n first_watched_ms TEXT,\n last_watched_ms TEXT,\n CREATED_DATE TEXT,\n LAST_UPDATE_DATE TEXT,\n FOREIGN KEY(anime_id) REFERENCES imm_anime(anime_id) ON DELETE CASCADE\n );\n CREATE TABLE imm_lifetime_media(\n video_id INTEGER PRIMARY KEY,\n total_sessions INTEGER NOT NULL DEFAULT 0,\n total_active_ms INTEGER NOT NULL DEFAULT 0,\n total_cards INTEGER NOT NULL DEFAULT 0,\n total_lines_seen INTEGER NOT NULL DEFAULT 0,\n total_tokens_seen INTEGER NOT NULL DEFAULT 0,\n completed INTEGER NOT NULL DEFAULT 0,\n first_watched_ms TEXT,\n last_watched_ms TEXT,\n CREATED_DATE TEXT,\n LAST_UPDATE_DATE TEXT,\n FOREIGN KEY(video_id) REFERENCES imm_videos(video_id) ON DELETE CASCADE\n );\n CREATE TABLE imm_lifetime_applied_sessions(\n session_id INTEGER PRIMARY KEY,\n applied_at_ms TEXT NOT NULL,\n CREATED_DATE TEXT,\n LAST_UPDATE_DATE TEXT,\n FOREIGN KEY(session_id) REFERENCES imm_sessions(session_id) ON DELETE CASCADE\n );\n CREATE TABLE imm_stats_excluded_words(\n headword TEXT NOT NULL,\n word TEXT NOT NULL,\n reading TEXT NOT NULL,\n CREATED_DATE TEXT,\n LAST_UPDATE_DATE TEXT,\n PRIMARY KEY(headword, word, reading)\n );\n CREATE INDEX idx_anime_normalized_title ON imm_anime(normalized_title_key);\n CREATE INDEX idx_anime_anilist_id ON imm_anime(anilist_id);\n CREATE INDEX idx_videos_anime_id ON imm_videos(anime_id);\n CREATE INDEX idx_sessions_video_started ON imm_sessions(video_id, started_at_ms DESC);\n CREATE INDEX idx_sessions_status_started ON imm_sessions(status, started_at_ms DESC);\n CREATE INDEX idx_sessions_started_at ON imm_sessions(started_at_ms DESC);\n CREATE INDEX idx_sessions_ended_at ON imm_sessions(ended_at_ms DESC);\n CREATE INDEX idx_telemetry_session_sample ON imm_session_telemetry(session_id, sample_ms DESC);\n CREATE INDEX idx_telemetry_sample_ms ON imm_session_telemetry(sample_ms DESC);\n CREATE INDEX idx_events_session_ts ON imm_session_events(session_id, ts_ms DESC);\n CREATE INDEX idx_events_type_ts ON imm_session_events(event_type, ts_ms DESC);\n CREATE INDEX idx_rollups_day_video ON imm_daily_rollups(rollup_day, video_id);\n CREATE INDEX idx_rollups_month_video ON imm_monthly_rollups(rollup_month, video_id);\n CREATE INDEX idx_words_headword_word_reading ON imm_words(headword, word, reading);\n CREATE INDEX idx_words_frequency ON imm_words(frequency DESC);\n CREATE INDEX idx_kanji_kanji ON imm_kanji(kanji);\n CREATE INDEX idx_kanji_frequency ON imm_kanji(frequency DESC);\n CREATE INDEX idx_subtitle_lines_session_line ON imm_subtitle_lines(session_id, line_index);\n CREATE INDEX idx_subtitle_lines_video_line ON imm_subtitle_lines(video_id, line_index);\n CREATE INDEX idx_subtitle_lines_anime_line ON imm_subtitle_lines(anime_id, line_index);\n CREATE INDEX idx_word_line_occurrences_word ON imm_word_line_occurrences(word_id, line_id);\n CREATE INDEX idx_kanji_line_occurrences_kanji ON imm_kanji_line_occurrences(kanji_id, line_id);\n CREATE INDEX idx_media_art_cover_blob_hash ON imm_media_art(cover_blob_hash);\n CREATE INDEX idx_media_art_anilist_id ON imm_media_art(anilist_id);\n CREATE INDEX idx_media_art_cover_url ON imm_media_art(cover_url);\n CREATE INDEX idx_youtube_videos_channel_id ON imm_youtube_videos(channel_id);\n CREATE INDEX idx_youtube_videos_youtube_video_id ON imm_youtube_videos(youtube_video_id);\n";
//# sourceMappingURL=immersion-db-schema.d.ts.map