@bendyline/docblocks 1.1.2 → 2.0.0
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.
- package/README.md +76 -11
- package/dist/chunk-2D7Y4IR3.js +1293 -0
- package/dist/chunk-2D7Y4IR3.js.map +1 -0
- package/dist/chunk-5MYAICRE.js +957 -0
- package/dist/chunk-5MYAICRE.js.map +1 -0
- package/dist/chunk-75UUF6C4.js +802 -0
- package/dist/chunk-75UUF6C4.js.map +1 -0
- package/dist/chunk-AEHCVWU5.js +25 -0
- package/dist/chunk-AEHCVWU5.js.map +1 -0
- package/dist/chunk-AYZ4HN5M.js +20 -0
- package/dist/chunk-AYZ4HN5M.js.map +1 -0
- package/dist/chunk-EGNDADXB.js +111 -0
- package/dist/chunk-EGNDADXB.js.map +1 -0
- package/dist/chunk-EZKJZUNJ.js +13 -0
- package/dist/chunk-EZKJZUNJ.js.map +1 -0
- package/dist/chunk-FNW556FN.js +75 -0
- package/dist/chunk-FNW556FN.js.map +1 -0
- package/dist/chunk-GCPBEMMH.js +563 -0
- package/dist/chunk-GCPBEMMH.js.map +1 -0
- package/dist/chunk-J32GU3F3.js +1664 -0
- package/dist/chunk-J32GU3F3.js.map +1 -0
- package/dist/chunk-PGR7LK6D.js +1062 -0
- package/dist/chunk-PGR7LK6D.js.map +1 -0
- package/dist/chunk-RQJRQF46.js +787 -0
- package/dist/chunk-RQJRQF46.js.map +1 -0
- package/dist/{chunk-ME76RUMR.js → chunk-RVQHY3XU.js} +15 -1
- package/dist/chunk-RVQHY3XU.js.map +1 -0
- package/dist/chunk-SI2LU2RP.js +224 -0
- package/dist/chunk-SI2LU2RP.js.map +1 -0
- package/dist/chunk-W5UUUII5.js +142 -0
- package/dist/chunk-W5UUUII5.js.map +1 -0
- package/dist/document/document-session.d.ts +127 -0
- package/dist/document/document-session.d.ts.map +1 -0
- package/dist/document/document-session.js +749 -0
- package/dist/document/document-session.js.map +1 -0
- package/dist/document/filesystem-target.d.ts +17 -0
- package/dist/document/filesystem-target.d.ts.map +1 -0
- package/dist/document/filesystem-target.js +70 -0
- package/dist/document/filesystem-target.js.map +1 -0
- package/dist/document/index.d.ts +6 -0
- package/dist/document/index.d.ts.map +1 -0
- package/dist/document/index.js +4 -0
- package/dist/document/index.js.map +1 -0
- package/dist/document/recovery-journal.d.ts +125 -0
- package/dist/document/recovery-journal.d.ts.map +1 -0
- package/dist/document/recovery-journal.js +385 -0
- package/dist/document/recovery-journal.js.map +1 -0
- package/dist/document/types.d.ts +89 -0
- package/dist/document/types.d.ts.map +1 -0
- package/dist/document/types.js +9 -0
- package/dist/document/types.js.map +1 -0
- package/dist/filesystem/commit-lock.d.ts +3 -0
- package/dist/filesystem/commit-lock.d.ts.map +1 -0
- package/dist/filesystem/commit-lock.js +20 -0
- package/dist/filesystem/commit-lock.js.map +1 -0
- package/dist/filesystem/dbk-workspace.d.ts +34 -0
- package/dist/filesystem/dbk-workspace.d.ts.map +1 -0
- package/dist/filesystem/dbk-workspace.js +85 -0
- package/dist/filesystem/dbk-workspace.js.map +1 -0
- package/dist/filesystem/electron-provider-v2.d.ts +36 -0
- package/dist/filesystem/electron-provider-v2.d.ts.map +1 -0
- package/dist/filesystem/electron-provider-v2.js +503 -0
- package/dist/filesystem/electron-provider-v2.js.map +1 -0
- package/dist/filesystem/electron-provider.d.ts +6 -3
- package/dist/filesystem/electron-provider.d.ts.map +1 -1
- package/dist/filesystem/electron-provider.js +18 -13
- package/dist/filesystem/electron-provider.js.map +1 -1
- package/dist/filesystem/electron.d.ts +4 -0
- package/dist/filesystem/electron.d.ts.map +1 -0
- package/dist/filesystem/electron.js +4 -0
- package/dist/filesystem/electron.js.map +1 -0
- package/dist/filesystem/filesystem-content-container.d.ts +1 -1
- package/dist/filesystem/filesystem-content-container.d.ts.map +1 -1
- package/dist/filesystem/filesystem-content-container.js +50 -13
- package/dist/filesystem/filesystem-content-container.js.map +1 -1
- package/dist/filesystem/fs-error.d.ts +46 -0
- package/dist/filesystem/fs-error.d.ts.map +1 -0
- package/dist/filesystem/fs-error.js +170 -0
- package/dist/filesystem/fs-error.js.map +1 -0
- package/dist/filesystem/index.d.ts +15 -1
- package/dist/filesystem/index.d.ts.map +1 -1
- package/dist/filesystem/index.js +13 -0
- package/dist/filesystem/index.js.map +1 -1
- package/dist/filesystem/indexeddb-content-container.d.ts +3 -1
- package/dist/filesystem/indexeddb-content-container.d.ts.map +1 -1
- package/dist/filesystem/indexeddb-content-container.js +18 -11
- package/dist/filesystem/indexeddb-content-container.js.map +1 -1
- package/dist/filesystem/indexeddb-provider-v2.d.ts +96 -0
- package/dist/filesystem/indexeddb-provider-v2.d.ts.map +1 -0
- package/dist/filesystem/indexeddb-provider-v2.js +1241 -0
- package/dist/filesystem/indexeddb-provider-v2.js.map +1 -0
- package/dist/filesystem/indexeddb-provider.d.ts +21 -14
- package/dist/filesystem/indexeddb-provider.d.ts.map +1 -1
- package/dist/filesystem/indexeddb-provider.js +111 -261
- package/dist/filesystem/indexeddb-provider.js.map +1 -1
- package/dist/filesystem/indexeddb-store.d.ts +34 -0
- package/dist/filesystem/indexeddb-store.d.ts.map +1 -0
- package/dist/filesystem/indexeddb-store.js +165 -0
- package/dist/filesystem/indexeddb-store.js.map +1 -0
- package/dist/filesystem/indexeddb.d.ts +5 -0
- package/dist/filesystem/indexeddb.d.ts.map +1 -0
- package/dist/filesystem/indexeddb.js +5 -0
- package/dist/filesystem/indexeddb.js.map +1 -0
- package/dist/filesystem/legacy-v2-adapter.d.ts +62 -0
- package/dist/filesystem/legacy-v2-adapter.d.ts.map +1 -0
- package/dist/filesystem/legacy-v2-adapter.js +499 -0
- package/dist/filesystem/legacy-v2-adapter.js.map +1 -0
- package/dist/filesystem/memory-provider-v2.d.ts +92 -0
- package/dist/filesystem/memory-provider-v2.d.ts.map +1 -0
- package/dist/filesystem/memory-provider-v2.js +615 -0
- package/dist/filesystem/memory-provider-v2.js.map +1 -0
- package/dist/filesystem/memory-provider.d.ts +54 -0
- package/dist/filesystem/memory-provider.d.ts.map +1 -0
- package/dist/filesystem/memory-provider.js +132 -0
- package/dist/filesystem/memory-provider.js.map +1 -0
- package/dist/filesystem/memory.d.ts +4 -0
- package/dist/filesystem/memory.d.ts.map +1 -0
- package/dist/filesystem/memory.js +4 -0
- package/dist/filesystem/memory.js.map +1 -0
- package/dist/filesystem/move-entry.d.ts +9 -0
- package/dist/filesystem/move-entry.d.ts.map +1 -0
- package/dist/filesystem/move-entry.js +103 -0
- package/dist/filesystem/move-entry.js.map +1 -0
- package/dist/filesystem/move-error.d.ts +53 -0
- package/dist/filesystem/move-error.d.ts.map +1 -0
- package/dist/filesystem/move-error.js +99 -0
- package/dist/filesystem/move-error.js.map +1 -0
- package/dist/filesystem/native-provider-v2.d.ts +75 -0
- package/dist/filesystem/native-provider-v2.d.ts.map +1 -0
- package/dist/filesystem/native-provider-v2.js +849 -0
- package/dist/filesystem/native-provider-v2.js.map +1 -0
- package/dist/filesystem/native-provider.d.ts +9 -1
- package/dist/filesystem/native-provider.d.ts.map +1 -1
- package/dist/filesystem/native-provider.js +172 -37
- package/dist/filesystem/native-provider.js.map +1 -1
- package/dist/filesystem/native.d.ts +4 -0
- package/dist/filesystem/native.d.ts.map +1 -0
- package/dist/filesystem/native.js +4 -0
- package/dist/filesystem/native.js.map +1 -0
- package/dist/filesystem/types.d.ts +37 -4
- package/dist/filesystem/types.d.ts.map +1 -1
- package/dist/filesystem/types.js +11 -3
- package/dist/filesystem/types.js.map +1 -1
- package/dist/filesystem/v2.d.ts +172 -0
- package/dist/filesystem/v2.d.ts.map +1 -0
- package/dist/filesystem/v2.js +16 -0
- package/dist/filesystem/v2.js.map +1 -0
- package/dist/filesystem/workspace-path.d.ts +21 -0
- package/dist/filesystem/workspace-path.d.ts.map +1 -0
- package/dist/filesystem/workspace-path.js +80 -0
- package/dist/filesystem/workspace-path.js.map +1 -0
- package/dist/host/filesystem-v2.d.ts +45 -0
- package/dist/host/filesystem-v2.d.ts.map +1 -0
- package/dist/host/filesystem-v2.js +13 -0
- package/dist/host/filesystem-v2.js.map +1 -0
- package/dist/host/git.d.ts +200 -0
- package/dist/host/git.d.ts.map +1 -0
- package/dist/host/git.js +15 -0
- package/dist/host/git.js.map +1 -0
- package/dist/host/index.d.ts +4 -1
- package/dist/host/index.d.ts.map +1 -1
- package/dist/host/index.js +2 -0
- package/dist/host/index.js.map +1 -1
- package/dist/host/types.d.ts +114 -31
- package/dist/host/types.d.ts.map +1 -1
- package/dist/host/wire-policy.d.ts +22 -0
- package/dist/host/wire-policy.d.ts.map +1 -0
- package/dist/host/wire-policy.js +92 -0
- package/dist/host/wire-policy.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.d.ts +4 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +4 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/types.d.ts +466 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +25 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/mcp/wire.d.ts +29 -0
- package/dist/mcp/wire.d.ts.map +1 -0
- package/dist/mcp/wire.js +1046 -0
- package/dist/mcp/wire.js.map +1 -0
- package/dist/mcp/zod.d.ts +5763 -0
- package/dist/mcp/zod.d.ts.map +1 -0
- package/dist/mcp/zod.js +908 -0
- package/dist/mcp/zod.js.map +1 -0
- package/dist/types-CX893hgH.d.ts +468 -0
- package/dist/types-CsX6EN2t.d.ts +301 -0
- package/dist/types-eOlt9J7n.d.ts +478 -0
- package/dist/vscode/index.d.ts +3 -0
- package/dist/vscode/index.d.ts.map +1 -0
- package/dist/vscode/index.js +3 -0
- package/dist/vscode/index.js.map +1 -0
- package/dist/vscode/messages.d.ts +204 -0
- package/dist/vscode/messages.d.ts.map +1 -0
- package/dist/vscode/messages.js +494 -0
- package/dist/vscode/messages.js.map +1 -0
- package/dist/workspace/index.d.ts +3 -2
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js +2 -1
- package/dist/workspace/index.js.map +1 -1
- package/dist/workspace/reconcile-electron.d.ts +19 -0
- package/dist/workspace/reconcile-electron.d.ts.map +1 -0
- package/dist/workspace/reconcile-electron.js +42 -0
- package/dist/workspace/reconcile-electron.js.map +1 -0
- package/dist/workspace/types.d.ts +41 -1
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/types.js +0 -4
- package/dist/workspace/types.js.map +1 -1
- package/dist/workspace/workspace-manager.d.ts +17 -5
- package/dist/workspace/workspace-manager.d.ts.map +1 -1
- package/dist/workspace/workspace-manager.js +55 -11
- package/dist/workspace/workspace-manager.js.map +1 -1
- package/dist/workspace-path-CWVrcuPL.d.ts +21 -0
- package/package.json +43 -2
- package/src/document/document-session.ts +834 -0
- package/src/document/filesystem-target.ts +109 -0
- package/src/document/index.ts +41 -0
- package/src/document/recovery-journal.ts +536 -0
- package/src/document/types.ts +116 -0
- package/src/filesystem/commit-lock.ts +29 -0
- package/src/filesystem/dbk-workspace.ts +135 -0
- package/src/filesystem/electron-provider-v2.ts +630 -0
- package/src/filesystem/electron-provider.ts +25 -14
- package/src/filesystem/electron.ts +3 -0
- package/src/filesystem/filesystem-content-container.ts +53 -15
- package/src/filesystem/fs-error.ts +234 -0
- package/src/filesystem/index.ts +119 -0
- package/src/filesystem/indexeddb-content-container.ts +20 -12
- package/src/filesystem/indexeddb-provider-v2.ts +1740 -0
- package/src/filesystem/indexeddb-provider.ts +126 -300
- package/src/filesystem/indexeddb-store.ts +207 -0
- package/src/filesystem/indexeddb.ts +12 -0
- package/src/filesystem/legacy-v2-adapter.ts +779 -0
- package/src/filesystem/memory-provider-v2.ts +896 -0
- package/src/filesystem/memory-provider.ts +180 -0
- package/src/filesystem/memory.ts +15 -0
- package/src/filesystem/move-entry.ts +142 -0
- package/src/filesystem/move-error.ts +159 -0
- package/src/filesystem/native-provider-v2.ts +1165 -0
- package/src/filesystem/native-provider.ts +194 -41
- package/src/filesystem/native.ts +16 -0
- package/src/filesystem/types.ts +49 -4
- package/src/filesystem/v2.ts +231 -0
- package/src/filesystem/workspace-path.ts +92 -0
- package/src/host/filesystem-v2.ts +104 -0
- package/src/host/git.ts +246 -0
- package/src/host/index.ts +46 -0
- package/src/host/types.ts +155 -34
- package/src/host/wire-policy.ts +103 -0
- package/src/index.ts +2 -1
- package/src/mcp/index.ts +3 -0
- package/src/mcp/types.ts +594 -0
- package/src/mcp/wire.ts +1280 -0
- package/src/mcp/zod.ts +1000 -0
- package/src/vscode/index.ts +2 -0
- package/src/vscode/messages.ts +704 -0
- package/src/workspace/index.ts +8 -1
- package/src/workspace/reconcile-electron.ts +65 -0
- package/src/workspace/types.ts +39 -1
- package/src/workspace/workspace-manager.ts +71 -10
- package/dist/chunk-GUNM43XZ.js +0 -63
- package/dist/chunk-GUNM43XZ.js.map +0 -1
- package/dist/chunk-IM7LCQJ6.js +0 -850
- package/dist/chunk-IM7LCQJ6.js.map +0 -1
- package/dist/chunk-ME76RUMR.js.map +0 -1
- package/dist/index-pgBHBQ9G.d.ts +0 -213
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/document/document-session.ts","../src/document/filesystem-target.ts","../src/document/recovery-journal.ts"],"sourcesContent":["import type {\n DocumentCommitTarget,\n DocumentConflictStrategy,\n DocumentExternalChangeResult,\n DocumentExternalSnapshot,\n DocumentSaveReason,\n DocumentSessionConflict,\n DocumentSessionEditScope,\n DocumentSessionLifecycle,\n DocumentSessionOptions,\n DocumentSessionSnapshot,\n DocumentSessionStatus,\n DocumentSessionTransition,\n} from './types.js';\nimport { isFileSystemMoveStateError } from '../filesystem/move-error.js';\nimport type { DocumentRecoveryJournal } from './recovery-journal.js';\n\ntype SessionListener = () => void;\n\nconst DEFAULT_AUTO_SAVE_RETRY_DELAYS_MS = [1_000, 3_000, 10_000] as const;\n\n/**\n * Raised by a commit target when optimistic external-change verification\n * fails. The session converts it into durable conflict state.\n */\nexport class DocumentCommitConflictError extends Error {\n public readonly externalContent: string | null;\n public readonly externalVersion: string | number | null;\n\n public constructor(\n message: string,\n externalContent: string | null,\n externalVersion: string | number | null = null,\n ) {\n super(message);\n this.name = 'DocumentCommitConflictError';\n this.externalContent = externalContent;\n this.externalVersion = externalVersion;\n }\n}\n\nexport class DocumentSessionConflictError extends Error {\n public readonly conflict: DocumentSessionConflict;\n\n public constructor(conflict: DocumentSessionConflict) {\n super('The document changed outside DocBlocks while local edits were pending.');\n this.name = 'DocumentSessionConflictError';\n this.conflict = conflict;\n }\n}\n\n/**\n * A revisioned, serialized persistence boundary for one active document.\n *\n * Invariants:\n * - only drain() calls target.commit();\n * - at most one commit is in flight;\n * - revisions never decrease, including across target transitions;\n * - destructive operations wait for an in-flight commit and run last;\n * - a target is never changed by a React effect cleanup.\n */\nexport class DocumentSession {\n private readonly autoSaveDelayMs: number;\n private readonly autoSaveRetryDelaysMs: readonly number[];\n private readonly recoveryJournal: DocumentRecoveryJournal | null;\n private readonly listeners = new Set<SessionListener>();\n private autoSaveEnabled: boolean;\n\n private target: DocumentCommitTarget | null = null;\n private content = '';\n private persistedContent: string | null = null;\n private revision = 0;\n private persistedRevision = 0;\n private savingRevision: number | null = null;\n private savingContent: string | null = null;\n private generation = 0;\n private externalSequence = -1;\n private lifecycle: DocumentSessionLifecycle = 'open';\n private frozen = false;\n private error: Error | null = null;\n private conflict: DocumentSessionConflict | null = null;\n\n private autoSaveTimer: ReturnType<typeof setTimeout> | null = null;\n private autoSaveRetryAttempt = 0;\n private drainPromise: Promise<void> | null = null;\n private haltDrain = false;\n private operationTail: Promise<void> = Promise.resolve();\n private snapshot: DocumentSessionSnapshot;\n\n public constructor(options: DocumentSessionOptions = {}) {\n this.autoSaveDelayMs = Math.max(0, options.autoSaveDelayMs ?? 500);\n this.autoSaveEnabled = options.autoSaveEnabled ?? true;\n this.autoSaveRetryDelaysMs = normalizeRetryDelays(\n options.autoSaveRetryDelaysMs ?? DEFAULT_AUTO_SAVE_RETRY_DELAYS_MS,\n );\n this.recoveryJournal = options.recoveryJournal ?? null;\n this.snapshot = this.createSnapshot();\n }\n\n public readonly subscribe = (listener: SessionListener): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n public readonly getSnapshot = (): DocumentSessionSnapshot => this.snapshot;\n\n /** Enable or disable automatic persistence without weakening explicit or lifecycle flushes. */\n public setAutoSaveEnabled(enabled: boolean): void {\n if (this.autoSaveEnabled === enabled) return;\n this.autoSaveEnabled = enabled;\n if (!enabled) {\n this.clearAutoSaveTimer();\n return;\n }\n if (\n this.target &&\n this.lifecycle === 'open' &&\n !this.frozen &&\n !this.conflict &&\n this.persistedRevision < this.revision\n ) {\n this.scheduleAutoSave();\n }\n }\n\n /**\n * Record a complete local snapshot and schedule its persistence.\n * Returns the assigned monotonic revision.\n */\n public edit(content: string, scope: DocumentSessionEditScope): number {\n if (!this.target || this.lifecycle !== 'open' || this.frozen) {\n throw new Error('Cannot edit a document session that is not open.');\n }\n if (scope.targetKey !== this.target.key || scope.generation !== this.generation) {\n throw new Error('Cannot apply an edit from an obsolete document instance.');\n }\n if (content === this.content) return this.revision;\n\n this.content = content;\n this.revision += 1;\n this.error = null;\n this.autoSaveRetryAttempt = 0;\n if (this.conflict) {\n this.conflict = {\n ...this.conflict,\n localContent: content,\n localRevision: this.revision,\n };\n }\n this.writeRecoverySnapshot();\n if (!this.conflict) this.scheduleAutoSave();\n this.emit();\n return this.revision;\n }\n\n /**\n * Persist the revision current when flush() is called. A later edit may\n * advance the session again, but commits remain strictly serialized.\n */\n public async flush(reason: DocumentSaveReason = 'manual'): Promise<DocumentSessionSnapshot> {\n this.clearAutoSaveTimer();\n if (!this.target) return this.snapshot;\n if (this.conflict) throw new DocumentSessionConflictError(this.conflict);\n\n const requiredRevision = this.revision;\n while (this.target && this.persistedRevision < requiredRevision) {\n if (this.conflict) throw new DocumentSessionConflictError(this.conflict);\n if (this.haltDrain) {\n throw new Error('Document persistence was cancelled before the requested revision saved.');\n }\n try {\n await this.ensureDrain(reason);\n } catch (error: unknown) {\n if (this.conflict) throw new DocumentSessionConflictError(this.conflict);\n throw error;\n }\n }\n\n if (this.conflict) throw new DocumentSessionConflictError(this.conflict);\n if (this.persistedRevision < requiredRevision) {\n throw new Error('The document target closed before the requested revision saved.');\n }\n return this.snapshot;\n }\n\n /**\n * Flush the old document, then replace it with a new clean baseline.\n * UI state should change only after this promise resolves.\n */\n public transitionTo(\n target: DocumentCommitTarget | null,\n content: string,\n ): Promise<DocumentSessionSnapshot> {\n return this.enqueueOperation(() =>\n this.performTransition(async () => ({ target, content })).then((snapshot) => {\n if (!snapshot) throw new Error('A fixed document transition cannot be cancelled.');\n return snapshot;\n }),\n );\n }\n\n /**\n * Freeze and flush the current document before reading the next one. The\n * loader may return null when a navigation request was superseded, leaving\n * the current target active and clean.\n */\n public transitionWithLoad(\n load: () => Promise<DocumentSessionTransition | null>,\n ): Promise<DocumentSessionSnapshot | null> {\n return this.enqueueOperation(() => this.performTransition(load));\n }\n\n /**\n * Flush the current path, run the storage move, and only then swap the\n * commit target. No edit can enter between those steps.\n */\n public retarget(\n nextTarget: DocumentCommitTarget,\n moveStorage: () => Promise<void>,\n ): Promise<DocumentSessionSnapshot> {\n return this.enqueueOperation(async () => {\n this.assertNotPreparingClose();\n if (!this.target) throw new Error('Cannot retarget a session without a document.');\n\n this.lifecycle = 'transitioning';\n this.frozen = true;\n this.emit();\n try {\n this.haltDrain = false;\n await this.flush('transition');\n await moveStorage();\n this.generation += 1;\n this.externalSequence = -1;\n this.target = nextTarget;\n this.error = null;\n this.conflict = null;\n this.lifecycle = 'open';\n this.frozen = false;\n this.emit();\n return this.snapshot;\n } catch (error: unknown) {\n if (isFileSystemMoveStateError(error)) {\n if (error.documentLocation === 'destination') {\n this.generation += 1;\n this.externalSequence = -1;\n this.target = nextTarget;\n }\n this.haltDrain = true;\n this.error = error;\n this.lifecycle = 'open';\n // The provider could not establish one authoritative compound move.\n // Keep editing frozen until navigation/recovery chooses a real path.\n this.frozen = true;\n this.emit();\n throw error;\n }\n this.lifecycle = 'open';\n this.frozen = false;\n this.emit();\n throw error;\n }\n });\n }\n\n /**\n * Cancel queued writes, wait for an already-running write, then delete.\n * The deletion is therefore the final storage operation for this target.\n */\n public delete(deleteStorage: () => Promise<void>): Promise<DocumentSessionSnapshot> {\n return this.enqueueOperation(async () => {\n this.assertNotPreparingClose();\n this.lifecycle = 'transitioning';\n this.frozen = true;\n this.haltDrain = true;\n this.clearAutoSaveTimer();\n this.emit();\n\n await this.awaitActiveDrain();\n try {\n await deleteStorage();\n } catch (error: unknown) {\n this.haltDrain = false;\n this.lifecycle = 'open';\n this.frozen = false;\n if (this.target && this.persistedRevision < this.revision && !this.conflict) {\n this.scheduleAutoSave();\n }\n this.emit();\n throw error;\n }\n\n this.discardRecoverySnapshot();\n this.detach();\n return this.snapshot;\n });\n }\n\n /**\n * Discard queued changes and detach without mutating storage. This is used\n * for explicitly abandoned sessions, never as an implicit effect cleanup.\n */\n public cancel(): Promise<DocumentSessionSnapshot> {\n return this.enqueueOperation(async () => {\n this.lifecycle = 'transitioning';\n this.frozen = true;\n this.haltDrain = true;\n this.clearAutoSaveTimer();\n this.emit();\n await this.awaitActiveDrain();\n this.discardRecoverySnapshot();\n this.detach();\n return this.snapshot;\n });\n }\n\n /**\n * Observe a filesystem/host change captured for targetKey. Clean sessions\n * adopt it. Dirty or saving sessions preserve local text and enter conflict.\n */\n public observeExternal(change: DocumentExternalSnapshot): DocumentExternalChangeResult {\n if (!this.target || change.targetKey !== this.target.key || this.lifecycle === 'closed') {\n return 'ignored';\n }\n if (change.sequence !== undefined) {\n if (!Number.isSafeInteger(change.sequence) || change.sequence <= this.externalSequence) {\n return 'ignored';\n }\n this.externalSequence = change.sequence;\n }\n\n // While conflicted, a current observation equal to the latest local\n // snapshot proves that revision durable without requiring another write.\n // Never acknowledge while a commit is still running; its eventual result\n // remains authoritative for the serialized drain.\n if (\n this.conflict &&\n change.content === this.content &&\n this.savingRevision === null &&\n this.lifecycle === 'open'\n ) {\n this.clearAutoSaveTimer();\n this.autoSaveRetryAttempt = 0;\n this.persistedRevision = this.revision;\n this.persistedContent = this.content;\n this.haltDrain = false;\n this.error = null;\n this.conflict = null;\n this.discardRecoverySnapshot();\n this.emit();\n return 'applied';\n }\n\n // Once a conflict exists, every later accepted observation refreshes its\n // external branch before ordinary duplicate suppression. In particular,\n // A -> local C -> external B -> external A must offer A, not stale B, when\n // the user chooses Reload external.\n if (this.conflict) {\n const externalVersion = change.version ?? null;\n if (\n this.conflict.localContent === this.content &&\n this.conflict.localRevision === this.revision &&\n this.conflict.externalContent === change.content &&\n this.conflict.externalVersion === externalVersion\n ) {\n return 'ignored';\n }\n\n this.clearAutoSaveTimer();\n this.haltDrain = true;\n this.conflict = {\n targetKey: change.targetKey,\n localContent: this.content,\n localRevision: this.revision,\n externalContent: change.content,\n externalVersion,\n };\n this.error = null;\n this.writeRecoverySnapshot();\n this.emit();\n return 'conflict';\n }\n\n if (\n change.content === this.content ||\n change.content === this.persistedContent ||\n (this.savingRevision !== null && change.content === this.savingContent)\n ) {\n return 'ignored';\n }\n\n const isClean =\n this.persistedRevision === this.revision &&\n this.savingRevision === null &&\n this.error === null &&\n this.conflict === null;\n\n if (isClean && change.content !== null) {\n this.content = change.content;\n this.revision += 1;\n this.persistedRevision = this.revision;\n this.persistedContent = change.content;\n this.generation += 1;\n this.discardRecoverySnapshot();\n this.emit();\n return 'applied';\n }\n\n this.clearAutoSaveTimer();\n this.haltDrain = true;\n this.conflict = {\n targetKey: change.targetKey,\n localContent: this.content,\n localRevision: this.revision,\n externalContent: change.content,\n externalVersion: change.version ?? null,\n };\n this.error = null;\n this.writeRecoverySnapshot();\n this.emit();\n return 'conflict';\n }\n\n public resolveConflict(strategy: DocumentConflictStrategy): Promise<DocumentSessionSnapshot> {\n return this.enqueueOperation(async () => {\n if (!this.conflict) return this.snapshot;\n\n this.clearAutoSaveTimer();\n this.haltDrain = true;\n await this.awaitActiveDrain();\n // A watcher may refresh or converge the conflict while an in-flight\n // commit settles. Resolve the branch that is current now, never the\n // snapshot captured before the await.\n const currentConflict = this.conflict;\n if (!currentConflict) return this.snapshot;\n\n if (strategy === 'use-external') {\n this.discardRecoverySnapshot();\n this.generation += 1;\n this.revision += 1;\n this.conflict = null;\n this.error = null;\n this.haltDrain = false;\n\n if (currentConflict.externalContent === null) {\n this.target = null;\n this.content = '';\n this.persistedContent = null;\n this.persistedRevision = this.revision;\n this.lifecycle = 'closed';\n this.frozen = true;\n } else {\n this.content = currentConflict.externalContent;\n this.persistedContent = currentConflict.externalContent;\n this.persistedRevision = this.revision;\n this.lifecycle = 'open';\n this.frozen = false;\n }\n this.emit();\n return this.snapshot;\n }\n\n // Keep the local branch, but make the observed external snapshot the\n // optimistic baseline for the next conditional commit.\n this.persistedContent = currentConflict.externalContent;\n // A clean external deletion/conflict has no unsaved local revision.\n // Keeping local still requires a fresh commit that recreates/overwrites\n // the target, so make that intent explicit with a new revision.\n this.revision += 1;\n this.conflict = null;\n this.error = null;\n this.haltDrain = false;\n this.lifecycle = 'open';\n this.frozen = false;\n this.writeRecoverySnapshot();\n this.emit();\n return this.flush('conflict');\n });\n }\n\n /**\n * Freeze edits and flush through the latest revision. A successful call\n * remains frozen until cancelClose(); the owning host may now destroy it.\n */\n public prepareClose(): Promise<DocumentSessionSnapshot> {\n return this.enqueueOperation(async () => {\n if (this.lifecycle === 'closing') return this.snapshot;\n this.lifecycle = 'closing';\n this.frozen = true;\n this.haltDrain = false;\n this.emit();\n try {\n await this.flush('close');\n return this.snapshot;\n } catch (error: unknown) {\n this.lifecycle = 'open';\n this.frozen = false;\n this.emit();\n throw error;\n }\n });\n }\n\n /** Resume editing when a host cancels a prepared close. */\n public cancelClose(): void {\n if (this.lifecycle !== 'closing') return;\n this.lifecycle = 'open';\n this.frozen = false;\n this.haltDrain = false;\n if (this.target && this.persistedRevision < this.revision && !this.conflict) {\n this.scheduleAutoSave();\n }\n this.emit();\n }\n\n private async performTransition(\n load: () => Promise<DocumentSessionTransition | null>,\n ): Promise<DocumentSessionSnapshot | null> {\n this.assertNotPreparingClose();\n this.lifecycle = 'transitioning';\n this.frozen = true;\n this.emit();\n\n try {\n this.haltDrain = false;\n await this.flush('transition');\n this.clearAutoSaveTimer();\n const next = await load();\n if (!next) {\n this.lifecycle = 'open';\n this.frozen = false;\n this.emit();\n return null;\n }\n\n this.generation += 1;\n this.externalSequence = -1;\n this.target = next.target;\n this.content = next.content;\n this.revision += 1;\n this.persistedRevision = this.revision;\n this.persistedContent = next.target ? next.content : null;\n this.savingRevision = null;\n this.savingContent = null;\n this.error = null;\n this.conflict = null;\n this.haltDrain = false;\n this.lifecycle = 'open';\n this.frozen = false;\n const recoveryState = this.restoreRecoverySnapshot();\n if (recoveryState === 'dirty') this.scheduleAutoSave();\n this.emit();\n return this.snapshot;\n } catch (error: unknown) {\n this.lifecycle = 'open';\n this.frozen = false;\n this.emit();\n throw error;\n }\n }\n\n private scheduleAutoSave(delayMs = this.autoSaveDelayMs): void {\n this.clearAutoSaveTimer();\n if (!this.autoSaveEnabled) return;\n this.autoSaveTimer = setTimeout(() => {\n this.autoSaveTimer = null;\n const target = this.target;\n const generation = this.generation;\n void this.flush('autosave').then(\n () => {\n this.autoSaveRetryAttempt = 0;\n },\n () => {\n // Preserve honest error/conflict state while making ordinary I/O\n // failures recoverable. A newer edit already owns a fresh debounce\n // timer, and lifecycle operations cancel this retry path.\n if (\n this.autoSaveTimer !== null ||\n !target ||\n target !== this.target ||\n generation !== this.generation ||\n this.lifecycle !== 'open' ||\n this.frozen ||\n this.haltDrain ||\n this.conflict ||\n this.persistedRevision >= this.revision\n ) {\n return;\n }\n const retryDelay = this.autoSaveRetryDelaysMs[this.autoSaveRetryAttempt];\n if (retryDelay === undefined) return;\n this.autoSaveRetryAttempt += 1;\n this.scheduleAutoSave(retryDelay);\n },\n );\n }, delayMs);\n }\n\n private clearAutoSaveTimer(): void {\n if (this.autoSaveTimer === null) return;\n clearTimeout(this.autoSaveTimer);\n this.autoSaveTimer = null;\n }\n\n private ensureDrain(reason: DocumentSaveReason): Promise<void> {\n if (this.drainPromise) return this.drainPromise;\n const running = this.drain(reason);\n this.drainPromise = running;\n const clear = () => {\n if (this.drainPromise === running) this.drainPromise = null;\n };\n void running.then(clear, clear);\n return running;\n }\n\n private async drain(reason: DocumentSaveReason): Promise<void> {\n while (\n this.target &&\n !this.haltDrain &&\n !this.conflict &&\n this.persistedRevision < this.revision\n ) {\n const target = this.target;\n const generation = this.generation;\n const saveRevision = this.revision;\n const saveContent = this.content;\n const previousPersistedRevision = this.persistedRevision;\n const previousPersistedContent = this.persistedContent;\n\n this.savingRevision = saveRevision;\n this.savingContent = saveContent;\n this.error = null;\n this.emit();\n\n try {\n await target.commit({\n targetKey: target.key,\n content: saveContent,\n revision: saveRevision,\n persistedRevision: previousPersistedRevision,\n persistedContent: previousPersistedContent,\n reason,\n });\n } catch (error: unknown) {\n this.savingRevision = null;\n this.savingContent = null;\n if (error instanceof DocumentCommitConflictError) {\n this.haltDrain = true;\n this.conflict = {\n targetKey: target.key,\n localContent: this.content,\n localRevision: this.revision,\n externalContent: error.externalContent,\n externalVersion: error.externalVersion,\n };\n this.error = null;\n } else {\n this.error = toError(error);\n }\n this.emit();\n throw error;\n }\n\n if (generation !== this.generation || target !== this.target) return;\n this.persistedRevision = Math.max(this.persistedRevision, saveRevision);\n this.persistedContent = saveContent;\n this.autoSaveRetryAttempt = 0;\n this.savingRevision = null;\n this.savingContent = null;\n this.error = null;\n const activeConflict = this.getSnapshot().conflict;\n if (activeConflict?.externalContent === saveContent && this.content === saveContent) {\n // An observation that matched the in-flight local snapshot could not\n // be acknowledged until the commit settled. Its successful return now\n // proves both branches converged on the same durable revision.\n this.conflict = null;\n this.haltDrain = false;\n }\n this.recoveryJournal?.acknowledge({\n targetKey: target.key,\n generation,\n persistedRevision: this.persistedRevision,\n });\n this.emit();\n }\n }\n\n private async awaitActiveDrain(): Promise<void> {\n const active = this.drainPromise;\n if (!active) return;\n try {\n await active;\n } catch {\n // A destructive cancellation still waits for the operation to settle,\n // but a failed obsolete write must not prevent the requested deletion.\n }\n }\n\n /**\n * Rehydrate a synchronous crash snapshot after the durable baseline has\n * been read. A matching baseline is safe to resume as dirty; a changed\n * baseline becomes an explicit conflict and is never auto-overwritten.\n */\n private restoreRecoverySnapshot(): 'none' | 'dirty' | 'conflict' {\n if (!this.target || !this.recoveryJournal) return 'none';\n const recovered = this.recoveryJournal.lookup(this.target.key);\n if (!recovered) return 'none';\n\n if (recovered.content === this.content) {\n this.recoveryJournal.acknowledge({\n targetKey: recovered.targetKey,\n generation: recovered.generation,\n persistedRevision: recovered.revision,\n });\n return 'none';\n }\n\n const externalContent = this.content;\n this.generation = Math.max(this.generation, recovered.generation) + 1;\n this.revision = Math.max(this.revision, recovered.revision) + 1;\n this.content = recovered.content;\n\n if (recovered.persistedContent === externalContent) {\n this.writeRecoverySnapshot();\n return 'dirty';\n }\n\n // Preserve the journal's prior baseline so a second crash continues to\n // reopen as a conflict until the user explicitly chooses a branch.\n this.persistedContent = recovered.persistedContent;\n this.haltDrain = true;\n this.conflict = {\n targetKey: this.target.key,\n localContent: recovered.content,\n localRevision: this.revision,\n externalContent,\n externalVersion: null,\n };\n this.writeRecoverySnapshot();\n return 'conflict';\n }\n\n private writeRecoverySnapshot(): void {\n if (!this.target || !this.recoveryJournal) return;\n if (this.persistedRevision >= this.revision && !this.conflict) return;\n this.recoveryJournal.write({\n targetKey: this.target.key,\n generation: this.generation,\n revision: this.revision,\n content: this.content,\n persistedContent: this.persistedContent,\n });\n }\n\n private discardRecoverySnapshot(): void {\n if (!this.target) return;\n this.recoveryJournal?.discard(this.target.key);\n }\n\n private detach(): void {\n this.clearAutoSaveTimer();\n this.autoSaveRetryAttempt = 0;\n this.generation += 1;\n this.externalSequence = -1;\n this.target = null;\n this.persistedContent = null;\n this.savingRevision = null;\n this.savingContent = null;\n this.error = null;\n this.conflict = null;\n this.haltDrain = false;\n this.lifecycle = 'closed';\n this.frozen = true;\n this.emit();\n }\n\n private assertNotPreparingClose(): void {\n if (this.lifecycle === 'closing') {\n throw new Error('The document is already prepared for close.');\n }\n }\n\n private enqueueOperation<T>(operation: () => Promise<T>): Promise<T> {\n const run = this.operationTail.then(operation, operation);\n this.operationTail = run.then(\n () => undefined,\n () => undefined,\n );\n return run;\n }\n\n private createSnapshot(): DocumentSessionSnapshot {\n return Object.freeze({\n targetKey: this.target?.key ?? null,\n content: this.content,\n revision: this.revision,\n persistedRevision: this.persistedRevision,\n persistedContent: this.persistedContent,\n savingRevision: this.savingRevision,\n generation: this.generation,\n status: this.computeStatus(),\n lifecycle: this.lifecycle,\n frozen: this.frozen,\n error: this.error,\n conflict: this.conflict,\n });\n }\n\n private computeStatus(): DocumentSessionStatus {\n if (this.lifecycle === 'closed') return 'closed';\n if (!this.target) return 'idle';\n if (this.conflict) return 'conflict';\n if (this.error) return 'error';\n if (this.savingRevision !== null) return 'saving';\n return this.persistedRevision < this.revision ? 'dirty' : 'saved';\n }\n\n private emit(): void {\n this.snapshot = this.createSnapshot();\n for (const listener of [...this.listeners]) listener();\n }\n}\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction normalizeRetryDelays(delays: readonly number[]): readonly number[] {\n return delays.map((delay) => {\n if (!Number.isFinite(delay) || delay < 0) {\n throw new TypeError('Autosave retry delays must be finite, non-negative numbers.');\n }\n return Math.floor(delay);\n });\n}\n","import { getFileSystemProviderV2, type FileSystemProvider } from '../filesystem/types.js';\nimport { FsError } from '../filesystem/fs-error.js';\nimport { parseWorkspacePath } from '../filesystem/workspace-path.js';\nimport { DocumentCommitConflictError } from './document-session.js';\nimport type { DocumentCommitTarget, DocumentExternalVersion } from './types.js';\n\nexport interface FileSystemDocumentTargetOptions {\n /**\n * Compare the current file with the session's persisted baseline before\n * replacing it. Enabled by default.\n */\n verifyExternalChanges?: boolean;\n onCommitted?: (content: string, revision: number) => void;\n}\n\n/**\n * Adapt a FileSystemProvider path to the commit protocol used by\n * DocumentSession. The optimistic read catches external edits/deletions\n * before a local write recreates or silently replaces them.\n */\nexport function createFileSystemDocumentTarget(\n provider: FileSystemProvider,\n path: string,\n options: FileSystemDocumentTargetOptions = {},\n): DocumentCommitTarget {\n const verifyExternalChanges = options.verifyExternalChanges ?? true;\n const canonicalPath = parseWorkspacePath(path);\n const providerV2 = getFileSystemProviderV2(provider);\n return {\n key: provider.id + ':' + canonicalPath,\n async commit(request) {\n if (providerV2 && providerV2.capabilities.conditionalWrite !== 'none') {\n const current = await providerV2.readFile(canonicalPath);\n const currentContent = current ? new TextDecoder().decode(current.data) : null;\n if (currentContent !== request.persistedContent && currentContent !== request.content) {\n throw new DocumentCommitConflictError(\n 'The document changed outside DocBlocks: ' + path,\n currentContent,\n current?.entry.version ?? null,\n );\n }\n if (currentContent === request.content) {\n options.onCommitted?.(request.content, request.revision);\n return { version: current?.entry.version ?? null };\n }\n\n try {\n const committed = await providerV2.writeFile(\n canonicalPath,\n new TextEncoder().encode(request.content),\n {\n mode: current ? 'replace' : 'create',\n createParents: true,\n expectedVersion: current?.entry.version ?? null,\n },\n );\n options.onCommitted?.(request.content, request.revision);\n return { version: committed.version };\n } catch (error: unknown) {\n if (\n error instanceof FsError &&\n (error.code === 'conflict' ||\n error.code === 'already-exists' ||\n error.code === 'not-found')\n ) {\n const external = await providerV2.readFile(canonicalPath);\n throw new DocumentCommitConflictError(\n 'The document changed outside DocBlocks: ' + path,\n external ? new TextDecoder().decode(external.data) : null,\n external?.entry.version ?? null,\n );\n }\n throw error;\n }\n }\n\n if (provider.commitFile) {\n const result = await provider.commitFile(path, request.content, request.persistedContent);\n if (result.status === 'conflict') {\n throw new DocumentCommitConflictError(\n 'The document changed outside DocBlocks: ' + path,\n result.content,\n result.version,\n );\n }\n options.onCommitted?.(request.content, request.revision);\n return { version: result.version };\n }\n\n if (verifyExternalChanges) {\n const current = await provider.readFile(path);\n if (current !== request.persistedContent && current !== request.content) {\n const meta = await provider.stat(path).catch(() => null);\n const version: DocumentExternalVersion = meta?.lastModified ?? null;\n throw new DocumentCommitConflictError(\n 'The document changed outside DocBlocks: ' + path,\n current,\n version,\n );\n }\n }\n\n await provider.writeFile(path, request.content);\n options.onCommitted?.(request.content, request.revision);\n const meta = await provider.stat(path).catch(() => null);\n return { version: meta?.lastModified ?? null };\n },\n };\n}\n","/**\n * Synchronous crash-recovery journal for dirty document snapshots.\n *\n * The journal deliberately depends on a tiny injected Storage-like contract\n * instead of reading `window.localStorage` at module load time. This keeps the\n * document package usable in Node, Electron main, VS Code extension hosts, and\n * tests while allowing browser renderers to use localStorage for a best-effort\n * write that completes before the current JavaScript turn ends.\n */\n\nexport const DOCUMENT_RECOVERY_JOURNAL_STORAGE_KEY = 'docblocks:document-recovery:v1';\nexport const DOCUMENT_RECOVERY_JOURNAL_SCHEMA_VERSION = 1;\n\nexport interface DocumentRecoveryStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport interface DocumentRecoveryRecord {\n /** Stable commit-target key, including the workspace/provider scope. */\n targetKey: string;\n /** DocumentSession generation that produced this snapshot. */\n generation: number;\n /** Monotonic DocumentSession revision represented by `content`. */\n revision: number;\n /** Complete markdown snapshot. */\n content: string;\n /**\n * Content last acknowledged by the commit target when this draft was made.\n * Recovery may be applied automatically only when storage still matches this\n * baseline; otherwise the caller must surface an external-change conflict.\n */\n persistedContent: string | null;\n /** Time the dirty record for this target was first created. */\n createdAt: number;\n /** Time the record was most recently replaced. */\n updatedAt: number;\n}\n\nexport interface DocumentRecoveryWrite {\n targetKey: string;\n generation: number;\n revision: number;\n content: string;\n persistedContent: string | null;\n}\n\nexport interface DocumentRecoveryAcknowledgement {\n targetKey: string;\n generation: number;\n /** Highest revision durably acknowledged by the commit target. */\n persistedRevision: number;\n}\n\nexport type DocumentRecoveryWriteFailure =\n | 'invalid-record'\n | 'record-too-large'\n | 'storage-unavailable'\n | 'quota-exceeded';\n\nexport type DocumentRecoveryWriteResult =\n | { status: 'stored'; evicted: number }\n | { status: 'unchanged'; evicted: 0 }\n | { status: 'ignored-stale'; evicted: 0 }\n | { status: 'rejected'; reason: DocumentRecoveryWriteFailure; evicted: number };\n\nexport interface DocumentRecoveryJournalOptions {\n storageKey?: string;\n /** Maximum number of document records retained. Defaults to 20. */\n maxEntries?: number;\n /** Conservative UTF-16 estimate for the whole serialized journal. */\n maxStorageBytes?: number;\n /** Conservative UTF-16 estimate for one serialized record. */\n maxRecordBytes?: number;\n /** Records older than this are discarded while reading. Defaults to 7 days. */\n maxAgeMs?: number;\n /** Tolerated clock skew for records dated in the future. Defaults to 5 minutes. */\n maxFutureSkewMs?: number;\n /** Injected for deterministic tests. */\n now?: () => number;\n}\n\ninterface DocumentRecoveryEnvelope {\n schemaVersion: typeof DOCUMENT_RECOVERY_JOURNAL_SCHEMA_VERSION;\n records: DocumentRecoveryRecord[];\n}\n\ninterface LoadedRecords {\n records: DocumentRecoveryRecord[];\n needsRepair: boolean;\n}\n\ninterface PersistResult {\n stored: boolean;\n evicted: number;\n reason?: 'storage-unavailable' | 'quota-exceeded';\n}\n\nconst DEFAULT_MAX_ENTRIES = 20;\nconst DEFAULT_MAX_STORAGE_BYTES = 2_000_000;\nconst DEFAULT_MAX_RECORD_BYTES = 1_000_000;\nconst DEFAULT_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\nconst DEFAULT_MAX_FUTURE_SKEW_MS = 5 * 60 * 1000;\nconst MAX_TARGET_KEY_LENGTH = 4096;\n\n/**\n * Best-effort, synchronous recovery storage.\n *\n * Normal save acknowledgement is the only automatic path that removes the\n * current record. Explicit discard, age expiry, corruption repair, and bounded\n * eviction are intentional exceptions: callers can discard after the user\n * rejects recovery, and the journal must never grow without limit.\n */\nexport class DocumentRecoveryJournal {\n private readonly storage: DocumentRecoveryStorage | null;\n private readonly storageKey: string;\n private readonly maxEntries: number;\n private readonly maxStorageBytes: number;\n private readonly maxRecordBytes: number;\n private readonly maxAgeMs: number;\n private readonly maxFutureSkewMs: number;\n private readonly now: () => number;\n\n public constructor(\n storage: DocumentRecoveryStorage | null,\n options: DocumentRecoveryJournalOptions = {},\n ) {\n this.storage = storage;\n this.storageKey = options.storageKey?.trim() || DOCUMENT_RECOVERY_JOURNAL_STORAGE_KEY;\n this.maxEntries = positiveInteger(options.maxEntries, DEFAULT_MAX_ENTRIES);\n this.maxStorageBytes = positiveInteger(options.maxStorageBytes, DEFAULT_MAX_STORAGE_BYTES);\n this.maxRecordBytes = Math.min(\n positiveInteger(options.maxRecordBytes, DEFAULT_MAX_RECORD_BYTES),\n this.maxStorageBytes,\n );\n this.maxAgeMs = nonNegativeFinite(options.maxAgeMs, DEFAULT_MAX_AGE_MS);\n this.maxFutureSkewMs = nonNegativeFinite(options.maxFutureSkewMs, DEFAULT_MAX_FUTURE_SKEW_MS);\n this.now = options.now ?? Date.now;\n }\n\n /**\n * Synchronously persist the latest dirty snapshot for a target.\n * Storage/quota failures are returned, never thrown into an editor onChange.\n */\n public write(input: DocumentRecoveryWrite): DocumentRecoveryWriteResult {\n const timestamp = this.now();\n if (!isValidWrite(input) || !Number.isFinite(timestamp) || timestamp < 0) {\n return { status: 'rejected', reason: 'invalid-record', evicted: 0 };\n }\n if (!this.storage) {\n return { status: 'rejected', reason: 'storage-unavailable', evicted: 0 };\n }\n if (\n estimatedBytes(input.content) > this.maxRecordBytes ||\n (input.persistedContent !== null &&\n estimatedBytes(input.persistedContent) > this.maxRecordBytes)\n ) {\n return { status: 'rejected', reason: 'record-too-large', evicted: 0 };\n }\n\n const loaded = this.load(timestamp);\n const existing = loaded.records.find((record) => record.targetKey === input.targetKey);\n if (existing) {\n const ordering = compareGenerationRevision(input, existing);\n if (ordering < 0) return { status: 'ignored-stale', evicted: 0 };\n if (ordering === 0) {\n if (\n existing.content === input.content &&\n existing.persistedContent === input.persistedContent\n ) {\n return { status: 'unchanged', evicted: 0 };\n }\n // A revision is an immutable content snapshot. Reusing it for different\n // content would make acknowledgement and recovery ambiguous.\n return { status: 'rejected', reason: 'invalid-record', evicted: 0 };\n }\n }\n\n const candidate: DocumentRecoveryRecord = {\n targetKey: input.targetKey,\n generation: input.generation,\n revision: input.revision,\n content: input.content,\n persistedContent: input.persistedContent,\n createdAt: existing?.createdAt ?? timestamp,\n updatedAt: timestamp,\n };\n if (estimatedBytes(JSON.stringify(candidate)) > this.maxRecordBytes) {\n return { status: 'rejected', reason: 'record-too-large', evicted: 0 };\n }\n if (estimatedBytes(serializeEnvelope([candidate])) > this.maxStorageBytes) {\n return { status: 'rejected', reason: 'record-too-large', evicted: 0 };\n }\n\n const next = loaded.records.filter((record) => record.targetKey !== input.targetKey);\n next.push(candidate);\n const persisted = this.persistBounded(next, input.targetKey);\n if (!persisted.stored) {\n return {\n status: 'rejected',\n reason: persisted.reason ?? 'quota-exceeded',\n evicted: persisted.evicted,\n };\n }\n return { status: 'stored', evicted: persisted.evicted };\n }\n\n /** Return the recoverable snapshot for one target, if present and valid. */\n public lookup(targetKey: string, generation?: number): DocumentRecoveryRecord | null {\n if (!isValidTargetKey(targetKey) || !isOptionalGeneration(generation)) return null;\n const record = this.load(this.now()).records.find(\n (candidate) =>\n candidate.targetKey === targetKey &&\n (generation === undefined || candidate.generation === generation),\n );\n return record ? cloneRecord(record) : null;\n }\n\n /** List valid records, newest first. Optionally restrict to one target. */\n public list(targetKey?: string): DocumentRecoveryRecord[] {\n if (targetKey !== undefined && !isValidTargetKey(targetKey)) return [];\n return this.load(this.now())\n .records.filter((record) => targetKey === undefined || record.targetKey === targetKey)\n .sort(compareNewestFirst)\n .map(cloneRecord);\n }\n\n /**\n * Clear a record only when the same generation has durably acknowledged at\n * least the journaled revision. A stale acknowledgement cannot erase a newer\n * crash-recovery snapshot.\n */\n public acknowledge(input: DocumentRecoveryAcknowledgement): boolean {\n if (!isValidAcknowledgement(input) || !this.storage) return false;\n const records = this.load(this.now()).records;\n const record = records.find((candidate) => candidate.targetKey === input.targetKey);\n if (\n !record ||\n record.generation !== input.generation ||\n record.revision > input.persistedRevision\n ) {\n return false;\n }\n\n return this.persistExact(records.filter((candidate) => candidate !== record));\n }\n\n /** Explicitly discard recovery data after a user or lifecycle decision. */\n public discard(targetKey: string, generation?: number): boolean {\n if (!isValidTargetKey(targetKey) || !isOptionalGeneration(generation) || !this.storage) {\n return false;\n }\n const records = this.load(this.now()).records;\n const next = records.filter(\n (record) =>\n record.targetKey !== targetKey ||\n (generation !== undefined && record.generation !== generation),\n );\n if (next.length === records.length) return false;\n return this.persistExact(next);\n }\n\n private load(timestamp: number): LoadedRecords {\n if (!this.storage) return { records: [], needsRepair: false };\n\n let raw: string | null;\n try {\n raw = this.storage.getItem(this.storageKey);\n } catch {\n return { records: [], needsRepair: false };\n }\n if (raw === null) return { records: [], needsRepair: false };\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch {\n this.tryRemove();\n return { records: [], needsRepair: true };\n }\n if (!isEnvelope(parsed)) {\n this.tryRemove();\n return { records: [], needsRepair: true };\n }\n\n const byTarget = new Map<string, DocumentRecoveryRecord>();\n let needsRepair = estimatedBytes(raw) > this.maxStorageBytes;\n for (const candidate of parsed.records) {\n if (!isValidStoredRecord(candidate, timestamp, this.maxAgeMs, this.maxFutureSkewMs)) {\n needsRepair = true;\n continue;\n }\n if (estimatedBytes(JSON.stringify(candidate)) > this.maxRecordBytes) {\n needsRepair = true;\n continue;\n }\n const current = byTarget.get(candidate.targetKey);\n if (!current || compareStoredRecords(candidate, current) > 0) {\n if (current) needsRepair = true;\n byTarget.set(candidate.targetKey, cloneRecord(candidate));\n } else {\n needsRepair = true;\n }\n }\n\n const records = [...byTarget.values()].sort(compareNewestFirst);\n while (records.length > this.maxEntries) {\n records.pop();\n needsRepair = true;\n }\n while (\n records.length > 0 &&\n estimatedBytes(serializeEnvelope(records)) > this.maxStorageBytes\n ) {\n records.pop();\n needsRepair = true;\n }\n if (needsRepair) {\n // Best effort only. Read APIs must still return the validated in-memory\n // records even when storage is temporarily unavailable.\n this.persistBounded(records);\n }\n return { records, needsRepair };\n }\n\n private persistBounded(\n records: DocumentRecoveryRecord[],\n protectedTarget?: string,\n ): PersistResult {\n if (!this.storage) {\n return { stored: false, evicted: 0, reason: 'storage-unavailable' };\n }\n\n const next = [...records].sort(compareNewestFirst);\n let evicted = 0;\n while (next.length > this.maxEntries) {\n if (!evictOldest(next, protectedTarget)) break;\n evicted += 1;\n }\n\n let serialized = serializeEnvelope(next);\n while (estimatedBytes(serialized) > this.maxStorageBytes) {\n if (!evictOldest(next, protectedTarget)) {\n return { stored: false, evicted, reason: 'quota-exceeded' };\n }\n evicted += 1;\n serialized = serializeEnvelope(next);\n }\n\n for (;;) {\n try {\n this.storage.setItem(this.storageKey, serialized);\n return { stored: true, evicted };\n } catch {\n if (!evictOldest(next, protectedTarget)) {\n return { stored: false, evicted, reason: 'quota-exceeded' };\n }\n evicted += 1;\n serialized = serializeEnvelope(next);\n }\n }\n }\n\n private persistExact(records: DocumentRecoveryRecord[]): boolean {\n if (!this.storage) return false;\n if (records.length === 0) {\n try {\n this.storage.removeItem(this.storageKey);\n return true;\n } catch {\n return false;\n }\n }\n try {\n this.storage.setItem(this.storageKey, serializeEnvelope(records));\n return true;\n } catch {\n return false;\n }\n }\n\n private tryRemove(): void {\n try {\n this.storage?.removeItem(this.storageKey);\n } catch {\n // Recovery is best effort; a denied cleanup must not fail application startup.\n }\n }\n}\n\n/**\n * Resolve browser localStorage on demand. Importing this module never touches\n * browser globals, and access errors (sandboxing/security settings) yield null.\n */\nexport function getDefaultDocumentRecoveryStorage(): DocumentRecoveryStorage | null {\n try {\n const candidate = Reflect.get(globalThis, 'localStorage') as unknown;\n if (!isStorage(candidate)) return null;\n return candidate;\n } catch {\n return null;\n }\n}\n\nfunction serializeEnvelope(records: DocumentRecoveryRecord[]): string {\n const envelope: DocumentRecoveryEnvelope = {\n schemaVersion: DOCUMENT_RECOVERY_JOURNAL_SCHEMA_VERSION,\n records,\n };\n return JSON.stringify(envelope);\n}\n\n/** localStorage quotas are commonly measured from UTF-16 storage usage. */\nfunction estimatedBytes(value: string): number {\n return value.length * 2;\n}\n\nfunction positiveInteger(value: number | undefined, fallback: number): number {\n return Number.isSafeInteger(value) && (value ?? 0) > 0 ? (value as number) : fallback;\n}\n\nfunction nonNegativeFinite(value: number | undefined, fallback: number): number {\n return Number.isFinite(value) && (value ?? -1) >= 0 ? (value as number) : fallback;\n}\n\nfunction isEnvelope(value: unknown): value is DocumentRecoveryEnvelope {\n if (!isObject(value)) return false;\n return (\n value.schemaVersion === DOCUMENT_RECOVERY_JOURNAL_SCHEMA_VERSION && Array.isArray(value.records)\n );\n}\n\nfunction isValidStoredRecord(\n value: unknown,\n timestamp: number,\n maxAgeMs: number,\n maxFutureSkewMs: number,\n): value is DocumentRecoveryRecord {\n if (!isObject(value)) return false;\n if (\n !isValidTargetKey(value.targetKey) ||\n !isNonNegativeSafeInteger(value.generation) ||\n !isNonNegativeSafeInteger(value.revision) ||\n typeof value.content !== 'string' ||\n (value.persistedContent !== null && typeof value.persistedContent !== 'string') ||\n !isNonNegativeFiniteNumber(value.createdAt) ||\n !isNonNegativeFiniteNumber(value.updatedAt) ||\n value.createdAt > value.updatedAt\n ) {\n return false;\n }\n if (!Number.isFinite(timestamp) || timestamp < 0) return false;\n if (value.updatedAt > timestamp + maxFutureSkewMs) return false;\n return timestamp - value.updatedAt <= maxAgeMs;\n}\n\nfunction isValidWrite(value: DocumentRecoveryWrite): boolean {\n return (\n isValidTargetKey(value.targetKey) &&\n isNonNegativeSafeInteger(value.generation) &&\n isNonNegativeSafeInteger(value.revision) &&\n typeof value.content === 'string' &&\n (value.persistedContent === null || typeof value.persistedContent === 'string')\n );\n}\n\nfunction isValidAcknowledgement(value: DocumentRecoveryAcknowledgement): boolean {\n return (\n isValidTargetKey(value.targetKey) &&\n isNonNegativeSafeInteger(value.generation) &&\n isNonNegativeSafeInteger(value.persistedRevision)\n );\n}\n\nfunction isValidTargetKey(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0 && value.length <= MAX_TARGET_KEY_LENGTH;\n}\n\nfunction isOptionalGeneration(value: number | undefined): boolean {\n return value === undefined || isNonNegativeSafeInteger(value);\n}\n\nfunction isNonNegativeSafeInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isNonNegativeFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isStorage(value: unknown): value is DocumentRecoveryStorage {\n if (!isObject(value)) return false;\n return (\n typeof value.getItem === 'function' &&\n typeof value.setItem === 'function' &&\n typeof value.removeItem === 'function'\n );\n}\n\nfunction compareGenerationRevision(\n left: Pick<DocumentRecoveryRecord, 'generation' | 'revision'>,\n right: Pick<DocumentRecoveryRecord, 'generation' | 'revision'>,\n): number {\n if (left.generation !== right.generation) return left.generation - right.generation;\n return left.revision - right.revision;\n}\n\nfunction compareStoredRecords(left: DocumentRecoveryRecord, right: DocumentRecoveryRecord): number {\n return compareGenerationRevision(left, right) || left.updatedAt - right.updatedAt;\n}\n\nfunction compareNewestFirst(left: DocumentRecoveryRecord, right: DocumentRecoveryRecord): number {\n return right.updatedAt - left.updatedAt || right.revision - left.revision;\n}\n\nfunction cloneRecord(record: DocumentRecoveryRecord): DocumentRecoveryRecord {\n return { ...record };\n}\n\nfunction evictOldest(records: DocumentRecoveryRecord[], protectedTarget?: string): boolean {\n let oldestIndex = -1;\n for (let index = 0; index < records.length; index += 1) {\n if (records[index].targetKey === protectedTarget) continue;\n if (oldestIndex < 0 || compareNewestFirst(records[index], records[oldestIndex]) > 0) {\n oldestIndex = index;\n }\n }\n if (oldestIndex < 0) return false;\n records.splice(oldestIndex, 1);\n return true;\n}\n"],"mappings":"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","names":["meta"]}
|