@neuralnomads/codenomad-dev 0.20.0-dev-20260908-e5115fe8 → 0.20.0-dev-20260909-855d2ee7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/server/__tests__/instance-proxy.test.js +14 -0
  2. package/dist/server/__tests__/instance-proxy.test.js.map +1 -1
  3. package/dist/server/http-server.js +1 -1
  4. package/dist/server/http-server.js.map +1 -1
  5. package/package.json +1 -1
  6. package/public/assets/App-Nlt9zV-v.js +43 -0
  7. package/public/assets/App-Nlt9zV-v.js.map +1 -0
  8. package/public/assets/{FilesTab-C8fnWsM4.js → FilesTab-z7UrjcAQ.js} +3 -3
  9. package/public/assets/{FilesTab-C8fnWsM4.js.map → FilesTab-z7UrjcAQ.js.map} +1 -1
  10. package/public/assets/{GitChangesTab-C3rapWwl.js → GitChangesTab-C04bYKhs.js} +3 -3
  11. package/public/assets/{GitChangesTab-C3rapWwl.js.map → GitChangesTab-C04bYKhs.js.map} +1 -1
  12. package/public/assets/{SplitFilePanel-D3S7Zfcc.js → SplitFilePanel-B29MqCuU.js} +2 -2
  13. package/public/assets/{SplitFilePanel-D3S7Zfcc.js.map → SplitFilePanel-B29MqCuU.js.map} +1 -1
  14. package/public/assets/{StatusTab-DHvQ-0to.js → StatusTab-wUKfwnFf.js} +2 -2
  15. package/public/assets/{StatusTab-DHvQ-0to.js.map → StatusTab-wUKfwnFf.js.map} +1 -1
  16. package/public/assets/{align-justify-BIN0BnZw.js → align-justify-glU678D9.js} +2 -2
  17. package/public/assets/{align-justify-BIN0BnZw.js.map → align-justify-glU678D9.js.map} +1 -1
  18. package/public/assets/{bundle-full-BfEvraVO.js → bundle-full-BrsCElYv.js} +2 -2
  19. package/public/assets/{bundle-full-BfEvraVO.js.map → bundle-full-BrsCElYv.js.map} +1 -1
  20. package/public/assets/{client-state-CBKOWfhu.js → client-state-j9Iu7F-E.js} +2 -2
  21. package/public/assets/{client-state-CBKOWfhu.js.map → client-state-j9Iu7F-E.js.map} +1 -1
  22. package/public/assets/{diff-viewer-6oxyPi3-.js → diff-viewer-B0VS1voD.js} +2 -2
  23. package/public/assets/{diff-viewer-6oxyPi3-.js.map → diff-viewer-B0VS1voD.js.map} +1 -1
  24. package/public/assets/{index-BhBg6Tnf.js → index-B6bX3AMT.js} +2 -2
  25. package/public/assets/{index-BhBg6Tnf.js.map → index-B6bX3AMT.js.map} +1 -1
  26. package/public/assets/{index-Dr5L4afe.js → index-BIRLnDWY.js} +2 -2
  27. package/public/assets/{index-Dr5L4afe.js.map → index-BIRLnDWY.js.map} +1 -1
  28. package/public/assets/{index-BeWVYvfJ.js → index-BuScpzpP.js} +2 -2
  29. package/public/assets/{index-BeWVYvfJ.js.map → index-BuScpzpP.js.map} +1 -1
  30. package/public/assets/{index-ef9_CbWU.js → index-BzAEHHap.js} +3 -3
  31. package/public/assets/{index-ef9_CbWU.js.map → index-BzAEHHap.js.map} +1 -1
  32. package/public/assets/index-C-DZt-oz.css +1 -0
  33. package/public/assets/{index-DHNlQHw2.js → index-C9RXVQl9.js} +2 -2
  34. package/public/assets/{index-DHNlQHw2.js.map → index-C9RXVQl9.js.map} +1 -1
  35. package/public/assets/index-ClaHfu-1.js +2 -0
  36. package/public/assets/{index-C9znv1NB.js.map → index-ClaHfu-1.js.map} +1 -1
  37. package/public/assets/{index-B_9dhJTl.js → index-DBx5htn3.js} +2 -2
  38. package/public/assets/{index-B_9dhJTl.js.map → index-DBx5htn3.js.map} +1 -1
  39. package/public/assets/{index-DdklToXY.js → index-DHHMf3u1.js} +2 -2
  40. package/public/assets/{index-DdklToXY.js.map → index-DHHMf3u1.js.map} +1 -1
  41. package/public/assets/{index-BJrZpSe6.js → index-DN4Kstsd.js} +2 -2
  42. package/public/assets/{index-BJrZpSe6.js.map → index-DN4Kstsd.js.map} +1 -1
  43. package/public/assets/{index-CmJg6xjr.js → index-DbMyNDyo.js} +2 -2
  44. package/public/assets/{index-CmJg6xjr.js.map → index-DbMyNDyo.js.map} +1 -1
  45. package/public/assets/{index-CD9b6FoA.js → index-rcsmuqww.js} +2 -2
  46. package/public/assets/{index-CD9b6FoA.js.map → index-rcsmuqww.js.map} +1 -1
  47. package/public/assets/{index-DsmOPul3.js → index-uz2QFRlk.js} +2 -2
  48. package/public/assets/{index-DsmOPul3.js.map → index-uz2QFRlk.js.map} +1 -1
  49. package/public/assets/{loading-CanSHf7z.js → loading-CYiiwb08.js} +2 -2
  50. package/public/assets/{loading-CanSHf7z.js.map → loading-CYiiwb08.js.map} +1 -1
  51. package/public/assets/main-OmXs7qtG.js +48 -0
  52. package/public/assets/main-OmXs7qtG.js.map +1 -0
  53. package/public/assets/{markdown-B04qkFuc.js → markdown-DWvSdCZz.js} +4 -4
  54. package/public/assets/{markdown-B04qkFuc.js.map → markdown-DWvSdCZz.js.map} +1 -1
  55. package/public/assets/{monaco-viewer-BB3_mBkA.js → monaco-viewer-Cc9bWg7I.js} +2 -2
  56. package/public/assets/{monaco-viewer-BB3_mBkA.js.map → monaco-viewer-Cc9bWg7I.js.map} +1 -1
  57. package/public/assets/{startup-state-settings-card-DE11-Je6.js → startup-state-settings-card-2KHpBL8U.js} +2 -2
  58. package/public/assets/{startup-state-settings-card-DE11-Je6.js.map → startup-state-settings-card-2KHpBL8U.js.map} +1 -1
  59. package/public/assets/{terminal-square-W8UL0Uzs.js → terminal-square-lzHuj_of.js} +2 -2
  60. package/public/assets/{terminal-square-W8UL0Uzs.js.map → terminal-square-lzHuj_of.js.map} +1 -1
  61. package/public/assets/tool-call-DjkszeT4.js +60 -0
  62. package/public/assets/tool-call-DjkszeT4.js.map +1 -0
  63. package/public/assets/{unified-picker-CkVc32ly.js → unified-picker-5JmIM6a0.js} +2 -2
  64. package/public/assets/{unified-picker-CkVc32ly.js.map → unified-picker-5JmIM6a0.js.map} +1 -1
  65. package/public/assets/{wrap-text-CR-cuiJP.js → wrap-text-N0Cav2Vp.js} +2 -2
  66. package/public/assets/{wrap-text-CR-cuiJP.js.map → wrap-text-N0Cav2Vp.js.map} +1 -1
  67. package/public/index.html +4 -4
  68. package/public/loading.html +4 -4
  69. package/public/sw.js +1 -1
  70. package/public/sw.js.map +1 -1
  71. package/public/assets/App-DPj4p3An.js +0 -43
  72. package/public/assets/App-DPj4p3An.js.map +0 -1
  73. package/public/assets/index-C9znv1NB.js +0 -2
  74. package/public/assets/index-CT42quXi.css +0 -1
  75. package/public/assets/main-COtTRZe6.js +0 -48
  76. package/public/assets/main-COtTRZe6.js.map +0 -1
  77. package/public/assets/tool-call-irc_6gLg.js +0 -60
  78. package/public/assets/tool-call-irc_6gLg.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client-state-CBKOWfhu.js","sources":["../../../lib/native/client-state.ts","../../../stores/client-state-attachments-codec.ts","../../../stores/client-state-codec.ts","../../../stores/client-state-partitions.ts","../../../stores/client-state.ts"],"sourcesContent":["import { invoke } from \"@tauri-apps/api/core\"\nimport { isElectronHost, isLocalWindow, isTauriHost } from \"../runtime-env\"\nimport { getLogger } from \"../logger\"\nconst LEGACY_WEB_KEYS = [\"codenomad-client-snapshot-v1\", \"codenomad-client-restore-enabled-v1\"]\nexport type NativeClientStateLoadResult = {\n isPrimary: boolean\n restoreEnabled: boolean\n snapshot: unknown | null\n partitionProtocolVersion?: 1\n}\nexport type NativeClientStatePartitionCommit = {\n protocolVersion: 1\n snapshot: unknown\n partitions: Record<string, string>\n partitionKeys: string[]\n}\nconst SECONDARY_CLIENT_STATE: NativeClientStateLoadResult = { isPrimary: false, restoreEnabled: false, snapshot: null }\nconst log = getLogger(\"actions\")\nconst accessToken = (() => {\n const bytes = new Uint8Array(32)\n globalThis.crypto.getRandomValues(bytes)\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\")\n})()\nlet nativeAccessClaimed = false\nconst electronApi = () => (window as Window & { electronAPI?: ElectronAPI }).electronAPI\nfunction dispatchNative<T>(electronOperation: (api: ElectronAPI | undefined) => Promise<T> | undefined, command: string, args: Record<string, unknown> = {}): Promise<T> | undefined {\n if (isElectronHost()) return electronOperation(electronApi())\n if (isTauriHost()) return invoke<T>(command, { accessToken, ...args })\n}\nasync function claimNativeClientStateAccess(): Promise<boolean> {\n if (!isLocalWindow()) return false\n try {\n const result = await dispatchNative<boolean | void>((api) => api?.claimClientStateAccess?.(accessToken), \"client_state_claim_access\")\n nativeAccessClaimed = isTauriHost() || result === true\n } catch (error) {\n nativeAccessClaimed = false\n log.warn(\"Client state native access claim failed\", error)\n }\n return nativeAccessClaimed\n}\nexport async function loadNativeClientState(): Promise<NativeClientStateLoadResult> {\n if (isElectronHost() || isTauriHost()) {\n if (!await claimNativeClientStateAccess()) return SECONDARY_CLIENT_STATE\n const loaded = await dispatchNative((api) => api?.loadClientState?.(accessToken), \"client_state_load\") ?? SECONDARY_CLIENT_STATE\n if (!isElectronHost()) return loaded\n const api = electronApi()\n return {\n ...loaded,\n partitionProtocolVersion: loaded.partitionProtocolVersion === 1\n && typeof api?.commitClientStatePartitions === \"function\"\n && typeof api.loadClientStatePartition === \"function\" ? 1 : undefined,\n }\n }\n try {\n for (const key of LEGACY_WEB_KEYS) window.localStorage.removeItem(key)\n } catch {}\n return SECONDARY_CLIENT_STATE\n}\nasync function mutateNativeClientState(electronOperation: (api: ElectronAPI) => Promise<boolean> | undefined, command: string, args: Record<string, unknown> = {}): Promise<boolean> {\n if (!nativeAccessClaimed) return false\n return await dispatchNative((api) => api && electronOperation(api), command, args) ?? false\n}\nexport const saveNativeClientState = (snapshot: unknown): Promise<boolean> =>\n mutateNativeClientState((api) => api.saveClientState?.(accessToken, snapshot), \"client_state_save\", { snapshot })\nexport const commitNativeClientStatePartitions = (payload: NativeClientStatePartitionCommit): Promise<boolean> =>\n mutateNativeClientState((api) => api.commitClientStatePartitions?.(accessToken, payload), \"client_state_commit_partitions\", { payload })\nexport const loadNativeClientStatePartition = async (key: string): Promise<string | null> => {\n if (!nativeAccessClaimed) return null\n return await dispatchNative((api) => api?.loadClientStatePartition?.(accessToken, key), \"client_state_load_partition\", { key }) ?? null\n}\nexport const setNativeRestoreEnabled = (enabled: boolean): Promise<boolean> =>\n mutateNativeClientState((api) => api.setClientStateRestoreEnabled?.(accessToken, enabled), \"client_state_set_restore_enabled\", { enabled })\nexport const clearNativeClientState = (): Promise<boolean> =>\n mutateNativeClientState((api) => api.clearClientState?.(accessToken), \"client_state_clear\")\nfunction acknowledge(command: string, args: Record<string, unknown> = {}): Promise<void> {\n if (!isTauriHost() || !nativeAccessClaimed) return Promise.resolve()\n return invoke(command, { accessToken, ...args })\n}\nexport const acknowledgeNativeClientStateNavigationFlush = (generation: number) =>\n acknowledge(\"client_state_navigation_flushed\", { generation })\nexport const acknowledgeNativeClientStateRendererFlush = (generation: number) =>\n acknowledge(\"client_state_renderer_flushed\", { generation })\n","import type { Attachment, AttachmentSource } from \"../types/attachment\"\n\nexport type RestorableAttachmentSource =\n | { type: \"file\"; path: string; mime: string; data?: string }\n | { type: \"text\"; value: string }\n | { type: \"agent\"; name: string }\n | { type: \"symbol\"; path: string; name: string; kind: number; range: { start: Position; end: Position } }\n\ninterface Position {\n line: number\n char: number\n}\n\nexport interface RestorableAttachment {\n id: string\n type: Attachment[\"type\"]\n display: string\n url: string\n filename: string\n mediaType: string\n source: RestorableAttachmentSource\n}\nconst MAX_ID = 512\nconst MAX_DISPLAY = 1024\nconst MAX_PATH = 4096\nconst MAX_MIME = 256\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\nconst isSafeKey = (value: string) =>\n value !== \"__proto__\" && value !== \"constructor\" && value !== \"prototype\"\n\nfunction takeString(value: unknown, max: number, allowEmpty = false) {\n if (typeof value !== \"string\" || value.length > max) return\n if (!allowEmpty && value.trim().length === 0) return\n return value\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\"\n for (let index = 0; index < bytes.length; index += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(index, index + 0x8000))\n }\n return btoa(binary)\n}\n\nconst base64ToBytes = (value: string) => Uint8Array.from(atob(value), (character) => character.charCodeAt(0))\n\nfunction validBase64(value: unknown): value is string {\n if (typeof value !== \"string\" || value.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(value)) return false\n try {\n base64ToBytes(value)\n return true\n } catch {\n return false\n }\n}\n\nconst dataUrlPayload = (value: unknown): string | undefined => typeof value === \"string\"\n ? value.match(/^data:[^;,]+;base64,([A-Za-z0-9+/]*={0,2})$/)?.[1]\n : undefined\n\nfunction takeFileData(value: unknown, url: unknown): string | undefined {\n const raw = dataUrlPayload(url) ?? value\n const data = raw instanceof Uint8Array ? bytesToBase64(raw) : raw\n return validBase64(data) ? data : undefined\n}\n\nfunction takePosition(value: unknown): Position | undefined {\n if (!isRecord(value) || !Number.isSafeInteger(value.line) || Number(value.line) < 0) return\n if (!Number.isSafeInteger(value.char) || Number(value.char) < 0) return\n return { line: Number(value.line), char: Number(value.char) }\n}\n\nfunction normalizeSource(\n value: unknown,\n url: unknown,\n): RestorableAttachmentSource | undefined {\n if (!isRecord(value)) return\n if (value.type === \"text\") {\n return typeof value.value === \"string\" ? { type: \"text\", value: value.value } : undefined\n }\n if (value.type === \"agent\") {\n const name = takeString(value.name, MAX_DISPLAY)\n return name === undefined ? undefined : { type: \"agent\", name }\n }\n\n const path = takeString(value.path, MAX_PATH)\n if (value.type === \"file\") {\n const mime = takeString(value.mime, MAX_MIME)\n if (path === undefined || mime === undefined) return\n const rawData = dataUrlPayload(url) ?? value.data\n const data = takeFileData(value.data, url)\n if (rawData !== undefined && data === undefined) return\n return data === undefined ? { type: \"file\", path, mime } : { type: \"file\", path, mime, data }\n }\n if (value.type !== \"symbol\" || !isRecord(value.range)) return\n const name = takeString(value.name, MAX_DISPLAY)\n const start = takePosition(value.range.start)\n const end = takePosition(value.range.end)\n if (path === undefined || name === undefined || !Number.isSafeInteger(value.kind) || !start || !end) return\n return { type: \"symbol\", path, name, kind: Number(value.kind), range: { start, end } }\n}\n\nfunction normalizeAttachment(value: unknown): RestorableAttachment | undefined {\n if (!isRecord(value)) return\n if (![\"file\", \"text\", \"symbol\", \"agent\"].includes(String(value.type))) return\n\n const id = takeString(value.id, MAX_ID)\n const display = takeString(value.display, MAX_DISPLAY)\n const filename = takeString(value.filename, MAX_PATH)\n const mediaType = takeString(value.mediaType, MAX_MIME)\n const source = normalizeSource(value.source, value.url)\n const rawUrl = typeof value.url === \"string\" && !value.url.startsWith(\"data:\") ? value.url : \"\"\n const url = takeString(rawUrl, MAX_PATH, true)\n if (\n !id || !display || !filename || !mediaType || !source ||\n source.type !== value.type || url === undefined\n ) return\n\n return { id, type: value.type as Attachment[\"type\"], display, url, filename, mediaType, source }\n}\n\nexport function normalizeRestorableAttachmentRecord(\n value: unknown,\n drafts: Record<string, string>,\n prioritySessionIds: readonly string[] = [],\n): { attachments: Record<string, RestorableAttachment[]>; drafts: Record<string, string> } | null {\n if (!isRecord(value)) return null\n const attachments: Record<string, RestorableAttachment[]> = Object.create(null)\n const priority = [...new Set(prioritySessionIds)]\n const prioritySet = new Set(priority)\n const entries = [\n ...priority.flatMap((sessionId) => Object.prototype.hasOwnProperty.call(value, sessionId)\n ? [[sessionId, value[sessionId]] as const]\n : []),\n ...Object.entries(value).filter(([sessionId]) => !prioritySet.has(sessionId)),\n ]\n for (const [sessionId, rawAttachments] of entries) {\n if (\n !isSafeKey(sessionId) || !sessionId ||\n sessionId.length > MAX_ID || !Array.isArray(rawAttachments)\n ) continue\n const normalized: RestorableAttachment[] = []\n for (const raw of rawAttachments) {\n const attachment = normalizeAttachment(raw)\n if (attachment) normalized.push(attachment)\n }\n if (normalized.length) attachments[sessionId] = normalized\n }\n return { attachments, drafts: { ...drafts } }\n}\n\nexport function serializeDraftAttachments(\n drafts: Record<string, string>,\n attachments: Record<string, Attachment[]>,\n prioritySessionIds: readonly string[] = [],\n) {\n const normalized = normalizeRestorableAttachmentRecord(attachments, drafts, prioritySessionIds)\n if (!normalized || Object.entries(attachments).some(([sessionId, values]) =>\n values.length !== (normalized.attachments[sessionId]?.length ?? 0))) {\n throw new Error(\"Draft attachments could not be persisted safely\")\n }\n return normalized\n}\n\nexport function hydrateRestorableAttachment(value: RestorableAttachment): Attachment | null {\n let source: AttachmentSource\n let url = value.url\n if (value.source.type === \"file\") {\n try {\n const data = value.source.data === undefined ? undefined : base64ToBytes(value.source.data)\n source = { type: \"file\", path: value.source.path, mime: value.source.mime, data }\n if (!url && value.source.data) url = `data:${value.source.mime};base64,${value.source.data}`\n } catch {\n return null\n }\n } else {\n source = value.source\n if (value.source.type === \"text\" && !url) {\n url = `data:text/plain;base64,${bytesToBase64(new TextEncoder().encode(value.source.value))}`\n }\n }\n return { ...value, url, source }\n}\n","import type { ScrollSnapshot } from \"./message-v2/types\"\nimport { normalizeRestorableAttachmentRecord, type RestorableAttachment } from \"./client-state-attachments-codec\"\nimport type { PersistedGenerationRecovery } from \"./session-generation-recovery\"\n\nexport interface RestorableWorkspaceTabState {\n kind: \"workspace\"; folder: string; occurrence?: number; projectName?: string; binaryPath?: string\n activeParentSessionId?: string; activeSessionId?: string\n drafts: Record<string, string>; attachments: Record<string, RestorableAttachment[]>\n scrollSnapshots: Record<string, ScrollSnapshot>; unseenIdleSince: Record<string, number>\n generationRecovery: Record<string, PersistedGenerationRecovery>\n expandedSessionIds?: string[]\n}\n\nexport interface RestorableSidecarTabState { kind: \"sidecar\"; sidecarId: string }\nexport type RestorableTabState = RestorableWorkspaceTabState | RestorableSidecarTabState\nexport interface RestorableSessionState { tabs: RestorableTabState[]; activeTabIndex: number; homeActive?: boolean }\nexport interface ClientSnapshotV1 {\n version: 1; revision: number; savedAt: number\n layout: Record<string, string>; session: RestorableSessionState | null\n}\n\nconst MAX_TABS = 32, MAX_LAYOUT_ENTRIES = 64, MAX_DRAFTS = 24, MAX_SCROLLS_PER_TAB = 96\nconst MAX_IDLE_MARKERS = 256, MAX_RECOVERY = 256, MAX_EXPANDED = 256, MAX_KEY = 256, MAX_PATH = 4096, MAX_ID = 512\nconst MAX_LAYOUT_VALUE = 4096, MAX_DRAFT = 32 * 1024, MAX_ANCHOR_KEY = 1024\nconst MAX_STRINGS = 96 * 1024, MAX_SCROLLS = 256, MAX_NEWER_CURSORS = 32, MAX_WINDOW_CURSOR = 1024\nconst NO_SESSION_DRAFT_SESSION_ID = \"__no_session_draft__\"\n\ninterface StringBudget { remaining: number; scrollSnapshotsRemaining: number }\n\nfunction createBudget(): StringBudget {\n return { remaining: MAX_STRINGS, scrollSnapshotsRemaining: MAX_SCROLLS }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\nconst safeKey = (key: string) => key !== \"__proto__\" && key !== \"constructor\" && key !== \"prototype\"\n\nfunction takeString(value: unknown, max: number, budget: StringBudget, allowEmpty = false): string | undefined {\n if (typeof value !== \"string\" || value.length > max || value.length > budget.remaining) return\n if (!allowEmpty && value.trim().length === 0) return\n budget.remaining -= value.length\n return value\n}\n\nconst takeNumber = (value: unknown, min: number, max: number): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) && value >= min && value <= max ? value : undefined\n\nfunction normalizeRecord<T>(\n value: unknown, max: number, budget: StringBudget,\n normalize: (value: unknown) => T | undefined,\n accept: (value: unknown) => boolean = () => true,\n accepted: () => void = () => {},\n priorityKeys: readonly string[] = [],\n): Record<string, T> | null {\n if (!isRecord(value)) return null\n const result: Record<string, T> = Object.create(null)\n let count = 0\n const priorities = [...new Set(priorityKeys)]\n const prioritySet = new Set(priorities)\n const entries = [\n ...priorities.flatMap((key) => Object.prototype.hasOwnProperty.call(value, key) ? [[key, value[key]] as const] : []),\n ...Object.entries(value).filter(([key]) => !prioritySet.has(key)),\n ]\n for (const [rawKey, rawValue] of entries) {\n if (count >= max) break\n if (!safeKey(rawKey) || !accept(rawValue)) continue\n const key = takeString(rawKey, MAX_KEY, budget)\n const entry = normalize(rawValue)\n if (key === undefined || entry === undefined) continue\n result[key] = entry\n count += 1\n accepted()\n }\n return result\n}\n\nfunction normalizeStringRecord(\n value: unknown,\n max: number,\n valueMax: number,\n budget: StringBudget,\n priorityKeys: readonly string[] = [],\n) {\n return normalizeRecord(value, max, budget, (entry) => takeString(entry, valueMax, budget, true),\n undefined, undefined, priorityKeys)\n}\n\nfunction normalizeScrollSnapshot(value: unknown, budget: StringBudget): ScrollSnapshot | undefined {\n if (!isRecord(value)) return\n const scrollTop = takeNumber(value.scrollTop, 0, 1_000_000_000)\n const updatedAt = takeNumber(value.updatedAt, 0, Number.MAX_SAFE_INTEGER)\n if (scrollTop === undefined || updatedAt === undefined || typeof value.atBottom !== \"boolean\") return\n const result: ScrollSnapshot = { scrollTop, atBottom: value.atBottom, updatedAt }\n const scrollRatio = takeNumber(value.scrollRatio, 0, 1)\n const maxScrollTop = takeNumber(value.maxScrollTop, 0, 1_000_000_000)\n const anchorOffset = takeNumber(value.anchorOffset, -1_000_000, 1_000_000)\n const anchorKey = value.anchorKey === undefined ? undefined : takeString(value.anchorKey, MAX_ANCHOR_KEY, budget)\n if (scrollRatio !== undefined) result.scrollRatio = scrollRatio\n if (maxScrollTop !== undefined) result.maxScrollTop = maxScrollTop\n if (anchorKey !== undefined) result.anchorKey = anchorKey\n if (anchorOffset !== undefined) result.anchorOffset = anchorOffset\n if (value.followModeType === \"following\" || value.followModeType === \"escaped\") result.followModeType = value.followModeType\n if (typeof value.windowIsLatest === \"boolean\") result.windowIsLatest = value.windowIsLatest\n const windowCursor = value.windowCursor === undefined ? undefined : takeString(value.windowCursor, MAX_WINDOW_CURSOR, budget)\n if (windowCursor !== undefined) result.windowCursor = windowCursor\n if (Array.isArray(value.newerCursors)) {\n const newerCursors: Array<string | null> = []\n for (const entry of value.newerCursors.slice(-MAX_NEWER_CURSORS)) {\n if (entry === null || entry === \"\") {\n newerCursors.push(null)\n continue\n }\n const cursor = takeString(entry, MAX_WINDOW_CURSOR, budget)\n if (cursor === undefined) continue\n newerCursors.push(cursor)\n }\n if (newerCursors.length > 0) result.newerCursors = newerCursors\n }\n return result\n}\n\nfunction normalizeExpandedSessionIds(value: unknown, budget: StringBudget): string[] | null {\n if (!Array.isArray(value)) return null\n const result: string[] = []\n const seen = new Set<string>()\n for (const entry of value.slice(0, MAX_EXPANDED)) {\n if (typeof entry !== \"string\" || seen.has(entry)) continue\n const id = takeString(entry, MAX_ID, budget)\n if (id === undefined) continue\n seen.add(id)\n result.push(id)\n }\n return result\n}\n\nfunction normalizeWorkspaceTab(\n value: Record<string, unknown>,\n identity: WorkspaceIdentity,\n budget: StringBudget,\n _prioritizeDrafts: boolean,\n): RestorableWorkspaceTabState | null {\n const reservedDrafts = identity.priorityDrafts\n const remainingDrafts = Object.fromEntries(Object.entries(value.drafts ?? {})\n .filter(([id]) => !Object.prototype.hasOwnProperty.call(reservedDrafts, id)))\n const additionalDrafts = normalizeStringRecord(\n remainingDrafts,\n Math.max(0, MAX_DRAFTS - Object.keys(reservedDrafts).length),\n MAX_DRAFT,\n budget,\n )\n const drafts = additionalDrafts ? { ...reservedDrafts, ...additionalDrafts } : null\n const scrollLimit = Math.min(MAX_SCROLLS_PER_TAB, budget.scrollSnapshotsRemaining)\n const scrollSnapshots = normalizeRecord(value.scrollSnapshots ?? {}, scrollLimit, budget,\n (entry) => normalizeScrollSnapshot(entry, budget), undefined,\n () => { budget.scrollSnapshotsRemaining -= 1 })\n const unseenIdleSince = normalizeRecord(value.unseenIdleSince ?? {}, MAX_IDLE_MARKERS, budget,\n (entry) => takeNumber(entry, 0, Number.MAX_SAFE_INTEGER))\n const generationRecovery = normalizeRecord<PersistedGenerationRecovery>(\n value.generationRecovery ?? {}, MAX_RECOVERY, budget,\n (entry) => entry as PersistedGenerationRecovery,\n (entry) => entry === \"working\" || entry === \"interrupted\")\n const expandedSessionIds = value.expandedSessionIds === undefined\n ? undefined\n : normalizeExpandedSessionIds(value.expandedSessionIds, budget)\n if (!drafts || !scrollSnapshots || !unseenIdleSince || !generationRecovery || expandedSessionIds === null) return null\n const remainingAttachments = Object.fromEntries(Object.entries(value.attachments ?? {})\n .filter(([id]) => !identity.prioritySessionIds.includes(id)))\n const attachmentResult = normalizeRestorableAttachmentRecord(\n remainingAttachments, drafts,\n )\n if (!attachmentResult) return null\n\n const result: RestorableWorkspaceTabState = {\n kind: \"workspace\", folder: identity.folder,\n drafts: attachmentResult.drafts,\n attachments: { ...identity.priorityAttachments, ...attachmentResult.attachments },\n scrollSnapshots, unseenIdleSince, generationRecovery,\n }\n if (expandedSessionIds !== undefined) result.expandedSessionIds = expandedSessionIds\n if (Number.isInteger(value.occurrence) && Number(value.occurrence) >= 0 && Number(value.occurrence) < MAX_TABS) {\n result.occurrence = Number(value.occurrence)\n }\n const projectName = value.projectName === undefined ? undefined : takeString(value.projectName, MAX_PATH, budget)\n const binaryPath = value.binaryPath === undefined ? undefined : takeString(value.binaryPath, MAX_PATH, budget)\n if (projectName !== undefined) result.projectName = projectName\n if (binaryPath !== undefined) result.binaryPath = binaryPath\n if (identity.activeParentSessionId !== undefined) result.activeParentSessionId = identity.activeParentSessionId\n if (identity.activeSessionId !== undefined) result.activeSessionId = identity.activeSessionId\n return result\n}\n\ninterface WorkspaceIdentity {\n kind: \"workspace\"; value: Record<string, unknown>; folder: string\n activeParentSessionId?: string; activeSessionId?: string\n prioritySessionIds: string[]; priorityDrafts: Record<string, string>\n priorityAttachments: Record<string, RestorableAttachment[]>\n}\ntype TabIdentity = WorkspaceIdentity | RestorableSidecarTabState\n\nfunction normalizeIdentity(value: unknown, budget: StringBudget): TabIdentity | null {\n if (!isRecord(value)) return null\n const kind = value.kind ?? value.type\n if (kind === \"sidecar\") {\n const sidecarId = takeString(value.sidecarId, MAX_ID, budget)\n return sidecarId === undefined ? null : { kind, sidecarId }\n }\n if (kind !== \"workspace\" && kind !== \"instance\") return null\n if (![\"drafts\", \"attachments\", \"scrollSnapshots\", \"unseenIdleSince\", \"generationRecovery\"]\n .every((key) => isRecord(value[key] ?? {}))) return null\n const folder = takeString(value.folder, MAX_PATH, budget)\n if (folder === undefined) return null\n const activeParentSessionId = value.activeParentSessionId === undefined ? undefined\n : takeString(value.activeParentSessionId, MAX_ID, budget)\n const activeSessionId = value.activeSessionId === undefined ? undefined : takeString(value.activeSessionId, MAX_ID, budget)\n const prioritySessionIds = [activeSessionId, NO_SESSION_DRAFT_SESSION_ID]\n .filter((id): id is string => Boolean(id))\n return {\n kind: \"workspace\", value, folder, activeParentSessionId, activeSessionId,\n prioritySessionIds, priorityDrafts: Object.create(null), priorityAttachments: Object.create(null),\n }\n}\n\nfunction reservePriorityDrafts(identity: WorkspaceIdentity, budget: StringBudget): void {\n const drafts = identity.value.drafts ?? {}\n if (!isRecord(drafts)) return\n for (const rawKey of identity.prioritySessionIds) {\n if (!safeKey(rawKey) || !Object.prototype.hasOwnProperty.call(drafts, rawKey)) continue\n const remaining = budget.remaining\n const key = takeString(rawKey, MAX_KEY, budget)\n const draft = takeString(drafts[rawKey], MAX_DRAFT, budget, true)\n if (key === undefined || draft === undefined) {\n budget.remaining = remaining\n continue\n }\n identity.priorityDrafts[key] = draft\n }\n const attachments = identity.value.attachments ?? {}\n if (!isRecord(attachments)) return\n const priorityAttachments = Object.fromEntries(identity.prioritySessionIds\n .filter((id) => Object.prototype.hasOwnProperty.call(attachments, id))\n .map((id) => [id, attachments[id]]))\n const result = normalizeRestorableAttachmentRecord(\n priorityAttachments,\n identity.priorityDrafts,\n identity.prioritySessionIds,\n )\n if (!result) return\n identity.priorityDrafts = result.drafts\n identity.priorityAttachments = result.attachments\n}\n\nexport function normalizeRestorableSession(value: unknown): RestorableSessionState | null {\n return normalizeSession(value, createBudget())\n}\n\nfunction normalizeSession(value: unknown, budget: StringBudget): RestorableSessionState | null {\n if (!isRecord(value) || !Array.isArray(value.tabs) || !Number.isInteger(value.activeTabIndex)) return null\n const requested = Number(value.activeTabIndex)\n const rawTabs = value.tabs.slice(0, MAX_TABS)\n const identityByIndex = new Map<number, TabIdentity>()\n const normalizedByIndex = new Map<number, RestorableTabState>()\n const normalizeIdentityAt = (originalIndex: number) => {\n const identity = normalizeIdentity(rawTabs[originalIndex], budget)\n if (!identity) return\n identityByIndex.set(originalIndex, identity)\n }\n const normalizeTabAt = (originalIndex: number, prioritizeDrafts: boolean) => {\n const identity = identityByIndex.get(originalIndex)\n if (!identity) return\n const tab = identity.kind === \"sidecar\"\n ? identity\n : normalizeWorkspaceTab(identity.value, identity, budget, prioritizeDrafts)\n if (tab) normalizedByIndex.set(originalIndex, tab)\n }\n rawTabs.forEach((_tab, index) => normalizeIdentityAt(index))\n const priorityOrder = [requested, ...rawTabs.map((_tab, index) => index).filter((index) => index !== requested)]\n for (const index of priorityOrder) {\n const identity = identityByIndex.get(index)\n if (identity?.kind === \"workspace\") reservePriorityDrafts(identity, budget)\n }\n if (rawTabs[requested] !== undefined) normalizeTabAt(requested, true)\n rawTabs.forEach((_tab, index) => {\n if (index !== requested) normalizeTabAt(index, true)\n })\n const identities = rawTabs.flatMap((_tab, originalIndex) => {\n const identity = identityByIndex.get(originalIndex)\n return identity ? [{ originalIndex, identity }] : []\n })\n const normalized = identities.flatMap(({ originalIndex }) => {\n const tab = normalizedByIndex.get(originalIndex)\n return tab ? [{ originalIndex, tab }] : []\n })\n if (value.tabs.length && !normalized.length) return null\n\n const tabs = normalized.map(({ tab }) => tab)\n const surviving = normalized.findIndex(({ originalIndex }) => originalIndex === requested)\n const next = normalized.findIndex(({ originalIndex }) => originalIndex > requested)\n const activeTabIndex = !tabs.length ? -1 : surviving >= 0 ? surviving : next >= 0 ? next : tabs.length - 1\n return { tabs, activeTabIndex, ...(value.homeActive === true ? { homeActive: true } : {}) }\n}\n\nexport function decodeClientSnapshot(value: unknown): ClientSnapshotV1 | null {\n if (!isRecord(value) || (value.version !== undefined && value.version !== 1)\n || !Number.isSafeInteger(value.revision) || Number(value.revision) < 0) return null\n const savedAt = takeNumber(value.savedAt, 0, Number.MAX_SAFE_INTEGER)\n if (savedAt === undefined) return null\n const budget = createBudget()\n const session = value.session === null ? null : normalizeSession(value.session, budget)\n if (value.session !== null && !session) return null\n const layout = normalizeStringRecord(value.layout, MAX_LAYOUT_ENTRIES, MAX_LAYOUT_VALUE, budget)\n return layout ? { version: 1, revision: Number(value.revision), savedAt, layout, session } : null\n}\n\nexport function isFutureClientSnapshot(value: unknown): boolean {\n return isRecord(value) && typeof value.version === \"number\" && Number.isInteger(value.version) && value.version > 2\n}\n","import { decodeClientSnapshot, normalizeRestorableSession } from \"./client-state-codec\"\nimport type { ClientSnapshotV1, RestorableSessionState, RestorableWorkspaceTabState } from \"./client-state-codec\"\nimport type { RestorableAttachment } from \"./client-state-attachments-codec\"\n\nconst MAX_PARTITION_BYTES = 1024 * 1024\nconst MAX_ROOT_BYTES = 1024 * 1024\nconst MAX_NATIVE_PARTITIONS = 4096\nconst MAX_NATIVE_COMMIT_BYTES = 256 * 1024 * 1024\nconst MAX_SESSION_ID = 512\nconst BLOB_CHUNK_CHARACTERS = 768 * 1024\nconst MAX_BLOB_CHUNKS = 256\nconst MAX_BLOB_BASE64_CHARACTERS = BLOB_CHUNK_CHARACTERS * MAX_BLOB_CHUNKS\nconst PARTITION_KEY = /^[0-9a-f]{64}$/\nconst ROOT_KEYS = [\"layout\", \"partitionKeys\", \"revision\", \"savedAt\", \"sessionPartition\", \"version\"]\nconst UNSAFE_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"])\nconst encoder = new TextEncoder()\n\nexport interface ClientSnapshotV2 {\n version: 2\n revision: number\n savedAt: number\n layout: Record<string, string>\n sessionPartition: string\n partitionKeys: string[]\n}\n\nexport interface EncodedClientSnapshotV2 {\n root: ClientSnapshotV2\n partitions: Record<string, string>\n partitionKeys: string[]\n}\n\ninterface SessionDocument {\n format: 2\n draft?: string\n attachments?: unknown[]\n scrollSnapshot?: RestorableWorkspaceTabState[\"scrollSnapshots\"][string]\n unseenIdleSince?: number\n generationRecovery?: RestorableWorkspaceTabState[\"generationRecovery\"][string]\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\nconst hasOwn = (value: object, key: string) => Object.prototype.hasOwnProperty.call(value, key)\nconst isSafePersistedSessionId = (value: unknown): value is string =>\n typeof value === \"string\" && value.length > 0 && value.length <= MAX_SESSION_ID\n && value.trim().length > 0 && !UNSAFE_KEYS.has(value)\n\ntype AddPartition = (value: unknown) => Promise<string>\n\nfunction isPartitionKeyArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((key, index) =>\n typeof key === \"string\" && PARTITION_KEY.test(key) && (index === 0 || value[index - 1]! < key))\n}\n\nfunction hasExactKeys(value: Record<string, unknown>, required: readonly string[], optional: readonly string[] = []): boolean {\n const allowed = new Set([...required, ...optional])\n return required.every((key) => hasOwn(value, key)) && Object.keys(value).every((key) => allowed.has(key))\n}\n\nfunction sortJson(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortJson)\n if (!isRecord(value)) return value\n return Object.fromEntries(Object.keys(value).sort().map((key) => [key, sortJson(value[key])]))\n}\n\nexport function canonicalJson(value: unknown): string {\n const serialized = JSON.stringify(sortJson(value))\n if (serialized === undefined) throw new TypeError(\"Client state partition must be JSON-serializable\")\n return serialized\n}\n\nfunction canonicalEquals(left: unknown, right: unknown): boolean {\n try {\n return canonicalJson(left) === canonicalJson(right)\n } catch {\n return false\n }\n}\n\nexport async function sha256(value: string): Promise<string> {\n const digest = await crypto.subtle.digest(\"SHA-256\", encoder.encode(value))\n return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\")\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\"\n for (let index = 0; index < bytes.length; index += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(index, index + 0x8000))\n }\n return btoa(binary)\n}\n\nconst base64ToBytes = (value: string) => Uint8Array.from(atob(value), (character) => character.charCodeAt(0))\nconst validBase64 = (value: unknown): value is string => typeof value === \"string\"\n && value.length % 4 === 0 && /^[A-Za-z0-9+/]*={0,2}$/.test(value)\n\nasync function addBlob(data: string, addPartition: AddPartition): Promise<string[]> {\n if (!validBase64(data) || data.length > MAX_BLOB_BASE64_CHARACTERS) {\n throw new Error(\"Client state attachment exceeds the 192 MiB encoded blob limit\")\n }\n const keys: string[] = []\n for (let offset = 0, index = 0; offset < data.length || offset === 0; offset += BLOB_CHUNK_CHARACTERS, index += 1) {\n keys.push(await addPartition({ format: 2, index, data: data.slice(offset, offset + BLOB_CHUNK_CHARACTERS) }))\n }\n return keys\n}\n\nasync function encodeAttachments(attachments: RestorableAttachment[], addPartition: AddPartition): Promise<unknown[]> {\n return Promise.all(attachments.map(async (attachment) => {\n let source: Record<string, unknown>\n if (attachment.source.type === \"file\") {\n source = { type: \"file\", path: attachment.source.path, mime: attachment.source.mime }\n if (attachment.source.data !== undefined) source.dataPartitions = await addBlob(attachment.source.data, addPartition)\n } else if (attachment.source.type === \"text\") {\n source = {\n type: \"text\",\n valuePartitions: await addBlob(bytesToBase64(encoder.encode(attachment.source.value)), addPartition),\n }\n } else source = attachment.source\n return { ...attachment, source }\n }))\n}\n\nasync function encodeSessionGraph(session: RestorableSessionState | null) {\n const generated: Record<string, string> = Object.create(null)\n const addPartition = async (value: unknown) => {\n const partition = canonicalJson(value)\n if (encoder.encode(partition).byteLength > MAX_PARTITION_BYTES) {\n throw new Error(\"Client state partition exceeds the native size limit\")\n }\n const key = await sha256(partition)\n generated[key] = partition\n return key\n }\n\n const encodedSession = session === null ? null : {\n tabs: await Promise.all(session.tabs.map(async (tab) => {\n if (tab.kind === \"sidecar\") return { kind: tab.kind, sidecarId: tab.sidecarId }\n\n const sessionIds = new Set([\n ...Object.keys(tab.drafts),\n ...Object.keys(tab.attachments),\n ...Object.keys(tab.scrollSnapshots),\n ...Object.keys(tab.unseenIdleSince),\n ...Object.keys(tab.generationRecovery),\n ])\n const sessions: Record<string, { documentPartition: string; partitionKeys: string[] }> = Object.create(null)\n for (const sessionId of [...sessionIds].sort()) {\n const document: SessionDocument = { format: 2 }\n if (hasOwn(tab.drafts, sessionId)) document.draft = tab.drafts[sessionId]\n if (hasOwn(tab.attachments, sessionId)) {\n document.attachments = await encodeAttachments(tab.attachments[sessionId]!, addPartition)\n }\n if (hasOwn(tab.scrollSnapshots, sessionId)) document.scrollSnapshot = tab.scrollSnapshots[sessionId]\n if (hasOwn(tab.unseenIdleSince, sessionId)) document.unseenIdleSince = tab.unseenIdleSince[sessionId]\n if (hasOwn(tab.generationRecovery, sessionId)) document.generationRecovery = tab.generationRecovery[sessionId]\n const documentPartition = await addPartition(document)\n const attachmentPartitions = (document.attachments ?? []).flatMap((attachment) => {\n if (!isRecord(attachment) || !isRecord(attachment.source)) return []\n const keys = attachment.source.dataPartitions ?? attachment.source.valuePartitions\n return Array.isArray(keys) ? keys.filter((key): key is string => typeof key === \"string\") : []\n })\n sessions[sessionId] = {\n documentPartition,\n partitionKeys: [...new Set([documentPartition, ...attachmentPartitions])].sort(),\n }\n }\n\n const workspace: Record<string, unknown> = { format: 2, sessions }\n if (tab.activeParentSessionId !== undefined) workspace.activeParentSessionId = tab.activeParentSessionId\n if (tab.activeSessionId !== undefined) workspace.activeSessionId = tab.activeSessionId\n if (tab.expandedSessionIds !== undefined) workspace.expandedSessionIds = tab.expandedSessionIds\n const shell: Record<string, unknown> = {\n kind: tab.kind,\n folder: tab.folder,\n workspacePartition: await addPartition(workspace),\n }\n if (tab.occurrence !== undefined) shell.occurrence = tab.occurrence\n if (tab.projectName !== undefined) shell.projectName = tab.projectName\n if (tab.binaryPath !== undefined) shell.binaryPath = tab.binaryPath\n return shell\n })),\n activeTabIndex: session.activeTabIndex,\n ...(session.homeActive !== undefined ? { homeActive: session.homeActive } : {}),\n }\n const sessionPartition = await addPartition({ format: 2, session: encodedSession })\n const partitionKeys = Object.keys(generated).sort()\n return {\n sessionPartition,\n partitionKeys,\n partitions: Object.fromEntries(partitionKeys.map((key) => [key, generated[key]!])),\n }\n}\n\nexport async function encodeClientSnapshotV2(snapshot: ClientSnapshotV1): Promise<EncodedClientSnapshotV2> {\n const graph = await encodeSessionGraph(snapshot.session)\n return {\n root: {\n version: 2,\n revision: snapshot.revision,\n savedAt: snapshot.savedAt,\n layout: snapshot.layout,\n sessionPartition: graph.sessionPartition,\n partitionKeys: graph.partitionKeys,\n },\n partitions: graph.partitions,\n partitionKeys: graph.partitionKeys,\n }\n}\n\nexport function canCommitClientSnapshotV2(encoded: EncodedClientSnapshotV2): boolean {\n if (encoded.partitionKeys.length > MAX_NATIVE_PARTITIONS) return false\n const root = JSON.stringify(encoded.root)\n if (root.length > MAX_ROOT_BYTES) return false\n let commitBytes = encoder.encode(root).byteLength\n if (commitBytes > MAX_ROOT_BYTES) return false\n for (const key in encoded.partitions) {\n if (!hasOwn(encoded.partitions, key)) continue\n const partition = encoded.partitions[key]!\n if (partition.length > MAX_PARTITION_BYTES || partition.length > MAX_NATIVE_COMMIT_BYTES - commitBytes) return false\n const partitionBytes = encoder.encode(partition).byteLength\n if (partitionBytes > MAX_PARTITION_BYTES || partitionBytes > MAX_NATIVE_COMMIT_BYTES - commitBytes) return false\n commitBytes += partitionBytes\n }\n return true\n}\n\nfunction decodeRoot(value: unknown): { root: ClientSnapshotV1; partitionKey: string; partitionKeys: string[] } | null {\n if (!isRecord(value) || value.version !== 2 || typeof value.sessionPartition !== \"string\"\n || !PARTITION_KEY.test(value.sessionPartition)\n || !isPartitionKeyArray(value.partitionKeys)\n || !value.partitionKeys.includes(value.sessionPartition)\n || Object.keys(value).sort().join(\"\\0\") !== ROOT_KEYS.join(\"\\0\")) return null\n let serialized: string\n try {\n serialized = JSON.stringify(value)\n } catch {\n return null\n }\n if (encoder.encode(serialized).byteLength > MAX_ROOT_BYTES) return null\n const root = decodeClientSnapshot({ ...value, version: 1, session: null })\n if (!root || !canonicalEquals(value, {\n version: 2,\n revision: root.revision,\n savedAt: root.savedAt,\n layout: root.layout,\n sessionPartition: value.sessionPartition,\n partitionKeys: value.partitionKeys,\n })) return null\n return { root, partitionKey: value.sessionPartition, partitionKeys: value.partitionKeys }\n}\n\nfunction parseJson(value: string): { value: unknown } | null {\n try {\n return { value: JSON.parse(value) as unknown }\n } catch {\n return null\n }\n}\n\nasync function decodeGraph(\n manifest: Record<string, unknown>,\n rootKey: string,\n persistedKeys: readonly string[],\n loaded: Map<string, string>,\n loadPartition: (key: string) => Promise<string | null>,\n): Promise<RestorableSessionState | null | undefined> {\n if (!hasExactKeys(manifest, [\"format\", \"session\"]) || canonicalJson(manifest) !== loaded.get(rootKey)) return\n if (manifest.session === null) {\n const reencoded = await encodeSessionGraph(null)\n return graphMatches(reencoded, rootKey, persistedKeys, loaded) ? null : undefined\n }\n if (!isRecord(manifest.session)\n || !hasExactKeys(manifest.session, [\"tabs\", \"activeTabIndex\"], [\"homeActive\"])\n || !Array.isArray(manifest.session.tabs)) return\n\n const loadCanonical = async (key: unknown): Promise<Record<string, unknown> | null> => {\n if (typeof key !== \"string\" || !PARTITION_KEY.test(key)) return null\n let partition = loaded.get(key)\n if (partition === undefined) {\n partition = await loadPartition(key) ?? undefined\n if (partition === undefined || encoder.encode(partition).byteLength > MAX_PARTITION_BYTES\n || await sha256(partition) !== key) return null\n loaded.set(key, partition)\n }\n const parsed = parseJson(partition)\n return parsed && isRecord(parsed.value) && canonicalJson(parsed.value) === partition ? parsed.value : null\n }\n\n const sameKeys = (left: Iterable<string>, right: readonly string[]) => {\n const sorted = [...new Set(left)].sort()\n return sorted.length === right.length && sorted.every((key, index) => key === right[index])\n }\n const loadBlob = async (keys: unknown, allowed: ReadonlySet<string>, referenced: Set<string>) => {\n if (!Array.isArray(keys) || !keys.length || keys.length > MAX_BLOB_CHUNKS\n || !keys.every((key) => typeof key === \"string\" && PARTITION_KEY.test(key))\n || new Set(keys).size !== keys.length) return null\n const chunks: string[] = []\n let length = 0\n for (const [index, key] of (keys as string[]).entries()) {\n if (!allowed.has(key)) return null\n referenced.add(key)\n const chunk = await loadCanonical(key)\n if (!chunk || !validBase64(chunk.data)) return null\n if (chunk.format === 1) {\n if (!hasExactKeys(chunk, [\"format\", \"data\"])) return null\n } else if (chunk.format === 2) {\n if (!hasExactKeys(chunk, [\"format\", \"index\", \"data\"]) || chunk.index !== index) return null\n } else return null\n if (chunk.data.length > MAX_BLOB_BASE64_CHARACTERS - length) return null\n length += chunk.data.length\n chunks.push(chunk.data)\n }\n const data = chunks.join(\"\")\n return validBase64(data) ? data : null\n }\n const decodeAttachments = async (\n value: unknown,\n allowed: ReadonlySet<string>,\n referenced: Set<string>,\n ): Promise<unknown[] | null> => {\n if (!Array.isArray(value)) return null\n const result: unknown[] = []\n for (const attachment of value) {\n if (!isRecord(attachment) || !hasExactKeys(attachment,\n [\"id\", \"type\", \"display\", \"url\", \"filename\", \"mediaType\", \"source\"]) || !isRecord(attachment.source)) return null\n const source = attachment.source\n if (source.type === \"file\") {\n if (!hasExactKeys(source, [\"type\", \"path\", \"mime\"], [\"dataPartitions\"])) return null\n if (hasOwn(source, \"dataPartitions\")) {\n const data = await loadBlob(source.dataPartitions, allowed, referenced)\n if (data === null) return null\n result.push({ ...attachment, source: { type: source.type, path: source.path, mime: source.mime, data } })\n } else result.push(attachment)\n continue\n }\n if (source.type === \"text\") {\n if (!hasExactKeys(source, [\"type\", \"valuePartitions\"])) return null\n const data = await loadBlob(source.valuePartitions, allowed, referenced)\n if (data === null) return null\n try {\n const value = new TextDecoder(\"utf-8\", { fatal: true }).decode(base64ToBytes(data))\n result.push({ ...attachment, source: { type: source.type, value } })\n } catch {\n return null\n }\n continue\n }\n result.push(attachment)\n }\n return result\n }\n\n const tabs: unknown[] = []\n const declaredGraph = new Set([rootKey])\n let degraded = false\n let legacyGraph = false\n for (const shell of manifest.session.tabs) {\n if (!isRecord(shell)) return\n if (shell.kind === \"sidecar\") {\n if (!hasExactKeys(shell, [\"kind\", \"sidecarId\"])) return\n tabs.push({ kind: shell.kind, sidecarId: shell.sidecarId })\n continue\n }\n if (shell.kind !== \"workspace\"\n || !hasExactKeys(shell, [\"kind\", \"folder\", \"workspacePartition\"], [\"occurrence\", \"projectName\", \"binaryPath\"])) return\n if (typeof shell.workspacePartition !== \"string\" || !PARTITION_KEY.test(shell.workspacePartition)) return\n declaredGraph.add(shell.workspacePartition)\n const workspace = await loadCanonical(shell.workspacePartition)\n if (!workspace || (workspace.format !== 1 && workspace.format !== 2)\n || !hasExactKeys(workspace, [\"format\", \"sessions\"],\n [\"activeParentSessionId\", \"activeSessionId\", \"expandedSessionIds\"])\n || !isRecord(workspace.sessions)) return\n legacyGraph ||= workspace.format === 1\n if (!Object.keys(workspace.sessions).every(isSafePersistedSessionId)\n || (hasOwn(workspace, \"activeParentSessionId\") && !isSafePersistedSessionId(workspace.activeParentSessionId))\n || (hasOwn(workspace, \"activeSessionId\") && !isSafePersistedSessionId(workspace.activeSessionId))\n || (hasOwn(workspace, \"expandedSessionIds\") && (!Array.isArray(workspace.expandedSessionIds)\n || !workspace.expandedSessionIds.every(isSafePersistedSessionId)))) return\n\n const tab: Record<string, unknown> = {\n kind: shell.kind,\n folder: shell.folder,\n drafts: Object.create(null),\n attachments: Object.create(null),\n scrollSnapshots: Object.create(null),\n unseenIdleSince: Object.create(null),\n generationRecovery: Object.create(null),\n }\n for (const key of [\"occurrence\", \"projectName\", \"binaryPath\"] as const) {\n if (hasOwn(shell, key)) tab[key] = shell[key]\n }\n for (const key of [\"activeParentSessionId\", \"activeSessionId\", \"expandedSessionIds\"] as const) {\n if (hasOwn(workspace, key)) tab[key] = workspace[key]\n }\n const entries: Array<{ sessionId: string; documentKey: string; partitionKeys: string[] }> = []\n for (const [sessionId, rawEntry] of Object.entries(workspace.sessions)) {\n if (workspace.format === 1) {\n if (typeof rawEntry !== \"string\" || !PARTITION_KEY.test(rawEntry)) return\n entries.push({ sessionId, documentKey: rawEntry, partitionKeys: [rawEntry] })\n declaredGraph.add(rawEntry)\n continue\n }\n if (!isRecord(rawEntry) || !hasExactKeys(rawEntry, [\"documentPartition\", \"partitionKeys\"])\n || typeof rawEntry.documentPartition !== \"string\" || !PARTITION_KEY.test(rawEntry.documentPartition)\n || !isPartitionKeyArray(rawEntry.partitionKeys)\n || !rawEntry.partitionKeys.includes(rawEntry.documentPartition)) return\n entries.push({ sessionId, documentKey: rawEntry.documentPartition, partitionKeys: rawEntry.partitionKeys })\n rawEntry.partitionKeys.forEach((key) => declaredGraph.add(key))\n }\n const activeId = typeof workspace.activeSessionId === \"string\" ? workspace.activeSessionId : undefined\n entries.sort((left, right) => left.sessionId === activeId ? -1 : right.sessionId === activeId ? 1\n : left.sessionId.localeCompare(right.sessionId))\n const dropped = new Set<string>()\n for (const { sessionId, documentKey, partitionKeys } of entries) {\n const document = await loadCanonical(documentKey)\n const allowed = new Set(partitionKeys)\n const referenced = new Set([documentKey])\n const validDocument = document && (document.format === 1 || document.format === 2)\n && hasExactKeys(document, [\"format\"],\n [\"draft\", \"attachments\", \"scrollSnapshot\", \"unseenIdleSince\", \"generationRecovery\"])\n && Object.keys(document).length > 1\n if (!validDocument) {\n degraded = true\n dropped.add(sessionId)\n continue\n }\n const decodedAttachments = !hasOwn(document, \"attachments\") ? undefined : document.format === 1\n ? document.attachments\n : await decodeAttachments(document.attachments, allowed, referenced)\n if ((hasOwn(document, \"attachments\") && decodedAttachments === null)\n || !sameKeys(referenced, partitionKeys)) {\n degraded = true\n dropped.add(sessionId)\n continue\n }\n const leaf: RestorableWorkspaceTabState = {\n kind: \"workspace\", folder: \"/\",\n drafts: Object.create(null), attachments: Object.create(null), scrollSnapshots: Object.create(null),\n unseenIdleSince: Object.create(null), generationRecovery: Object.create(null),\n }\n const fields = [\n [\"draft\", \"drafts\"],\n [\"scrollSnapshot\", \"scrollSnapshots\"],\n [\"unseenIdleSince\", \"unseenIdleSince\"],\n [\"generationRecovery\", \"generationRecovery\"],\n ] as const\n for (const [documentField, stateField] of fields) {\n if (hasOwn(document, documentField)) (leaf[stateField] as Record<string, unknown>)[sessionId] = document[documentField]\n }\n if (decodedAttachments !== undefined) leaf.attachments[sessionId] = decodedAttachments as RestorableAttachment[]\n const normalizedLeaf = normalizeRestorableSession({ tabs: [leaf], activeTabIndex: 0 })?.tabs[0]\n if (!normalizedLeaf || !canonicalEquals(leaf, normalizedLeaf)) {\n degraded = true\n dropped.add(sessionId)\n continue\n }\n for (const [, stateField] of fields) {\n if (hasOwn(leaf[stateField], sessionId)) {\n (tab[stateField] as Record<string, unknown>)[sessionId] = leaf[stateField][sessionId]\n }\n }\n if (hasOwn(leaf.attachments, sessionId)) {\n (tab.attachments as Record<string, unknown>)[sessionId] = leaf.attachments[sessionId]\n }\n }\n if (dropped.has(String(tab.activeSessionId))) delete tab.activeSessionId\n if (dropped.has(String(tab.activeParentSessionId))) delete tab.activeParentSessionId\n if (Array.isArray(tab.expandedSessionIds)) {\n tab.expandedSessionIds = tab.expandedSessionIds.filter((sessionId) => !dropped.has(String(sessionId)))\n }\n tabs.push(tab)\n }\n\n if (!sameKeys(declaredGraph, persistedKeys)) return\n\n const reconstructed: unknown = {\n tabs,\n activeTabIndex: manifest.session.activeTabIndex,\n ...(hasOwn(manifest.session, \"homeActive\") ? { homeActive: manifest.session.homeActive } : {}),\n }\n const normalized = normalizeRestorableSession(reconstructed)\n if (!normalized || !canonicalEquals(reconstructed, normalized)) return\n if (degraded || legacyGraph) return normalized\n const reencoded = await encodeSessionGraph(normalized)\n return graphMatches(reencoded, rootKey, persistedKeys, loaded) ? normalized : undefined\n}\n\nfunction graphMatches(\n reencoded: Awaited<ReturnType<typeof encodeSessionGraph>>,\n rootKey: string,\n persistedKeys: readonly string[],\n loaded: Map<string, string>,\n): boolean {\n if (reencoded.sessionPartition !== rootKey\n || reencoded.partitionKeys.length !== persistedKeys.length\n || !reencoded.partitionKeys.every((key, index) => key === persistedKeys[index])\n || reencoded.partitionKeys.length !== loaded.size) return false\n return reencoded.partitionKeys.every((key) => loaded.get(key) === reencoded.partitions[key])\n}\n\nexport async function decodeClientSnapshotV2(\n value: unknown,\n partitionProtocolVersion: 1 | undefined,\n loadPartition: (key: string) => Promise<string | null>,\n): Promise<ClientSnapshotV1 | null> {\n const decoded = decodeRoot(value)\n if (!decoded || partitionProtocolVersion !== 1) return null\n try {\n const partition = await loadPartition(decoded.partitionKey)\n if (partition === null || encoder.encode(partition).byteLength > MAX_PARTITION_BYTES\n || await sha256(partition) !== decoded.partitionKey) return null\n const parsed = parseJson(partition)\n if (!parsed) return null\n if (isRecord(parsed.value) && parsed.value.format === 2) {\n const loaded = new Map([[decoded.partitionKey, partition]])\n const session = await decodeGraph(parsed.value, decoded.partitionKey, decoded.partitionKeys, loaded, loadPartition)\n return session === undefined ? null : { ...decoded.root, session }\n }\n return null\n } catch {\n return null\n }\n}\n\nexport const isClientSnapshotV2 = (value: unknown): boolean => isRecord(value) && value.version === 2\n","import { createSignal } from \"solid-js\"\nimport { clearNativeClientState, commitNativeClientStatePartitions, loadNativeClientState, loadNativeClientStatePartition,\n saveNativeClientState, setNativeRestoreEnabled } from \"../lib/native/client-state\"\nimport { decodeClientSnapshot, normalizeRestorableSession } from \"./client-state-codec\"\nimport type { ClientSnapshotV1, RestorableSessionState, RestorableSidecarTabState, RestorableTabState, RestorableWorkspaceTabState } from \"./client-state-codec\"\nimport { canCommitClientSnapshotV2, decodeClientSnapshotV2, encodeClientSnapshotV2, isClientSnapshotV2 } from \"./client-state-partitions\"\nimport type { ClientSnapshotV2 } from \"./client-state-partitions\"\nexport type { ClientSnapshotV1, RestorableSessionState, RestorableSidecarTabState, RestorableTabState, RestorableWorkspaceTabState }\nexport type { ClientSnapshotV2 }\nconst SAVE_DEBOUNCE_MS = 250\nconst FLUSH_MAX_ATTEMPTS = 3\nconst MAX_V1_SNAPSHOT_BYTES = 1024 * 1024\nconst MAX_LAYOUT_ENTRIES = 64\nconst MAX_LAYOUT_KEY_LENGTH = 256\nconst MAX_LAYOUT_VALUE_LENGTH = 4096\nconst LEGACY_LAYOUT_KEY_PREFIX = \"opencode-session-\"\nconst UNSAFE_LAYOUT_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"])\nconst [clientStateIsPrimary, setClientStateIsPrimary] = createSignal(true)\nconst [restorePreviousStateEnabled, setRestorePreviousStateEnabledSignal] = createSignal(false)\nconst [loadedClientSnapshotExists, setLoadedClientSnapshotExists] = createSignal(false)\nconst [loadedRestorableSession, setLoadedRestorableSession] = createSignal<RestorableSessionState | null>(null)\nlet initialized = false\nlet initialization: Promise<void> | null = null\nlet layout: Record<string, string> = Object.create(null)\nlet revision = 0\nlet dirty = false\nlet writeBlock: false | \"snapshot\" | \"transaction\" = false\nlet saveTimer: ReturnType<typeof setTimeout> | null = null\nlet writeQueue: Promise<void> = Promise.resolve()\nlet destructiveQueue: Promise<void> = Promise.resolve()\nlet lastSaveError: unknown\nlet partitionProtocolVersion: 1 | undefined\nconst transactionLayoutWrites = new Set<string>()\nfunction useLocalStorage<T>(fallback: T, operation: (storage: Storage) => T): T {\n try {\n return operation(window.localStorage)\n } catch {\n return fallback\n }\n}\n\nfunction isValidLayoutKey(key: string): boolean {\n return key.length > 0 && key.length <= MAX_LAYOUT_KEY_LENGTH && !UNSAFE_LAYOUT_KEYS.has(key)\n}\nconst readLegacyLayoutValue = (key: string) =>\n useLocalStorage<string | null>(null, (storage) => {\n const value = storage.getItem(key)\n return value !== null && value.length <= MAX_LAYOUT_VALUE_LENGTH ? value : null\n })\nconst writeLegacyLayoutValue = (key: string, value: string) =>\n useLocalStorage(undefined, (storage) => storage.setItem(key, value))\nfunction legacyLayoutKeys(storage: Storage): string[] {\n const keys = new Set(Object.keys(layout))\n for (let index = 0; index < storage.length; index += 1) {\n const key = storage.key(index)\n if (key?.startsWith(LEGACY_LAYOUT_KEY_PREFIX)) keys.add(key)\n }\n return [...keys]\n}\nconst hasLayoutKey = (key: string) => Object.prototype.hasOwnProperty.call(layout, key)\nconst layoutIsFull = () => Object.keys(layout).length >= MAX_LAYOUT_ENTRIES\n\nfunction migrateLegacyLayoutValues(): boolean {\n return useLocalStorage(false, (storage) => {\n const previousSize = Object.keys(layout).length\n for (const key of legacyLayoutKeys(storage)) {\n if (hasLayoutKey(key)) continue\n if (layoutIsFull()) break\n const value = storage.getItem(key)\n if (value === null || value.length > MAX_LAYOUT_VALUE_LENGTH) continue\n layout[key] = value\n }\n return Object.keys(layout).length !== previousSize\n })\n}\n\nfunction canWriteSnapshot(): boolean {\n return initialized && clientStateIsPrimary() && restorePreviousStateEnabled() && !writeBlock\n}\nconst cancelSaveTimer = () => {\n if (saveTimer !== null) clearTimeout(saveTimer)\n saveTimer = null\n}\n\nfunction enqueuePendingSave(): Promise<void> {\n cancelSaveTimer()\n if (!dirty || !canWriteSnapshot()) return writeQueue\n const snapshot: ClientSnapshotV1 = {\n version: 1,\n revision: ++revision,\n savedAt: Date.now(),\n layout: { ...layout },\n session: loadedRestorableSession(),\n }\n const normalizedSnapshot = decodeClientSnapshot(snapshot)\n if (!normalizedSnapshot) return Promise.reject(new Error(\"Client snapshot normalization failed\"))\n layout = { ...normalizedSnapshot.layout }\n dirty = false\n const saveAttempt = writeQueue.then(async () => {\n try {\n const partitioned = partitionProtocolVersion === 1 ? await encodeClientSnapshotV2(normalizedSnapshot) : null\n if (partitioned && !canCommitClientSnapshotV2(partitioned)) {\n throw new Error(\"Client snapshot exceeds the native partition count or size limits\")\n }\n if (!partitioned && new TextEncoder().encode(JSON.stringify(normalizedSnapshot)).byteLength > MAX_V1_SNAPSHOT_BYTES) {\n throw new Error(\"Client snapshot exceeds the V1 1 MiB limit and partition persistence is unavailable\")\n }\n const accepted = partitioned\n ? await commitNativeClientStatePartitions({\n protocolVersion: 1,\n snapshot: partitioned.root,\n partitions: partitioned.partitions,\n partitionKeys: partitioned.partitionKeys,\n })\n : await saveNativeClientState(normalizedSnapshot)\n if (!accepted) {\n setClientStateIsPrimary(false)\n throw new Error(\"Native client state save was rejected\")\n }\n lastSaveError = undefined\n } catch (error) {\n dirty = true\n lastSaveError = error\n throw error\n }\n })\n writeQueue = saveAttempt.catch(() => undefined)\n return saveAttempt\n}\n\nfunction scheduleSave() {\n dirty = true\n if (!canWriteSnapshot()) return\n cancelSaveTimer()\n saveTimer = setTimeout(() => void enqueuePendingSave()\n .catch((error) => console.warn(\"[client-state] failed to save client snapshot\", error)), SAVE_DEBOUNCE_MS)\n}\nfunction resetLoadedState(snapshot: ClientSnapshotV1 | null = null, resetRevision = false) {\n layout = snapshot ? { ...snapshot.layout } : Object.create(null)\n if (resetRevision) revision = snapshot?.revision ?? 0\n setLoadedClientSnapshotExists(snapshot !== null)\n setLoadedRestorableSession(snapshot?.session ?? null)\n}\nasync function executeDestructiveTransaction(operation: () => Promise<boolean>, rejectedMessage: string, loseOwnershipOnRejection = false): Promise<void> {\n const previousWriteBlock = writeBlock\n let retryDirty = dirty\n writeBlock = \"transaction\"\n transactionLayoutWrites.clear()\n cancelSaveTimer()\n dirty = false\n try {\n await writeQueue\n retryDirty ||= dirty\n dirty = false\n if (!await operation()) {\n if (loseOwnershipOnRejection) setClientStateIsPrimary(false)\n throw new Error(rejectedMessage)\n }\n useLocalStorage(undefined, (storage) => {\n for (const key of legacyLayoutKeys(storage)) storage.removeItem(key)\n })\n resetLoadedState()\n transactionLayoutWrites.clear()\n writeBlock = \"snapshot\"\n } catch (error) {\n retryDirty ||= dirty\n for (const key of transactionLayoutWrites) writeLegacyLayoutValue(key, layout[key]!)\n transactionLayoutWrites.clear()\n writeBlock = previousWriteBlock\n dirty = retryDirty\n if (dirty) scheduleSave()\n throw error\n }\n}\nfunction runDestructiveTransition(operation: () => Promise<void>): Promise<void> {\n const transition = destructiveQueue.then(operation)\n destructiveQueue = transition.catch(() => undefined)\n return transition\n}\nexport function updateRestorableSession(state: RestorableSessionState | null): void {\n const normalized = state === null ? null : normalizeRestorableSession(state)\n if (state !== null && normalized === null) return\n if (writeBlock === \"transaction\") {\n setLoadedRestorableSession(normalized)\n dirty = true\n return\n }\n if (writeBlock || !clientStateIsPrimary() || !restorePreviousStateEnabled()) return\n setLoadedRestorableSession(normalized)\n scheduleSave()\n}\n\nexport function readClientLayoutValue(key: string): string | null {\n if (!isValidLayoutKey(key)) return null\n if (!clientStateIsPrimary()) return readLegacyLayoutValue(key)\n if (!restorePreviousStateEnabled() || writeBlock) return null\n if (hasLayoutKey(key)) return layout[key] ?? null\n const legacyValue = readLegacyLayoutValue(key)\n if (legacyValue === null || layoutIsFull()) return legacyValue\n layout[key] = legacyValue\n scheduleSave()\n return legacyValue\n}\n\nexport function writeClientLayoutValue(key: string, value: string): void {\n if (!isValidLayoutKey(key) || value.length > MAX_LAYOUT_VALUE_LENGTH) return\n if (!clientStateIsPrimary()) return writeLegacyLayoutValue(key, value)\n if (writeBlock === \"transaction\") {\n if (!hasLayoutKey(key) && layoutIsFull()) return\n dirty ||= layout[key] !== value\n layout[key] = value\n transactionLayoutWrites.add(key)\n return\n }\n if (!restorePreviousStateEnabled() || writeBlock) return\n if (!hasLayoutKey(key) && layoutIsFull()) return\n writeLegacyLayoutValue(key, value)\n if (layout[key] === value) return\n layout[key] = value\n scheduleSave()\n}\n\nexport async function flushClientState(): Promise<void> {\n cancelSaveTimer()\n let lastError = lastSaveError\n for (let attempts = 0; attempts < FLUSH_MAX_ATTEMPTS; attempts += 1) {\n while (true) {\n const pending = writeQueue\n await pending\n if (pending === writeQueue) break\n }\n if (!dirty) {\n if (lastError !== undefined) throw lastError\n return\n }\n if (!canWriteSnapshot()) {\n const writeError = lastSaveError ?? lastError\n if (writeError !== undefined) throw writeError\n return\n }\n try {\n await enqueuePendingSave()\n lastError = undefined\n } catch (error) {\n lastError = error\n }\n }\n await writeQueue\n if (!dirty) return\n throw lastError ?? new Error(\"Client state remained dirty after the final flush attempt\")\n}\n\nexport async function clearRestoredClientState(): Promise<void> {\n await runDestructiveTransition(async () => {\n if (!clientStateIsPrimary()) throw new Error(\"Client state is not owned by this window\")\n await executeDestructiveTransaction(clearNativeClientState, \"Native client state clear was rejected\", true)\n })\n}\n\nexport async function setRestorePreviousStateEnabled(enabled: boolean): Promise<void> {\n await runDestructiveTransition(async () => {\n if (enabled === restorePreviousStateEnabled() && (!enabled || writeBlock === false)) return\n if (!clientStateIsPrimary()) throw new Error(\"Client state is not owned by this window\")\n if (enabled) {\n if (!await setNativeRestoreEnabled(true)) throw new Error(\"Native restore preference update was rejected\")\n writeBlock = false\n setRestorePreviousStateEnabledSignal(true)\n return\n }\n setRestorePreviousStateEnabledSignal(false)\n try {\n await executeDestructiveTransaction(() => setNativeRestoreEnabled(false), \"Native restore preference update was rejected\")\n } catch (error) {\n setRestorePreviousStateEnabledSignal(true)\n throw error\n }\n })\n}\n\nexport function initializeClientState(): Promise<void> {\n if (initialization) return initialization\n initialization = (async () => {\n try {\n const loaded = await loadNativeClientState()\n partitionProtocolVersion = loaded.partitionProtocolVersion\n setClientStateIsPrimary(loaded.isPrimary)\n setRestorePreviousStateEnabledSignal(loaded.restoreEnabled)\n resetLoadedState(null, true)\n dirty = false\n lastSaveError = undefined\n writeBlock = false\n transactionLayoutWrites.clear()\n initialized = true\n if (!loaded.isPrimary || !loaded.restoreEnabled) return\n let snapshot: ClientSnapshotV1 | null\n if (isClientSnapshotV2(loaded.snapshot)) {\n writeBlock = \"snapshot\"\n try {\n snapshot = await decodeClientSnapshotV2(\n loaded.snapshot,\n loaded.partitionProtocolVersion,\n loadNativeClientStatePartition,\n )\n } catch (error) {\n snapshot = null\n console.warn(\"[client-state] failed to load client snapshot partition\", error)\n }\n if (snapshot) writeBlock = false\n } else {\n snapshot = decodeClientSnapshot(loaded.snapshot)\n writeBlock = loaded.snapshot !== null && snapshot === null ? \"snapshot\" : false\n }\n resetLoadedState(snapshot, true)\n if (!writeBlock && migrateLegacyLayoutValues()) scheduleSave()\n } catch (error) {\n initialized = true\n setClientStateIsPrimary(false)\n resetLoadedState()\n console.warn(\"[client-state] failed to initialize client state\", error)\n }\n })()\n return initialization\n}\n\nexport { clientStateIsPrimary, loadedClientSnapshotExists, loadedRestorableSession, restorePreviousStateEnabled }\n"],"names":["LEGACY_WEB_KEYS","SECONDARY_CLIENT_STATE","log","getLogger","accessToken","bytes","byte","nativeAccessClaimed","electronApi","dispatchNative","electronOperation","command","args","isElectronHost","isTauriHost","invoke","claimNativeClientStateAccess","isLocalWindow","result","api","_a","error","loadNativeClientState","loaded","key","mutateNativeClientState","saveNativeClientState","snapshot","commitNativeClientStatePartitions","payload","loadNativeClientStatePartition","setNativeRestoreEnabled","enabled","clearNativeClientState","acknowledge","acknowledgeNativeClientStateNavigationFlush","generation","acknowledgeNativeClientStateRendererFlush","MAX_ID","MAX_DISPLAY","MAX_PATH","MAX_MIME","isRecord","value","isSafeKey","takeString","max","allowEmpty","bytesToBase64","binary","index","base64ToBytes","character","validBase64","dataUrlPayload","takeFileData","url","raw","data","takePosition","normalizeSource","name","path","mime","rawData","start","end","normalizeAttachment","id","display","filename","mediaType","source","rawUrl","normalizeRestorableAttachmentRecord","drafts","prioritySessionIds","attachments","priority","prioritySet","entries","sessionId","rawAttachments","normalized","attachment","serializeDraftAttachments","values","hydrateRestorableAttachment","MAX_TABS","MAX_LAYOUT_ENTRIES","MAX_DRAFTS","MAX_SCROLLS_PER_TAB","MAX_IDLE_MARKERS","MAX_RECOVERY","MAX_EXPANDED","MAX_KEY","MAX_LAYOUT_VALUE","MAX_DRAFT","MAX_ANCHOR_KEY","MAX_STRINGS","MAX_SCROLLS","MAX_WINDOW_CURSOR","NO_SESSION_DRAFT_SESSION_ID","createBudget","safeKey","budget","takeNumber","min","normalizeRecord","normalize","accept","accepted","priorityKeys","count","priorities","rawKey","rawValue","entry","normalizeStringRecord","valueMax","normalizeScrollSnapshot","scrollTop","updatedAt","scrollRatio","maxScrollTop","anchorOffset","anchorKey","windowCursor","newerCursors","cursor","normalizeExpandedSessionIds","seen","normalizeWorkspaceTab","identity","_prioritizeDrafts","reservedDrafts","remainingDrafts","additionalDrafts","scrollLimit","scrollSnapshots","unseenIdleSince","generationRecovery","expandedSessionIds","remainingAttachments","attachmentResult","projectName","binaryPath","normalizeIdentity","kind","sidecarId","folder","activeParentSessionId","activeSessionId","reservePriorityDrafts","remaining","draft","priorityAttachments","normalizeRestorableSession","normalizeSession","requested","rawTabs","identityByIndex","normalizedByIndex","normalizeIdentityAt","originalIndex","normalizeTabAt","prioritizeDrafts","tab","_tab","priorityOrder","tabs","surviving","next","activeTabIndex","decodeClientSnapshot","savedAt","session","layout","MAX_PARTITION_BYTES","MAX_ROOT_BYTES","MAX_NATIVE_PARTITIONS","MAX_NATIVE_COMMIT_BYTES","MAX_SESSION_ID","BLOB_CHUNK_CHARACTERS","MAX_BLOB_CHUNKS","MAX_BLOB_BASE64_CHARACTERS","PARTITION_KEY","ROOT_KEYS","UNSAFE_KEYS","encoder","hasOwn","isSafePersistedSessionId","isPartitionKeyArray","hasExactKeys","required","optional","allowed","sortJson","canonicalJson","serialized","canonicalEquals","left","right","sha256","digest","addBlob","addPartition","keys","offset","encodeAttachments","encodeSessionGraph","generated","partition","encodedSession","sessionIds","sessions","document","documentPartition","attachmentPartitions","workspace","shell","sessionPartition","partitionKeys","encodeClientSnapshotV2","graph","canCommitClientSnapshotV2","encoded","root","commitBytes","partitionBytes","decodeRoot","parseJson","decodeGraph","manifest","rootKey","persistedKeys","loadPartition","reencoded","graphMatches","loadCanonical","parsed","sameKeys","sorted","loadBlob","referenced","chunks","length","chunk","decodeAttachments","declaredGraph","degraded","legacyGraph","rawEntry","activeId","dropped","documentKey","decodedAttachments","leaf","fields","documentField","stateField","normalizedLeaf","reconstructed","decodeClientSnapshotV2","partitionProtocolVersion","decoded","isClientSnapshotV2","SAVE_DEBOUNCE_MS","FLUSH_MAX_ATTEMPTS","MAX_V1_SNAPSHOT_BYTES","MAX_LAYOUT_KEY_LENGTH","MAX_LAYOUT_VALUE_LENGTH","LEGACY_LAYOUT_KEY_PREFIX","UNSAFE_LAYOUT_KEYS","clientStateIsPrimary","setClientStateIsPrimary","createSignal","restorePreviousStateEnabled","setRestorePreviousStateEnabledSignal","loadedClientSnapshotExists","setLoadedClientSnapshotExists","loadedRestorableSession","setLoadedRestorableSession","initialized","initialization","revision","dirty","writeBlock","saveTimer","writeQueue","destructiveQueue","lastSaveError","transactionLayoutWrites","useLocalStorage","fallback","operation","isValidLayoutKey","readLegacyLayoutValue","storage","writeLegacyLayoutValue","legacyLayoutKeys","hasLayoutKey","layoutIsFull","migrateLegacyLayoutValues","previousSize","canWriteSnapshot","cancelSaveTimer","enqueuePendingSave","normalizedSnapshot","saveAttempt","partitioned","scheduleSave","resetLoadedState","resetRevision","executeDestructiveTransaction","rejectedMessage","loseOwnershipOnRejection","previousWriteBlock","retryDirty","runDestructiveTransition","transition","updateRestorableSession","state","readClientLayoutValue","legacyValue","writeClientLayoutValue","flushClientState","lastError","attempts","pending","writeError","clearRestoredClientState","setRestorePreviousStateEnabled","initializeClientState"],"mappings":"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"}
1
+ {"version":3,"file":"client-state-j9Iu7F-E.js","sources":["../../../lib/native/client-state.ts","../../../stores/client-state-attachments-codec.ts","../../../stores/client-state-codec.ts","../../../stores/client-state-partitions.ts","../../../stores/client-state.ts"],"sourcesContent":["import { invoke } from \"@tauri-apps/api/core\"\nimport { isElectronHost, isLocalWindow, isTauriHost } from \"../runtime-env\"\nimport { getLogger } from \"../logger\"\nconst LEGACY_WEB_KEYS = [\"codenomad-client-snapshot-v1\", \"codenomad-client-restore-enabled-v1\"]\nexport type NativeClientStateLoadResult = {\n isPrimary: boolean\n restoreEnabled: boolean\n snapshot: unknown | null\n partitionProtocolVersion?: 1\n}\nexport type NativeClientStatePartitionCommit = {\n protocolVersion: 1\n snapshot: unknown\n partitions: Record<string, string>\n partitionKeys: string[]\n}\nconst SECONDARY_CLIENT_STATE: NativeClientStateLoadResult = { isPrimary: false, restoreEnabled: false, snapshot: null }\nconst log = getLogger(\"actions\")\nconst accessToken = (() => {\n const bytes = new Uint8Array(32)\n globalThis.crypto.getRandomValues(bytes)\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\")\n})()\nlet nativeAccessClaimed = false\nconst electronApi = () => (window as Window & { electronAPI?: ElectronAPI }).electronAPI\nfunction dispatchNative<T>(electronOperation: (api: ElectronAPI | undefined) => Promise<T> | undefined, command: string, args: Record<string, unknown> = {}): Promise<T> | undefined {\n if (isElectronHost()) return electronOperation(electronApi())\n if (isTauriHost()) return invoke<T>(command, { accessToken, ...args })\n}\nasync function claimNativeClientStateAccess(): Promise<boolean> {\n if (!isLocalWindow()) return false\n try {\n const result = await dispatchNative<boolean | void>((api) => api?.claimClientStateAccess?.(accessToken), \"client_state_claim_access\")\n nativeAccessClaimed = isTauriHost() || result === true\n } catch (error) {\n nativeAccessClaimed = false\n log.warn(\"Client state native access claim failed\", error)\n }\n return nativeAccessClaimed\n}\nexport async function loadNativeClientState(): Promise<NativeClientStateLoadResult> {\n if (isElectronHost() || isTauriHost()) {\n if (!await claimNativeClientStateAccess()) return SECONDARY_CLIENT_STATE\n const loaded = await dispatchNative((api) => api?.loadClientState?.(accessToken), \"client_state_load\") ?? SECONDARY_CLIENT_STATE\n if (!isElectronHost()) return loaded\n const api = electronApi()\n return {\n ...loaded,\n partitionProtocolVersion: loaded.partitionProtocolVersion === 1\n && typeof api?.commitClientStatePartitions === \"function\"\n && typeof api.loadClientStatePartition === \"function\" ? 1 : undefined,\n }\n }\n try {\n for (const key of LEGACY_WEB_KEYS) window.localStorage.removeItem(key)\n } catch {}\n return SECONDARY_CLIENT_STATE\n}\nasync function mutateNativeClientState(electronOperation: (api: ElectronAPI) => Promise<boolean> | undefined, command: string, args: Record<string, unknown> = {}): Promise<boolean> {\n if (!nativeAccessClaimed) return false\n return await dispatchNative((api) => api && electronOperation(api), command, args) ?? false\n}\nexport const saveNativeClientState = (snapshot: unknown): Promise<boolean> =>\n mutateNativeClientState((api) => api.saveClientState?.(accessToken, snapshot), \"client_state_save\", { snapshot })\nexport const commitNativeClientStatePartitions = (payload: NativeClientStatePartitionCommit): Promise<boolean> =>\n mutateNativeClientState((api) => api.commitClientStatePartitions?.(accessToken, payload), \"client_state_commit_partitions\", { payload })\nexport const loadNativeClientStatePartition = async (key: string): Promise<string | null> => {\n if (!nativeAccessClaimed) return null\n return await dispatchNative((api) => api?.loadClientStatePartition?.(accessToken, key), \"client_state_load_partition\", { key }) ?? null\n}\nexport const setNativeRestoreEnabled = (enabled: boolean): Promise<boolean> =>\n mutateNativeClientState((api) => api.setClientStateRestoreEnabled?.(accessToken, enabled), \"client_state_set_restore_enabled\", { enabled })\nexport const clearNativeClientState = (): Promise<boolean> =>\n mutateNativeClientState((api) => api.clearClientState?.(accessToken), \"client_state_clear\")\nfunction acknowledge(command: string, args: Record<string, unknown> = {}): Promise<void> {\n if (!isTauriHost() || !nativeAccessClaimed) return Promise.resolve()\n return invoke(command, { accessToken, ...args })\n}\nexport const acknowledgeNativeClientStateNavigationFlush = (generation: number) =>\n acknowledge(\"client_state_navigation_flushed\", { generation })\nexport const acknowledgeNativeClientStateRendererFlush = (generation: number) =>\n acknowledge(\"client_state_renderer_flushed\", { generation })\n","import type { Attachment, AttachmentSource } from \"../types/attachment\"\n\nexport type RestorableAttachmentSource =\n | { type: \"file\"; path: string; mime: string; data?: string }\n | { type: \"text\"; value: string }\n | { type: \"agent\"; name: string }\n | { type: \"symbol\"; path: string; name: string; kind: number; range: { start: Position; end: Position } }\n\ninterface Position {\n line: number\n char: number\n}\n\nexport interface RestorableAttachment {\n id: string\n type: Attachment[\"type\"]\n display: string\n url: string\n filename: string\n mediaType: string\n source: RestorableAttachmentSource\n}\nconst MAX_ID = 512\nconst MAX_DISPLAY = 1024\nconst MAX_PATH = 4096\nconst MAX_MIME = 256\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\nconst isSafeKey = (value: string) =>\n value !== \"__proto__\" && value !== \"constructor\" && value !== \"prototype\"\n\nfunction takeString(value: unknown, max: number, allowEmpty = false) {\n if (typeof value !== \"string\" || value.length > max) return\n if (!allowEmpty && value.trim().length === 0) return\n return value\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\"\n for (let index = 0; index < bytes.length; index += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(index, index + 0x8000))\n }\n return btoa(binary)\n}\n\nconst base64ToBytes = (value: string) => Uint8Array.from(atob(value), (character) => character.charCodeAt(0))\n\nfunction validBase64(value: unknown): value is string {\n if (typeof value !== \"string\" || value.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(value)) return false\n try {\n base64ToBytes(value)\n return true\n } catch {\n return false\n }\n}\n\nconst dataUrlPayload = (value: unknown): string | undefined => typeof value === \"string\"\n ? value.match(/^data:[^;,]+;base64,([A-Za-z0-9+/]*={0,2})$/)?.[1]\n : undefined\n\nfunction takeFileData(value: unknown, url: unknown): string | undefined {\n const raw = dataUrlPayload(url) ?? value\n const data = raw instanceof Uint8Array ? bytesToBase64(raw) : raw\n return validBase64(data) ? data : undefined\n}\n\nfunction takePosition(value: unknown): Position | undefined {\n if (!isRecord(value) || !Number.isSafeInteger(value.line) || Number(value.line) < 0) return\n if (!Number.isSafeInteger(value.char) || Number(value.char) < 0) return\n return { line: Number(value.line), char: Number(value.char) }\n}\n\nfunction normalizeSource(\n value: unknown,\n url: unknown,\n): RestorableAttachmentSource | undefined {\n if (!isRecord(value)) return\n if (value.type === \"text\") {\n return typeof value.value === \"string\" ? { type: \"text\", value: value.value } : undefined\n }\n if (value.type === \"agent\") {\n const name = takeString(value.name, MAX_DISPLAY)\n return name === undefined ? undefined : { type: \"agent\", name }\n }\n\n const path = takeString(value.path, MAX_PATH)\n if (value.type === \"file\") {\n const mime = takeString(value.mime, MAX_MIME)\n if (path === undefined || mime === undefined) return\n const rawData = dataUrlPayload(url) ?? value.data\n const data = takeFileData(value.data, url)\n if (rawData !== undefined && data === undefined) return\n return data === undefined ? { type: \"file\", path, mime } : { type: \"file\", path, mime, data }\n }\n if (value.type !== \"symbol\" || !isRecord(value.range)) return\n const name = takeString(value.name, MAX_DISPLAY)\n const start = takePosition(value.range.start)\n const end = takePosition(value.range.end)\n if (path === undefined || name === undefined || !Number.isSafeInteger(value.kind) || !start || !end) return\n return { type: \"symbol\", path, name, kind: Number(value.kind), range: { start, end } }\n}\n\nfunction normalizeAttachment(value: unknown): RestorableAttachment | undefined {\n if (!isRecord(value)) return\n if (![\"file\", \"text\", \"symbol\", \"agent\"].includes(String(value.type))) return\n\n const id = takeString(value.id, MAX_ID)\n const display = takeString(value.display, MAX_DISPLAY)\n const filename = takeString(value.filename, MAX_PATH)\n const mediaType = takeString(value.mediaType, MAX_MIME)\n const source = normalizeSource(value.source, value.url)\n const rawUrl = typeof value.url === \"string\" && !value.url.startsWith(\"data:\") ? value.url : \"\"\n const url = takeString(rawUrl, MAX_PATH, true)\n if (\n !id || !display || !filename || !mediaType || !source ||\n source.type !== value.type || url === undefined\n ) return\n\n return { id, type: value.type as Attachment[\"type\"], display, url, filename, mediaType, source }\n}\n\nexport function normalizeRestorableAttachmentRecord(\n value: unknown,\n drafts: Record<string, string>,\n prioritySessionIds: readonly string[] = [],\n): { attachments: Record<string, RestorableAttachment[]>; drafts: Record<string, string> } | null {\n if (!isRecord(value)) return null\n const attachments: Record<string, RestorableAttachment[]> = Object.create(null)\n const priority = [...new Set(prioritySessionIds)]\n const prioritySet = new Set(priority)\n const entries = [\n ...priority.flatMap((sessionId) => Object.prototype.hasOwnProperty.call(value, sessionId)\n ? [[sessionId, value[sessionId]] as const]\n : []),\n ...Object.entries(value).filter(([sessionId]) => !prioritySet.has(sessionId)),\n ]\n for (const [sessionId, rawAttachments] of entries) {\n if (\n !isSafeKey(sessionId) || !sessionId ||\n sessionId.length > MAX_ID || !Array.isArray(rawAttachments)\n ) continue\n const normalized: RestorableAttachment[] = []\n for (const raw of rawAttachments) {\n const attachment = normalizeAttachment(raw)\n if (attachment) normalized.push(attachment)\n }\n if (normalized.length) attachments[sessionId] = normalized\n }\n return { attachments, drafts: { ...drafts } }\n}\n\nexport function serializeDraftAttachments(\n drafts: Record<string, string>,\n attachments: Record<string, Attachment[]>,\n prioritySessionIds: readonly string[] = [],\n) {\n const normalized = normalizeRestorableAttachmentRecord(attachments, drafts, prioritySessionIds)\n if (!normalized || Object.entries(attachments).some(([sessionId, values]) =>\n values.length !== (normalized.attachments[sessionId]?.length ?? 0))) {\n throw new Error(\"Draft attachments could not be persisted safely\")\n }\n return normalized\n}\n\nexport function hydrateRestorableAttachment(value: RestorableAttachment): Attachment | null {\n let source: AttachmentSource\n let url = value.url\n if (value.source.type === \"file\") {\n try {\n const data = value.source.data === undefined ? undefined : base64ToBytes(value.source.data)\n source = { type: \"file\", path: value.source.path, mime: value.source.mime, data }\n if (!url && value.source.data) url = `data:${value.source.mime};base64,${value.source.data}`\n } catch {\n return null\n }\n } else {\n source = value.source\n if (value.source.type === \"text\" && !url) {\n url = `data:text/plain;base64,${bytesToBase64(new TextEncoder().encode(value.source.value))}`\n }\n }\n return { ...value, url, source }\n}\n","import type { ScrollSnapshot } from \"./message-v2/types\"\nimport { normalizeRestorableAttachmentRecord, type RestorableAttachment } from \"./client-state-attachments-codec\"\nimport type { PersistedGenerationRecovery } from \"./session-generation-recovery\"\n\nexport interface RestorableWorkspaceTabState {\n kind: \"workspace\"; folder: string; occurrence?: number; projectName?: string; binaryPath?: string\n activeParentSessionId?: string; activeSessionId?: string\n drafts: Record<string, string>; attachments: Record<string, RestorableAttachment[]>\n scrollSnapshots: Record<string, ScrollSnapshot>; unseenIdleSince: Record<string, number>\n generationRecovery: Record<string, PersistedGenerationRecovery>\n expandedSessionIds?: string[]\n}\n\nexport interface RestorableSidecarTabState { kind: \"sidecar\"; sidecarId: string }\nexport type RestorableTabState = RestorableWorkspaceTabState | RestorableSidecarTabState\nexport interface RestorableSessionState { tabs: RestorableTabState[]; activeTabIndex: number; homeActive?: boolean }\nexport interface ClientSnapshotV1 {\n version: 1; revision: number; savedAt: number\n layout: Record<string, string>; session: RestorableSessionState | null\n}\n\nconst MAX_TABS = 32, MAX_LAYOUT_ENTRIES = 64, MAX_DRAFTS = 24, MAX_SCROLLS_PER_TAB = 96\nconst MAX_IDLE_MARKERS = 256, MAX_RECOVERY = 256, MAX_EXPANDED = 256, MAX_KEY = 256, MAX_PATH = 4096, MAX_ID = 512\nconst MAX_LAYOUT_VALUE = 4096, MAX_DRAFT = 32 * 1024, MAX_ANCHOR_KEY = 1024\nconst MAX_STRINGS = 96 * 1024, MAX_SCROLLS = 256, MAX_NEWER_CURSORS = 32, MAX_WINDOW_CURSOR = 1024\nconst NO_SESSION_DRAFT_SESSION_ID = \"__no_session_draft__\"\n\ninterface StringBudget { remaining: number; scrollSnapshotsRemaining: number }\n\nfunction createBudget(): StringBudget {\n return { remaining: MAX_STRINGS, scrollSnapshotsRemaining: MAX_SCROLLS }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\nconst safeKey = (key: string) => key !== \"__proto__\" && key !== \"constructor\" && key !== \"prototype\"\n\nfunction takeString(value: unknown, max: number, budget: StringBudget, allowEmpty = false): string | undefined {\n if (typeof value !== \"string\" || value.length > max || value.length > budget.remaining) return\n if (!allowEmpty && value.trim().length === 0) return\n budget.remaining -= value.length\n return value\n}\n\nconst takeNumber = (value: unknown, min: number, max: number): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) && value >= min && value <= max ? value : undefined\n\nfunction normalizeRecord<T>(\n value: unknown, max: number, budget: StringBudget,\n normalize: (value: unknown) => T | undefined,\n accept: (value: unknown) => boolean = () => true,\n accepted: () => void = () => {},\n priorityKeys: readonly string[] = [],\n): Record<string, T> | null {\n if (!isRecord(value)) return null\n const result: Record<string, T> = Object.create(null)\n let count = 0\n const priorities = [...new Set(priorityKeys)]\n const prioritySet = new Set(priorities)\n const entries = [\n ...priorities.flatMap((key) => Object.prototype.hasOwnProperty.call(value, key) ? [[key, value[key]] as const] : []),\n ...Object.entries(value).filter(([key]) => !prioritySet.has(key)),\n ]\n for (const [rawKey, rawValue] of entries) {\n if (count >= max) break\n if (!safeKey(rawKey) || !accept(rawValue)) continue\n const key = takeString(rawKey, MAX_KEY, budget)\n const entry = normalize(rawValue)\n if (key === undefined || entry === undefined) continue\n result[key] = entry\n count += 1\n accepted()\n }\n return result\n}\n\nfunction normalizeStringRecord(\n value: unknown,\n max: number,\n valueMax: number,\n budget: StringBudget,\n priorityKeys: readonly string[] = [],\n) {\n return normalizeRecord(value, max, budget, (entry) => takeString(entry, valueMax, budget, true),\n undefined, undefined, priorityKeys)\n}\n\nfunction normalizeScrollSnapshot(value: unknown, budget: StringBudget): ScrollSnapshot | undefined {\n if (!isRecord(value)) return\n const scrollTop = takeNumber(value.scrollTop, 0, 1_000_000_000)\n const updatedAt = takeNumber(value.updatedAt, 0, Number.MAX_SAFE_INTEGER)\n if (scrollTop === undefined || updatedAt === undefined || typeof value.atBottom !== \"boolean\") return\n const result: ScrollSnapshot = { scrollTop, atBottom: value.atBottom, updatedAt }\n const scrollRatio = takeNumber(value.scrollRatio, 0, 1)\n const maxScrollTop = takeNumber(value.maxScrollTop, 0, 1_000_000_000)\n const anchorOffset = takeNumber(value.anchorOffset, -1_000_000, 1_000_000)\n const anchorKey = value.anchorKey === undefined ? undefined : takeString(value.anchorKey, MAX_ANCHOR_KEY, budget)\n if (scrollRatio !== undefined) result.scrollRatio = scrollRatio\n if (maxScrollTop !== undefined) result.maxScrollTop = maxScrollTop\n if (anchorKey !== undefined) result.anchorKey = anchorKey\n if (anchorOffset !== undefined) result.anchorOffset = anchorOffset\n if (value.followModeType === \"following\" || value.followModeType === \"escaped\") result.followModeType = value.followModeType\n if (typeof value.windowIsLatest === \"boolean\") result.windowIsLatest = value.windowIsLatest\n const windowCursor = value.windowCursor === undefined ? undefined : takeString(value.windowCursor, MAX_WINDOW_CURSOR, budget)\n if (windowCursor !== undefined) result.windowCursor = windowCursor\n if (Array.isArray(value.newerCursors)) {\n const newerCursors: Array<string | null> = []\n for (const entry of value.newerCursors.slice(-MAX_NEWER_CURSORS)) {\n if (entry === null || entry === \"\") {\n newerCursors.push(null)\n continue\n }\n const cursor = takeString(entry, MAX_WINDOW_CURSOR, budget)\n if (cursor === undefined) continue\n newerCursors.push(cursor)\n }\n if (newerCursors.length > 0) result.newerCursors = newerCursors\n }\n return result\n}\n\nfunction normalizeExpandedSessionIds(value: unknown, budget: StringBudget): string[] | null {\n if (!Array.isArray(value)) return null\n const result: string[] = []\n const seen = new Set<string>()\n for (const entry of value.slice(0, MAX_EXPANDED)) {\n if (typeof entry !== \"string\" || seen.has(entry)) continue\n const id = takeString(entry, MAX_ID, budget)\n if (id === undefined) continue\n seen.add(id)\n result.push(id)\n }\n return result\n}\n\nfunction normalizeWorkspaceTab(\n value: Record<string, unknown>,\n identity: WorkspaceIdentity,\n budget: StringBudget,\n _prioritizeDrafts: boolean,\n): RestorableWorkspaceTabState | null {\n const reservedDrafts = identity.priorityDrafts\n const remainingDrafts = Object.fromEntries(Object.entries(value.drafts ?? {})\n .filter(([id]) => !Object.prototype.hasOwnProperty.call(reservedDrafts, id)))\n const additionalDrafts = normalizeStringRecord(\n remainingDrafts,\n Math.max(0, MAX_DRAFTS - Object.keys(reservedDrafts).length),\n MAX_DRAFT,\n budget,\n )\n const drafts = additionalDrafts ? { ...reservedDrafts, ...additionalDrafts } : null\n const scrollLimit = Math.min(MAX_SCROLLS_PER_TAB, budget.scrollSnapshotsRemaining)\n const scrollSnapshots = normalizeRecord(value.scrollSnapshots ?? {}, scrollLimit, budget,\n (entry) => normalizeScrollSnapshot(entry, budget), undefined,\n () => { budget.scrollSnapshotsRemaining -= 1 })\n const unseenIdleSince = normalizeRecord(value.unseenIdleSince ?? {}, MAX_IDLE_MARKERS, budget,\n (entry) => takeNumber(entry, 0, Number.MAX_SAFE_INTEGER))\n const generationRecovery = normalizeRecord<PersistedGenerationRecovery>(\n value.generationRecovery ?? {}, MAX_RECOVERY, budget,\n (entry) => entry as PersistedGenerationRecovery,\n (entry) => entry === \"working\" || entry === \"interrupted\")\n const expandedSessionIds = value.expandedSessionIds === undefined\n ? undefined\n : normalizeExpandedSessionIds(value.expandedSessionIds, budget)\n if (!drafts || !scrollSnapshots || !unseenIdleSince || !generationRecovery || expandedSessionIds === null) return null\n const remainingAttachments = Object.fromEntries(Object.entries(value.attachments ?? {})\n .filter(([id]) => !identity.prioritySessionIds.includes(id)))\n const attachmentResult = normalizeRestorableAttachmentRecord(\n remainingAttachments, drafts,\n )\n if (!attachmentResult) return null\n\n const result: RestorableWorkspaceTabState = {\n kind: \"workspace\", folder: identity.folder,\n drafts: attachmentResult.drafts,\n attachments: { ...identity.priorityAttachments, ...attachmentResult.attachments },\n scrollSnapshots, unseenIdleSince, generationRecovery,\n }\n if (expandedSessionIds !== undefined) result.expandedSessionIds = expandedSessionIds\n if (Number.isInteger(value.occurrence) && Number(value.occurrence) >= 0 && Number(value.occurrence) < MAX_TABS) {\n result.occurrence = Number(value.occurrence)\n }\n const projectName = value.projectName === undefined ? undefined : takeString(value.projectName, MAX_PATH, budget)\n const binaryPath = value.binaryPath === undefined ? undefined : takeString(value.binaryPath, MAX_PATH, budget)\n if (projectName !== undefined) result.projectName = projectName\n if (binaryPath !== undefined) result.binaryPath = binaryPath\n if (identity.activeParentSessionId !== undefined) result.activeParentSessionId = identity.activeParentSessionId\n if (identity.activeSessionId !== undefined) result.activeSessionId = identity.activeSessionId\n return result\n}\n\ninterface WorkspaceIdentity {\n kind: \"workspace\"; value: Record<string, unknown>; folder: string\n activeParentSessionId?: string; activeSessionId?: string\n prioritySessionIds: string[]; priorityDrafts: Record<string, string>\n priorityAttachments: Record<string, RestorableAttachment[]>\n}\ntype TabIdentity = WorkspaceIdentity | RestorableSidecarTabState\n\nfunction normalizeIdentity(value: unknown, budget: StringBudget): TabIdentity | null {\n if (!isRecord(value)) return null\n const kind = value.kind ?? value.type\n if (kind === \"sidecar\") {\n const sidecarId = takeString(value.sidecarId, MAX_ID, budget)\n return sidecarId === undefined ? null : { kind, sidecarId }\n }\n if (kind !== \"workspace\" && kind !== \"instance\") return null\n if (![\"drafts\", \"attachments\", \"scrollSnapshots\", \"unseenIdleSince\", \"generationRecovery\"]\n .every((key) => isRecord(value[key] ?? {}))) return null\n const folder = takeString(value.folder, MAX_PATH, budget)\n if (folder === undefined) return null\n const activeParentSessionId = value.activeParentSessionId === undefined ? undefined\n : takeString(value.activeParentSessionId, MAX_ID, budget)\n const activeSessionId = value.activeSessionId === undefined ? undefined : takeString(value.activeSessionId, MAX_ID, budget)\n const prioritySessionIds = [activeSessionId, NO_SESSION_DRAFT_SESSION_ID]\n .filter((id): id is string => Boolean(id))\n return {\n kind: \"workspace\", value, folder, activeParentSessionId, activeSessionId,\n prioritySessionIds, priorityDrafts: Object.create(null), priorityAttachments: Object.create(null),\n }\n}\n\nfunction reservePriorityDrafts(identity: WorkspaceIdentity, budget: StringBudget): void {\n const drafts = identity.value.drafts ?? {}\n if (!isRecord(drafts)) return\n for (const rawKey of identity.prioritySessionIds) {\n if (!safeKey(rawKey) || !Object.prototype.hasOwnProperty.call(drafts, rawKey)) continue\n const remaining = budget.remaining\n const key = takeString(rawKey, MAX_KEY, budget)\n const draft = takeString(drafts[rawKey], MAX_DRAFT, budget, true)\n if (key === undefined || draft === undefined) {\n budget.remaining = remaining\n continue\n }\n identity.priorityDrafts[key] = draft\n }\n const attachments = identity.value.attachments ?? {}\n if (!isRecord(attachments)) return\n const priorityAttachments = Object.fromEntries(identity.prioritySessionIds\n .filter((id) => Object.prototype.hasOwnProperty.call(attachments, id))\n .map((id) => [id, attachments[id]]))\n const result = normalizeRestorableAttachmentRecord(\n priorityAttachments,\n identity.priorityDrafts,\n identity.prioritySessionIds,\n )\n if (!result) return\n identity.priorityDrafts = result.drafts\n identity.priorityAttachments = result.attachments\n}\n\nexport function normalizeRestorableSession(value: unknown): RestorableSessionState | null {\n return normalizeSession(value, createBudget())\n}\n\nfunction normalizeSession(value: unknown, budget: StringBudget): RestorableSessionState | null {\n if (!isRecord(value) || !Array.isArray(value.tabs) || !Number.isInteger(value.activeTabIndex)) return null\n const requested = Number(value.activeTabIndex)\n const rawTabs = value.tabs.slice(0, MAX_TABS)\n const identityByIndex = new Map<number, TabIdentity>()\n const normalizedByIndex = new Map<number, RestorableTabState>()\n const normalizeIdentityAt = (originalIndex: number) => {\n const identity = normalizeIdentity(rawTabs[originalIndex], budget)\n if (!identity) return\n identityByIndex.set(originalIndex, identity)\n }\n const normalizeTabAt = (originalIndex: number, prioritizeDrafts: boolean) => {\n const identity = identityByIndex.get(originalIndex)\n if (!identity) return\n const tab = identity.kind === \"sidecar\"\n ? identity\n : normalizeWorkspaceTab(identity.value, identity, budget, prioritizeDrafts)\n if (tab) normalizedByIndex.set(originalIndex, tab)\n }\n rawTabs.forEach((_tab, index) => normalizeIdentityAt(index))\n const priorityOrder = [requested, ...rawTabs.map((_tab, index) => index).filter((index) => index !== requested)]\n for (const index of priorityOrder) {\n const identity = identityByIndex.get(index)\n if (identity?.kind === \"workspace\") reservePriorityDrafts(identity, budget)\n }\n if (rawTabs[requested] !== undefined) normalizeTabAt(requested, true)\n rawTabs.forEach((_tab, index) => {\n if (index !== requested) normalizeTabAt(index, true)\n })\n const identities = rawTabs.flatMap((_tab, originalIndex) => {\n const identity = identityByIndex.get(originalIndex)\n return identity ? [{ originalIndex, identity }] : []\n })\n const normalized = identities.flatMap(({ originalIndex }) => {\n const tab = normalizedByIndex.get(originalIndex)\n return tab ? [{ originalIndex, tab }] : []\n })\n if (value.tabs.length && !normalized.length) return null\n\n const tabs = normalized.map(({ tab }) => tab)\n const surviving = normalized.findIndex(({ originalIndex }) => originalIndex === requested)\n const next = normalized.findIndex(({ originalIndex }) => originalIndex > requested)\n const activeTabIndex = !tabs.length ? -1 : surviving >= 0 ? surviving : next >= 0 ? next : tabs.length - 1\n return { tabs, activeTabIndex, ...(value.homeActive === true ? { homeActive: true } : {}) }\n}\n\nexport function decodeClientSnapshot(value: unknown): ClientSnapshotV1 | null {\n if (!isRecord(value) || (value.version !== undefined && value.version !== 1)\n || !Number.isSafeInteger(value.revision) || Number(value.revision) < 0) return null\n const savedAt = takeNumber(value.savedAt, 0, Number.MAX_SAFE_INTEGER)\n if (savedAt === undefined) return null\n const budget = createBudget()\n const session = value.session === null ? null : normalizeSession(value.session, budget)\n if (value.session !== null && !session) return null\n const layout = normalizeStringRecord(value.layout, MAX_LAYOUT_ENTRIES, MAX_LAYOUT_VALUE, budget)\n return layout ? { version: 1, revision: Number(value.revision), savedAt, layout, session } : null\n}\n\nexport function isFutureClientSnapshot(value: unknown): boolean {\n return isRecord(value) && typeof value.version === \"number\" && Number.isInteger(value.version) && value.version > 2\n}\n","import { decodeClientSnapshot, normalizeRestorableSession } from \"./client-state-codec\"\nimport type { ClientSnapshotV1, RestorableSessionState, RestorableWorkspaceTabState } from \"./client-state-codec\"\nimport type { RestorableAttachment } from \"./client-state-attachments-codec\"\n\nconst MAX_PARTITION_BYTES = 1024 * 1024\nconst MAX_ROOT_BYTES = 1024 * 1024\nconst MAX_NATIVE_PARTITIONS = 4096\nconst MAX_NATIVE_COMMIT_BYTES = 256 * 1024 * 1024\nconst MAX_SESSION_ID = 512\nconst BLOB_CHUNK_CHARACTERS = 768 * 1024\nconst MAX_BLOB_CHUNKS = 256\nconst MAX_BLOB_BASE64_CHARACTERS = BLOB_CHUNK_CHARACTERS * MAX_BLOB_CHUNKS\nconst PARTITION_KEY = /^[0-9a-f]{64}$/\nconst ROOT_KEYS = [\"layout\", \"partitionKeys\", \"revision\", \"savedAt\", \"sessionPartition\", \"version\"]\nconst UNSAFE_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"])\nconst encoder = new TextEncoder()\n\nexport interface ClientSnapshotV2 {\n version: 2\n revision: number\n savedAt: number\n layout: Record<string, string>\n sessionPartition: string\n partitionKeys: string[]\n}\n\nexport interface EncodedClientSnapshotV2 {\n root: ClientSnapshotV2\n partitions: Record<string, string>\n partitionKeys: string[]\n}\n\ninterface SessionDocument {\n format: 2\n draft?: string\n attachments?: unknown[]\n scrollSnapshot?: RestorableWorkspaceTabState[\"scrollSnapshots\"][string]\n unseenIdleSince?: number\n generationRecovery?: RestorableWorkspaceTabState[\"generationRecovery\"][string]\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\nconst hasOwn = (value: object, key: string) => Object.prototype.hasOwnProperty.call(value, key)\nconst isSafePersistedSessionId = (value: unknown): value is string =>\n typeof value === \"string\" && value.length > 0 && value.length <= MAX_SESSION_ID\n && value.trim().length > 0 && !UNSAFE_KEYS.has(value)\n\ntype AddPartition = (value: unknown) => Promise<string>\n\nfunction isPartitionKeyArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((key, index) =>\n typeof key === \"string\" && PARTITION_KEY.test(key) && (index === 0 || value[index - 1]! < key))\n}\n\nfunction hasExactKeys(value: Record<string, unknown>, required: readonly string[], optional: readonly string[] = []): boolean {\n const allowed = new Set([...required, ...optional])\n return required.every((key) => hasOwn(value, key)) && Object.keys(value).every((key) => allowed.has(key))\n}\n\nfunction sortJson(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortJson)\n if (!isRecord(value)) return value\n return Object.fromEntries(Object.keys(value).sort().map((key) => [key, sortJson(value[key])]))\n}\n\nexport function canonicalJson(value: unknown): string {\n const serialized = JSON.stringify(sortJson(value))\n if (serialized === undefined) throw new TypeError(\"Client state partition must be JSON-serializable\")\n return serialized\n}\n\nfunction canonicalEquals(left: unknown, right: unknown): boolean {\n try {\n return canonicalJson(left) === canonicalJson(right)\n } catch {\n return false\n }\n}\n\nexport async function sha256(value: string): Promise<string> {\n const digest = await crypto.subtle.digest(\"SHA-256\", encoder.encode(value))\n return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\")\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\"\n for (let index = 0; index < bytes.length; index += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(index, index + 0x8000))\n }\n return btoa(binary)\n}\n\nconst base64ToBytes = (value: string) => Uint8Array.from(atob(value), (character) => character.charCodeAt(0))\nconst validBase64 = (value: unknown): value is string => typeof value === \"string\"\n && value.length % 4 === 0 && /^[A-Za-z0-9+/]*={0,2}$/.test(value)\n\nasync function addBlob(data: string, addPartition: AddPartition): Promise<string[]> {\n if (!validBase64(data) || data.length > MAX_BLOB_BASE64_CHARACTERS) {\n throw new Error(\"Client state attachment exceeds the 192 MiB encoded blob limit\")\n }\n const keys: string[] = []\n for (let offset = 0, index = 0; offset < data.length || offset === 0; offset += BLOB_CHUNK_CHARACTERS, index += 1) {\n keys.push(await addPartition({ format: 2, index, data: data.slice(offset, offset + BLOB_CHUNK_CHARACTERS) }))\n }\n return keys\n}\n\nasync function encodeAttachments(attachments: RestorableAttachment[], addPartition: AddPartition): Promise<unknown[]> {\n return Promise.all(attachments.map(async (attachment) => {\n let source: Record<string, unknown>\n if (attachment.source.type === \"file\") {\n source = { type: \"file\", path: attachment.source.path, mime: attachment.source.mime }\n if (attachment.source.data !== undefined) source.dataPartitions = await addBlob(attachment.source.data, addPartition)\n } else if (attachment.source.type === \"text\") {\n source = {\n type: \"text\",\n valuePartitions: await addBlob(bytesToBase64(encoder.encode(attachment.source.value)), addPartition),\n }\n } else source = attachment.source\n return { ...attachment, source }\n }))\n}\n\nasync function encodeSessionGraph(session: RestorableSessionState | null) {\n const generated: Record<string, string> = Object.create(null)\n const addPartition = async (value: unknown) => {\n const partition = canonicalJson(value)\n if (encoder.encode(partition).byteLength > MAX_PARTITION_BYTES) {\n throw new Error(\"Client state partition exceeds the native size limit\")\n }\n const key = await sha256(partition)\n generated[key] = partition\n return key\n }\n\n const encodedSession = session === null ? null : {\n tabs: await Promise.all(session.tabs.map(async (tab) => {\n if (tab.kind === \"sidecar\") return { kind: tab.kind, sidecarId: tab.sidecarId }\n\n const sessionIds = new Set([\n ...Object.keys(tab.drafts),\n ...Object.keys(tab.attachments),\n ...Object.keys(tab.scrollSnapshots),\n ...Object.keys(tab.unseenIdleSince),\n ...Object.keys(tab.generationRecovery),\n ])\n const sessions: Record<string, { documentPartition: string; partitionKeys: string[] }> = Object.create(null)\n for (const sessionId of [...sessionIds].sort()) {\n const document: SessionDocument = { format: 2 }\n if (hasOwn(tab.drafts, sessionId)) document.draft = tab.drafts[sessionId]\n if (hasOwn(tab.attachments, sessionId)) {\n document.attachments = await encodeAttachments(tab.attachments[sessionId]!, addPartition)\n }\n if (hasOwn(tab.scrollSnapshots, sessionId)) document.scrollSnapshot = tab.scrollSnapshots[sessionId]\n if (hasOwn(tab.unseenIdleSince, sessionId)) document.unseenIdleSince = tab.unseenIdleSince[sessionId]\n if (hasOwn(tab.generationRecovery, sessionId)) document.generationRecovery = tab.generationRecovery[sessionId]\n const documentPartition = await addPartition(document)\n const attachmentPartitions = (document.attachments ?? []).flatMap((attachment) => {\n if (!isRecord(attachment) || !isRecord(attachment.source)) return []\n const keys = attachment.source.dataPartitions ?? attachment.source.valuePartitions\n return Array.isArray(keys) ? keys.filter((key): key is string => typeof key === \"string\") : []\n })\n sessions[sessionId] = {\n documentPartition,\n partitionKeys: [...new Set([documentPartition, ...attachmentPartitions])].sort(),\n }\n }\n\n const workspace: Record<string, unknown> = { format: 2, sessions }\n if (tab.activeParentSessionId !== undefined) workspace.activeParentSessionId = tab.activeParentSessionId\n if (tab.activeSessionId !== undefined) workspace.activeSessionId = tab.activeSessionId\n if (tab.expandedSessionIds !== undefined) workspace.expandedSessionIds = tab.expandedSessionIds\n const shell: Record<string, unknown> = {\n kind: tab.kind,\n folder: tab.folder,\n workspacePartition: await addPartition(workspace),\n }\n if (tab.occurrence !== undefined) shell.occurrence = tab.occurrence\n if (tab.projectName !== undefined) shell.projectName = tab.projectName\n if (tab.binaryPath !== undefined) shell.binaryPath = tab.binaryPath\n return shell\n })),\n activeTabIndex: session.activeTabIndex,\n ...(session.homeActive !== undefined ? { homeActive: session.homeActive } : {}),\n }\n const sessionPartition = await addPartition({ format: 2, session: encodedSession })\n const partitionKeys = Object.keys(generated).sort()\n return {\n sessionPartition,\n partitionKeys,\n partitions: Object.fromEntries(partitionKeys.map((key) => [key, generated[key]!])),\n }\n}\n\nexport async function encodeClientSnapshotV2(snapshot: ClientSnapshotV1): Promise<EncodedClientSnapshotV2> {\n const graph = await encodeSessionGraph(snapshot.session)\n return {\n root: {\n version: 2,\n revision: snapshot.revision,\n savedAt: snapshot.savedAt,\n layout: snapshot.layout,\n sessionPartition: graph.sessionPartition,\n partitionKeys: graph.partitionKeys,\n },\n partitions: graph.partitions,\n partitionKeys: graph.partitionKeys,\n }\n}\n\nexport function canCommitClientSnapshotV2(encoded: EncodedClientSnapshotV2): boolean {\n if (encoded.partitionKeys.length > MAX_NATIVE_PARTITIONS) return false\n const root = JSON.stringify(encoded.root)\n if (root.length > MAX_ROOT_BYTES) return false\n let commitBytes = encoder.encode(root).byteLength\n if (commitBytes > MAX_ROOT_BYTES) return false\n for (const key in encoded.partitions) {\n if (!hasOwn(encoded.partitions, key)) continue\n const partition = encoded.partitions[key]!\n if (partition.length > MAX_PARTITION_BYTES || partition.length > MAX_NATIVE_COMMIT_BYTES - commitBytes) return false\n const partitionBytes = encoder.encode(partition).byteLength\n if (partitionBytes > MAX_PARTITION_BYTES || partitionBytes > MAX_NATIVE_COMMIT_BYTES - commitBytes) return false\n commitBytes += partitionBytes\n }\n return true\n}\n\nfunction decodeRoot(value: unknown): { root: ClientSnapshotV1; partitionKey: string; partitionKeys: string[] } | null {\n if (!isRecord(value) || value.version !== 2 || typeof value.sessionPartition !== \"string\"\n || !PARTITION_KEY.test(value.sessionPartition)\n || !isPartitionKeyArray(value.partitionKeys)\n || !value.partitionKeys.includes(value.sessionPartition)\n || Object.keys(value).sort().join(\"\\0\") !== ROOT_KEYS.join(\"\\0\")) return null\n let serialized: string\n try {\n serialized = JSON.stringify(value)\n } catch {\n return null\n }\n if (encoder.encode(serialized).byteLength > MAX_ROOT_BYTES) return null\n const root = decodeClientSnapshot({ ...value, version: 1, session: null })\n if (!root || !canonicalEquals(value, {\n version: 2,\n revision: root.revision,\n savedAt: root.savedAt,\n layout: root.layout,\n sessionPartition: value.sessionPartition,\n partitionKeys: value.partitionKeys,\n })) return null\n return { root, partitionKey: value.sessionPartition, partitionKeys: value.partitionKeys }\n}\n\nfunction parseJson(value: string): { value: unknown } | null {\n try {\n return { value: JSON.parse(value) as unknown }\n } catch {\n return null\n }\n}\n\nasync function decodeGraph(\n manifest: Record<string, unknown>,\n rootKey: string,\n persistedKeys: readonly string[],\n loaded: Map<string, string>,\n loadPartition: (key: string) => Promise<string | null>,\n): Promise<RestorableSessionState | null | undefined> {\n if (!hasExactKeys(manifest, [\"format\", \"session\"]) || canonicalJson(manifest) !== loaded.get(rootKey)) return\n if (manifest.session === null) {\n const reencoded = await encodeSessionGraph(null)\n return graphMatches(reencoded, rootKey, persistedKeys, loaded) ? null : undefined\n }\n if (!isRecord(manifest.session)\n || !hasExactKeys(manifest.session, [\"tabs\", \"activeTabIndex\"], [\"homeActive\"])\n || !Array.isArray(manifest.session.tabs)) return\n\n const loadCanonical = async (key: unknown): Promise<Record<string, unknown> | null> => {\n if (typeof key !== \"string\" || !PARTITION_KEY.test(key)) return null\n let partition = loaded.get(key)\n if (partition === undefined) {\n partition = await loadPartition(key) ?? undefined\n if (partition === undefined || encoder.encode(partition).byteLength > MAX_PARTITION_BYTES\n || await sha256(partition) !== key) return null\n loaded.set(key, partition)\n }\n const parsed = parseJson(partition)\n return parsed && isRecord(parsed.value) && canonicalJson(parsed.value) === partition ? parsed.value : null\n }\n\n const sameKeys = (left: Iterable<string>, right: readonly string[]) => {\n const sorted = [...new Set(left)].sort()\n return sorted.length === right.length && sorted.every((key, index) => key === right[index])\n }\n const loadBlob = async (keys: unknown, allowed: ReadonlySet<string>, referenced: Set<string>) => {\n if (!Array.isArray(keys) || !keys.length || keys.length > MAX_BLOB_CHUNKS\n || !keys.every((key) => typeof key === \"string\" && PARTITION_KEY.test(key))\n || new Set(keys).size !== keys.length) return null\n const chunks: string[] = []\n let length = 0\n for (const [index, key] of (keys as string[]).entries()) {\n if (!allowed.has(key)) return null\n referenced.add(key)\n const chunk = await loadCanonical(key)\n if (!chunk || !validBase64(chunk.data)) return null\n if (chunk.format === 1) {\n if (!hasExactKeys(chunk, [\"format\", \"data\"])) return null\n } else if (chunk.format === 2) {\n if (!hasExactKeys(chunk, [\"format\", \"index\", \"data\"]) || chunk.index !== index) return null\n } else return null\n if (chunk.data.length > MAX_BLOB_BASE64_CHARACTERS - length) return null\n length += chunk.data.length\n chunks.push(chunk.data)\n }\n const data = chunks.join(\"\")\n return validBase64(data) ? data : null\n }\n const decodeAttachments = async (\n value: unknown,\n allowed: ReadonlySet<string>,\n referenced: Set<string>,\n ): Promise<unknown[] | null> => {\n if (!Array.isArray(value)) return null\n const result: unknown[] = []\n for (const attachment of value) {\n if (!isRecord(attachment) || !hasExactKeys(attachment,\n [\"id\", \"type\", \"display\", \"url\", \"filename\", \"mediaType\", \"source\"]) || !isRecord(attachment.source)) return null\n const source = attachment.source\n if (source.type === \"file\") {\n if (!hasExactKeys(source, [\"type\", \"path\", \"mime\"], [\"dataPartitions\"])) return null\n if (hasOwn(source, \"dataPartitions\")) {\n const data = await loadBlob(source.dataPartitions, allowed, referenced)\n if (data === null) return null\n result.push({ ...attachment, source: { type: source.type, path: source.path, mime: source.mime, data } })\n } else result.push(attachment)\n continue\n }\n if (source.type === \"text\") {\n if (!hasExactKeys(source, [\"type\", \"valuePartitions\"])) return null\n const data = await loadBlob(source.valuePartitions, allowed, referenced)\n if (data === null) return null\n try {\n const value = new TextDecoder(\"utf-8\", { fatal: true }).decode(base64ToBytes(data))\n result.push({ ...attachment, source: { type: source.type, value } })\n } catch {\n return null\n }\n continue\n }\n result.push(attachment)\n }\n return result\n }\n\n const tabs: unknown[] = []\n const declaredGraph = new Set([rootKey])\n let degraded = false\n let legacyGraph = false\n for (const shell of manifest.session.tabs) {\n if (!isRecord(shell)) return\n if (shell.kind === \"sidecar\") {\n if (!hasExactKeys(shell, [\"kind\", \"sidecarId\"])) return\n tabs.push({ kind: shell.kind, sidecarId: shell.sidecarId })\n continue\n }\n if (shell.kind !== \"workspace\"\n || !hasExactKeys(shell, [\"kind\", \"folder\", \"workspacePartition\"], [\"occurrence\", \"projectName\", \"binaryPath\"])) return\n if (typeof shell.workspacePartition !== \"string\" || !PARTITION_KEY.test(shell.workspacePartition)) return\n declaredGraph.add(shell.workspacePartition)\n const workspace = await loadCanonical(shell.workspacePartition)\n if (!workspace || (workspace.format !== 1 && workspace.format !== 2)\n || !hasExactKeys(workspace, [\"format\", \"sessions\"],\n [\"activeParentSessionId\", \"activeSessionId\", \"expandedSessionIds\"])\n || !isRecord(workspace.sessions)) return\n legacyGraph ||= workspace.format === 1\n if (!Object.keys(workspace.sessions).every(isSafePersistedSessionId)\n || (hasOwn(workspace, \"activeParentSessionId\") && !isSafePersistedSessionId(workspace.activeParentSessionId))\n || (hasOwn(workspace, \"activeSessionId\") && !isSafePersistedSessionId(workspace.activeSessionId))\n || (hasOwn(workspace, \"expandedSessionIds\") && (!Array.isArray(workspace.expandedSessionIds)\n || !workspace.expandedSessionIds.every(isSafePersistedSessionId)))) return\n\n const tab: Record<string, unknown> = {\n kind: shell.kind,\n folder: shell.folder,\n drafts: Object.create(null),\n attachments: Object.create(null),\n scrollSnapshots: Object.create(null),\n unseenIdleSince: Object.create(null),\n generationRecovery: Object.create(null),\n }\n for (const key of [\"occurrence\", \"projectName\", \"binaryPath\"] as const) {\n if (hasOwn(shell, key)) tab[key] = shell[key]\n }\n for (const key of [\"activeParentSessionId\", \"activeSessionId\", \"expandedSessionIds\"] as const) {\n if (hasOwn(workspace, key)) tab[key] = workspace[key]\n }\n const entries: Array<{ sessionId: string; documentKey: string; partitionKeys: string[] }> = []\n for (const [sessionId, rawEntry] of Object.entries(workspace.sessions)) {\n if (workspace.format === 1) {\n if (typeof rawEntry !== \"string\" || !PARTITION_KEY.test(rawEntry)) return\n entries.push({ sessionId, documentKey: rawEntry, partitionKeys: [rawEntry] })\n declaredGraph.add(rawEntry)\n continue\n }\n if (!isRecord(rawEntry) || !hasExactKeys(rawEntry, [\"documentPartition\", \"partitionKeys\"])\n || typeof rawEntry.documentPartition !== \"string\" || !PARTITION_KEY.test(rawEntry.documentPartition)\n || !isPartitionKeyArray(rawEntry.partitionKeys)\n || !rawEntry.partitionKeys.includes(rawEntry.documentPartition)) return\n entries.push({ sessionId, documentKey: rawEntry.documentPartition, partitionKeys: rawEntry.partitionKeys })\n rawEntry.partitionKeys.forEach((key) => declaredGraph.add(key))\n }\n const activeId = typeof workspace.activeSessionId === \"string\" ? workspace.activeSessionId : undefined\n entries.sort((left, right) => left.sessionId === activeId ? -1 : right.sessionId === activeId ? 1\n : left.sessionId.localeCompare(right.sessionId))\n const dropped = new Set<string>()\n for (const { sessionId, documentKey, partitionKeys } of entries) {\n const document = await loadCanonical(documentKey)\n const allowed = new Set(partitionKeys)\n const referenced = new Set([documentKey])\n const validDocument = document && (document.format === 1 || document.format === 2)\n && hasExactKeys(document, [\"format\"],\n [\"draft\", \"attachments\", \"scrollSnapshot\", \"unseenIdleSince\", \"generationRecovery\"])\n && Object.keys(document).length > 1\n if (!validDocument) {\n degraded = true\n dropped.add(sessionId)\n continue\n }\n const decodedAttachments = !hasOwn(document, \"attachments\") ? undefined : document.format === 1\n ? document.attachments\n : await decodeAttachments(document.attachments, allowed, referenced)\n if ((hasOwn(document, \"attachments\") && decodedAttachments === null)\n || !sameKeys(referenced, partitionKeys)) {\n degraded = true\n dropped.add(sessionId)\n continue\n }\n const leaf: RestorableWorkspaceTabState = {\n kind: \"workspace\", folder: \"/\",\n drafts: Object.create(null), attachments: Object.create(null), scrollSnapshots: Object.create(null),\n unseenIdleSince: Object.create(null), generationRecovery: Object.create(null),\n }\n const fields = [\n [\"draft\", \"drafts\"],\n [\"scrollSnapshot\", \"scrollSnapshots\"],\n [\"unseenIdleSince\", \"unseenIdleSince\"],\n [\"generationRecovery\", \"generationRecovery\"],\n ] as const\n for (const [documentField, stateField] of fields) {\n if (hasOwn(document, documentField)) (leaf[stateField] as Record<string, unknown>)[sessionId] = document[documentField]\n }\n if (decodedAttachments !== undefined) leaf.attachments[sessionId] = decodedAttachments as RestorableAttachment[]\n const normalizedLeaf = normalizeRestorableSession({ tabs: [leaf], activeTabIndex: 0 })?.tabs[0]\n if (!normalizedLeaf || !canonicalEquals(leaf, normalizedLeaf)) {\n degraded = true\n dropped.add(sessionId)\n continue\n }\n for (const [, stateField] of fields) {\n if (hasOwn(leaf[stateField], sessionId)) {\n (tab[stateField] as Record<string, unknown>)[sessionId] = leaf[stateField][sessionId]\n }\n }\n if (hasOwn(leaf.attachments, sessionId)) {\n (tab.attachments as Record<string, unknown>)[sessionId] = leaf.attachments[sessionId]\n }\n }\n if (dropped.has(String(tab.activeSessionId))) delete tab.activeSessionId\n if (dropped.has(String(tab.activeParentSessionId))) delete tab.activeParentSessionId\n if (Array.isArray(tab.expandedSessionIds)) {\n tab.expandedSessionIds = tab.expandedSessionIds.filter((sessionId) => !dropped.has(String(sessionId)))\n }\n tabs.push(tab)\n }\n\n if (!sameKeys(declaredGraph, persistedKeys)) return\n\n const reconstructed: unknown = {\n tabs,\n activeTabIndex: manifest.session.activeTabIndex,\n ...(hasOwn(manifest.session, \"homeActive\") ? { homeActive: manifest.session.homeActive } : {}),\n }\n const normalized = normalizeRestorableSession(reconstructed)\n if (!normalized || !canonicalEquals(reconstructed, normalized)) return\n if (degraded || legacyGraph) return normalized\n const reencoded = await encodeSessionGraph(normalized)\n return graphMatches(reencoded, rootKey, persistedKeys, loaded) ? normalized : undefined\n}\n\nfunction graphMatches(\n reencoded: Awaited<ReturnType<typeof encodeSessionGraph>>,\n rootKey: string,\n persistedKeys: readonly string[],\n loaded: Map<string, string>,\n): boolean {\n if (reencoded.sessionPartition !== rootKey\n || reencoded.partitionKeys.length !== persistedKeys.length\n || !reencoded.partitionKeys.every((key, index) => key === persistedKeys[index])\n || reencoded.partitionKeys.length !== loaded.size) return false\n return reencoded.partitionKeys.every((key) => loaded.get(key) === reencoded.partitions[key])\n}\n\nexport async function decodeClientSnapshotV2(\n value: unknown,\n partitionProtocolVersion: 1 | undefined,\n loadPartition: (key: string) => Promise<string | null>,\n): Promise<ClientSnapshotV1 | null> {\n const decoded = decodeRoot(value)\n if (!decoded || partitionProtocolVersion !== 1) return null\n try {\n const partition = await loadPartition(decoded.partitionKey)\n if (partition === null || encoder.encode(partition).byteLength > MAX_PARTITION_BYTES\n || await sha256(partition) !== decoded.partitionKey) return null\n const parsed = parseJson(partition)\n if (!parsed) return null\n if (isRecord(parsed.value) && parsed.value.format === 2) {\n const loaded = new Map([[decoded.partitionKey, partition]])\n const session = await decodeGraph(parsed.value, decoded.partitionKey, decoded.partitionKeys, loaded, loadPartition)\n return session === undefined ? null : { ...decoded.root, session }\n }\n return null\n } catch {\n return null\n }\n}\n\nexport const isClientSnapshotV2 = (value: unknown): boolean => isRecord(value) && value.version === 2\n","import { createSignal } from \"solid-js\"\nimport { clearNativeClientState, commitNativeClientStatePartitions, loadNativeClientState, loadNativeClientStatePartition,\n saveNativeClientState, setNativeRestoreEnabled } from \"../lib/native/client-state\"\nimport { decodeClientSnapshot, normalizeRestorableSession } from \"./client-state-codec\"\nimport type { ClientSnapshotV1, RestorableSessionState, RestorableSidecarTabState, RestorableTabState, RestorableWorkspaceTabState } from \"./client-state-codec\"\nimport { canCommitClientSnapshotV2, decodeClientSnapshotV2, encodeClientSnapshotV2, isClientSnapshotV2 } from \"./client-state-partitions\"\nimport type { ClientSnapshotV2 } from \"./client-state-partitions\"\nexport type { ClientSnapshotV1, RestorableSessionState, RestorableSidecarTabState, RestorableTabState, RestorableWorkspaceTabState }\nexport type { ClientSnapshotV2 }\nconst SAVE_DEBOUNCE_MS = 250\nconst FLUSH_MAX_ATTEMPTS = 3\nconst MAX_V1_SNAPSHOT_BYTES = 1024 * 1024\nconst MAX_LAYOUT_ENTRIES = 64\nconst MAX_LAYOUT_KEY_LENGTH = 256\nconst MAX_LAYOUT_VALUE_LENGTH = 4096\nconst LEGACY_LAYOUT_KEY_PREFIX = \"opencode-session-\"\nconst UNSAFE_LAYOUT_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"])\nconst [clientStateIsPrimary, setClientStateIsPrimary] = createSignal(true)\nconst [restorePreviousStateEnabled, setRestorePreviousStateEnabledSignal] = createSignal(false)\nconst [loadedClientSnapshotExists, setLoadedClientSnapshotExists] = createSignal(false)\nconst [loadedRestorableSession, setLoadedRestorableSession] = createSignal<RestorableSessionState | null>(null)\nlet initialized = false\nlet initialization: Promise<void> | null = null\nlet layout: Record<string, string> = Object.create(null)\nlet revision = 0\nlet dirty = false\nlet writeBlock: false | \"snapshot\" | \"transaction\" = false\nlet saveTimer: ReturnType<typeof setTimeout> | null = null\nlet writeQueue: Promise<void> = Promise.resolve()\nlet destructiveQueue: Promise<void> = Promise.resolve()\nlet lastSaveError: unknown\nlet partitionProtocolVersion: 1 | undefined\nconst transactionLayoutWrites = new Set<string>()\nfunction useLocalStorage<T>(fallback: T, operation: (storage: Storage) => T): T {\n try {\n return operation(window.localStorage)\n } catch {\n return fallback\n }\n}\n\nfunction isValidLayoutKey(key: string): boolean {\n return key.length > 0 && key.length <= MAX_LAYOUT_KEY_LENGTH && !UNSAFE_LAYOUT_KEYS.has(key)\n}\nconst readLegacyLayoutValue = (key: string) =>\n useLocalStorage<string | null>(null, (storage) => {\n const value = storage.getItem(key)\n return value !== null && value.length <= MAX_LAYOUT_VALUE_LENGTH ? value : null\n })\nconst writeLegacyLayoutValue = (key: string, value: string) =>\n useLocalStorage(undefined, (storage) => storage.setItem(key, value))\nfunction legacyLayoutKeys(storage: Storage): string[] {\n const keys = new Set(Object.keys(layout))\n for (let index = 0; index < storage.length; index += 1) {\n const key = storage.key(index)\n if (key?.startsWith(LEGACY_LAYOUT_KEY_PREFIX)) keys.add(key)\n }\n return [...keys]\n}\nconst hasLayoutKey = (key: string) => Object.prototype.hasOwnProperty.call(layout, key)\nconst layoutIsFull = () => Object.keys(layout).length >= MAX_LAYOUT_ENTRIES\n\nfunction migrateLegacyLayoutValues(): boolean {\n return useLocalStorage(false, (storage) => {\n const previousSize = Object.keys(layout).length\n for (const key of legacyLayoutKeys(storage)) {\n if (hasLayoutKey(key)) continue\n if (layoutIsFull()) break\n const value = storage.getItem(key)\n if (value === null || value.length > MAX_LAYOUT_VALUE_LENGTH) continue\n layout[key] = value\n }\n return Object.keys(layout).length !== previousSize\n })\n}\n\nfunction canWriteSnapshot(): boolean {\n return initialized && clientStateIsPrimary() && restorePreviousStateEnabled() && !writeBlock\n}\nconst cancelSaveTimer = () => {\n if (saveTimer !== null) clearTimeout(saveTimer)\n saveTimer = null\n}\n\nfunction enqueuePendingSave(): Promise<void> {\n cancelSaveTimer()\n if (!dirty || !canWriteSnapshot()) return writeQueue\n const snapshot: ClientSnapshotV1 = {\n version: 1,\n revision: ++revision,\n savedAt: Date.now(),\n layout: { ...layout },\n session: loadedRestorableSession(),\n }\n const normalizedSnapshot = decodeClientSnapshot(snapshot)\n if (!normalizedSnapshot) return Promise.reject(new Error(\"Client snapshot normalization failed\"))\n layout = { ...normalizedSnapshot.layout }\n dirty = false\n const saveAttempt = writeQueue.then(async () => {\n try {\n const partitioned = partitionProtocolVersion === 1 ? await encodeClientSnapshotV2(normalizedSnapshot) : null\n if (partitioned && !canCommitClientSnapshotV2(partitioned)) {\n throw new Error(\"Client snapshot exceeds the native partition count or size limits\")\n }\n if (!partitioned && new TextEncoder().encode(JSON.stringify(normalizedSnapshot)).byteLength > MAX_V1_SNAPSHOT_BYTES) {\n throw new Error(\"Client snapshot exceeds the V1 1 MiB limit and partition persistence is unavailable\")\n }\n const accepted = partitioned\n ? await commitNativeClientStatePartitions({\n protocolVersion: 1,\n snapshot: partitioned.root,\n partitions: partitioned.partitions,\n partitionKeys: partitioned.partitionKeys,\n })\n : await saveNativeClientState(normalizedSnapshot)\n if (!accepted) {\n setClientStateIsPrimary(false)\n throw new Error(\"Native client state save was rejected\")\n }\n lastSaveError = undefined\n } catch (error) {\n dirty = true\n lastSaveError = error\n throw error\n }\n })\n writeQueue = saveAttempt.catch(() => undefined)\n return saveAttempt\n}\n\nfunction scheduleSave() {\n dirty = true\n if (!canWriteSnapshot()) return\n cancelSaveTimer()\n saveTimer = setTimeout(() => void enqueuePendingSave()\n .catch((error) => console.warn(\"[client-state] failed to save client snapshot\", error)), SAVE_DEBOUNCE_MS)\n}\nfunction resetLoadedState(snapshot: ClientSnapshotV1 | null = null, resetRevision = false) {\n layout = snapshot ? { ...snapshot.layout } : Object.create(null)\n if (resetRevision) revision = snapshot?.revision ?? 0\n setLoadedClientSnapshotExists(snapshot !== null)\n setLoadedRestorableSession(snapshot?.session ?? null)\n}\nasync function executeDestructiveTransaction(operation: () => Promise<boolean>, rejectedMessage: string, loseOwnershipOnRejection = false): Promise<void> {\n const previousWriteBlock = writeBlock\n let retryDirty = dirty\n writeBlock = \"transaction\"\n transactionLayoutWrites.clear()\n cancelSaveTimer()\n dirty = false\n try {\n await writeQueue\n retryDirty ||= dirty\n dirty = false\n if (!await operation()) {\n if (loseOwnershipOnRejection) setClientStateIsPrimary(false)\n throw new Error(rejectedMessage)\n }\n useLocalStorage(undefined, (storage) => {\n for (const key of legacyLayoutKeys(storage)) storage.removeItem(key)\n })\n resetLoadedState()\n transactionLayoutWrites.clear()\n writeBlock = \"snapshot\"\n } catch (error) {\n retryDirty ||= dirty\n for (const key of transactionLayoutWrites) writeLegacyLayoutValue(key, layout[key]!)\n transactionLayoutWrites.clear()\n writeBlock = previousWriteBlock\n dirty = retryDirty\n if (dirty) scheduleSave()\n throw error\n }\n}\nfunction runDestructiveTransition(operation: () => Promise<void>): Promise<void> {\n const transition = destructiveQueue.then(operation)\n destructiveQueue = transition.catch(() => undefined)\n return transition\n}\nexport function updateRestorableSession(state: RestorableSessionState | null): void {\n const normalized = state === null ? null : normalizeRestorableSession(state)\n if (state !== null && normalized === null) return\n if (writeBlock === \"transaction\") {\n setLoadedRestorableSession(normalized)\n dirty = true\n return\n }\n if (writeBlock || !clientStateIsPrimary() || !restorePreviousStateEnabled()) return\n setLoadedRestorableSession(normalized)\n scheduleSave()\n}\n\nexport function readClientLayoutValue(key: string): string | null {\n if (!isValidLayoutKey(key)) return null\n if (!clientStateIsPrimary()) return readLegacyLayoutValue(key)\n if (!restorePreviousStateEnabled() || writeBlock) return null\n if (hasLayoutKey(key)) return layout[key] ?? null\n const legacyValue = readLegacyLayoutValue(key)\n if (legacyValue === null || layoutIsFull()) return legacyValue\n layout[key] = legacyValue\n scheduleSave()\n return legacyValue\n}\n\nexport function writeClientLayoutValue(key: string, value: string): void {\n if (!isValidLayoutKey(key) || value.length > MAX_LAYOUT_VALUE_LENGTH) return\n if (!clientStateIsPrimary()) return writeLegacyLayoutValue(key, value)\n if (writeBlock === \"transaction\") {\n if (!hasLayoutKey(key) && layoutIsFull()) return\n dirty ||= layout[key] !== value\n layout[key] = value\n transactionLayoutWrites.add(key)\n return\n }\n if (!restorePreviousStateEnabled() || writeBlock) return\n if (!hasLayoutKey(key) && layoutIsFull()) return\n writeLegacyLayoutValue(key, value)\n if (layout[key] === value) return\n layout[key] = value\n scheduleSave()\n}\n\nexport async function flushClientState(): Promise<void> {\n cancelSaveTimer()\n let lastError = lastSaveError\n for (let attempts = 0; attempts < FLUSH_MAX_ATTEMPTS; attempts += 1) {\n while (true) {\n const pending = writeQueue\n await pending\n if (pending === writeQueue) break\n }\n if (!dirty) {\n if (lastError !== undefined) throw lastError\n return\n }\n if (!canWriteSnapshot()) {\n const writeError = lastSaveError ?? lastError\n if (writeError !== undefined) throw writeError\n return\n }\n try {\n await enqueuePendingSave()\n lastError = undefined\n } catch (error) {\n lastError = error\n }\n }\n await writeQueue\n if (!dirty) return\n throw lastError ?? new Error(\"Client state remained dirty after the final flush attempt\")\n}\n\nexport async function clearRestoredClientState(): Promise<void> {\n await runDestructiveTransition(async () => {\n if (!clientStateIsPrimary()) throw new Error(\"Client state is not owned by this window\")\n await executeDestructiveTransaction(clearNativeClientState, \"Native client state clear was rejected\", true)\n })\n}\n\nexport async function setRestorePreviousStateEnabled(enabled: boolean): Promise<void> {\n await runDestructiveTransition(async () => {\n if (enabled === restorePreviousStateEnabled() && (!enabled || writeBlock === false)) return\n if (!clientStateIsPrimary()) throw new Error(\"Client state is not owned by this window\")\n if (enabled) {\n if (!await setNativeRestoreEnabled(true)) throw new Error(\"Native restore preference update was rejected\")\n writeBlock = false\n setRestorePreviousStateEnabledSignal(true)\n return\n }\n setRestorePreviousStateEnabledSignal(false)\n try {\n await executeDestructiveTransaction(() => setNativeRestoreEnabled(false), \"Native restore preference update was rejected\")\n } catch (error) {\n setRestorePreviousStateEnabledSignal(true)\n throw error\n }\n })\n}\n\nexport function initializeClientState(): Promise<void> {\n if (initialization) return initialization\n initialization = (async () => {\n try {\n const loaded = await loadNativeClientState()\n partitionProtocolVersion = loaded.partitionProtocolVersion\n setClientStateIsPrimary(loaded.isPrimary)\n setRestorePreviousStateEnabledSignal(loaded.restoreEnabled)\n resetLoadedState(null, true)\n dirty = false\n lastSaveError = undefined\n writeBlock = false\n transactionLayoutWrites.clear()\n initialized = true\n if (!loaded.isPrimary || !loaded.restoreEnabled) return\n let snapshot: ClientSnapshotV1 | null\n if (isClientSnapshotV2(loaded.snapshot)) {\n writeBlock = \"snapshot\"\n try {\n snapshot = await decodeClientSnapshotV2(\n loaded.snapshot,\n loaded.partitionProtocolVersion,\n loadNativeClientStatePartition,\n )\n } catch (error) {\n snapshot = null\n console.warn(\"[client-state] failed to load client snapshot partition\", error)\n }\n if (snapshot) writeBlock = false\n } else {\n snapshot = decodeClientSnapshot(loaded.snapshot)\n writeBlock = loaded.snapshot !== null && snapshot === null ? \"snapshot\" : false\n }\n resetLoadedState(snapshot, true)\n if (!writeBlock && migrateLegacyLayoutValues()) scheduleSave()\n } catch (error) {\n initialized = true\n setClientStateIsPrimary(false)\n resetLoadedState()\n console.warn(\"[client-state] failed to initialize client state\", error)\n }\n })()\n return initialization\n}\n\nexport { clientStateIsPrimary, loadedClientSnapshotExists, loadedRestorableSession, restorePreviousStateEnabled }\n"],"names":["LEGACY_WEB_KEYS","SECONDARY_CLIENT_STATE","log","getLogger","accessToken","bytes","byte","nativeAccessClaimed","electronApi","dispatchNative","electronOperation","command","args","isElectronHost","isTauriHost","invoke","claimNativeClientStateAccess","isLocalWindow","result","api","_a","error","loadNativeClientState","loaded","key","mutateNativeClientState","saveNativeClientState","snapshot","commitNativeClientStatePartitions","payload","loadNativeClientStatePartition","setNativeRestoreEnabled","enabled","clearNativeClientState","acknowledge","acknowledgeNativeClientStateNavigationFlush","generation","acknowledgeNativeClientStateRendererFlush","MAX_ID","MAX_DISPLAY","MAX_PATH","MAX_MIME","isRecord","value","isSafeKey","takeString","max","allowEmpty","bytesToBase64","binary","index","base64ToBytes","character","validBase64","dataUrlPayload","takeFileData","url","raw","data","takePosition","normalizeSource","name","path","mime","rawData","start","end","normalizeAttachment","id","display","filename","mediaType","source","rawUrl","normalizeRestorableAttachmentRecord","drafts","prioritySessionIds","attachments","priority","prioritySet","entries","sessionId","rawAttachments","normalized","attachment","serializeDraftAttachments","values","hydrateRestorableAttachment","MAX_TABS","MAX_LAYOUT_ENTRIES","MAX_DRAFTS","MAX_SCROLLS_PER_TAB","MAX_IDLE_MARKERS","MAX_RECOVERY","MAX_EXPANDED","MAX_KEY","MAX_LAYOUT_VALUE","MAX_DRAFT","MAX_ANCHOR_KEY","MAX_STRINGS","MAX_SCROLLS","MAX_WINDOW_CURSOR","NO_SESSION_DRAFT_SESSION_ID","createBudget","safeKey","budget","takeNumber","min","normalizeRecord","normalize","accept","accepted","priorityKeys","count","priorities","rawKey","rawValue","entry","normalizeStringRecord","valueMax","normalizeScrollSnapshot","scrollTop","updatedAt","scrollRatio","maxScrollTop","anchorOffset","anchorKey","windowCursor","newerCursors","cursor","normalizeExpandedSessionIds","seen","normalizeWorkspaceTab","identity","_prioritizeDrafts","reservedDrafts","remainingDrafts","additionalDrafts","scrollLimit","scrollSnapshots","unseenIdleSince","generationRecovery","expandedSessionIds","remainingAttachments","attachmentResult","projectName","binaryPath","normalizeIdentity","kind","sidecarId","folder","activeParentSessionId","activeSessionId","reservePriorityDrafts","remaining","draft","priorityAttachments","normalizeRestorableSession","normalizeSession","requested","rawTabs","identityByIndex","normalizedByIndex","normalizeIdentityAt","originalIndex","normalizeTabAt","prioritizeDrafts","tab","_tab","priorityOrder","tabs","surviving","next","activeTabIndex","decodeClientSnapshot","savedAt","session","layout","MAX_PARTITION_BYTES","MAX_ROOT_BYTES","MAX_NATIVE_PARTITIONS","MAX_NATIVE_COMMIT_BYTES","MAX_SESSION_ID","BLOB_CHUNK_CHARACTERS","MAX_BLOB_CHUNKS","MAX_BLOB_BASE64_CHARACTERS","PARTITION_KEY","ROOT_KEYS","UNSAFE_KEYS","encoder","hasOwn","isSafePersistedSessionId","isPartitionKeyArray","hasExactKeys","required","optional","allowed","sortJson","canonicalJson","serialized","canonicalEquals","left","right","sha256","digest","addBlob","addPartition","keys","offset","encodeAttachments","encodeSessionGraph","generated","partition","encodedSession","sessionIds","sessions","document","documentPartition","attachmentPartitions","workspace","shell","sessionPartition","partitionKeys","encodeClientSnapshotV2","graph","canCommitClientSnapshotV2","encoded","root","commitBytes","partitionBytes","decodeRoot","parseJson","decodeGraph","manifest","rootKey","persistedKeys","loadPartition","reencoded","graphMatches","loadCanonical","parsed","sameKeys","sorted","loadBlob","referenced","chunks","length","chunk","decodeAttachments","declaredGraph","degraded","legacyGraph","rawEntry","activeId","dropped","documentKey","decodedAttachments","leaf","fields","documentField","stateField","normalizedLeaf","reconstructed","decodeClientSnapshotV2","partitionProtocolVersion","decoded","isClientSnapshotV2","SAVE_DEBOUNCE_MS","FLUSH_MAX_ATTEMPTS","MAX_V1_SNAPSHOT_BYTES","MAX_LAYOUT_KEY_LENGTH","MAX_LAYOUT_VALUE_LENGTH","LEGACY_LAYOUT_KEY_PREFIX","UNSAFE_LAYOUT_KEYS","clientStateIsPrimary","setClientStateIsPrimary","createSignal","restorePreviousStateEnabled","setRestorePreviousStateEnabledSignal","loadedClientSnapshotExists","setLoadedClientSnapshotExists","loadedRestorableSession","setLoadedRestorableSession","initialized","initialization","revision","dirty","writeBlock","saveTimer","writeQueue","destructiveQueue","lastSaveError","transactionLayoutWrites","useLocalStorage","fallback","operation","isValidLayoutKey","readLegacyLayoutValue","storage","writeLegacyLayoutValue","legacyLayoutKeys","hasLayoutKey","layoutIsFull","migrateLegacyLayoutValues","previousSize","canWriteSnapshot","cancelSaveTimer","enqueuePendingSave","normalizedSnapshot","saveAttempt","partitioned","scheduleSave","resetLoadedState","resetRevision","executeDestructiveTransaction","rejectedMessage","loseOwnershipOnRejection","previousWriteBlock","retryDirty","runDestructiveTransition","transition","updateRestorableSession","state","readClientLayoutValue","legacyValue","writeClientLayoutValue","flushClientState","lastError","attempts","pending","writeError","clearRestoredClientState","setRestorePreviousStateEnabled","initializeClientState"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{an as _,t as b,i as x,u as E,m as V,h as B}from"./monaco-viewer-BB3_mBkA.js";import{c as L,d as F,k as p,a as D,S as T,E as z,D as G,C as $,G as U}from"./git-diff-vendor-ChbWBukG.js";import{eZ as N,an as K}from"./main-COtTRZe6.js";import"./fast-diff-vendor-DgdwVvTQ.js";import"./highlight-vendor-8FKMu9os.js";import"./index-ef9_CbWU.js";var q=b("<div>"),O=b("<div class=tool-call-diff-viewer>"),P=b("<pre class=tool-call-diff-fallback>");const Z=B("session");U();function j(e,s,o){const a=window.getComputedStyle(o),i=document.createElement("span");i.textContent=s||"",i.style.position="absolute",i.style.visibility="hidden",i.style.pointerEvents="none",i.style.display="inline-block",i.style.width="auto",i.style.maxWidth="none",i.style.whiteSpace="nowrap",i.style.fontFamily=a.fontFamily,i.style.fontSize=a.fontSize,i.style.fontWeight=a.fontWeight,i.style.fontStyle=a.fontStyle,i.style.letterSpacing=a.letterSpacing,i.style.fontVariant=a.fontVariant,i.style.textTransform=a.textTransform,i.style.lineHeight=a.lineHeight,e.appendChild(i);const f=Math.ceil(i.getBoundingClientRect().width);return i.remove(),f}function M(e,s,o=40){const a=s.reduce((l,n)=>Math.max(l,j(e,n.text,n.source)),0),i=s.reduce((l,n)=>Math.max(l,n.text.length),1),f=Math.round(i*7+4);return Math.max(2,Math.min(o,a>0?a+2:f))}function I(e,s){const o=e.querySelector(".unified-diff-table-wrapper"),a=e.querySelector(".unified-diff-table"),i=e.querySelector(".unified-diff-table-num-col"),f=e.querySelectorAll(".diff-line-num"),l=e.querySelectorAll(".diff-line-hunk-action, .diff-line-widget-wrapper, .diff-line-extend-wrapper"),n=[];a&&(s?(a.classList.add("table-fixed"),a.style.tableLayout="fixed",a.style.width="100%",a.style.minWidth="100%"):(a.classList.remove("table-fixed"),a.style.tableLayout="auto",a.style.width="max-content",a.style.minWidth="100%")),f.forEach(r=>{var v,k;const c=r.querySelector("[data-line-old-num]"),m=r.querySelector("[data-line-new-num]"),W=r.querySelector(".shrink-0"),S=r.querySelector(":scope > .flex"),C=r.querySelector(":scope > .tool-call-diff-compact-line-number"),y=((v=c==null?void 0:c.textContent)==null?void 0:v.trim())??"",w=((k=m==null?void 0:m.textContent)==null?void 0:k.trim())??"",H=w.length>0&&w!=="0",R=y.length>0&&y!=="0",g=H?w:R?y:w||y;S&&(S.style.display="none"),W&&(W.style.display="none"),c&&(c.style.display="none",c.style.width="auto"),m&&(m.style.display="none",m.style.width="auto"),r.style.paddingLeft="1px",r.style.paddingRight="1px",r.style.textAlign="left";const u=C??document.createElement("span");u.className="tool-call-diff-compact-line-number",u.textContent=g,u.setAttribute("aria-hidden",g?"false":"true"),C||r.appendChild(u),n.push({gutter:r,label:u,text:g})});const t=M(e,n.map(r=>({text:r.text,source:r.label}))),d=`${t}px`,h=`${Math.max(8,t-10)}px`;o&&(o.style.setProperty("--diff-aside-width",h),o.style.setProperty("--diff-aside-width--",h)),i&&(i.style.width=d),n.forEach(({gutter:r,label:c})=>{r.style.width=d,r.style.minWidth=d,r.style.maxWidth=d,c.style.width="auto",c.style.maxWidth="none"}),l.forEach(r=>{r.style.width=d,r.style.minWidth=d,r.style.maxWidth=d,r.style.paddingLeft="0",r.style.paddingRight="0"})}function J(e){const s=e.querySelector(".old-diff-table-wrapper"),o=e.querySelector(".new-diff-table-wrapper"),a=Array.from(e.querySelectorAll(".diff-line-old-num, .diff-line-new-num")),i=Array.from(e.querySelectorAll(".diff-line-hunk-action, .diff-line-widget-wrapper, .diff-line-extend-wrapper")),f=a.map(t=>({cell:t,span:t.querySelector("[data-line-num]")})).filter(t=>!!t.span),n=`${M(e,f.map(({span:t})=>{var d;return{text:((d=t.textContent)==null?void 0:d.trim())??"",source:t}}),64)}px`;[s,o].forEach(t=>{t&&t.style.setProperty("--diff-aside-width",n)}),a.forEach(t=>{t.style.width=n,t.style.minWidth=n,t.style.maxWidth=n,t.style.paddingLeft="2px",t.style.paddingRight="2px",t.style.textAlign="left",t.style.whiteSpace="nowrap",t.style.overflowWrap="normal",t.style.wordBreak="normal"}),f.forEach(({span:t})=>{t.style.whiteSpace="nowrap",t.style.overflowWrap="normal",t.style.wordBreak="normal"}),i.forEach(t=>{t.style.width=n,t.style.minWidth=n,t.style.maxWidth=n,t.style.paddingLeft="0",t.style.paddingRight="0"})}function A(e,s,o=!1){if(s==="unified"){I(e,o);return}s==="split"&&J(e)}function ne(e){const s=L(()=>{const f=_(e.diffText);if(!f)return null;const l=N(e.filePath)||"text",n=e.filePath||"diff";return{oldFile:{fileName:n,fileLang:l},newFile:{fileName:n,fileLang:l},hunks:[f]}});let o,a;const i=L(()=>s()?`${e.theme}|${e.mode}|${e.wrap?"wrap":"nowrap"}|${e.diffText}`:"");return F(()=>{var n;if(e.cachedHtml){o&&A(o,e.mode,!!e.wrap),(n=e.onRendered)==null||n.call(e);return}const l=i();l&&o&&a!==l&&requestAnimationFrame(()=>{var d;if(!o)return;A(o,e.mode,!!e.wrap);const t=o.innerHTML;t&&(a=l,e.cacheEntryParams&&K(e.cacheEntryParams,{text:e.diffText,html:t,theme:e.theme,mode:e.mode,wrap:e.wrap}),(d=e.onRendered)==null||d.call(e))})}),(()=>{var f=O();return x(f,p(T,{get when(){return e.cachedHtml},get fallback(){return(()=>{var l=q(),n=o;return typeof n=="function"?E(n,l):o=l,x(l,p(T,{get when(){return s()},get fallback(){return(()=>{var t=P();return x(t,()=>e.diffText),t})()},children:t=>p(z,{fallback:d=>(Z.warn("Failed to render diff view",d),(()=>{var h=P();return x(h,()=>e.diffText),h})()),get children(){return p(G,{get data(){return t()},get diffViewMode(){return V(()=>e.mode==="split")()?$.Split:$.Unified},get diffViewTheme(){return e.theme},diffViewHighlight:!0,get diffViewWrap(){return!!e.wrap},diffViewFontSize:13})}})})),l})()},get children(){var l=q(),n=o;return typeof n=="function"?E(n,l):o=l,D(()=>l.innerHTML=e.cachedHtml),l}})),f})()}export{ne as ToolCallDiffViewer};
2
- //# sourceMappingURL=diff-viewer-6oxyPi3-.js.map
1
+ import{ao as R,t as b,i as x,u as E,m as V,h as B}from"./monaco-viewer-Cc9bWg7I.js";import{c as L,d as F,k as p,a as D,S as T,E as z,D as G,C as $,G as U}from"./git-diff-vendor-ChbWBukG.js";import{e_ as N,an as K}from"./main-OmXs7qtG.js";import"./fast-diff-vendor-DgdwVvTQ.js";import"./highlight-vendor-8FKMu9os.js";import"./index-BzAEHHap.js";var q=b("<div>"),O=b("<div class=tool-call-diff-viewer>"),P=b("<pre class=tool-call-diff-fallback>");const j=B("session");U();function I(e,s,o){const a=window.getComputedStyle(o),i=document.createElement("span");i.textContent=s||"",i.style.position="absolute",i.style.visibility="hidden",i.style.pointerEvents="none",i.style.display="inline-block",i.style.width="auto",i.style.maxWidth="none",i.style.whiteSpace="nowrap",i.style.fontFamily=a.fontFamily,i.style.fontSize=a.fontSize,i.style.fontWeight=a.fontWeight,i.style.fontStyle=a.fontStyle,i.style.letterSpacing=a.letterSpacing,i.style.fontVariant=a.fontVariant,i.style.textTransform=a.textTransform,i.style.lineHeight=a.lineHeight,e.appendChild(i);const f=Math.ceil(i.getBoundingClientRect().width);return i.remove(),f}function M(e,s,o=40){const a=s.reduce((l,n)=>Math.max(l,I(e,n.text,n.source)),0),i=s.reduce((l,n)=>Math.max(l,n.text.length),1),f=Math.round(i*7+4);return Math.max(2,Math.min(o,a>0?a+2:f))}function J(e,s){const o=e.querySelector(".unified-diff-table-wrapper"),a=e.querySelector(".unified-diff-table"),i=e.querySelector(".unified-diff-table-num-col"),f=e.querySelectorAll(".diff-line-num"),l=e.querySelectorAll(".diff-line-hunk-action, .diff-line-widget-wrapper, .diff-line-extend-wrapper"),n=[];a&&(s?(a.classList.add("table-fixed"),a.style.tableLayout="fixed",a.style.width="100%",a.style.minWidth="100%"):(a.classList.remove("table-fixed"),a.style.tableLayout="auto",a.style.width="max-content",a.style.minWidth="100%")),f.forEach(r=>{var v,k;const c=r.querySelector("[data-line-old-num]"),m=r.querySelector("[data-line-new-num]"),W=r.querySelector(".shrink-0"),S=r.querySelector(":scope > .flex"),C=r.querySelector(":scope > .tool-call-diff-compact-line-number"),y=((v=c==null?void 0:c.textContent)==null?void 0:v.trim())??"",w=((k=m==null?void 0:m.textContent)==null?void 0:k.trim())??"",_=w.length>0&&w!=="0",H=y.length>0&&y!=="0",g=_?w:H?y:w||y;S&&(S.style.display="none"),W&&(W.style.display="none"),c&&(c.style.display="none",c.style.width="auto"),m&&(m.style.display="none",m.style.width="auto"),r.style.paddingLeft="1px",r.style.paddingRight="1px",r.style.textAlign="left";const u=C??document.createElement("span");u.className="tool-call-diff-compact-line-number",u.textContent=g,u.setAttribute("aria-hidden",g?"false":"true"),C||r.appendChild(u),n.push({gutter:r,label:u,text:g})});const t=M(e,n.map(r=>({text:r.text,source:r.label}))),d=`${t}px`,h=`${Math.max(8,t-10)}px`;o&&(o.style.setProperty("--diff-aside-width",h),o.style.setProperty("--diff-aside-width--",h)),i&&(i.style.width=d),n.forEach(({gutter:r,label:c})=>{r.style.width=d,r.style.minWidth=d,r.style.maxWidth=d,c.style.width="auto",c.style.maxWidth="none"}),l.forEach(r=>{r.style.width=d,r.style.minWidth=d,r.style.maxWidth=d,r.style.paddingLeft="0",r.style.paddingRight="0"})}function Q(e){const s=e.querySelector(".old-diff-table-wrapper"),o=e.querySelector(".new-diff-table-wrapper"),a=Array.from(e.querySelectorAll(".diff-line-old-num, .diff-line-new-num")),i=Array.from(e.querySelectorAll(".diff-line-hunk-action, .diff-line-widget-wrapper, .diff-line-extend-wrapper")),f=a.map(t=>({cell:t,span:t.querySelector("[data-line-num]")})).filter(t=>!!t.span),n=`${M(e,f.map(({span:t})=>{var d;return{text:((d=t.textContent)==null?void 0:d.trim())??"",source:t}}),64)}px`;[s,o].forEach(t=>{t&&t.style.setProperty("--diff-aside-width",n)}),a.forEach(t=>{t.style.width=n,t.style.minWidth=n,t.style.maxWidth=n,t.style.paddingLeft="2px",t.style.paddingRight="2px",t.style.textAlign="left",t.style.whiteSpace="nowrap",t.style.overflowWrap="normal",t.style.wordBreak="normal"}),f.forEach(({span:t})=>{t.style.whiteSpace="nowrap",t.style.overflowWrap="normal",t.style.wordBreak="normal"}),i.forEach(t=>{t.style.width=n,t.style.minWidth=n,t.style.maxWidth=n,t.style.paddingLeft="0",t.style.paddingRight="0"})}function A(e,s,o=!1){if(s==="unified"){J(e,o);return}s==="split"&&Q(e)}function ne(e){const s=L(()=>{const f=R(e.diffText);if(!f)return null;const l=N(e.filePath)||"text",n=e.filePath||"diff";return{oldFile:{fileName:n,fileLang:l},newFile:{fileName:n,fileLang:l},hunks:[f]}});let o,a;const i=L(()=>s()?`${e.theme}|${e.mode}|${e.wrap?"wrap":"nowrap"}|${e.diffText}`:"");return F(()=>{var n;if(e.cachedHtml){o&&A(o,e.mode,!!e.wrap),(n=e.onRendered)==null||n.call(e);return}const l=i();l&&o&&a!==l&&requestAnimationFrame(()=>{var d;if(!o)return;A(o,e.mode,!!e.wrap);const t=o.innerHTML;t&&(a=l,e.cacheEntryParams&&K(e.cacheEntryParams,{text:e.diffText,html:t,theme:e.theme,mode:e.mode,wrap:e.wrap}),(d=e.onRendered)==null||d.call(e))})}),(()=>{var f=O();return x(f,p(T,{get when(){return e.cachedHtml},get fallback(){return(()=>{var l=q(),n=o;return typeof n=="function"?E(n,l):o=l,x(l,p(T,{get when(){return s()},get fallback(){return(()=>{var t=P();return x(t,()=>e.diffText),t})()},children:t=>p(z,{fallback:d=>(j.warn("Failed to render diff view",d),(()=>{var h=P();return x(h,()=>e.diffText),h})()),get children(){return p(G,{get data(){return t()},get diffViewMode(){return V(()=>e.mode==="split")()?$.Split:$.Unified},get diffViewTheme(){return e.theme},diffViewHighlight:!0,get diffViewWrap(){return!!e.wrap},diffViewFontSize:13})}})})),l})()},get children(){var l=q(),n=o;return typeof n=="function"?E(n,l):o=l,D(()=>l.innerHTML=e.cachedHtml),l}})),f})()}export{ne as ToolCallDiffViewer};
2
+ //# sourceMappingURL=diff-viewer-B0VS1voD.js.map