import { webExtApi as api } from '../browser-api'; import type { Tab, TabGroup } from '../types'; import { normalizeGroupColor, queryTabGroups } from '../core'; import type { SessionTab, StoredSession } from '../types'; export function buildSessionSnapshot(tabs: Tab[], groups: TabGroup[]): SessionTab[] { const groupById = new Map(groups.map(group => [group.id, group])); return tabs .filter(tab => Boolean(tab.url || tab.pendingUrl)) .sort((a, b) => (a.windowId - b.windowId) || (a.index - b.index)) .map(tab => { const entry: SessionTab = { url: tab.url || tab.pendingUrl }; if (tab.pinned) entry.pinned = true; if (tab.groupId >= 0) { const group = groupById.get(tab.groupId); entry.group = { key: `${tab.windowId}:${tab.groupId}`, title: group?.title || "", color: normalizeGroupColor(group?.color), collapsed: Boolean(group?.collapsed), }; } return entry; }); } /** * Snapshot the current windows/tabs/groups into a ready-to-store session plus * its change-detection signature. Shared by session.save and the autosave path. */ export async function captureCurrentSession(): Promise<{ session: StoredSession; signature: string; tabCount: number }> { const tabs = await api.tabs.query({}); const groups = await queryTabGroups({}); const sessionTabs = buildSessionSnapshot(tabs, groups); const signature = sessionSignature(sessionTabs); const session: StoredSession = { tabs: sessionTabs, urls: sessionTabs.map(tab => tab.url), savedAt: Date.now(), signature, }; return { session, signature, tabCount: sessionTabs.length }; } export function sessionSignature(sessionTabs: SessionTab[]) { return JSON.stringify(sessionTabs.map(tab => ({ url: tab.url, pinned: Boolean(tab.pinned), group: tab.group ? { key: tab.group.key || "", title: tab.group.title || "", color: normalizeGroupColor(tab.group.color), collapsed: Boolean(tab.group.collapsed), } : null, }))); }