browser-git-ops 0.0.5 → 0.0.8
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 +104 -14
- package/dist/git/abstractAdapter.d.ts +60 -5
- package/dist/git/abstractAdapter.d.ts.map +1 -1
- package/dist/git/githubAdapter.d.ts +14 -9
- package/dist/git/githubAdapter.d.ts.map +1 -1
- package/dist/git/gitlabAdapter.d.ts +43 -8
- package/dist/git/gitlabAdapter.d.ts.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1359 -1064
- package/dist/index.js.map +3 -3
- package/dist/index.mjs +1356 -1061
- package/dist/index.mjs.map +3 -3
- package/dist/virtualfs/changeTracker.d.ts +1 -0
- package/dist/virtualfs/changeTracker.d.ts.map +1 -1
- package/dist/virtualfs/conflictManager.d.ts +3 -1
- package/dist/virtualfs/conflictManager.d.ts.map +1 -1
- package/dist/virtualfs/indexedDatabaseStorage.d.ts.map +1 -1
- package/dist/virtualfs/inmemoryStorage.d.ts.map +1 -1
- package/dist/virtualfs/localChangeApplier.d.ts +6 -3
- package/dist/virtualfs/localChangeApplier.d.ts.map +1 -1
- package/dist/virtualfs/localFileManager.d.ts.map +1 -1
- package/dist/virtualfs/metadataManager.d.ts.map +1 -1
- package/dist/virtualfs/opfsStorage.d.ts.map +1 -1
- package/dist/virtualfs/remoteSynchronizer.d.ts +114 -17
- package/dist/virtualfs/remoteSynchronizer.d.ts.map +1 -1
- package/dist/virtualfs/storageBackend.d.ts +16 -16
- package/dist/virtualfs/types.d.ts +24 -4
- package/dist/virtualfs/types.d.ts.map +1 -1
- package/dist/virtualfs/utils/urlParser.d.ts +19 -0
- package/dist/virtualfs/utils/urlParser.d.ts.map +1 -0
- package/dist/virtualfs/virtualfs.d.ts +114 -27
- package/dist/virtualfs/virtualfs.d.ts.map +1 -1
- package/package.json +5 -7
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/virtualfs/opfsStorage.ts", "../src/git/abstractAdapter.ts", "../src/git/githubAdapter.ts", "../src/git/gitlabAdapter.ts", "../src/virtualfs/hashUtils.ts", "../src/virtualfs/localChangeApplier.ts", "../src/virtualfs/localFileManager.ts", "../src/virtualfs/indexManager.ts", "../src/virtualfs/changeTracker.ts", "../src/virtualfs/conflictManager.ts", "../src/virtualfs/remoteSynchronizer.ts", "../src/virtualfs/virtualfs.ts", "../src/virtualfs/indexedDatabaseStorage.ts", "../src/virtualfs/metadataManager.ts", "../src/virtualfs/inmemoryStorage.ts"],
|
|
4
|
-
"sourcesContent": ["export { default as VirtualFS } from './virtualfs/virtualfs.ts'\nexport { default as IndexedDatabaseStorage } from './virtualfs/indexedDatabaseStorage.ts'\nexport { default as OpfsStorage } from './virtualfs/opfsStorage.ts'\nexport { default as InMemoryStorage } from './virtualfs/inmemoryStorage.ts'\nexport { default as GitHubAdapter } from './git/githubAdapter.ts'\nexport { default as GitLabAdapter } from './git/gitlabAdapter.ts'\nexport { default } from './virtualfs/virtualfs.ts'\n", "\uFEFFimport { IndexFile } from './types.ts'\nimport { StorageBackend, StorageBackendConstructor } from './storageBackend.ts'\n\nconst ERR_OPFS_DIR_API = 'OPFS directory API not available'\nconst VAR_WORKSPACE = 'workspace'\n// For branch-scoped storage, we store git-managed segments under\n// `.git/{branch}/{segment}` while workspace remains under `workspace`.\nconst SEG_BASE = 'base'\nconst SEG_CONFLICT = 'conflict'\nconst SEG_CONFLICT_BLOB = 'conflictBlob'\nconst SEG_INFO = 'info'\n\n/** OPFS (origin private file system) \u3092\u5229\u7528\u3059\u308B\u6C38\u7D9A\u5316\u5B9F\u88C5 */\nexport const OpfsStorage: StorageBackendConstructor = class OpfsStorage implements StorageBackend {\n /**\n * \u540C\u671F\u7684\u306B OPFS \u5229\u7528\u53EF\u5426\u3092\u5224\u5B9A\u3057\u307E\u3059\uFF08\u30EC\u30AC\u30B7\u30FC\u30D2\u30F3\u30C8\u3082\u542B\u3080\uFF09\u3002\n * @returns {boolean} \u5229\u7528\u53EF\u80FD\u306A\u3089 true\n */\n static canUse(): boolean {\n let ok = false\n const nav = (globalThis as any).navigator\n // If navigator.storage.persist exists, treat as OPFS-capable hint (legacy detection)\n if (nav && nav.storage && typeof nav.storage.persist === 'function') ok = true\n if (nav && nav.storage && typeof nav.storage.getDirectory === 'function') ok = true\n\n if (!ok && (globalThis as any).originPrivateFileSystem && typeof (globalThis as any).originPrivateFileSystem.getDirectory === 'function') ok = true\n return ok\n }\n\n /**\n * Return available root folder names for OPFS. This method is synchronous\n * to satisfy the StorageBackendConstructor contract; it returns a cached\n * hint if available and kicks off an async probe to populate the cache.\n * If no information is available synchronously an empty array is returned.\n * @returns {Promise<string[]>} available root directories\n */\n static async availableRoots(namespace: string): Promise<string[]> {\n try {\n const root = await OpfsStorage._getNavigatorStorageRoot()\n if (!root) return []\n // Find the namespace folder under OPFS root and list its children\n for await (const handle of (root as any).values()) {\n const name = OpfsStorage._extractHandleName(handle)\n if (name === namespace && OpfsStorage._isDirectoryHandle(handle)) {\n return await OpfsStorage._collectDirectoryNames(handle)\n }\n }\n return []\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('availableRoots probe failed', error)\n return []\n }\n }\n\n /**\n * Get OPFS root from navigator.storage.getDirectory()\n * @returns {Promise<any|null>}\n */\n private static async _getNavigatorStorageRoot(): Promise<any | null> {\n const nav = (globalThis as any).navigator\n if (!nav || !nav.storage || typeof nav.storage.getDirectory !== 'function') return null\n return await nav.storage.getDirectory()\n }\n\n /**\n * Collect directory names from OPFS root handle\n * @returns {Promise<string[]>}\n */\n private static async _collectDirectoryNames(root: any): Promise<string[]> {\n const names: string[] = []\n for await (const handle of (root as any).values()) {\n const name = OpfsStorage._extractHandleName(handle)\n if (name && OpfsStorage._isDirectoryHandle(handle)) {\n names.push(name)\n }\n }\n return names\n }\n\n /**\n * Extract name from directory handle\n * @returns {string}\n */\n private static _extractHandleName(handle: any): string {\n return handle && handle.name ? handle.name : ''\n }\n\n /**\n * Check if handle represents a directory\n * @returns {boolean}\n */\n private static _isDirectoryHandle(handle: any): boolean {\n return (\n (handle && handle.kind === 'directory') ||\n typeof (handle && handle.getDirectoryHandle) === 'function' ||\n typeof (handle && handle.getDirectory) === 'function'\n )\n }\n\n /**\n * Returns the known segment variants in search order.\n * @returns {string[]} segment directory names\n */\n private getVariants(): string[] {\n return [VAR_WORKSPACE, SEG_BASE, SEG_CONFLICT, SEG_CONFLICT_BLOB]\n }\n\n private rootDir = 'apigit_storage'\n private currentBranch: string | null = null\n private namespace: string = ''\n\n /**\n * Calculate SHA-1 hex digest of given content.\n * @param content Input string\n * @returns {Promise<string>} Hex encoded SHA-1 digest\n */\n private async shaOf(content: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(content)\n const hashBuffer = await crypto.subtle.digest('SHA-1', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n }\n\n /**\n * \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\uFF08OPFS \u306F\u521D\u671F\u5316\u4E0D\u8981\uFF09\u3002\n * `namespace` \u306F\u5FC5\u9808\u3002\u6319\u52D5:\n * - `new(namespace)` \u306E\u307F\u306E\u5834\u5408\u306F OPFS \u30EB\u30FC\u30C8\u3068\u3057\u3066 `namespace` \u3092\u4F7F\u3046\uFF08\u30C6\u30B9\u30C8\u306E\u671F\u5F85\u5024\u306B\u5408\u308F\u305B\u308B\uFF09\u3002\n * - `new(namespace, root)` \u306E\u5834\u5408\u306F `namespace/root` \u3092\u4F7F\u3046\u3002\n */\n constructor(namespace: string, root?: string) {\n this.namespace = namespace || ''\n if (root) {\n this.rootDir = this.namespace ? `${this.namespace}/${root}` : root\n } else if (this.namespace) {\n // When only namespace provided, treat it as the root directory to match\n // existing test expectations where availableRoots returns a top-level\n // folder name (e.g. 'GitLab_test01').\n this.rootDir = this.namespace\n } else {\n // Fallback to default\n this.rootDir = this.rootDir\n }\n }\n\n /**\n * \u521D\u671F\u5316\uFF08OPFS \u306F\u30E9\u30F3\u30BF\u30A4\u30E0\u5224\u5B9A\u306E\u307F\uFF09\n * @returns {Promise<void>} \u521D\u671F\u5316\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async init(): Promise<void> {\n const root = await this.getOpfsRoot()\n if (!root) return\n\n // If index metadata doesn't exist, create an empty index to initialize the root\n const metaTxt = await this._readIndexMetadata(root)\n if (!metaTxt) {\n const canWriteIndex = typeof (root as any).getDirectoryHandle === 'function' || typeof (root as any).getDirectory === 'function' || typeof (root as any).getFileHandle === 'function'\n if (canWriteIndex) await this.writeIndex({ head: '', entries: {} })\n }\n }\n\n /**\n * Set active branch for storage scoping. Backends that support branch scoping\n * should honor this to isolate base/conflict/info data per branch.\n * @param {string | undefined | null} branch branch name or null\n * @returns {void}\n */\n setBranch(branch?: string | null): void {\n this.currentBranch = branch || null\n }\n\n /**\n * Map logical segment to concrete prefix used on OPFS.\n * @returns {string} concrete prefix path for the given segment\n */\n private _segmentToPrefix(segment: 'workspace' | 'base' | 'conflict' | 'conflictBlob' | 'info'): string {\n // Workspace content is now stored under workspace/base\n if (segment === 'workspace') return `${VAR_WORKSPACE}/base`\n // info for git-managed segments remains under .git/{branch}/info\n const segName = segment === 'base' ? SEG_BASE : segment === 'info' ? SEG_INFO : segment === 'conflictBlob' ? SEG_CONFLICT_BLOB : SEG_CONFLICT\n const branch = this.currentBranch || 'main'\n return `.git/${branch}/${segName}`\n }\n\n /**\n * Try to get OPFS root from navigator.storage.getDirectory().\n * @returns {Promise<any|null>}\n */\n private async _tryNavigatorStorage(): Promise<any | null> {\n const nav = (globalThis as any).navigator\n if (!nav || !nav.storage || typeof nav.storage.getDirectory !== 'function') {\n return null\n }\n try {\n const maybe = nav.storage.getDirectory()\n const d = await Promise.resolve(maybe)\n return d || null\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_tryNavigatorStorage failed', error)\n return null\n }\n }\n\n /**\n * Try to get OPFS root from originPrivateFileSystem.getDirectory().\n * @returns {Promise<any|null>}\n */\n private async _tryOriginPrivateFileSystem(): Promise<any | null> {\n const opfs = (globalThis as any).originPrivateFileSystem\n if (!opfs || typeof opfs.getDirectory !== 'function') {\n return null\n }\n try {\n return await opfs.getDirectory()\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_tryOriginPrivateFileSystem failed', error)\n return null\n }\n }\n\n /**\n * OPFS \u306E\u30EB\u30FC\u30C8\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30CF\u30F3\u30C9\u30EB\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u5931\u6557\u6642\u306F null \u3092\u8FD4\u3059\u3002\n * @returns {Promise<any|null>} \u30EB\u30FC\u30C8\u30CF\u30F3\u30C9\u30EB\u307E\u305F\u306F null\n */\n private async getOpfsRoot(): Promise<any | null> {\n const fromNav = await this._tryNavigatorStorage()\n if (fromNav) return fromNav\n return await this._tryOriginPrivateFileSystem()\n }\n\n /**\n * \u6307\u5B9A\u30D1\u30B9\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u518D\u5E30\u7684\u306B\u4F5C\u6210\u3057\u3066\u8FD4\u3059\n * @returns {Promise<any>} \u751F\u6210\u3055\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30CF\u30F3\u30C9\u30EB\n */\n private async ensureDir(root: any, parts: string[]): Promise<any> {\n let directory = root\n for (const part of parts) {\n if (directory && typeof directory.getDirectoryHandle === 'function') {\n directory = await directory.getDirectoryHandle(part, { create: true })\n } else if (directory && typeof directory.getDirectory === 'function') {\n directory = await directory.getDirectory(part, { create: true })\n } else {\n throw new Error(ERR_OPFS_DIR_API)\n }\n }\n return directory\n }\n\n /**\n * Read index metadata file from OPFS.\n * @returns {Promise<string|null>}\n */\n private async _readIndexMetadata(root: any): Promise<string | null> {\n try {\n const hasDirectoryApi = typeof (root as any).getDirectoryHandle === 'function' || typeof (root as any).getDirectory === 'function'\n if (hasDirectoryApi) {\n const scoped = await this.traverseDir(root, this.rootDir.split('/').filter(Boolean))\n const fh = await scoped.getFileHandle('index')\n const file = await fh.getFile()\n return await file.text()\n }\n const fh = await (root as any).getFileHandle('index')\n const file = await fh.getFile()\n return await file.text()\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_readIndexMetadata failed', error)\n return null\n }\n }\n\n /**\n * index \u3092\u8AAD\u307F\u51FA\u3059\n * @returns {Promise<IndexFile|null>} \u8AAD\u307F\u51FA\u3057\u305F IndexFile\u3001\u5B58\u5728\u3057\u306A\u3051\u308C\u3070 null\n */\n async readIndex(): Promise<IndexFile | null> {\n try {\n const root = await this.getOpfsRoot()\n if (!root) return null\n\n const metaTxt = await this._readIndexMetadata(root)\n\n const result: IndexFile = { head: '', entries: {} }\n if (metaTxt) {\n const parsed = JSON.parse(metaTxt) as any\n result.head = parsed.head || ''\n if (parsed.lastCommitKey) result.lastCommitKey = parsed.lastCommitKey\n if (parsed.adapter) result.adapter = parsed.adapter\n }\n\n // Reconstruct entries by reading all files under the 'info' segment\n await this._readInfoEntries(root, result)\n\n return result\n } catch {\n return { head: '', entries: {} }\n }\n }\n\n /**\n * Read all info entries under VAR_INFO and populate the given IndexFile.entries map.\n * @returns {Promise<void>}\n */\n private async _readInfoEntries(root: any, result: IndexFile): Promise<void> {\n // Load workspace-local info first (workspace/info), then merge git-scoped info (.git/{branch}/info)\n const workspaceInfoPrefix = `${VAR_WORKSPACE}/info`\n await this._readFilesIntoEntries(root, workspaceInfoPrefix, result, true)\n\n // Load git-scoped info, but do not overwrite workspace-local entries\n const gitInfoPrefix = this._segmentToPrefix('info')\n await this._readFilesIntoEntries(root, gitInfoPrefix, result, false)\n }\n\n /**\n * Read files at the given prefix and populate result.entries.\n * If `overwrite` is true, entries will be overwritten; otherwise existing entries are preserved.\n * @returns {Promise<void>}\n */\n private async _readFilesIntoEntries(root: any, prefix: string, result: IndexFile, overwrite: boolean): Promise<void> {\n const files = await this.listFilesAtPrefix(root, prefix).catch(() => [])\n for (const fp of files) {\n if (!overwrite && result.entries[fp]) continue\n const txt = await this.readFromPrefix(root, prefix, fp).catch(() => null)\n if (!txt) continue\n try {\n result.entries[fp] = JSON.parse(txt) as any\n } catch {\n continue\n }\n }\n }\n\n /**\n * index \u3092\u66F8\u304D\u8FBC\u3080\n * @returns {Promise<void>} \u66F8\u8FBC\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async writeIndex(index: IndexFile): Promise<void> {\n const root = await this.getOpfsRoot()\n if (!root) throw new Error('OPFS not available')\n\n // Write each entry separately to the 'info' segment\n const entries = index.entries || {}\n // Persist index entries into workspace-local info (workspace/info)\n // Only create workspace/info entries for files that actually exist in workspace/base\n for (const filepath of Object.keys(entries)) {\n const entry = entries[filepath]\n const existsWorkspace = await this.readFromPrefix(root, `${VAR_WORKSPACE}/base`, filepath).catch(() => null)\n if (existsWorkspace !== null) {\n // store each IndexEntry JSON under workspace/info using the filepath as key\n await this._writeToPrefix(root, `${VAR_WORKSPACE}/info`, filepath, JSON.stringify(entry))\n continue\n }\n // If workspace base absent, persist into git-scoped info so readIndex\n // can reconstruct entries (tests expect entries persisted even when\n // workspace copies are not present).\n const gitInfoPrefix = this._segmentToPrefix('info')\n await this._writeToPrefix(root, gitInfoPrefix, filepath, JSON.stringify(entry))\n }\n\n // Persist index metadata (without entries), include adapter meta when present\n const meta: any = { head: index.head }\n if (index.lastCommitKey) meta.lastCommitKey = index.lastCommitKey\n if ((index as any).adapter) meta.adapter = (index as any).adapter\n\n const hasDirectoryApi = typeof (root as any).getDirectoryHandle === 'function' || typeof (root as any).getDirectory === 'function'\n const payload = JSON.stringify(meta)\n if (hasDirectoryApi) {\n const parts = this.rootDir.split('/').filter(Boolean)\n const parent = await this.ensureDir(root, parts)\n const fh = await parent.getFileHandle('index', { create: true })\n const writable = await fh.createWritable()\n await writable.write(payload)\n await writable.close()\n return\n }\n // fallback: root supports getFileHandle directly\n const fh = await (root as any).getFileHandle('index', { create: true })\n const writable = await fh.createWritable()\n await writable.write(payload)\n await writable.close()\n }\n\n /**\n * blob \u3092\u66F8\u304D\u8FBC\u3080\n * @returns {Promise<void>} \u66F8\u8FBC\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async writeBlob(filepath: string, content: string, segment?: 'workspace' | 'base' | 'conflict' | 'conflictBlob' | 'info'): Promise<void> {\n // Support special pseudo-segments to persist/read info explicitly\n const seg: 'workspace' | 'base' | 'conflict' | 'conflictBlob' | 'info' | 'info-workspace' | 'info-git' = (segment ?? 'workspace') as any\n const root = await this.getOpfsRoot()\n if (!root) throw new Error('OPFS not available')\n // Determine destination for actual blob write\n if (seg === 'info-workspace') {\n // writing index entry into workspace/info\n await this._writeToPrefix(root, `${VAR_WORKSPACE}/info`, filepath, content)\n return\n }\n const prefix = this._segmentToPrefix(seg as any)\n // write actual blob\n await this._writeToPrefix(root, prefix, filepath, content)\n\n // if writing to info segment itself, do not create recursive info entry\n if (seg === 'info' || seg === 'conflictBlob') return\n\n // create/update corresponding info entry summarizing this file\n const sha = await this.shaOf(content)\n const now = Date.now()\n await this._updateInfoForWrite(root, seg as any, filepath, sha, now)\n }\n\n /**\n * Build and persist info metadata for a file written to a segment.\n * @returns {Promise<void>}\n */\n private async _updateInfoForWrite(root: any, seg: 'workspace' | 'base' | 'conflict' | 'conflictBlob' | 'info', filepath: string, sha: string, now: number): Promise<void> {\n if (seg === 'conflictBlob') return\n const existing = await this._getExistingInfo(root, seg, filepath)\n\n let entry: any = { path: filepath, updatedAt: now }\n if (seg === 'workspace') entry = this._buildWorkspaceEntry(existing, filepath, sha, now)\n else if (seg === 'base') entry = this._buildBaseEntry(existing, filepath, sha, now)\n else if (seg === 'conflict') entry = this._buildConflictEntry(existing, filepath, now)\n\n // Persist info: workspace writes go to workspace/info, other segments to git-scoped info\n const targetPrefix = seg === 'workspace' ? `${VAR_WORKSPACE}/info` : this._segmentToPrefix('info')\n await this._writeToPrefix(root, targetPrefix, filepath, JSON.stringify(entry))\n }\n\n /**\n * Attempt to load existing info metadata used as basis when updating info.\n * @returns {Promise<any>} parsed existing info object or empty object\n */\n private async _getExistingInfo(root: any, seg: 'workspace' | 'base' | 'conflict' | 'conflictBlob' | 'info', filepath: string): Promise<any> {\n try {\n if (seg === 'workspace') {\n const gitBase = await this.readFromPrefix(root, this._segmentToPrefix('base'), filepath).catch(() => null)\n if (gitBase !== null) {\n const existingTxt = await this.readFromPrefix(root, this._segmentToPrefix('info'), filepath).catch(() => null)\n return existingTxt ? JSON.parse(existingTxt) : {}\n }\n const existingTxt = await this.readFromPrefix(root, `${VAR_WORKSPACE}/info`, filepath).catch(() => null)\n return existingTxt ? JSON.parse(existingTxt) : {}\n }\n const existingTxt = await this.readFromPrefix(root, this._segmentToPrefix('info'), filepath).catch(() => null)\n return existingTxt ? JSON.parse(existingTxt) : {}\n } catch {\n return {}\n }\n }\n\n /**\n * Build info entry for workspace writes.\n * @returns {any}\n */\n private _buildWorkspaceEntry(existing: any, filepath: string, sha: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.baseSha) entry.baseSha = existing.baseSha\n entry.workspaceSha = sha\n entry.state = entry.baseSha ? 'modified' : 'added'\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n return entry\n }\n\n /**\n * Build info entry for base writes.\n * @returns {any}\n */\n private _buildBaseEntry(existing: any, filepath: string, sha: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.workspaceSha) entry.workspaceSha = existing.workspaceSha\n entry.baseSha = sha\n entry.state = 'base'\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n return entry\n }\n\n /**\n * Build info entry for conflict writes.\n * @returns {any}\n */\n private _buildConflictEntry(existing: any, filepath: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.baseSha) entry.baseSha = existing.baseSha\n if (existing && existing.workspaceSha) entry.workspaceSha = existing.workspaceSha\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n entry.state = 'conflict'\n return entry\n }\n\n /**\n * Write content to a file under given prefix, creating directories as needed.\n */\n private async _writeToPrefix(root: any, prefix: string, filepath: string, content: string): Promise<void> {\n const fullPath = this.rootDir ? `${this.rootDir}/${prefix}/${filepath}` : `${prefix}/${filepath}`\n const parts = fullPath.split('/').filter(Boolean)\n const directoryParts = parts.slice(0, parts.length - 1)\n const parent = await this.ensureDir(root, directoryParts)\n const fh = await parent.getFileHandle(parts[parts.length - 1], { create: true })\n const writable = await fh.createWritable()\n await writable.write(content)\n await writable.close()\n }\n\n /**\n * Read text from a file handle returning null on failure.\n * @param fh File handle\n * @returns {Promise<string|null>} file text or null\n */\n private async _readFileFromHandle(fh: any): Promise<string | null> {\n try {\n const file = await fh.getFile()\n const txt = await file.text()\n return txt ?? null\n } catch {\n return null\n }\n }\n\n /**\n * blob \u3092\u8AAD\u307F\u51FA\u3059\n * @returns {Promise<string|null>} \u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\u3001\u5B58\u5728\u3057\u306A\u3051\u308C\u3070 null\n */\n async readBlob(filepath: string, segment?: any): Promise<string | null> {\n const root = await this.getOpfsRoot()\n if (!root) return null\n return await this._readBlobFromRoot(root, segment, filepath)\n }\n\n /**\n * Read blob from a resolved root. Extracted to reduce cognitive complexity of public entry.\n * @returns {Promise<string|null>}\n */\n private async _readBlobFromRoot(root: any, segment: 'workspace' | 'base' | 'conflict' | 'conflictBlob' | 'info' | undefined, filepath: string): Promise<string | null> {\n // segment\u6307\u5B9A\u304C\u3042\u308B\u5834\u5408\u306F\u305D\u306E\u307E\u307E\u8FD4\u5374\n if (segment !== undefined) {\n return await this._readFromSegment(root, segment, filepath)\n }\n\n // segment\u672A\u6307\u5B9A\u306E\u5834\u5408\u306Fworkspace\u2192base\u306E\u9806\u3067\u53C2\u7167\n const workspaceContent = await this._readFromSegment(root, 'workspace', filepath)\n if (workspaceContent !== null) return workspaceContent\n return await this._readFromSegment(root, 'base', filepath)\n }\n\n /**\n * Read from a specific segment prefix.\n * @returns {Promise<string|null>} file text or null\n */\n private async _readFromSegment(root: any, segment: 'workspace' | 'base' | 'conflict' | 'conflictBlob' | 'info' | 'info-git' | 'info-workspace', filepath: string): Promise<string | null> {\n try {\n if (segment === 'info') {\n // prefer workspace-local info first, then git-scoped info\n const ws = await this.readFromPrefix(root, `${VAR_WORKSPACE}/info`, filepath).catch(() => null)\n if (ws !== null) return ws\n return await this.readFromPrefix(root, this._segmentToPrefix('info'), filepath).catch(() => null)\n }\n // read git-only info\n if (segment === 'info-git') {\n return await this.readFromPrefix(root, this._segmentToPrefix('info'), filepath).catch(() => null)\n }\n // read workspace-only info\n if (segment === 'info-workspace') {\n return await this.readFromPrefix(root, `${VAR_WORKSPACE}/info`, filepath).catch(() => null)\n }\n const prefix = this._segmentToPrefix(segment)\n return await this.readFromPrefix(root, prefix, filepath)\n } catch {\n return null\n }\n }\n\n /**\n * Read by trying each variant in order and returning first match.\n * @returns {Promise<string|null>} file text or null\n */\n private async _readFromVariants(root: any, filepath: string): Promise<string | null> {\n for (const v of this.getVariants()) {\n const prefix = v === VAR_WORKSPACE ? this._segmentToPrefix('workspace') : this._segmentToPrefix(v as any)\n const txt = await this.readFromPrefix(root, prefix, filepath)\n if (txt !== null) return txt\n }\n return null\n }\n\n /**\n * blob \u3092\u524A\u9664\u3059\u308B\n * @returns {Promise<void>} \u524A\u9664\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async deleteBlob(filepath: string, segment?: any): Promise<void> {\n const root = await this.getOpfsRoot()\n if (!root) return\n if (segment === 'workspace') {\n // remove workspace blob and corresponding workspace/info entry\n await this.removeAtPrefix(root, this._segmentToPrefix('workspace'), filepath)\n await this.removeAtPrefix(root, `${VAR_WORKSPACE}/info`, filepath)\n return\n }\n if (segment === 'base') { await this.removeAtPrefix(root, this._segmentToPrefix('base'), filepath); return }\n if (segment === 'conflict') { await this.removeAtPrefix(root, this._segmentToPrefix('conflict'), filepath); return }\n if (segment === 'conflictBlob') { await this.removeAtPrefix(root, this._segmentToPrefix('conflictBlob'), filepath); return }\n if (segment === 'info') {\n // delete workspace-local info and git-scoped info for this branch\n await this.removeAtPrefix(root, `${VAR_WORKSPACE}/info`, filepath)\n await this.removeAtPrefix(root, this._segmentToPrefix('info'), filepath)\n return\n }\n\n for (const v of this.getVariants()) {\n const prefix = v === VAR_WORKSPACE ? this._segmentToPrefix('workspace') : this._segmentToPrefix(v as any)\n await this.removeAtPrefix(root, prefix, filepath)\n }\n // also remove any info entries (workspace-local and git-scoped)\n await this.removeAtPrefix(root, `${VAR_WORKSPACE}/info`, filepath)\n await this.removeAtPrefix(root, this._segmentToPrefix('info'), filepath)\n }\n\n /**\n * Remove a file at a given prefix (does not create directories)\n * @param root root directory handle\n * @param prefix prefix dir\n * @param filepath path relative to prefix\n * @returns {Promise<void>} resolves when removal attempted (errors are ignored)\n */\n private async removeAtPrefix(root: any, prefix: string, filepath: string): Promise<void> {\n const full = this.rootDir ? `${this.rootDir}/${prefix}/${filepath}` : `${prefix}/${filepath}`\n const parts = full.split('/').filter(Boolean)\n let directory: any\n // \u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304C\u5B58\u5728\u3057\u306A\u3044\u5834\u5408\uFF08NotFound\uFF09\u306F\u524A\u9664\u5BFE\u8C61\u306A\u3057\u3068\u3057\u3066\u7D42\u4E86\n try {\n directory = await this.traverseDir(root, parts.slice(0, parts.length - 1))\n } catch {\n return\n }\n const name = parts[parts.length - 1]\n if (typeof directory.removeEntry === 'function') {\n try {\n await directory.removeEntry(name)\n } catch {\n // removeEntry\u304C\u5931\u6557\u3057\u3066\u3082\u7121\u8996\uFF08\u5B58\u5728\u3057\u306A\u3044\u7B49\uFF09\n }\n return\n }\n if (typeof directory.getFileHandle === 'function') {\n await this.tryRemoveFileHandle(directory, name)\n\n }\n }\n\n /**\n * Read a file under a prefix without throwing. Returns null when not found.\n * @param root root directory handle\n * @param prefix prefix dir\n * @param filepath path relative to prefix\n * @returns {Promise<string|null>} file contents or null when not found\n */\n private async readFromPrefix(root: any, prefix: string, filepath: string): Promise<string | null> {\n // reuse existing traversal logic but guard errors\n try {\n const fullPath = this.rootDir ? `${this.rootDir}/${prefix}/${filepath}` : `${prefix}/${filepath}`\n const parts = fullPath.split('/').filter(Boolean)\n const directory = await this.traverseDir(root, parts.slice(0, parts.length - 1))\n const fh = await directory.getFileHandle(parts[parts.length - 1])\n return await this._readFileFromHandle(fh)\n } catch {\n return null\n }\n }\n\n /**\n * Traverse into nested directories without creating them.\n * @param root The starting directory handle\n * @param parts Path parts to traverse\n * @returns The final directory handle\n */\n private async traverseDir(root: any, parts: string[]): Promise<any> {\n let directory = root\n for (const part of parts) {\n if (directory && typeof directory.getDirectoryHandle === 'function') {\n directory = await directory.getDirectoryHandle(part)\n } else if (directory && typeof directory.getDirectory === 'function') {\n directory = await directory.getDirectory(part)\n } else {\n throw new Error(ERR_OPFS_DIR_API)\n }\n }\n return directory\n }\n\n /**\n * List all file paths under given prefix (relative paths).\n * @returns {Promise<string[]>} Array of relative file paths; empty array on failure\n */\n private async listFilesAtPrefix(root: any, prefix: string): Promise<string[]> {\n try {\n const prefixParts = prefix ? prefix.split('/').filter(Boolean) : []\n const parts = this.rootDir ? this.rootDir.split('/').filter(Boolean).concat(prefixParts) : prefixParts\n const directory = await this.traverseDir(root, parts)\n const results: string[] = []\n await this._recurseListDir(directory, '', results)\n return results\n } catch {\n return []\n }\n }\n\n /**\n * Helper to recursively walk directory handles and collect file paths.\n * @returns {Promise<void>}\n */\n private async _recurseListDir(d: any, base: string, results: string[]): Promise<void> {\n // Prefer entries() async iterator; if unavailable, delegate to fallback.\n try {\n for await (const pair of (d as any).entries()) {\n await this._processEntryPair(pair, base, results)\n }\n return\n } catch {\n return\n }\n }\n\n /**\n * Process a single entry returned by entries(): push files or recurse into directories.\n * @returns {Promise<void>}\n */\n private async _processEntryPair(pair: any, base: string, results: string[]): Promise<void> {\n const name = Array.isArray(pair) ? pair[0] : (pair.name || '')\n const handle = Array.isArray(pair) ? pair[1] : (pair[1] || pair)\n const childPath = base ? `${base}/${name}` : name\n if ((handle as any).kind === 'file' || typeof (handle as any).getFile === 'function') {\n results.push(childPath)\n } else {\n await this._recurseListDir(handle, childPath, results)\n }\n }\n\n /**\n * Fallback recursion over directory when entries() iterator unavailable.\n * @returns {Promise<void>}\n */\n private async _recurseListDirFallback(d: any, base: string, results: string[]): Promise<void> {\n for await (const name of (d as any).keys()) {\n await this._handleChildEntry(d, name, base, results)\n }\n }\n \n /**\n * @returns {Promise<void>}\n */\n private async _handleChildEntry(d: any, name: string, base: string, results: string[]): Promise<void> {\n const childPath = base ? `${base}/${name}` : name\n if (typeof d.getFileHandle === 'function') {\n try {\n const fh = await d.getFileHandle(name)\n if (fh) { results.push(childPath); return }\n } catch {\n return\n }\n }\n if (typeof d.getDirectoryHandle === 'function') {\n try {\n const childDirectory = await d.getDirectoryHandle(name)\n await this._recurseListDir(childDirectory, childPath, results)\n } catch {\n return\n }\n }\n }\n\n /**\n * Safely list files at prefix, returning an empty array on error.\n * @returns {Promise<string[]>}\n */\n private async _safeListFilesAtPrefix(root: any, segPrefix: string): Promise<string[]> {\n return this.listFilesAtPrefix(root, segPrefix).catch(() => [])\n }\n\n /**\n * Collect info objects for given keys under VAR_INFO\n * @returns {Promise<Array<{ path: string; info: string | null }>>}\n */\n private async _collectInfoForKeys(root: any, keys: string[]): Promise<Array<{ path: string; info: string | null }>> {\n const out: Array<{ path: string; info: string | null }> = []\n const infoPrefix = this._segmentToPrefix('info') // existing line\n const wsInfoPrefix = `${VAR_WORKSPACE}/info` // new line\n for (const k of keys) {\n let info: string | null = await this.readFromPrefix(root, wsInfoPrefix, k).catch(() => null)\n if (info === null) info = await this.readFromPrefix(root, infoPrefix, k).catch(() => null)\n out.push({ path: k, info }) // existing line\n }\n return out\n }\n\n /**\n * \u6307\u5B9A\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u914D\u4E0B\u306E\u30D5\u30A1\u30A4\u30EB\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param prefix \u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\uFF08\u4F8B: 'dir/sub'\uFF09\u3002\u7701\u7565\u6642\u306F\u30EB\u30FC\u30C8\n * @param segment \u30BB\u30B0\u30E1\u30F3\u30C8\uFF08'workspace' \u7B49\uFF09\u3002\u7701\u7565\u6642\u306F 'workspace'\n * @param recursive \u30B5\u30D6\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3082\u542B\u3081\u308B\u304B\u3002\u7701\u7565\u6642\u306F true\n * @returns {Promise<Array<{ path: string; info: string | null }>>}\n */\n async listFiles(prefix?: string, segment?: any, recursive = true): Promise<Array<{ path: string; info: string | null }>> {\n const root = await this.getOpfsRoot()\n if (!root) return []\n const seg: 'workspace' | 'base' | 'conflict' | 'info' = segment ?? 'workspace'\n const segPrefix = this._segmentToPrefix(seg)\n\n // Return a plain array of relative file path strings; tests for OpfsStorage expect strings\n const keys = await this._safeListFilesAtPrefix(root, segPrefix)\n const p = prefix ? prefix.replace(/^\\/+|\\/+$/g, '') : ''\n const filtered = this._filterKeys(keys, p, recursive)\n // Return array of objects { path, info } as required by StorageBackend interface\n return await this._collectInfoForKeys(root, filtered)\n }\n\n /**\n * Raw listing that returns implementation-specific URIs and a normalized path.\n * @param prefix optional prefix to filter\n * @param recursive whether to include subdirectories\n * @returns {Promise<Array<{uri:string,path:string,info?:string|null}>>} array of entries with uri/path/info\n */\n async listFilesRaw(prefix?: string, recursive = true): Promise<Array<{ uri: string; path: string; info?: string | null }>> {\n const navRoot = await OpfsStorage._getNavigatorStorageRoot()\n if (!navRoot) return []\n\n const storageDirectory = await this._findStorageDirectory(navRoot)\n if (!storageDirectory) return []\n\n const results: string[] = []\n await this._recurseListDir(storageDirectory, '', results)\n\n const p = prefix ? prefix.replace(/^\\/+|\\/+$/g, '') : ''\n const keys = this._filterKeys(results, p, recursive)\n\n const out: Array<{ uri: string; path: string; info?: string | null }> = []\n for (const k of keys) {\n const uri = `${this.rootDir}/${k}`\n const info = await this._getInfoForOpfsKey(navRoot, k)\n out.push({ uri, path: uri, info })\n }\n return out\n }\n\n /**\n * Locate the configured storage root directory handle under navigator.storage root.\n * @returns {Promise<any|null>} directory handle or null when not found\n */\n private async _findStorageDirectory(navRoot: any): Promise<any | null> {\n try {\n const parts = this.rootDir.split('/').filter(Boolean)\n const directoryHandle = await this.traverseDir(navRoot, parts)\n return directoryHandle\n } catch {\n return null\n }\n }\n\n /**\n * Read info metadata for a given key from workspace-local info or git-scoped info.\n * @returns {Promise<string|null>} JSON string or null when absent\n */\n private async _getInfoForOpfsKey(navRoot: any, key: string): Promise<string | null> {\n try {\n const ws = await this.readFromPrefix(navRoot, `${VAR_WORKSPACE}/info`, key).catch(() => null)\n if (ws !== null) return ws\n return await this.readFromPrefix(navRoot, this._segmentToPrefix('info'), key).catch(() => null)\n } catch {\n return null\n }\n }\n\n /**\n * Filter keys by prefix and recursion flag for OPFS listing\n * @returns {string[]}\n */\n private _filterKeys(keys: string[], p: string, recursive: boolean): string[] {\n let out = keys\n if (p) out = out.filter((k) => k === p || k.startsWith(p + '/'))\n if (!recursive) {\n out = out.filter((k) => {\n const rest = p ? k.slice(p.length + 1) : k\n return !rest.includes('/')\n })\n }\n return out\n }\n\n /**\n * Try to remove a file via its file handle.\n * @returns {Promise<boolean>} true when removed, false otherwise\n */\n private async tryRemoveFileHandle(directory: any, name: string): Promise<boolean> {\n try {\n const fh = await directory.getFileHandle(name)\n if (fh && typeof (fh as any).remove === 'function') {\n await (fh as any).remove()\n return true\n }\n return false\n } catch {\n // getFileHandle/remove \u304C\u4F8B\u5916\u3092\u6295\u3052\u305F\u5834\u5408\u306F\u524A\u9664\u3067\u304D\u306A\u304B\u3063\u305F\u3068\u6271\u3046\n return false\n }\n }\n\n /**\n * \u6307\u5B9A\u3055\u308C\u305F\u30EB\u30FC\u30C8\u540D\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u524A\u9664\u3057\u307E\u3059\n * @param rootName \u524A\u9664\u3059\u308B\u30EB\u30FC\u30C8\u540D\n * @returns {Promise<void>}\n */\n static async delete(rootName: string): Promise<void> {\n try {\n const root = await OpfsStorage._getNavigatorStorageRoot()\n if (!root) throw new Error('OPFS root not available')\n\n if (typeof (root as any).removeEntry === 'function') {\n await (root as any).removeEntry(rootName, { recursive: true })\n } else {\n throw new Error('removeEntry not supported')\n }\n } catch (error) {\n throw new Error(`Failed to delete OPFS root \"${rootName}\": ${String(error)}`)\n }\n }\n}\n\nexport default OpfsStorage\n\n", "// Shared abstractions and helpers for Git adapters\nexport type FetchWithRetryFunction = (_input: RequestInfo, _init: RequestInit, _attempts?: number, _baseDelay?: number) => Promise<Response>\n\nconst RETRY_AFTER_HEADER = 'Retry-After'\nconst RETRY_AFTER_HEADER_LOWER = 'retry-after'\n\n/**\n * Simple logger interface for dependency injection.\n * If a caller injects an object matching this interface, the adapter\n * will forward debug/info/warn/error messages to it. If no logger is\n * provided, no logging will be performed by the adapter.\n */\nexport interface Logger {\n debug: (..._messages: any[]) => void\n info: (..._messages: any[]) => void\n warn: (..._messages: any[]) => void\n error: (..._messages: any[]) => void\n}\n\n/**\n * Compute SHA-1 of string content using Web Crypto\n * @param content The input string\n * @returns Promise resolving to hex-encoded SHA-1\n */\nexport async function shaOf(content: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(content)\n const buf = await crypto.subtle.digest('SHA-1', data)\n return Array.from(new Uint8Array(buf)).map((b) => b.toString(16).padStart(2, '0')).join('')\n}\n\n/**\n * Determine whether an HTTP status should be considered retryable\n * @param status HTTP status code\n * @returns true if retryable (5xx or 429)\n */\nexport function classifyStatus(status: number): boolean {\n return status >= 500 || status === 429\n}\n\n/**\n * Calculate delay before retrying based on response or exponential backoff\n * @param response Response or null when not available\n * @param index Attempt index (0-based)\n * @param baseDelay Base delay in ms\n * @returns delay in milliseconds\n */\nexport function getDelayForResponse(response: Response | null, index: number, baseDelay: number): number {\n if (!response) return baseDelay * Math.pow(2, index) + Math.random() * 100\n try {\n const hdrs: any = (response as any).headers\n let retryAfter\n if (hdrs && typeof hdrs.get === 'function') {\n retryAfter = hdrs.get(RETRY_AFTER_HEADER) || hdrs.get(RETRY_AFTER_HEADER_LOWER)\n } else if (hdrs && typeof hdrs[RETRY_AFTER_HEADER] !== 'undefined') {\n retryAfter = hdrs[RETRY_AFTER_HEADER] || hdrs[RETRY_AFTER_HEADER_LOWER]\n }\n return retryAfter ? Number(retryAfter) * 1000 : baseDelay * Math.pow(2, index) + Math.random() * 100\n } catch {\n return baseDelay * Math.pow(2, index) + Math.random() * 100\n }\n}\n\n/**\n * Process HTTP response and throw on non-ok. If retryable, delay before throwing.\n * @param response Fetch Response\n * @param index Attempt index\n * @param baseDelay Base delay in ms\n * @returns Promise resolving to the response when ok\n */\nexport async function processResponseWithDelay(response: Response, index: number, baseDelay: number): Promise<Response> {\n if (response.ok) return response\n if (classifyStatus(response.status)) {\n await new Promise((r) => setTimeout(r, getDelayForResponse(response, index, baseDelay)))\n throw new RetryableError(`Retryable HTTP ${response.status}`)\n }\n const txt = await response.text().catch(() => '')\n throw new NonRetryableError(`HTTP ${response.status}: ${txt}`)\n}\n\n/**\n * Perform fetch with retry/backoff logic\n * @param input RequestInfo\n * @param init RequestInit\n * @param attempts number of attempts\n * @param baseDelay base delay in ms\n * @returns Promise resolving to Response\n */\nexport async function fetchWithRetry(input: RequestInfo, init: RequestInit, attempts = 4, baseDelay = 300): Promise<Response> {\n let lastError: any\n for (let attemptIndex = 0; attemptIndex < attempts; attemptIndex++) {\n try {\n const response = await fetch(input, init)\n return await processResponseWithDelay(response, attemptIndex, baseDelay)\n } catch (error) {\n // Do not retry on NonRetryableError - rethrow immediately\n if (error instanceof NonRetryableError) throw error\n lastError = error\n await new Promise((r) => setTimeout(r, getDelayForResponse(null, attemptIndex, baseDelay)))\n }\n }\n // If lastError is a known adapter error, rethrow it to preserve semantics\n if (lastError instanceof RetryableError || lastError instanceof NonRetryableError) throw lastError\n // For unknown errors, wrap as RetryableError to indicate exhausted retries\n if (lastError instanceof Error) throw new RetryableError(lastError.message)\n throw new RetryableError(String(lastError))\n}\n\n/**\n * Error indicating the operation is retryable and may succeed on later attempts.\n */\nexport class RetryableError extends Error { }\n\n/**\n * Error indicating the operation failed in a non-retryable way.\n */\nexport class NonRetryableError extends Error { }\n\n/**\n * Map items with limited concurrency\n * @template T,R\n * @param items Array of items to map\n * @param mapper Async mapper function\n * @param concurrency concurrency limit\n * @returns Promise resolving to array of mapped results\n */\nexport function mapWithConcurrency<T, R>(items: T[], mapper: (_t: T) => Promise<R>, concurrency = 5): Promise<R[]> {\n const results: R[] = []\n let index = 0\n const runners: Promise<void>[] = []\n /**\n * Worker that consumes items and writes results\n * @returns Promise<void>\n */\n const run = async () => {\n while (index < items.length) {\n const index_ = index++\n if (index_ >= items.length) break\n const r = await mapper(items[index_])\n results[index_] = r\n }\n }\n for (let runnerIndex = 0; runnerIndex < Math.min(concurrency, items.length); runnerIndex++) runners.push(run())\n return Promise.all(runners).then(() => results)\n}\n\n/**\n * Abstract base class providing shared utilities for Git adapters\n */\nexport abstract class AbstractGitAdapter {\n protected baseUrl = ''\n protected headers: Record<string, string> = {}\n protected options: any = {}\n protected logger?: Logger\n protected maxRetries = 4\n protected baseBackoff = 300\n\n /**\n * Construct base adapter\n * @param options adapter options\n */\n constructor(options?: any) {\n this.options = options || {}\n // Allow optional logger injection via options.logger\n if (options && options.logger) this.logger = options.logger as Logger\n }\n\n /**\n * Delegate to shared shaOf implementation\n * @param content input string\n * @returns hex sha1\n */\n protected async shaOf(content: string): Promise<string> {\n return shaOf(content)\n }\n\n /**\n * Replace or set the logger at runtime.\n * Use this if DI happens after construction.\n * @param logger optional logger instance to set (or undefined to clear)\n * @returns void\n */\n public setLogger(logger: Logger | undefined) {\n this.logger = logger\n }\n\n /**\n * Log debug messages when a logger is present.\n * @param _messages messages to log (unused when no logger)\n */\n protected logDebug(..._messages: any[]) {\n if (this.logger && typeof this.logger.debug === 'function') {\n try {\n this.logger.debug(..._messages)\n } catch {\n // Logging errors must not affect adapter behavior; ignore safely\n }\n }\n }\n\n /**\n * Log an informational message if a logger is present.\n * @param args items to log\n */\n protected logInfo(..._messages: any[]) {\n if (this.logger && typeof this.logger.info === 'function') {\n try {\n this.logger.info(..._messages)\n } catch {\n // ignore logging failures\n }\n }\n }\n\n /**\n * Log a warning message if a logger is present.\n * @param args items to log\n */\n protected logWarn(..._messages: any[]) {\n if (this.logger && typeof this.logger.warn === 'function') {\n try {\n this.logger.warn(..._messages)\n } catch {\n // ignore logging failures\n }\n }\n }\n\n /**\n * Log an error message if a logger is present.\n * @param args items to log\n */\n protected logError(..._messages: any[]) {\n if (this.logger && typeof this.logger.error === 'function') {\n try {\n this.logger.error(..._messages)\n } catch {\n // ignore logging failures\n }\n }\n }\n\n /**\n * Normalize different header-like shapes into a plain object.\n * @param headerLike headers in Headers, array, or plain object form\n * @returns plain header map\n */\n private normalizeHeaders(headerLike: any): Record<string, any> {\n const out: Record<string, any> = {}\n try {\n if (!headerLike) return out\n if (typeof (headerLike as any).forEach === 'function') {\n (headerLike as any).forEach((v: any, k: any) => { out[k] = v })\n return out\n }\n if (Array.isArray(headerLike)) {\n for (const [k, v] of headerLike as any) out[k] = v\n return out\n }\n if (typeof headerLike === 'object') {\n Object.assign(out, headerLike)\n }\n } catch {\n // ignore normalization errors\n }\n return out\n }\n\n /**\n * Format a fetch request into a minimal object suitable for logging.\n * @returns formatted request log object\n */\n private formatRequestForLog(input: RequestInfo, init: RequestInit | undefined, attempts: number, baseDelay: number) {\n const requestUrl = typeof input === 'string' ? input : (input as any)?.url || String(input)\n const requestMethod = (init && (init as any).method) || 'GET'\n const requestHeaders = this.normalizeHeaders((init && (init as any).headers) || {})\n const bodyPreview = init && (init as any).body ? (typeof (init as any).body === 'string' ? (init as any).body.slice(0, 200) : '<non-string>') : undefined\n return { url: requestUrl, method: requestMethod, headers: requestHeaders, bodyPreview, attempts, baseDelay }\n }\n\n /**\n * Format a fetch Response into a minimal object suitable for logging.\n * @returns formatted response log object\n */\n private async formatResponseForLog(response: Response) {\n const respHdrs = this.normalizeHeaders(response && (response as any).headers)\n let bodyPreview: string | undefined = undefined\n try {\n if (response && typeof (response as any).clone === 'function') {\n const clone = (response as any).clone()\n if (clone && typeof clone.text === 'function') {\n const txt = await clone.text().catch(() => undefined)\n if (typeof txt === 'string') bodyPreview = txt.slice(0, 500)\n }\n }\n } catch {\n // ignore body read errors\n }\n return { status: response.status, statusText: response.statusText, headers: respHdrs, bodyPreview }\n }\n\n /**\n * Proxy to shared `fetchWithRetry` implementation while emitting\n * minimal request/response logs for debugging and test inspection.\n * @param input fetch input\n * @param init fetch init\n * @param attempts retry attempts\n * @param baseDelay base delay ms\n * @returns Promise resolving to Response\n */\n protected async fetchWithRetry(input: RequestInfo, init: RequestInit, attempts = 4, baseDelay = 300) {\n try {\n const requestLog = this.formatRequestForLog(input, init, attempts, baseDelay)\n this.logDebug({ fetchRequest: requestLog })\n } catch {\n // best-effort logging\n }\n\n try {\n const response = await fetchWithRetry(input, init, attempts, baseDelay)\n try {\n const responseLog = await this.formatResponseForLog(response)\n this.logDebug({ fetchResponse: responseLog })\n } catch {\n // ignore logging failures\n }\n return response\n } catch (fetchError) {\n try {\n this.logDebug({ fetchError: String(fetchError) })\n } catch {\n // ignore\n }\n throw fetchError\n }\n }\n\n /**\n * Determine if a status code is retryable\n * @param status HTTP status code\n * @returns boolean\n */\n protected isRetryableStatus(status: number) {\n return classifyStatus(status)\n }\n\n /**\n * Compute backoff milliseconds for attempt\n * @param attempt attempt number (1..)\n * @returns milliseconds to wait\n */\n protected backoffMs(attempt: number) {\n const base = this.baseBackoff * Math.pow(2, attempt - 1)\n const jitter = Math.floor(Math.random() * base * 0.3)\n return base + jitter\n }\n\n /**\n * Map items with limited concurrency by delegating to the shared helper.\n * @template T,R\n * @param items items to map\n * @param mapper async mapper\n * @param concurrency concurrency limit\n * @returns Promise resolving to mapped results\n */\n protected mapWithConcurrency<T, R>(items: T[], mapper: (_t: T) => Promise<R>, concurrency = 5) {\n return mapWithConcurrency(items, mapper, concurrency)\n }\n}\n\nexport default AbstractGitAdapter\n", "import { GitAdapter } from './adapter.ts'\nimport AbstractGitAdapter, { fetchWithRetry, classifyStatus, getDelayForResponse, processResponseWithDelay, mapWithConcurrency, shaOf, NonRetryableError } from './abstractAdapter.ts'\n\ntype GHOptions = {\n owner: string\n repo: string\n token: string\n host?: string // optional GitHub Enterprise host\n}\n\n\n/**\n * GitHub \u5411\u3051\u306E `GitAdapter` \u5B9F\u88C5\u3002\n * GitHub API \u3092\u30E9\u30C3\u30D7\u3057\u3066\u30EA\u30DD\u30B8\u30C8\u30EA\u64CD\u4F5C\uFF08\u30B3\u30DF\u30C3\u30C8\u4F5C\u6210\u3001\u30D6\u30E9\u30F3\u30C1\u4E00\u89A7\u3001\u30D5\u30A1\u30A4\u30EB\u53D6\u5F97\u7B49\uFF09\u3092\u63D0\u4F9B\u3057\u307E\u3059\u3002\n */\nexport class GitHubAdapter extends AbstractGitAdapter implements GitAdapter {\n private _fetchWithRetry: (_: RequestInfo, __: RequestInit, ___?: number, ____?: number) => Promise<Response>\n private repoMetadata: import('../virtualfs/types.ts').RepositoryMetadata | null = null\n // simple in-memory blob cache: contentSha -> blobSha\n private blobCache: Map<string, string> = new Map()\n\n /**\n * GitHubAdapter \u3092\u521D\u671F\u5316\u3057\u307E\u3059\u3002\n * @param {GHOptions} opts \u8A2D\u5B9A\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n constructor(options: GHOptions) {\n super(options)\n const host = options.host || 'https://api.github.com'\n this.baseUrl = `${host}/repos/${options.owner}/${options.repo}`\n // Only include Authorization header when a token is provided\n this.headers = {\n Accept: 'application/vnd.github+json',\n 'Content-Type': 'application/json',\n }\n const rawToken = options && typeof options.token === 'string' ? options.token.trim() : ''\n if (rawToken) {\n (this.headers as any).Authorization = `token ${rawToken}`\n }\n this._fetchWithRetry = fetchWithRetry\n }\n\n /**\n * List commits for a ref (GitHub commits API)\n * @param {{ref:string,perPage?:number,page?:number}} query\n * @returns {Promise<import('./adapter').CommitHistoryPage>} \u30DA\u30FC\u30B8\u60C5\u5831\u3092\u8FD4\u3057\u307E\u3059\n */\n async listCommits(query: { ref: string; perPage?: number; page?: number }) {\n const reference = query.ref || 'main'\n const perPage = query.perPage || 30\n const page = query.page || 1\n const url = `${this.baseUrl}/commits?sha=${encodeURIComponent(reference)}&per_page=${encodeURIComponent(String(perPage))}&page=${encodeURIComponent(String(page))}`\n const resp = await this._fetchWithRetry(url, { method: 'GET', headers: this.headers })\n const text = await resp.text().catch(() => '[]')\n const parsed = this._parseJsonArray(text)\n\n const items = (Array.isArray(parsed) ? parsed : []).map((c: any) => this._mapGithubCommitToSummary(c))\n\n const linkHdr = resp && (resp as any).headers && typeof (resp as any).headers.get === 'function' ? (resp as any).headers.get('link') : undefined\n const pages = this._parseLinkHeaderString(typeof linkHdr === 'string' ? linkHdr : undefined)\n return { items, nextPage: pages.nextPage, lastPage: pages.lastPage }\n }\n\n /**\n * \u5FDC\u7B54\u30C6\u30AD\u30B9\u30C8\u3092 JSON \u914D\u5217\u3068\u3057\u3066\u89E3\u6790\u3057\u307E\u3059\uFF08\u5931\u6557\u6642\u306F\u7A7A\u914D\u5217\u3092\u8FD4\u3059\uFF09\u3002\n * @param {string} text \u5FDC\u7B54\u30C6\u30AD\u30B9\u30C8\n * @returns {any[]}\n */\n private _parseJsonArray(text: string): any[] {\n try {\n return text ? JSON.parse(text) : []\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('parseJsonArray failed', error)\n return []\n }\n }\n\n /**\n * GitHub \u306E Link \u30D8\u30C3\u30C0\u3092\u89E3\u6790\u3057\u3066 next/last \u30DA\u30FC\u30B8\u3092\u8FD4\u3057\u307E\u3059\u3002\n * @param {string|undefined} linkHdr Link \u30D8\u30C3\u30C0\u6587\u5B57\u5217\n * @returns {{nextPage?: number, lastPage?: number}} \u30DA\u30FC\u30B8\u756A\u53F7\u60C5\u5831\n */\n private _parseLinkHeaderString(linkHdr?: string): { nextPage?: number; lastPage?: number } {\n const out: { nextPage?: number; lastPage?: number } = {}\n if (!linkHdr) return out\n try {\n const mNext = linkHdr.match(/<[^>]*[?&]page=(\\d+)[^>]*>\\s*;\\s*rel=\\\"?next\\\"?/) as RegExpMatchArray | null\n const mLast = linkHdr.match(/<[^>]*[?&]page=(\\d+)[^>]*>\\s*;\\s*rel=\\\"?last\\\"?/) as RegExpMatchArray | null\n if (mNext) out.nextPage = Number(mNext[1])\n if (mLast) out.lastPage = Number(mLast[1])\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('parseLinkHeaderString failed', error)\n }\n return out\n }\n\n /**\n * Map a raw GitHub commit object to CommitSummary shape used by the adapter.\n * @param {any} c Raw commit object\n * @returns {import('./adapter').CommitSummary}\n */\n private _mapGithubCommitToSummary(c: any) {\n const parents = Array.isArray(c?.parents) ? c.parents.map((p: any) => p?.sha ?? '').filter((s: string) => !!s) : []\n return {\n sha: c?.sha ?? '',\n message: c?.commit?.message ?? '',\n author: c?.commit?.author?.name ?? c?.author?.login ?? '',\n date: c?.commit?.author?.date ?? '',\n parents,\n }\n }\n\n /**\n * \u30D6\u30ED\u30D6\u3092\u4F5C\u6210\u307E\u305F\u306F\u30AD\u30E3\u30C3\u30B7\u30E5\u304B\u3089\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param {any[]} changes \u5909\u66F4\u4E00\u89A7\uFF08create/update \u3092\u542B\u3080\uFF09\n * @param {number} [concurrency=5] \u540C\u6642\u5B9F\u884C\u6570\n * @returns {Promise<Record<string,string>>} \u30D1\u30B9\u2192blobSha \u306E\u30DE\u30C3\u30D7\n */\n async createBlobs(changes: any[], concurrency = 5) {\n const tasks = changes.filter((c) => c.type === 'create' || c.type === 'update')\n const results = await mapWithConcurrency(tasks, this._createBlobForChange.bind(this), concurrency)\n const map: Record<string, string> = {}\n for (const r of results) map[r.path] = r.sha\n return map\n }\n\n /**\n * Create a blob for a change or return cached blobSha.\n * @param {any} ch change entry\n * @returns {Promise<{path:string,sha:string}>}\n */\n private async _createBlobForChange(ch: any) {\n /**\n * Create or return cached blob SHA for a change entry.\n * @param {any} ch change entry\n * @returns {Promise<{path:string,sha:string}>}\n */\n const contentHash = await this.shaOf(ch.content || '')\n const cached = this.blobCache.get(contentHash)\n if (cached) return { path: ch.path, sha: cached }\n const body = JSON.stringify({ content: ch.content, encoding: 'utf-8' })\n const response = await this._fetchWithRetry(`${this.baseUrl}/git/blobs`, { method: 'POST', headers: this.headers, body }, 4, 300)\n const index = await response.json()\n if (!index.sha) throw new NonRetryableError('blob response missing sha')\n this.blobCache.set(contentHash, index.sha)\n return { path: ch.path, sha: index.sha }\n }\n\n /**\n * \u4E92\u63DB\u7528\u306E\u30C4\u30EA\u30FC\u4F5C\u6210\u3002\n * @param {any[]} changes \u5909\u66F4\u4E00\u89A7\n * @param {string} [baseTreeSha] \u30D9\u30FC\u30B9\u30C4\u30EA\u30FC\n * @returns {Promise<string>} \u4F5C\u6210\u3055\u308C\u305F\u30C4\u30EA\u30FC\u306E sha\n */\n async createTree(changes: any[], baseTreeSha?: string) {\n const tree = [] as any[]\n for (const c of changes) {\n if (c.type === 'delete') {\n tree.push({ path: c.path, mode: '100644', sha: null })\n } else {\n if (!c.blobSha) throw new NonRetryableError(`missing blobSha for ${c.path}`)\n tree.push({ path: c.path, mode: '100644', type: 'blob', sha: c.blobSha })\n }\n }\n const body: any = { tree }\n if (baseTreeSha) body.base_tree = baseTreeSha\n const response = await this._fetchWithRetry(`${this.baseUrl}/git/trees`, { method: 'POST', headers: this.headers, body: JSON.stringify(body) }, 4, 300)\n const index = await response.json()\n if (!index.sha) throw new NonRetryableError('createTree response missing sha')\n return index.sha as string\n }\n\n /**\n * \u30B3\u30DF\u30C3\u30C8\u3092\u4F5C\u6210\u3057\u307E\u3059\u3002\n * @param {string} message \u30B3\u30DF\u30C3\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8\n * @param {string} parentSha \u89AA\u30B3\u30DF\u30C3\u30C8 SHA\n * @param {string} treeSha \u30C4\u30EA\u30FC SHA\n * @returns {Promise<string>} \u65B0\u898F\u30B3\u30DF\u30C3\u30C8 SHA\n */\n async createCommit(message: string, parentSha: string, treeSha: string) {\n const parents = /^[0-9a-f]{40}$/.test(String(parentSha)) ? [parentSha] : []\n const body = JSON.stringify({ message, tree: treeSha, parents })\n // debug: log body for troubleshooting invalid parents\n /* istanbul ignore next */\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('GitHub.createCommit body:', body)\n const response = await this._fetchWithRetry(`${this.baseUrl}/git/commits`, { method: 'POST', headers: this.headers, body }, 4, 300)\n const index = await response.json()\n if (!index.sha) throw new NonRetryableError('createCommit response missing sha')\n return index.sha as string\n }\n\n /**\n * Retrieve repository metadata (default branch, name, id) and cache it.\n * @returns {Promise<import('../virtualfs/types.ts').RepositoryMetadata>} repository metadata\n */\n async getRepositoryMetadata(): Promise<import('../virtualfs/types.ts').RepositoryMetadata> {\n if (this.repoMetadata) return this.repoMetadata\n try {\n const resp = await this._fetchWithRetry(`${this.baseUrl}`, { method: 'GET', headers: this.headers }, 4, 300)\n const data = await resp.json().catch(() => ({}))\n this.repoMetadata = this._makeRepoMetadata(data)\n return this.repoMetadata\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).error) (console as any).error('\u30EA\u30DD\u30B8\u30C8\u30EA\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30C7\u30D5\u30A9\u30EB\u30C8\u30D6\u30E9\u30F3\u30C1\u3092\\'main\\'\u3068\u3057\u3066\u6271\u3044\u307E\u3059', error)\n this.repoMetadata = { defaultBranch: 'main', name: '', id: undefined }\n return this.repoMetadata\n }\n }\n\n /**\n * Build repository metadata object from API response body.\n * @param data API response body\n * @returns {import('../virtualfs/types.ts').RepositoryMetadata}\n */\n private _makeRepoMetadata(data: any): import('../virtualfs/types.ts').RepositoryMetadata {\n return {\n defaultBranch: data && data.default_branch ? data.default_branch : 'main',\n name: data && data.name ? data.name : '',\n id: data && data.id ? data.id : undefined,\n }\n }\n\n /**\n * List branches via GitHub API and map to BranchListPage.\n * @returns {Promise<{items:any[],nextPage?:number,lastPage?:number}>}\n */\n async listBranches(query?: import('../virtualfs/types.ts').BranchListQuery) {\n const perPage = (query && query.perPage) || 30\n const page = (query && query.page) || 1\n const url = `${this.baseUrl}/branches?per_page=${encodeURIComponent(String(perPage))}&page=${encodeURIComponent(String(page))}`\n const resp = await this._fetchWithRetry(url, { method: 'GET', headers: this.headers })\n const text = await resp.text().catch(() => '[]')\n const parsed = this._parseJsonArray(text)\n const repoMeta = await this.getRepositoryMetadata().catch(() => ({ defaultBranch: 'main' }))\n\n const items = this._mapBranchItems(Array.isArray(parsed) ? parsed : [], repoMeta)\n\n const linkHdr = resp && (resp as any).headers && typeof (resp as any).headers.get === 'function' ? (resp as any).headers.get('link') : undefined\n const pages = this._parseLinkHeaderString(typeof linkHdr === 'string' ? linkHdr : undefined)\n return { items, nextPage: pages.nextPage, lastPage: pages.lastPage }\n }\n\n /**\n * Map raw branch objects returned by API to adapter Branch item shape.\n * @param {any[]} parsed raw branch array\n * @param {any} repoMeta repository metadata\n * @returns {any[]}\n */\n private _mapBranchItems(parsed: any[], repoMeta: any) {\n return parsed.map((b: any) => ({\n name: b.name,\n commit: { sha: b.commit && b.commit.sha ? b.commit.sha : '', url: b.commit && b.commit.url ? b.commit.url : '' },\n protected: !!b.protected,\n isDefault: b.name === (repoMeta && repoMeta.defaultBranch ? repoMeta.defaultBranch : 'main'),\n }))\n }\n\n /**\n * \u53C2\u7167\u3092\u66F4\u65B0\u3057\u307E\u3059\u3002\n * @param {string} ref \u53C2\u7167\u540D\uFF08\u4F8B: heads/main\uFF09\n * @param {string} commitSha \u30B3\u30DF\u30C3\u30C8 SHA\n * @param {boolean} force \u5F37\u5236\u66F4\u65B0\u30D5\u30E9\u30B0\n */\n async updateRef(reference: string, commitSha: string, force = false) {\n const body = JSON.stringify({ sha: commitSha, force })\n const response = await this._fetchWithRetry(`${this.baseUrl}/git/refs/${reference}`, { method: 'PATCH', headers: this.headers, body }, 4, 300)\n if (!response.ok) {\n const txt = await response.text().catch(() => '')\n throw new NonRetryableError(`updateRef failed: ${response.status} ${txt}`)\n }\n }\n\n /**\n * Create a branch (ref) on the remote repository.\n * @param branchName branch name to create\n * @param fromSha commit sha to point the new branch at\n * @returns {Promise<import('../virtualfs/types.ts').CreateBranchResult>} created branch info\n */\n async createBranch(branchName: string, fromSha: string): Promise<import('../virtualfs/types.ts').CreateBranchResult> {\n const referenceName = `refs/heads/${branchName}`\n const body = JSON.stringify({ ref: referenceName, sha: fromSha })\n try {\n const resp = await this._fetchWithRetry(`${this.baseUrl}/git/refs`, { method: 'POST', headers: this.headers, body }, 4, 300)\n const txt = await resp.text().catch(() => '')\n const data = txt ? JSON.parse(txt) : {}\n return { name: branchName, sha: fromSha, ref: (data && data.ref) ? data.ref : referenceName }\n } catch (error: any) {\n const message = String(error && error.message ? error.message : error)\n this._handleCreateBranchError(message, branchName)\n }\n }\n\n /**\n * Normalize common createBranch error messages into thrown NonRetryableError/Error.\n * @param {string} message error message text\n * @param {string} branchName branch attempted\n * @returns {never}\n */\n private _handleCreateBranchError(message: string, branchName: string): never {\n if (message.includes('422') || /Reference already exists/i.test(message)) {\n throw new NonRetryableError(`Branch '${branchName}' already exists.`)\n }\n if (/401|403|Bad credentials/i.test(message)) {\n throw new NonRetryableError(`Authentication failed: ${message}`)\n }\n throw new Error(message)\n }\n\n /**\n * \u6307\u5B9A\u30B3\u30DF\u30C3\u30C8\u306E tree SHA \u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param commitSha \u30B3\u30DF\u30C3\u30C8 SHA\n * @returns {Promise<string>} tree \u306E SHA\n */\n async getCommitTreeSha(commitSha: string) {\n const response = await this._fetchWithRetry(`${this.baseUrl}/git/commits/${commitSha}`, { method: 'GET', headers: this.headers }, 4, 300)\n const index = await response.json()\n if (!index || !index.tree || !index.tree.sha) throw new NonRetryableError('getCommitTreeSha: tree sha not found')\n return index.tree.sha as string\n }\n\n /**\n * \u6307\u5B9A ref \u306E\u5148\u982D\u30B3\u30DF\u30C3\u30C8 SHA \u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param ref \u4F8B: `heads/main`\n * @returns {Promise<string>} \u53C2\u7167\u5148\u306E\u30B3\u30DF\u30C3\u30C8 SHA\n */\n async getRef(reference: string) {\n // Try plural then singular path using a small helper to reduce cognitive complexity.\n const tryUrls = [\n `${this.baseUrl}/git/refs/${reference}`,\n `${this.baseUrl}/git/ref/${reference}`,\n ]\n\n for (const url of tryUrls) {\n try {\n const sha = await this._getRefShaFromUrl(url)\n if (sha) return sha\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('getRef attempt failed', error)\n }\n }\n\n throw new NonRetryableError('getRef: sha not found')\n }\n\n /**\n * Fetch a ref URL and extract a SHA if present.\n * @param {string} url API URL to fetch\n * @returns {Promise<string|null>} sha string when found, otherwise null\n */\n private async _getRefShaFromUrl(url: string): Promise<string | null> {\n const resp = await this._fetchWithRetry(url, { method: 'GET', headers: this.headers }, 4, 300)\n const index = await resp.json().catch(() => null)\n if (!index) return null\n if (typeof index.sha === 'string' && index.sha.length > 0) return index.sha as string\n if (index.object && typeof index.object.sha === 'string' && index.object.sha.length > 0) return index.object.sha as string\n return null\n }\n\n /**\n * Determine the head SHA for a branch; fallback to branch name if unavailable.\n * @param {string} branch branch name\n * @returns {Promise<string>} head SHA or branch\n */\n private async _determineHeadSha(branch: string): Promise<string> {\n // Attempt resolution via multiple strategies with small helpers to keep complexity low.\n // 1) refs API\n const referenceSha = await this.getRef(`heads/${branch}`).catch(() => null)\n if (referenceSha && typeof referenceSha === 'string' && referenceSha.length > 0) return referenceSha\n\n // 2) branches API\n const branchSha = await this._getBranchCommitSha(branch).catch((error) => {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('determineHeadSha branches API failed', error)\n return null\n })\n if (branchSha) return branchSha\n\n // 3) commits endpoint\n const commitSha = await this._getCommitEndpointSha(branch).catch((error) => {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('determineHeadSha commits endpoint failed', error)\n return null\n })\n if (commitSha) return commitSha\n\n // Fallback to returning branch name\n return branch\n }\n\n /**\n * Get commit SHA from the branches API for a branch name.\n * @param {string} branch branch name\n * @returns {Promise<string|null>} commit SHA or null when not found\n */\n private async _getBranchCommitSha(branch: string): Promise<string | null> {\n const resp = await this._fetchWithRetry(`${this.baseUrl}/branches/${encodeURIComponent(branch)}`, { method: 'GET', headers: this.headers }, 4, 300)\n if (!resp || !resp.ok) return null\n const bj = await resp.json().catch(() => null)\n const commit = bj && bj.commit ? (bj.commit.sha || bj.commit.id) : null\n return typeof commit === 'string' && commit.length > 0 ? commit : null\n }\n\n /**\n * Get commit SHA from the commits endpoint for a given reference.\n * @param {string} reference commit-ish reference\n * @returns {Promise<string|null>} commit SHA or null when not found\n */\n private async _getCommitEndpointSha(reference: string): Promise<string | null> {\n const resp = await this._fetchWithRetry(`${this.baseUrl}/commits/${encodeURIComponent(reference)}`, { method: 'GET', headers: this.headers }, 2, 200)\n if (!resp || !resp.ok) return null\n const body = await resp.json().catch(() => null)\n const maybe = body && (body.sha || body.id)\n return typeof maybe === 'string' && maybe.length > 0 ? maybe : null\n }\n\n /**\n * tree \u3092\u53D6\u5F97\u3057\u307E\u3059\uFF08\u5FC5\u8981\u306A\u3089\u518D\u5E30\u53D6\u5F97\uFF09\u3002\n * @param treeSha tree \u306E SHA\n * @param recursive \u518D\u5E30\u30D5\u30E9\u30B0\n * @returns {Promise<any[]>} tree \u306E\u914D\u5217\n */\n async getTree(treeSha: string, recursive = false) {\n const url = `${this.baseUrl}/git/trees/${treeSha}` + (recursive ? '?recursive=1' : '')\n const response = await this._fetchWithRetry(url, { method: 'GET', headers: this.headers }, 4, 300)\n const index = await response.json()\n if (!index || !index.tree) throw new NonRetryableError('getTree: tree not found')\n return index.tree as any[]\n }\n\n /**\n * blob \u3092\u53D6\u5F97\u3057\u3066\u30C7\u30B3\u30FC\u30C9\u3057\u3066\u8FD4\u3057\u307E\u3059\u3002\n * @param blobSha blob \u306E SHA\n * @returns {Promise<{content:string,encoding:string}>} \u30C7\u30B3\u30FC\u30C9\u6E08\u307F\u30B3\u30F3\u30C6\u30F3\u30C4\u3068\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\n */\n async getBlob(blobSha: string) {\n const response = await this._fetchWithRetry(`${this.baseUrl}/git/blobs/${blobSha}`, { method: 'GET', headers: this.headers }, 4, 300)\n const index = await response.json()\n if (!index || typeof index.content === 'undefined') throw new NonRetryableError('getBlob: content not found')\n const enc = index.encoding || 'utf-8'\n // Return API content as-is (do not decode here). Decoding is responsibility\n // of the caller so that adapter remains a thin mapping over the remote API.\n return { content: index.content, encoding: enc }\n }\n\n /**\n * Resolve a commit-ish (branch, tag, or SHA) to a commit SHA.\n * Resolution order: branch -> tag -> commit endpoint -> treat as SHA\n * Throws if resolution fails.\n * @param {string} reference commit-ish to resolve\n * @returns {Promise<string>} resolved commit SHA\n */\n async resolveRef(reference: string): Promise<string> {\n if (typeof reference === 'string' && /^[0-9a-f]{40}$/.test(reference)) return reference\n\n const resolvers: Array<(_reference: string) => Promise<string | null>> = [\n this._tryResolveByBranch.bind(this),\n this._tryResolveByTag.bind(this),\n this._tryResolveByCommitEndpoint.bind(this),\n ]\n\n const resolved = await this._runResolvers(reference, resolvers)\n if (resolved) return resolved\n\n throw new Error(`resolveRef: ref '${reference}' not found`)\n }\n\n /**\n * Run resolver functions in order and return the first non-null result.\n * @param {string} reference commit-ish to resolve\n * @param {Array<(_reference: string) => Promise<string | null>>} resolvers resolver functions\n * @returns {Promise<string|null>} resolved sha or null\n */\n private async _runResolvers(reference: string, resolvers: Array<(_reference: string) => Promise<string | null>>): Promise<string | null> {\n for (const r of resolvers) {\n try {\n const v = await r(reference)\n if (v) return v\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('resolveRef resolver failed', error)\n }\n }\n return null\n }\n\n /**\n * Try to resolve a branch name to a commit SHA.\n * @param {string} reference branch name\n * @returns {Promise<string|null>}\n */\n private async _tryResolveByBranch(reference: string): Promise<string | null> {\n const sha = await this.getRef(`heads/${reference}`)\n return sha || null\n }\n\n /**\n * Try to resolve a tag name to a commit SHA.\n * @param {string} reference tag name\n * @returns {Promise<string|null>}\n */\n private async _tryResolveByTag(reference: string): Promise<string | null> {\n const sha = await this.getRef(`tags/${reference}`)\n return sha || null\n }\n\n /**\n * Try to resolve via commits endpoint (may accept SHA or other forms).\n * @param {string} reference commit-ish\n * @returns {Promise<string|null>}\n */\n private async _tryResolveByCommitEndpoint(reference: string): Promise<string | null> {\n const response = await this._fetchWithRetry(`${this.baseUrl}/commits/${encodeURIComponent(reference)}`, { method: 'GET', headers: this.headers }, 2, 200)\n if (response && response.ok) {\n const body = await response.json().catch(() => null)\n const maybe = body && (body.sha || body.id)\n if (typeof maybe === 'string' && maybe.length > 0) return maybe\n }\n return null\n }\n\n /**\n * Fetch a blob's content; return null content on failure.\n * @param {any} f blob metadata\n * @returns {Promise<{path:string,content:string|null}>}\n */\n private async _fetchBlobContentOrNull(f: any) {\n try {\n const b = await this.getBlob(f.sha)\n // If the adapter returned a base64 payload, decode here for\n // fetchSnapshot/fetchContent callers so they receive decoded text.\n if (b && b.encoding === 'base64' && typeof b.content === 'string') {\n const safe = (b.content || '').replace(/\\n/g, '')\n return { path: f.path, content: this._decodeBase64ToString(safe) }\n }\n return { path: f.path, content: b.content }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('fetchSnapshot blob failed', f.path, error)\n return { path: f.path, content: null }\n }\n }\n\n /**\n * Decode a base64 string into UTF-8 text. Uses global Buffer when available,\n * falls back to atob/TextDecoder for browsers.\n * @returns {string} decoded UTF-8 string\n */\n private _decodeBase64ToString(safe: string): string {\n const bufGlobal = (globalThis as any).Buffer\n if (typeof bufGlobal !== 'undefined' && typeof bufGlobal.from === 'function') {\n return bufGlobal.from(safe, 'base64').toString('utf8')\n }\n if (typeof atob === 'function') {\n const bin = atob(safe)\n const length_ = bin.length\n const bytes = new Uint8Array(length_)\n for (let index = 0; index < length_; index++) bytes[index] = bin.charCodeAt(index)\n return (typeof TextDecoder !== 'undefined') ? new TextDecoder().decode(bytes) : String.fromCharCode.apply(null, Array.from(bytes))\n }\n return safe\n }\n\n /**\n * Fetch repository snapshot: headSha, shas map and a fetchContent helper.\n * @param {string} branch branch name\n * @param {number} concurrency fetch concurrency\n * @returns {Promise<{headSha:string,shas:Record<string,string>,fetchContent:Function,snapshot:Record<string,string>}>}\n */\n async fetchSnapshot(branch = 'main', concurrency = 5): Promise<any> {\n const headSha = await this._determineHeadSha(branch)\n const { shas, fileMap } = await this._buildFileMapFromHead(headSha)\n\n const contentCache = new Map<string, string>()\n const snapshot: Record<string, string> = {}\n const fetchContent = this._fetchSnapshotForFileMap.bind(this, fileMap, contentCache, snapshot, concurrency)\n\n return { headSha, shas, fetchContent, snapshot }\n }\n\n /**\n * Bound helper used to construct the `fetchContent` function returned by `fetchSnapshot`.\n * @param {Map<string, any>} fileMap file metadata map\n * @param {Map<string,string>} contentCache cache map\n * @param {Record<string,string>} snapshot snapshot map to populate\n * @param {number} concurrency concurrency level\n * @param {string[]} paths requested paths\n * @returns {Promise<Record<string,string>>}\n */\n private async _fetchSnapshotForFileMap(fileMap: Map<string, any>, contentCache: Map<string, string>, snapshot: Record<string, string>, concurrency: number, paths: string[]): Promise<Record<string, string>> {\n return this._fetchContentFromMap(fileMap, contentCache, snapshot, paths, concurrency)\n }\n\n /**\n * Build file map and shas from a head SHA by fetching the tree.\n * @param {string} headSha head commit SHA\n * @returns {Promise<{shas:Record<string,string>,fileMap:Map<string,any>}>}\n */\n private async _buildFileMapFromHead(headSha: string): Promise<{ shas: Record<string, string>; fileMap: Map<string, any> }> {\n const treeResponse = await this._fetchWithRetry(`${this.baseUrl}/git/trees/${headSha}${'?recursive=1'}`, { method: 'GET', headers: this.headers }, 4, 300)\n const treeJ = await treeResponse.json()\n const files = (treeJ && treeJ.tree) ? treeJ.tree.filter((t: any) => t.type === 'blob') : []\n const shas: Record<string, string> = {}\n const fileMap = new Map<string, any>()\n for (const f of files) {\n shas[f.path] = f.sha\n fileMap.set(f.path, f)\n }\n return { shas, fileMap }\n }\n\n /**\n * Fetch contents for given paths from a file map with caching and concurrency.\n * @param {Map<string, any>} fileMap map of file metadata\n * @param {Map<string,string>} contentCache cache map\n * @param {Record<string,string>} snapshot output snapshot\n * @param {string[]} paths requested paths\n * @param {number} concurrency concurrency level\n * @returns {Promise<Record<string,string>>}\n */\n private async _fetchContentFromMap(fileMap: Map<string, any>, contentCache: Map<string, string>, snapshot: Record<string, string>, paths: string[], concurrency: number): Promise<Record<string, string>> {\n /**\n * Collect contents for the requested paths using concurrency helper.\n * @param {string[]} paths requested paths\n * @returns {Promise<Record<string,string>>} path->content map\n */\n const out: Record<string, string> = {}\n const unique = Array.from(new Set(paths)).filter((p) => fileMap.has(p))\n const mapper = this._mapperForFetch.bind(this, fileMap, contentCache, snapshot, out)\n await mapWithConcurrency(unique, mapper, concurrency)\n return out\n }\n\n /**\n * Mapper used by _fetchContentFromMap when fetching multiple files.\n * @param {Map<string, any>} fileMap file metadata map\n * @param {Map<string,string>} contentCache cache map\n * @param {Record<string,string>} snapshot snapshot map to populate\n * @param {Record<string,string>} out output map to collect results\n * @param {string} p requested path\n * @returns {Promise<null>}\n */\n private async _mapperForFetch(fileMap: Map<string, any>, contentCache: Map<string, string>, snapshot: Record<string, string>, out: Record<string, string>, p: string): Promise<null> {\n const content = await this._fetchContentForPath(fileMap, contentCache, snapshot, p)\n if (content !== null) out[p] = content\n return null\n }\n\n /**\n * Fetch single path content, update cache and snapshot.\n * @param {Map<string, any>} fileMap file map\n * @param {Map<string,string>} contentCache cache map\n * @param {Record<string,string>} snapshot snapshot map\n * @param {string} p path to fetch\n * @returns {Promise<string|null>}\n */\n private async _fetchContentForPath(fileMap: Map<string, any>, contentCache: Map<string, string>, snapshot: Record<string, string>, p: string): Promise<string | null> {\n if (contentCache.has(p)) {\n const v = contentCache.get(p) as string\n snapshot[p] = v\n return v\n }\n const f = fileMap.get(p)\n const r = await this._fetchBlobContentOrNull(f)\n if (r && r.content !== null) {\n contentCache.set(p, r.content)\n snapshot[p] = r.content\n return r.content\n }\n return null\n }\n}\n// re-export helpers for backward compatibility\nexport { fetchWithRetry, classifyStatus, getDelayForResponse, processResponseWithDelay, mapWithConcurrency, shaOf }\n// re-export error classes for backward compatibility with tests\nexport { RetryableError, NonRetryableError } from './abstractAdapter.ts'\nexport default GitHubAdapter\n\n", "import { GitAdapter } from './adapter.ts'\nimport AbstractGitAdapter, { mapWithConcurrency } from './abstractAdapter.ts'\n\ntype GLOptions = { projectId: string; token: string; host?: string }\n\n/**\n * GitLab \u5411\u3051\u306E GitAdapter \u5B9F\u88C5\u3067\u3059\u3002\n * GitLab \u306E API \u3092\u30E9\u30C3\u30D7\u3057\u3066\u3001\u30EA\u30DD\u30B8\u30C8\u30EA\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u306E\u53D6\u5F97\u3084\n * commits API \u306E\u547C\u3073\u51FA\u3057\u3092\u30B5\u30DD\u30FC\u30C8\u3057\u307E\u3059\u3002\n */\nexport class GitLabAdapter extends AbstractGitAdapter implements GitAdapter {\n private pendingActions: Array<{ action: string; file_path: string; content?: string }> | null = null\n private projectMetadata: import('../virtualfs/types.ts').RepositoryMetadata | null = null\n\n /**\n * GitLabAdapter \u3092\u521D\u671F\u5316\u3057\u307E\u3059\u3002\n * @param {GLOpts} opts \u8A2D\u5B9A\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n constructor(options: GLOptions) {\n super(options)\n const host = options.host || 'https://gitlab.com'\n this.baseUrl = `${host}/api/v4/projects/${encodeURIComponent(options.projectId)}`\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json'\n }\n if (typeof options.token === 'string' && options.token.trim().length > 0) {\n headers['PRIVATE-TOKEN'] = options.token\n }\n this.headers = headers\n }\n\n /**\n * List commits for a ref (GitLab commits API)\n * @param {{ref:string,perPage?:number,page?:number}} query\n * @returns {Promise<import('./adapter').CommitHistoryPage>} \u30DA\u30FC\u30B8\u60C5\u5831\u3092\u8FD4\u3057\u307E\u3059\n */\n async listCommits(query: { ref: string; perPage?: number; page?: number }) {\n const reference = query.ref || 'main'\n const perPage = query.perPage || 30\n const page = query.page || 1\n const url = `${this.baseUrl}/repository/commits?ref_name=${encodeURIComponent(reference)}&per_page=${encodeURIComponent(String(perPage))}&page=${encodeURIComponent(String(page))}`\n const resp = await this.fetchWithRetry(url, { method: 'GET', headers: this.headers })\n const text = await resp.text().catch(() => '[]')\n const parsed = this._parseJsonArray(text)\n\n const items = (Array.isArray(parsed) ? parsed : []).map((c: any) => this._mapGitLabCommitToSummary(c))\n\n const pages = this._parsePagingHeaders(resp)\n return { items, nextPage: pages.nextPage, lastPage: pages.lastPage }\n }\n\n /**\n * \u5FDC\u7B54\u30C6\u30AD\u30B9\u30C8\u3092 JSON \u914D\u5217\u3068\u3057\u3066\u89E3\u6790\u3057\u307E\u3059\uFF08\u5931\u6557\u6642\u306F\u7A7A\u914D\u5217\u3092\u8FD4\u3059\uFF09\u3002\n * @param {string} text \u5FDC\u7B54\u30C6\u30AD\u30B9\u30C8\n * @returns {any[]}\n */\n private _parseJsonArray(text: string): any[] {\n try {\n return text ? JSON.parse(text) : []\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('parseJsonArray failed', error)\n return []\n }\n }\n\n /**\n * GitLab \u306E\u30DA\u30FC\u30B8\u30F3\u30B0\u30D8\u30C3\u30C0\u3092\u89E3\u6790\u3057\u307E\u3059\uFF08x-next-page / x-total-pages\uFF09\u3002\n * @returns {{nextPage?: number, lastPage?: number}} \u30DA\u30FC\u30B8\u756A\u53F7\u60C5\u5831\n */\n private _parsePagingHeaders(resp: Response): { nextPage?: number; lastPage?: number } {\n const out: { nextPage?: number; lastPage?: number } = {}\n try {\n const hdrNext = resp && (resp as any).headers && typeof (resp as any).headers.get === 'function' ? (resp as any).headers.get('x-next-page') : undefined\n const hdrTotal = resp && (resp as any).headers && typeof (resp as any).headers.get === 'function' ? (resp as any).headers.get('x-total-pages') : undefined\n if (hdrNext) out.nextPage = Number(hdrNext)\n if (hdrTotal) out.lastPage = Number(hdrTotal)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('parsePagingHeaders failed', error)\n }\n return out\n }\n\n /**\n * Map a raw GitLab commit object to CommitSummary.\n * @param {any} c Raw commit object\n * @returns {import('./adapter').CommitSummary}\n */\n private _mapGitLabCommitToSummary(c: any) {\n const parents = Array.isArray(c?.parent_ids) ? c.parent_ids.map((p: any) => p ?? '').filter(Boolean) : []\n return {\n sha: c?.id ?? '',\n message: c?.message ?? '',\n author: c?.author_name ?? c?.author?.name ?? '',\n date: c?.created_at ?? '',\n parents,\n }\n }\n\n /**\n * \u5909\u66F4\u4E00\u89A7\u304B\u3089 blob sha \u306E\u30DE\u30C3\u30D7\u3092\u4F5C\u6210\u3057\u307E\u3059\uFF08\u7591\u4F3C\u5B9F\u88C5\uFF09\u3002\n * @param {any[]} changes \u5909\u66F4\u4E00\u89A7\n * @returns {Promise<Record<string,string>>} path->sha \u30DE\u30C3\u30D7\n */\n async createBlobs(changes: any[]) {\n const map: Record<string, string> = {}\n for (const c of changes) {\n if (c.type === 'create' || c.type === 'update') map[c.path] = await this.shaOf(c.content)\n }\n return map\n }\n\n /**\n * \u4E92\u63DB\u7528\u306E\u30C4\u30EA\u30FC\u4F5C\u6210\u3002\u5B9F\u969B\u306B\u306F actions \u3092\u4FDD\u6301\u3057\u3066\u304A\u304D\u3001\u30DE\u30FC\u30AB\u30FC\u3092\u8FD4\u3057\u307E\u3059\u3002\n * @param {any[]} _changes \u5909\u66F4\u4E00\u89A7\n * @param {string} [_baseTreeSha] \u30D9\u30FC\u30B9\u30C4\u30EA\u30FC\uFF08\u672A\u4F7F\u7528\uFF09\n * @returns {Promise<string>} \u30DE\u30FC\u30AB\u30FC\u6587\u5B57\u5217\n */\n async createTree(_changes: any[], _baseTreeSha?: string) {\n // Store actions for later commit; return marker token\n const actions = (_changes || []).map((c: any) => {\n if (c.type === 'delete') return { action: 'delete', file_path: c.path }\n if (c.type === 'create') return { action: 'create', file_path: c.path, content: c.content }\n return { action: 'update', file_path: c.path, content: c.content }\n })\n this.pendingActions = actions\n return `gitlab-tree-${Date.now()}-${Math.floor(Math.random() * 100000)}`\n }\n\n /**\n * createTree \u3067\u4FDD\u6301\u3057\u305F actions \u304C\u3042\u308C\u3070\u30B3\u30DF\u30C3\u30C8\u3057\u3001\u306A\u3051\u308C\u3070 parentSha \u3092\u8FD4\u3057\u307E\u3059\u3002\n * @param {string} message \u30B3\u30DF\u30C3\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8\n * @param {string} parentSha \u89AA\u30B3\u30DF\u30C3\u30C8 SHA\n * @param {string} _treeSha \u30C4\u30EA\u30FC SHA\uFF08\u672A\u4F7F\u7528\uFF09\n * @returns {Promise<string>} \u65B0\u898F\u30B3\u30DF\u30C3\u30C8 SHA \u307E\u305F\u306F parentSha\n */\n async createCommit(message: string, parentSha: string, _treeSha: string) {\n // If pendingActions exist (created via createTree), use commits API\n if (this.pendingActions && this.pendingActions.length > 0) {\n const branch = 'main'\n const commitResponse = await this.createCommitWithActions(\n branch,\n message,\n this.pendingActions.map((a) => ({ type: a.action === 'delete' ? 'delete' : a.action === 'create' ? 'create' : 'update', path: a.file_path, content: a.content })),\n parentSha\n )\n this.pendingActions = null\n return commitResponse\n }\n // Fallback: no-op commit (return parentSha)\n return parentSha\n }\n\n /**\n * \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u66F4\u65B0\u306F\u4E0D\u8981\u306A\u305F\u3081 noop \u5B9F\u88C5\u3067\u3059\u3002\n * @param {string} _ref ref \u540D\n * @param {string} _commitSha \u30B3\u30DF\u30C3\u30C8 SHA\n * @param {boolean} [_force]\n * @returns {Promise<void>}\n */\n async updateRef(_reference: string, _commitSha: string, _force = false) {\n // Not required when using commits API\n }\n\n /**\n * actions \u3092\u7528\u3044\u3066 GitLab \u306E\u30B3\u30DF\u30C3\u30C8 API \u3092\u547C\u3073\u51FA\u3057\u307E\u3059\u3002\n * @param {string} branch \u30D6\u30E9\u30F3\u30C1\u540D\n * @param {string} message \u30B3\u30DF\u30C3\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8\n * @param {{type:string,path:string,content?:string}[]} changes \u5909\u66F4\u4E00\u89A7\n * @returns {Promise<any>} \u30B3\u30DF\u30C3\u30C8\u5FDC\u7B54\uFF08id \u306A\u3069\uFF09\n */\n async createCommitWithActions(branch: string, message: string, changes: Array<{ type: string; path: string; content?: string }>, expectedParentSha?: string) {\n const url = `${this.baseUrl}/repository/commits`\n const actions = this.createActions(changes)\n const body = this._prepareCommitBody(branch, message, actions)\n\n // If caller provided an expected parent SHA, verify remote branch head matches it to avoid accidental overwrites\n if (expectedParentSha) {\n // In unit tests global.fetch may be a jest mock (mockResolvedValueOnce etc.)\n // which would consume the single prepared mock for the commit call and break tests.\n // Skip the pre-check when fetch is a Jest mock function.\n const gfetch: any = (globalThis as any).fetch\n if (!(gfetch && gfetch._isMockFunction)) {\n await this._maybeVerifyParent(expectedParentSha, branch)\n }\n }\n\n return await this.postCommit(url, body)\n }\n\n /**\n * Retrieve project metadata (default branch, name, id) and cache it.\n * @returns {Promise<import('../virtualfs/types.ts').RepositoryMetadata>} repository metadata\n */\n async getRepositoryMetadata(): Promise<import('../virtualfs/types.ts').RepositoryMetadata> {\n if (this.projectMetadata) return this.projectMetadata\n try {\n const resp = await this.fetchWithRetry(`${this.baseUrl}`, { method: 'GET', headers: this.headers })\n const data = await resp.json().catch(() => ({}))\n this.projectMetadata = this._makeProjectMetadata(data)\n return this.projectMetadata\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).error) (console as any).error('\u30EA\u30DD\u30B8\u30C8\u30EA\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30C7\u30D5\u30A9\u30EB\u30C8\u30D6\u30E9\u30F3\u30C1\u3092\\'main\\'\u3068\u3057\u3066\u6271\u3044\u307E\u3059', error)\n this.projectMetadata = { defaultBranch: 'main', name: '', id: undefined }\n return this.projectMetadata\n }\n }\n\n /**\n * Build project metadata from API response.\n * @param data API response body\n * @returns {import('../virtualfs/types.ts').RepositoryMetadata}\n */\n private _makeProjectMetadata(data: any): import('../virtualfs/types.ts').RepositoryMetadata {\n return {\n defaultBranch: data && data.default_branch ? data.default_branch : 'main',\n name: data && data.name ? data.name : '',\n id: data && data.id ? data.id : undefined,\n }\n }\n\n /**\n * List branches via GitLab API and map to BranchListPage.\n * @returns {Promise<{items:any[],nextPage?:number,lastPage?:number}>}\n */\n async listBranches(query?: import('../virtualfs/types.ts').BranchListQuery) {\n const perPage = (query && query.perPage) || 30\n const page = (query && query.page) || 1\n const url = `${this.baseUrl}/repository/branches?per_page=${encodeURIComponent(String(perPage))}&page=${encodeURIComponent(String(page))}`\n const resp = await this.fetchWithRetry(url, { method: 'GET', headers: this.headers })\n const text = await resp.text().catch(() => '[]')\n const parsed = this._parseJsonArray(text)\n const repoMeta = await this.getRepositoryMetadata().catch(() => ({ defaultBranch: 'main' }))\n\n const items = this._mapBranchItems(Array.isArray(parsed) ? parsed : [], repoMeta)\n\n const pages = this._parsePagingHeaders(resp)\n return { items, nextPage: pages.nextPage, lastPage: pages.lastPage }\n }\n\n /**\n * Create a branch in GitLab: POST /projects/{projectId}/repository/branches\n * @param branchName name of branch to create\n * @param fromSha branch/tag name or SHA to base the new branch on\n * @returns {Promise<import('../virtualfs/types.ts').CreateBranchResult>} created branch info\n */\n async createBranch(branchName: string, fromSha: string): Promise<import('../virtualfs/types.ts').CreateBranchResult> {\n const url = `${this.baseUrl}/repository/branches`\n const body = JSON.stringify({ branch: branchName, ref: fromSha })\n try {\n const resp = await this.fetchWithRetry(url, { method: 'POST', headers: this.headers, body }, 4, 300)\n const text = await resp.text().catch(() => '')\n const data = text ? JSON.parse(text) : {}\n const sha = data && data.commit && (data.commit.id || data.commit.sha) ? (data.commit.id || data.commit.sha) : fromSha\n return { name: branchName, sha, ref: `refs/heads/${branchName}` }\n } catch (error: any) {\n const message = String(error && error.message ? error.message : error)\n this._handleCreateBranchError(message, branchName)\n }\n }\n\n /**\n * Normalize common createBranch error messages into thrown Errors.\n * @param {string} message error message text\n * @param {string} branchName branch name attempted\n * @returns {never}\n */\n private _handleCreateBranchError(message: string, branchName: string): never {\n if (message.includes('400') || /Branch already exists/i.test(message)) {\n throw new Error(`Branch '${branchName}' already exists`)\n }\n if (/401|403|Unauthorized/i.test(message)) {\n throw new Error(`Authentication failed: ${message}`)\n }\n // Re-throw generic case\n throw new Error(message)\n }\n\n /**\n * Map raw GitLab branch objects to adapter Branch item shape.\n * @param {any[]} parsed raw branch array\n * @param {any} repoMeta repository metadata\n * @returns {any[]}\n */\n private _mapBranchItems(parsed: any[], repoMeta: any) {\n return parsed.map((b: any) => ({\n name: b.name,\n commit: { sha: b.commit && (b.commit.id || b.commit.sha) ? (b.commit.id || b.commit.sha) : '', url: b.commit && (b.commit.web_url || b.commit.url) ? (b.commit.web_url || b.commit.url) : '' },\n protected: !!b.protected,\n isDefault: b.name === (repoMeta && repoMeta.defaultBranch ? repoMeta.defaultBranch : 'main'),\n }))\n }\n\n /**\n * Convert change descriptors to GitLab API actions\n * @returns {Array<any>} API-compatible actions array\n */\n private createActions(changes: Array<{ type: string; path: string; content?: string }>) {\n return changes.map((c) => {\n if (c.type === 'delete') return { action: 'delete', file_path: c.path }\n if (c.type === 'create') return { action: 'create', file_path: c.path, content: c.content }\n return { action: 'update', file_path: c.path, content: c.content }\n })\n }\n\n /**\n * Verify that remote branch head matches expected parent SHA.\n * Throws when non-fast-forward detected.\n * @param {string} expectedParentSha expected parent SHA\n * @param {string} branch branch name\n * @returns {Promise<void>}\n */\n private async verifyParent(expectedParentSha: string, branch: string): Promise<void> {\n const branchResponse = await this.fetchWithRetry(`${this.baseUrl}/repository/branches/${encodeURIComponent(branch)}`, { method: 'GET', headers: this.headers })\n if (branchResponse && branchResponse.ok) {\n const bj = await branchResponse.json().catch(() => null)\n const remoteHead = bj && bj.commit && (bj.commit.id || bj.commit.sha) ? (bj.commit.id || bj.commit.sha) : null\n if (remoteHead && remoteHead !== expectedParentSha) {\n throw new Error(`422 Non-fast-forward: remote head ${remoteHead} !== expected ${expectedParentSha}`)\n }\n }\n }\n\n /**\n * Parse and validate commit API response text\n * @param {string} text \u5FDC\u7B54\u30C6\u30AD\u30B9\u30C8\n * @returns {any} parsed commit id/object\n */\n private parseCommitResponse(text: string) {\n let index: any = null\n try {\n index = text ? JSON.parse(text) : null\n } catch {\n throw new Error(`GitLab commit invalid JSON response: ${text}`)\n }\n if (!index || (!index.id && !index.commit)) {\n throw new Error(`GitLab commit unexpected response: ${JSON.stringify(index)}`)\n }\n return index.id || index.commit || index\n }\n\n /**\n * Post commit request and return parsed commit response.\n * @param {string} url endpoint URL\n * @param {string} body request body\n * @returns {Promise<any>} parsed commit response\n */\n private async postCommit(url: string, body: string) {\n const response = await this.fetchWithRetry(url, { method: 'POST', headers: this.headers, body })\n const text = await response.text().catch(() => '')\n return this.parseCommitResponse(text)\n }\n\n /**\n * Wait helper for retry backoff.\n * @param {number} attempt attempt number\n * @returns {Promise<void>}\n */\n private async _waitAttempt(attempt: number): Promise<void> {\n const wait = this.backoffMs(attempt)\n await new Promise((r) => setTimeout(r, wait))\n }\n\n /**\n * Prepare JSON body for commit API call.\n * @returns {string} JSON body\n */\n private _prepareCommitBody(branch: string, message: string, actions: any[]) {\n return JSON.stringify({ branch, commit_message: message, actions })\n }\n\n /**\n * Optionally verify parent SHA; rethrow errors after logging.\n * @param {string} expectedParentSha expected SHA\n * @param {string} branch branch name\n * @returns {Promise<void>}\n */\n private async _maybeVerifyParent(expectedParentSha: string, branch: string) {\n try {\n await this.verifyParent(expectedParentSha, branch)\n } catch (error: any) {\n if (typeof console !== 'undefined' && (console as any).warn) (console as any).warn('verifyParent skipped:')\n throw error\n }\n }\n\n /**\n * \u30EA\u30DD\u30B8\u30C8\u30EA\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param {string} branch \u30D6\u30E9\u30F3\u30C1\u540D (default: 'main')\n * @returns {Promise<{headSha:string,shas:Record<string,string>,fetchContent:(paths:string[])=>Promise<Record<string,string>>}>}\n */\n async fetchSnapshot(branch = 'main', concurrency = 5): Promise<any> {\n const headSha = await this._determineHeadSha(branch)\n const { shas, fileSet } = await this._fetchTreeAndBuildShas(branch)\n\n const cache = new Map<string, string>()\n const snapshot: Record<string, string> = {}\n /**\n * Fetch content helper for requested paths.\n * @param {string[]} paths File paths to fetch\n * @returns {Promise<Record<string,string>>}\n */\n const fetchContent = (paths: string[]) => this._fetchContentFromFileSet(fileSet, cache, snapshot, paths, branch, concurrency)\n\n return { headSha, shas, fetchContent, snapshot }\n }\n\n /**\n * Determine the head SHA for a branch; fallback to branch name if unavailable.\n * @param {string} branch branch name\n * @returns {Promise<string>} head SHA or branch\n */\n private async _determineHeadSha(branch: string): Promise<string> {\n // If caller already passed a commit-ish SHA, avoid calling the branches API\n // (GitLab returns 404 for branches/<sha> in many setups). Accept common\n // short/long hex SHAs and return as-is to avoid noisy 404s.\n if (typeof branch === 'string' && /^[0-9a-f]{7,40}$/.test(branch)) return branch\n\n try {\n const branchResponse = await this.fetchWithRetry(`${this.baseUrl}/repository/branches/${encodeURIComponent(branch)}`, { method: 'GET', headers: this.headers })\n if (!branchResponse?.ok) return branch\n\n const branchJson = await branchResponse.json().catch(() => null)\n const commit = branchJson?.commit\n const remoteHead = commit?.id ?? commit?.sha\n return remoteHead ?? branch\n } catch {\n if (typeof console !== 'undefined' && (console as any).warn) (console as any).warn('determineHeadSha fallback')\n }\n return branch\n }\n\n /**\n * Fetch repository tree and build shas map and fileSet.\n * @param {string} branch branch name\n * @returns {Promise<{shas:Record<string,string>,fileSet:Set<string>}>}\n */\n private async _fetchTreeAndBuildShas(branch: string): Promise<{ shas: Record<string, string>; fileSet: Set<string> }> {\n const treeResponse = await this.fetchWithRetry(`${this.baseUrl}/repository/tree?recursive=true&ref=${encodeURIComponent(branch)}`, { method: 'GET', headers: this.headers })\n const treeJ = await treeResponse.json()\n const files = Array.isArray(treeJ) ? treeJ.filter((t: any) => t.type === 'blob') : []\n return this._buildShasAndFileSet(files)\n }\n\n /**\n * Fetch contents for requested paths from a FileSet with caching.\n * @param {Set<string>} fileSet set of available files\n * @param {Map<string,string>} cache content cache\n * @param {Record<string,string>} snapshot snapshot output\n * @param {string[]} paths requested paths\n * @param {string} branch branch name\n * @param {number} concurrency concurrency level\n * @returns {Promise<Record<string,string>>}\n */\n private async _fetchContentFromFileSet(fileSet: Set<string>, cache: Map<string, string>, snapshot: Record<string, string>, paths: string[], branch: string, concurrency: number) {\n const out: Record<string, string> = {}\n const targets = Array.from(new Set(paths)).filter((p) => fileSet.has(p))\n /**\n * Mapper to fetch a single file (used with concurrency helper).\n * @param {string} p \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<null>}\n */\n await mapWithConcurrency(targets, async (p: string) => {\n const content = await this._fetchFileContentForPath(cache, snapshot, p, branch)\n if (content !== null) out[p] = content\n return null\n }, concurrency)\n return out\n }\n\n /**\n * Fetch the content for a single file path, updating cache and snapshot.\n * @param {Map<string,string>} cache cache map\n * @param {Record<string,string>} snapshot snapshot map\n * @param {string} p file path\n * @param {string} branch branch\n * @returns {Promise<string|null>} file content or null\n */\n private async _fetchFileContentForPath(cache: Map<string, string>, snapshot: Record<string, string>, p: string, branch: string) {\n if (cache.has(p)) {\n const v = cache.get(p) as string\n snapshot[p] = v\n return v\n }\n const content = await this._fetchFileRaw(p, branch)\n if (content !== null) {\n cache.set(p, content)\n snapshot[p] = content\n return content\n }\n return null\n }\n\n /**\n * Fetch raw file content from GitLab; return null on failure.\n * @param {string} path file path\n * @param {string} branch branch name\n * @returns {Promise<string|null>} file content or null\n */\n private async _fetchFileRaw(path: string, branch: string) {\n try {\n const rawResponse = await this.fetchWithRetry(`${this.baseUrl}/repository/files/${encodeURIComponent(path)}/raw?ref=${encodeURIComponent(branch)}`, { method: 'GET', headers: this.headers })\n if (!rawResponse.ok) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('fetchSnapshot file failed', path)\n return null\n }\n return await rawResponse.text()\n } catch {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('fetchSnapshot file error', path)\n return null\n }\n }\n\n /**\n * Build shas map and fileSet from tree entries\n * @returns {{shas:Record<string,string>,fileSet:Set<string>}}\n */\n private _buildShasAndFileSet(files: any[]) {\n const shas: Record<string, string> = {}\n const fileSet = new Set<string>()\n for (const f of files) {\n if (f && f.path) {\n const sha = (f as any).id || (f as any).sha || ''\n shas[f.path] = sha\n fileSet.add(f.path)\n }\n }\n return { shas, fileSet }\n }\n\n /**\n * Resolve a commit-ish (branch, tag, or SHA) to a commit SHA.\n * Resolution order: branch -> tag -> commits endpoint -> treat as SHA\n * Throws if not resolvable.\n * @param {string} reference commit-ish to resolve\n * @returns {Promise<string>} resolved commit SHA\n */\n async resolveRef(reference: string): Promise<string> {\n if (typeof reference === 'string' && /^[0-9a-f]{40}$/.test(reference)) return reference\n\n const resolvers: Array<(_reference: string) => Promise<string | null>> = [\n this._tryResolveBranch.bind(this),\n this._tryResolveTag.bind(this),\n this._tryResolveCommit.bind(this),\n ]\n\n const resolved = await this._runResolvers(reference, resolvers)\n if (resolved) return resolved\n\n throw new Error(`resolveRef: ref '${reference}' not found`)\n }\n\n /**\n * Run resolver functions in order and return the first non-null result.\n * @param {string} reference commit-ish to resolve\n * @param {Array<(_reference: string) => Promise<string | null>>} resolvers resolver functions\n * @returns {Promise<string|null>} resolved sha or null\n */\n private async _runResolvers(reference: string, resolvers: Array<(_reference: string) => Promise<string | null>>): Promise<string | null> {\n for (const r of resolvers) {\n try {\n const v = await r(reference)\n if (v) return v\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('resolveRef resolver failed', error)\n }\n }\n return null\n }\n\n /**\n * Try to resolve a branch name to its commit SHA.\n * @param {string} reference branch name\n * @returns {Promise<string|null>} resolved sha or null\n */\n private async _tryResolveBranch(reference: string): Promise<string | null> {\n const branchResp = await this.fetchWithRetry(`${this.baseUrl}/repository/branches/${encodeURIComponent(reference)}`, { method: 'GET', headers: this.headers })\n if (branchResp && branchResp.ok) {\n const bj = await branchResp.json().catch(() => null)\n const maybe = bj && (bj.commit && (bj.commit.id || bj.commit.sha))\n if (typeof maybe === 'string' && maybe.length > 0) return maybe\n }\n return null\n }\n\n /**\n * Try to resolve a tag name to a commit SHA.\n * @param {string} reference tag name\n * @returns {Promise<string|null>} resolved SHA or null\n */\n private async _tryResolveTag(reference: string): Promise<string | null> {\n const tagResp = await this.fetchWithRetry(`${this.baseUrl}/repository/tags/${encodeURIComponent(reference)}`, { method: 'GET', headers: this.headers })\n if (tagResp && tagResp.ok) {\n const tj = await tagResp.json().catch(() => null)\n const maybe = tj && (tj.commit && (tj.commit.id || tj.commit.sha))\n if (typeof maybe === 'string' && maybe.length > 0) return maybe\n }\n return null\n }\n\n /**\n * Try to resolve a commit via commits endpoint.\n * @param {string} reference commit-ish\n * @returns {Promise<string|null>} resolved SHA or null\n */\n private async _tryResolveCommit(reference: string): Promise<string | null> {\n const commitResp = await this.fetchWithRetry(`${this.baseUrl}/repository/commits/${encodeURIComponent(reference)}`, { method: 'GET', headers: this.headers })\n if (commitResp && commitResp.ok) {\n const cj = await commitResp.json().catch(() => null)\n const maybe = cj && (cj.id || cj.sha)\n if (typeof maybe === 'string' && maybe.length > 0) return maybe\n }\n return null\n }\n}\n\nexport default GitLabAdapter\n", "/**\n * SHA-1\u30CF\u30C3\u30B7\u30E5\u5024\u3092\u8A08\u7B97\u3057\u306616\u9032\u6587\u5B57\u5217\u3067\u8FD4\u3059\n * @param {string} content - \u30CF\u30C3\u30B7\u30E5\u5BFE\u8C61\u306E\u6587\u5B57\u5217\n * @returns {Promise<string>} SHA-1\u30CF\u30C3\u30B7\u30E5\u306E16\u9032\u8868\u73FE\n */\nexport async function shaOf(content: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(content)\n const hashBuffer = await crypto.subtle.digest('SHA-1', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n}\n\n/**\n * Git \u306E blob \u3068\u3057\u3066\u306E SHA-1 \u30CF\u30C3\u30B7\u30E5\u3092\u8A08\u7B97\u3057\u306616\u9032\u6587\u5B57\u5217\u3067\u8FD4\u3059\n * @param {string} content - blob \u306E\u4E2D\u8EAB\u3068\u306A\u308B\u6587\u5B57\u5217\n * @returns {Promise<string>} SHA-1\u30CF\u30C3\u30B7\u30E5\u306E16\u9032\u8868\u73FE\uFF08git blob \u7528\uFF09\n */\nexport async function shaOfGitBlob(content: string): Promise<string> {\n const encoder = new TextEncoder()\n const body = encoder.encode(content)\n const header = encoder.encode(`blob ${body.byteLength}\\0`)\n const merged = new Uint8Array(header.length + body.length)\n merged.set(header)\n merged.set(body, header.length)\n const hashBuffer = await crypto.subtle.digest('SHA-1', merged)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n}\n", "import type { StorageBackend } from './storageBackend.ts'\n\n/**\n *\n */\nexport class LocalChangeApplier {\n private backend: StorageBackend\n\n /**\n *\n */\n constructor(backend: StorageBackend) {\n this.backend = backend\n }\n\n /**\n *\n */\n async applyCreateOrUpdate(ch: any) {\n // Ensure workspace copy is removed first (delete may remove all segments),\n // then persist base blob so it remains.\n await this.backend.deleteBlob(ch.path, 'workspace')\n await this.backend.writeBlob(ch.path, ch.content, 'base')\n }\n\n /**\n *\n */\n async applyDelete(ch: any) {\n await this.backend.deleteBlob(ch.path, 'info')\n // Backend manages base segment; remove blobs from backend\n await this.backend.deleteBlob(ch.path)\n await this.backend.deleteBlob(ch.path, 'workspace')\n }\n}\n\nexport default LocalChangeApplier\n", "\uFEFFimport type { StorageBackend } from './storageBackend.ts'\n\nconst WORKSPACE = 'workspace'\nconst BASE = 'base'\nconst INFO = 'info'\nconst INFO_WORKSPACE = 'info-workspace'\nconst INFO_GIT = 'info-git'\n\n/**\n * \u30ED\u30FC\u30AB\u30EB\u30D5\u30A1\u30A4\u30EB\u64CD\u4F5C\u306E\u30E9\u30C3\u30D1\u30FC\n */\nexport class LocalFileManager {\n private backend: StorageBackend\n\n /**\n * \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\n * @param {StorageBackend} backend - \u30B9\u30C8\u30EC\u30FC\u30B8\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\n */\n constructor(backend: StorageBackend) {\n this.backend = backend\n }\n\n /**\n * \u30D5\u30A1\u30A4\u30EB\u3092\u66F8\u304D\u8FBC\u3080\uFF08workspace\u9818\u57DF\uFF09\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @param {string} content - \u66F8\u304D\u8FBC\u3080\u5185\u5BB9\n * @returns {Promise<void>}\n */\n async writeFile(filepath: string, content: string): Promise<void> {\n await this.backend.writeBlob(filepath, content, WORKSPACE)\n }\n\n /**\n * git \u306B\u6B8B\u308B info \u3092\u5143\u306B workspace \u7528\u306E\u30C8\u30F3\u30D6\u30B9\u30C8\u30FC\u30F3\u3092\u4F5C\u6210\u3057\u3066\u66F8\u304D\u8FBC\u3080\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<void>}\n */\n private async _writeTombstoneFromGit(filepath: string): Promise<void> {\n const gitInfoTxt = await this.backend.readBlob(filepath, INFO_GIT)\n let gitInfo: any = {}\n if (gitInfoTxt) {\n try {\n gitInfo = JSON.parse(gitInfoTxt)\n } catch {\n gitInfo = {}\n }\n }\n gitInfo.state = 'deleted'\n gitInfo.updatedAt = Date.now()\n await this.backend.writeBlob(filepath, JSON.stringify(gitInfo), INFO_WORKSPACE)\n }\n\n /**\n * \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306E info \u3092\u30C8\u30F3\u30D6\u30B9\u30C8\u30FC\u30F3\u72B6\u614B\u306B\u66F4\u65B0\u3057\u3066\u66F8\u304D\u8FBC\u3080\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<void>}\n */\n private async _writeWorkspaceTombstone(filepath: string): Promise<void> {\n const existingWorkspaceInfoTxt = await this.backend.readBlob(filepath, INFO)\n let existingWorkspaceInfo: any = {}\n if (existingWorkspaceInfoTxt) {\n try {\n existingWorkspaceInfo = JSON.parse(existingWorkspaceInfoTxt)\n } catch {\n existingWorkspaceInfo = {}\n }\n }\n existingWorkspaceInfo.state = 'deleted'\n existingWorkspaceInfo.updatedAt = Date.now()\n await this.backend.writeBlob(filepath, JSON.stringify(existingWorkspaceInfo), INFO_WORKSPACE)\n }\n\n /**\n * info \u95A2\u9023\u306E\u30A8\u30F3\u30C8\u30EA\u3092\u524A\u9664\u3059\u308B\uFF08best-effort\uFF09\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<void>}\n */\n private async _deleteInfos(filepath: string): Promise<void> {\n await this.backend.deleteBlob(filepath, INFO_WORKSPACE)\n await this.backend.deleteBlob(filepath, INFO)\n }\n\n /**\n * \u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\u3059\u308B\uFF08workspace \u3068 info \u3092\u30AF\u30EA\u30A2\uFF09\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<void>}\n */\n async deleteFile(filepath: string): Promise<void> {\n const gitBase = await this.backend.readBlob(filepath, BASE)\n // read existing unprefixed info (workspace-local info) to decide action\n const existingInfoTxt = await this.backend.readBlob(filepath, INFO)\n\n // remove workspace cache first to avoid accidental deletion of newly written workspace-info\n await this.backend.deleteBlob(filepath, WORKSPACE)\n\n try {\n if (gitBase !== null) {\n // preserve git-scoped info, but create a workspace tombstone derived from git info\n await this._writeTombstoneFromGit(filepath)\n return\n }\n // If there was an existing workspace-local info entry, persist a workspace tombstone\n // so the deletion is recorded locally. Otherwise remove info entries entirely so\n // the entry disappears (covers add-then-delete-before-base case).\n if (existingInfoTxt !== null) {\n await this._writeWorkspaceTombstone(filepath)\n return\n }\n await this._deleteInfos(filepath)\n } catch {\n // best-effort: ignore and finish\n }\n }\n\n /**\n * \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u307E\u305F\u306F\u30D9\u30FC\u30B9\u304B\u3089\u30D5\u30A1\u30A4\u30EB\u3092\u8AAD\u307F\u51FA\u3059\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<string|null>} \u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\u307E\u305F\u306F null\n */\n async readFile(filepath: string): Promise<string | null> {\n const wsBlob = await this.backend.readBlob(filepath, WORKSPACE)\n if (wsBlob !== null) return wsBlob\n const baseBlob = await this.backend.readBlob(filepath, BASE)\n if (baseBlob !== null) return baseBlob\n return null\n }\n\n /**\n * \u30D5\u30A1\u30A4\u30EB\u3092\u30EA\u30CD\u30FC\u30E0\u3059\u308B\uFF08\u5185\u5BB9\u3092\u30B3\u30D4\u30FC\u3057\u3066\u5143\u3092\u524A\u9664\uFF09\n * @param {string} from - \u5143\u30D1\u30B9\n * @param {string} to - \u5148\u30D1\u30B9\n * @returns {Promise<void>}\n */\n async renameFile(from: string, to: string): Promise<void> {\n const content = await this.readFile(from)\n if (content === null) throw new Error('Source file not found')\n await this.writeFile(to, content)\n await this.deleteFile(from)\n }\n}\n\nexport default LocalFileManager\n\n", "\uFEFFimport type { StorageBackend } from './storageBackend.ts'\nimport { IndexFile } from './types.ts'\n\n/**\n * \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u7BA1\u7406\u30AF\u30E9\u30B9\n */\nexport class IndexManager {\n private backend: StorageBackend\n private head: string = ''\n private lastCommitKey: string | undefined\n\n /**\n * \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\n * @param {StorageBackend} backend - \u30B9\u30C8\u30EC\u30FC\u30B8\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\n */\n constructor(backend: StorageBackend) {\n this.backend = backend\n }\n\n /**\n * \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u30B9\u30C8\u30EC\u30FC\u30B8\u304B\u3089\u8AAD\u307F\u8FBC\u3080\n * @returns {Promise<void>}\n */\n async loadIndex(): Promise<void> {\n try {\n const raw = await this.backend.readIndex()\n if (raw) {\n this.head = raw.head || ''\n this.lastCommitKey = (raw as any).lastCommitKey\n }\n } catch {\n this.head = ''\n this.lastCommitKey = undefined\n await this.saveIndex()\n }\n }\n\n /**\n * \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u30B9\u30C8\u30EC\u30FC\u30B8\u3078\u66F8\u304D\u8FBC\u3080\n * @returns {Promise<void>}\n */\n async saveIndex(): Promise<void> {\n // Preserve existing top-level fields (such as adapter metadata) when saving\n const existing = (await this.backend.readIndex()) || { head: this.head, entries: {} }\n const index: IndexFile = { ...(existing as any) }\n index.head = this.head\n if (this.lastCommitKey) (index as any).lastCommitKey = this.lastCommitKey\n else delete (index as any).lastCommitKey\n await this.backend.writeIndex(index)\n }\n\n /**\n * \u73FE\u5728\u306Ehead\u3092\u8FD4\u3059\n * @returns {string}\n */\n getHead(): string {\n return this.head\n }\n\n /**\n * head\u3092\u8A2D\u5B9A\u3059\u308B\n * @param {string} h - head\u6587\u5B57\u5217\n */\n setHead(h: string): void {\n this.head = h\n }\n\n /**\n * \u6700\u5F8C\u306E\u30B3\u30DF\u30C3\u30C8\u30AD\u30FC\u3092\u8FD4\u3059\n * @returns {string|undefined}\n */\n getLastCommitKey(): string | undefined {\n return this.lastCommitKey\n }\n\n /**\n * \u6700\u5F8C\u306E\u30B3\u30DF\u30C3\u30C8\u30AD\u30FC\u3092\u8A2D\u5B9A\u3059\u308B\n * @param {string|undefined} k - \u30B3\u30DF\u30C3\u30C8\u30AD\u30FC\n */\n setLastCommitKey(k: string | undefined): void {\n this.lastCommitKey = k\n }\n\n /**\n * \u73FE\u5728\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u53D6\u5F97\u3059\u308B\uFF08Proxy\u3067head\u3092\u59D4\u8B72\uFF09\n * @returns {Promise<IndexFile>} \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n async getIndex(): Promise<IndexFile> {\n const index = await this.backend.readIndex()\n const base = index || { head: this.head, entries: {} }\n const self = this\n return new Proxy(base, {\n /**\n * Proxy get handler\n * @param {any} target - \u5143\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n * @param {string|symbol} property - \u53D6\u5F97\u30D7\u30ED\u30D1\u30C6\u30A3\n * @returns {any}\n */\n get(target, property: string | symbol) {\n if (property === 'head') return self.head || (target as any).head\n return (target as any)[property]\n },\n /**\n * Proxy set handler\n * @param {any} target - \u5143\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n * @param {string|symbol} property - \u8A2D\u5B9A\u30D7\u30ED\u30D1\u30C6\u30A3\n * @param {any} value - \u8A2D\u5B9A\u5024\n * @returns {boolean}\n */\n set(target, property: string | symbol, value) {\n if (property === 'head') {\n self.head = value as string\n }\n (target as any)[property] = value\n return true\n }\n }) as IndexFile\n }\n\n /**\n * info \u306B\u5B58\u5728\u3059\u308B\u5168\u30D1\u30B9\u3092\u5217\u6319\u3059\u308B\n * @returns {Promise<string[]>} \u30D1\u30B9\u306E\u914D\u5217\n */\n async listPaths(): Promise<string[]> {\n const infos = await this.backend.listFiles(undefined, 'info')\n const out: string[] = []\n for (const it of infos) {\n // Exclude explicit tombstones (state: 'deleted') from visible paths\n try {\n if (it.info) {\n const parsed = JSON.parse(it.info)\n if (parsed && parsed.state === 'deleted') continue\n }\n } catch {\n // ignore parse errors and include the path\n }\n out.push(it.path)\n }\n return out\n }\n}\n\nexport default IndexManager\n\n", "\uFEFFimport { StorageBackend } from './storageBackend.ts'\nimport { IndexManager } from './indexManager.ts'\n\n/**\n * \u5909\u66F4\u8FFD\u8DE1\u3092\u884C\u3046\u30E6\u30FC\u30C6\u30A3\u30EA\u30C6\u30A3\u30AF\u30E9\u30B9\n */\nexport class ChangeTracker {\n private backend: StorageBackend\n private indexManager: IndexManager\n\n /**\n * \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\n * @param {StorageBackend} backend - \u30B9\u30C8\u30EC\u30FC\u30B8\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\n * @param {IndexManager} indexManager - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u7BA1\u7406\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n constructor(backend: StorageBackend, indexManager: IndexManager) {\n this.backend = backend\n this.indexManager = indexManager\n }\n\n /**\n * \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306E\u5909\u66F4\u30BB\u30C3\u30C8\u3092\u53D6\u5F97\u3059\u308B\n * @returns {Promise<Array>} \u5909\u66F4\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u914D\u5217\n */\n async getChangeSet(): Promise<Array<any>> {\n type Change =\n | { type: 'create'; path: string; content: string }\n | { type: 'update'; path: string; content: string; baseSha?: string }\n | { type: 'delete'; path: string; baseSha: string }\n\n const changes: Change[] = []\n const deleteChanges = await this._changesFromIndexDeletes()\n changes.push(...deleteChanges)\n const tombChanges = await this._changesFromTombstones()\n changes.push(...tombChanges)\n const indexChanges = await this._changesFromIndexEntries()\n changes.push(...indexChanges)\n return changes\n }\n\n /**\n * \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5DEE\u5206\u304B\u3089\u524A\u9664\u5909\u66F4\u3092\u53D6\u5F97\u3059\u308B\n * @returns {Promise<Array<{type:'delete';path:string;baseSha:string}>>} \u524A\u9664\u5909\u66F4\u306E\u914D\u5217\n */\n private async _changesFromIndexDeletes(): Promise<Array<{ type: 'delete'; path: string; baseSha: string }>> {\n const out: Array<{ type: 'delete'; path: string; baseSha: string }> = []\n const index = await this.indexManager.getIndex()\n for (const [p, entry] of Object.entries(index.entries || {})) {\n try {\n if (await this._isIndexEntryDeleted(entry as any, p)) {\n const ie: any = entry as any\n out.push({ type: 'delete', path: p, baseSha: ie.baseSha })\n }\n } catch {\n continue\n }\n }\n return out\n }\n\n /**\n * Determine whether an index entry should be considered a local delete.\n * - explicit deleted state -> true\n * - only if workspaceSha existed previously and workspace blob now missing\n * @param ie index entry\n * @param p file path\n * @returns true when entry represents a local deletion\n */\n private async _isIndexEntryDeleted(ie: any, p: string): Promise<boolean> {\n if (!ie || !ie.baseSha) return false\n if (ie.state === 'deleted') return true\n if (!ie.workspaceSha) return false\n const ws = await this.backend.readBlob(p, 'workspace')\n return ws === null\n }\n\n /**\n * \u30C8\u30A5\u30FC\u30E0\u30B9\u30C8\u30FC\u30F3\u304B\u3089\u524A\u9664\u5909\u66F4\u3092\u53D6\u5F97\u3059\u308B\uFF08\u672A\u5B9F\u88C5\uFF1A\u7A7A\u914D\u5217\u3092\u8FD4\u3059\uFF09\n * @returns {Promise<Array<{type:'delete';path:string;baseSha:string}>>}\n */\n private async _changesFromTombstones(): Promise<Array<{ type: 'delete'; path: string; baseSha: string }>> {\n return []\n }\n\n /**\n * \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30F3\u30C8\u30EA\u304B\u3089\u4F5C\u6210\u30FB\u66F4\u65B0\u306E\u5909\u66F4\u3092\u53D6\u5F97\u3059\u308B\n * @returns {Promise<Array>} \u4F5C\u6210/\u66F4\u65B0\u5909\u66F4\u306E\u914D\u5217\n */\n private async _changesFromIndexEntries(): Promise<Array<{ type: 'create'; path: string; content: string } | { type: 'update'; path: string; content: string; baseSha?: string }>> {\n const out: Array<{ type: 'create'; path: string; content: string } | { type: 'update'; path: string; content: string; baseSha?: string }> = []\n const infos = await this.backend.listFiles(undefined, 'workspace')\n // fetch index entries once so we can merge baseSha from index metadata\n const index = await this.indexManager.getIndex()\n const indexEntries = (index && index.entries) ? index.entries : {}\n for (const it of infos) {\n const changesFor = await this._changesForIndexFile(it.path, it.info, indexEntries)\n if (changesFor.length > 0) out.push(...changesFor)\n }\n return out\n }\n\n /**\n * \u5358\u4E00\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u5909\u66F4\u3092\u62BD\u51FA\u3059\u308B\n * @param {string} p - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @param {string|null} infoTxt - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306E\u60C5\u5831\u30C6\u30AD\u30B9\u30C8\n * @returns {Promise<Array>} \u5909\u66F4\u914D\u5217\n */\n private async _changesForIndexFile(p: string, infoTxt: string | null, indexEntries: Record<string, any> = {}): Promise<Array<{ type: 'create'; path: string; content: string } | { type: 'update'; path: string; content: string; baseSha?: string }>> {\n const out: Array<{ type: 'create'; path: string; content: string } | { type: 'update'; path: string; content: string; baseSha?: string }> = []\n if (!infoTxt) return out\n let entry: any = undefined\n try { entry = JSON.parse(infoTxt) } catch { return out }\n if (!entry) return out\n // Merge baseSha from index metadata when missing in workspace info\n const indexEntry = indexEntries[p]\n if ((!entry.baseSha || entry.baseSha === undefined) && indexEntry && indexEntry.baseSha) {\n entry.baseSha = indexEntry.baseSha\n // adjust state: if workspace info marked as 'added' but index indicates a base, treat as modified\n if (entry.state === 'added') entry.state = 'modified'\n }\n const blob = await this.backend.readBlob(p, 'workspace')\n return this._changesFromIndexEntry(entry, p, blob)\n }\n\n /**\n * \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30F3\u30C8\u30EA\u304B\u3089\u5177\u4F53\u7684\u306A\u5909\u66F4\u30EA\u30B9\u30C8\u3092\u4F5C\u308B\n * @param {any} entry - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30F3\u30C8\u30EA\n * @param {string} p - \u30D1\u30B9\n * @param {string|null} blob - blob \u30B3\u30F3\u30C6\u30F3\u30C4\n * @returns {Array} \u5909\u66F4\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u914D\u5217\n */\n private _changesFromIndexEntry(entry: any, p: string, blob: string | null): Array<any> {\n const out: Array<{ type: 'create'; path: string; content: string } | { type: 'update'; path: string; content: string; baseSha?: string }> = []\n if (entry.state === 'added') {\n if (blob == null) return out\n out.push({ type: 'create', path: p, content: blob })\n return out\n }\n if (!this._isEntryConsidered(entry)) return out\n if (entry.baseSha) {\n if (blob !== null) out.push({ type: 'update', path: p, content: blob, baseSha: entry.baseSha })\n } else {\n if (blob == null) return out\n out.push({ type: 'create', path: p, content: blob })\n }\n return out\n }\n\n /**\n * \u30A8\u30F3\u30C8\u30EA\u304C\u5909\u66F4\u5BFE\u8C61\u3068\u3057\u3066\u8003\u616E\u3055\u308C\u308B\u304B\u5224\u5B9A\u3059\u308B\n * @param {any} entry - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30F3\u30C8\u30EA\n * @returns {boolean} \u8003\u616E\u5BFE\u8C61\u306A\u3089true\n */\n private _isEntryConsidered(entry: any): boolean {\n return entry.state === 'modified' || entry.state === 'conflict' || (!!entry.workspaceSha && entry.state !== 'added')\n }\n}\n\n", "import { StorageBackend } from './storageBackend.ts'\nimport { IndexManager } from './indexManager.ts'\n\n/**\n *\n */\nexport class ConflictManager {\n private backend: StorageBackend\n private indexManager: IndexManager\n\n /**\n *\n */\n constructor(backend: StorageBackend, indexManager: IndexManager) {\n this.backend = backend\n this.indexManager = indexManager\n }\n\n /**\n * \u6307\u5B9A\u30D1\u30B9\u306E\u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u5185\u5BB9\u3092\u8AAD\u307F\u53D6\u308B\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<string|null>} \u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u306E\u5185\u5BB9\u3001\u306A\u3051\u308C\u3070null\n */\n async readConflict(filepath: string): Promise<string | null> {\n const blob = await this.backend.readBlob(filepath, 'conflict')\n if (blob !== null) return blob\n return null\n }\n\n /**\n * \u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u3092\u89E3\u6D88\u3057\u3066\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u66F4\u65B0\u3059\u308B\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<boolean>} \u6210\u529F\u3059\u308C\u3070true\u3001\u5931\u6557\u3059\u308C\u3070false\n */\n async resolveConflict(filepath: string): Promise<boolean> {\n try {\n const remoteContent = await this.backend.readBlob(filepath, 'conflictBlob')\n const ie: any = await this._loadIndexEntry(filepath)\n\n if (ie && ie.remoteSha) {\n if (remoteContent !== null) {\n await this.backend.writeBlob(filepath, remoteContent, 'base')\n }\n ie.baseSha = ie.remoteSha\n delete ie.remoteSha\n ie.state = 'base'\n ie.updatedAt = Date.now()\n // Write updated entry to info blob\n await this.backend.writeBlob(filepath, JSON.stringify(ie), 'info')\n }\n\n try {\n await this.backend.deleteBlob(filepath, 'conflict')\n await this.backend.deleteBlob(filepath, 'conflictBlob')\n } catch {\n // ignore\n }\n\n // Note: entries are refreshed via backend.readIndex() in getIndex()\n // No explicit reload needed here\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Load index entry from info blob or index entries.\n * @param {string} filepath\n * @returns {Promise<any>} index entry or undefined\n */\n private async _loadIndexEntry(filepath: string): Promise<any> {\n let ie: any = undefined\n const infoTxt = await this.backend.readBlob(filepath, 'info')\n if (infoTxt) ie = JSON.parse(infoTxt)\n if (!ie) {\n const index = await this.indexManager.getIndex()\n ie = index.entries[filepath]\n }\n return ie\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u306E\u5185\u5BB9\u3092\u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u3068\u3057\u3066\u6C38\u7D9A\u5316\u3059\u308B\n * @param {string} p - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @param {string|undefined} content - \u6C38\u7D9A\u5316\u3059\u308B\u5185\u5BB9\n * @returns {Promise<void>}\n */\n async persistRemoteContentAsConflict(p: string, content: string | undefined): Promise<void> {\n if (typeof content === 'undefined') return\n try {\n await this.backend.writeBlob(p, content, 'conflictBlob')\n } catch {\n return\n }\n }\n\n /**\n * \u6307\u5B9A\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30F3\u30C8\u30EA\u3092\u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u72B6\u614B\u306B\u3059\u308B\n * @param {string} p - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @param {any} ie - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30F3\u30C8\u30EA\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n * @param {string} remoteHeadSha - \u30EA\u30E2\u30FC\u30C8\u306EHEAD SHA\n * @returns {Promise<void>}\n */\n async setIndexEntryToConflict(p: string, ie: any, remoteHeadSha: string): Promise<void> {\n ie.state = 'conflict'\n ie.remoteSha = remoteHeadSha\n ie.updatedAt = Date.now()\n await this.backend.writeBlob(p, JSON.stringify(ie), 'info')\n }\n\n /**\n * \u89E3\u6C7A\u6E08\u307F\u306E\u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u30A8\u30F3\u30C8\u30EA\u3092\u6607\u683C\u3057\u3066\u30D9\u30FC\u30B9\u72B6\u614B\u306B\u623B\u3059\n * @param {any} c - \u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u60C5\u5831\uFF08.path \u3092\u542B\u3080\uFF09\n * @param {Record<string,string>} baseSnapshot - \u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u30DE\u30C3\u30D7\n * @returns {Promise<void>}\n */\n async promoteResolvedConflictEntry(c: any, baseSnapshot: Record<string, string>): Promise<void> {\n const p = c.path\n let ie: any = undefined\n const infoTxt = await this.backend.readBlob(p, 'info')\n if (infoTxt) ie = JSON.parse(infoTxt)\n if (!ie) return\n let content = typeof baseSnapshot[p] !== 'undefined' ? baseSnapshot[p] : null\n if (content === null) {\n content = await this.backend.readBlob(p, 'conflictBlob')\n }\n if (content === null) {\n content = await this.backend.readBlob(p, 'base')\n }\n if (content !== null) {\n await this.backend.writeBlob(p, content, 'base')\n }\n ie.baseSha = ie.remoteSha\n delete ie.remoteSha\n ie.state = 'base'\n ie.updatedAt = Date.now()\n await this.backend.writeBlob(p, JSON.stringify(ie), 'info')\n await this.backend.deleteBlob(p, 'conflict')\n await this.backend.deleteBlob(p, 'conflictBlob')\n }\n\n /**\n * \u5168\u3066\u306E\u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u304C\u89E3\u6C7A\u6E08\u307F\u304B\u5224\u5B9A\u3059\u308B\n * @param {Array<any>} conflicts - \u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u4E00\u89A7\n * @returns {Promise<boolean>} \u5168\u3066\u89E3\u6C7A\u6E08\u307F\u306A\u3089true\n */\n async areAllResolved(conflicts: Array<any>): Promise<boolean> {\n for (const c of conflicts) {\n const p = c.path\n let ie: any = undefined\n const infoTxt = await this.backend.readBlob(p, 'info')\n if (infoTxt) ie = JSON.parse(infoTxt)\n if (!ie) {\n const index = await this.indexManager.getIndex()\n ie = index.entries[p]\n }\n if (!ie || !ie.remoteSha || ie.baseSha !== ie.remoteSha) return false\n }\n return true\n }\n\n /**\n * \u89E3\u6C7A\u6E08\u307F\u306E\u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u7FA4\u3092\u6607\u683C\u3057\u3066\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u66F4\u65B0\u3059\u308B\n * @param {Array<any>} conflicts - \u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u4E00\u89A7\n * @param {Record<string,string>} baseSnapshot - \u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\n * @param {string} remoteHead - \u30EA\u30E2\u30FC\u30C8\u306EHEAD\n * @returns {Promise<void>}\n */\n async promoteResolvedConflicts(conflicts: Array<any>, baseSnapshot: Record<string, string>, remoteHead: string): Promise<void> {\n if (!(await this.areAllResolved(conflicts))) return\n for (const c of conflicts) {\n await this.promoteResolvedConflictEntry(c, baseSnapshot)\n }\n this.indexManager.setHead(remoteHead)\n await this.indexManager.saveIndex()\n }\n}\n\nexport default ConflictManager\n", "import { shaOf, shaOfGitBlob } from './hashUtils.ts'\nimport { StorageBackend } from './storageBackend.ts'\nimport { IndexManager } from './indexManager.ts'\nimport { ConflictManager } from './conflictManager.ts'\nimport { LocalChangeApplier } from './localChangeApplier.ts'\n\ntype RemoteSnapshotDescriptor = {\n headSha: string\n shas: Record<string, string>\n fetchContent: (_paths: string[]) => Promise<Record<string, string>>\n}\n\n/**\n * \u30EA\u30E2\u30FC\u30C8\u540C\u671F\u3092\u884C\u3046\u30AF\u30E9\u30B9\n */\nexport class RemoteSynchronizer {\n /**\n * \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\n * @param {StorageBackend} backend - \u30B9\u30C8\u30EC\u30FC\u30B8\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\n * @param {IndexManager} indexManager - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u7BA1\u7406\n * @param {ConflictManager} conflictManager - \u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u7BA1\u7406\n * @param {LocalChangeApplier} applier - \u30ED\u30FC\u30AB\u30EB\u9069\u7528\u5668\n */\n constructor(\n private _backend: StorageBackend,\n private _indexManager: IndexManager,\n private _conflictManager: ConflictManager,\n private _applier: LocalChangeApplier\n ) { }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092pull\u3057\u3066\u30ED\u30FC\u30AB\u30EB\u3092\u540C\u671F\u3059\u308B\n * @param {RemoteSnapshotDescriptor|string} remote - \u30EA\u30E2\u30FC\u30C8\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u307E\u305F\u306FheadSha\n * @param {Record<string,string>=} baseSnapshot - \u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\n * @returns {Promise<object>} conflicts, fetchedPaths, reconciledPaths \u3092\u542B\u3080\u7D50\u679C\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n async pull(remote: RemoteSnapshotDescriptor | string, baseSnapshot?: Record<string, string>, adapterInstance?: any): Promise<object> {\n const normalized = await this._normalizeRemoteInput(remote, baseSnapshot)\n\n const conflicts: Array<any> = []\n const pathsToFetch: string[] = []\n const reconciledPaths: string[] = []\n\n for (const [p, sha] of Object.entries(normalized.shas)) {\n const classified = await this._classifyRemotePathForPull(p, sha, normalized, pathsToFetch, reconciledPaths)\n if (!classified) pathsToFetch.push(p)\n }\n\n // Metadata-first: do not fetch contents during pull.\n const fetched: Record<string, string> = {}\n await this._processRemoteAddsAndUpdates(normalized.shas, fetched, normalized.headSha, conflicts, adapterInstance, normalized)\n await this._processRemoteDeletions(normalized.shas, conflicts)\n\n if (conflicts.length === 0) {\n this._indexManager.setHead(normalized.headSha)\n await this._indexManager.saveIndex()\n return { conflicts, fetchedPaths: Object.keys(fetched), reconciledPaths }\n }\n\n await this._conflictManager.promoteResolvedConflicts(conflicts, fetched, normalized.headSha)\n\n if (reconciledPaths.length > 0) await this._indexManager.saveIndex()\n\n return { conflicts, fetchedPaths: Object.keys(fetched), reconciledPaths }\n }\n\n /**\n * \u30ED\u30FC\u30AB\u30EB\u306E\u5909\u66F4\u3092push\u3059\u308B\uFF08\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u66F4\u65B0\u3092\u884C\u3046\uFF09\n * @param {any} input - push \u5165\u529B\uFF08parentSha, changes \u7B49\uFF09\n * @param {any=} adapter - \u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u30A2\u30C0\u30D7\u30BF\n * @returns {Promise<object>} commitSha \u3092\u542B\u3080\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n async push(input: any, _adapter?: any): Promise<object> {\n if (input.parentSha === undefined || input.parentSha === null) {\n throw new Error('No parentSha set. pull required')\n }\n const currentIndex = await this._indexManager.getIndex()\n if (input.parentSha !== currentIndex.head) {\n throw new Error('\u975E\u4E92\u63DB\u306A\u66F4\u65B0 (non-fast-forward): pull \u304C\u5FC5\u8981\u3067\u3059')\n }\n if (!input.commitKey) {\n input.commitKey = await shaOf(input.parentSha + JSON.stringify(input.changes))\n }\n if (!input.changes || input.changes.length === 0) throw new Error('No changes to commit')\n\n const commitSha = await shaOf(input.parentSha + '|' + input.commitKey)\n for (const ch of input.changes as any[]) {\n await this._applyChangeLocally(ch)\n }\n this._indexManager.setHead(commitSha)\n this._indexManager.setLastCommitKey(input.commitKey)\n await this._indexManager.saveIndex()\n\n return { commitSha }\n }\n\n /**\n * \u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u9069\u7528\u3057\u3066\u30ED\u30FC\u30AB\u30EB\u3092\u7F6E\u304D\u63DB\u3048\u308B\n * @param {Record<string,string>} snapshot - \u30D1\u30B9->\u5185\u5BB9\u306E\u30DE\u30C3\u30D7\n * @param {string} headSha - \u9069\u7528\u5F8C\u306Ehead\n * @returns {Promise<void>}\n */\n async applyBaseSnapshot(snapshot: Record<string, string>, headSha: string): Promise<void> {\n const newShas: Record<string, string> = {}\n for (const [p, c] of Object.entries(snapshot)) newShas[p] = await shaOf(c)\n\n const toAddOrUpdate = await this._computeToAddOrUpdate(snapshot, newShas)\n const toRemove = await this._computeToRemove(snapshot)\n\n await this._applyRemovals(toRemove)\n await this._applyAddsOrUpdates(toAddOrUpdate, snapshot, newShas)\n\n this._indexManager.setHead(headSha)\n await this._indexManager.saveIndex()\n }\n\n /**\n * remote \u5F15\u6570\u3092\u6A19\u6E96\u306E RemoteSnapshotDescriptor \u306B\u5909\u63DB\u3059\u308B\n * @returns {Promise<RemoteSnapshotDescriptor>}\n */\n private async _normalizeRemoteInput(remote: RemoteSnapshotDescriptor | string, baseSnapshot?: Record<string, string>): Promise<RemoteSnapshotDescriptor> {\n if (typeof remote !== 'string') return remote\n const snapshot = baseSnapshot || {}\n const shas: Record<string, string> = {}\n for (const [p, c] of Object.entries(snapshot)) shas[p] = await shaOf(c)\n /**\n * \u6307\u5B9A\u30D1\u30B9\u306E\u5185\u5BB9\u3092 snapshot \u304B\u3089\u53D6\u5F97\u3059\u308B\uFF08\u5185\u90E8\u30E6\u30FC\u30C6\u30A3\u30EA\u30C6\u30A3\uFF09\n * @param {string[]} paths - \u53D6\u5F97\u3059\u308B\u30D1\u30B9\u4E00\u89A7\n * @returns {Promise<Record<string,string>>} path->content \u30DE\u30C3\u30D7\n */\n async function fetchContent(paths: string[]): Promise<Record<string, string>> {\n const out: Record<string, string> = {}\n for (const p of paths) {\n if (p in snapshot) out[p] = snapshot[p]\n }\n return out\n }\n return { headSha: remote, shas, fetchContent }\n }\n\n /**\n * \u8FFD\u52A0/\u66F4\u65B0\u5BFE\u8C61\u306E\u30D1\u30B9\u4E00\u89A7\u3092\u8A08\u7B97\u3059\u308B\n * @returns {Promise<string[]>}\n */\n private async _computeToAddOrUpdate(snapshot: Record<string, string>, newShas: Record<string, string>): Promise<string[]> {\n const out: string[] = []\n for (const [p] of Object.entries(snapshot)) {\n const sha = newShas[p]\n let entry: any = undefined\n const infoTxt = await this._backend.readBlob(p, 'info')\n if (infoTxt) entry = JSON.parse(infoTxt)\n if (!entry || entry.baseSha !== sha) out.push(p)\n }\n return out\n }\n\n /**\n * \u524A\u9664\u5BFE\u8C61\u306E\u30D1\u30B9\u4E00\u89A7\u3092\u8A08\u7B97\u3059\u308B\n * @returns {Promise<string[]>}\n */\n private async _computeToRemove(snapshot: Record<string, string>): Promise<string[]> {\n const out: string[] = []\n const infos = await this._backend.listFiles(undefined, 'info')\n for (const it of infos) {\n const p = it.path\n if (!(p in snapshot)) out.push(p)\n }\n return out\n }\n\n /**\n * \u6307\u5B9A\u30D1\u30B9\u306E\u524A\u9664\u3092\u9069\u7528\u3059\u308B\n * @param {string[]} toRemove - \u524A\u9664\u5BFE\u8C61\u30D1\u30B9\u914D\u5217\n * @returns {Promise<void>}\n */\n private async _applyRemovals(toRemove: string[]): Promise<void> {\n for (const p of toRemove) {\n await this._backend.deleteBlob(p)\n let ie: any = undefined\n const infoTxt = await this._backend.readBlob(p, 'info')\n if (infoTxt) ie = JSON.parse(infoTxt)\n if (ie && ie.state === 'base') {\n await this._backend.deleteBlob(p, 'info')\n }\n }\n }\n\n /**\n * \u8FFD\u52A0/\u66F4\u65B0\u3092\u9069\u7528\u3059\u308B\n * @returns {Promise<void>}\n */\n private async _applyAddsOrUpdates(toAddOrUpdate: string[], snapshot: Record<string, string>, newShas: Record<string, string>): Promise<void> {\n for (const p of toAddOrUpdate) {\n const content = snapshot[p]\n const sha = newShas[p]\n await this._backend.writeBlob(p, content, 'base')\n let existing: any = undefined\n const infoTxt = await this._backend.readBlob(p, 'info')\n if (infoTxt) existing = JSON.parse(infoTxt)\n if (!existing) {\n const entry = { path: p, state: 'base', baseSha: sha, updatedAt: Date.now() }\n await this._backend.writeBlob(p, JSON.stringify(entry), 'info')\n } else if (existing.state === 'base') {\n existing.baseSha = sha\n existing.updatedAt = Date.now()\n await this._backend.writeBlob(p, JSON.stringify(existing), 'info')\n }\n }\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u306E\u8FFD\u52A0/\u66F4\u65B0\u3092\u51E6\u7406\u3059\u308B\n * @returns {Promise<void>}\n */\n private async _processRemoteAddsAndUpdates(remoteShas: Record<string, string>, baseSnapshot: Record<string, string>, remoteHead: string, conflicts: Array<any>, adapterInstance?: any, _normalized?: RemoteSnapshotDescriptor): Promise<void> {\n for (const [p, remoteSha] of Object.entries(remoteShas)) {\n await this._handleRemotePath(p, remoteSha, baseSnapshot, conflicts, remoteHead, adapterInstance, _normalized)\n }\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u306E\u524A\u9664\u3092\u51E6\u7406\u3059\u308B\n * @returns {Promise<void>}\n */\n private async _processRemoteDeletions(remoteShas: Record<string, string>, conflicts: Array<any>): Promise<void> {\n const infos = await this._backend.listFiles(undefined, 'info')\n for (const it of infos) {\n const p = it.path\n if (!(p in remoteShas)) {\n let indexEntry: any = undefined\n if (it.info) {\n indexEntry = JSON.parse(it.info)\n }\n await this._handleRemoteDeletion(p, indexEntry, remoteShas, conflicts)\n }\n }\n }\n\n /**\n * \u30D7\u30EB\u6642\u306B\u500B\u5225\u30D1\u30B9\u304C\u65E2\u306B\u6574\u5408\u6E08\u307F\u304B\u5224\u5B9A\u3059\u308B\n * @returns {Promise<boolean>} \u6574\u5408\u6E08\u307F\u306A\u3089true\n */\n private async _classifyRemotePathForPull(p: string, sha: string, normalized: RemoteSnapshotDescriptor, pathsToFetch: string[], reconciledPaths: string[]): Promise<boolean> {\n let entry: any = undefined\n const infoTxt = await this._backend.readBlob(p, 'info')\n if (infoTxt) entry = JSON.parse(infoTxt)\n if (!entry) return false\n if (entry.baseSha === sha) return true\n\n const baseContent = await this._backend.readBlob(p, 'base')\n if (baseContent !== null) {\n const gitSha = await shaOfGitBlob(baseContent)\n if (gitSha === sha) {\n entry.baseSha = sha\n entry.state = entry.state || 'base'\n entry.updatedAt = Date.now()\n await this._backend.writeBlob(p, JSON.stringify(entry), 'info')\n reconciledPaths.push(p)\n return true\n }\n }\n return false\n }\n\n /**\n * \u500B\u5225\u306E\u30EA\u30E2\u30FC\u30C8\u30D1\u30B9\u3092\u51E6\u7406\u3059\u308B\uFF08\u65B0\u898F/\u65E2\u5B58\u306E\u632F\u308A\u5206\u3051\u3092\u884C\u3046\uFF09\n * @returns {Promise<void>}\n */\n private async _handleRemotePath(p: string, perFileRemoteSha: string, baseSnapshot: Record<string, string>, conflicts: Array<any>, remoteHeadSha: string, adapterInstance?: any, _normalized?: RemoteSnapshotDescriptor): Promise<void> {\n let indexEntry: any = undefined\n const infoTxt = await this._backend.readBlob(p, 'info')\n if (infoTxt) indexEntry = JSON.parse(infoTxt)\n let localWorkspace: { sha: string; content: string } | undefined = undefined\n const wsBlob = await this._backend.readBlob(p, 'workspace')\n if (wsBlob !== null) {\n const wsSha = indexEntry?.workspaceSha || await shaOf(wsBlob)\n localWorkspace = { sha: wsSha, content: wsBlob }\n }\n let localBase: { sha: string; content: string } | undefined = undefined\n const baseBlob = await this._backend.readBlob(p, 'base')\n if (baseBlob !== null && indexEntry?.baseSha) {\n localBase = { sha: indexEntry.baseSha, content: baseBlob }\n }\n\n if (!indexEntry) return await this._handleRemoteNew(p, perFileRemoteSha, baseSnapshot, conflicts, localWorkspace, localBase, remoteHeadSha, adapterInstance, _normalized)\n return await this._handleRemoteExisting(p, indexEntry, perFileRemoteSha, baseSnapshot, conflicts, localWorkspace, remoteHeadSha, adapterInstance, _normalized)\n }\n\n /**\n * \u65B0\u898F\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3059\u308B\u51E6\u7406\uFF08\u8FFD\u52A0 or conflict\uFF09\n * @returns {Promise<void>}\n */\n private async _handleRemoteNew(p: string, perFileRemoteSha: string, baseSnapshot: Record<string, string>, conflicts: Array<any>, localWorkspace: { sha: string; content: string } | undefined, localBase: { sha: string; content: string } | undefined, remoteHeadSha: string, adapterInstance?: any, _normalized?: RemoteSnapshotDescriptor): Promise<void> {\n const workspaceSha = localWorkspace ? localWorkspace.sha : undefined\n if (localWorkspace) {\n await this._handleRemoteNewConflict(p, baseSnapshot[p], remoteHeadSha, conflicts, workspaceSha, localBase?.sha, _normalized)\n return\n }\n await this._handleRemoteNewAdd(p, perFileRemoteSha, baseSnapshot, remoteHeadSha, conflicts, workspaceSha, localBase?.sha, adapterInstance, _normalized)\n }\n\n /**\n * \u65B0\u898F\u3067\u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u304C\u767A\u751F\u3057\u305F\u5834\u5408\u306E\u51E6\u7406\n * @returns {Promise<void>}\n */\n private async _handleRemoteNewConflict(p: string, content: string | undefined, remoteHeadSha: string, conflicts: Array<any>, workspaceSha: string | undefined, baseSha: string | undefined, _normalized?: RemoteSnapshotDescriptor): Promise<void> {\n await this._conflictManager.persistRemoteContentAsConflict(p, content)\n let ie: any = undefined\n const infoTxt = await this._backend.readBlob(p, 'info')\n if (infoTxt) ie = JSON.parse(infoTxt)\n if (!ie) ie = { path: p }\n await this._conflictManager.setIndexEntryToConflict(p, ie, remoteHeadSha)\n await this._indexManager.saveIndex()\n // v0.0.4: Store remote metadata (info) in conflict segment for on-demand fetching\n const remoteInfo = { path: p, baseSha: remoteHeadSha, state: 'conflict', updatedAt: Date.now() }\n await this._backend.writeBlob(p, JSON.stringify(remoteInfo), 'conflict')\n conflicts.push({ path: p, remoteSha: remoteHeadSha, workspaceSha, baseSha })\n }\n\n /**\n * \u65B0\u898F\u8FFD\u52A0\u3092\u51E6\u7406\u3059\u308B\n * @returns {Promise<void>}\n */\n private async _handleRemoteNewAdd(p: string, perFileRemoteSha: string, _baseSnapshot: Record<string, string>, _remoteHeadSha: string, _conflicts: Array<any>, _workspaceSha: string | undefined, _baseSha: string | undefined, _adapterInstance?: any, _normalized?: RemoteSnapshotDescriptor): Promise<void> {\n // Metadata-first: always record info with baseSha. Defer base blob write until on-demand fetch.\n const entry = { path: p, state: 'base', baseSha: perFileRemoteSha, updatedAt: Date.now() }\n await this._backend.writeBlob(p, JSON.stringify(entry), 'info')\n // Note: base content is NOT eagerly fetched here. On-demand fetch occurs when readBlob('base') is required.\n }\n\n /**\n * \u65E2\u5B58\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3059\u308B\u66F4\u65B0/\u7AF6\u5408\u51E6\u7406\n * @returns {Promise<void>}\n */\n private async _handleRemoteExisting(p: string, indexEntry: any, perFileRemoteSha: string, baseSnapshot: Record<string, string>, conflicts: Array<any>, localWorkspace: { sha: string; content: string } | undefined, remoteHeadSha: string, adapterInstance?: any, _normalized?: RemoteSnapshotDescriptor): Promise<void> {\n const baseSha = indexEntry.baseSha\n if (baseSha === perFileRemoteSha) return\n if (!localWorkspace || localWorkspace.sha === baseSha) {\n await this._handleRemoteExistingUpdate(p, indexEntry, perFileRemoteSha, baseSnapshot, conflicts, remoteHeadSha, adapterInstance, _normalized)\n } else {\n await this._handleRemoteExistingConflict(p, indexEntry, perFileRemoteSha, baseSnapshot, conflicts, localWorkspace, remoteHeadSha, adapterInstance, _normalized)\n }\n }\n\n /**\n * \u65E2\u5B58\u30D5\u30A1\u30A4\u30EB\u306E\u66F4\u65B0\u51E6\u7406\n * @returns {Promise<void>}\n */\n private async _handleRemoteExistingUpdate(p: string, indexEntry: any, perFileRemoteSha: string, _baseSnapshot: Record<string, string>, _conflicts: Array<any>, _remoteHeadSha: string, _adapterInstance?: any, _normalized?: RemoteSnapshotDescriptor): Promise<void> {\n // Metadata-first: update info to new baseSha; defer base blob write until requested.\n indexEntry.baseSha = perFileRemoteSha\n indexEntry.state = 'base'\n indexEntry.updatedAt = Date.now()\n await this._backend.writeBlob(p, JSON.stringify(indexEntry), 'info')\n // Note: base content is NOT eagerly fetched here. On-demand fetch occurs when readBlob('base') is required.\n }\n\n /**\n * \u65E2\u5B58\u30D5\u30A1\u30A4\u30EB\u3067\u7AF6\u5408\u304C\u767A\u751F\u3057\u305F\u5834\u5408\u306E\u51E6\u7406\n * @returns {Promise<void>}\n */\n private async _handleRemoteExistingConflict(p: string, indexEntry: any, perFileRemoteSha: string, baseSnapshot: Record<string, string>, conflicts: Array<any>, localWorkspace: { sha: string; content: string }, remoteHeadSha: string, _adapterInstance?: any, _normalized?: RemoteSnapshotDescriptor): Promise<void> {\n const baseSha = indexEntry.baseSha\n await this._conflictManager.persistRemoteContentAsConflict(p, baseSnapshot[p])\n this._conflictManager.setIndexEntryToConflict(p, indexEntry, remoteHeadSha)\n await this._indexManager.saveIndex()\n // v0.0.4: Store remote metadata (info) in conflict segment for on-demand fetching\n const remoteInfo = { path: p, baseSha: perFileRemoteSha, state: 'conflict', updatedAt: Date.now() }\n await this._backend.writeBlob(p, JSON.stringify(remoteInfo), 'conflict')\n conflicts.push({ path: p, baseSha, remoteSha: remoteHeadSha, workspaceSha: localWorkspace?.sha })\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u3067\u524A\u9664\u3055\u308C\u305F\u30D1\u30B9\u306E\u51E6\u7406\n * @returns {Promise<void>}\n */\n private async _handleRemoteDeletion(p: string, indexEntry: any, _remoteShas: Record<string, string>, conflicts: Array<any>): Promise<void> {\n let localWorkspace: { sha: string; content: string } | undefined = undefined\n const wsBlob = await this._backend.readBlob(p, 'workspace')\n if (wsBlob !== null) {\n const wsSha = indexEntry?.workspaceSha || await shaOf(wsBlob)\n localWorkspace = { sha: wsSha, content: wsBlob }\n }\n if (!indexEntry || !indexEntry.baseSha) {\n return\n }\n\n if (!localWorkspace || localWorkspace.sha === indexEntry.baseSha) {\n await this._backend.deleteBlob(p, 'info')\n await this._backend.deleteBlob(p)\n } else {\n conflicts.push({ path: p, baseSha: indexEntry.baseSha, workspaceSha: localWorkspace?.sha })\n }\n }\n\n /**\n * \u5909\u66F4\u3092\u30ED\u30FC\u30AB\u30EB\u306B\u9069\u7528\u3059\u308B\uFF08create/update/delete\uFF09\n * @returns {Promise<void>}\n */\n private async _applyChangeLocally(ch: any): Promise<void> {\n if (ch.type === 'create' || ch.type === 'update') {\n const sha = await shaOf(ch.content)\n let entry: any = undefined\n const infoTxt = await this._backend.readBlob(ch.path, 'info')\n if (infoTxt) entry = JSON.parse(infoTxt)\n if (!entry) entry = { path: ch.path }\n entry.baseSha = sha\n entry.state = 'base'\n entry.updatedAt = Date.now()\n entry.workspaceSha = undefined\n await this._backend.writeBlob(ch.path, JSON.stringify(entry), 'info')\n await this._applier.applyCreateOrUpdate(ch)\n } else if (ch.type === 'delete') {\n await this._applier.applyDelete(ch)\n }\n }\n\n /**\n * On-demand: fetch and store base content for a single path when missing.\n * @param {string} path\n * @param {any=} adapterInstance optional adapter instance to fetch remote content\n * @returns {Promise<string|null>} fetched content or null\n */\n async fetchBaseIfMissing(path: string, adapterInstance?: any): Promise<string | null> {\n // return existing base if present\n const existing = await this._backend.readBlob(path, 'base')\n if (existing !== null) return existing\n\n // read info to find baseSha\n const ie: any = await this._readInfoEntry(path)\n if (!ie || !ie.baseSha) return null\n const baseSha = ie.baseSha\n\n // Try GitHub-style adapter first\n const fromAdapter = await this._tryFetchBaseWithAdapter(adapterInstance, baseSha, path)\n if (fromAdapter !== undefined) return fromAdapter\n\n // Fallback: adapter may expose a raw file fetch API (GitLab-style)\n const rawFetch = await this._tryFetchRawFile(adapterInstance, path, ie)\n if (rawFetch !== undefined) return rawFetch\n\n return null\n }\n\n /**\n * Read and parse the stored info entry for `path`.\n * Returns parsed object or null when missing/invalid.\n * @returns {Promise<any|null>} parsed object or null\n */\n private async _readInfoEntry(path: string): Promise<any | null> {\n try {\n const infoTxt = await this._backend.readBlob(path, 'info')\n if (!infoTxt) return null\n try {\n return JSON.parse(infoTxt)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('parse infoTxt failed', path, error)\n return null\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('readBlob(info) failed', path, error)\n return null\n }\n }\n\n /**\n * Attempt to fetch base content using adapterInstance.getBlob.\n * Returns string when fetched, null when fetch attempted but failed, or undefined when adapter not supported.\n * @returns {Promise<string|null|undefined>} fetched content, null, or undefined\n */\n private async _tryFetchBaseWithAdapter(adapterInstance: any, baseSha: string, path: string): Promise<string | null | undefined> {\n if (!adapterInstance || typeof adapterInstance.getBlob !== 'function') return undefined\n try {\n const b = await adapterInstance.getBlob(baseSha)\n if (b && typeof b.content !== 'undefined') return await this._handleFetchedBlob(b, path)\n return null\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('adapter.getBlob failed', error)\n return null\n }\n }\n\n /**\n * Handle a fetched blob-like object: decode if base64 and persist into backend.\n * Returns decoded content string, or null on failure.\n * @returns {Promise<string|null>} decoded content or null on failure\n */\n private async _handleFetchedBlob(b: any, path: string): Promise<string | null> {\n try {\n const enc = b.encoding || 'utf-8'\n const content = enc === 'base64' ? this._decodeBase64ToString((b.content || '').replace(/\\n/g, '')) : b.content\n await this._backend.writeBlob(path, content, 'base')\n return content\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('handleFetchedBlob failed', error)\n return null\n }\n }\n\n /**\n * Attempt to fetch raw file using adapterInstance._fetchFileRaw if available.\n * Returns string when fetched, null when attempted but failed, or undefined when adapter not supported.\n * @returns {Promise<string|null|undefined>} fetched content, null, or undefined\n */\n private async _tryFetchRawFile(adapterInstance: any, path: string, ie: any): Promise<string | null | undefined> {\n if (!adapterInstance || typeof adapterInstance._fetchFileRaw !== 'function') return undefined\n try {\n const raw = await adapterInstance._fetchFileRaw(path, ie.branch || 'main')\n if (typeof raw === 'string') {\n await this._backend.writeBlob(path, raw, 'base')\n return raw\n }\n return null\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('adapter._fetchFileRaw failed', error)\n return null\n }\n }\n\n /**\n * Decode a base64 string into UTF-8 text. Uses global Buffer when available,\n * falls back to atob/TextDecoder for browsers.\n * @returns {string} decoded UTF-8 string\n */\n private _decodeBase64ToString(safe: string): string {\n // Try Buffer-based decode first, then atob-based decode, otherwise return input\n const bufDecoded = this._tryDecodeWithBuffer(safe)\n if (typeof bufDecoded === 'string') return bufDecoded\n const atobDecoded = this._tryDecodeWithAtob(safe)\n if (typeof atobDecoded === 'string') return atobDecoded\n return safe\n }\n\n /**\n * Convert a binary string (result of atob) into a UTF-8 string.\n * @param bin binary string\n * @returns {string} decoded UTF-8 string\n */\n private _binToUtf8(bin: string): string {\n const length_ = bin.length\n const bytes = new Uint8Array(length_)\n for (let index = 0; index < length_; index++) bytes[index] = bin.charCodeAt(index)\n return (typeof TextDecoder !== 'undefined') ? new TextDecoder().decode(bytes) : String.fromCharCode.apply(null, Array.from(bytes))\n }\n\n /**\n * Try to decode base64 using a global Buffer if available.\n * Returns decoded string or undefined when Buffer not available.\n * @param safe base64 string\n * @returns {string|undefined}\n */\n private _tryDecodeWithBuffer(safe: string): string | undefined {\n try {\n const bufGlobal = (globalThis as any).Buffer\n if (typeof bufGlobal !== 'undefined' && typeof bufGlobal.from === 'function') {\n return bufGlobal.from(safe, 'base64').toString('utf8')\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('buffer decode failed', error)\n }\n return undefined\n }\n\n /**\n * Try to decode base64 using atob/TextDecoder in browser.\n * Returns decoded string or undefined when atob not available or parse fails.\n * @param safe base64 string\n * @returns {string|undefined}\n */\n private _tryDecodeWithAtob(safe: string): string | undefined {\n try {\n if (typeof atob !== 'function') return undefined\n const bin = atob(safe)\n return this._binToUtf8(bin)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('atob decode failed', error)\n return undefined\n }\n }\n}\n\nexport default RemoteSynchronizer\n", "\uFEFFimport { IndexFile } from './types.ts'\nimport { StorageBackend } from './storageBackend.ts'\nimport { OpfsStorage } from './opfsStorage.ts'\nimport { GitHubAdapter } from '../git/githubAdapter.ts'\nimport { GitLabAdapter } from '../git/gitlabAdapter.ts'\nimport { Logger } from '../git/abstractAdapter.ts'\nimport type { CommitHistoryQuery, CommitHistoryPage } from '../git/adapter.ts'\nimport type { BranchListQuery, BranchListPage, RepositoryMetadata } from './types.ts'\nimport { shaOf } from './hashUtils.ts'\nimport { LocalChangeApplier } from './localChangeApplier.ts'\nimport { LocalFileManager } from './localFileManager.ts'\nimport { IndexManager } from './indexManager.ts'\nimport { ChangeTracker } from './changeTracker.ts'\nimport { ConflictManager } from './conflictManager.ts'\nimport { RemoteSynchronizer } from './remoteSynchronizer.ts'\n\ntype RemoteSnapshotDescriptor = {\n headSha: string\n shas: Record<string, string>\n fetchContent: (_paths: string[]) => Promise<Record<string, string>>\n}\n\n/** Virtual file system - \u6C38\u7D9A\u5316\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\u3092\u62BD\u8C61\u5316\u3057\u305F\u4EEE\u60F3\u30D5\u30A1\u30A4\u30EB\u30B7\u30B9\u30C6\u30E0 */\nexport class VirtualFS {\n // adapter instance managed by VirtualFS\n private adapter: any | null = null\n // optional logger injected via constructor options; propagated to adapters when present\n private logger?: Logger\n // adapter metadata persisted in index\n private adapterMeta: any | null = null\n // `workspace` state moved to StorageBackend implementations; tombstones are\n // persisted in the backend as `info` entries with `state: 'deleted'.`.\n private indexManager: IndexManager\n private backend: StorageBackend\n private applier: LocalChangeApplier\n private localFileManager: LocalFileManager\n private changeTracker: ChangeTracker\n private conflictManager: ConflictManager\n private remoteSynchronizer: RemoteSynchronizer\n\n /**\n * VirtualFS \u306E\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u3092\u521D\u671F\u5316\u3057\u307E\u3059\u3002\n * @param options \u30AA\u30D7\u30B7\u30E7\u30F3\n * @returns {void}\n */\n constructor(options?: { backend?: StorageBackend; logger?: Logger }) {\n if (options?.backend) this.backend = options.backend\n else this.backend = new OpfsStorage('default')\n // capture optional logger for adapter propagation\n if (options && options.logger) this.logger = options.logger\n this.applier = new LocalChangeApplier(this.backend)\n this.localFileManager = new LocalFileManager(this.backend)\n this.indexManager = new IndexManager(this.backend)\n this.changeTracker = new ChangeTracker(this.backend, this.indexManager)\n this.conflictManager = new ConflictManager(this.backend, this.indexManager)\n this.remoteSynchronizer = new RemoteSynchronizer(this.backend, this.indexManager, this.conflictManager, this.applier)\n }\n\n /**\n * public-facing property accessors for backwards compatibility with tests\n * @returns {string}\n */\n get head(): string {\n return this.indexManager.getHead()\n }\n\n /**\n * Setter for head\n * @param {string} h - head value\n * @returns {void}\n */\n set head(h: string) {\n this.indexManager.setHead(h)\n }\n\n /**\n * Get lastCommitKey\n * @returns {string|undefined}\n */\n get lastCommitKey(): string | undefined {\n return this.indexManager.getLastCommitKey()\n }\n\n /**\n * Set lastCommitKey\n * @param {string|undefined} k\n * @returns {void}\n */\n set lastCommitKey(k: string | undefined) {\n this.indexManager.setLastCommitKey(k)\n }\n\n /**\n * VirtualFS \u306E\u521D\u671F\u5316\u3092\u884C\u3044\u307E\u3059\uFF08\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\u521D\u671F\u5316\u3068 index \u8AAD\u307F\u8FBC\u307F\uFF09\u3002\n * @returns {Promise<void>}\n */\n async init() {\n await this.backend.init()\n await this.loadIndex()\n }\n\n /**\n * \u6C38\u7D9A\u5316\u30EC\u30A4\u30E4\u30FC\u304B\u3089 index \u3092\u8AAD\u307F\u8FBC\u307F\u3001\u5185\u90E8\u30DE\u30C3\u30D7\u3092\u521D\u671F\u5316\u3057\u307E\u3059\u3002\n * @returns {Promise<void>}\n */\n private async loadIndex() {\n await this.indexManager.loadIndex()\n try {\n const index = await this.indexManager.getIndex()\n this.adapterMeta = (index as any).adapter || null\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('loadIndex getIndex failed', error)\n this.adapterMeta = null\n }\n }\n\n /**\n * Set adapter instance and persist adapter metadata into index file.\n * @param adapter adapter instance (or null to clear)\n * @param meta metadata to persist (e.g. { type:'github', opts: {...} })\n * @returns {Promise<void>}\n */\n async setAdapter(adapter: any | null, meta?: any) {\n this.adapter = adapter\n this.adapterMeta = meta || null\n // If adapter instance provided, propagate logger when available\n await this._tryInjectLogger()\n await this._tryPersistAdapterMeta()\n }\n\n /**\n * Try to inject the configured logger into the adapter instance (best-effort).\n * @returns {Promise<void>}\n */\n private async _tryInjectLogger(): Promise<void> {\n try {\n if (this.adapter && this.logger && typeof (this.adapter as any).setLogger === 'function') {\n (this.adapter as any).setLogger(this.logger)\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('adapter.setLogger failed', error)\n }\n }\n\n /**\n * Persist adapter metadata into the index file (best-effort).\n * @returns {Promise<void>}\n */\n private async _tryPersistAdapterMeta(): Promise<void> {\n try {\n const index = await this.indexManager.getIndex()\n if (this.adapterMeta) (index as any).adapter = this.adapterMeta\n else delete (index as any).adapter\n await this.backend.writeIndex(index)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('writeIndex failed', error)\n }\n }\n\n /**\n * Return persisted adapter metadata from the index (or cached meta).\n * This does not necessarily instantiate the adapter instance; use\n * `getAdapterInstance()` to obtain an instantiated adapter.\n * @returns {Promise<any|null>}\n */\n async getAdapter(): Promise<any | null> {\n if (this.adapterMeta) return this.adapterMeta\n try {\n const index = await this.indexManager.getIndex()\n this.adapterMeta = (index as any).adapter || null\n return this.adapterMeta\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('getAdapter getIndex failed', error)\n return null\n }\n }\n\n /**\n * Return or lazily create the adapter instance based on persisted metadata.\n * @returns {Promise<any|null>}\n */\n async getAdapterInstance(): Promise<any | null> {\n if (this.adapter) return this.adapter\n // ensure adapterMeta populated from loaded index\n if (!this.adapterMeta) await this._ensureAdapterMetaLoaded()\n if (!this.adapterMeta || !this.adapterMeta.type) return null\n const type = this.adapterMeta.type\n const options = this.adapterMeta.opts || {}\n // instantiate via helper to reduce cognitive complexity for linter\n const created = this._instantiateAdapter(type, options)\n if (created) this.adapter = created\n return this.adapter || null\n }\n\n /**\n * Load adapterMeta from index if not present.\n * @returns {Promise<void>}\n */\n private async _ensureAdapterMetaLoaded(): Promise<void> {\n try {\n const index = await this.indexManager.getIndex()\n this.adapterMeta = (index as any).adapter || null\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('getAdapterInstance helper getIndex failed', error)\n this.adapterMeta = null\n }\n }\n\n /**\n * Create adapter instance for given type and options. Returns null on failure.\n * @param type adapter type string\n * @param opts adapter options\n * @returns {any|null}\n */\n private _instantiateAdapter(type: string, options: any): any | null {\n try {\n // Merge in logger if available so created adapters receive it via DI\n const optionsWithLogger = { ...(options || {}) } as any\n if (this.logger) optionsWithLogger.logger = this.logger\n if (type === 'github') return new GitHubAdapter(optionsWithLogger)\n if (type === 'gitlab') return new GitLabAdapter(optionsWithLogger)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('instantiate adapter failed', error)\n return null\n }\n return null\n }\n\n /**\n * Helper: obtain backend listFilesRaw in a safe manner.\n * @returns {Promise<any[]>}\n */\n private async _getBackendFilesRaw(): Promise<any[]> {\n try {\n if (this.backend && typeof (this.backend as any).listFilesRaw === 'function') {\n return await (this.backend as any).listFilesRaw()\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_getBackendFilesRaw failed', error)\n }\n return []\n }\n\n /**\n * Helper: apply parsed info text into stats object when possible.\n * @param infoTxt raw info text\n * @param stats stats object to mutate\n * @returns {void}\n */\n private _applyInfoTxtToStats(infoTxt: any, stats: any): void {\n if (!infoTxt) return\n try {\n const info = JSON.parse(infoTxt)\n if (typeof info.baseSha === 'string') stats.gitBlobSha = info.baseSha\n if (typeof info.updatedAt === 'number') stats.mtime = new Date(info.updatedAt)\n if (typeof info.size === 'number') stats.size = info.size\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('parse info failed', error)\n }\n }\n\n /**\n * Find a matched backend entry for the given filepath.\n * @param filepath target filepath\n * @param filesRaw backend raw listing\n * @returns {any|null}\n */\n private _findMatchedFile(filepath: string, filesRaw: Array<any>): any | null {\n if (!Array.isArray(filesRaw)) return null\n return filesRaw.find((f: any) => {\n if (!f || !f.path) return false\n return f.path === filepath || f.path.endsWith('/' + filepath) || f.path.endsWith('\\/' + filepath)\n })\n }\n\n /**\n * Create default stats object with consistent shape.\n * @param now current Date\n * @returns {any}\n */\n private _createDefaultStats(now: Date): any {\n return {\n dev: 0,\n ino: 0,\n mode: 0o100644,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: 0,\n size: 0,\n blksize: undefined,\n blocks: undefined,\n atime: now,\n mtime: now,\n ctime: now,\n birthtime: now,\n /** @returns {boolean} */\n isFile: () => true,\n /** @returns {boolean} */\n isDirectory: () => false,\n }\n }\n /**\n * Populate stats.gitCommitSha from adapterMeta if available.\n * @param stats stats object to mutate\n * @returns {void}\n */\n private _populateCommitShaFromMeta(stats: any): void {\n if (!stats.gitCommitSha && this.adapterMeta && this.adapterMeta.opts && this.adapterMeta.opts.branch) {\n stats.gitCommitSha = this.adapterMeta.opts.branch\n }\n }\n\n /**\n * Try to resolve commit SHA from an instantiated adapter when needed.\n * @param stats stats object to mutate\n * @returns {Promise<void>}\n */\n private async _resolveCommitShaFromAdapter(stats: any): Promise<void> {\n const instAdapter = await this._safeGetAdapterInstance()\n if (!instAdapter || stats.gitCommitSha) return\n if (typeof instAdapter.resolveRef !== 'function') return\n try {\n const branch = (this.adapterMeta && this.adapterMeta.opts && this.adapterMeta.opts.branch) || 'main'\n const resolved = await instAdapter.resolveRef(branch)\n if (resolved) stats.gitCommitSha = resolved\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_resolveCommitShaFromAdapter resolveRef failed', error)\n }\n }\n\n /**\n * Safely get adapter instance, returning null on error.\n * @returns {Promise<any|null>}\n */\n private async _safeGetAdapterInstance(): Promise<any | null> {\n try {\n return await this.getAdapterInstance()\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_safeGetAdapterInstance failed', error)\n return null\n }\n }\n\n /**\n * Helper: populate stats.gitCommitSha using adapterMeta or adapter.resolveRef when available.\n * @param stats stats object to mutate\n * @returns {Promise<void>}\n */\n private async _resolveAdapterCommitShaIfNeeded(stats: any): Promise<void> {\n this._populateCommitShaFromMeta(stats)\n if (!stats.gitCommitSha) await this._resolveCommitShaFromAdapter(stats)\n }\n\n /**\n * Determine whether a normalized path is an exact file entry in the provided entries.\n * @param normalizedDirectory normalized directory string\n * @param keys index keys array\n * @param entries index entries object\n * @returns {boolean}\n */\n private _isExactFile(normalizedDirectory: string, keys: string[], entries: any): boolean {\n return keys.includes(normalizedDirectory) && (entries as any)[normalizedDirectory] && (entries as any)[normalizedDirectory].state !== 'deleted'\n }\n\n /**\n * Collect immediate child names from index entries for given directory.\n * @param normalizedDirectory normalized directory string\n * @param entries index entries object\n * @returns {Set<string>} set of immediate child names\n */\n private _collectNamesFromIndex(normalizedDirectory: string, entries: any): Set<string> {\n const outNames = new Set<string>()\n const keys = Object.keys(entries || {})\n for (const k of keys) {\n const v = (entries as any)[k]\n if (v && v.state === 'deleted') continue\n\n if (normalizedDirectory === '.' || normalizedDirectory === '') {\n this._collectNamesFromIndexRoot(k, outNames)\n continue\n }\n\n this._processIndexKeyForDirectory(k, normalizedDirectory, outNames)\n }\n return outNames\n }\n\n /**\n * Process a single index key for a non-root directory and add immediate child when applicable.\n * @param key index key\n * @param normalizedDirectory normalized directory string\n * @param outNames set to mutate\n * @returns {void}\n */\n private _processIndexKeyForDirectory(key: string, normalizedDirectory: string, outNames: Set<string>): void {\n if (key === normalizedDirectory) return\n if (key.startsWith(normalizedDirectory + '/')) {\n const rest = key.slice(normalizedDirectory.length + 1)\n const first = rest.indexOf('/') === -1 ? rest : rest.slice(0, rest.indexOf('/'))\n outNames.add(first)\n }\n }\n\n /**\n * Safe wrapper for backend.listFiles returning [] on failure.\n * @param normalizedDirectory directory path\n * @returns {Promise<any[]>}\n */\n private async _getBackendList(normalizedDirectory: string): Promise<any[]> {\n try {\n return await (this.backend as any).listFiles(normalizedDirectory, undefined, false)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_getBackendList failed', error)\n return []\n }\n }\n\n /**\n * Helper for collecting names when scanning root directory entries.\n * @param key index key\n * @param outNames set to mutate\n * @returns {void}\n */\n private _collectNamesFromIndexRoot(key: string, outNames: Set<string>): void {\n const first = key.indexOf('/') === -1 ? key : key.slice(0, key.indexOf('/'))\n outNames.add(first)\n }\n\n /**\n * Check whether normalizedDirectory corresponds to an exact file entry.\n * @param normalizedDirectory normalized directory string\n * @param entries index entries object\n * @returns {boolean}\n */\n private _hasExactEntry(normalizedDirectory: string, entries: any): boolean {\n const keys = Object.keys(entries || {})\n return this._isExactFile(normalizedDirectory, keys, entries)\n }\n\n /**\n * Consult backend.listFiles to collect immediate child names for given directory.\n * Best-effort: logs and returns empty set on failure.\n * @param normalizedDirectory normalized directory string\n * @returns {Promise<Set<string>>}\n */\n private async _collectNamesFromBackend(normalizedDirectory: string): Promise<Set<string>> {\n const outNames = new Set<string>()\n if (!this._backendSupportsListFiles()) return outNames\n const backendList = await this._getBackendList(normalizedDirectory)\n if (!Array.isArray(backendList) || backendList.length === 0) return outNames\n for (const it of backendList) this._processBackendEntry(it, normalizedDirectory, outNames)\n return outNames\n }\n\n /**\n * Return true when backend supports listFiles\n * @returns {boolean}\n */\n private _backendSupportsListFiles(): boolean {\n return !!(this.backend && typeof (this.backend as any).listFiles === 'function')\n }\n\n /**\n * Process a single backend listFiles entry and add immediate child name to outNames when applicable.\n * @param it backend entry\n * @param normalizedDirectory normalized directory string\n * @param outNames set to mutate\n * @returns {void}\n */\n private _processBackendEntry(it: any, normalizedDirectory: string, outNames: Set<string>): void {\n try {\n if (!it || !it.path) return\n const p = it.path\n if (p === normalizedDirectory) return\n if (p.startsWith(normalizedDirectory + '/')) {\n const rest = p.slice(normalizedDirectory.length + 1)\n const first = rest.indexOf('/') === -1 ? rest : rest.slice(0, rest.indexOf('/'))\n outNames.add(first)\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_processBackendEntry failed', error)\n }\n }\n\n /**\n * Build Dirent-like lightweight objects for given names.\n * @param names array of names\n * @param keys array of index keys\n * @param entries index entries object\n * @param normalizedDirectory normalized directory string\n * @returns {Array<any>} array of Dirent-like objects\n */\n private _buildDirentTypes(names: string[], keys: string[], entries: any, normalizedDirectory: string): Array<any> {\n const out: Array<any> = []\n for (const name of names) {\n const childPath = normalizedDirectory === '.' ? name : `${normalizedDirectory}/${name}`\n const { isFile, isDirectory } = this._determineChildType(childPath, keys, entries)\n /** @returns {boolean} */\n const _isFileFunction = function () { return isFile && !isDirectory }\n /** @returns {boolean} */\n const _isDirectoryFunction = function () { return isDirectory }\n out.push({ name, isFile: _isFileFunction, isDirectory: _isDirectoryFunction })\n }\n return out\n }\n\n /**\n * Determine whether a childPath corresponds to a file, directory, or both.\n * @param childPath path of child\n * @param keys index keys\n * @param entries index entries\n * @returns {{isFile:boolean,isDirectory:boolean}}\n */\n private _determineChildType(childPath: string, keys: string[], entries: any): { isFile: boolean; isDirectory: boolean } {\n let isDirectory = false\n let isFile = false\n for (const k of keys) {\n if (k === childPath && (entries as any)[k] && (entries as any)[k].state !== 'deleted') {\n isFile = true\n }\n if (k.startsWith(childPath + '/')) {\n isDirectory = true\n break\n }\n }\n return { isFile, isDirectory }\n }\n\n /**\n * Return persisted adapter metadata (if any).\n * @returns {any|null}\n */\n getAdapterMeta(): any | null {\n return this.adapterMeta\n }\n\n /**\n * \u30D5\u30A1\u30A4\u30EB\u3092\u66F8\u304D\u8FBC\u307F\u307E\u3059\uFF08\u30ED\u30FC\u30AB\u30EB\u7DE8\u96C6\uFF09\u3002\n * @param {string} filepath \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @param {string} content \u30B3\u30F3\u30C6\u30F3\u30C4\n * @returns {Promise<void>}\n */\n async writeFile(filepath: string, content: string) {\n // delegate workspace write to LocalFileManager then reload index\n await this.localFileManager.writeFile(filepath, content)\n await this.loadIndex()\n }\n\n\n\n /**\n * rename \u3092 delete + create \u306E\u5408\u6210\u3067\u884C\u3046\u30D8\u30EB\u30D1\n * @param from \u5143\u30D1\u30B9\n * @param to \u65B0\u30D1\u30B9\n */\n async renameFile(from: string, to: string) {\n // Use readFile to obtain actual content from workspace, backend blob, or base.\n const content = await this.readFile(from)\n if (content === null) throw new Error('source not found')\n\n // create new workspace entry with the same content\n await this.writeFile(to, content)\n\n // delete original path (creates tombstone if base existed)\n await this.unlink(from)\n }\n\n /**\n * \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9/\u30D9\u30FC\u30B9\u304B\u3089\u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\u3092\u8AAD\u307F\u51FA\u3057\u307E\u3059\u3002\n * @param {string} filepath \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<string|null>} \u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\u307E\u305F\u306F null\n */\n async readFile(filepath: string) {\n // Try workspace/base first\n let content = await this.localFileManager.readFile(filepath)\n if (content !== null) return content\n\n // On-demand: attempt to fetch base via RemoteSynchronizer using adapter if available\n try {\n const adapter = await this.getAdapterInstance()\n if (adapter && this.remoteSynchronizer && typeof (this.remoteSynchronizer as any).fetchBaseIfMissing === 'function') {\n await (this.remoteSynchronizer as any).fetchBaseIfMissing(filepath, adapter)\n // re-check after on-demand fetch\n content = await this.localFileManager.readFile(filepath)\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('readFile on-demand fetch failed', error)\n }\n\n return content\n }\n\n /**\n * \u885D\u7A81\u30D5\u30A1\u30A4\u30EB\uFF08.git-conflict/\u914D\u4E0B\uFF09\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param {string} filepath \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<string|null>} \u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\u307E\u305F\u306F null\n */\n async readConflict(filepath: string) {\n return await this.conflictManager.readConflict(filepath)\n }\n\n /**\n * fs.stat \u4E92\u63DB: \u6307\u5B9A\u30D5\u30A1\u30A4\u30EB\u306E\u30E1\u30BF\u60C5\u5831\u3092\u8FD4\u3059\n * \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u4E0A\u306E\u60C5\u5831\u3092\u512A\u5148\u3057\u3001\u672A\u53D6\u5F97\u6642\u306F Git \u306E\u30E1\u30BF\u60C5\u5831\u3067\u88DC\u5B8C\u3059\u308B\u3002\n * @returns {Promise<any>} stats \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n async stat(filepath: string) {\n if (!filepath || typeof filepath !== 'string') throw new TypeError('filepath is required')\n\n // consult backend listing to determine workspace presence\n const filesRaw: Array<any> = await this._getBackendFilesRaw()\n const matched = this._findMatchedFile(filepath, filesRaw)\n\n const now = new Date()\n const stats: any = this._createDefaultStats(now)\n\n // try to read info blob to extract baseSha or other metadata\n try {\n const infoTxt = await (this.backend as any).readBlob(filepath, 'info')\n this._applyInfoTxtToStats(infoTxt, stats)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('stat readBlob failed', error)\n }\n\n // include workspace presence marker when matched\n if (matched) {\n stats.workspacePath = matched.path\n }\n\n // include adapter/commit/branch identifiers when possible\n await this._resolveAdapterCommitShaIfNeeded(stats)\n\n return stats\n }\n\n /**\n * fs.unlink \u4E92\u63DB: \u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\u3059\u308B\n */\n async unlink(filepath: string) {\n if (!filepath || typeof filepath !== 'string') throw new TypeError('filepath is required')\n // Delegate to LocalFileManager.deleteFile (workspace/internal)\n await this.localFileManager.deleteFile(filepath)\n await this.loadIndex()\n }\n\n /**\n * fs.mkdir \u4E92\u63DB (\u7C21\u6613\u5B9F\u88C5): workspace \u5074\u306B\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u60C5\u5831\u3092\u66F8\u304D\u8FBC\u3080\n */\n async mkdir(dirpath: string, _options?: { recursive?: boolean; mode?: number }) {\n if (!dirpath || typeof dirpath !== 'string') throw new TypeError('dirpath is required')\n // Best-effort: create an info entry to mark directory\n const info = { path: dirpath, state: 'dir', createdAt: Date.now() }\n if (this.backend && typeof (this.backend as any).writeBlob === 'function') {\n await (this.backend as any).writeBlob(dirpath, JSON.stringify(info), 'info-workspace').catch((error: any) => { throw Object.assign(new Error('\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u4F5C\u6210\u5931\u6557'), { code: 'EEXIST', cause: error }) })\n }\n }\n\n /**\n * fs.rmdir \u4E92\u63DB (\u7C21\u6613\u5B9F\u88C5)\n */\n async rmdir(dirpath: string, options?: { recursive?: boolean }) {\n if (!dirpath || typeof dirpath !== 'string') throw new TypeError('dirpath is required')\n // Build children list from the reconstructed index paths so that\n // workspace-local entries (as returned by listPaths) are accurately\n // detected regardless of backend-specific URI prefixes.\n const children = await this._listChildrenOfDir(dirpath)\n if (children.length > 0 && !(options && options.recursive)) {\n const errorObject: any = new Error('Directory not empty')\n errorObject.code = 'ENOTEMPTY'\n throw errorObject\n }\n if (options && options.recursive) await this._deleteChildrenRecursive(children)\n }\n\n /**\n * Return list of child paths for given dirpath based on index entries.\n * @param dirpath directory path\n * @returns {Promise<string[]>}\n */\n private async _listChildrenOfDir(dirpath: string): Promise<string[]> {\n const paths = await this.listPaths()\n return paths.filter((p) => p === dirpath || p.startsWith(dirpath + '/'))\n }\n\n /**\n * Delete array of children using localFileManager, logging failures per-child.\n * @param children array of paths\n * @returns {Promise<void>}\n */\n private async _deleteChildrenRecursive(children: string[]): Promise<void> {\n for (const p of children) {\n try {\n await this.localFileManager.deleteFile(p)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('rmdir recursive delete failed for', p, error)\n }\n }\n }\n\n /**\n * fs.readdir \u4E92\u63DB (\u7C21\u6613\u5B9F\u88C5)\n * @returns {Promise<string[]|Array<any>>}\n */\n async readdir(dirpath: string, options?: { withFileTypes?: boolean }) {\n if (!dirpath || typeof dirpath !== 'string') throw new TypeError('dirpath is required')\n\n // Fast-path: obtain index entries once and operate on keys array\n const index = await this.indexManager.getIndex()\n const entries = (index && (index as any).entries) || {}\n const keys = Object.keys(entries)\n\n const names = await this._gatherDirectoryNames(dirpath, entries, keys)\n const maybeEmpty = this._returnIfNoNames(names, options)\n if (maybeEmpty !== null) return maybeEmpty\n\n const normalizedDirectory = dirpath === '' ? '.' : dirpath\n if (options && options.withFileTypes) return this._buildDirentTypes(names, keys, entries, normalizedDirectory)\n return names\n }\n\n /**\n * Return an empty array when names is empty according to options, else null to continue.\n * @param names array of names\n * @param options readdir options\n * @returns {Array<any>|null}\n */\n private _returnIfNoNames(names: string[] | null | undefined, options?: { withFileTypes?: boolean }): Array<any> | null {\n if (!names || names.length === 0) return options && options.withFileTypes ? [] : []\n return null\n }\n\n /**\n * Gather immediate child names for a directory using index and backend as fallback.\n * Throws ENOTDIR when the path represents a file.\n * @param dirpath original directory path\n * @param entries index entries object\n * @param keys array of index keys\n * @returns {Promise<string[]>} immediate child names\n */\n private async _gatherDirectoryNames(dirpath: string, entries: any, keys: string[]): Promise<string[]> {\n const normalizedDirectory = dirpath === '' ? '.' : dirpath\n const outNames = new Set<string>()\n\n const isExactFile = this._isExactFile(normalizedDirectory, keys, entries)\n\n // collect from index\n const indexNames = this._collectNamesFromIndex(normalizedDirectory, entries)\n for (const n of indexNames) outNames.add(n)\n\n // fallback to backend when index had no children\n if (outNames.size === 0 && normalizedDirectory !== '.' && !isExactFile) {\n const backendNames = await this._collectNamesFromBackend(normalizedDirectory)\n for (const n of backendNames) outNames.add(n)\n }\n\n if (isExactFile && outNames.size === 0) {\n const errorObject: any = new Error('\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3067\u306F\u3042\u308A\u307E\u305B\u3093')\n errorObject.code = 'ENOTDIR'\n throw errorObject\n }\n\n if (outNames.size === 0) return []\n return Array.from(outNames)\n }\n\n /**\n * \u6307\u5B9A\u30D1\u30B9\u306E\u30EA\u30E2\u30FC\u30C8\u885D\u7A81\u30D5\u30A1\u30A4\u30EB (.git-conflict/) \u3092\u524A\u9664\u3057\u3066\n * \u7AF6\u5408\u3092\u89E3\u6D88\u6E08\u3068\u30DE\u30FC\u30AF\u3057\u307E\u3059\u3002\n * @param {string} filepath \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<boolean>} \u6210\u529F\u3057\u305F\u3089 true\n */\n async resolveConflict(filepath: string) {\n return await this.conflictManager.resolveConflict(filepath)\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u306E\u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u9069\u7528\u3057\u307E\u3059\u3002\n * @param {{[path:string]:string}} snapshot path->content \u306E\u30DE\u30C3\u30D7\n * @param {string} headSha \u30EA\u30E2\u30FC\u30C8 HEAD\n * @returns {Promise<void>}\n */\n private async applyBaseSnapshot(snapshot: Record<string, string>, headSha: string) {\n return await this.remoteSynchronizer.applyBaseSnapshot(snapshot, headSha)\n }\n\n /**\n * \u6307\u5B9A\u30A8\u30E9\u30FC\u304C non-fast-forward \u3092\u793A\u3059\u304B\u5224\u5B9A\u3057\u307E\u3059\u3002\n * @param {any} err \u4F8B\u5916\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n * @returns {boolean}\n */\n private _isNonFastForwardError(error: any) {\n const message = String(error && error.message ? error.message : error)\n return message.includes('422') || /fast\\s*forward/i.test(message) || /not a fast forward/i.test(message)\n }\n\n /**\n * \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u60C5\u5831\u3092\u8FD4\u3057\u307E\u3059\u3002\n * @returns {Promise<IndexFile>}\n */\n async getIndex(): Promise<IndexFile> {\n return this.indexManager.getIndex()\n }\n\n /**\n * \u767B\u9332\u3055\u308C\u3066\u3044\u308B\u30D1\u30B9\u4E00\u89A7\u3092\u8FD4\u3057\u307E\u3059\u3002\n * @returns {string[]}\n */\n private async listPaths(): Promise<string[]> {\n // Build paths from the reconstructed index so that workspace-local\n // info (workspace/info) takes precedence over git-scoped info.\n const index = await this.indexManager.getIndex()\n const entries = (index && (index as any).entries) || {}\n const out: string[] = []\n for (const k of Object.keys(entries)) {\n const v = (entries as any)[k]\n if (v && v.state === 'deleted') continue\n out.push(k)\n }\n return out\n }\n\n /**\n * \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3068\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u304B\u3089\u5909\u66F4\u30BB\u30C3\u30C8\u3092\u751F\u6210\u3057\u307E\u3059\u3002\n * @returns {Promise<Array<{type:string,path:string,content?:string,baseSha?:string}>>} \u5909\u66F4\u30EA\u30B9\u30C8\n */\n async getChangeSet() {\n return await this.changeTracker.getChangeSet()\n }\n\n /**\n * \u30ED\u30FC\u30AB\u30EB\u306B\u5BFE\u3059\u308B\u5909\u66F4\uFF08create/update/delete\uFF09\u3092\u9069\u7528\u3059\u308B\u30D8\u30EB\u30D1\u30FC\n * @param {any} ch \u5909\u66F4\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n * @returns {Promise<void>}\n */\n private async _applyChangeLocally(ch: any) {\n if (ch.type === 'create' || ch.type === 'update') {\n const sha = await shaOf(ch.content)\n // Backend manages base segment persistence\n let entry: any = undefined\n const infoTxt = await this.backend.readBlob(ch.path, 'info')\n if (infoTxt) entry = JSON.parse(infoTxt)\n if (!entry) entry = { path: ch.path }\n entry.baseSha = sha\n entry.state = 'base'\n entry.updatedAt = Date.now()\n entry.workspaceSha = undefined\n await this.backend.writeBlob(ch.path, JSON.stringify(entry), 'info')\n\n // Delegate to LocalChangeApplier which will persist base and clean workspace in the correct order\n await this.applier.applyCreateOrUpdate(ch)\n } else if (ch.type === 'delete') {\n await this.applier.applyDelete(ch)\n }\n }\n\n /**\n * GitLab \u98A8\u306E actions \u30D9\u30FC\u30B9\u30B3\u30DF\u30C3\u30C8\u30D5\u30ED\u30FC\u3067 push \u3092\u5B9F\u884C\u3057\u307E\u3059\u3002\n * @returns {Promise<{commitSha:string}>}\n */\n private async _pushWithActions(adapter: any, input: any, branch: string) {\n const commitSha = await adapter.createCommitWithActions(branch, input.message, input.changes as any[], input.parentSha)\n await this._tryUpdateRef(adapter, branch, commitSha)\n return await this._applyChangesAndFinalize(commitSha, input)\n }\n\n /**\n * GitHub \u98A8\u306E blob/tree/commit \u30D5\u30ED\u30FC\u3067 push \u3092\u5B9F\u884C\u3057\u307E\u3059\u3002\n * @returns {Promise<{commitSha:string}>}\n */\n private async _pushWithGitHubFlow(adapter: any, input: any, branch: string) {\n const blobMap = await adapter.createBlobs(input.changes as any[])\n const changesWithBlob = (input.changes as any[]).map((c) => ({ ...c, blobSha: blobMap[c.path] }))\n // Attempt to base the new tree on the parent commit's tree so we only modify diffs\n let baseTreeSha: string | undefined = undefined\n if (input.parentSha && typeof (adapter as any).getCommitTreeSha === 'function') {\n try {\n baseTreeSha = await (adapter as any).getCommitTreeSha(input.parentSha)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('getCommitTreeSha failed, continuing without baseTree', error)\n baseTreeSha = undefined\n }\n }\n const treeSha = await adapter.createTree(changesWithBlob, baseTreeSha)\n const commitSha = await adapter.createCommit(input.message, input.parentSha, treeSha)\n await this._tryUpdateRef(adapter, branch, commitSha)\n return await this._applyChangesAndFinalize(commitSha, input)\n }\n\n /**\n * Try to update remote ref and handle common non-fast-forward errors.\n * Throws when the remote reports a non-fast-forward conflict.\n */\n private async _tryUpdateRef(adapter: any, branch: string, commitSha: string) {\n if (typeof adapter.updateRef === 'function') {\n try {\n await adapter.updateRef(`heads/${branch}`, commitSha)\n } catch (error: any) {\n if (this._isNonFastForwardError(error)) {\n throw new Error('\u975E\u4E92\u63DB\u306A\u66F4\u65B0 (non-fast-forward): pull \u304C\u5FC5\u8981\u3067\u3059')\n }\n if (typeof console !== 'undefined' && (console as any).warn) (console as any).warn('updateRef failed (non-422), continuing locally:', error)\n }\n }\n }\n\n /**\n * Apply changes locally, update index head and persist index.\n * Returns the commit result object for callers.\n * @returns {Promise<{commitSha:string}>}\n */\n private async _applyChangesAndFinalize(commitSha: string, input: any) {\n for (const ch of input.changes as any[]) {\n await this._applyChangeLocally(ch)\n }\n this.indexManager.setHead(commitSha)\n await this.indexManager.saveIndex()\n return { commitSha }\n }\n\n /**\n * Handle push when an adapter is provided (delegates to _pushWithActions/_pushWithGitHubFlow).\n * Records commitKey in index metadata and returns the push result.\n * @returns {Promise<{commitSha:string}>}\n */\n private async _handlePushWithAdapter(input: any, adapter: any) {\n const branch = (input as any).ref || (this.adapterMeta && this.adapterMeta.opts && this.adapterMeta.opts.branch) || 'main'\n const messageWithKey = `${input.message}\\n\\napigit-commit-key:${input.commitKey}`\n // If adapter supports createCommitWithActions (GitLab style), use it directly\n if ((adapter as any).createCommitWithActions) {\n (input as any).message = messageWithKey\n const actionResult = await this._pushWithActions(adapter, input, branch)\n this.indexManager.setLastCommitKey(input.commitKey)\n await this.indexManager.saveIndex()\n return actionResult\n }\n\n // Fallback to GitHub-style flow\n (input as any).message = messageWithKey\n const gitHubFlowResult = await this._pushWithGitHubFlow(adapter, input, branch)\n this.indexManager.setLastCommitKey(input.commitKey)\n await this.indexManager.saveIndex()\n return gitHubFlowResult\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u53D6\u308A\u8FBC\u307F\u3001\u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u60C5\u5831\u3092\u8FD4\u3057\u307E\u3059\u3002\n * @param {string} remoteHead \u30EA\u30E2\u30FC\u30C8 HEAD\n * @param {{[path:string]:string}} baseSnapshot path->content \u30DE\u30C3\u30D7\n * @returns {Promise<{conflicts:Array<import('./types').ConflictEntry>}>}\n */\n async pull(\n remote: RemoteSnapshotDescriptor | string | { fetchSnapshot: () => Promise<RemoteSnapshotDescriptor> },\n baseSnapshot?: Record<string, string>\n ) {\n // Support new v0.0.4 TDD-friendly option: allow calling `pull({ ref })`\n // or calling `pull()` to use persisted adapterMeta.opts.branch.\n const maybeOptions: any = remote as any\n if (maybeOptions && typeof maybeOptions.ref === 'string') {\n return await this._pullByRef(maybeOptions.ref, baseSnapshot)\n }\n if (remote === undefined || remote === null) {\n const noArgumentsResult = await this._handlePullNoArgs(baseSnapshot)\n if (noArgumentsResult) return noArgumentsResult\n }\n\n const descriptorRaw = await this._resolveDescriptor(remote, baseSnapshot)\n const normalized: RemoteSnapshotDescriptor =\n typeof descriptorRaw === 'string' ? await this._normalizeRemoteInput(descriptorRaw, baseSnapshot) : (descriptorRaw as RemoteSnapshotDescriptor)\n\n const preIndex = await this.getIndex()\n const preIndexKeys = Object.keys(preIndex.entries)\n\n const instAdapter = await this.getAdapterInstance()\n // v0.0.4: pull must NOT pass baseSnapshot to remoteSynchronizer\n // metadata-first: only fetch tree, base content deferred until on-demand\n const pullResult: any = await this.remoteSynchronizer.pull(normalized, undefined, instAdapter)\n\n const postIndex = await this.getIndex()\n const postIndexKeys = Object.keys(postIndex.entries)\n const preSet = new Set(preIndexKeys)\n const addedPaths = postIndexKeys.filter((k) => !preSet.has(k))\n const remotePaths = Object.keys(normalized.shas || {})\n\n return {\n ...pullResult,\n remote: normalized,\n remotePaths,\n preIndexKeys,\n postIndexKeys,\n addedPaths\n }\n }\n\n /**\n * Pull by a specified commit-ish reference. Resolves the ref, fetches snapshot and\n * delegates to remote synchronizer. Persists adapter branch meta on success.\n * @param {string} reference commit-ish to resolve\n * @param {Record<string,string>=} baseSnapshot optional base snapshot\n * @returns {Promise<any>} pull result\n */\n private async _pullByRef(reference: string, baseSnapshot?: Record<string, string>): Promise<any> {\n const instAdapter = await this.getAdapterInstance()\n if (!instAdapter) throw new Error('Adapter instance not available')\n if (typeof instAdapter.resolveRef !== 'function') throw new Error('Adapter does not support resolveRef')\n const resolvedSha = await instAdapter.resolveRef(reference)\n const descriptor = await instAdapter.fetchSnapshot(resolvedSha)\n const normalized: RemoteSnapshotDescriptor = typeof descriptor === 'string' ? await this._normalizeRemoteInput(descriptor, baseSnapshot) : (descriptor as RemoteSnapshotDescriptor)\n // Ensure backend uses requested branch scope before writing base/index\n await this._trySetBackendBranch(reference)\n // v0.0.4: pull must NOT pass baseSnapshot to remoteSynchronizer\n const pullResult: any = await this.remoteSynchronizer.pull(normalized, undefined, instAdapter)\n // on success persist requested ref into adapter metadata (branch)\n await this._persistAdapterBranchMeta(reference, instAdapter).catch((error) => {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('persisting adapter metadata failed', error)\n })\n return { ...pullResult, remote: normalized, remotePaths: Object.keys(normalized.shas || {}) }\n }\n\n /**\n * Pull using the persisted adapterMeta.opts.branch (or 'main').\n * @param {Record<string,string>=} baseSnapshot optional base snapshot\n * @returns {Promise<any>} pull result\n */\n private async _pullUsingPersistedBranch(baseSnapshot?: Record<string, string>): Promise<any> {\n const instAdapter = await this.getAdapterInstance()\n const branch = (this.adapterMeta && this.adapterMeta.opts && this.adapterMeta.opts.branch) || 'main'\n // Ensure backend scope matches the persisted branch before pulling\n await this._trySetBackendBranch(branch)\n const resolvedSha = await instAdapter!.resolveRef(branch)\n const descriptor = await instAdapter!.fetchSnapshot(resolvedSha)\n const normalized: RemoteSnapshotDescriptor = typeof descriptor === 'string' ? await this._normalizeRemoteInput(descriptor, baseSnapshot) : (descriptor as RemoteSnapshotDescriptor)\n // v0.0.4: pull must NOT pass baseSnapshot to remoteSynchronizer\n const pullResult: any = await this.remoteSynchronizer.pull(normalized, undefined, instAdapter)\n // do not persist branch change (we used existing branch)\n return { ...pullResult, remote: normalized, remotePaths: Object.keys(normalized.shas || {}) }\n }\n\n /**\n * Handle the case when pull() is called with no args: try persisted adapter branch if possible.\n * Returns the pull result when handled, or null to indicate caller should continue.\n * @param {Record<string,string>=} baseSnapshot optional base snapshot\n * @returns {Promise<any|null>}\n */\n private async _handlePullNoArgs(baseSnapshot?: Record<string, string>): Promise<any | null> {\n const instAdapter = await this.getAdapterInstance()\n if (instAdapter && typeof instAdapter.resolveRef === 'function') {\n try {\n return await this._pullUsingPersistedBranch(baseSnapshot)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('pull using persisted branch failed, continuing with empty remote', error)\n return { remote: null, remotePaths: [], preIndexKeys: [], postIndexKeys: [], addedPaths: [] }\n }\n }\n return null\n }\n\n /**\n * Persist the requested branch into adapter metadata (best-effort).\n * @param {string} branch branch name to persist\n * @returns {Promise<void>}\n */\n private async _persistAdapterBranchMeta(branch: string, adapterInstance: any): Promise<void> {\n const meta = (this.adapterMeta && this.adapterMeta.opts) ? { ...(this.adapterMeta) } : (await this.getAdapter())\n if (!meta) return\n const newMeta = { ...(this.adapterMeta || {}), opts: { ...(this.adapterMeta && this.adapterMeta.opts) || {}, branch } }\n // keep current adapter instance if present\n await this.setAdapter(this.adapter || adapterInstance, newMeta)\n // Also inform backend about branch scope when backend supports it\n await this._trySetBackendBranch(branch)\n\n }\n\n /**\n * Best-effort: set backend branch scope when backend supports it.\n * @param branch branch name to set\n * @returns {Promise<void>}\n */\n private async _trySetBackendBranch(branch: string): Promise<void> {\n try {\n if (this.backend && typeof (this.backend as any).setBranch === 'function') {\n ; (this.backend as any).setBranch(branch)\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('backend.setBranch failed', error)\n }\n }\n\n /**\n * Ensure adapterMeta is loaded from index when missing.\n * @returns {Promise<boolean>} true when adapterMeta is available\n */\n private async _loadAdapterMetaIfNeeded(): Promise<boolean> {\n if (this.adapterMeta) return true\n try {\n const index = await this.indexManager.getIndex()\n this.adapterMeta = (index as any).adapter || null\n return !!this.adapterMeta\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('loading adapterMeta failed', error)\n this.adapterMeta = null\n return false\n }\n }\n\n /**\n * Persist current adapterMeta into the index file (best-effort).\n * @returns {Promise<void>}\n */\n private async _writeAdapterMetaToIndex(): Promise<void> {\n try {\n const index = await this.indexManager.getIndex()\n ; (index as any).adapter = this.adapterMeta\n await this.backend.writeIndex(index)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('writing index failed', error)\n }\n }\n\n /**\n * Normalize remote input which may be a headSha or a full descriptor.\n * @param {RemoteSnapshotDescriptor | string} remote remote descriptor or headSha\n * @param {Record<string,string>=} baseSnapshot optional snapshot when remote is a headSha\n * @returns {Promise<RemoteSnapshotDescriptor>} normalized descriptor\n */\n private async _normalizeRemoteInput(remote: RemoteSnapshotDescriptor | string, baseSnapshot?: Record<string, string>): Promise<RemoteSnapshotDescriptor> {\n if (typeof remote !== 'string') return remote\n const snapshot = baseSnapshot || {}\n const shas: Record<string, string> = {}\n for (const [p, c] of Object.entries(snapshot)) shas[p] = await shaOf(c)\n /**\n * Fetch content for the requested paths from the provided snapshot.\n * @param {string[]} paths requested paths\n * @returns {Promise<Record<string,string>>} path->content map\n */\n async function fetchContent(paths: string[]): Promise<Record<string, string>> {\n const out: Record<string, string> = {}\n for (const p of paths) {\n if (p in snapshot) out[p] = snapshot[p]\n }\n return out\n }\n return { headSha: remote, shas, fetchContent }\n }\n\n /**\n * Obtain remote snapshot (via persisted adapter if available) and\n * compute simple diffs against the current index.\n * Returns an object containing the resolved `remote` descriptor (or null),\n * `remoteShas` map and `diffs` array (strings like `added: path` / `updated: path`).\n * @returns {Promise<{remote: RemoteSnapshotDescriptor|null, remoteShas: Record<string,string>, diffs: string[]}>}\n */\n async getRemoteDiffs(\n remote?: RemoteSnapshotDescriptor | string | { fetchSnapshot: () => Promise<RemoteSnapshotDescriptor> }\n ): Promise<{ remote: RemoteSnapshotDescriptor | null; remoteShas: Record<string, string>; diffs: string[] }> {\n let resolved: RemoteSnapshotDescriptor | string | null = null\n try {\n resolved = await this._resolveDescriptor(remote as any, undefined)\n } catch {\n resolved = null\n }\n\n const normalized = await this._toNormalizedDescriptor(resolved)\n const remoteShas: Record<string, string> = normalized?.shas || {}\n\n const diffs: string[] = []\n const index = await this.getIndex().catch(() => null)\n if (!index) return { remote: normalized, remoteShas, diffs }\n\n for (const [p, sha] of Object.entries(remoteShas)) {\n const entry = index.entries[p]\n if (!entry) diffs.push(`added: ${p}`)\n else if (entry.baseSha !== sha) diffs.push(`updated: ${p}`)\n }\n\n return { remote: normalized, remoteShas, diffs }\n }\n\n /**\n * Delegate commit history listing to the underlying adapter when available.\n * Thin passthrough used by UI/CLI to retrieve commit summaries and paging info.\n * @param {CommitHistoryQuery} query\n * @returns {Promise<CommitHistoryPage>}\n */\n async listCommits(query: CommitHistoryQuery): Promise<CommitHistoryPage> {\n const instAdapter = await this.getAdapterInstance()\n if (!instAdapter || typeof instAdapter.listCommits !== 'function') {\n throw new Error('Adapter instance not available or does not support listCommits')\n }\n return await instAdapter.listCommits(query)\n }\n\n /**\n * Delegate branch listing to the underlying adapter when available.\n * @param {BranchListQuery} query\n * @returns {Promise<BranchListPage>}\n */\n async listBranches(query?: BranchListQuery): Promise<BranchListPage> {\n const instAdapter = await this.getAdapterInstance()\n if (!instAdapter || typeof instAdapter.listBranches !== 'function') {\n throw new Error('Adapter instance not available or does not support listBranches')\n }\n const result = await instAdapter.listBranches(query)\n // Try to persist repository metadata when available (best-effort)\n await this._maybePersistRepositoryMetadata(instAdapter, result).catch((error) => {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('persist repository metadata failed', error)\n })\n return result\n }\n\n /**\n * Create a remote-only branch via the configured adapter.\n * @param {{name:string, fromRef?:string}} input\n * @returns {Promise<import('./types.ts').CreateBranchResult>}\n */\n async createBranch(input: import('./types.ts').CreateBranchInput): Promise<import('./types.ts').CreateBranchResult> {\n if (!input || !input.name || typeof input.name !== 'string' || input.name.trim() === '') {\n throw new Error('branch name is required')\n }\n\n const instAdapter = await this.getAdapterInstance()\n if (!instAdapter) throw new Error('Adapter instance not available')\n if (typeof instAdapter.createBranch !== 'function') throw new Error('Adapter does not support createBranch')\n\n // Delegate resolution of the source ref to a helper to reduce complexity\n const resolvedFrom = await this._resolveCreateBranchFrom(input, instAdapter)\n\n const result = await instAdapter.createBranch(input.name, resolvedFrom)\n return result as import('./types.ts').CreateBranchResult\n }\n\n /**\n * Resolve a source reference for createBranch.\n * Preference order: explicit input.fromRef, index.head, adapter default branch.\n * Returns empty string when no resolution found.\n * @param {import('./types.ts').CreateBranchInput} input createBranch input\n * @param {any} instAdapter adapter instance\n * @returns {Promise<string>} resolved ref or empty string\n */\n private async _resolveCreateBranchFrom(input: import('./types.ts').CreateBranchInput, instAdapter: any): Promise<string> {\n // Prefer explicit input.fromRef\n if (input && input.fromRef && typeof input.fromRef === 'string' && input.fromRef.trim() !== '') return input.fromRef\n\n // Try persisted index head\n try {\n const index = await this.getIndex()\n if (index && (index as any).head) return (index as any).head\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('[createBranch] getIndex error: ' + String(error))\n }\n\n // Try adapter default branch resolution\n const adapterResolved = await this._resolveAdapterDefaultBranch(instAdapter)\n if (adapterResolved) return adapterResolved\n\n // fallback to empty string\n return ''\n }\n\n /**\n * Attempt to resolve the default branch via adapter metadata.\n * @param {any} instAdapter adapter instance\n * @returns {Promise<string|null>} resolved SHA or null when not found\n */\n private async _resolveAdapterDefaultBranch(instAdapter: any): Promise<string | null> {\n if (this.adapterMeta && this.adapterMeta.opts && typeof instAdapter.resolveRef === 'function') {\n try {\n const defaultBranch = this.adapterMeta.opts.branch || 'main'\n const resolved = await instAdapter.resolveRef(defaultBranch)\n return resolved || null\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('[createBranch] resolveRef error: ' + String(error))\n return null\n }\n }\n return null\n }\n\n /**\n * Convenience to get default branch name from adapter repository metadata.\n * Returns null when adapter not available.\n * @returns {Promise<string|null>}\n */\n async getDefaultBranch(): Promise<string | null> {\n const instAdapter = await this.getAdapterInstance()\n if (!instAdapter || typeof instAdapter.getRepositoryMetadata !== 'function') return null\n try {\n const md: RepositoryMetadata = await instAdapter.getRepositoryMetadata()\n if (md) await this._persistRepositoryMetadata(md)\n return md && md.defaultBranch ? md.defaultBranch : null\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('getDefaultBranch failed', error)\n return null\n }\n }\n\n /**\n * Persist repository metadata into IndexFile.adapter.opts for session persistence.\n * Best-effort: failures are ignored.\n * @returns {Promise<void>}\n */\n private async _persistRepositoryMetadata(md: RepositoryMetadata): Promise<void> {\n try {\n const have = await this._loadAdapterMetaIfNeeded()\n if (!have) return\n const options = (this.adapterMeta && this.adapterMeta.opts) || {}\n options.defaultBranch = md.defaultBranch\n if (md.name) options.repositoryName = md.name\n if (md.id !== undefined) options.repositoryId = md.id\n this.adapterMeta.opts = options\n await this._writeAdapterMetaToIndex()\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('persist repository metadata aborted', error)\n }\n }\n\n /**\n * Try persisting repository metadata when available. Best-effort.\n * @param instAdapter adapter instance or null\n * @param result branch list result used for fallback default branch detection\n * @returns {Promise<void>}\n */\n private async _maybePersistRepositoryMetadata(instAdapter: any | null, result: any): Promise<void> {\n try {\n if (instAdapter && typeof instAdapter.getRepositoryMetadata === 'function') {\n const md = await instAdapter.getRepositoryMetadata().catch(() => null)\n if (md) await this._persistRepositoryMetadata(md)\n } else {\n await this._persistDefaultBranchCandidate(result)\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('maybePersistRepositoryMetadata failed', error)\n }\n }\n\n /**\n * Extracted helper to persist default branch candidate derived from branch list.\n * @param result branch list result\n * @returns {Promise<void>}\n */\n private async _persistDefaultBranchCandidate(result: any): Promise<void> {\n try {\n const defaultBranchCandidate = Array.isArray(result.items) ? result.items.find((item: any) => item && item.isDefault) : undefined\n if (defaultBranchCandidate) {\n await this._persistRepositoryMetadata({ defaultBranch: defaultBranchCandidate.name, name: '', id: undefined })\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('persistDefaultBranchCandidate failed', error)\n }\n }\n\n /**\n * Normalize a resolved descriptor (string headSha or object) into a\n * RemoteSnapshotDescriptor or null.\n * @param {RemoteSnapshotDescriptor|string|null} resolved descriptor or headSha\n * @returns {Promise<RemoteSnapshotDescriptor|null>} \u6B63\u898F\u5316\u3055\u308C\u305F descriptor \u307E\u305F\u306F null\n */\n private async _toNormalizedDescriptor(resolved: RemoteSnapshotDescriptor | string | null): Promise<RemoteSnapshotDescriptor | null> {\n if (!resolved) return null\n if (typeof resolved !== 'string') return resolved as RemoteSnapshotDescriptor\n try {\n return await this._normalizeRemoteInput(resolved, {})\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_toNormalizedDescriptor normalize failed', error)\n return null\n }\n }\n\n /**\n * Resolve the provided `remote` parameter into either a headSha string or a full\n * `RemoteSnapshotDescriptor`. Centralizes adapter fetching and fallback behavior\n * to keep `pull()` small and easier to lint.\n * @param remote remote descriptor or adapter-like object or headSha\n * @param baseSnapshot optional snapshot used when normalizing a headSha\n * @returns {Promise<RemoteSnapshotDescriptor|string>} resolved descriptor or headSha\n */\n private async _resolveDescriptor(\n remote: RemoteSnapshotDescriptor | string | { fetchSnapshot: () => Promise<RemoteSnapshotDescriptor> } | undefined,\n baseSnapshot?: Record<string, string>\n ): Promise<RemoteSnapshotDescriptor | string> {\n const remoteLike: any = remote as any\n const isAdapterLike = remoteLike && typeof remoteLike === 'object' && typeof remoteLike.fetchSnapshot === 'function' && !('headSha' in remoteLike)\n\n if (isAdapterLike) {\n const fromAdapter = await this._fetchSnapshotFromAdapterInstance()\n if (!fromAdapter) throw new Error('Adapter instance not available')\n return fromAdapter\n }\n\n if (remote === undefined || remote === null) {\n const fromAdapter = await this._fetchSnapshotFromAdapterInstance()\n if (fromAdapter) return fromAdapter\n return await this._normalizeRemoteInput('', baseSnapshot || {})\n }\n\n return remote as any\n }\n\n /**\n * Try to obtain a snapshot descriptor from the persisted adapter instance.\n * @returns {Promise<RemoteSnapshotDescriptor|null>} snapshot descriptor or null when unavailable\n */\n private async _fetchSnapshotFromAdapterInstance(): Promise<RemoteSnapshotDescriptor | null> {\n const adapterInstance = await this.getAdapterInstance()\n if (adapterInstance && typeof adapterInstance.fetchSnapshot === 'function') {\n // prefer branch configured in persisted adapter metadata, default to 'main'\n const branch = (this.adapterMeta && this.adapterMeta.opts && this.adapterMeta.opts.branch) || 'main'\n return await adapterInstance.fetchSnapshot(branch)\n\n }\n return null\n }\n\n /**\n * \u5909\u66F4\u3092\u30B3\u30DF\u30C3\u30C8\u3057\u3066\u30EA\u30E2\u30FC\u30C8\u3078\u53CD\u6620\u3057\u307E\u3059\u3002adapter \u304C\u7121\u3051\u308C\u3070\u30ED\u30FC\u30AB\u30EB\u30B7\u30DF\u30E5\u30EC\u30FC\u30B7\u30E7\u30F3\u3057\u307E\u3059\u3002\n * @param {import('./types').CommitInput} input \u30B3\u30DF\u30C3\u30C8\u5165\u529B\n * @returns {Promise<{commitSha:string}>}\n */\n async push(input: import('./types.ts').CommitInput) {\n // Ensure parentSha defaults to current index head when not provided\n await this._ensureParentSha(input)\n\n // Ensure changes default to current workspace change set when not provided\n if (input.changes === undefined || input.changes === null) {\n input.changes = await this.getChangeSet()\n }\n\n // generate commitKey for idempotency if not provided (must be set for adapter flows)\n if (!input.commitKey) {\n input.commitKey = await shaOf((input.parentSha || '') + JSON.stringify(input.changes))\n }\n\n // Try to obtain a persisted/instantiated adapter from this VirtualFS.\n // If adapter resolution throws, let the exception bubble up (TDD expectation).\n const instAdapter = await this.getAdapterInstance()\n if (!instAdapter) {\n // remoteSynchronizer fallback removed: adapters are required for push in v0.0.4\n throw new Error('Adapter instance not available')\n }\n\n return await this._handlePushWithAdapter(input, instAdapter)\n }\n\n /**\n * Ensure `input.parentSha` is a string; prefer current index head when available.\n * @param input CommitInput\n */\n private async _ensureParentSha(input: import('./types.ts').CommitInput) {\n if (input.parentSha === undefined || input.parentSha === null) {\n try {\n const index = await this.getIndex()\n // `CommitInput.parentSha` is typed as string; use empty string when head is unavailable\n input.parentSha = (index && (index as any).head) || ''\n } catch (error) {\n // propagate as empty string to satisfy type expectations\n input.parentSha = ''\n }\n }\n }\n}\n\nexport default VirtualFS\n\n", "\uFEFFimport { IndexFile } from './types.ts'\nimport { StorageBackend, StorageBackendConstructor, Segment } from './storageBackend.ts'\n\n/**\n * IndexedDB \u3092\u7528\u3044\u305F\u6C38\u7D9A\u5316\u5B9F\u88C5\n */\nexport const IndexedDatabaseStorage: StorageBackendConstructor = class IndexedDatabaseStorage implements StorageBackend {\n /**\n * \u74B0\u5883\u306B IndexedDB \u304C\u5B58\u5728\u3059\u308B\u304B\u3092\u540C\u671F\u691C\u67FB\u3057\u307E\u3059\u3002\n * @returns {boolean} \u5229\u7528\u53EF\u80FD\u306A\u3089 true\n */\n static canUse(): boolean {\n try {\n return !!(globalThis as any).indexedDB\n } catch {\n return false\n }\n }\n private dbName: string\n private dbPromise: Promise<IDBDatabase>\n private currentBranch: string | null = null\n private root: string | undefined\n private rootPrefix: string = ''\n private static VAR_WORKSPACE_BASE = 'workspace'\n // Historically this was a separate workspace-info store, but some test\n // fakes expect info entries to be available in 'git-info'. Alias the\n // workspace-info identifier to the git-info table so fakes using a\n // unified info store behave correctly.\n private static VAR_WORKSPACE_INFO = 'git-info'\n private static VAR_BASE = 'git-base'\n private static VAR_CONFLICT = 'git-conflict'\n private static VAR_INFO = 'git-info'\n private static DEFAULT_DB_NAME = 'apigit_storage'\n\n\n /** \u5229\u7528\u53EF\u80FD\u306A DB \u540D\u306E\u4E00\u89A7\u3092\u8FD4\u3059\n * @returns {string[]} available root names\n */\n static async availableRoots(namespace?: string): Promise<string[]> {\n const g: any = globalThis as any\n const idb = g.indexedDB\n if (!idb) return []\n\n // If indexedDB.databases is not supported, return empty list\n if (typeof idb.databases !== 'function') return []\n\n try {\n const names = await IndexedDatabaseStorage._namesFromDatabases(idb)\n // If no namespace specified, return the list of DB names (legacy behavior)\n if (!namespace) return names\n // If namespace matches an existing DB name, return a default root candidate\n if (names.includes(namespace)) return ['apigit_storage']\n return []\n } catch {\n return []\n }\n }\n\n /**\n * Retrieve unique database names from `indexedDB.databases()` result.\n * @param idb IndexedDB global object\n * @returns {Promise<string[]>} unique database names\n */\n private static async _namesFromDatabases(idb: any): Promise<string[]> {\n const databases = await idb.databases()\n const names: string[] = []\n for await (const entry of (databases as any)) {\n if (entry && typeof entry.name === 'string') names.push(entry.name)\n }\n return Array.from(new Set(names))\n }\n\n /** \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF */\n constructor(namespace: string, _root?: string) {\n this.dbName = namespace || IndexedDatabaseStorage.DEFAULT_DB_NAME\n this.root = _root || undefined\n this.rootPrefix = this.root ? `${this.root}_` : ''\n // Kick off DB open immediately so dbPromise is always defined\n this.dbPromise = this.openDb()\n }\n\n /**\n * \u521D\u671F\u5316: DB \u3092\u30AA\u30FC\u30D7\u30F3\u3059\u308B\u307E\u3067\u5F85\u3064\n * @returns {Promise<void>} \u521D\u671F\u5316\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async init(): Promise<void> {\n await this.dbPromise\n }\n\n /**\n * DB \u3092\u958B\u3044\u3066 objectStore \u3092\u521D\u671F\u5316\u3059\u308B\n * @returns {Promise<IDBDatabase>} Opened IDBDatabase\n */\n private openDb(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const idb = (globalThis as any).indexedDB\n if (!idb) return reject(new Error('IndexedDB is not available'))\n const request = idb.open(this.dbName, 1)\n // Do not include test-only fallbacks in library code. If `open()`\n // returns a falsy value, treat it as an unsupported environment\n // and reject; test suites should provide a proper `indexedDB` shim\n // in their setup (e.g. `test/setupIndexedDB.js`).\n if (!request) return reject(new Error('indexedDB.open returned falsy request'))\n /**\n * Handle DB upgrade event\n * @param {Event} ev Upgrade event\n * @returns {void}\n */\n request.onupgradeneeded = (event: any) => this._handleUpgrade(event)\n /**\n * Handle open success\n * @returns {void}\n */\n request.onsuccess = () => this._onOpenSuccess(request, resolve)\n /**\n * Handle open error\n * @returns {void}\n */\n request.onerror = () => this._onOpenError(request, reject)\n })\n }\n\n /**\n * DB \u30B9\u30AD\u30FC\u30DE\u306E\u521D\u671F\u5316/\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\u3092\u884C\u3046\u30CF\u30F3\u30C9\u30E9\n */\n /**\n * Handle DB upgrade event and create required object stores.\n * Creates the object stores used by this backend, names are resolved\n * through `_storeName` to include any configured `_root` prefix.\n * @param {Event} event - Upgrade event from `indexedDB.open`\n * @returns {void}\n */\n private _handleUpgrade(event: any): void {\n const database = (event.target as IDBOpenDBRequest).result\n if (!database.objectStoreNames.contains(this._storeName(IndexedDatabaseStorage.VAR_WORKSPACE_BASE))) database.createObjectStore(this._storeName(IndexedDatabaseStorage.VAR_WORKSPACE_BASE))\n if (!database.objectStoreNames.contains(this._storeName(IndexedDatabaseStorage.VAR_WORKSPACE_INFO))) database.createObjectStore(this._storeName(IndexedDatabaseStorage.VAR_WORKSPACE_INFO))\n if (!database.objectStoreNames.contains(this._storeName(IndexedDatabaseStorage.VAR_BASE))) database.createObjectStore(this._storeName(IndexedDatabaseStorage.VAR_BASE))\n if (!database.objectStoreNames.contains(this._storeName(IndexedDatabaseStorage.VAR_CONFLICT))) database.createObjectStore(this._storeName(IndexedDatabaseStorage.VAR_CONFLICT))\n if (!database.objectStoreNames.contains(this._storeName(IndexedDatabaseStorage.VAR_INFO))) database.createObjectStore(this._storeName(IndexedDatabaseStorage.VAR_INFO))\n if (!database.objectStoreNames.contains(this._storeName('index'))) database.createObjectStore(this._storeName('index'))\n }\n\n /**\n * Create a handler to close DB on version change.\n * @param dbParam Target DB\n * @returns {() => void}\n */\n private _makeVersionChangeHandler(databaseParameter: IDBDatabase) {\n return () => { databaseParameter.close() }\n }\n\n /**\n * Called when DB open succeeds.\n * @param req IDB open request\n * @param resolve Resolver for the open promise\n * @returns {void}\n */\n private _onOpenSuccess(request: IDBOpenDBRequest, resolve: (_database: IDBDatabase) => void) {\n const database = request.result\n database.onversionchange = this._makeVersionChangeHandler(database)\n resolve(database)\n }\n\n /**\n * Called when DB open errors.\n * @param req IDB open request\n * @param reject Reject function for the open promise\n * @returns {void}\n */\n private _onOpenError(request: IDBOpenDBRequest, reject: (_error?: any) => void) {\n reject(request.error)\n }\n\n /**\n * \u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u30E9\u30C3\u30D1\u30FC\u3002cb \u5185\u306E\u51E6\u7406\u3092\u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u3067\u5B9F\u884C\u3057\u3001\u5FC5\u8981\u306A\u3089\u518D\u8A66\u884C\u3057\u307E\u3059\u3002\n * @returns {Promise<void>} \u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u51E6\u7406\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n private async tx(storeName: string, mode: IDBTransactionMode, callback: (_store: IDBObjectStore) => void | Promise<void>): Promise<void> {\n const physical = this._storeName(storeName)\n try { return await this._performTxAttempt(physical, mode, callback) } catch (error: any) {\n const isInvalidState = error && (error.name === 'InvalidStateError' || /closing/i.test(String(error.message || '')))\n if (isInvalidState) { this.dbPromise = this.openDb(); return await this._performTxAttempt(physical, mode, callback) }\n throw error\n }\n }\n\n /**\n * \u5358\u4E00\u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u8A66\u884C\u5B9F\u884C\u3092\u884C\u3044\u307E\u3059\u3002\n * @returns {Promise<void>} \u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u51E6\u7406\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n private async _performTxAttempt(storeName: string, mode: IDBTransactionMode, callback: (_store: IDBObjectStore) => void | Promise<void>): Promise<void> {\n const database = await this.dbPromise\n return new Promise<void>((resolve, reject) => {\n try {\n const { tx, proxyStore, getHasRequests } = this._beginTransaction(database, storeName, mode)\n /** Transaction complete handler\n * @returns {void}\n */\n const handleTxComplete = () => { resolve() }\n /** Transaction error handler\n * @returns {void}\n */\n const handleTxError = () => { reject(tx.error) }\n Promise.resolve(callback(proxyStore)).then(() => {\n this._finalizeTxSetup(tx, handleTxComplete, handleTxError, getHasRequests())\n }).catch(reject)\n } catch (error) {\n return reject(error)\n }\n })\n }\n\n /**\n * Begin a transaction and return a proxied store along with a getter for request activity.\n * @param database open IDBDatabase\n * @param storeName store name\n * @param mode transaction mode\n * @returns {{tx:IDBTransaction, proxyStore:any, getHasRequests:() => boolean}}\n */\n private _beginTransaction(database: IDBDatabase, storeName: string, mode: IDBTransactionMode) {\n const tx = database.transaction(storeName, mode)\n const storeObject = tx.objectStore(storeName)\n let hasRequests = false\n const requestProducing = new Set(['put', 'get', 'delete', 'add', 'openCursor', 'openKeyCursor', 'clear'])\n /**\n * Mark that request-producing calls were observed in the proxy.\n * @param {boolean} v indicator that requests were produced\n * @returns {void}\n */\n const setHasRequests = (v: boolean) => { hasRequests = v }\n const proxyStore = this._createProxyForStore(storeObject as any, requestProducing, setHasRequests)\n /**\n * Return whether the proxied store observed request-producing calls.\n * @returns {boolean}\n */\n const getHasRequests = () => hasRequests\n return { tx, proxyStore, getHasRequests }\n }\n\n /**\n * Finalize transaction handlers and schedule completion when no requests observed.\n * @returns {void}\n */\n private _finalizeTxSetup(tx: IDBTransaction, onComplete: () => void, onError: () => void, hasRequests: boolean): void {\n tx.oncomplete = onComplete\n tx.onerror = onError\n if (!hasRequests) {\n try {\n this._scheduleTxComplete(tx)\n } catch (error) {\n console.debug('scheduling tx completion failed', error)\n }\n }\n }\n\n /**\n * Create a proxy wrapper for an IDBObjectStore that detects whether\n * request-producing methods were invoked.\n * @returns {Proxy<any>} proxied store object\n */\n private _createProxyForStore(storeObject: any, requestProducing: Set<string>, setHasRequests: (_value: boolean) => void) {\n return new Proxy(storeObject, {\n /**\n * Proxy get handler. Detect calls to request-producing methods.\n * @returns {any}\n */\n get: (target: any, property: string | symbol, _receiver: any) => {\n const orig = target[property]\n if (typeof orig === 'function') {\n return this._wrapStoreMethod(target, property, orig, requestProducing, setHasRequests)\n }\n return orig\n }\n })\n }\n\n /**\n * Wrap a store method to detect request-producing calls and invoke original.\n * @returns {Function}\n */\n private _wrapStoreMethod(target: any, property: string | symbol, orig: any, requestProducing: Set<string>, setHasRequests: (_value: boolean) => void) {\n return (...arguments_: any[]) => {\n try {\n if (typeof property === 'string' && requestProducing.has(property)) setHasRequests(true)\n } catch (error) {\n console.debug('proxy property detection failed', error)\n }\n return orig.apply(target, arguments_)\n }\n }\n\n /**\n * Schedule a microtask to invoke tx.oncomplete in case fake IndexedDB\n * implementations never fire it.\n * @returns {void}\n */\n private _scheduleTxComplete(tx: IDBTransaction) {\n setTimeout(() => {\n try {\n if (typeof tx.oncomplete === 'function') tx.oncomplete(new Event('complete'))\n } catch (error) {\n console.debug('tx.oncomplete invocation failed', error)\n }\n }, 0)\n }\n\n /**\n * index \u3092\u8AAD\u307F\u51FA\u3059\n * @returns {Promise<IndexFile|null>} \u8AAD\u307F\u51FA\u3057\u305F IndexFile\u3001\u5B58\u5728\u3057\u306A\u3051\u308C\u3070 null\n */\n async readIndex(): Promise<IndexFile | null> {\n const database = await this.dbPromise\n // Read meta from 'index' store then reconstruct entries from VAR_INFO\n const meta: IndexFile | null = await this._readIndexMeta(database)\n const result: IndexFile = { head: '', entries: {} }\n if (meta) {\n this._applyMetaToResult(meta, result)\n }\n\n // Load workspace-local info first (workspace-info), then merge git-scoped info (.git/{branch}/info)\n await this._loadWorkspaceInfoEntries(result)\n await this._loadGitScopedInfoEntries(result)\n\n return result\n }\n\n /**\n * Apply metadata object to result IndexFile and set currentBranch if present.\n * @returns {void}\n */\n private _applyMetaToResult(meta: IndexFile, result: IndexFile): void {\n result.head = meta.head || ''\n if ((meta as any).lastCommitKey) result.lastCommitKey = (meta as any).lastCommitKey\n // Preserve adapter metadata if present\n if ((meta as any).adapter) result.adapter = (meta as any).adapter\n // set current branch from persisted adapter metadata so we only load info for that branch\n try {\n this.currentBranch = (meta as any).adapter && (meta as any).adapter.opts && (meta as any).adapter.opts.branch ? (meta as any).adapter.opts.branch : null\n } catch {\n this.currentBranch = null\n }\n }\n\n /**\n * Load workspace-local info entries into result.entries (workspace overrides branch-scoped)\n * @param result IndexFile being populated\n * @returns {Promise<void>}\n */\n private async _loadWorkspaceInfoEntries(result: IndexFile): Promise<void> {\n try {\n const wsKeys = await this._listKeysFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO)\n for (const k of wsKeys) {\n const txt = await this._getFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, k)\n if (!txt) continue\n this._tryParseAssign(result, k, txt)\n }\n } catch {\n // ignore failures and continue\n }\n }\n\n /**\n * Load branch-scoped git info entries into result.entries without overwriting workspace-local entries\n * @param result IndexFile being populated\n * @returns {Promise<void>}\n */\n private async _loadGitScopedInfoEntries(result: IndexFile): Promise<void> {\n const keys = await this._listKeysFromStore(IndexedDatabaseStorage.VAR_INFO)\n const branch = this.currentBranch || 'main'\n for (const k of keys) {\n if (!k.startsWith(branch + '::')) continue\n const filepath = k.slice((branch + '::').length)\n if (result.entries[filepath]) continue\n const txt = await this._getFromStore(IndexedDatabaseStorage.VAR_INFO, k)\n if (!txt) continue\n this._tryParseAssign(result, filepath, txt)\n }\n }\n\n /**\n * Try to JSON.parse and assign into result.entries safely.\n */\n private _tryParseAssign(result: IndexFile, key: string, txt: string): void {\n try {\n result.entries[key] = JSON.parse(txt)\n } catch {\n // ignore parse errors\n }\n }\n\n /**\n * Read the index metadata entry from the 'index' object store.\n * @param database open IDBDatabase instance\n * @returns {Promise<IndexFile|null>} parsed index metadata or null on error\n */\n private async _readIndexMeta(database: IDBDatabase): Promise<IndexFile | null> {\n return await new Promise<IndexFile | null>((resolve) => {\n try {\n const indexName = this._storeName('index')\n const tx = database.transaction(indexName, 'readonly')\n const store = tx.objectStore(indexName)\n const request = store.get('index')\n /** Success handler for index get. @returns {void} */\n request.onsuccess = () => { resolve(request.result ?? null) }\n /** Error handler for index get. @returns {void} */\n request.onerror = () => { resolve(null) }\n } catch { resolve(null) }\n })\n }\n\n /**\n * index \u3092\u66F8\u304D\u8FBC\u3080\n * @returns {Promise<void>} \u66F8\u8FBC\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async writeIndex(index: IndexFile): Promise<void> {\n // Write entries individually into info store, then write metadata into 'index'\n const entries = index.entries || {}\n // Only persist workspace-info for files that exist in workspace-base\n const toWrite = await this._gatherWorkspaceWrites(entries)\n if (toWrite.length > 0) {\n await this.tx(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, 'readwrite', async (store) => {\n for (const item of toWrite) store.put(JSON.stringify(item.v), item.k)\n })\n }\n await this.tx('index', 'readwrite', (store) => {\n const payload: any = { head: index.head }\n if ((index as any).lastCommitKey) payload.lastCommitKey = (index as any).lastCommitKey\n if ((index as any).adapter) payload.adapter = (index as any).adapter\n store.put(payload, 'index')\n })\n }\n\n /**\n * blob \u3092\u66F8\u304D\u8FBC\u3080\n * @returns {Promise<void>} \u66F8\u8FBC\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async writeBlob(filepath: string, content: string, segment?: Segment): Promise<void> {\n const seg: Segment = segment ?? 'workspace'\n // treat info-workspace specially\n if (seg === 'info-workspace') {\n await this.tx(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, 'readwrite', (store) => { store.put(content, filepath) })\n return\n }\n const branch = this.currentBranch || 'main'\n const { storeName, key } = this._storeAndKeyForSegment(seg, filepath, branch)\n await this.tx(storeName, 'readwrite', (store) => { store.put(content, key) })\n\n // Do not recursively create info entry when writing into info store itself\n if (seg === 'info' || seg === 'conflictBlob') return\n\n // Create/merge info metadata\n const sha = await this.shaOf(content)\n const now = Date.now()\n await this._updateInfoForWrite(filepath, seg, sha, now)\n }\n\n /**\n * Update info store entry for a written blob.\n * @returns {Promise<void>}\n */\n private async _updateInfoForWrite(filepath: string, seg: Segment, sha: string, now: number): Promise<void> {\n if (seg === 'conflictBlob') return\n const branch = this.currentBranch || 'main'\n const infoKey = filepath\n\n const existingTxt = await this._resolveExistingInfoText(seg, branch, filepath, infoKey)\n const existing: any = existingTxt ? JSON.parse(existingTxt) : {}\n\n let entry: any = { path: filepath, updatedAt: now }\n if (seg === 'workspace') entry = this._buildWorkspaceEntry(existing, filepath, sha, now)\n else if (seg === 'base') entry = this._buildBaseEntry(existing, filepath, sha, now)\n else if (seg === 'conflict') entry = this._buildConflictEntry(existing, filepath, now)\n\n await this._persistInfoEntry(entry, seg, infoKey)\n }\n\n /**\n * Resolve existing info text used as basis for updates.\n * @returns {Promise<string|null>} existing info text or null\n */\n private async _resolveExistingInfoText(seg: Segment, branch: string, filepath: string, infoKey: string): Promise<string | null> {\n if (seg === 'workspace') {\n const gitBase = await this._getFromStore(IndexedDatabaseStorage.VAR_BASE, filepath).catch(() => null)\n if (gitBase !== null) {\n return await this._getFromStore(IndexedDatabaseStorage.VAR_INFO, filepath).catch(() => null)\n }\n return await this._getFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, infoKey).catch(() => null)\n }\n return await this._getFromStore(IndexedDatabaseStorage.VAR_INFO, infoKey).catch(() => null)\n }\n\n /**\n * Persist the constructed info entry to the appropriate store.\n * @returns {Promise<void>}\n */\n private async _persistInfoEntry(entry: any, seg: Segment, infoKey: string): Promise<void> {\n if (seg === 'workspace') {\n await this.tx(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, 'readwrite', (store) => { store.put(JSON.stringify(entry), infoKey) })\n } else {\n await this.tx(IndexedDatabaseStorage.VAR_INFO, 'readwrite', (store) => { store.put(JSON.stringify(entry), infoKey) })\n }\n }\n\n /**\n * Build info entry for workspace writes.\n * @returns {any}\n */\n private _buildWorkspaceEntry(existing: any, filepath: string, sha: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.baseSha) entry.baseSha = existing.baseSha\n entry.workspaceSha = sha\n entry.state = entry.baseSha ? 'modified' : 'added'\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n return entry\n }\n\n /**\n * Build info entry for base writes.\n * @returns {any}\n */\n private _buildBaseEntry(existing: any, filepath: string, sha: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.workspaceSha) entry.workspaceSha = existing.workspaceSha\n entry.baseSha = sha\n entry.state = 'base'\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n return entry\n }\n\n /**\n * Build info entry for conflict writes.\n * @returns {any}\n */\n private _buildConflictEntry(existing: any, filepath: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.baseSha) entry.baseSha = existing.baseSha\n if (existing && existing.workspaceSha) entry.workspaceSha = existing.workspaceSha\n entry.state = 'conflict'\n return entry\n }\n /**\n * blob \u3092\u8AAD\u307F\u51FA\u3059\n * @returns {Promise<string|null>} \u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\u3001\u5B58\u5728\u3057\u306A\u3051\u308C\u3070 null\n */\n async readBlob(filepath: string, segment?: Segment): Promise<string | null> {\n const branch = this.currentBranch || 'main'\n if (segment !== undefined) return await this._readBlobWithSegment(segment, filepath, branch)\n\n // segment\u672A\u6307\u5B9A\u306E\u5834\u5408\u306Fworkspace-base\u2192git-base\u306E\u9806\u3067\u53C2\u7167\n const workspaceContent = await this._getFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_BASE, filepath)\n if (workspaceContent !== null) return workspaceContent\n return await this._getFromStore(IndexedDatabaseStorage.VAR_BASE, filepath)\n }\n\n /**\n * Read blob when a segment is provided. Handles info-workspace/info-git/info and other segments.\n * @returns {Promise<string|null>} blob content or null\n */\n private async _readBlobWithSegment(segment: Segment, filepath: string, branch: string): Promise<string | null> {\n // Handle info variants first\n if (segment === 'info-git') return await this._getFromStore(IndexedDatabaseStorage.VAR_INFO, filepath)\n if (segment === 'info-workspace') return await this._getFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, filepath)\n if (segment === 'info') {\n const ws = await this._getFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, filepath)\n if (ws !== null) return ws\n return await this._getFromStore(IndexedDatabaseStorage.VAR_INFO, filepath)\n }\n\n // Default segments: map to store/key and read\n const { storeName, key } = this._storeAndKeyForSegment(segment, filepath, branch)\n return await this._getFromStore(storeName, key)\n }\n\n /**\n * blob \u3092\u524A\u9664\u3059\u308B\n * @returns {Promise<void>} \u524A\u9664\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async deleteBlob(filepath: string, segment?: Segment): Promise<void> {\n const branch = this.currentBranch || 'main'\n if (segment === 'workspace') { await this._deleteFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_BASE, filepath); await this._deleteFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, filepath); return }\n if (segment === 'base') { await this._deleteFromStore(IndexedDatabaseStorage.VAR_BASE, filepath); return }\n if (segment === 'conflict') { await this._deleteFromStore(IndexedDatabaseStorage.VAR_CONFLICT, filepath); return }\n if (segment === 'conflictBlob') {\n const { storeName, key } = this._storeAndKeyForSegment(segment, filepath, branch)\n await this._deleteFromStore(storeName, key)\n return\n }\n if (segment === 'info') {\n // remove both workspace-local info and git-scoped info for current branch\n await this._deleteFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, filepath)\n await this._deleteFromStore(IndexedDatabaseStorage.VAR_INFO, filepath)\n return\n }\n // segment\u672A\u6307\u5B9A\u306E\u5834\u5408\u306F\u3059\u3079\u3066\u306E\u30BB\u30B0\u30E1\u30F3\u30C8\u304B\u3089\u524A\u9664\n await this._deleteAllSegments(filepath, branch)\n }\n\n /**\n * Gather entries that should be written to workspace-info: those that exist in workspace-base.\n * @returns {Promise<Array<{k:string,v:any}>>}\n */\n private async _gatherWorkspaceWrites(entries: { [k: string]: any }): Promise<Array<{ k: string; v: any }>> {\n const toWrite: Array<{ k: string; v: any }> = []\n const branch = this.currentBranch || 'main'\n for (const filepath of Object.keys(entries)) {\n const existsWorkspace = await this._getFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_BASE, filepath).catch(() => null)\n if (existsWorkspace !== null) { toWrite.push({ k: filepath, v: entries[filepath] }); continue }\n // If not present in workspace base, check git base (branch-scoped)\n const baseKey = `${branch}::${filepath}`\n const existsBase = await this._getFromStore(IndexedDatabaseStorage.VAR_BASE, baseKey).catch(() => null)\n if (existsBase === null) continue\n toWrite.push({ k: filepath, v: entries[filepath] })\n }\n return toWrite\n }\n\n /**\n * Compute store name and key for a given segment and filepath.\n * @returns {{storeName:string,key:string}}\n */\n private _storeAndKeyForSegment(seg: Segment, filepath: string, branch: string): { storeName: string; key: string } {\n const storeName = seg === 'workspace'\n ? IndexedDatabaseStorage.VAR_WORKSPACE_BASE\n : seg === 'base'\n ? IndexedDatabaseStorage.VAR_BASE\n : seg === 'info'\n ? IndexedDatabaseStorage.VAR_INFO\n : IndexedDatabaseStorage.VAR_CONFLICT\n // For git-scoped segments, keys are prefixed with branch\n const key = (seg === 'workspace') ? filepath : (seg === 'conflictBlob' ? `${branch}::conflictBlob::${filepath}` : `${branch}::${filepath}`)\n return { storeName, key }\n }\n\n /**\n * Delete a filepath from all relevant stores for the given branch.\n * @returns {Promise<void>}\n */\n private async _deleteAllSegments(filepath: string, _branch: string): Promise<void> {\n await this._deleteFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_BASE, filepath)\n await this._deleteFromStore(IndexedDatabaseStorage.VAR_BASE, filepath)\n await this._deleteFromStore(IndexedDatabaseStorage.VAR_CONFLICT, filepath)\n await this._deleteFromStore(IndexedDatabaseStorage.VAR_CONFLICT, `${_branch}::conflictBlob::${filepath}`)\n await this._deleteFromStore(IndexedDatabaseStorage.VAR_INFO, filepath)\n await this._deleteFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, filepath)\n }\n\n /**\n * Read a value from a specific object store.\n * @param storeName Object store name\n * @param filepath Key to read\n * @returns {Promise<string|null>} value or null\n */\n private async _getFromStore(storeName: string, filepath: string): Promise<string | null> {\n const database = await this.dbPromise\n return new Promise<string | null>((resolve) => {\n try {\n const physical = this._storeName(storeName)\n const tx = database.transaction(physical, 'readonly')\n const store = tx.objectStore(physical)\n const request = store.get(filepath)\n /**\n * Index get success handler\n * @returns {void}\n */\n request.onsuccess = () => {\n const result = request.result ?? null\n if (result !== null) { resolve(result); return }\n // If not found and this is a git-scoped store, try branch-prefixed key as a fallback\n if (storeName !== IndexedDatabaseStorage.VAR_WORKSPACE_BASE && storeName !== IndexedDatabaseStorage.VAR_WORKSPACE_INFO) {\n this._getBranchPrefixedFromStore(store, filepath).then((r) => resolve(r)).catch(() => resolve(null))\n return\n }\n resolve(null)\n }\n /**\n * Index get error handler\n * @returns {void}\n */\n request.onerror = function () { resolve(null) }\n } catch { resolve(null) }\n })\n }\n\n /**\n * List all keys in an object store.\n * @returns {Promise<string[]>} Array of keys contained in the store\n */\n private async _listKeysFromStore(storeName: string): Promise<string[]> {\n const database = await this.dbPromise\n return new Promise<string[]>((resolve) => {\n try {\n const physical = this._storeName(storeName)\n const tx = database.transaction(physical, 'readonly')\n const store = tx.objectStore(physical)\n const keys: string[] = []\n const request = store.openKeyCursor()\n /** Cursor success handler bound to resolver and accumulator */\n request.onsuccess = this._makeCursorSuccessHandler(resolve, keys)\n /** Cursor error handler */\n request.onerror = function () { resolve(keys) }\n } catch { resolve([]) }\n })\n }\n\n /**\n * Attempt to read a branch-prefixed key from the given store.\n * @param store IDBObjectStore instance\n * @param filepath Key without branch prefix\n * @returns {Promise<string|null>} resolved value or null\n */\n private _getBranchPrefixedFromStore(store: any, filepath: string): Promise<string | null> {\n return new Promise<string | null>((resolve) => {\n try {\n const branch = this.currentBranch || 'main'\n const request = store.get(branch + '::' + filepath)\n /** Success handler for branch-prefixed get. @returns {void} */\n request.onsuccess = () => { resolve(request.result ?? null) }\n /** Error handler for branch-prefixed get. @returns {void} */\n request.onerror = () => { resolve(null) }\n } catch { resolve(null) }\n })\n }\n\n /**\n * Map a logical store name to its physical store name including root prefix.\n * @param name logical store identifier\n * @returns physical store name used in IndexedDB\n */\n private _storeName(name: string): string {\n return this.rootPrefix ? `${this.rootPrefix}${name}` : name\n }\n\n /**\n * Create a cursor success handler bound to resolve and keys array.\n * @param resolve resolver\n * @param keys accumulator\n * @returns {(event:any) => void}\n */\n private _makeCursorSuccessHandler(resolve: (_values: string[]) => void, keys: string[]) {\n return function (event: any) {\n const current = event.target.result\n if (!current) { resolve(keys); return }\n if (current.key !== undefined) {\n keys.push(current.key as string)\n }\n current.continue()\n }\n }\n\n /**\n * \u6307\u5B9A\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u914D\u4E0B\u306E\u30D5\u30A1\u30A4\u30EB\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param prefix \u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\uFF08\u7701\u7565\u6642\u306F\u30EB\u30FC\u30C8\uFF09\n * @param segment \u30BB\u30B0\u30E1\u30F3\u30C8\uFF08\u7701\u7565\u6642\u306F workspace\uFF09\n * @param recursive \u30B5\u30D6\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3082\u542B\u3081\u308B\u304B\u3002\u7701\u7565\u6642\u306F true\n * @returns {Promise<Array<{ path: string; info: string | null }>>}\n */\n async listFiles(prefix?: string, segment?: Segment, recursive = true): Promise<Array<{ path: string; info: string | null }>> {\n const seg: Segment = segment ?? 'workspace'\n const storeName = seg === 'workspace' ? IndexedDatabaseStorage.VAR_WORKSPACE_BASE : seg === 'base' ? IndexedDatabaseStorage.VAR_BASE : seg === 'info' ? IndexedDatabaseStorage.VAR_INFO : IndexedDatabaseStorage.VAR_CONFLICT\n\n let keys: string[]\n try {\n keys = await this._listKeysFromStore(storeName)\n } catch {\n keys = []\n }\n\n const p = prefix ? prefix.replace(/^\\/+|\\/+$/g, '') : ''\n // For non-workspace stores, keys include branch prefix. Filter and strip it.\n keys = this._normalizeKeysForSegment(keys, seg)\n keys = this._filterKeys(keys, p, recursive)\n return await this._collectFiles(keys, seg)\n }\n\n /**\n * Raw listing that returns implementation-specific URIs and a normalized path.\n * @param prefix optional prefix to filter\n * @param recursive whether to include subdirectories\n * @returns {Promise<Array<{uri:string,path:string,info?:string|null}>>}\n */\n async listFilesRaw(prefix?: string, recursive = true): Promise<Array<{ uri: string; path: string; info?: string | null }>> {\n const stores = [\n IndexedDatabaseStorage.VAR_WORKSPACE_BASE,\n IndexedDatabaseStorage.VAR_WORKSPACE_INFO,\n IndexedDatabaseStorage.VAR_BASE,\n IndexedDatabaseStorage.VAR_INFO,\n IndexedDatabaseStorage.VAR_CONFLICT,\n ]\n\n const branch = this.currentBranch || 'main'\n const p = prefix ? prefix.replace(/^\\/+|\\/+$/g, '') : ''\n\n const out: Array<{ uri: string; path: string; info?: string | null }> = []\n\n for (const storeName of stores) {\n let keys: string[] = []\n try {\n keys = await this._listKeysFromStore(storeName)\n } catch {\n keys = []\n }\n\n const entries = await this._entriesFromStoreKeys(storeName, keys, branch, p, recursive)\n for (const entry of entries) out.push(entry)\n }\n\n return out\n }\n\n /**\n * Helper: build entries from store keys with filtering and path normalization\n * @returns {Promise<Array<{uri:string,path:string,info?:string|null}>>}\n */\n private async _entriesFromStoreKeys(storeName: string, keys: string[], branch: string, prefix: string, recursive: boolean): Promise<Array<{ uri: string; path: string; info?: string | null }>> {\n const mapped = await Promise.all(keys.map((originalKey) => this._entryFromStoreKey(storeName, originalKey, branch, prefix, recursive)))\n return mapped.filter((x) => x !== null) as Array<{ uri: string; path: string; info?: string | null }>\n }\n\n /**\n * Build a single entry object from a store key. Returns null when the key is filtered out.\n * @returns {Promise<{uri:string,path:string,info?:string|null}|null>}\n */\n private async _entryFromStoreKey(storeName: string, originalKey: string, branch: string, prefix: string, recursive: boolean): Promise<{ uri: string; path: string; info?: string | null } | null> {\n // Normalize may strip branch prefix for git-scoped stores\n const normalizedKey = (storeName !== IndexedDatabaseStorage.VAR_WORKSPACE_BASE && storeName !== IndexedDatabaseStorage.VAR_WORKSPACE_INFO && originalKey.startsWith(branch + '::'))\n ? originalKey.slice((branch + '::').length)\n : originalKey\n\n // Prefix filtering\n if (prefix && !(normalizedKey === prefix || normalizedKey.startsWith(prefix + '/'))) return null\n\n // Recursion filtering\n if (!recursive) {\n const rest = prefix ? normalizedKey.slice(prefix.length + 1) : normalizedKey\n if (rest.includes('/')) return null\n }\n\n const uri = `${this.dbName}/${storeName}/${originalKey}`\n const path = this._buildPathForStoreKey(storeName, normalizedKey, branch)\n const info = await this._resolveInfoForKey(normalizedKey, branch)\n return { uri, path, info }\n }\n\n /**\n * Build normalized path string for a store key.\n * @returns {string}\n */\n private _buildPathForStoreKey(storeName: string, normalizedKey: string, branch: string): string {\n if (storeName === IndexedDatabaseStorage.VAR_WORKSPACE_BASE || storeName === IndexedDatabaseStorage.VAR_WORKSPACE_INFO) {\n return `${this.dbName}/workspace/${normalizedKey}`\n }\n const tableMap: Record<string, string> = {\n [IndexedDatabaseStorage.VAR_BASE]: 'base',\n [IndexedDatabaseStorage.VAR_INFO]: 'info',\n [IndexedDatabaseStorage.VAR_CONFLICT]: 'conflict',\n }\n const conflictBlobPrefix = 'conflictBlob::'\n if (storeName === IndexedDatabaseStorage.VAR_CONFLICT && normalizedKey.startsWith(conflictBlobPrefix)) {\n const key = normalizedKey.slice(conflictBlobPrefix.length)\n return `${this.dbName}/.git/${branch}/conflictBlob/${key}`\n }\n const segName = tableMap[storeName] || 'base'\n return `${this.dbName}/.git/${branch}/${segName}/${normalizedKey}`\n }\n\n /**\n * Normalize keys for a given segment: strip branch prefix for non-workspace stores.\n * @returns {string[]}\n */\n private _normalizeKeysForSegment(keys: string[], seg: Segment): string[] {\n if (seg === 'workspace') return keys\n const branch = this.currentBranch || 'main'\n // Accept both branch-prefixed keys and legacy/unprefixed keys in the same\n // physical store (some test shims share workspace-info and git-info).\n const normalized = keys.map((k) => k.startsWith(branch + '::') ? k.slice((branch + '::').length) : k)\n if (seg === 'conflictBlob') {\n return normalized.map((k) => k.startsWith('conflictBlob::') ? k.slice('conflictBlob::'.length) : k)\n }\n return normalized\n }\n\n /**\n * Filter keys by prefix and recursion flag.\n * @returns {string[]}\n */\n private _filterKeys(keys: string[], p: string, recursive: boolean): string[] {\n if (p) keys = keys.filter((k) => k === p || k.startsWith(p + '/'))\n if (!recursive) {\n keys = keys.filter((k) => {\n const rest = p ? k.slice(p.length + (p ? 1 : 0)) : k\n return !rest.includes('/')\n })\n }\n return keys\n }\n\n /**\n * Collect file info objects for keys array.\n * @param keys list of keys\n * @param _seg segment (unused)\n * @returns {Promise<Array<{path:string, info:string|null}>>}\n */\n private async _collectFiles(keys: string[], _seg: Segment): Promise<Array<{ path: string; info: string | null }>> {\n const out: Array<{ path: string; info: string | null }> = []\n const branch = this.currentBranch || 'main'\n for (const k of keys) {\n const info = await this._resolveInfoForKey(k, branch)\n out.push({ path: k, info })\n }\n return out\n }\n\n /**\n * Resolve info value for a given key: prefer workspace-local, then branch-scoped.\n * @param k key\n * @param branch branch name\n * @returns {Promise<string|null>}\n */\n private async _resolveInfoForKey(k: string, _branch: string): Promise<string | null> {\n let info: string | null = await this._getFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, k)\n if (info === null) info = await this._getFromStore(IndexedDatabaseStorage.VAR_INFO, k)\n return info\n }\n\n /**\n * Calculate SHA-1 hex digest of given content.\n * @param content Input string\n * @returns {Promise<string>} Hex encoded SHA-1 digest\n */\n private async shaOf(content: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(content)\n const hashBuffer = await crypto.subtle.digest('SHA-1', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n }\n\n /**\n * Delete a key from a specific object store.\n * @param storeName Object store name\n * @param filepath Key to delete\n * @returns {Promise<void>}\n */\n private async _deleteFromStore(storeName: string, filepath: string): Promise<void> {\n return this.tx(storeName, 'readwrite', (store) => { store.delete(filepath) })\n }\n\n /**\n * \u6307\u5B9A\u3055\u308C\u305F DB \u540D\u3092\u524A\u9664\u3057\u307E\u3059\n * @param databaseName \u524A\u9664\u3059\u308B DB \u540D\n * @returns {Promise<void>}\n */\n static async delete(databaseName: string): Promise<void> {\n try {\n const idb = (globalThis as any).indexedDB\n if (!idb) throw new Error('IndexedDB is not available')\n\n return new Promise((resolve, reject) => {\n const request = idb.deleteDatabase(databaseName)\n if (!request) return reject(new Error('indexedDB.deleteDatabase returned falsy request'))\n\n /** Success handler for deleteDatabase. @returns {void} */\n request.onsuccess = function () { resolve() }\n /** Error handler for deleteDatabase. @returns {void} */\n request.onerror = function () { reject(new Error(`Failed to delete IndexedDB: ${request.error?.message}`)) }\n /** Blocked handler for deleteDatabase. @returns {void} */\n request.onblocked = function () {\n // DB is still in use, but allow the deletion to proceed\n console.warn(`IndexedDB deletion is blocked for \"${databaseName}\", but proceeding`)\n }\n })\n } catch (error) {\n throw new Error(`Failed to delete IndexedDB \"${databaseName}\": ${String(error)}`)\n }\n }\n}\n\nexport default IndexedDatabaseStorage\n\n", "\uFEFF\n/**\n * Compute SHA-1 hex digest for a string.\n * Prefer Web Crypto (`crypto.subtle.digest`) when available; otherwise\n * fall back to a bundled implementation.\n * @param message input string\n * @returns lower-case hex-encoded SHA-1 digest\n */\nasync function shaOf(message: string): Promise<string> {\n // Try Web Crypto first (works in browsers and Node 19+/22+ via globalThis.crypto)\n const webcrypto: any = (globalThis as any).crypto\n if (webcrypto && webcrypto.subtle && typeof webcrypto.subtle.digest === 'function') {\n const buf = new TextEncoder().encode(message)\n const digest = await webcrypto.subtle.digest('SHA-1', buf)\n const array = Array.from(new Uint8Array(digest))\n return array.map(b => b.toString(16).padStart(2, '0')).join('')\n }\n // Fallback to bundled synchronous implementation when Web Crypto not available.\n return computeSha1Fallback(message)\n}\n\n/**\n * Synchronous SHA-1 fallback implementation.\n * Kept as a separate function so `shaOf` remains simple for linting.\n * @param message input string\n * @returns lower-case hex-encoded SHA-1 digest\n */\nfunction computeSha1Fallback(message: string): string {\n const encoder = new TextEncoder()\n const bytes = Array.from(encoder.encode(message))\n const l = bytes.length * 8\n bytes.push(0x80)\n while ((bytes.length % 64) !== 56) bytes.push(0)\n for (let byteIndex = 7; byteIndex >= 0; byteIndex--) bytes.push((l >>> (byteIndex * 8)) & 0xff)\n\n const words: number[] = []\n for (let index = 0; index < bytes.length; index += 4) {\n words.push((bytes[index] << 24) | (bytes[index + 1] << 16) | (bytes[index + 2] << 8) | (bytes[index + 3]))\n }\n\n let h0 = 0x67452301\n let h1 = 0xEFCDAB89\n let h2 = 0x98BADCFE\n let h3 = 0x10325476\n let h4 = 0xC3D2E1F0\n\n const results = processWords(words)\n h0 = results[0]\n h1 = results[1]\n h2 = results[2]\n h3 = results[3]\n h4 = results[4]\n\n /**\n * Convert 32-bit number to 8-char hex string\n * @param n 32-bit number\n * @returns hex string\n */\n function toHex(n: number): string { return n.toString(16).padStart(8, '0') }\n\n return (toHex(h0) + toHex(h1) + toHex(h2) + toHex(h3) + toHex(h4)).toLowerCase()\n}\n\n/**\n * Process 512-bit blocks (16-word blocks expanded to 80 words) and\n * compute intermediate SHA-1 state.\n * @param words word array\n * @returns tuple [h0,h1,h2,h3,h4]\n */\nfunction processWords(words: number[]): number[] {\n let h0 = 0x67452301\n let h1 = 0xEFCDAB89\n let h2 = 0x98BADCFE\n let h3 = 0x10325476\n let h4 = 0xC3D2E1F0\n\n for (let index = 0; index < words.length; index += 16) {\n const w = new Array(80) as number[]\n for (let t = 0; t < 16; t++) w[t] = words[index + t] >>> 0\n for (let t = 16; t < 80; t++) {\n const temporary = w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16]\n w[t] = ((temporary << 1) | (temporary >>> 31)) >>> 0\n }\n const updated = processChunk(w, [h0, h1, h2, h3, h4])\n h0 = updated[0]\n h1 = updated[1]\n h2 = updated[2]\n h3 = updated[3]\n h4 = updated[4]\n }\n return [h0, h1, h2, h3, h4]\n}\n\n/**\n * Process a single 512-bit chunk (expanded to 80 words) and update state.\n * @param w expanded word array (80 entries)\n * @param h array [h0,h1,h2,h3,h4] current state\n * @returns updated [h0,h1,h2,h3,h4]\n */\nfunction processChunk(w: number[], h: number[]): number[] {\n let a = h[0], b = h[1], c = h[2], d = h[3], registerE = h[4]\n for (let t = 0; t < 80; t++) {\n let f: number, k: number\n if (t < 20) { f = (b & c) | (~b & d); k = 0x5A827999 }\n else if (t < 40) { f = b ^ c ^ d; k = 0x6ED9EBA1 }\n else if (t < 60) { f = (b & c) | (b & d) | (c & d); k = 0x8F1BBCDC }\n else { f = b ^ c ^ d; k = 0xCA62C1D6 }\n const temporaryValue = (((a << 5) | (a >>> 27)) + f + registerE + k + (w[t] >>> 0)) >>> 0\n registerE = d\n d = c\n c = ((b << 30) | (b >>> 2)) >>> 0\n b = a\n a = temporaryValue\n }\n return [((h[0] + a) >>> 0), ((h[1] + b) >>> 0), ((h[2] + c) >>> 0), ((h[3] + d) >>> 0), ((h[4] + registerE) >>> 0)]\n}\n\n/**\n * Parse existing info JSON stored in the in-memory store.\n * @param store In-memory storage object\n * @param filepath path key\n * @returns parsed info object or undefined when not present/invalid\n */\nfunction parseExistingInfo(store: any, filepath: string): any | undefined {\n const existingTxt = store.infoBlobs.has(filepath) ? store.infoBlobs.get(filepath) : null\n if (!existingTxt) return undefined\n try {\n return JSON.parse(existingTxt)\n } catch {\n return undefined\n }\n}\n\n/**\n * Build info entry for a workspace write.\n * @param existing existing parsed info\n * @param filepath path key\n * @param sha workspace blob sha\n * @param now timestamp\n * @returns info entry object\n */\nfunction buildWorkspaceEntry(existing: any, filepath: string, sha: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.baseSha) entry.baseSha = existing.baseSha\n entry.workspaceSha = sha\n entry.state = entry.baseSha ? 'modified' : 'added'\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n return entry\n}\n\n/**\n * Build info entry for a base write.\n * @param existing existing parsed info\n * @param filepath path key\n * @param sha base blob sha\n * @param now timestamp\n * @returns info entry object\n */\nfunction buildBaseEntry(existing: any, filepath: string, sha: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.workspaceSha) entry.workspaceSha = existing.workspaceSha\n entry.baseSha = sha\n entry.state = 'base'\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n return entry\n}\n\n/**\n * Build info entry for a conflict write.\n * @param existing existing parsed info\n * @param filepath path key\n * @param now timestamp\n * @returns info entry object\n */\nfunction buildConflictEntry(existing: any, filepath: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.baseSha) entry.baseSha = existing.baseSha\n if (existing && existing.workspaceSha) entry.workspaceSha = existing.workspaceSha\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n entry.state = 'conflict'\n return entry\n}\n\n/**\n * Update in-memory info metadata when a blob is written to a segment.\n * @param store in-memory store object\n * @param filepath path key\n * @param seg segment name ('workspace'|'base'|'conflict'|'info')\n * @param content blob content\n * @returns Promise<void>\n */\nexport async function updateInfoForWrite(store: any, filepath: string, seg: string, content: string): Promise<void> {\n try {\n const now = Date.now()\n const existing = parseExistingInfo(store, filepath)\n if (seg === 'info') {\n await handleInfoSegment(store, filepath, content)\n return\n }\n\n const sha = await shaOf(content)\n let entry: any\n if (seg === 'workspace') entry = buildWorkspaceEntry(existing, filepath, sha, now)\n else if (seg === 'base') entry = buildBaseEntry(existing, filepath, sha, now)\n else if (seg === 'conflict') entry = buildConflictEntry(existing, filepath, now)\n else entry = { path: filepath, updatedAt: now }\n\n store.infoBlobs.set(filepath, JSON.stringify(entry))\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('updateInfoForWrite failed', error)\n return\n }\n}\n\n/**\n * Handle direct writes to the 'info' segment: store parsed JSON when possible\n * and fall back to raw text otherwise.\n */\nasync function handleInfoSegment(store: any, filepath: string, content: string): Promise<void> {\n try {\n const parsed = JSON.parse(content)\n store.infoBlobs.set(filepath, JSON.stringify(parsed))\n } catch (error) {\n store.infoBlobs.set(filepath, String(content))\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('handleInfoSegment: stored raw content due to parse error', error)\n }\n}\n\nexport default { updateInfoForWrite }\n\n", "\uFEFFimport { IndexFile } from './types.ts'\nimport { StorageBackend, StorageBackendConstructor } from './storageBackend.ts'\nimport { updateInfoForWrite } from './metadataManager.ts'\n\nconst BRANCH_SEP = '::'\nconst SEG_WORKSPACE = 'workspace'\nconst SEG_INFO_WORKSPACE = 'info-workspace'\nconst SEG_INFO_GIT = 'info-git'\n\n/**\n * \u30C6\u30B9\u30C8\u3084\u8EFD\u91CF\u52D5\u4F5C\u691C\u8A3C\u7528\u306E\u30A4\u30F3\u30E1\u30E2\u30EA\u5B9F\u88C5\u3002\n * `StorageBackend` \u3092\u5B9F\u88C5\u3057\u3001\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u5074\u3067\u5DEE\u3057\u66FF\u3048\u3066\u5229\u7528\u3067\u304D\u307E\u3059\u3002\n */\nexport const InMemoryStorage: StorageBackendConstructor = class InMemoryStorage implements StorageBackend {\n private rootKey: string\n private currentBranch: string | null = null\n\n // shared storage across instances keyed by root name\n private static stores: Map<string, {\n index: IndexFile,\n workspaceBlobs: Map<string, string>,\n baseBlobs: Map<string, string>,\n conflictBlobs: Map<string, string>,\n infoBlobs: Map<string, string>\n }> = new Map()\n\n /**\n * \u9759\u7684: \u3053\u306E\u5B9F\u88C5\u304C\u5229\u7528\u53EF\u80FD\u304B\u3092\u540C\u671F\u5224\u5B9A\u3057\u307E\u3059\u3002\n * \u30C6\u30B9\u30C8/\u30A4\u30F3\u30E1\u30E2\u30EA\u306A\u306E\u3067\u5E38\u306B true \u3092\u8FD4\u3057\u307E\u3059\u3002\n * @returns {boolean} \u5229\u7528\u53EF\u80FD\u306A\u3089 true\n */\n static canUse(): boolean {\n return true\n }\n\n /**\n * \u5229\u7528\u53EF\u80FD\u306A\u30EB\u30FC\u30C8\u540D\u3092\u8FD4\u3057\u307E\u3059\u3002\n * @returns {string[]} \u30EB\u30FC\u30C8\u540D\u306E\u914D\u5217\n */\n static availableRoots(namespace?: string): string[] {\n const keys = Array.from(InMemoryStorage.stores.keys())\n // keys are stored as namespace-prefixed keys like 'namespace/root'\n if (namespace) {\n const filtered = keys\n .filter((k) => k.startsWith(namespace + '/'))\n .map((k) => k.slice((namespace + '/').length))\n return filtered.length ? filtered : ['apigit_storage']\n }\n // Legacy behavior: return all registered root names across namespaces\n const roots = keys.map((k) => {\n const parts = k.split('/')\n return parts.length > 1 ? parts.slice(1).join('/') : parts[0]\n })\n const uniq = Array.from(new Set(roots))\n return uniq.length ? uniq : ['apigit_storage']\n }\n \n /**\n * \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u3002\u4E92\u63DB\u6027\u306E\u305F\u3081\u306B\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u540D\u3092\u53D7\u3051\u53D6\u308B\u304C\u7121\u8996\u3059\u308B\u3002\n * @param directory \u4EFB\u610F\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u6587\u5B57\u5217\uFF08\u4F7F\u7528\u3057\u306A\u3044\uFF09\n */\n constructor(namespace: string, directory?: string) {\n // Compose a namespace-prefixed store key\n const directoryName = directory ?? `__inmem_${Math.random().toString(36).slice(2)}`\n this.rootKey = namespace ? `${namespace}/${directoryName}` : directoryName\n if (!InMemoryStorage.stores.has(this.rootKey)) {\n InMemoryStorage.stores.set(this.rootKey, {\n index: { head: '', entries: {} },\n workspaceBlobs: new Map(),\n baseBlobs: new Map(),\n conflictBlobs: new Map(),\n infoBlobs: new Map()\n })\n }\n }\n\n /**\n *\n */\n setBranch(branch?: string | null): void {\n this.currentBranch = branch || null\n }\n\n /**\n * \u521D\u671F\u5316\u51E6\u7406\uFF08\u30A4\u30F3\u30E1\u30E2\u30EA\u3067\u306F\u4F55\u3082\u3057\u306A\u3044\uFF09\n * @returns {Promise<void>} \u89E3\u6C7A\u6642\u306B\u521D\u671F\u5316\u5B8C\u4E86\n */\n async init(): Promise<void> {\n return\n }\n\n /**\n * \u73FE\u5728\u306E `IndexFile` \u3092\u8FD4\u3057\u307E\u3059\u3002\n * @returns {Promise<IndexFile|null>} IndexFile\uFF08\u5E38\u306B\u975Enull\uFF09\n */\n async readIndex(): Promise<IndexFile | null> {\n const store = InMemoryStorage.stores.get(this.rootKey)!\n // Reconstruct entries from infoBlobs map\n const result: IndexFile = { head: store.index.head || '', entries: {} }\n\n // Determine branch scope and load info entries\n const branch = this.currentBranch || 'main'\n // First, load workspace-local info entries (unprefixed keys)\n this._loadInMemoryWorkspaceInfo(store, result, branch)\n this._loadInMemoryBranchInfo(store, result, branch)\n if ((store.index as any).lastCommitKey) result.lastCommitKey = (store.index as any).lastCommitKey\n // Preserve adapter metadata if present\n if ((store.index as any).adapter) result.adapter = (store.index as any).adapter\n\n return result\n }\n\n /**\n * Load workspace-local info entries into result.entries (unprefixed keys)\n * @returns {void}\n */\n private _loadInMemoryWorkspaceInfo(store: any, result: IndexFile, branch: string): void {\n for (const [k, v] of store.infoBlobs.entries()) {\n if (k.startsWith(branch + BRANCH_SEP)) continue\n const parsed = this._safeParseInfo(v, k)\n if (parsed) result.entries[k] = parsed\n }\n }\n\n /**\n * Load branch-scoped info entries into result.entries without overwriting workspace-local entries\n * @returns {void}\n */\n private _loadInMemoryBranchInfo(store: any, result: IndexFile, branch: string): void {\n for (const [k, v] of store.infoBlobs.entries()) {\n if (!k.startsWith(branch + BRANCH_SEP)) continue\n const filepath = k.slice((branch + BRANCH_SEP).length)\n if (result.entries[filepath]) continue\n const parsed = this._safeParseInfo(v, k)\n if (!parsed) continue\n if (parsed && parsed.state === 'deleted') continue\n result.entries[filepath] = parsed\n }\n }\n\n /**\n * Safely parse stored info JSON and log parse errors.\n * @returns parsed object or null\n */\n private _safeParseInfo(v: string, key: string): any | null {\n try {\n return JSON.parse(v)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('parse info failed', key, error)\n return null\n }\n }\n\n /**\n * IndexFile \u3092\u8A2D\u5B9A\u3057\u307E\u3059\u3002\n * @param idx \u66F8\u304D\u8FBC\u3080 IndexFile\n */\n async writeIndex(index: IndexFile): Promise<void> {\n const store = InMemoryStorage.stores.get(this.rootKey)!\n // write entries individually to infoBlobs, then persist meta\n const entries = index.entries || {}\n\n // Persist index entries into workspace-local info (unprefixed keys)\n // Only write info entries for files that exist in workspace or in base (branch-scoped)\n const branch = this.currentBranch || 'main'\n for (const filepath of Object.keys(entries)) {\n const existsInWorkspace = store.workspaceBlobs.has(filepath)\n const existsInBase = store.baseBlobs.has(`${branch}${BRANCH_SEP}${filepath}`)\n if (!existsInWorkspace && !existsInBase) continue\n store.infoBlobs.set(filepath, JSON.stringify(entries[filepath]))\n }\n const meta: any = { head: index.head }\n if ((index as any).lastCommitKey) meta.lastCommitKey = (index as any).lastCommitKey\n if ((index as any).adapter) meta.adapter = (index as any).adapter\n store.index = Object.assign({}, meta, { entries: {} })\n }\n\n /**\n * \u6307\u5B9A\u30D1\u30B9\u306B\u5BFE\u3057\u3066\u6587\u5B57\u5217\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u4FDD\u5B58\u3057\u307E\u3059\u3002\n * @param filepath \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @param content \u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\n */\n async writeBlob(filepath: string, content: string, segment?: any): Promise<void> {\n const seg = segment || SEG_WORKSPACE\n const store = InMemoryStorage.stores.get(this.rootKey)!\n this._applyBlobToStore(store, seg, filepath, content)\n // update info metadata when writing to workspace/base/conflict\n // For workspace writes, if a git base exists for this file, treat this\n // update as coming from the git base and build workspace/info based on\n // the git-scoped info; otherwise fall back to the default helper.\n if (seg === SEG_WORKSPACE) {\n const handled = await this._handleWorkspaceBlobWrite(store, filepath, content)\n if (handled) return\n }\n // For explicit info-workspace/info-git writes, we've already stored\n // the provided content directly; skip the generic metadata updater\n if (seg === SEG_INFO_WORKSPACE || seg === SEG_INFO_GIT) return\n\n // conflictBlob is a content-only blob; don't update metadata as it would\n // overwrite the conflict entry with minimal data and lose remoteSha/state fields\n if (seg === 'conflictBlob') return\n\n // For conflict segment, always use direct (unprefixed) info update to ensure\n // workspace-local entries are maintained and existing fields like remoteSha\n // are preserved in the conflict entry.\n const wrapped = (seg === SEG_WORKSPACE || seg === 'conflict')\n ? this._wrapStoreForInfoNoPrefix(store)\n : this._wrapStoreForInfoPrefix(store)\n await updateInfoForWrite(wrapped, filepath, seg, content)\n }\n\n /**\n * Handle workspace blob writes that should be based on existing git-scoped info.\n * Returns true when the operation is handled and caller should return early.\n * @returns {Promise<boolean>}\n */\n private async _handleWorkspaceBlobWrite(store: any, filepath: string, content: string): Promise<boolean> {\n const branch = this.currentBranch || 'main'\n const gitBaseKey = `${branch}${BRANCH_SEP}${filepath}`\n if (!store.baseBlobs.has(gitBaseKey)) return false\n const gitInfoTxt = store.infoBlobs.has(gitBaseKey) ? store.infoBlobs.get(gitBaseKey)! : null\n let existing: any = undefined\n if (gitInfoTxt) {\n try { existing = JSON.parse(gitInfoTxt) } catch (error) { if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('parse gitInfoTxt failed', error); existing = undefined }\n }\n const sha = await this.shaOf(content)\n const now = Date.now()\n const entry = this._buildWorkspaceInfoEntry(existing, filepath, sha, now)\n store.infoBlobs.set(filepath, JSON.stringify(entry))\n return true\n }\n\n /**\n * Persist a blob into the appropriate in-memory map for the segment.\n * @returns {void}\n */\n private _applyBlobToStore(store: any, seg: string, filepath: string, content: string): void {\n const branch = this.currentBranch || 'main'\n if (seg === SEG_WORKSPACE) store.workspaceBlobs.set(filepath, content)\n else if (seg === 'base') store.baseBlobs.set(`${branch}${BRANCH_SEP}${filepath}`, content)\n else if (seg === 'conflict') store.conflictBlobs.set(`${branch}${BRANCH_SEP}${filepath}`, content)\n // v0.0.4: conflictBlob segment for on-demand fetched conflict content\n else if (seg === 'conflictBlob') store.conflictBlobs.set(`${branch}${BRANCH_SEP}conflictBlob${BRANCH_SEP}${filepath}`, content)\n // Writes to the generic 'info' segment should create/update the\n // workspace-local (unprefixed) info entry so that subsequent\n // readBlob('info') returns the expected value. Dedicated helpers\n // exist for explicit workspace/git info variants.\n else if (seg === 'info') store.infoBlobs.set(filepath, content)\n else if (seg === SEG_INFO_WORKSPACE) store.infoBlobs.set(filepath, content)\n else if (seg === SEG_INFO_GIT) store.infoBlobs.set(`${branch}${BRANCH_SEP}${filepath}`, content)\n else throw new Error('unknown segment')\n }\n\n /**\n * Build the info entry for a write into a given segment.\n * @returns {any} info entry object\n */\n private _buildInfoEntryForSeg(seg: string, existing: any, filepath: string, sha: string, now: number): any {\n if (seg === SEG_WORKSPACE) return this._buildWorkspaceInfoEntry(existing, filepath, sha, now)\n if (seg === 'base') return this._buildBaseInfoEntry(existing, filepath, sha, now)\n if (seg === 'conflict') return this._buildConflictInfoEntry(existing, filepath, now)\n // v0.0.4: conflictBlob is same as conflict (don't update info)\n if (seg === 'conflictBlob') return this._buildConflictInfoEntry(existing, filepath, now)\n return { path: filepath, updatedAt: now }\n }\n\n /**\n * Build info entry when writing to the workspace segment\n * @returns {any}\n */\n private _buildWorkspaceInfoEntry(existing: any, filepath: string, sha: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.baseSha) entry.baseSha = existing.baseSha\n entry.workspaceSha = sha\n entry.state = entry.baseSha ? 'modified' : 'added'\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n return entry\n }\n\n /**\n * Build info entry when writing to the base segment\n * @returns {any}\n */\n private _buildBaseInfoEntry(existing: any, filepath: string, sha: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.workspaceSha) entry.workspaceSha = existing.workspaceSha\n entry.baseSha = sha\n entry.state = 'base'\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n return entry\n }\n\n /**\n * Build info entry when writing to the conflict segment\n * @returns {any}\n */\n private _buildConflictInfoEntry(existing: any, filepath: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.baseSha) entry.baseSha = existing.baseSha\n if (existing && existing.workspaceSha) entry.workspaceSha = existing.workspaceSha\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n entry.state = 'conflict'\n return entry\n }\n\n /**\n * \u6307\u5B9A\u30D1\u30B9\u306E\u5185\u5BB9\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param filepath \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<string|null>} \u5185\u5BB9\u3001\u5B58\u5728\u3057\u306A\u3051\u308C\u3070 null\n */\n async readBlob(filepath: string, segment?: any): Promise<string | null> {\n const store = InMemoryStorage.stores.get(this.rootKey)!\n return this._readInMemoryBlob(store, filepath, segment)\n }\n\n /**\n * Read blob with segment logic extracted for clarity.\n * @returns {string | null}\n */\n private _readInMemoryBlob(store: any, filepath: string, segment?: any): string | null {\n // Delegate segment-specific handling to a helper for clarity\n if (segment !== undefined) return this._readInMemoryBlobWithSegment(store, filepath, String(segment))\n\n const workspace = store.workspaceBlobs\n if (workspace && workspace.has(filepath)) return workspace.get(filepath)!\n const base = store.baseBlobs\n const branch = this.currentBranch || 'main'\n if (base && base.has(`${branch}${BRANCH_SEP}${filepath}`)) return base.get(`${branch}${BRANCH_SEP}${filepath}`)!\n return null\n }\n\n /**\n * Handle reading when a segment is explicitly provided.\n * @returns {string | null}\n */\n private _readInMemoryBlobWithSegment(store: any, filepath: string, seg: string): string | null {\n const branch = this.currentBranch || 'main'\n // Delegate specific segment handling to helpers to reduce cognitive complexity\n if (seg === SEG_INFO_WORKSPACE) return this._handleInfoWorkspaceSegment(store, filepath)\n if (seg === SEG_INFO_GIT) return this._handleInfoGitSegment(store, branch, filepath)\n if (seg === 'info') return this._handleInfoGenericSegment(store, branch, filepath)\n if (seg === 'conflictBlob') return this._handleConflictBlobSegment(store, branch, filepath)\n\n const segmentToStore = {\n [SEG_WORKSPACE]: store.workspaceBlobs,\n base: store.baseBlobs,\n conflict: store.conflictBlobs,\n info: store.infoBlobs,\n } as Record<string, Map<string, string>>\n return this._getFromSegmentMap(segmentToStore, seg, branch, filepath)\n }\n\n /**\n * Handle explicit workspace-info segment read.\n * @returns {string|null}\n */\n private _handleInfoWorkspaceSegment(store: any, filepath: string): string | null {\n const infoWs = this._readInfoWorkspace(store, filepath)\n return infoWs !== undefined ? infoWs : null\n }\n\n /**\n * Handle explicit git-scoped info segment read.\n * @returns {string|null}\n */\n private _handleInfoGitSegment(store: any, branch: string, filepath: string): string | null {\n const infoGit = this._readInfoGit(store, branch, filepath)\n return infoGit !== undefined ? infoGit : null\n }\n\n /**\n * Handle generic info segment read (prefer workspace then git-prefixed).\n * @returns {string|null}\n */\n private _handleInfoGenericSegment(store: any, branch: string, filepath: string): string | null {\n const infoWs = this._readInfoWorkspace(store, filepath)\n if (infoWs !== undefined) return infoWs\n const infoGit = this._readInfoGit(store, branch, filepath)\n return infoGit !== undefined ? infoGit : null\n }\n\n /**\n * Handle conflictBlob explicit segment read.\n * @returns {string|null}\n */\n private _handleConflictBlobSegment(store: any, branch: string, filepath: string): string | null {\n const conflictBlob = this._readConflictBlob(store, branch, filepath)\n return conflictBlob !== undefined ? conflictBlob : null\n }\n\n /**\n * Read a branch-prefixed info entry if present.\n * @param store storage object\n * @param branch branch name\n * @param filepath file path\n * @returns {string|null|undefined} stored info string or undefined when not present\n */\n private _readInfoGit(store: any, branch: string, filepath: string): string | null | undefined {\n if (store.infoBlobs.has(`${branch}${BRANCH_SEP}${filepath}`)) return store.infoBlobs.get(`${branch}${BRANCH_SEP}${filepath}`)!\n return undefined\n }\n\n /**\n * Read a workspace-local info entry if present.\n * @param store storage object\n * @param filepath file path\n * @returns {string|null|undefined} stored info string or undefined when not present\n */\n private _readInfoWorkspace(store: any, filepath: string): string | null | undefined {\n if (store.infoBlobs.has(filepath)) return store.infoBlobs.get(filepath)!\n return undefined\n }\n\n /**\n * Read an on-demand conflict blob if present.\n * @param store storage object\n * @param branch branch name\n * @param filepath file path\n * @returns {string|null|undefined} stored conflict blob or undefined when not present\n */\n private _readConflictBlob(store: any, branch: string, filepath: string): string | null | undefined {\n const key = `${branch}${BRANCH_SEP}conflictBlob${BRANCH_SEP}${filepath}`\n if (store.conflictBlobs.has(key)) return store.conflictBlobs.get(key)!\n return undefined\n }\n\n /**\n * Helper to read from a mapped segment store using prefixed/unprefixed keys.\n * @param map segment->store map\n * @param seg requested segment\n * @param branch branch name for prefixed keys\n * @param filepath file path to lookup\n * @returns {string|null} stored value or null\n */\n private _getFromSegmentMap(map: Record<string, Map<string, string>>, seg: string, branch: string, filepath: string): string | null {\n const m = map[seg]\n if (!m) return null\n if (m.has(filepath)) return m.get(filepath)!\n const key = `${branch}${BRANCH_SEP}${filepath}`\n return m.has(key) ? m.get(key)! : null\n }\n\n /**\n * \u6307\u5B9A\u30D1\u30B9\u306E\u30A8\u30F3\u30C8\u30EA\u3092\u524A\u9664\u3057\u307E\u3059\u3002\n * @param filepath \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n */\n async deleteBlob(filepath: string, segment?: any): Promise<void> {\n // If segment specified, delete only that segment\n const store = InMemoryStorage.stores.get(this.rootKey)!\n const branch = this.currentBranch || 'main'\n if (segment === SEG_WORKSPACE) { store.workspaceBlobs.delete(filepath); return }\n if (segment === 'base') { store.baseBlobs.delete(`${branch}${BRANCH_SEP}${filepath}`); return }\n if (segment === 'conflict') { store.conflictBlobs.delete(`${branch}${BRANCH_SEP}${filepath}`); return }\n // v0.0.4: conflictBlob segment deletion\n if (segment === 'conflictBlob') { store.conflictBlobs.delete(`${branch}${BRANCH_SEP}conflictBlob${BRANCH_SEP}${filepath}`); return }\n if (segment === 'info') { store.infoBlobs.delete(filepath); store.infoBlobs.delete(`${branch}${BRANCH_SEP}${filepath}`); return }\n if (segment === SEG_INFO_WORKSPACE) { store.infoBlobs.delete(filepath); return }\n if (segment === SEG_INFO_GIT) { store.infoBlobs.delete(`${branch}${BRANCH_SEP}${filepath}`); return }\n // otherwise delete from all segments\n store.workspaceBlobs.delete(filepath)\n store.baseBlobs.delete(`${branch}${BRANCH_SEP}${filepath}`)\n store.conflictBlobs.delete(`${branch}${BRANCH_SEP}${filepath}`)\n store.conflictBlobs.delete(`${branch}${BRANCH_SEP}conflictBlob${BRANCH_SEP}${filepath}`)\n store.infoBlobs.delete(`${branch}${BRANCH_SEP}${filepath}`)\n store.infoBlobs.delete(filepath)\n }\n\n /**\n * \u6307\u5B9A\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u914D\u4E0B\u306E\u30D5\u30A1\u30A4\u30EB\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param prefix \u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\uFF08\u4F8B: 'dir/sub'\uFF09\n * @param segment \u30BB\u30B0\u30E1\u30F3\u30C8\uFF08'workspace' \u7B49\uFF09\u3002\u7701\u7565\u6642\u306F 'workspace'\n * @param recursive \u30B5\u30D6\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3082\u542B\u3081\u308B\u304B\u3002\u7701\u7565\u6642\u306F true\n * @returns {Promise<Array<{ path: string; info: string | null }>>}\n */\n async listFiles(prefix?: string, segment?: any, recursive = true): Promise<Array<{ path: string; info: string | null }>> {\n const seg = segment || SEG_WORKSPACE\n const store = InMemoryStorage.stores.get(this.rootKey)!\n const segmentToStore = {\n [SEG_WORKSPACE]: store.workspaceBlobs,\n base: store.baseBlobs,\n conflict: store.conflictBlobs,\n info: store.infoBlobs,\n } as Record<string, Map<string, string>>\n\n const m = segmentToStore[String(seg)]\n if (!m) return []\n\n const p = prefix ? prefix.replace(/^\\/+|\\/+$/g, '') : ''\n const allKeys = Array.from(m.keys())\n const keys = this._resolveKeysForList(allKeys, String(seg), p, recursive)\n\n return this._collectFilesInMemory(keys, store)\n }\n\n /**\n * Resolve and filter keys for `listFiles` into final key list.\n * @returns {string[]} filtered keys\n */\n private _resolveKeysForList(allKeys: string[], seg: string, p: string, recursive: boolean): string[] {\n let keys = allKeys.slice()\n if (seg === 'info') {\n const branch = this.currentBranch || 'main'\n const unpref = keys.filter((k) => !k.startsWith(branch + BRANCH_SEP))\n const pref = keys.filter((k) => k.startsWith(branch + BRANCH_SEP)).map((k) => k.slice((branch + BRANCH_SEP).length))\n keys = Array.from(new Set(unpref.concat(pref)))\n } else if (seg !== SEG_WORKSPACE) {\n const branch = this.currentBranch || 'main'\n keys = keys.filter((k) => k.startsWith(branch + BRANCH_SEP)).map((k) => k.slice((branch + BRANCH_SEP).length))\n }\n return this._filterKeys(keys, p, recursive)\n }\n\n /**\n * Collect file info objects for keys array (InMemory implementation).\n * @returns {Array<{path:string, info:string|null}>}\n */\n private _collectFilesInMemory(keys: string[], store: any): Array<{ path: string; info: string | null }> {\n const out: Array<{ path: string; info: string | null }> = []\n const branch = this.currentBranch || 'main'\n for (const k of keys) {\n let info: string | null = null\n if (store.infoBlobs.has(k)) info = store.infoBlobs.get(k)!\n else if (store.infoBlobs.has(`${branch}${BRANCH_SEP}${k}`)) info = store.infoBlobs.get(`${branch}${BRANCH_SEP}${k}`)!\n out.push({ path: k, info })\n }\n return out\n }\n\n /**\n * Filter keys by prefix and recursion flag for InMemoryStorage\n * @returns {string[]}\n */\n private _filterKeys(keys: string[], p: string, recursive: boolean): string[] {\n if (p) keys = keys.filter((k) => k === p || k.startsWith(p + '/'))\n if (!recursive) {\n keys = keys.filter((k) => {\n const rest = p ? k.slice(p.length + (p ? 1 : 0)) : k\n return !rest.includes('/')\n })\n }\n return keys\n }\n\n /**\n * Wrap store to present branch-prefixed info accessors\n * @returns {any} wrapped store view for info access\n */\n private _wrapStoreForInfoPrefix(store: any): any {\n const branch = this.currentBranch || 'main'\n /**\n * Create branch-prefixed storage key\n * @param {string} k key path\n * @returns {string} prefixed key\n */\n const prefixKey = (k: string) => `${branch}${BRANCH_SEP}${k}`\n return Object.assign({}, store, {\n infoBlobs: {\n /** Check whether prefixed key exists\n * @returns {boolean}\n */\n has: (k: string) => store.infoBlobs.has(k) || store.infoBlobs.has(prefixKey(k)),\n /** Get value preferring unprefixed then branch-prefixed key\n * @returns {string | undefined}\n */\n get: (k: string) => {\n if (store.infoBlobs.has(k)) return store.infoBlobs.get(k)\n return store.infoBlobs.get(prefixKey(k))\n },\n /** Set value: prefer updating an existing unprefixed entry if present;\n * otherwise write into the branch-prefixed key. This preserves the\n * expected read semantics where workspace-local info takes precedence.\n * @returns {any}\n */\n set: (k: string, v: string) => {\n if (store.infoBlobs.has(k)) return store.infoBlobs.set(k, v)\n return store.infoBlobs.set(prefixKey(k), v)\n },\n /** Delete both unprefixed and prefixed keys\n * @returns {boolean}\n */\n delete: (k: string) => { store.infoBlobs.delete(k); return store.infoBlobs.delete(prefixKey(k)) }\n }\n })\n }\n\n /**\n * Wrap store to present unprefixed info accessors\n * @returns {any} wrapped store view for info access\n */\n private _wrapStoreForInfoNoPrefix(store: any): any {\n return Object.assign({}, store, {\n infoBlobs: {\n /** Check whether key exists\n * @returns {boolean}\n */\n has: (k: string) => store.infoBlobs.has(k),\n /** Get value for key\n * @returns {string | undefined}\n */\n get: (k: string) => store.infoBlobs.get(k),\n /** Set value for key\n * @returns {void}\n */\n set: (k: string, v: string) => store.infoBlobs.set(k, v),\n /** Delete key\n * @returns {boolean}\n */\n delete: (k: string) => store.infoBlobs.delete(k)\n }\n })\n }\n\n /**\n * Calculate SHA-1 hex digest of given content.\n * @param content Input string\n * @returns {Promise<string>} Hex encoded SHA-1 digest\n */\n private async shaOf(content: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(content)\n const hashBuffer = await crypto.subtle.digest('SHA-1', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n }\n\n /**\n * \u6307\u5B9A\u3055\u308C\u305F\u30EB\u30FC\u30C8\u540D\u3092\u524A\u9664\u3057\u307E\u3059\n * @param rootName \u524A\u9664\u3059\u308B\u30EB\u30FC\u30C8\u540D\n * @returns {void}\n */\n static delete(rootName: string): void {\n // Accept either a full namespaced key or a bare directory name.\n if (InMemoryStorage.stores.has(rootName)) {\n InMemoryStorage.stores.delete(rootName)\n return\n }\n // If a bare rootName was provided, try to find a namespaced key that ends with it\n for (const key of Array.from(InMemoryStorage.stores.keys())) {\n if (key === rootName || key.endsWith('/' + rootName)) {\n InMemoryStorage.stores.delete(key)\n return\n }\n }\n throw new Error(`InMemory root \"${rootName}\" not found`)\n }\n\n}\n\nexport default InMemoryStorage\n\n"],
|
|
5
|
-
"mappings": "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",
|
|
3
|
+
"sources": ["../src/index.ts", "../src/virtualfs/utils/urlParser.ts", "../src/virtualfs/opfsStorage.ts", "../src/git/abstractAdapter.ts", "../src/git/githubAdapter.ts", "../src/git/gitlabAdapter.ts", "../src/virtualfs/hashUtils.ts", "../src/virtualfs/localChangeApplier.ts", "../src/virtualfs/localFileManager.ts", "../src/virtualfs/indexManager.ts", "../src/virtualfs/changeTracker.ts", "../src/virtualfs/conflictManager.ts", "../src/virtualfs/remoteSynchronizer.ts", "../src/virtualfs/virtualfs.ts", "../src/virtualfs/indexedDatabaseStorage.ts", "../src/virtualfs/metadataManager.ts", "../src/virtualfs/inmemoryStorage.ts"],
|
|
4
|
+
"sourcesContent": ["export { default as VirtualFS } from './virtualfs/virtualfs.ts'\nexport { default as IndexedDatabaseStorage } from './virtualfs/indexedDatabaseStorage.ts'\nexport { default as OpfsStorage } from './virtualfs/opfsStorage.ts'\nexport { default as InMemoryStorage } from './virtualfs/inmemoryStorage.ts'\nexport { default as GitHubAdapter } from './git/githubAdapter.ts'\nexport { default as GitLabAdapter } from './git/gitlabAdapter.ts'\nexport { default } from './virtualfs/virtualfs.ts'\n\n// Re-export commonly referenced types so TypeDoc includes them when building\nexport type { IndexFile, AdapterMeta, AdapterOptions, AdapterOptionsBase, GitHubAdapterOptions, GitLabAdapterOptions, CommitInput, BranchListQuery, BranchListPage, RepositoryMetadata, CreateBranchInput, CreateBranchResult, IndexEntry, BranchInfo, Change as VfsChange, FileState } from './virtualfs/types.ts'\nexport type { StorageBackend, StorageBackendConstructor, Segment } from './virtualfs/storageBackend.ts'\nexport type { Logger } from './git/abstractAdapter.ts'\nexport type { CommitHistoryQuery, CommitHistoryPage, CommitSummary, CommitResult, GitAdapter, Change as GitChange } from './git/adapter.ts'\nexport type { GHOptions } from './git/githubAdapter.ts'\nexport type { GLOptions } from './git/gitlabAdapter.ts'\nexport type { RemoteSnapshotDescriptor } from './virtualfs/virtualfs.ts'\n", "import type { AdapterMeta, GitHubAdapterOptions, GitLabAdapterOptions } from '../types.ts'\nexport type AdapterType = 'github' | 'gitlab'\n\n/**\n * Parse a repository URL into adapter metadata suitable for `setAdapter`.\n * @param urlString repository URL\n * @param token optional token hint\n * @param platformOverride optional platform override ('github'|'gitlab'|'auto')\n * @returns parsed AdapterMeta containing `type` and `opts`\n */\nexport function parseAdapterFromUrl(urlString: string, token?: string, platformOverride: 'github' | 'gitlab' | 'auto' = 'auto'): AdapterMeta {\n if (!urlString || typeof urlString !== 'string') throw new TypeError('invalid url')\n\n let parsed: URL\n try {\n parsed = new URL(urlString)\n } catch (error) {\n throw new TypeError('invalid url')\n }\n\n const hostname = (parsed.hostname || '').toLowerCase()\n const searchParameters = parsed.searchParams\n const tokenFromUrl = searchParameters.get('token') || undefined\n const resolvedToken = token || tokenFromUrl\n const branchParameter = searchParameters.get('branch') || undefined\n\n const normalizedPath = parsed.pathname.replace(/(^\\/+|\\/+$)/g, '')\n const rawSegments = normalizedPath ? normalizedPath.split('/') : []\n const segments = rawSegments.map(segment => segment.replace(/\\.git$/i, ''))\n\n const platform = determinePlatform(hostname, segments, resolvedToken, platformOverride)\n\n if (platform === 'github') return buildGithubMeta(parsed, hostname, segments, resolvedToken, branchParameter)\n return buildGitlabMeta(parsed, hostname, segments, resolvedToken, branchParameter)\n}\n/**\n * Determine which platform the URL refers to.\n * @param hostname lowercased hostname\n * @param segments path segments\n * @param resolvedToken optional token hint\n * @param platformOverride override value\n * @returns determined AdapterType\n */\nfunction determinePlatform(hostname: string, segments: string[], resolvedToken?: string, platformOverride: 'github' | 'gitlab' | 'auto' = 'auto'): AdapterType {\n if (platformOverride === 'github' || platformOverride === 'gitlab') return platformOverride\n if (hostname.includes('gitlab')) return 'gitlab'\n if (hostname.includes('github')) return 'github'\n if (resolvedToken && resolvedToken.startsWith('glpat_')) return 'gitlab'\n if (resolvedToken && resolvedToken.startsWith('ghp_')) return 'github'\n if (segments.length >= 3) return 'gitlab'\n if (segments.length === 2) return 'github'\n throw new Error('cannot determine adapter type from URL')\n}\n/**\n * Build metadata for GitHub repositories.\n * @param parsed parsed URL instance\n * @param hostname hostname string\n * @param segments path segments\n * @param resolvedToken optional token\n * @param branchParameter optional branch parameter\n * @returns AdapterMeta for GitHub\n */\nfunction buildGithubMeta(parsed: URL, hostname: string, segments: string[], resolvedToken?: string, branchParameter?: string): AdapterMeta {\n const owner = segments[0] || ''\n const repo = segments[1] || ''\n if (!owner || !repo) throw new Error('invalid repository path')\n const options: GitHubAdapterOptions = { owner, repo, branch: branchParameter || 'main' }\n if (resolvedToken) options.token = resolvedToken\n if (!/github\\.com$/i.test(hostname)) {\n options.host = `${parsed.protocol}//${parsed.host}/api/v3`\n }\n return { type: 'github', opts: options }\n}\n/**\n * Build metadata for GitLab repositories.\n * @param parsed parsed URL instance\n * @param hostname hostname string\n * @param segments path segments\n * @param resolvedToken optional token\n * @param branchParameter optional branch parameter\n * @returns AdapterMeta for GitLab\n */\nfunction buildGitlabMeta(parsed: URL, hostname: string, segments: string[], resolvedToken?: string, branchParameter?: string): AdapterMeta {\n const projectId = segments.join('/')\n if (!projectId) throw new Error('invalid repository path')\n const options: GitLabAdapterOptions = { projectId, branch: branchParameter || 'main' }\n if (resolvedToken) options.token = resolvedToken\n if (!/gitlab\\.com$/i.test(hostname)) {\n options.host = `${parsed.protocol}//${parsed.host}`\n }\n return { type: 'gitlab', opts: options }\n}\n\n/**\n * Build a canonical repository URL from adapter options and type.\n * The URL does NOT contain branch information (branch is stored separately).\n * @param type adapter type ('github' | 'gitlab')\n * @param options adapter options containing host, owner, repo, or projectId\n * @returns canonical repository URL string\n */\nexport function buildUrlFromAdapterOptions(type: string, options: Record<string, any>): string {\n if (type === 'github') return buildGithubUrl(options)\n if (type === 'gitlab') return buildGitlabUrl(options)\n throw new Error(`unsupported adapter type: ${type}`)\n}\n\n/**\n * Build GitHub repository URL from options.\n * @param options adapter options with owner, repo, and optional host\n * @returns GitHub repository URL\n */\nfunction buildGithubUrl(options: Record<string, any>): string {\n const owner = options.owner || ''\n const repo = options.repo || ''\n if (!owner || !repo) throw new Error('owner and repo are required for github')\n const host = options.host as string | undefined\n if (host) {\n // host is API base like 'https://git.example.com/api/v3' \u2013 strip /api/v3 suffix\n const baseUrl = host.replace(/\\/api\\/v\\d+\\/?$/i, '')\n return `${baseUrl}/${owner}/${repo}`\n }\n return `https://github.com/${owner}/${repo}`\n}\n\n/**\n * Build GitLab repository URL from options.\n * @param options adapter options with projectId and optional host\n * @returns GitLab repository URL\n */\nfunction buildGitlabUrl(options: Record<string, any>): string {\n const projectId = options.projectId || ''\n if (!projectId) throw new Error('projectId is required for gitlab')\n const host = options.host as string | undefined\n if (host) {\n // host is base URL like 'http://localhost:8929' or 'https://gitlab.example.com'\n const trimmed = host.replace(/\\/+$/, '')\n return `${trimmed}/${projectId}`\n }\n return `https://gitlab.com/${projectId}`\n}\n", "\uFEFFimport { IndexFile } from './types.ts'\nimport { StorageBackend, StorageBackendConstructor } from './storageBackend.ts'\n\nconst ERR_OPFS_DIR_API = 'OPFS directory API not available'\nconst VAR_WORKSPACE = 'workspace'\n// For branch-scoped storage, we store git-managed segments under\n// `.git/{branch}/{segment}` while workspace remains under `workspace`.\nconst SEG_BASE = 'base'\nconst SEG_CONFLICT = 'conflict'\nconst SEG_CONFLICT_BLOB = 'conflictBlob'\nconst SEG_INFO = 'info'\n\n/** OPFS (origin private file system) \u3092\u5229\u7528\u3059\u308B\u6C38\u7D9A\u5316\u5B9F\u88C5 */\nexport const OpfsStorage: StorageBackendConstructor = class OpfsStorage implements StorageBackend {\n /**\n * \u540C\u671F\u7684\u306B OPFS \u5229\u7528\u53EF\u5426\u3092\u5224\u5B9A\u3057\u307E\u3059\uFF08\u30EC\u30AC\u30B7\u30FC\u30D2\u30F3\u30C8\u3082\u542B\u3080\uFF09\u3002\n * @returns {boolean} \u5229\u7528\u53EF\u80FD\u306A\u3089 true\n */\n static canUse(): boolean {\n let ok = false\n const nav = (globalThis as any).navigator\n // If navigator.storage.persist exists, treat as OPFS-capable hint (legacy detection)\n if (nav && nav.storage && typeof nav.storage.persist === 'function') ok = true\n if (nav && nav.storage && typeof nav.storage.getDirectory === 'function') ok = true\n\n if (!ok && (globalThis as any).originPrivateFileSystem && typeof (globalThis as any).originPrivateFileSystem.getDirectory === 'function') ok = true\n return ok\n }\n\n /**\n * Return available root folder names for OPFS. This method is synchronous\n * to satisfy the StorageBackendConstructor contract; it returns a cached\n * hint if available and kicks off an async probe to populate the cache.\n * If no information is available synchronously an empty array is returned.\n * @param {string} namespace Namespace to filter\n * @returns {Promise<string[]>} available root directories\n */\n static async availableRoots(namespace: string): Promise<string[]> {\n try {\n const root = await OpfsStorage._getNavigatorStorageRoot()\n if (!root) return []\n // Find the namespace folder under OPFS root and list its children\n for await (const handle of (root as any).values()) {\n const name = OpfsStorage._extractHandleName(handle)\n if (name === namespace && OpfsStorage._isDirectoryHandle(handle)) {\n return await OpfsStorage._collectDirectoryNames(handle)\n }\n }\n return []\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('availableRoots probe failed', error)\n return []\n }\n }\n\n /**\n * Get OPFS root from navigator.storage.getDirectory()\n * @returns {Promise<any|null>}\n */\n private static async _getNavigatorStorageRoot(): Promise<any | null> {\n const nav = (globalThis as any).navigator\n if (!nav || !nav.storage || typeof nav.storage.getDirectory !== 'function') return null\n return await nav.storage.getDirectory()\n }\n\n /**\n * Collect directory names from OPFS root handle\n * @param {any} root Directory handle\n * @returns {Promise<string[]>}\n */\n private static async _collectDirectoryNames(root: any): Promise<string[]> {\n const names: string[] = []\n for await (const handle of (root as any).values()) {\n const name = OpfsStorage._extractHandleName(handle)\n if (name && OpfsStorage._isDirectoryHandle(handle)) {\n names.push(name)\n }\n }\n return names\n }\n\n /**\n * Extract name from directory handle\n * @param {any} handle File/directory handle\n * @returns {string}\n */\n private static _extractHandleName(handle: any): string {\n return handle && handle.name ? handle.name : ''\n }\n\n /**\n * Check if handle represents a directory\n * @param {any} handle File/directory handle\n * @returns {boolean}\n */\n private static _isDirectoryHandle(handle: any): boolean {\n return (\n (handle && handle.kind === 'directory') ||\n typeof (handle && handle.getDirectoryHandle) === 'function' ||\n typeof (handle && handle.getDirectory) === 'function'\n )\n }\n\n /**\n * Returns the known segment variants in search order.\n * @returns {string[]} segment directory names\n */\n private getVariants(): string[] {\n return [VAR_WORKSPACE, SEG_BASE, SEG_CONFLICT, SEG_CONFLICT_BLOB]\n }\n\n private rootDir = 'apigit_storage'\n private currentBranch: string | null = null\n private namespace: string = ''\n\n /**\n * Calculate SHA-1 hex digest of given content.\n * @param content Input string\n * @returns {Promise<string>} Hex encoded SHA-1 digest\n */\n private async shaOf(content: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(content)\n const hashBuffer = await crypto.subtle.digest('SHA-1', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n }\n\n /**\n * \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\uFF08OPFS \u306F\u521D\u671F\u5316\u4E0D\u8981\uFF09\u3002\n * `namespace` \u306F\u5FC5\u9808\u3002\u6319\u52D5:\n * - `new(namespace)` \u306E\u307F\u306E\u5834\u5408\u306F OPFS \u30EB\u30FC\u30C8\u3068\u3057\u3066 `namespace` \u3092\u4F7F\u3046\uFF08\u30C6\u30B9\u30C8\u306E\u671F\u5F85\u5024\u306B\u5408\u308F\u305B\u308B\uFF09\u3002\n * - `new(namespace, root)` \u306E\u5834\u5408\u306F `namespace/root` \u3092\u4F7F\u3046\u3002\n * @param {string} namespace Namespace\n * @param {string} [root] Optional root directory name\n */\n constructor(namespace: string, root?: string) {\n this.namespace = namespace || ''\n if (root) {\n this.rootDir = this.namespace ? `${this.namespace}/${root}` : root\n } else if (this.namespace) {\n // When only namespace provided, treat it as the root directory to match\n // existing test expectations where availableRoots returns a top-level\n // folder name (e.g. 'GitLab_test01').\n this.rootDir = this.namespace\n } else {\n // Fallback to default\n this.rootDir = this.rootDir\n }\n }\n\n /**\n * \u521D\u671F\u5316\uFF08OPFS \u306F\u30E9\u30F3\u30BF\u30A4\u30E0\u5224\u5B9A\u306E\u307F\uFF09\n * @returns {Promise<void>} \u521D\u671F\u5316\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async init(): Promise<void> {\n const root = await this.getOpfsRoot()\n if (!root) return\n\n // If index metadata doesn't exist, create an empty index to initialize the root\n const metaTxt = await this._readIndexMetadata(root)\n if (!metaTxt) {\n const canWriteIndex = typeof (root as any).getDirectoryHandle === 'function' || typeof (root as any).getDirectory === 'function' || typeof (root as any).getFileHandle === 'function'\n if (canWriteIndex) await this.writeIndex({ head: '', entries: {} })\n }\n }\n\n /**\n * Set active branch for storage scoping. Backends that support branch scoping\n * should honor this to isolate base/conflict/info data per branch.\n * @param {string | undefined | null} branch branch name or null\n * @returns {void}\n */\n setBranch(branch?: string | null): void {\n this.currentBranch = branch || null\n }\n\n /**\n * Map logical segment to concrete prefix used on OPFS.\n * @param {string} segment Segment identifier\n * @returns {string} concrete prefix path for the given segment\n */\n private _segmentToPrefix(segment: 'workspace' | 'base' | 'conflict' | 'conflictBlob' | 'info'): string {\n // Workspace content is now stored under workspace/base\n if (segment === 'workspace') return `${VAR_WORKSPACE}/base`\n // info for git-managed segments remains under .git/{branch}/info\n const segName = segment === 'base' ? SEG_BASE : segment === 'info' ? SEG_INFO : segment === 'conflictBlob' ? SEG_CONFLICT_BLOB : SEG_CONFLICT\n const branch = this.currentBranch || 'main'\n return `.git/${branch}/${segName}`\n }\n\n /**\n * Try to get OPFS root from navigator.storage.getDirectory().\n * @returns {Promise<any|null>}\n */\n private async _tryNavigatorStorage(): Promise<any | null> {\n const nav = (globalThis as any).navigator\n if (!nav || !nav.storage || typeof nav.storage.getDirectory !== 'function') {\n return null\n }\n try {\n const maybe = nav.storage.getDirectory()\n const d = await Promise.resolve(maybe)\n return d || null\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_tryNavigatorStorage failed', error)\n return null\n }\n }\n\n /**\n * Try to get OPFS root from originPrivateFileSystem.getDirectory().\n * @returns {Promise<any|null>}\n */\n private async _tryOriginPrivateFileSystem(): Promise<any | null> {\n const opfs = (globalThis as any).originPrivateFileSystem\n if (!opfs || typeof opfs.getDirectory !== 'function') {\n return null\n }\n try {\n return await opfs.getDirectory()\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_tryOriginPrivateFileSystem failed', error)\n return null\n }\n }\n\n /**\n * OPFS \u306E\u30EB\u30FC\u30C8\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30CF\u30F3\u30C9\u30EB\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u5931\u6557\u6642\u306F null \u3092\u8FD4\u3059\u3002\n * @returns {Promise<any|null>} \u30EB\u30FC\u30C8\u30CF\u30F3\u30C9\u30EB\u307E\u305F\u306F null\n */\n private async getOpfsRoot(): Promise<any | null> {\n const fromNav = await this._tryNavigatorStorage()\n if (fromNav) return fromNav\n return await this._tryOriginPrivateFileSystem()\n }\n\n /**\n * \u6307\u5B9A\u30D1\u30B9\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u518D\u5E30\u7684\u306B\u4F5C\u6210\u3057\u3066\u8FD4\u3059\n * @param {any} root Root directory handle\n * @param {string[]} parts Directory path parts\n * @returns {Promise<any>} \u751F\u6210\u3055\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30CF\u30F3\u30C9\u30EB\n */\n private async ensureDir(root: any, parts: string[]): Promise<any> {\n let directory = root\n for (const part of parts) {\n if (directory && typeof directory.getDirectoryHandle === 'function') {\n directory = await directory.getDirectoryHandle(part, { create: true })\n } else if (directory && typeof directory.getDirectory === 'function') {\n directory = await directory.getDirectory(part, { create: true })\n } else {\n throw new Error(ERR_OPFS_DIR_API)\n }\n }\n return directory\n }\n\n /**\n * Read index metadata file from OPFS.\n * @param {any} root Root directory handle\n * @returns {Promise<string|null>}\n */\n private async _readIndexMetadata(root: any): Promise<string | null> {\n try {\n const hasDirectoryApi = typeof (root as any).getDirectoryHandle === 'function' || typeof (root as any).getDirectory === 'function'\n if (hasDirectoryApi) {\n const scoped = await this.traverseDir(root, this.rootDir.split('/').filter(Boolean))\n const fh = await scoped.getFileHandle('index')\n const file = await fh.getFile()\n return await file.text()\n }\n const fh = await (root as any).getFileHandle('index')\n const file = await fh.getFile()\n return await file.text()\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_readIndexMetadata failed', error)\n return null\n }\n }\n\n /**\n * index \u3092\u8AAD\u307F\u51FA\u3059\n * @returns {Promise<IndexFile|null>} \u8AAD\u307F\u51FA\u3057\u305F IndexFile\u3001\u5B58\u5728\u3057\u306A\u3051\u308C\u3070 null\n */\n async readIndex(): Promise<IndexFile | null> {\n try {\n const root = await this.getOpfsRoot()\n if (!root) return null\n\n const metaTxt = await this._readIndexMetadata(root)\n\n const result: IndexFile = { head: '', entries: {} }\n if (metaTxt) {\n const parsed = JSON.parse(metaTxt) as any\n result.head = parsed.head || ''\n if (parsed.lastCommitKey) result.lastCommitKey = parsed.lastCommitKey\n if (parsed.adapter) result.adapter = parsed.adapter\n }\n\n // Reconstruct entries by reading all files under the 'info' segment\n await this._readInfoEntries(root, result)\n\n return result\n } catch (error) {\n return { head: '', entries: {} }\n }\n }\n\n /**\n * Read all info entries under VAR_INFO and populate the given IndexFile.entries map.\n * @param {any} root Root directory handle\n * @param {IndexFile} result Result IndexFile to populate\n * @returns {Promise<void>}\n */\n private async _readInfoEntries(root: any, result: IndexFile): Promise<void> {\n // Load workspace-local info first (workspace/info), then merge git-scoped info (.git/{branch}/info)\n const workspaceInfoPrefix = `${VAR_WORKSPACE}/info`\n await this._readFilesIntoEntries(root, workspaceInfoPrefix, result, true)\n\n // Load git-scoped info, but do not overwrite workspace-local entries\n const gitInfoPrefix = this._segmentToPrefix('info')\n await this._readFilesIntoEntries(root, gitInfoPrefix, result, false)\n }\n\n /**\n * Read files at the given prefix and populate result.entries.\n * If `overwrite` is true, entries will be overwritten; otherwise existing entries are preserved.\n * @param {any} root Root directory handle\n * @param {string} prefix Prefix path\n * @param {IndexFile} result Result IndexFile\n * @param {boolean} overwrite Whether to overwrite existing entries\n * @returns {Promise<void>}\n */\n private async _readFilesIntoEntries(root: any, prefix: string, result: IndexFile, overwrite: boolean): Promise<void> {\n const files = await this.listFilesAtPrefix(root, prefix).catch(() => [])\n for (const fp of files) {\n if (!overwrite && result.entries[fp]) continue\n const txt = await this.readFromPrefix(root, prefix, fp).catch(() => null)\n if (!txt) continue\n try {\n result.entries[fp] = JSON.parse(txt) as any\n } catch (error) {\n console.warn('\u7121\u8996\u3055\u308C\u305F\u30A8\u30E9\u30FC', error)\n continue\n }\n }\n }\n\n /**\n * index \u3092\u66F8\u304D\u8FBC\u3080\n * @param {IndexFile} index - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30D5\u30A1\u30A4\u30EB\n * @returns {Promise<void>} \u66F8\u8FBC\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async writeIndex(index: IndexFile): Promise<void> {\n const root = await this.getOpfsRoot()\n if (!root) throw new Error('OPFS not available')\n\n // Write each entry separately to the 'info' segment\n const entries = index.entries || {}\n // Persist index entries into workspace-local info (workspace/info)\n // Only create workspace/info entries for files that actually exist in workspace/base\n for (const filepath of Object.keys(entries)) {\n const entry = entries[filepath]\n const existsWorkspace = await this.readFromPrefix(root, `${VAR_WORKSPACE}/base`, filepath).catch(() => null)\n if (existsWorkspace !== null) {\n // store each IndexEntry JSON under workspace/info using the filepath as key\n await this._writeToPrefix(root, `${VAR_WORKSPACE}/info`, filepath, JSON.stringify(entry))\n continue\n }\n // If workspace base absent, persist into git-scoped info so readIndex\n // can reconstruct entries (tests expect entries persisted even when\n // workspace copies are not present).\n const gitInfoPrefix = this._segmentToPrefix('info')\n await this._writeToPrefix(root, gitInfoPrefix, filepath, JSON.stringify(entry))\n }\n\n // Persist index metadata (without entries), include adapter meta when present\n const meta: any = { head: index.head }\n if (index.lastCommitKey) meta.lastCommitKey = index.lastCommitKey\n if ((index as any).adapter) meta.adapter = (index as any).adapter\n\n const hasDirectoryApi = typeof (root as any).getDirectoryHandle === 'function' || typeof (root as any).getDirectory === 'function'\n const payload = JSON.stringify(meta)\n if (hasDirectoryApi) {\n const parts = this.rootDir.split('/').filter(Boolean)\n const parent = await this.ensureDir(root, parts)\n const fh = await parent.getFileHandle('index', { create: true })\n const writable = await fh.createWritable()\n await writable.write(payload)\n await writable.close()\n return\n }\n // fallback: root supports getFileHandle directly\n const fh = await (root as any).getFileHandle('index', { create: true })\n const writable = await fh.createWritable()\n await writable.write(payload)\n await writable.close()\n }\n\n /**\n * blob \u3092\u66F8\u304D\u8FBC\u3080\n * @param {string} filepath File path\n * @param {string} content File content\n * @param {string} [segment] Storage segment\n * @returns {Promise<void>} \u66F8\u8FBC\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async writeBlob(filepath: string, content: string, segment?: 'workspace' | 'base' | 'conflict' | 'conflictBlob' | 'info'): Promise<void> {\n // Support special pseudo-segments to persist/read info explicitly\n const seg: 'workspace' | 'base' | 'conflict' | 'conflictBlob' | 'info' | 'info-workspace' | 'info-git' = (segment ?? 'workspace') as any\n const root = await this.getOpfsRoot()\n if (!root) throw new Error('OPFS not available')\n // Determine destination for actual blob write\n if (seg === 'info-workspace') {\n // writing index entry into workspace/info\n await this._writeToPrefix(root, `${VAR_WORKSPACE}/info`, filepath, content)\n return\n }\n const prefix = this._segmentToPrefix(seg as any)\n // write actual blob\n await this._writeToPrefix(root, prefix, filepath, content)\n\n // if writing to info segment itself, do not create recursive info entry\n if (seg === 'info' || seg === 'conflictBlob') return\n\n // create/update corresponding info entry summarizing this file\n const sha = await this.shaOf(content)\n const now = Date.now()\n await this._updateInfoForWrite(root, seg as any, filepath, sha, now)\n }\n\n /**\n * Build and persist info metadata for a file written to a segment.\n * @param {any} root Root directory handle\n * @param {string} seg Segment name\n * @param {string} filepath File path\n * @param {string} sha SHA hash\n * @param {number} now Current timestamp\n * @returns {Promise<void>}\n */\n private async _updateInfoForWrite(root: any, seg: 'workspace' | 'base' | 'conflict' | 'conflictBlob' | 'info', filepath: string, sha: string, now: number): Promise<void> {\n if (seg === 'conflictBlob') return\n const existing = await this._getExistingInfo(root, seg, filepath)\n\n let entry: any = { path: filepath, updatedAt: now }\n if (seg === 'workspace') entry = this._buildWorkspaceEntry(existing, filepath, sha, now)\n else if (seg === 'base') entry = this._buildBaseEntry(existing, filepath, sha, now)\n else if (seg === 'conflict') entry = this._buildConflictEntry(existing, filepath, now)\n\n // Persist info: workspace writes go to workspace/info, other segments to git-scoped info\n const targetPrefix = seg === 'workspace' ? `${VAR_WORKSPACE}/info` : this._segmentToPrefix('info')\n await this._writeToPrefix(root, targetPrefix, filepath, JSON.stringify(entry))\n }\n\n /**\n * Attempt to load existing info metadata used as basis when updating info.\n * @param {any} root Root directory handle\n * @param {string} seg Segment name\n * @param {string} filepath File path\n * @returns {Promise<any>} parsed existing info object or empty object\n */\n private async _getExistingInfo(root: any, seg: 'workspace' | 'base' | 'conflict' | 'conflictBlob' | 'info', filepath: string): Promise<any> {\n try {\n if (seg === 'workspace') {\n const gitBase = await this.readFromPrefix(root, this._segmentToPrefix('base'), filepath).catch(() => null)\n if (gitBase !== null) {\n const existingTxt = await this.readFromPrefix(root, this._segmentToPrefix('info'), filepath).catch(() => null)\n return existingTxt ? JSON.parse(existingTxt) : {}\n }\n const existingTxt = await this.readFromPrefix(root, `${VAR_WORKSPACE}/info`, filepath).catch(() => null)\n return existingTxt ? JSON.parse(existingTxt) : {}\n }\n const existingTxt = await this.readFromPrefix(root, this._segmentToPrefix('info'), filepath).catch(() => null)\n return existingTxt ? JSON.parse(existingTxt) : {}\n } catch {\n return {}\n }\n }\n\n /**\n * Build info entry for workspace writes.\n * @param {any} existing Existing info entry\n * @param {string} filepath File path\n * @param {string} sha SHA hash\n * @param {number} now Current timestamp\n * @returns {any}\n */\n private _buildWorkspaceEntry(existing: any, filepath: string, sha: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.baseSha) entry.baseSha = existing.baseSha\n entry.workspaceSha = sha\n entry.state = entry.baseSha ? 'modified' : 'added'\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n return entry\n }\n\n /**\n * Build info entry for base writes.\n * @param {any} existing Existing info entry\n * @param {string} filepath File path\n * @param {string} sha SHA hash\n * @param {number} now Current timestamp\n * @returns {any}\n */\n private _buildBaseEntry(existing: any, filepath: string, sha: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.workspaceSha) entry.workspaceSha = existing.workspaceSha\n entry.baseSha = sha\n entry.state = 'base'\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n return entry\n }\n\n /**\n * Build info entry for conflict writes.\n * @param {any} existing Existing info entry\n * @param {string} filepath File path\n * @param {number} now Current timestamp\n * @returns {any}\n */\n private _buildConflictEntry(existing: any, filepath: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.baseSha) entry.baseSha = existing.baseSha\n if (existing && existing.workspaceSha) entry.workspaceSha = existing.workspaceSha\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n entry.state = 'conflict'\n return entry\n }\n\n /**\n * Write content to a file under given prefix, creating directories as needed.\n * @param {any} root Root directory handle\n * @param {string} prefix Prefix path\n * @param {string} filepath File path\n * @param {string} content File content\n * @returns {Promise<void>}\n */\n private async _writeToPrefix(root: any, prefix: string, filepath: string, content: string): Promise<void> {\n const fullPath = this.rootDir ? `${this.rootDir}/${prefix}/${filepath}` : `${prefix}/${filepath}`\n const parts = fullPath.split('/').filter(Boolean)\n const directoryParts = parts.slice(0, parts.length - 1)\n const parent = await this.ensureDir(root, directoryParts)\n const fh = await parent.getFileHandle(parts[parts.length - 1], { create: true })\n const writable = await fh.createWritable()\n await writable.write(content)\n await writable.close()\n }\n\n /**\n * Read text from a file handle returning null on failure.\n * @param {any} fh File handle\n * @returns {Promise<string|null>} file text or null\n */\n private async _readFileFromHandle(fh: any): Promise<string | null> {\n try {\n const file = await fh.getFile()\n const txt = await file.text()\n return txt ?? null\n } catch {\n return null\n }\n }\n\n /**\n * blob \u3092\u8AAD\u307F\u51FA\u3059\n * @param {string} filepath File path\n * @param {any} [segment] Storage segment\n * @returns {Promise<string|null>} \u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\u3001\u5B58\u5728\u3057\u306A\u3051\u308C\u3070 null\n */\n async readBlob(filepath: string, segment?: any): Promise<string | null> {\n const root = await this.getOpfsRoot()\n if (!root) return null\n return await this._readBlobFromRoot(root, segment, filepath)\n }\n\n /**\n * Read blob from a resolved root. Extracted to reduce cognitive complexity of public entry.\n * @param {any} root Root directory handle\n * @param {string} segment Segment name\n * @param {string} filepath File path\n * @returns {Promise<string|null>}\n */\n private async _readBlobFromRoot(root: any, segment: 'workspace' | 'base' | 'conflict' | 'conflictBlob' | 'info' | undefined, filepath: string): Promise<string | null> {\n // segment\u6307\u5B9A\u304C\u3042\u308B\u5834\u5408\u306F\u305D\u306E\u307E\u307E\u8FD4\u5374\n if (segment !== undefined) {\n return await this._readFromSegment(root, segment, filepath)\n }\n\n // segment\u672A\u6307\u5B9A\u306E\u5834\u5408\u306Fworkspace\u2192base\u306E\u9806\u3067\u53C2\u7167\n const workspaceContent = await this._readFromSegment(root, 'workspace', filepath)\n if (workspaceContent !== null) return workspaceContent\n return await this._readFromSegment(root, 'base', filepath)\n }\n\n /**\n * Read from a specific segment prefix.\n * @param {any} root Root directory handle\n * @param {string} segment Segment name\n * @param {string} filepath File path\n * @returns {Promise<string|null>} file text or null\n */\n private async _readFromSegment(root: any, segment: 'workspace' | 'base' | 'conflict' | 'conflictBlob' | 'info' | 'info-git' | 'info-workspace', filepath: string): Promise<string | null> {\n try {\n if (segment === 'info') {\n // prefer workspace-local info first, then git-scoped info\n const ws = await this.readFromPrefix(root, `${VAR_WORKSPACE}/info`, filepath).catch(() => null)\n if (ws !== null) return ws\n return await this.readFromPrefix(root, this._segmentToPrefix('info'), filepath).catch(() => null)\n }\n // read git-only info\n if (segment === 'info-git') {\n return await this.readFromPrefix(root, this._segmentToPrefix('info'), filepath).catch(() => null)\n }\n // read workspace-only info\n if (segment === 'info-workspace') {\n return await this.readFromPrefix(root, `${VAR_WORKSPACE}/info`, filepath).catch(() => null)\n }\n const prefix = this._segmentToPrefix(segment)\n return await this.readFromPrefix(root, prefix, filepath)\n } catch {\n return null\n }\n }\n\n /**\n * Read by trying each variant in order and returning first match.\n * @param {any} root Root directory handle\n * @param {string} filepath File path\n * @returns {Promise<string|null>} file text or null\n */\n private async _readFromVariants(root: any, filepath: string): Promise<string | null> {\n for (const v of this.getVariants()) {\n const prefix = v === VAR_WORKSPACE ? this._segmentToPrefix('workspace') : this._segmentToPrefix(v as any)\n const txt = await this.readFromPrefix(root, prefix, filepath)\n if (txt !== null) return txt\n }\n return null\n }\n\n /**\n * blob \u3092\u524A\u9664\u3059\u308B\n * @param {string} filepath File path\n * @param {any} [segment] Storage segment\n * @returns {Promise<void>} \u524A\u9664\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async deleteBlob(filepath: string, segment?: any): Promise<void> {\n const root = await this.getOpfsRoot()\n if (!root) return\n if (segment === 'workspace') {\n // remove workspace blob and corresponding workspace/info entry\n await this.removeAtPrefix(root, this._segmentToPrefix('workspace'), filepath)\n await this.removeAtPrefix(root, `${VAR_WORKSPACE}/info`, filepath)\n return\n }\n if (segment === 'base') { await this.removeAtPrefix(root, this._segmentToPrefix('base'), filepath); return }\n if (segment === 'conflict') { await this.removeAtPrefix(root, this._segmentToPrefix('conflict'), filepath); return }\n if (segment === 'conflictBlob') { await this.removeAtPrefix(root, this._segmentToPrefix('conflictBlob'), filepath); return }\n if (segment === 'info') {\n // delete workspace-local info and git-scoped info for this branch\n await this.removeAtPrefix(root, `${VAR_WORKSPACE}/info`, filepath)\n await this.removeAtPrefix(root, this._segmentToPrefix('info'), filepath)\n return\n }\n\n for (const v of this.getVariants()) {\n const prefix = v === VAR_WORKSPACE ? this._segmentToPrefix('workspace') : this._segmentToPrefix(v as any)\n await this.removeAtPrefix(root, prefix, filepath)\n }\n // also remove any info entries (workspace-local and git-scoped)\n await this.removeAtPrefix(root, `${VAR_WORKSPACE}/info`, filepath)\n await this.removeAtPrefix(root, this._segmentToPrefix('info'), filepath)\n }\n\n /**\n * Remove a file at a given prefix (does not create directories)\n * @param {any} root root directory handle\n * @param {string} prefix prefix dir\n * @param {string} filepath path relative to prefix\n * @returns {Promise<void>} resolves when removal attempted (errors are ignored)\n */\n private async removeAtPrefix(root: any, prefix: string, filepath: string): Promise<void> {\n const full = this.rootDir ? `${this.rootDir}/${prefix}/${filepath}` : `${prefix}/${filepath}`\n const parts = full.split('/').filter(Boolean)\n let directory: any\n // \u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304C\u5B58\u5728\u3057\u306A\u3044\u5834\u5408\uFF08NotFound\uFF09\u306F\u524A\u9664\u5BFE\u8C61\u306A\u3057\u3068\u3057\u3066\u7D42\u4E86\n try {\n directory = await this.traverseDir(root, parts.slice(0, parts.length - 1))\n } catch {\n return\n }\n const name = parts[parts.length - 1]\n if (typeof directory.removeEntry === 'function') {\n try {\n await directory.removeEntry(name)\n } catch {\n // removeEntry\u304C\u5931\u6557\u3057\u3066\u3082\u7121\u8996\uFF08\u5B58\u5728\u3057\u306A\u3044\u7B49\uFF09\n }\n return\n }\n if (typeof directory.getFileHandle === 'function') {\n await this.tryRemoveFileHandle(directory, name)\n\n }\n }\n\n /**\n * Read a file under a prefix without throwing. Returns null when not found.\n * @param {any} root root directory handle\n * @param {string} prefix prefix dir\n * @param {string} filepath path relative to prefix\n * @returns {Promise<string|null>} file contents or null when not found\n */\n private async readFromPrefix(root: any, prefix: string, filepath: string): Promise<string | null> {\n // reuse existing traversal logic but guard errors\n try {\n const fullPath = this.rootDir ? `${this.rootDir}/${prefix}/${filepath}` : `${prefix}/${filepath}`\n const parts = fullPath.split('/').filter(Boolean)\n const directory = await this.traverseDir(root, parts.slice(0, parts.length - 1))\n const fh = await directory.getFileHandle(parts[parts.length - 1])\n return await this._readFileFromHandle(fh)\n } catch {\n return null\n }\n }\n\n /**\n * Traverse into nested directories without creating them.\n * @param {any} root The starting directory handle\n * @param {string[]} parts Path parts to traverse\n * @returns {Promise<any>} The final directory handle\n */\n private async traverseDir(root: any, parts: string[]): Promise<any> {\n let directory = root\n for (const part of parts) {\n if (directory && typeof directory.getDirectoryHandle === 'function') {\n directory = await directory.getDirectoryHandle(part)\n } else if (directory && typeof directory.getDirectory === 'function') {\n directory = await directory.getDirectory(part)\n } else {\n throw new Error(ERR_OPFS_DIR_API)\n }\n }\n return directory\n }\n\n /**\n * List all file paths under given prefix (relative paths).\n * @param {any} root Root directory handle\n * @param {string} prefix Prefix path\n * @returns {Promise<string[]>} Array of relative file paths; empty array on failure\n */\n private async listFilesAtPrefix(root: any, prefix: string): Promise<string[]> {\n try {\n const prefixParts = prefix ? prefix.split('/').filter(Boolean) : []\n const parts = this.rootDir ? this.rootDir.split('/').filter(Boolean).concat(prefixParts) : prefixParts\n const directory = await this.traverseDir(root, parts)\n const results: string[] = []\n await this._recurseListDir(directory, '', results)\n return results\n } catch {\n return []\n }\n }\n\n /**\n * Helper to recursively walk directory handles and collect file paths.\n * @param {any} d Directory handle\n * @param {string} base Base path\n * @param {string[]} results Results array\n * @returns {Promise<void>}\n */\n private async _recurseListDir(d: any, base: string, results: string[]): Promise<void> {\n // Prefer entries() async iterator; if unavailable, delegate to fallback.\n try {\n for await (const pair of (d as any).entries()) {\n await this._processEntryPair(pair, base, results)\n }\n return\n } catch {\n return\n }\n }\n\n /**\n * Process a single entry returned by entries(): push files or recurse into directories.\n * @param {any} pair Entry pair from iterator\n * @param {string} base Base path\n * @param {string[]} results Results array\n * @returns {Promise<void>}\n */\n private async _processEntryPair(pair: any, base: string, results: string[]): Promise<void> {\n const name = Array.isArray(pair) ? pair[0] : (pair.name || '')\n const handle = Array.isArray(pair) ? pair[1] : (pair[1] || pair)\n const childPath = base ? `${base}/${name}` : name\n if ((handle as any).kind === 'file' || typeof (handle as any).getFile === 'function') {\n results.push(childPath)\n } else {\n await this._recurseListDir(handle, childPath, results)\n }\n }\n\n /**\n * Fallback recursion over directory when entries() iterator unavailable.\n * @param {any} d Directory handle\n * @param {string} base Base path\n * @param {string[]} results Results array\n * @returns {Promise<void>}\n */\n private async _recurseListDirFallback(d: any, base: string, results: string[]): Promise<void> {\n for await (const name of (d as any).keys()) {\n await this._handleChildEntry(d, name, base, results)\n }\n }\n \n /**\n * Handle a single child entry from directory listing.\n * @param {any} d Directory handle\n * @param {string} name Entry name\n * @param {string} base Base path\n * @param {string[]} results Results array\n * @returns {Promise<void>}\n */\n private async _handleChildEntry(d: any, name: string, base: string, results: string[]): Promise<void> {\n const childPath = base ? `${base}/${name}` : name\n if (typeof d.getFileHandle === 'function') {\n try {\n const fh = await d.getFileHandle(name)\n if (fh) { results.push(childPath); return }\n } catch {\n return\n }\n }\n if (typeof d.getDirectoryHandle === 'function') {\n try {\n const childDirectory = await d.getDirectoryHandle(name)\n await this._recurseListDir(childDirectory, childPath, results)\n } catch {\n return\n }\n }\n }\n\n /**\n * Safely list files at prefix, returning an empty array on error.\n * @param {any} root Root directory handle\n * @param {string} segPrefix Segment prefix\n * @returns {Promise<string[]>}\n */\n private async _safeListFilesAtPrefix(root: any, segPrefix: string): Promise<string[]> {\n return this.listFilesAtPrefix(root, segPrefix).catch(() => [])\n }\n\n /**\n * Collect info objects for given keys under VAR_INFO\n * @param {any} root Root directory handle\n * @param {string[]} keys Array of keys\n * @returns {Promise<Array<{ path: string; info: string | null }>>}\n */\n private async _collectInfoForKeys(root: any, keys: string[]): Promise<Array<{ path: string; info: string | null }>> {\n const out: Array<{ path: string; info: string | null }> = []\n const infoPrefix = this._segmentToPrefix('info') // existing line\n const wsInfoPrefix = `${VAR_WORKSPACE}/info` // new line\n for (const k of keys) {\n let info: string | null = await this.readFromPrefix(root, wsInfoPrefix, k).catch(() => null)\n if (info === null) info = await this.readFromPrefix(root, infoPrefix, k).catch(() => null)\n out.push({ path: k, info }) // existing line\n }\n return out\n }\n\n /**\n * \u6307\u5B9A\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u914D\u4E0B\u306E\u30D5\u30A1\u30A4\u30EB\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param {string} [prefix] \u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\uFF08\u4F8B: 'dir/sub'\uFF09\u3002\u7701\u7565\u6642\u306F\u30EB\u30FC\u30C8\n * @param {any} [segment] \u30BB\u30B0\u30E1\u30F3\u30C8\uFF08'workspace' \u7B49\uFF09\u3002\u7701\u7565\u6642\u306F 'workspace'\n * @param {boolean} [recursive] \u30B5\u30D6\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3082\u542B\u3081\u308B\u304B\u3002\u7701\u7565\u6642\u306F true\n * @returns {Promise<Array<{ path: string; info: string | null }>>}\n */\n async listFiles(prefix?: string, segment?: any, recursive = true): Promise<Array<{ path: string; info: string | null }>> {\n const root = await this.getOpfsRoot()\n if (!root) return []\n const seg: 'workspace' | 'base' | 'conflict' | 'info' = segment ?? 'workspace'\n const segPrefix = this._segmentToPrefix(seg)\n\n // Return a plain array of relative file path strings; tests for OpfsStorage expect strings\n const keys = await this._safeListFilesAtPrefix(root, segPrefix)\n const p = prefix ? prefix.replace(/^\\/+|\\/+$/g, '') : ''\n const filtered = this._filterKeys(keys, p, recursive)\n // Return array of objects { path, info } as required by StorageBackend interface\n return await this._collectInfoForKeys(root, filtered)\n }\n\n /**\n * Raw listing that returns implementation-specific URIs and a normalized path.\n * @param {string} [prefix] optional prefix to filter\n * @param {boolean} [recursive] whether to include subdirectories\n * @returns {Promise<Array<{uri:string,path:string,info?:string|null}>>} array of entries with uri/path/info\n */\n async listFilesRaw(prefix?: string, recursive = true): Promise<Array<{ uri: string; path: string; info?: string | null }>> {\n const navRoot = await OpfsStorage._getNavigatorStorageRoot()\n if (!navRoot) return []\n\n const storageDirectory = await this._findStorageDirectory(navRoot)\n if (!storageDirectory) return []\n\n const results: string[] = []\n await this._recurseListDir(storageDirectory, '', results)\n\n const p = prefix ? prefix.replace(/^\\/+|\\/+$/g, '') : ''\n const keys = this._filterKeys(results, p, recursive)\n\n const out: Array<{ uri: string; path: string; info?: string | null }> = []\n for (const k of keys) {\n const uri = `${this.rootDir}/${k}`\n const info = await this._getInfoForOpfsKey(navRoot, k)\n out.push({ uri, path: uri, info })\n }\n return out\n }\n\n /**\n * Locate the configured storage root directory handle under navigator.storage root.\n * @param {any} navRoot Navigator storage root\n * @returns {Promise<any|null>} directory handle or null when not found\n */\n private async _findStorageDirectory(navRoot: any): Promise<any | null> {\n try {\n const parts = this.rootDir.split('/').filter(Boolean)\n const directoryHandle = await this.traverseDir(navRoot, parts)\n return directoryHandle\n } catch {\n return null\n }\n }\n\n /**\n * Read info metadata for a given key from workspace-local info or git-scoped info.\n * @param {any} navRoot Navigator storage root\n * @param {string} key Key to lookup\n * @returns {Promise<string|null>} JSON string or null when absent\n */\n private async _getInfoForOpfsKey(navRoot: any, key: string): Promise<string | null> {\n try {\n const ws = await this.readFromPrefix(navRoot, `${VAR_WORKSPACE}/info`, key).catch(() => null)\n if (ws !== null) return ws\n return await this.readFromPrefix(navRoot, this._segmentToPrefix('info'), key).catch(() => null)\n } catch {\n return null\n }\n }\n\n /**\n * Filter keys by prefix and recursion flag for OPFS listing\n * @param {string[]} keys Array of keys\n * @param {string} p Path prefix\n * @param {boolean} recursive Whether to include subdirectories\n * @returns {string[]}\n */\n private _filterKeys(keys: string[], p: string, recursive: boolean): string[] {\n let out = keys\n if (p) out = out.filter((k) => k === p || k.startsWith(p + '/'))\n if (!recursive) {\n out = out.filter((k) => {\n const rest = p ? k.slice(p.length + 1) : k\n return !rest.includes('/')\n })\n }\n return out\n }\n\n /**\n * Try to remove a file via its file handle.\n * @param {any} directory Directory handle\n * @param {string} name File name\n * @returns {Promise<boolean>} true when removed, false otherwise\n */\n private async tryRemoveFileHandle(directory: any, name: string): Promise<boolean> {\n try {\n const fh = await directory.getFileHandle(name)\n if (fh && typeof (fh as any).remove === 'function') {\n await (fh as any).remove()\n return true\n }\n return false\n } catch {\n // getFileHandle/remove \u304C\u4F8B\u5916\u3092\u6295\u3052\u305F\u5834\u5408\u306F\u524A\u9664\u3067\u304D\u306A\u304B\u3063\u305F\u3068\u6271\u3046\n return false\n }\n }\n\n /**\n * \u6307\u5B9A\u3055\u308C\u305F\u30EB\u30FC\u30C8\u540D\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u524A\u9664\u3057\u307E\u3059\n * @param {string} rootName \u524A\u9664\u3059\u308B\u30EB\u30FC\u30C8\u540D\n * @returns {Promise<void>}\n */\n static async delete(rootName: string): Promise<void> {\n try {\n const root = await OpfsStorage._getNavigatorStorageRoot()\n if (!root) throw new Error('OPFS root not available')\n\n if (typeof (root as any).removeEntry === 'function') {\n await (root as any).removeEntry(rootName, { recursive: true })\n } else {\n throw new Error('removeEntry not supported')\n }\n } catch (error) {\n throw new Error(`Failed to delete OPFS root \"${rootName}\": ${String(error)}`)\n }\n }\n}\n\nexport default OpfsStorage\n\n", "// Shared abstractions and helpers for Git adapters\nexport type FetchWithRetryFunction = (_input: RequestInfo, _init: RequestInit, _attempts?: number, _baseDelay?: number) => Promise<Response>\n\nconst RETRY_AFTER_HEADER = 'Retry-After'\nconst RETRY_AFTER_HEADER_LOWER = 'retry-after'\n\n/**\n * Simple logger interface for dependency injection.\n * If a caller injects an object matching this interface, the adapter\n * will forward debug/info/warn/error messages to it. If no logger is\n * provided, no logging will be performed by the adapter.\n */\nexport interface Logger {\n debug: (..._messages: any[]) => void\n info: (..._messages: any[]) => void\n warn: (..._messages: any[]) => void\n error: (..._messages: any[]) => void\n}\n\n/**\n * Compute SHA-1 of string content using Web Crypto\n * @param content The input string\n * @returns Promise resolving to hex-encoded SHA-1\n */\nexport async function shaOf(content: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(content)\n const buf = await crypto.subtle.digest('SHA-1', data)\n return Array.from(new Uint8Array(buf)).map((b) => b.toString(16).padStart(2, '0')).join('')\n}\n\n/**\n * Determine whether an HTTP status should be considered retryable\n * @param status HTTP status code\n * @returns true if retryable (5xx or 429)\n */\nexport function classifyStatus(status: number): boolean {\n return status >= 500 || status === 429\n}\n\n/**\n * Calculate delay before retrying based on response or exponential backoff\n * @param response Response or null when not available\n * @param index Attempt index (0-based)\n * @param baseDelay Base delay in ms\n * @returns delay in milliseconds\n */\nexport function getDelayForResponse(response: Response | null, index: number, baseDelay: number): number {\n if (!response) return baseDelay * Math.pow(2, index) + Math.random() * 100\n try {\n const hdrs: any = (response as any).headers\n let retryAfter\n if (hdrs && typeof hdrs.get === 'function') {\n retryAfter = hdrs.get(RETRY_AFTER_HEADER) || hdrs.get(RETRY_AFTER_HEADER_LOWER)\n } else if (hdrs && typeof hdrs[RETRY_AFTER_HEADER] !== 'undefined') {\n retryAfter = hdrs[RETRY_AFTER_HEADER] || hdrs[RETRY_AFTER_HEADER_LOWER]\n }\n return retryAfter ? Number(retryAfter) * 1000 : baseDelay * Math.pow(2, index) + Math.random() * 100\n } catch (error) {\n return baseDelay * Math.pow(2, index) + Math.random() * 100\n }\n}\n\n/**\n * Process HTTP response and throw on non-ok. If retryable, delay before throwing.\n * @param response Fetch Response\n * @param index Attempt index\n * @param baseDelay Base delay in ms\n * @returns Promise resolving to the response when ok\n */\nexport async function processResponseWithDelay(response: Response, index: number, baseDelay: number): Promise<Response> {\n if (response.ok) return response\n if (classifyStatus(response.status)) {\n await new Promise((r) => setTimeout(r, getDelayForResponse(response, index, baseDelay)))\n throw new RetryableError(`Retryable HTTP ${response.status}`)\n }\n const txt = await response.text().catch(() => '')\n throw new NonRetryableError(`HTTP ${response.status}: ${txt}`)\n}\n\n/**\n * Perform fetch with retry/backoff logic\n * @param input RequestInfo\n * @param init RequestInit\n * @param attempts number of attempts\n * @param baseDelay base delay in ms\n * @returns Promise resolving to Response\n */\nexport async function fetchWithRetry(input: RequestInfo, init: RequestInit, attempts = 4, baseDelay = 300): Promise<Response> {\n let lastError: any\n\n /** @param {number} attemptIndex attempt index */\n async function applyDelayForAttempt(attemptIndex: number) {\n await new Promise((r) => setTimeout(r, getDelayForResponse(null, attemptIndex, baseDelay)))\n }\n\n /** @param {any} error caught error */\n function rethrowIfNonRetryable(error: any): void {\n if (error instanceof NonRetryableError) throw error\n }\n\n /** @param {any} error last error */\n function handleExhausted(error: any): never {\n if (error instanceof NonRetryableError) throw error\n // If it's already the exhaustion sentinel, rethrow as-is\n if (error instanceof RetryExhaustedError) throw error\n // Wrap any other Error (or value) into a RetryExhaustedError so callers\n // relying on instanceof RetryExhaustedError detectability will work.\n if (error instanceof Error) throw new RetryExhaustedError(error.message, error)\n throw new RetryExhaustedError(String(error))\n }\n\n for (let attemptIndex = 0; attemptIndex < attempts; attemptIndex++) {\n try {\n const response = await fetch(input, init)\n return await processResponseWithDelay(response, attemptIndex, baseDelay)\n } catch (error) {\n lastError = error\n rethrowIfNonRetryable(error)\n await applyDelayForAttempt(attemptIndex)\n }\n }\n\n return handleExhausted(lastError)\n}\n\n/**\n * Error indicating the operation is retryable and may succeed on later attempts.\n */\nexport class RetryableError extends Error { }\n\n/**\n * Error indicating the operation failed in a non-retryable way.\n */\nexport class NonRetryableError extends Error { }\n\n/**\n * Error indicating that retry attempts were exhausted and no further retries will be made.\n */\nexport class RetryExhaustedError extends RetryableError {\n public code = 'RETRY_EXHAUSTED'\n public cause?: any\n /**\n * @param {string} message error message\n * @param {any} [cause] original cause\n */\n constructor(message: string, cause?: any) {\n super(message)\n this.name = 'RetryExhaustedError'\n this.cause = cause\n }\n}\n\n/**\n * Map items with limited concurrency\n * @template T,R\n * @param items Array of items to map\n * @param mapper Async mapper function\n * @param concurrency concurrency limit\n * @returns Promise resolving to array of mapped results\n */\nexport type MapWithConcurrencyOptions = { controller?: AbortController }\n\n/**\n * Process a single item from the items array.\n * @template T,R\n * @param {T[]} items source items\n * @param {Function} mapper async mapper\n * @param {R[]} results results array\n * @param {number} index_ item index\n * @param {AbortController} [controller] optional abort controller\n * @returns {Promise<void>}\n */\nexport async function processOne<T, R>(items: T[], mapper: (_t: T) => Promise<R>, results: R[], index_: number, controller?: AbortController): Promise<void> {\n try {\n const r = await mapper(items[index_])\n results[index_] = r\n } catch (error) {\n if (error && (error as any).code === 'RETRY_EXHAUSTED' && controller && !controller.signal.aborted) controller.abort()\n throw error\n }\n}\n\n/**\n * Worker that processes items sequentially from a shared index.\n * @template T,R\n * @param {T[]} items source items\n * @param {Function} mapper async mapper\n * @param {R[]} results results array\n * @param {{value:number}} indexReference shared index reference\n * @param {number} indexReference.value current index value\n * @param {AbortController} [controller] optional abort controller\n * @returns {Promise<void>}\n */\nexport async function queueRunWorker<T, R>(items: T[], mapper: (_t: T) => Promise<R>, results: R[], indexReference: { value: number }, controller?: AbortController): Promise<void> {\n while (true) {\n if (controller && controller.signal.aborted) return\n const current = indexReference.value++\n if (current >= items.length) return\n await processOne(items, mapper, results, current, controller)\n }\n}\n\n/**\n * Map items with limited concurrency.\n * @template T,R\n * @param {T[]} items items to map\n * @param {Function} mapper async mapper function\n * @param {number} concurrency concurrency limit\n * @param {MapWithConcurrencyOptions} [options] options with optional controller\n * @returns {Promise<R[]>} mapped results\n */\nexport function mapWithConcurrency<T, R>(items: T[], mapper: (_t: T) => Promise<R>, concurrency = 5, options?: MapWithConcurrencyOptions): Promise<R[]> {\n const results: R[] = []\n if (!items || items.length === 0) return Promise.resolve(results)\n const controller = options && options.controller ? options.controller : undefined\n const indexReference = { value: 0 }\n const workerCount = Math.min(concurrency, items.length)\n const workers = Array.from({ length: workerCount }, () => queueRunWorker(items, mapper, results, indexReference, controller))\n return Promise.all(workers).then(() => results)\n}\n\n/**\n * Abstract base class providing shared utilities for Git adapters\n */\nexport abstract class AbstractGitAdapter {\n protected baseUrl = ''\n protected headers: Record<string, string> = {}\n protected options: any = {}\n protected logger?: Logger\n protected maxRetries = 4\n protected baseBackoff = 300\n\n /**\n * Construct base adapter\n * @param options adapter options\n */\n constructor(options?: any) {\n this.options = options || {}\n // Allow optional logger injection via options.logger\n if (options && options.logger) this.logger = options.logger as Logger\n }\n\n /**\n * Delegate to shared shaOf implementation\n * @param content input string\n * @returns hex sha1\n */\n protected async shaOf(content: string): Promise<string> {\n return shaOf(content)\n }\n\n /**\n * Replace or set the logger at runtime.\n * Use this if DI happens after construction.\n * @param logger optional logger instance to set (or undefined to clear)\n * @returns void\n */\n public setLogger(logger: Logger | undefined) {\n this.logger = logger\n }\n\n /**\n * Log debug messages when a logger is present.\n * @param _messages messages to log (unused when no logger)\n */\n protected logDebug(..._messages: any[]) {\n if (this.logger && typeof this.logger.debug === 'function') {\n try {\n this.logger.debug(..._messages)\n } catch {\n // Logging errors must not affect adapter behavior; ignore safely\n }\n }\n }\n\n /**\n * Log an informational message if a logger is present.\n * @param _messages items to log\n */\n protected logInfo(..._messages: any[]) {\n if (this.logger && typeof this.logger.info === 'function') {\n try {\n this.logger.info(..._messages)\n } catch {\n // ignore logging failures\n }\n }\n }\n\n /**\n * Log a warning message if a logger is present.\n * @param _messages items to log\n */\n protected logWarn(..._messages: any[]) {\n if (this.logger && typeof this.logger.warn === 'function') {\n try {\n this.logger.warn(..._messages)\n } catch {\n // ignore logging failures\n }\n }\n }\n\n /**\n * Log an error message if a logger is present.\n * @param _messages items to log\n */\n protected logError(..._messages: any[]) {\n if (this.logger && typeof this.logger.error === 'function') {\n try {\n this.logger.error(..._messages)\n } catch {\n // ignore logging failures\n }\n }\n }\n\n /**\n * Normalize different header-like shapes into a plain object.\n * @param headerLike headers in Headers, array, or plain object form\n * @returns plain header map\n */\n private normalizeHeaders(headerLike: any): Record<string, any> {\n const out: Record<string, any> = {}\n try {\n if (!headerLike) return out\n if (typeof (headerLike as any).forEach === 'function') {\n (headerLike as any).forEach((v: any, k: any) => { out[k] = v })\n return out\n }\n if (Array.isArray(headerLike)) {\n for (const [k, v] of headerLike as any) out[k] = v\n return out\n }\n if (typeof headerLike === 'object') {\n Object.assign(out, headerLike)\n }\n } catch (error) {\n new Error('Failed to normalize headers: ' + String(error))\n }\n return out\n }\n\n /**\n * Format a fetch request into a minimal object suitable for logging.\n * @param input fetch input (URL or Request)\n * @param init fetch initialization options\n * @param attempts retry attempts count\n * @param baseDelay base delay in milliseconds\n * @returns formatted request log object\n */\n private formatRequestForLog(input: RequestInfo, init: RequestInit | undefined, attempts: number, baseDelay: number) {\n const requestUrl = typeof input === 'string' ? input : (input as any)?.url || String(input)\n const requestMethod = (init && (init as any).method) || 'GET'\n const requestHeaders = this.normalizeHeaders((init && (init as any).headers) || {})\n const bodyPreview = init && (init as any).body ? (typeof (init as any).body === 'string' ? (init as any).body.slice(0, 200) : '<non-string>') : undefined\n return { url: requestUrl, method: requestMethod, headers: requestHeaders, bodyPreview, attempts, baseDelay }\n }\n\n /**\n * Format a fetch Response into a minimal object suitable for logging.\n * @param response HTTP response object\n * @returns formatted response log object\n */\n private async formatResponseForLog(response: Response) {\n const respHdrs = this.normalizeHeaders(response && (response as any).headers)\n let bodyPreview: string | undefined = undefined\n try {\n if (response && typeof (response as any).clone === 'function') {\n const clone = (response as any).clone()\n if (clone && typeof clone.text === 'function') {\n const txt = await clone.text().catch(() => undefined)\n if (typeof txt === 'string') bodyPreview = txt.slice(0, 500)\n }\n }\n } catch (error) {\n new Error('Failed to format response for log: ' + String(error))\n }\n return { status: response.status, statusText: response.statusText, headers: respHdrs, bodyPreview }\n }\n\n /**\n * Proxy to shared `fetchWithRetry` implementation while emitting\n * minimal request/response logs for debugging and test inspection.\n * @param input fetch input\n * @param init fetch init\n * @param attempts retry attempts\n * @param baseDelay base delay ms\n * @returns Promise resolving to Response\n */\n protected async fetchWithRetry(input: RequestInfo, init: RequestInit, attempts = 4, baseDelay = 300) {\n try {\n const requestLog = this.formatRequestForLog(input, init, attempts, baseDelay)\n this.logDebug({ fetchRequest: requestLog })\n } catch (error) {\n new Error('Failed to format request for log: ' + String(error))\n }\n\n try {\n const response = await fetchWithRetry(input, init, attempts, baseDelay)\n try {\n const responseLog = await this.formatResponseForLog(response)\n this.logDebug({ fetchResponse: responseLog })\n } catch (error) {\n new Error('Failed to format response for log: ' + String(error))\n }\n return response\n } catch (fetchError) {\n try {\n this.logDebug({ fetchError: String(fetchError) })\n } catch (error) {\n new Error('Failed to format fetch error for log: ' + String(error))\n }\n throw fetchError\n }\n }\n\n /**\n * Determine if a status code is retryable\n * @param status HTTP status code\n * @returns boolean\n */\n protected isRetryableStatus(status: number) {\n return classifyStatus(status)\n }\n\n /**\n * Compute backoff milliseconds for attempt\n * @param attempt attempt number (1..)\n * @returns milliseconds to wait\n */\n protected backoffMs(attempt: number) {\n const base = this.baseBackoff * Math.pow(2, attempt - 1)\n const jitter = Math.floor(Math.random() * base * 0.3)\n return base + jitter\n }\n\n /**\n * Map items with limited concurrency by delegating to the shared helper.\n * @template T,R\n * @param items items to map\n * @param mapper async mapper\n * @param concurrency concurrency limit\n * @param [options] options with optional controller\n * @returns Promise resolving to mapped results\n */\n protected mapWithConcurrency<T, R>(items: T[], mapper: (_t: T) => Promise<R>, concurrency = 5, options?: MapWithConcurrencyOptions) {\n return mapWithConcurrency(items, mapper, concurrency, options)\n }\n}\n\nexport default AbstractGitAdapter\n", "import { GitAdapter } from './adapter.ts'\nimport AbstractGitAdapter, { fetchWithRetry, classifyStatus, getDelayForResponse, processResponseWithDelay, mapWithConcurrency, shaOf, NonRetryableError } from './abstractAdapter.ts'\n\nexport type GHOptions = {\n owner: string\n repo: string\n token: string\n host?: string // optional GitHub Enterprise host\n}\n\n\n/**\n * GitHub \u5411\u3051\u306E `GitAdapter` \u5B9F\u88C5\u3002\n * GitHub API \u3092\u30E9\u30C3\u30D7\u3057\u3066\u30EA\u30DD\u30B8\u30C8\u30EA\u64CD\u4F5C\uFF08\u30B3\u30DF\u30C3\u30C8\u4F5C\u6210\u3001\u30D6\u30E9\u30F3\u30C1\u4E00\u89A7\u3001\u30D5\u30A1\u30A4\u30EB\u53D6\u5F97\u7B49\uFF09\u3092\u63D0\u4F9B\u3057\u307E\u3059\u3002\n */\nexport class GitHubAdapter extends AbstractGitAdapter implements GitAdapter {\n private _fetchWithRetry: (_: RequestInfo, __: RequestInit, ___?: number, ____?: number) => Promise<Response>\n private repoMetadata: import('../virtualfs/types.ts').RepositoryMetadata | null = null\n // simple in-memory blob cache: contentSha -> blobSha\n private blobCache: Map<string, string> = new Map()\n\n /**\n * GitHubAdapter \u3092\u521D\u671F\u5316\u3057\u307E\u3059\u3002\n * @param {GHOptions} options \u8A2D\u5B9A\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n constructor(options: GHOptions) {\n super(options)\n const host = options.host || 'https://api.github.com'\n this.baseUrl = `${host}/repos/${options.owner}/${options.repo}`\n // Only include Authorization header when a token is provided\n this.headers = {\n Accept: 'application/vnd.github+json',\n 'Content-Type': 'application/json',\n }\n const rawToken = options && typeof options.token === 'string' ? options.token.trim() : ''\n if (rawToken) {\n (this.headers as any).Authorization = `token ${rawToken}`\n }\n this._fetchWithRetry = fetchWithRetry\n }\n\n /**\n * List commits for a ref (GitHub commits API)\n * @param {Object} query query parameters\n * @param {string} query.ref reference name (branch/tag/SHA)\n * @param {number} [query.perPage] items per page\n * @param {number} [query.page] page number\n * @returns {Promise<import('./adapter').CommitHistoryPage>} \u30DA\u30FC\u30B8\u60C5\u5831\u3092\u8FD4\u3057\u307E\u3059\n */\n async listCommits(query: { ref: string; perPage?: number; page?: number }) {\n const reference = query.ref || 'main'\n const perPage = query.perPage || 30\n const page = query.page || 1\n const url = `${this.baseUrl}/commits?sha=${encodeURIComponent(reference)}&per_page=${encodeURIComponent(String(perPage))}&page=${encodeURIComponent(String(page))}`\n const resp = await this._fetchWithRetry(url, { method: 'GET', headers: this.headers })\n const text = await resp.text().catch(() => '[]')\n const parsed = this._parseJsonArray(text)\n\n const items = (Array.isArray(parsed) ? parsed : []).map((c: any) => this._mapGithubCommitToSummary(c))\n\n const linkHdr = resp && (resp as any).headers && typeof (resp as any).headers.get === 'function' ? (resp as any).headers.get('link') : undefined\n const pages = this._parseLinkHeaderString(typeof linkHdr === 'string' ? linkHdr : undefined)\n return { items, nextPage: pages.nextPage, lastPage: pages.lastPage }\n }\n\n /**\n * \u5FDC\u7B54\u30C6\u30AD\u30B9\u30C8\u3092 JSON \u914D\u5217\u3068\u3057\u3066\u89E3\u6790\u3057\u307E\u3059\uFF08\u5931\u6557\u6642\u306F\u7A7A\u914D\u5217\u3092\u8FD4\u3059\uFF09\u3002\n * @param {string} text \u5FDC\u7B54\u30C6\u30AD\u30B9\u30C8\n * @returns {any[]}\n */\n private _parseJsonArray(text: string): any[] {\n try {\n return text ? JSON.parse(text) : []\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('parseJsonArray failed', error)\n return []\n }\n }\n\n /**\n * GitHub \u306E Link \u30D8\u30C3\u30C0\u3092\u89E3\u6790\u3057\u3066 next/last \u30DA\u30FC\u30B8\u3092\u8FD4\u3057\u307E\u3059\u3002\n * @param {string|undefined} linkHdr Link \u30D8\u30C3\u30C0\u6587\u5B57\u5217\n * @returns {{nextPage?: number, lastPage?: number}} \u30DA\u30FC\u30B8\u756A\u53F7\u60C5\u5831\n */\n private _parseLinkHeaderString(linkHdr?: string): { nextPage?: number; lastPage?: number } {\n const out: { nextPage?: number; lastPage?: number } = {}\n if (!linkHdr) return out\n try {\n const mNext = linkHdr.match(/<[^>]*[?&]page=(\\d+)[^>]*>\\s*;\\s*rel=\\\"?next\\\"?/) as RegExpMatchArray | null\n const mLast = linkHdr.match(/<[^>]*[?&]page=(\\d+)[^>]*>\\s*;\\s*rel=\\\"?last\\\"?/) as RegExpMatchArray | null\n if (mNext) out.nextPage = Number(mNext[1])\n if (mLast) out.lastPage = Number(mLast[1])\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('parseLinkHeaderString failed', error)\n }\n return out\n }\n\n /**\n * Map a raw GitHub commit object to CommitSummary shape used by the adapter.\n * @param {any} c Raw commit object\n * @returns {import('./adapter').CommitSummary}\n */\n private _mapGithubCommitToSummary(c: any) {\n const parents = Array.isArray(c?.parents) ? c.parents.map((p: any) => p?.sha ?? '').filter((s: string) => !!s) : []\n return {\n sha: c?.sha ?? '',\n message: c?.commit?.message ?? '',\n author: c?.commit?.author?.name ?? c?.author?.login ?? '',\n date: c?.commit?.author?.date ?? '',\n parents,\n }\n }\n\n /**\n * \u30D6\u30ED\u30D6\u3092\u4F5C\u6210\u307E\u305F\u306F\u30AD\u30E3\u30C3\u30B7\u30E5\u304B\u3089\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param {any[]} changes \u5909\u66F4\u4E00\u89A7\uFF08create/update \u3092\u542B\u3080\uFF09\n * @param {number} [concurrency=5] \u540C\u6642\u5B9F\u884C\u6570\n * @returns {Promise<Record<string,string>>} \u30D1\u30B9\u2192blobSha \u306E\u30DE\u30C3\u30D7\n */\n async createBlobs(changes: any[], concurrency = 5) {\n const tasks = changes.filter((c) => c.type === 'create' || c.type === 'update')\n const results = await mapWithConcurrency(tasks, this._createBlobForChange.bind(this), concurrency)\n const map: Record<string, string> = {}\n for (const r of results) map[r.path] = r.sha\n return map\n }\n\n /**\n * Create a blob for a change or return cached blobSha.\n * @param {any} ch change entry\n * @returns {Promise<{path:string,sha:string}>}\n */\n private async _createBlobForChange(ch: any) {\n /**\n * Create or return cached blob SHA for a change entry.\n * @param {any} ch change entry\n * @returns {Promise<{path:string,sha:string}>}\n */\n const contentHash = await this.shaOf(ch.content || '')\n const cached = this.blobCache.get(contentHash)\n if (cached) return { path: ch.path, sha: cached }\n const body = JSON.stringify({ content: ch.content, encoding: 'utf-8' })\n const response = await this._fetchWithRetry(`${this.baseUrl}/git/blobs`, { method: 'POST', headers: this.headers, body }, 4, 300)\n const index = await response.json()\n if (!index.sha) throw new NonRetryableError('blob response missing sha')\n this.blobCache.set(contentHash, index.sha)\n return { path: ch.path, sha: index.sha }\n }\n\n /**\n * \u4E92\u63DB\u7528\u306E\u30C4\u30EA\u30FC\u4F5C\u6210\u3002\n * @param {any[]} changes \u5909\u66F4\u4E00\u89A7\n * @param {string} [baseTreeSha] \u30D9\u30FC\u30B9\u30C4\u30EA\u30FC\n * @returns {Promise<string>} \u4F5C\u6210\u3055\u308C\u305F\u30C4\u30EA\u30FC\u306E sha\n */\n async createTree(changes: any[], baseTreeSha?: string) {\n const tree = [] as any[]\n for (const c of changes) {\n if (c.type === 'delete') {\n tree.push({ path: c.path, mode: '100644', sha: null })\n } else {\n if (!c.blobSha) throw new NonRetryableError(`missing blobSha for ${c.path}`)\n tree.push({ path: c.path, mode: '100644', type: 'blob', sha: c.blobSha })\n }\n }\n const body: any = { tree }\n if (baseTreeSha) body.base_tree = baseTreeSha\n const response = await this._fetchWithRetry(`${this.baseUrl}/git/trees`, { method: 'POST', headers: this.headers, body: JSON.stringify(body) }, 4, 300)\n const index = await response.json()\n if (!index.sha) throw new NonRetryableError('createTree response missing sha')\n return index.sha as string\n }\n\n /**\n * \u30B3\u30DF\u30C3\u30C8\u3092\u4F5C\u6210\u3057\u307E\u3059\u3002\n * @param {string} message \u30B3\u30DF\u30C3\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8\n * @param {string} parentSha \u89AA\u30B3\u30DF\u30C3\u30C8 SHA\n * @param {string} treeSha \u30C4\u30EA\u30FC SHA\n * @returns {Promise<string>} \u65B0\u898F\u30B3\u30DF\u30C3\u30C8 SHA\n */\n async createCommit(message: string, parentSha: string, treeSha: string) {\n const parents = /^[0-9a-f]{40}$/.test(String(parentSha)) ? [parentSha] : []\n const body = JSON.stringify({ message, tree: treeSha, parents })\n // debug: log body for troubleshooting invalid parents\n /* istanbul ignore next */\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('GitHub.createCommit body:', body)\n const response = await this._fetchWithRetry(`${this.baseUrl}/git/commits`, { method: 'POST', headers: this.headers, body }, 4, 300)\n const index = await response.json()\n if (!index.sha) throw new NonRetryableError('createCommit response missing sha')\n return index.sha as string\n }\n\n /**\n * Retrieve repository metadata (default branch, name, id) and cache it.\n * @returns {Promise<import('../virtualfs/types.ts').RepositoryMetadata>} repository metadata\n */\n async getRepositoryMetadata(): Promise<import('../virtualfs/types.ts').RepositoryMetadata> {\n if (this.repoMetadata) return this.repoMetadata\n try {\n const resp = await this._fetchWithRetry(`${this.baseUrl}`, { method: 'GET', headers: this.headers }, 4, 300)\n const data = await resp.json().catch(() => ({}))\n this.repoMetadata = this._makeRepoMetadata(data)\n return this.repoMetadata\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).error) (console as any).error('\u30EA\u30DD\u30B8\u30C8\u30EA\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30C7\u30D5\u30A9\u30EB\u30C8\u30D6\u30E9\u30F3\u30C1\u3092\\'main\\'\u3068\u3057\u3066\u6271\u3044\u307E\u3059', error)\n this.repoMetadata = { defaultBranch: 'main', name: '', id: undefined }\n return this.repoMetadata\n }\n }\n\n /**\n * Build repository metadata object from API response body.\n * @param data API response body\n * @returns {import('../virtualfs/types.ts').RepositoryMetadata}\n */\n private _makeRepoMetadata(data: any): import('../virtualfs/types.ts').RepositoryMetadata {\n return {\n defaultBranch: data && data.default_branch ? data.default_branch : 'main',\n name: data && data.name ? data.name : '',\n id: data && data.id ? data.id : undefined,\n }\n }\n\n /**\n * List branches via GitHub API and map to BranchListPage.\n * @param {import('../virtualfs/types.ts').BranchListQuery} [query] query parameters\n * @returns {Promise<{items:any[],nextPage?:number,lastPage?:number}>}\n */\n async listBranches(query?: import('../virtualfs/types.ts').BranchListQuery) {\n const perPage = (query && query.perPage) || 30\n const page = (query && query.page) || 1\n const url = `${this.baseUrl}/branches?per_page=${encodeURIComponent(String(perPage))}&page=${encodeURIComponent(String(page))}`\n const resp = await this._fetchWithRetry(url, { method: 'GET', headers: this.headers })\n const text = await resp.text().catch(() => '[]')\n const parsed = this._parseJsonArray(text)\n const repoMeta = await this.getRepositoryMetadata().catch(() => ({ defaultBranch: 'main' }))\n\n const items = this._mapBranchItems(Array.isArray(parsed) ? parsed : [], repoMeta)\n\n const linkHdr = resp && (resp as any).headers && typeof (resp as any).headers.get === 'function' ? (resp as any).headers.get('link') : undefined\n const pages = this._parseLinkHeaderString(typeof linkHdr === 'string' ? linkHdr : undefined)\n return { items, nextPage: pages.nextPage, lastPage: pages.lastPage }\n }\n\n /**\n * Map raw branch objects returned by API to adapter Branch item shape.\n * @param {any[]} parsed raw branch array\n * @param {any} repoMeta repository metadata\n * @returns {any[]}\n */\n private _mapBranchItems(parsed: any[], repoMeta: any) {\n return parsed.map((b: any) => ({\n name: b.name,\n commit: { sha: b.commit && b.commit.sha ? b.commit.sha : '', url: b.commit && b.commit.url ? b.commit.url : '' },\n protected: !!b.protected,\n isDefault: b.name === (repoMeta && repoMeta.defaultBranch ? repoMeta.defaultBranch : 'main'),\n }))\n }\n\n /**\n * \u53C2\u7167\u3092\u66F4\u65B0\u3057\u307E\u3059\u3002\n * @param {string} reference \u53C2\u7167\u540D\uFF08\u4F8B: heads/main\uFF09\n * @param {string} commitSha \u30B3\u30DF\u30C3\u30C8 SHA\n * @param {boolean} force \u5F37\u5236\u66F4\u65B0\u30D5\u30E9\u30B0\n */\n async updateRef(reference: string, commitSha: string, force = false) {\n const body = JSON.stringify({ sha: commitSha, force })\n const response = await this._fetchWithRetry(`${this.baseUrl}/git/refs/${reference}`, { method: 'PATCH', headers: this.headers, body }, 4, 300)\n if (!response.ok) {\n const txt = await response.text().catch(() => '')\n throw new NonRetryableError(`updateRef failed: ${response.status} ${txt}`)\n }\n }\n\n /**\n * Create a branch (ref) on the remote repository.\n * @param {string} branchName branch name to create\n * @param {string} fromSha commit sha to point the new branch at\n * @returns {Promise<import('../virtualfs/types.ts').CreateBranchResult>} created branch info\n */\n async createBranch(branchName: string, fromSha: string): Promise<import('../virtualfs/types.ts').CreateBranchResult> {\n const referenceName = `refs/heads/${branchName}`\n const body = JSON.stringify({ ref: referenceName, sha: fromSha })\n try {\n const resp = await this._fetchWithRetry(`${this.baseUrl}/git/refs`, { method: 'POST', headers: this.headers, body }, 4, 300)\n const txt = await resp.text().catch(() => '')\n const data = txt ? JSON.parse(txt) : {}\n return { name: branchName, sha: fromSha, ref: (data && data.ref) ? data.ref : referenceName }\n } catch (error: any) {\n const message = String(error && error.message ? error.message : error)\n this._handleCreateBranchError(message, branchName)\n }\n }\n\n /**\n * Normalize common createBranch error messages into thrown NonRetryableError/Error.\n * @param {string} message error message text\n * @param {string} branchName branch attempted\n * @returns {never}\n */\n private _handleCreateBranchError(message: string, branchName: string): never {\n if (message.includes('422') || /Reference already exists/i.test(message)) {\n throw new NonRetryableError(`Branch '${branchName}' already exists.`)\n }\n if (/401|403|Bad credentials/i.test(message)) {\n throw new NonRetryableError(`Authentication failed: ${message}`)\n }\n throw new Error(message)\n }\n\n /**\n * \u6307\u5B9A\u30B3\u30DF\u30C3\u30C8\u306E tree SHA \u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param commitSha \u30B3\u30DF\u30C3\u30C8 SHA\n * @returns {Promise<string>} tree \u306E SHA\n */\n async getCommitTreeSha(commitSha: string) {\n const response = await this._fetchWithRetry(`${this.baseUrl}/git/commits/${commitSha}`, { method: 'GET', headers: this.headers }, 4, 300)\n const index = await response.json()\n if (!index || !index.tree || !index.tree.sha) throw new NonRetryableError('getCommitTreeSha: tree sha not found')\n return index.tree.sha as string\n }\n\n /**\n * \u6307\u5B9A ref \u306E\u5148\u982D\u30B3\u30DF\u30C3\u30C8 SHA \u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param {string} reference \u4276: `heads/main`\n * @returns {Promise<string>} \u53C2\u7167\u5148\u306E\u30B3\u30DF\u30C3\u30C8 SHA\n */\n async getRef(reference: string) {\n // Try plural then singular path using a small helper to reduce cognitive complexity.\n const tryUrls = [\n `${this.baseUrl}/git/refs/${reference}`,\n `${this.baseUrl}/git/ref/${reference}`,\n ]\n\n for (const url of tryUrls) {\n try {\n const sha = await this._getRefShaFromUrl(url)\n if (sha) return sha\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('getRef attempt failed', error)\n }\n }\n\n throw new NonRetryableError('getRef: sha not found')\n }\n\n /**\n * Fetch a ref URL and extract a SHA if present.\n * @param {string} url API URL to fetch\n * @returns {Promise<string|null>} sha string when found, otherwise null\n */\n private async _getRefShaFromUrl(url: string): Promise<string | null> {\n const resp = await this._fetchWithRetry(url, { method: 'GET', headers: this.headers }, 4, 300)\n const index = await resp.json().catch(() => null)\n if (!index) return null\n if (typeof index.sha === 'string' && index.sha.length > 0) return index.sha as string\n if (index.object && typeof index.object.sha === 'string' && index.object.sha.length > 0) return index.object.sha as string\n return null\n }\n\n /**\n * Determine the head SHA for a branch; fallback to branch name if unavailable.\n * @param {string} branch branch name\n * @returns {Promise<string>} head SHA or branch\n */\n private async _determineHeadSha(branch: string): Promise<string> {\n // Attempt resolution via multiple strategies with small helpers to keep complexity low.\n // 1) refs API\n const referenceSha = await this.getRef(`heads/${branch}`).catch(() => null)\n if (referenceSha && typeof referenceSha === 'string' && referenceSha.length > 0) return referenceSha\n\n // 2) branches API\n const branchSha = await this._getBranchCommitSha(branch).catch((error) => {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('determineHeadSha branches API failed', error)\n return null\n })\n if (branchSha) return branchSha\n\n // 3) commits endpoint\n const commitSha = await this._getCommitEndpointSha(branch).catch((error) => {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('determineHeadSha commits endpoint failed', error)\n return null\n })\n if (commitSha) return commitSha\n\n // Fallback to returning branch name\n return branch\n }\n\n /**\n * Get commit SHA from the branches API for a branch name.\n * @param {string} branch branch name\n * @returns {Promise<string|null>} commit SHA or null when not found\n */\n private async _getBranchCommitSha(branch: string): Promise<string | null> {\n const resp = await this._fetchWithRetry(`${this.baseUrl}/branches/${encodeURIComponent(branch)}`, { method: 'GET', headers: this.headers }, 4, 300)\n if (!resp || !resp.ok) return null\n const bj = await resp.json().catch(() => null)\n const commit = bj && bj.commit ? (bj.commit.sha || bj.commit.id) : null\n return typeof commit === 'string' && commit.length > 0 ? commit : null\n }\n\n /**\n * Get commit SHA from the commits endpoint for a given reference.\n * @param {string} reference commit-ish reference\n * @returns {Promise<string|null>} commit SHA or null when not found\n */\n private async _getCommitEndpointSha(reference: string): Promise<string | null> {\n const resp = await this._fetchWithRetry(`${this.baseUrl}/commits/${encodeURIComponent(reference)}`, { method: 'GET', headers: this.headers }, 2, 200)\n if (!resp || !resp.ok) return null\n const body = await resp.json().catch(() => null)\n const maybe = body && (body.sha || body.id)\n return typeof maybe === 'string' && maybe.length > 0 ? maybe : null\n }\n\n /**\n * tree \u3092\u53D6\u5F97\u3057\u307E\u3059\uFF08\u5FC5\u8981\u306A\u3089\u518D\u5E30\u53D6\u5F97\uFF09\u3002\n * @param treeSha tree \u306E SHA\n * @param recursive \u518D\u5E30\u30D5\u30E9\u30B0\n * @returns {Promise<any[]>} tree \u306E\u914D\u5217\n */\n async getTree(treeSha: string, recursive = false) {\n const url = `${this.baseUrl}/git/trees/${treeSha}` + (recursive ? '?recursive=1' : '')\n const response = await this._fetchWithRetry(url, { method: 'GET', headers: this.headers }, 4, 300)\n const index = await response.json()\n if (!index || !index.tree) throw new NonRetryableError('getTree: tree not found')\n return index.tree as any[]\n }\n\n /**\n * blob \u3092\u53D6\u5F97\u3057\u3066\u30C7\u30B3\u30FC\u30C9\u3057\u3066\u8FD4\u3057\u307E\u3059\u3002\n * @param blobSha blob \u306E SHA\n * @returns {Promise<{content:string,encoding:string}>} \u30C7\u30B3\u30FC\u30C9\u6E08\u307F\u30B3\u30F3\u30C6\u30F3\u30C4\u3068\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\n */\n async getBlob(blobSha: string) {\n const response = await this._fetchWithRetry(`${this.baseUrl}/git/blobs/${blobSha}`, { method: 'GET', headers: this.headers }, 4, 300)\n const index = await response.json()\n if (!index || typeof index.content === 'undefined') throw new NonRetryableError('getBlob: content not found')\n const enc = index.encoding || 'utf-8'\n // Return API content as-is (do not decode here). Decoding is responsibility\n // of the caller so that adapter remains a thin mapping over the remote API.\n return { content: index.content, encoding: enc }\n }\n\n /**\n * Resolve a commit-ish (branch, tag, or SHA) to a commit SHA.\n * Resolution order: branch -> tag -> commit endpoint -> treat as SHA\n * Throws if resolution fails.\n * @param {string} reference commit-ish to resolve\n * @returns {Promise<string>} resolved commit SHA\n */\n async resolveRef(reference: string): Promise<string> {\n if (typeof reference === 'string' && /^[0-9a-f]{40}$/.test(reference)) return reference\n\n const resolvers: Array<(_reference: string) => Promise<string | null>> = [\n this._tryResolveByBranch.bind(this),\n this._tryResolveByTag.bind(this),\n this._tryResolveByCommitEndpoint.bind(this),\n ]\n\n const resolved = await this._runResolvers(reference, resolvers)\n if (resolved) return resolved\n\n throw new Error(`resolveRef: ref '${reference}' not found`)\n }\n\n /**\n * Run resolver functions in order and return the first non-null result.\n * @param {string} reference commit-ish to resolve\n * @param {Array<(_reference: string) => Promise<string | null>>} resolvers resolver functions\n * @returns {Promise<string|null>} resolved sha or null\n */\n private async _runResolvers(reference: string, resolvers: Array<(_reference: string) => Promise<string | null>>): Promise<string | null> {\n for (const r of resolvers) {\n try {\n const v = await r(reference)\n if (v) return v\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('resolveRef resolver failed', error)\n }\n }\n return null\n }\n\n /**\n * Try to resolve a branch name to a commit SHA.\n * @param {string} reference branch name\n * @returns {Promise<string|null>}\n */\n private async _tryResolveByBranch(reference: string): Promise<string | null> {\n const sha = await this.getRef(`heads/${reference}`)\n return sha || null\n }\n\n /**\n * Try to resolve a tag name to a commit SHA.\n * @param {string} reference tag name\n * @returns {Promise<string|null>}\n */\n private async _tryResolveByTag(reference: string): Promise<string | null> {\n const sha = await this.getRef(`tags/${reference}`)\n return sha || null\n }\n\n /**\n * Try to resolve via commits endpoint (may accept SHA or other forms).\n * @param {string} reference commit-ish\n * @returns {Promise<string|null>}\n */\n private async _tryResolveByCommitEndpoint(reference: string): Promise<string | null> {\n const response = await this._fetchWithRetry(`${this.baseUrl}/commits/${encodeURIComponent(reference)}`, { method: 'GET', headers: this.headers }, 2, 200)\n if (response && response.ok) {\n const body = await response.json().catch(() => null)\n const maybe = body && (body.sha || body.id)\n if (typeof maybe === 'string' && maybe.length > 0) return maybe\n }\n return null\n }\n\n /**\n * Fetch a blob's content; return null content on failure.\n * @param {any} f blob metadata\n * @returns {Promise<{path:string,content:string|null}>}\n */\n private async _fetchBlobContentOrNull(f: any) {\n try {\n const b = await this.getBlob(f.sha)\n // If the adapter returned a base64 payload, decode here for\n // fetchSnapshot/fetchContent callers so they receive decoded text.\n if (b && b.encoding === 'base64' && typeof b.content === 'string') {\n const safe = (b.content || '').replace(/\\n/g, '')\n return { path: f.path, content: this._decodeBase64ToString(safe) }\n }\n return { path: f.path, content: b.content }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('fetchSnapshot blob failed', f.path, error)\n return { path: f.path, content: null }\n }\n }\n\n /**\n * Decode a base64 string into UTF-8 text. Uses global Buffer when available,\n * falls back to atob/TextDecoder for browsers.\n * @param {string} safe base64 string to decode\n * @returns {string} decoded UTF-8 string\n */\n private _decodeBase64ToString(safe: string): string {\n const bufGlobal = (globalThis as any).Buffer\n if (typeof bufGlobal !== 'undefined' && typeof bufGlobal.from === 'function') {\n return bufGlobal.from(safe, 'base64').toString('utf8')\n }\n if (typeof atob === 'function') {\n const bin = atob(safe)\n const length_ = bin.length\n const bytes = new Uint8Array(length_)\n for (let index = 0; index < length_; index++) bytes[index] = bin.charCodeAt(index)\n return (typeof TextDecoder !== 'undefined') ? new TextDecoder().decode(bytes) : String.fromCharCode.apply(null, Array.from(bytes))\n }\n return safe\n }\n\n /**\n * Fetch repository snapshot: headSha, shas map and a fetchContent helper.\n * @param {string} branch branch name\n * @param {number} concurrency fetch concurrency\n * @returns {Promise<{headSha:string,shas:Record<string,string>,fetchContent:Function,snapshot:Record<string,string>}>}\n */\n async fetchSnapshot(branch = 'main', concurrency = 5): Promise<any> {\n const headSha = await this._determineHeadSha(branch)\n const { shas, fileMap } = await this._buildFileMapFromHead(headSha)\n\n const contentCache = new Map<string, string>()\n const snapshot: Record<string, string> = {}\n const fetchContent = this._fetchSnapshotForFileMap.bind(this, fileMap, contentCache, snapshot, concurrency)\n\n return { headSha, shas, fetchContent, snapshot }\n }\n\n /**\n * Bound helper used to construct the `fetchContent` function returned by `fetchSnapshot`.\n * @param {Map<string, any>} fileMap file metadata map\n * @param {Map<string,string>} contentCache cache map\n * @param {Record<string,string>} snapshot snapshot map to populate\n * @param {number} concurrency concurrency level\n * @param {string[]} paths requested paths\n * @returns {Promise<Record<string,string>>}\n */\n private async _fetchSnapshotForFileMap(fileMap: Map<string, any>, contentCache: Map<string, string>, snapshot: Record<string, string>, concurrency: number, paths: string[]): Promise<Record<string, string>> {\n return this._fetchContentFromMap(fileMap, contentCache, snapshot, paths, concurrency)\n }\n\n /**\n * Build file map and shas from a head SHA by fetching the tree.\n * @param {string} headSha head commit SHA\n * @returns {Promise<{shas:Record<string,string>,fileMap:Map<string,any>}>}\n */\n private async _buildFileMapFromHead(headSha: string): Promise<{ shas: Record<string, string>; fileMap: Map<string, any> }> {\n const treeResponse = await this._fetchWithRetry(`${this.baseUrl}/git/trees/${headSha}${'?recursive=1'}`, { method: 'GET', headers: this.headers }, 4, 300)\n const treeJ = await treeResponse.json()\n\n if (treeJ && treeJ.truncated === true) {\n this.logWarn('GitHub tree response was truncated. Some files may be missing. Consider using non-recursive tree fetching for large repositories.')\n }\n\n const files = (treeJ && treeJ.tree) ? treeJ.tree.filter((t: any) => t.type === 'blob') : []\n const shas: Record<string, string> = {}\n const fileMap = new Map<string, any>()\n for (const f of files) {\n shas[f.path] = f.sha\n fileMap.set(f.path, f)\n }\n return { shas, fileMap }\n }\n\n /**\n * Fetch contents for given paths from a file map with caching and concurrency.\n * @param {Map<string, any>} fileMap map of file metadata\n * @param {Map<string,string>} contentCache cache map\n * @param {Record<string,string>} snapshot output snapshot\n * @param {string[]} paths requested paths\n * @param {number} concurrency concurrency level\n * @returns {Promise<Record<string,string>>}\n */\n private async _fetchContentFromMap(fileMap: Map<string, any>, contentCache: Map<string, string>, snapshot: Record<string, string>, paths: string[], concurrency: number): Promise<Record<string, string>> {\n /**\n * Collect contents for the requested paths using concurrency helper.\n * @param {string[]} paths requested paths\n * @returns {Promise<Record<string,string>>} path->content map\n */\n const out: Record<string, string> = {}\n const unique = Array.from(new Set(paths)).filter((p) => fileMap.has(p))\n const mapper = this._mapperForFetch.bind(this, fileMap, contentCache, snapshot, out)\n await mapWithConcurrency(unique, mapper, concurrency)\n return out\n }\n\n /**\n * Mapper used by _fetchContentFromMap when fetching multiple files.\n * @param {Map<string, any>} fileMap file metadata map\n * @param {Map<string,string>} contentCache cache map\n * @param {Record<string,string>} snapshot snapshot map to populate\n * @param {Record<string,string>} out output map to collect results\n * @param {string} p requested path\n * @returns {Promise<null>}\n */\n private async _mapperForFetch(fileMap: Map<string, any>, contentCache: Map<string, string>, snapshot: Record<string, string>, out: Record<string, string>, p: string): Promise<null> {\n const content = await this._fetchContentForPath(fileMap, contentCache, snapshot, p)\n if (content !== null) out[p] = content\n return null\n }\n\n /**\n * Fetch single path content, update cache and snapshot.\n * @param {Map<string, any>} fileMap file map\n * @param {Map<string,string>} contentCache cache map\n * @param {Record<string,string>} snapshot snapshot map\n * @param {string} p path to fetch\n * @returns {Promise<string|null>}\n */\n private async _fetchContentForPath(fileMap: Map<string, any>, contentCache: Map<string, string>, snapshot: Record<string, string>, p: string): Promise<string | null> {\n if (contentCache.has(p)) {\n const v = contentCache.get(p) as string\n snapshot[p] = v\n return v\n }\n const f = fileMap.get(p)\n const r = await this._fetchBlobContentOrNull(f)\n if (r && r.content !== null) {\n contentCache.set(p, r.content)\n snapshot[p] = r.content\n return r.content\n }\n return null\n }\n}\n// re-export helpers for backward compatibility\nexport { fetchWithRetry, classifyStatus, getDelayForResponse, processResponseWithDelay, mapWithConcurrency, shaOf }\n// re-export error classes for backward compatibility with tests\nexport { RetryableError, NonRetryableError } from './abstractAdapter.ts'\nexport default GitHubAdapter\n\n", "import { GitAdapter } from './adapter.ts'\nimport AbstractGitAdapter, { RetryExhaustedError } from './abstractAdapter.ts'\n\nexport type GLOptions = { projectId: string; token: string; host?: string }\n\n/**\n * GitLab \u5411\u3051\u306E GitAdapter \u5B9F\u88C5\u3067\u3059\u3002\n * GitLab \u306E API \u3092\u30E9\u30C3\u30D7\u3057\u3066\u3001\u30EA\u30DD\u30B8\u30C8\u30EA\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u306E\u53D6\u5F97\u3084\n * commits API \u306E\u547C\u3073\u51FA\u3057\u3092\u30B5\u30DD\u30FC\u30C8\u3057\u307E\u3059\u3002\n */\nexport class GitLabAdapter extends AbstractGitAdapter implements GitAdapter {\n private pendingActions: Array<{ action: string; file_path: string; content?: string }> | null = null\n private projectMetadata: import('../virtualfs/types.ts').RepositoryMetadata | null = null\n\n /**\n * GitLabAdapter \u3092\u521D\u671F\u5316\u3057\u307E\u3059\u3002\n * @param {GLOptions} options \u8A2D\u5B9A\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n constructor(options: GLOptions) {\n super(options)\n const host = options.host || 'https://gitlab.com'\n this.baseUrl = `${host}/api/v4/projects/${encodeURIComponent(options.projectId)}`\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json'\n }\n if (typeof options.token === 'string' && options.token.trim().length > 0) {\n headers['PRIVATE-TOKEN'] = options.token\n }\n this.headers = headers\n }\n\n /**\n * List commits for a ref (GitLab commits API)\n * @param {Object} query query parameters\n * @param {string} query.ref reference name\n * @param {number} [query.perPage] items per page\n * @param {number} [query.page] page number\n * @returns {Promise<import('./adapter').CommitHistoryPage>} \u30DA\u30FC\u30B8\u60C5\u5831\u3092\u8FD4\u3057\u307E\u3059\n */\n async listCommits(query: { ref: string; perPage?: number; page?: number }) {\n const reference = query.ref || 'main'\n const perPage = query.perPage || 30\n const page = query.page || 1\n const url = `${this.baseUrl}/repository/commits?ref_name=${encodeURIComponent(reference)}&per_page=${encodeURIComponent(String(perPage))}&page=${encodeURIComponent(String(page))}`\n const resp = await this.fetchWithRetry(url, { method: 'GET', headers: this.headers })\n const text = await resp.text().catch(() => '[]')\n const parsed = this._parseJsonArray(text)\n\n const items = (Array.isArray(parsed) ? parsed : []).map((c: any) => this._mapGitLabCommitToSummary(c))\n\n const pages = this._parsePagingHeaders(resp)\n return { items, nextPage: pages.nextPage, lastPage: pages.lastPage }\n }\n\n /**\n * \u5FDC\u7B54\u30C6\u30AD\u30B9\u30C8\u3092 JSON \u914D\u5217\u3068\u3057\u3066\u89E3\u6790\u3057\u307E\u3059\uFF08\u5931\u6557\u6642\u306F\u7A7A\u914D\u5217\u3092\u8FD4\u3059\uFF09\u3002\n * @param {string} text \u5FDC\u7B54\u30C6\u30AD\u30B9\u30C8\n * @returns {any[]}\n */\n private _parseJsonArray(text: string): any[] {\n try {\n return text ? JSON.parse(text) : []\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('parseJsonArray failed', error)\n return []\n }\n }\n\n /**\n * GitLab \u306E\u30DA\u30FC\u30B8\u30F3\u30B0\u30D8\u30C3\u30C0\u3092\u89E3\u6790\u3057\u307E\u3059\uFF08x-next-page / x-total-pages\uFF09\u3002\n * @param {Response} resp HTTP \u30EC\u30B9\u30DD\u30F3\u30B9\n * @returns {{nextPage?: number, lastPage?: number}} \u30DA\u30FC\u30B8\u756A\u53F7\u60C5\u5831\n */\n private _parsePagingHeaders(resp: Response): { nextPage?: number; lastPage?: number } {\n const out: { nextPage?: number; lastPage?: number } = {}\n try {\n const hdrNext = resp && (resp as any).headers && typeof (resp as any).headers.get === 'function' ? (resp as any).headers.get('x-next-page') : undefined\n const hdrTotal = resp && (resp as any).headers && typeof (resp as any).headers.get === 'function' ? (resp as any).headers.get('x-total-pages') : undefined\n if (hdrNext) out.nextPage = Number(hdrNext)\n if (hdrTotal) out.lastPage = Number(hdrTotal)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('parsePagingHeaders failed', error)\n }\n return out\n }\n\n /**\n * Map a raw GitLab commit object to CommitSummary.\n * @param {any} c Raw commit object\n * @returns {import('./adapter').CommitSummary}\n */\n private _mapGitLabCommitToSummary(c: any) {\n const parents = Array.isArray(c?.parent_ids) ? c.parent_ids.map((p: any) => p ?? '').filter(Boolean) : []\n return {\n sha: c?.id ?? '',\n message: c?.message ?? '',\n author: c?.author_name ?? c?.author?.name ?? '',\n date: c?.created_at ?? '',\n parents,\n }\n }\n\n /**\n * \u5909\u66F4\u4E00\u89A7\u304B\u3089 blob sha \u306E\u30DE\u30C3\u30D7\u3092\u4F5C\u6210\u3057\u307E\u3059\uFF08\u7591\u4F3C\u5B9F\u88C5\uFF09\u3002\n * @param {any[]} changes \u5909\u66F4\u4E00\u89A7\n * @returns {Promise<Record<string,string>>} path->sha \u30DE\u30C3\u30D7\n */\n async createBlobs(changes: any[]) {\n const map: Record<string, string> = {}\n for (const c of changes) {\n if (c.type === 'create' || c.type === 'update') map[c.path] = await this.shaOf(c.content)\n }\n return map\n }\n\n /**\n * \u4E92\u63DB\u7528\u306E\u30C4\u30EA\u30FC\u4F5C\u6210\u3002\u5B9F\u969B\u306B\u306F actions \u3092\u4FDD\u6301\u3057\u3066\u304A\u304D\u3001\u30DE\u30FC\u30AB\u30FC\u3092\u8FD4\u3057\u307E\u3059\u3002\n * @param {any[]} _changes \u5909\u66F4\u4E00\u89A7\n * @param {string} [_baseTreeSha] \u30D9\u30FC\u30B9\u30C4\u30EA\u30FC\uFF08\u672A\u4F7F\u7528\uFF09\n * @returns {Promise<string>} \u30DE\u30FC\u30AB\u30FC\u6587\u5B57\u5217\n */\n async createTree(_changes: any[], _baseTreeSha?: string) {\n // Store actions for later commit; return marker token\n const actions = (_changes || []).map((c: any) => {\n if (c.type === 'delete') return { action: 'delete', file_path: c.path }\n if (c.type === 'create') return { action: 'create', file_path: c.path, content: c.content }\n return { action: 'update', file_path: c.path, content: c.content }\n })\n this.pendingActions = actions\n return `gitlab-tree-${Date.now()}-${Math.floor(Math.random() * 100000)}`\n }\n\n /**\n * createTree \u3067\u4FDD\u6301\u3057\u305F actions \u304C\u3042\u308C\u3070\u30B3\u30DF\u30C3\u30C8\u3057\u3001\u306A\u3051\u308C\u3070 parentSha \u3092\u8FD4\u3057\u307E\u3059\u3002\n * @param {string} message \u30B3\u30DF\u30C3\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8\n * @param {string} parentSha \u89AA\u30B3\u30DF\u30C3\u30C8 SHA\n * @param {string} _treeSha \u30C4\u30EA\u30FC SHA\uFF08\u672A\u4F7F\u7528\uFF09\n * @returns {Promise<string>} \u65B0\u898F\u30B3\u30DF\u30C3\u30C8 SHA \u307E\u305F\u306F parentSha\n */\n async createCommit(message: string, parentSha: string, _treeSha: string) {\n // If pendingActions exist (created via createTree), use commits API\n if (this.pendingActions && this.pendingActions.length > 0) {\n const branch = 'main'\n const commitResponse = await this.createCommitWithActions(\n branch,\n message,\n this.pendingActions.map((a) => ({ type: a.action === 'delete' ? 'delete' : a.action === 'create' ? 'create' : 'update', path: a.file_path, content: a.content })),\n parentSha\n )\n this.pendingActions = null\n return commitResponse\n }\n // Fallback: no-op commit (return parentSha)\n return parentSha\n }\n\n /**\n * \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u66F4\u65B0\u306F\u4E0D\u8981\u306A\u305F\u3081 noop \u5B9F\u88C5\u3067\u3059\u3002\n * @param {string} _reference ref \u540D\n * @param {string} _commitSha \u30B3\u30DF\u30C3\u30C8 SHA\n * @param {boolean} [_force] \u5F37\u5236\u30D5\u30E9\u30B0\n * @returns {Promise<void>}\n */\n async updateRef(_reference: string, _commitSha: string, _force = false) {\n // Not required when using commits API\n }\n\n /**\n * actions \u3092\u7528\u3044\u3066 GitLab \u306E\u30B3\u30DF\u30C3\u30C8 API \u3092\u547C\u3073\u51FA\u3057\u307E\u3059\u3002\n * @param {string} branch \u30D6\u30E9\u30F3\u30C1\u540D\n * @param {string} message \u30B3\u30DF\u30C3\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8\n * @param {Array<{type:string,path:string,content?:string}>} changes \u5909\u66F4\u4E00\u89A7\n * @param {string} [expectedParentSha] \u4E0B\u767A\u30B3\u30DF\u30C3\u30C8 SHA\n * @returns {Promise<any>} \u30B3\u30DF\u30C3\u30C8\u5FDC\u7B54\uFF08id \u306A\u3069\uFF09\n */\n async createCommitWithActions(branch: string, message: string, changes: Array<{ type: string; path: string; content?: string }>, expectedParentSha?: string) {\n const url = `${this.baseUrl}/repository/commits`\n const actions = this.createActions(changes)\n const body = this._prepareCommitBody(branch, message, actions)\n\n // If caller provided an expected parent SHA, verify remote branch head matches it to avoid accidental overwrites\n if (expectedParentSha) {\n // In unit tests global.fetch may be a jest mock (mockResolvedValueOnce etc.)\n // which would consume the single prepared mock for the commit call and break tests.\n // Skip the pre-check when fetch is a Jest mock function.\n const gfetch: any = (globalThis as any).fetch\n if (!(gfetch && gfetch._isMockFunction)) {\n await this._maybeVerifyParent(expectedParentSha, branch)\n }\n }\n\n return await this.postCommit(url, body)\n }\n\n /**\n * Retrieve project metadata (default branch, name, id) and cache it.\n * @returns {Promise<import('../virtualfs/types.ts').RepositoryMetadata>} repository metadata\n */\n async getRepositoryMetadata(): Promise<import('../virtualfs/types.ts').RepositoryMetadata> {\n if (this.projectMetadata) return this.projectMetadata\n try {\n const resp = await this.fetchWithRetry(`${this.baseUrl}`, { method: 'GET', headers: this.headers })\n const data = await resp.json().catch(() => ({}))\n this.projectMetadata = this._makeProjectMetadata(data)\n return this.projectMetadata\n } catch (error) {\n if (error instanceof RetryExhaustedError) throw error\n if (typeof console !== 'undefined' && (console as any).error) (console as any).error('\u30EA\u30DD\u30B8\u30C8\u30EA\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30C7\u30D5\u30A9\u30EB\u30C8\u30D6\u30E9\u30F3\u30C1\u3092\\'main\\'\u3068\u3057\u3066\u6271\u3044\u307E\u3059', error)\n this.projectMetadata = { defaultBranch: 'main', name: '', id: undefined }\n return this.projectMetadata\n }\n }\n\n /**\n * Build project metadata from API response.\n * @param data API response body\n * @returns {import('../virtualfs/types.ts').RepositoryMetadata}\n */\n private _makeProjectMetadata(data: any): import('../virtualfs/types.ts').RepositoryMetadata {\n return {\n defaultBranch: data && data.default_branch ? data.default_branch : 'main',\n name: data && data.name ? data.name : '',\n id: data && data.id ? data.id : undefined,\n }\n }\n\n /**\n * List branches via GitLab API and map to BranchListPage.\n * @param {import('../virtualfs/types.ts').BranchListQuery} [query] query parameters\n * @returns {Promise<{items:any[],nextPage?:number,lastPage?:number}>}\n */\n async listBranches(query?: import('../virtualfs/types.ts').BranchListQuery) {\n const perPage = (query && query.perPage) || 30\n const page = (query && query.page) || 1\n const url = `${this.baseUrl}/repository/branches?per_page=${encodeURIComponent(String(perPage))}&page=${encodeURIComponent(String(page))}`\n const resp = await this.fetchWithRetry(url, { method: 'GET', headers: this.headers })\n const text = await resp.text().catch(() => '[]')\n const parsed = this._parseJsonArray(text)\n const repoMeta = await this.getRepositoryMetadata().catch(() => ({ defaultBranch: 'main' }))\n\n const items = this._mapBranchItems(Array.isArray(parsed) ? parsed : [], repoMeta)\n\n const pages = this._parsePagingHeaders(resp)\n return { items, nextPage: pages.nextPage, lastPage: pages.lastPage }\n }\n\n /**\n * Create a branch in GitLab: POST /projects/{projectId}/repository/branches\n * @param {string} branchName name of branch to create\n * @param {string} fromSha branch/tag name or SHA to base the new branch on\n * @returns {Promise<import('../virtualfs/types.ts').CreateBranchResult>} created branch info\n */\n async createBranch(branchName: string, fromSha: string): Promise<import('../virtualfs/types.ts').CreateBranchResult> {\n const url = `${this.baseUrl}/repository/branches`\n const body = JSON.stringify({ branch: branchName, ref: fromSha })\n try {\n const resp = await this.fetchWithRetry(url, { method: 'POST', headers: this.headers, body }, 4, 300)\n const text = await resp.text().catch(() => '')\n const sha = this._extractShaFromCommitResponseText(text, fromSha)\n return { name: branchName, sha, ref: `refs/heads/${branchName}` }\n } catch (error: any) {\n if (error instanceof RetryExhaustedError) throw error\n const message = String(error && error.message ? error.message : error)\n this._handleCreateBranchError(message, branchName)\n }\n }\n\n /**\n * Extract SHA from commit response text.\n * @param {string} text response text\n * @param {string} fallback fallback SHA value\n * @returns {string} extracted SHA or fallback\n */\n private _extractShaFromCommitResponseText(text: string, fallback: string) {\n try {\n const data = text ? JSON.parse(text) : {}\n const commit = data && data.commit\n return commit && (commit.id || commit.sha) ? (commit.id || commit.sha) : fallback\n } catch {\n return fallback\n }\n }\n\n /**\n * Normalize common createBranch error messages into thrown Errors.\n * @param {string} message error message text\n * @param {string} branchName branch name attempted\n * @returns {never}\n */\n private _handleCreateBranchError(message: string, branchName: string): never {\n if (message.includes('400') || /Branch already exists/i.test(message)) {\n throw new Error(`Branch '${branchName}' already exists`)\n }\n if (/401|403|Unauthorized/i.test(message)) {\n throw new Error(`Authentication failed: ${message}`)\n }\n // Re-throw generic case\n throw new Error(message)\n }\n\n /**\n * Map raw GitLab branch objects to adapter Branch item shape.\n * @param {any[]} parsed raw branch array\n * @param {any} repoMeta repository metadata\n * @returns {any[]}\n */\n private _mapBranchItems(parsed: any[], repoMeta: any) {\n return parsed.map((b: any) => ({\n name: b.name,\n commit: { sha: b.commit && (b.commit.id || b.commit.sha) ? (b.commit.id || b.commit.sha) : '', url: b.commit && (b.commit.web_url || b.commit.url) ? (b.commit.web_url || b.commit.url) : '' },\n protected: !!b.protected,\n isDefault: b.name === (repoMeta && repoMeta.defaultBranch ? repoMeta.defaultBranch : 'main'),\n }))\n }\n\n /**\n * Convert change descriptors to GitLab API actions\n * @param {Array<{type:string,path:string,content?:string}>} changes change descriptors\n * @returns {Array<any>} API-compatible actions array\n */\n private createActions(changes: Array<{ type: string; path: string; content?: string }>) {\n return changes.map((c) => {\n if (c.type === 'delete') return { action: 'delete', file_path: c.path }\n if (c.type === 'create') return { action: 'create', file_path: c.path, content: c.content }\n return { action: 'update', file_path: c.path, content: c.content }\n })\n }\n\n /**\n * Verify that remote branch head matches expected parent SHA.\n * Throws when non-fast-forward detected.\n * @param {string} expectedParentSha expected parent SHA\n * @param {string} branch branch name\n * @returns {Promise<void>}\n */\n private async verifyParent(expectedParentSha: string, branch: string): Promise<void> {\n const branchResponse = await this.fetchWithRetry(`${this.baseUrl}/repository/branches/${encodeURIComponent(branch)}`, { method: 'GET', headers: this.headers })\n if (branchResponse && branchResponse.ok) {\n const bj = await branchResponse.json().catch(() => null)\n const remoteHead = bj && bj.commit && (bj.commit.id || bj.commit.sha) ? (bj.commit.id || bj.commit.sha) : null\n if (remoteHead && remoteHead !== expectedParentSha) {\n throw new Error(`422 Non-fast-forward: remote head ${remoteHead} !== expected ${expectedParentSha}`)\n }\n }\n }\n\n /**\n * Parse and validate commit API response text\n * @param {string} text \u5FDC\u7B54\u30C6\u30AD\u30B9\u30C8\n * @returns {any} parsed commit id/object\n */\n private parseCommitResponse(text: string) {\n let index: any = null\n try {\n index = text ? JSON.parse(text) : null\n } catch {\n throw new Error(`GitLab commit invalid JSON response: ${text}`)\n }\n if (!index || (!index.id && !index.commit)) {\n throw new Error(`GitLab commit unexpected response: ${JSON.stringify(index)}`)\n }\n return index.id || index.commit || index\n }\n\n /**\n * Post commit request and return parsed commit response.\n * @param {string} url endpoint URL\n * @param {string} body request body\n * @returns {Promise<any>} parsed commit response\n */\n private async postCommit(url: string, body: string) {\n const response = await this.fetchWithRetry(url, { method: 'POST', headers: this.headers, body })\n const text = await response.text().catch(() => '')\n return this.parseCommitResponse(text)\n }\n\n /**\n * Wait helper for retry backoff.\n * @param {number} attempt attempt number\n * @returns {Promise<void>}\n */\n private async _waitAttempt(attempt: number): Promise<void> {\n const wait = this.backoffMs(attempt)\n await new Promise((r) => setTimeout(r, wait))\n }\n\n /**\n * Prepare JSON body for commit API call.\n * @param {string} branch branch name\n * @param {string} message commit message\n * @param {any[]} actions commit actions\n * @returns {string} JSON body\n */\n private _prepareCommitBody(branch: string, message: string, actions: any[]) {\n return JSON.stringify({ branch, commit_message: message, actions })\n }\n\n /**\n * Optionally verify parent SHA; rethrow errors after logging.\n * @param {string} expectedParentSha expected SHA\n * @param {string} branch branch name\n * @returns {Promise<void>}\n */\n private async _maybeVerifyParent(expectedParentSha: string, branch: string) {\n try {\n await this.verifyParent(expectedParentSha, branch)\n } catch (error: any) {\n if (typeof console !== 'undefined' && (console as any).warn) (console as any).warn('verifyParent skipped:')\n throw error\n }\n }\n\n /**\n * \u30EA\u30DD\u30B8\u30C8\u30EA\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param {string} branch \u30D6\u30E9\u30F3\u30C1\u540D (default: 'main')\n * @param {number} concurrency fetch concurrency level\n * @returns {Promise<{headSha:string,shas:Record<string,string>,fetchContent:(paths:string[])=>Promise<Record<string,string>>}>}\n */\n async fetchSnapshot(branch = 'main', concurrency = 5): Promise<any> {\n const headSha = await this._determineHeadSha(branch)\n const { shas, fileSet } = await this._fetchTreeAndBuildShas(branch)\n\n const cache = new Map<string, string>()\n const snapshot: Record<string, string> = {}\n /**\n * Fetch content helper for requested paths.\n * @param {string[]} paths File paths to fetch\n * @returns {Promise<Record<string,string>>}\n */\n const fetchContent = (paths: string[]) => this._fetchContentFromFileSet(fileSet, cache, snapshot, paths, branch, concurrency)\n\n return { headSha, shas, fetchContent, snapshot }\n }\n\n /**\n * Determine the head SHA for a branch; fallback to branch name if unavailable.\n * @param {string} branch branch name\n * @returns {Promise<string>} head SHA or branch\n */\n private async _determineHeadSha(branch: string): Promise<string> {\n // If caller already passed a commit-ish SHA, avoid calling the branches API\n // (GitLab returns 404 for branches/<sha> in many setups). Accept common\n // short/long hex SHAs and return as-is to avoid noisy 404s.\n if (typeof branch === 'string' && /^[0-9a-f]{7,40}$/.test(branch)) return branch\n\n const remote = await this._safeGetBranchHead(branch)\n return remote ?? branch\n }\n\n /**\n * Safely fetch branch head SHA, returning null on failure.\n * @param {string} branch branch name\n * @returns {Promise<string|null>} head SHA or null\n */\n private async _safeGetBranchHead(branch: string): Promise<string | null> {\n try {\n const branchResponse = await this.fetchWithRetry(`${this.baseUrl}/repository/branches/${encodeURIComponent(branch)}`, { method: 'GET', headers: this.headers })\n if (!branchResponse?.ok) return null\n const branchJson = await branchResponse.json().catch(() => null)\n const commit = branchJson?.commit\n return commit?.id ?? commit?.sha ?? null\n } catch (error) {\n if (error instanceof RetryExhaustedError) throw error\n if (typeof console !== 'undefined' && (console as any).warn) (console as any).warn('determineHeadSha fallback', error)\n return null\n }\n }\n\n /**\n * Fetch repository tree and build shas map and fileSet.\n * Paginates through all pages using offset-based pagination (per_page=100).\n * @param {string} branch branch name\n * @returns {Promise<{shas:Record<string,string>,fileSet:Set<string>}>}\n */\n private async _fetchTreeAndBuildShas(branch: string): Promise<{ shas: Record<string, string>; fileSet: Set<string> }> {\n const allFiles: any[] = []\n let page = 1\n const perPage = 100\n\n while (true) {\n const url = `${this.baseUrl}/repository/tree?recursive=true&ref=${encodeURIComponent(branch)}&per_page=${perPage}&page=${page}`\n const treeResponse = await this.fetchWithRetry(url, { method: 'GET', headers: this.headers })\n const treeJ = await treeResponse.json()\n const entries = Array.isArray(treeJ) ? treeJ : []\n allFiles.push(...entries.filter((t: any) => t.type === 'blob'))\n\n const paging = this._parsePagingHeaders(treeResponse)\n if (!paging.nextPage) break\n page = paging.nextPage\n }\n\n return this._buildShasAndFileSet(allFiles)\n }\n\n /**\n * Fetch contents for requested paths from a FileSet with caching.\n * @param {Set<string>} fileSet set of available files\n * @param {Map<string,string>} cache content cache\n * @param {Record<string,string>} snapshot snapshot output\n * @param {string[]} paths requested paths\n * @param {string} branch branch name\n * @param {number} concurrency concurrency level\n * @returns {Promise<Record<string,string>>}\n */\n private async _fetchContentFromFileSet(fileSet: Set<string>, cache: Map<string, string>, snapshot: Record<string, string>, paths: string[], branch: string, concurrency: number) {\n const out: Record<string, string> = {}\n const targets = Array.from(new Set(paths)).filter((p) => fileSet.has(p))\n /**\n * Mapper to fetch a single file (used with concurrency helper).\n * @param {string} p \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<null>}\n */\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : undefined\n const signal = controller ? controller.signal : undefined\n\n /**\n * Mapper to fetch a single file.\n * @param {string} p file path\n * @returns {Promise<null>}\n */\n const mapper = async (p: string) => {\n if (signal && signal.aborted) throw new Error('aborted')\n const content = await this._fetchFileContentForPath(cache, snapshot, p, branch, signal)\n if (content !== null) out[p] = content\n return null\n }\n\n await this.mapWithConcurrency(targets, mapper, concurrency, controller ? { controller } : undefined)\n return out\n }\n\n /**\n * Fetch the content for a single file path, updating cache and snapshot.\n * @param {Map<string,string>} cache cache map\n * @param {Record<string,string>} snapshot snapshot map\n * @param {string} p file path\n * @param {string} branch branch\n * @param {AbortSignal} [signal] optional abort signal\n * @returns {Promise<string|null>} file content or null\n */\n private async _fetchFileContentForPath(cache: Map<string, string>, snapshot: Record<string, string>, p: string, branch: string, signal?: AbortSignal) {\n if (cache.has(p)) {\n const v = cache.get(p) as string\n snapshot[p] = v\n return v\n }\n const content = await this._fetchFileRaw(p, branch, signal)\n if (content !== null) {\n cache.set(p, content)\n snapshot[p] = content\n return content\n }\n return null\n }\n\n /**\n * Fetch raw file content from GitLab; return null on failure.\n * @param {string} path file path\n * @param {string} branch branch name\n * @param {AbortSignal} [signal] optional abort signal\n * @returns {Promise<string|null>} file content or null\n */\n private async _fetchFileRaw(path: string, branch: string, signal?: AbortSignal) {\n try {\n const init: any = { method: 'GET', headers: this.headers, ...(signal ? { signal } : {}) }\n const rawResponse = await this.fetchWithRetry(`${this.baseUrl}/repository/files/${encodeURIComponent(path)}/raw?ref=${encodeURIComponent(branch)}`, init)\n if (!rawResponse.ok) {\n this.logDebug('fetchSnapshot file failed', path)\n return null\n }\n return await rawResponse.text()\n } catch (error) {\n if (error instanceof RetryExhaustedError) throw error\n this.logDebug('fetchSnapshot file error', path, error)\n return null\n }\n }\n\n /**\n * Build shas map and fileSet from tree entries\n * @param {any[]} files tree file entries\n * @returns {{shas:Record<string,string>,fileSet:Set<string>}}\n */\n private _buildShasAndFileSet(files: any[]) {\n const shas: Record<string, string> = {}\n const fileSet = new Set<string>()\n for (const f of files) {\n if (f && f.path) {\n const sha = (f as any).id || (f as any).sha || ''\n shas[f.path] = sha\n fileSet.add(f.path)\n }\n }\n return { shas, fileSet }\n }\n\n /**\n * Resolve a commit-ish (branch, tag, or SHA) to a commit SHA.\n * Resolution order: branch -> tag -> commits endpoint -> treat as SHA\n * Throws if not resolvable.\n * @param {string} reference commit-ish to resolve\n * @returns {Promise<string>} resolved commit SHA\n */\n async resolveRef(reference: string): Promise<string> {\n if (typeof reference === 'string' && /^[0-9a-f]{40}$/.test(reference)) return reference\n\n const resolvers: Array<(_reference: string) => Promise<string | null>> = [\n this._tryResolveBranch.bind(this),\n this._tryResolveTag.bind(this),\n this._tryResolveCommit.bind(this),\n ]\n\n const resolved = await this._runResolvers(reference, resolvers)\n if (resolved) return resolved\n\n throw new Error(`resolveRef: ref '${reference}' not found`)\n }\n\n /**\n * Run resolver functions in order and return the first non-null result.\n * @param {string} reference commit-ish to resolve\n * @param {Array<(_reference: string) => Promise<string | null>>} resolvers resolver functions\n * @returns {Promise<string|null>} resolved sha or null\n */\n private async _runResolvers(reference: string, resolvers: Array<(_reference: string) => Promise<string | null>>): Promise<string | null> {\n for (const r of resolvers) {\n const v = await this._tryRunResolver(r, reference)\n if (v) return v\n }\n return null\n }\n\n /**\n * Try running a single resolver, returning null on failure.\n * @param {Function} r resolver function\n * @param {string} reference commit-ish to resolve\n * @returns {Promise<string|null>} resolved sha or null\n */\n private async _tryRunResolver(r: (_reference: string) => Promise<string | null>, reference: string): Promise<string | null> {\n try {\n return await r(reference)\n } catch (error) {\n if (error instanceof RetryExhaustedError) throw error\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('resolveRef resolver failed', error)\n return null\n }\n }\n\n /**\n * Try to resolve a branch name to its commit SHA.\n * @param {string} reference branch name\n * @returns {Promise<string|null>} resolved sha or null\n */\n private async _tryResolveBranch(reference: string): Promise<string | null> {\n const branchResp = await this.fetchWithRetry(`${this.baseUrl}/repository/branches/${encodeURIComponent(reference)}`, { method: 'GET', headers: this.headers })\n if (branchResp && branchResp.ok) {\n const bj = await branchResp.json().catch(() => null)\n const maybe = bj && (bj.commit && (bj.commit.id || bj.commit.sha))\n if (typeof maybe === 'string' && maybe.length > 0) return maybe\n }\n return null\n }\n\n /**\n * Try to resolve a tag name to a commit SHA.\n * @param {string} reference tag name\n * @returns {Promise<string|null>} resolved SHA or null\n */\n private async _tryResolveTag(reference: string): Promise<string | null> {\n const tagResp = await this.fetchWithRetry(`${this.baseUrl}/repository/tags/${encodeURIComponent(reference)}`, { method: 'GET', headers: this.headers })\n if (tagResp && tagResp.ok) {\n const tj = await tagResp.json().catch(() => null)\n const maybe = tj && (tj.commit && (tj.commit.id || tj.commit.sha))\n if (typeof maybe === 'string' && maybe.length > 0) return maybe\n }\n return null\n }\n\n /**\n * Try to resolve a commit via commits endpoint.\n * @param {string} reference commit-ish\n * @returns {Promise<string|null>} resolved SHA or null\n */\n private async _tryResolveCommit(reference: string): Promise<string | null> {\n const commitResp = await this.fetchWithRetry(`${this.baseUrl}/repository/commits/${encodeURIComponent(reference)}`, { method: 'GET', headers: this.headers })\n if (commitResp && commitResp.ok) {\n const cj = await commitResp.json().catch(() => null)\n const maybe = cj && (cj.id || cj.sha)\n if (typeof maybe === 'string' && maybe.length > 0) return maybe\n }\n return null\n }\n}\n\nexport default GitLabAdapter\n", "/**\n * SHA-1\u30CF\u30C3\u30B7\u30E5\u5024\u3092\u8A08\u7B97\u3057\u306616\u9032\u6587\u5B57\u5217\u3067\u8FD4\u3059\n * @param {string} content - \u30CF\u30C3\u30B7\u30E5\u5BFE\u8C61\u306E\u6587\u5B57\u5217\n * @returns {Promise<string>} SHA-1\u30CF\u30C3\u30B7\u30E5\u306E16\u9032\u8868\u73FE\n */\nexport async function shaOf(content: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(content)\n const hashBuffer = await crypto.subtle.digest('SHA-1', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n}\n\n/**\n * Git \u306E blob \u3068\u3057\u3066\u306E SHA-1 \u30CF\u30C3\u30B7\u30E5\u3092\u8A08\u7B97\u3057\u306616\u9032\u6587\u5B57\u5217\u3067\u8FD4\u3059\n * @param {string} content - blob \u306E\u4E2D\u8EAB\u3068\u306A\u308B\u6587\u5B57\u5217\n * @returns {Promise<string>} SHA-1\u30CF\u30C3\u30B7\u30E5\u306E16\u9032\u8868\u73FE\uFF08git blob \u7528\uFF09\n */\nexport async function shaOfGitBlob(content: string): Promise<string> {\n const encoder = new TextEncoder()\n const body = encoder.encode(content)\n const header = encoder.encode(`blob ${body.byteLength}\\0`)\n const merged = new Uint8Array(header.length + body.length)\n merged.set(header)\n merged.set(body, header.length)\n const hashBuffer = await crypto.subtle.digest('SHA-1', merged)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n}\n", "import type { StorageBackend } from './storageBackend.ts'\n\n/**\n *\n */\nexport class LocalChangeApplier {\n private backend: StorageBackend\n\n /**\n * LocalChangeApplier \u3092\u521D\u671F\u5316\u3057\u307E\u3059\n * @param {StorageBackend} backend \u30B9\u30C8\u30EC\u30FC\u30B8\u3092\u8F9B\u5B50\n */\n constructor(backend: StorageBackend) {\n this.backend = backend\n }\n\n /**\n * \u4F5C\u6210\u307E\u305F\u306F\u66F4\u65B0\u3092\u9069\u7528\u3057\u307E\u3059\n * @param {any} ch \u5909\u66F4\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n async applyCreateOrUpdate(ch: any) {\n // Ensure workspace copy is removed first (delete may remove all segments),\n // then persist base blob so it remains.\n await this.backend.deleteBlob(ch.path, 'workspace')\n await this.backend.writeBlob(ch.path, ch.content, 'base')\n }\n\n /**\n * \u524A\u9664\u3092\u9069\u7528\u3057\u307E\u3059\n * @param {any} ch \u5909\u66F4\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n async applyDelete(ch: any) {\n await this.backend.deleteBlob(ch.path, 'info')\n // Backend manages base segment; remove blobs from backend\n await this.backend.deleteBlob(ch.path)\n await this.backend.deleteBlob(ch.path, 'workspace')\n }\n}\n\nexport default LocalChangeApplier\n", "\uFEFFimport type { StorageBackend } from './storageBackend.ts'\n\nconst WORKSPACE = 'workspace'\nconst BASE = 'base'\nconst INFO = 'info'\nconst INFO_WORKSPACE = 'info-workspace'\nconst INFO_GIT = 'info-git'\n\n/**\n * \u30ED\u30FC\u30AB\u30EB\u30D5\u30A1\u30A4\u30EB\u64CD\u4F5C\u306E\u30E9\u30C3\u30D1\u30FC\n */\nexport class LocalFileManager {\n private backend: StorageBackend\n\n /**\n * \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\n * @param {StorageBackend} backend - \u30B9\u30C8\u30EC\u30FC\u30B8\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\n */\n constructor(backend: StorageBackend) {\n this.backend = backend\n }\n\n /**\n * \u30D5\u30A1\u30A4\u30EB\u3092\u66F8\u304D\u8FBC\u3080\uFF08workspace\u9818\u57DF\uFF09\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @param {string} content - \u66F8\u304D\u8FBC\u3080\u5185\u5BB9\n * @returns {Promise<void>}\n */\n async writeFile(filepath: string, content: string): Promise<void> {\n await this.backend.writeBlob(filepath, content, WORKSPACE)\n }\n\n /**\n * git \u306B\u6B8B\u308B info \u3092\u5143\u306B workspace \u7528\u306E\u30C8\u30F3\u30D6\u30B9\u30C8\u30FC\u30F3\u3092\u4F5C\u6210\u3057\u3066\u66F8\u304D\u8FBC\u3080\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<void>}\n */\n private async _writeTombstoneFromGit(filepath: string): Promise<void> {\n const gitInfoTxt = await this.backend.readBlob(filepath, INFO_GIT)\n let gitInfo: any = {}\n if (gitInfoTxt) {\n try {\n gitInfo = JSON.parse(gitInfoTxt)\n } catch (error) {\n gitInfo = {}\n }\n }\n gitInfo.state = 'deleted'\n gitInfo.updatedAt = Date.now()\n await this.backend.writeBlob(filepath, JSON.stringify(gitInfo), INFO_WORKSPACE)\n }\n\n /**\n * \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306E info \u3092\u30C8\u30F3\u30D6\u30B9\u30C8\u30FC\u30F3\u72B6\u614B\u306B\u66F4\u65B0\u3057\u3066\u66F8\u304D\u8FBC\u3080\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<void>}\n */\n private async _writeWorkspaceTombstone(filepath: string): Promise<void> {\n const existingWorkspaceInfoTxt = await this.backend.readBlob(filepath, INFO)\n let existingWorkspaceInfo: any = {}\n if (existingWorkspaceInfoTxt) {\n try {\n existingWorkspaceInfo = JSON.parse(existingWorkspaceInfoTxt)\n } catch (error) {\n existingWorkspaceInfo = {}\n }\n }\n existingWorkspaceInfo.state = 'deleted'\n existingWorkspaceInfo.updatedAt = Date.now()\n await this.backend.writeBlob(filepath, JSON.stringify(existingWorkspaceInfo), INFO_WORKSPACE)\n }\n\n /**\n * info \u95A2\u9023\u306E\u30A8\u30F3\u30C8\u30EA\u3092\u524A\u9664\u3059\u308B\uFF08best-effort\uFF09\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<void>}\n */\n private async _deleteInfos(filepath: string): Promise<void> {\n await this.backend.deleteBlob(filepath, INFO_WORKSPACE)\n await this.backend.deleteBlob(filepath, INFO)\n }\n\n /**\n * \u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\u3059\u308B\uFF08workspace \u3068 info \u3092\u30AF\u30EA\u30A2\uFF09\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<void>}\n */\n async deleteFile(filepath: string): Promise<void> {\n const gitBase = await this.backend.readBlob(filepath, BASE)\n // read existing unprefixed info (workspace-local info) to decide action\n const existingInfoTxt = await this.backend.readBlob(filepath, INFO)\n\n // remove workspace cache first to avoid accidental deletion of newly written workspace-info\n await this.backend.deleteBlob(filepath, WORKSPACE)\n\n try {\n if (gitBase !== null) {\n // preserve git-scoped info, but create a workspace tombstone derived from git info\n await this._writeTombstoneFromGit(filepath)\n return\n }\n // If there was an existing workspace-local info entry, persist a workspace tombstone\n // so the deletion is recorded locally. Otherwise remove info entries entirely so\n // the entry disappears (covers add-then-delete-before-base case).\n if (existingInfoTxt !== null) {\n await this._writeWorkspaceTombstone(filepath)\n return\n }\n await this._deleteInfos(filepath)\n } catch (error) {\n new Error('Failed to delete file infos: ' + String(error))\n // best-effort: ignore and finish\n }\n }\n\n /**\n * \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u307E\u305F\u306F\u30D9\u30FC\u30B9\u304B\u3089\u30D5\u30A1\u30A4\u30EB\u3092\u8AAD\u307F\u51FA\u3059\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<string|null>} \u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\u307E\u305F\u306F null\n */\n async readFile(filepath: string): Promise<string | null> {\n const wsBlob = await this.backend.readBlob(filepath, WORKSPACE)\n if (wsBlob !== null) return wsBlob\n const baseBlob = await this.backend.readBlob(filepath, BASE)\n if (baseBlob !== null) return baseBlob\n return null\n }\n\n /**\n * \u30D5\u30A1\u30A4\u30EB\u3092\u30EA\u30CD\u30FC\u30E0\u3059\u308B\uFF08\u5185\u5BB9\u3092\u30B3\u30D4\u30FC\u3057\u3066\u5143\u3092\u524A\u9664\uFF09\n * @param {string} from - \u5143\u30D1\u30B9\n * @param {string} to - \u5148\u30D1\u30B9\n * @returns {Promise<void>}\n */\n async renameFile(from: string, to: string): Promise<void> {\n const content = await this.readFile(from)\n if (content === null) throw new Error('Source file not found')\n await this.writeFile(to, content)\n await this.deleteFile(from)\n }\n}\n\nexport default LocalFileManager\n\n", "\uFEFFimport type { StorageBackend } from './storageBackend.ts'\nimport { IndexFile } from './types.ts'\n\n/**\n * \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u7BA1\u7406\u30AF\u30E9\u30B9\n */\nexport class IndexManager {\n private backend: StorageBackend\n private head: string = ''\n private lastCommitKey: string | undefined\n\n /**\n * \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\n * @param {StorageBackend} backend - \u30B9\u30C8\u30EC\u30FC\u30B8\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\n */\n constructor(backend: StorageBackend) {\n this.backend = backend\n }\n\n /**\n * \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u30B9\u30C8\u30EC\u30FC\u30B8\u304B\u3089\u8AAD\u307F\u8FBC\u3080\n * @returns {Promise<void>}\n */\n async loadIndex(): Promise<void> {\n try {\n const raw = await this.backend.readIndex()\n if (raw) {\n this.head = raw.head || ''\n this.lastCommitKey = (raw as any).lastCommitKey\n }\n } catch {\n this.head = ''\n this.lastCommitKey = undefined\n await this.saveIndex()\n }\n }\n\n /**\n * \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u30B9\u30C8\u30EC\u30FC\u30B8\u3078\u66F8\u304D\u8FBC\u3080\n * @returns {Promise<void>}\n */\n async saveIndex(): Promise<void> {\n // Preserve existing top-level fields (such as adapter metadata) when saving\n const existing = (await this.backend.readIndex()) || { head: this.head, entries: {} }\n const index: IndexFile = { ...(existing as any) }\n index.head = this.head\n if (this.lastCommitKey) (index as any).lastCommitKey = this.lastCommitKey\n else delete (index as any).lastCommitKey\n await this.backend.writeIndex(index)\n }\n\n /**\n * \u73FE\u5728\u306Ehead\u3092\u8FD4\u3059\n * @returns {string}\n */\n getHead(): string {\n return this.head\n }\n\n /**\n * head\u3092\u8A2D\u5B9A\u3059\u308B\n * @param {string} h - head\u6587\u5B57\u5217\n */\n setHead(h: string): void {\n this.head = h\n }\n\n /**\n * \u6700\u5F8C\u306E\u30B3\u30DF\u30C3\u30C8\u30AD\u30FC\u3092\u8FD4\u3059\n * @returns {string|undefined}\n */\n getLastCommitKey(): string | undefined {\n return this.lastCommitKey\n }\n\n /**\n * \u6700\u5F8C\u306E\u30B3\u30DF\u30C3\u30C8\u30AD\u30FC\u3092\u8A2D\u5B9A\u3059\u308B\n * @param {string|undefined} k - \u30B3\u30DF\u30C3\u30C8\u30AD\u30FC\n */\n setLastCommitKey(k: string | undefined): void {\n this.lastCommitKey = k\n }\n\n /**\n * \u73FE\u5728\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u53D6\u5F97\u3059\u308B\uFF08Proxy\u3067head\u3092\u59D4\u8B72\uFF09\n * @returns {Promise<IndexFile>} \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n async getIndex(): Promise<IndexFile> {\n const index = await this.backend.readIndex()\n const base = index || { head: this.head, entries: {} }\n const self = this\n return new Proxy(base, {\n /**\n * Proxy get handler\n * @param {any} target - \u5143\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n * @param {string|symbol} property - \u53D6\u5F97\u30D7\u30ED\u30D1\u30C6\u30A3\n * @returns {any}\n */\n get(target, property: string | symbol) {\n if (property === 'head') return self.head || (target as any).head\n return (target as any)[property]\n },\n /**\n * Proxy set handler\n * @param {any} target - \u5143\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n * @param {string|symbol} property - \u8A2D\u5B9A\u30D7\u30ED\u30D1\u30C6\u30A3\n * @param {any} value - \u8A2D\u5B9A\u5024\n * @returns {boolean}\n */\n set(target, property: string | symbol, value) {\n if (property === 'head') {\n self.head = value as string\n }\n (target as any)[property] = value\n return true\n }\n }) as IndexFile\n }\n\n /**\n * info \u306B\u5B58\u5728\u3059\u308B\u5168\u30D1\u30B9\u3092\u5217\u6319\u3059\u308B\n * @returns {Promise<string[]>} \u30D1\u30B9\u306E\u914D\u5217\n */\n async listPaths(): Promise<string[]> {\n const infos = await this.backend.listFiles(undefined, 'info')\n const out: string[] = []\n for (const it of infos) {\n // Exclude explicit tombstones (state: 'deleted') from visible paths\n try {\n if (it.info) {\n const parsed = JSON.parse(it.info)\n if (parsed && parsed.state === 'deleted') continue\n }\n } catch {\n // ignore parse errors and include the path\n }\n out.push(it.path)\n }\n return out\n }\n}\n\nexport default IndexManager\n\n", "\uFEFFimport { StorageBackend } from './storageBackend.ts'\nimport { IndexManager } from './indexManager.ts'\n\n/**\n * \u5909\u66F4\u8FFD\u8DE1\u3092\u884C\u3046\u30E6\u30FC\u30C6\u30A3\u30EA\u30C6\u30A3\u30AF\u30E9\u30B9\n */\nexport class ChangeTracker {\n private backend: StorageBackend\n private indexManager: IndexManager\n\n /**\n * \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\n * @param {StorageBackend} backend - \u30B9\u30C8\u30EC\u30FC\u30B8\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\n * @param {IndexManager} indexManager - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u7BA1\u7406\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n constructor(backend: StorageBackend, indexManager: IndexManager) {\n this.backend = backend\n this.indexManager = indexManager\n }\n\n /**\n * \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306E\u5909\u66F4\u30BB\u30C3\u30C8\u3092\u53D6\u5F97\u3059\u308B\n * @returns {Promise<Array>} \u5909\u66F4\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u914D\u5217\n */\n async getChangeSet(): Promise<Array<any>> {\n type Change =\n | { type: 'create'; path: string; content: string }\n | { type: 'update'; path: string; content: string; baseSha?: string }\n | { type: 'delete'; path: string; baseSha: string }\n\n const changes: Change[] = []\n const deleteChanges = await this._changesFromIndexDeletes()\n changes.push(...deleteChanges)\n const tombChanges = await this._changesFromTombstones()\n changes.push(...tombChanges)\n const indexChanges = await this._changesFromIndexEntries()\n changes.push(...indexChanges)\n return changes\n }\n\n /**\n * \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5DEE\u5206\u304B\u3089\u524A\u9664\u5909\u66F4\u3092\u53D6\u5F97\u3059\u308B\n * @returns {Promise<Array<{type:'delete';path:string;baseSha:string}>>} \u524A\u9664\u5909\u66F4\u306E\u914D\u5217\n */\n private async _changesFromIndexDeletes(): Promise<Array<{ type: 'delete'; path: string; baseSha: string }>> {\n const out: Array<{ type: 'delete'; path: string; baseSha: string }> = []\n const index = await this.indexManager.getIndex()\n for (const [p, entry] of Object.entries(index.entries || {})) {\n try {\n if (await this._isIndexEntryDeleted(entry as any, p)) {\n const ie: any = entry as any\n out.push({ type: 'delete', path: p, baseSha: ie.baseSha })\n }\n } catch {\n continue\n }\n }\n return out\n }\n\n /**\n * Determine whether an index entry should be considered a local delete.\n * - explicit deleted state -> true\n * - only if workspaceSha existed previously and workspace blob now missing\n * @param ie index entry\n * @param p file path\n * @returns true when entry represents a local deletion\n */\n private async _isIndexEntryDeleted(ie: any, p: string): Promise<boolean> {\n if (!ie || !ie.baseSha) return false\n if (ie.state === 'deleted') return true\n if (!ie.workspaceSha) return false\n const ws = await this.backend.readBlob(p, 'workspace')\n return ws === null\n }\n\n /**\n * \u30C8\u30A5\u30FC\u30E0\u30B9\u30C8\u30FC\u30F3\u304B\u3089\u524A\u9664\u5909\u66F4\u3092\u53D6\u5F97\u3059\u308B\uFF08\u672A\u5B9F\u88C5\uFF1A\u7A7A\u914D\u5217\u3092\u8FD4\u3059\uFF09\n * @returns {Promise<Array<{type:'delete';path:string;baseSha:string}>>}\n */\n private async _changesFromTombstones(): Promise<Array<{ type: 'delete'; path: string; baseSha: string }>> {\n return []\n }\n\n /**\n * \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30F3\u30C8\u30EA\u304B\u3089\u4F5C\u6210\u30FB\u66F4\u65B0\u306E\u5909\u66F4\u3092\u53D6\u5F97\u3059\u308B\n * @returns {Promise<Array>} \u4F5C\u6210/\u66F4\u65B0\u5909\u66F4\u306E\u914D\u5217\n */\n private async _changesFromIndexEntries(): Promise<Array<{ type: 'create'; path: string; content: string } | { type: 'update'; path: string; content: string; baseSha?: string }>> {\n const out: Array<{ type: 'create'; path: string; content: string } | { type: 'update'; path: string; content: string; baseSha?: string }> = []\n const infos = await this.backend.listFiles(undefined, 'workspace')\n // fetch index entries once so we can merge baseSha from index metadata\n const index = await this.indexManager.getIndex()\n const indexEntries = (index && index.entries) ? index.entries : {}\n for (const it of infos) {\n const changesFor = await this._changesForIndexFile(it.path, it.info, indexEntries)\n if (changesFor.length > 0) out.push(...changesFor)\n }\n return out\n }\n\n /**\n * \u5358\u4E00\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u5909\u66F4\u3092\u62BD\u51FA\u3059\u308B\n * @param {string} p - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @param {string|null} infoTxt - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306E\u60C5\u5831\u30C6\u30AD\u30B9\u30C8\n * @param {Record<string,any>} indexEntries - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30F3\u30C8\u30EA\u3092\u8F9B\u5B50\u3092\u4F7F\u7528\u3057\u3066\u636B\u53D6\n * @returns {Promise<Array>} \u5909\u66F4\u914D\u5217\n */\n private async _changesForIndexFile(p: string, infoTxt: string | null, indexEntries: Record<string, any> = {}): Promise<Array<{ type: 'create'; path: string; content: string } | { type: 'update'; path: string; content: string; baseSha?: string }>> {\n const out: Array<{ type: 'create'; path: string; content: string } | { type: 'update'; path: string; content: string; baseSha?: string }> = []\n if (!infoTxt) return out\n let entry: any = undefined\n try { entry = JSON.parse(infoTxt) } catch { return out }\n if (!entry) return out\n // Merge baseSha from index metadata when missing in workspace info\n const indexEntry = indexEntries[p]\n if ((!entry.baseSha || entry.baseSha === undefined) && indexEntry && indexEntry.baseSha) {\n entry.baseSha = indexEntry.baseSha\n // adjust state: if workspace info marked as 'added' but index indicates a base, treat as modified\n if (entry.state === 'added') entry.state = 'modified'\n }\n const blob = await this.backend.readBlob(p, 'workspace')\n return this._changesFromIndexEntry(entry, p, blob)\n }\n\n /**\n * \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30F3\u30C8\u30EA\u304B\u3089\u5177\u4F53\u7684\u306A\u5909\u66F4\u30EA\u30B9\u30C8\u3092\u4F5C\u308B\n * @param {any} entry - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30F3\u30C8\u30EA\n * @param {string} p - \u30D1\u30B9\n * @param {string|null} blob - blob \u30B3\u30F3\u30C6\u30F3\u30C4\n * @returns {Array} \u5909\u66F4\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u914D\u5217\n */\n private _changesFromIndexEntry(entry: any, p: string, blob: string | null): Array<any> {\n const out: Array<{ type: 'create'; path: string; content: string } | { type: 'update'; path: string; content: string; baseSha?: string }> = []\n if (entry.state === 'added') {\n if (blob == null) return out\n out.push({ type: 'create', path: p, content: blob })\n return out\n }\n if (!this._isEntryConsidered(entry)) return out\n if (entry.baseSha) {\n if (blob !== null) out.push({ type: 'update', path: p, content: blob, baseSha: entry.baseSha })\n } else {\n if (blob == null) return out\n out.push({ type: 'create', path: p, content: blob })\n }\n return out\n }\n\n /**\n * \u30A8\u30F3\u30C8\u30EA\u304C\u5909\u66F4\u5BFE\u8C61\u3068\u3057\u3066\u8003\u616E\u3055\u308C\u308B\u304B\u5224\u5B9A\u3059\u308B\n * @param {any} entry - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30F3\u30C8\u30EA\n * @returns {boolean} \u8003\u616E\u5BFE\u8C61\u306A\u3089true\n */\n private _isEntryConsidered(entry: any): boolean {\n return entry.state === 'modified' || entry.state === 'conflict' || (!!entry.workspaceSha && entry.state !== 'added')\n }\n}\n\n", "import { StorageBackend } from './storageBackend.ts'\nimport { IndexManager } from './indexManager.ts'\n\n/**\n *\n */\nexport class ConflictManager {\n private backend: StorageBackend\n private indexManager: IndexManager\n\n /**\n * ConflictManager \u3092\u9069\u521D\u5316\u3057\u307E\u3059\n * @param {StorageBackend} backend \u30B9\u30C8\u30EC\u30FC\u30B8\u3092\u8F9B\u5B50\n * @param {IndexManager} indexManager \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u7BA1\u7406\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n constructor(backend: StorageBackend, indexManager: IndexManager) {\n this.backend = backend\n this.indexManager = indexManager\n }\n\n /**\n * \u6307\u5B9A\u30D1\u30B9\u306E\u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u5185\u5BB9\u3092\u8AAD\u307F\u53D6\u308B\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<string|null>} \u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u306E\u5185\u5BB9\u3001\u306A\u3051\u308C\u3070null\n */\n async readConflict(filepath: string): Promise<string | null> {\n const blob = await this.backend.readBlob(filepath, 'conflict')\n if (blob !== null) return blob\n return null\n }\n\n /**\n * \u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u3092\u89E3\u6D88\u3057\u3066\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u66F4\u65B0\u3059\u308B\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<boolean>} \u6210\u529F\u3059\u308C\u3070true\u3001\u5931\u6557\u3059\u308C\u3070false\n */\n async resolveConflict(filepath: string): Promise<boolean> {\n try {\n const remoteContent = await this.backend.readBlob(filepath, 'conflictBlob')\n const ie: any = await this._loadIndexEntry(filepath)\n\n if (ie && ie.remoteSha) {\n if (remoteContent !== null) {\n await this.backend.writeBlob(filepath, remoteContent, 'base')\n }\n ie.baseSha = ie.remoteSha\n delete ie.remoteSha\n ie.state = 'base'\n ie.updatedAt = Date.now()\n // Write updated entry to info blob\n await this.backend.writeBlob(filepath, JSON.stringify(ie), 'info')\n }\n\n await this.backend.deleteBlob(filepath, 'conflict')\n await this.backend.deleteBlob(filepath, 'conflictBlob')\n\n // Note: entries are refreshed via backend.readIndex() in getIndex()\n // No explicit reload needed here\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Load index entry from info blob or index entries.\n * @param {string} filepath\n * @returns {Promise<any>} index entry or undefined\n */\n private async _loadIndexEntry(filepath: string): Promise<any> {\n let ie: any = undefined\n const infoTxt = await this.backend.readBlob(filepath, 'info')\n if (infoTxt) ie = JSON.parse(infoTxt)\n if (!ie) {\n const index = await this.indexManager.getIndex()\n ie = index.entries[filepath]\n }\n return ie\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u306E\u5185\u5BB9\u3092\u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u3068\u3057\u3066\u6C38\u7D9A\u5316\u3059\u308B\n * @param {string} p - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @param {string|undefined} content - \u6C38\u7D9A\u5316\u3059\u308B\u5185\u5BB9\n * @returns {Promise<void>}\n */\n async persistRemoteContentAsConflict(p: string, content: string | undefined): Promise<void> {\n if (typeof content === 'undefined') return\n try {\n await this.backend.writeBlob(p, content, 'conflictBlob')\n } catch (error) {\n console.warn('\u7121\u8996\u3055\u308C\u305F\u30A8\u30E9\u30FC', error)\n return\n }\n }\n\n /**\n * \u6307\u5B9A\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30F3\u30C8\u30EA\u3092\u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u72B6\u614B\u306B\u3059\u308B\n * @param {string} p - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @param {any} ie - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30F3\u30C8\u30EA\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n * @param {string} remoteHeadSha - \u30EA\u30E2\u30FC\u30C8\u306EHEAD SHA\n * @returns {Promise<void>}\n */\n async setIndexEntryToConflict(p: string, ie: any, remoteHeadSha: string): Promise<void> {\n ie.state = 'conflict'\n ie.remoteSha = remoteHeadSha\n ie.updatedAt = Date.now()\n await this.backend.writeBlob(p, JSON.stringify(ie), 'info')\n }\n\n /**\n * \u89E3\u6C7A\u6E08\u307F\u306E\u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u30A8\u30F3\u30C8\u30EA\u3092\u6607\u683C\u3057\u3066\u30D9\u30FC\u30B9\u72B6\u614B\u306B\u623B\u3059\n * @param {any} c - \u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u60C5\u5831\uFF08.path \u3092\u542B\u3080\uFF09\n * @param {Record<string,string>} baseSnapshot - \u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u30DE\u30C3\u30D7\n * @returns {Promise<void>}\n */\n async promoteResolvedConflictEntry(c: any, baseSnapshot: Record<string, string>): Promise<void> {\n const p = c.path\n let ie: any = undefined\n const infoTxt = await this.backend.readBlob(p, 'info')\n if (infoTxt) ie = JSON.parse(infoTxt)\n if (!ie) return\n let content = typeof baseSnapshot[p] !== 'undefined' ? baseSnapshot[p] : null\n if (content === null) {\n content = await this.backend.readBlob(p, 'conflictBlob')\n }\n if (content === null) {\n content = await this.backend.readBlob(p, 'base')\n }\n if (content !== null) {\n await this.backend.writeBlob(p, content, 'base')\n }\n ie.baseSha = ie.remoteSha\n delete ie.remoteSha\n ie.state = 'base'\n ie.updatedAt = Date.now()\n await this.backend.writeBlob(p, JSON.stringify(ie), 'info')\n await this.backend.deleteBlob(p, 'conflict')\n await this.backend.deleteBlob(p, 'conflictBlob')\n }\n\n /**\n * \u5168\u3066\u306E\u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u304C\u89E3\u6C7A\u6E08\u307F\u304B\u5224\u5B9A\u3059\u308B\n * @param {Array<any>} conflicts - \u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u4E00\u89A7\n * @returns {Promise<boolean>} \u5168\u3066\u89E3\u6C7A\u6E08\u307F\u306A\u3089true\n */\n async areAllResolved(conflicts: Array<any>): Promise<boolean> {\n for (const c of conflicts) {\n const p = c.path\n let ie: any = undefined\n const infoTxt = await this.backend.readBlob(p, 'info')\n if (infoTxt) ie = JSON.parse(infoTxt)\n if (!ie) {\n const index = await this.indexManager.getIndex()\n ie = index.entries[p]\n }\n if (!ie || !ie.remoteSha || ie.baseSha !== ie.remoteSha) return false\n }\n return true\n }\n\n /**\n * \u89E3\u6C7A\u6E08\u307F\u306E\u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u7FA4\u3092\u6607\u683C\u3057\u3066\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u66F4\u65B0\u3059\u308B\n * @param {Array<any>} conflicts - \u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u4E00\u89A7\n * @param {Record<string,string>} baseSnapshot - \u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\n * @param {string} remoteHead - \u30EA\u30E2\u30FC\u30C8\u306EHEAD\n * @returns {Promise<void>}\n */\n async promoteResolvedConflicts(conflicts: Array<any>, baseSnapshot: Record<string, string>, remoteHead: string): Promise<void> {\n if (!(await this.areAllResolved(conflicts))) return\n for (const c of conflicts) {\n await this.promoteResolvedConflictEntry(c, baseSnapshot)\n }\n this.indexManager.setHead(remoteHead)\n await this.indexManager.saveIndex()\n }\n}\n\nexport default ConflictManager\n", "import { shaOf, shaOfGitBlob } from './hashUtils.ts'\nimport { StorageBackend } from './storageBackend.ts'\nimport { IndexManager } from './indexManager.ts'\nimport { ConflictManager } from './conflictManager.ts'\nimport { LocalChangeApplier } from './localChangeApplier.ts'\n\ntype RemoteSnapshotDescriptor = {\n headSha: string\n shas: Record<string, string>\n fetchContent: (_paths: string[]) => Promise<Record<string, string>>\n}\n\n/**\n * \u30EA\u30E2\u30FC\u30C8\u540C\u671F\u3092\u884C\u3046\u30AF\u30E9\u30B9\n */\nexport class RemoteSynchronizer {\n /**\n * \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\n * @param {StorageBackend} _backend - \u30B9\u30C8\u30EC\u30FC\u30B8\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\n * @param {IndexManager} _indexManager - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u7BA1\u7406\n * @param {ConflictManager} _conflictManager - \u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u7BA1\u7406\n * @param {LocalChangeApplier} _applier - \u30ED\u30FC\u30AB\u30EB\u9069\u7528\u5668\n */\n constructor(\n private _backend: StorageBackend,\n private _indexManager: IndexManager,\n private _conflictManager: ConflictManager,\n private _applier: LocalChangeApplier\n ) { }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092pull\u3057\u3066\u30ED\u30FC\u30AB\u30EB\u3092\u540C\u671F\u3059\u308B\n * @param {RemoteSnapshotDescriptor|string} remote - \u30EA\u30E2\u30FC\u30C8\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u307E\u305F\u306FheadSha\n * @param {Record<string,string>} [baseSnapshot] - \u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\n * @param {any} [adapterInstance] - \u30AA\u30D7\u30B7\u30E7\u30F3\u306Eadapter instance\n * @returns {Promise<object>} conflicts, fetchedPaths, reconciledPaths \u3092\u542B\u3080\u7D50\u679C\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n async pull(remote: RemoteSnapshotDescriptor | string, baseSnapshot?: Record<string, string>, adapterInstance?: any): Promise<object> {\n const normalized = await this._normalizeRemoteInput(remote, baseSnapshot)\n\n const conflicts: Array<any> = []\n const pathsToFetch: string[] = []\n const reconciledPaths: string[] = []\n\n for (const [p, sha] of Object.entries(normalized.shas)) {\n const classified = await this._classifyRemotePathForPull(p, sha, normalized, pathsToFetch, reconciledPaths)\n if (!classified) pathsToFetch.push(p)\n }\n\n // Metadata-first: do not fetch contents during pull.\n const fetched: Record<string, string> = {}\n await this._processRemoteAddsAndUpdates(normalized.shas, fetched, normalized.headSha, conflicts, adapterInstance, normalized)\n await this._processRemoteDeletions(normalized.shas, conflicts)\n\n if (conflicts.length === 0) {\n this._indexManager.setHead(normalized.headSha)\n await this._indexManager.saveIndex()\n return { conflicts, fetchedPaths: Object.keys(fetched), reconciledPaths }\n }\n\n await this._conflictManager.promoteResolvedConflicts(conflicts, fetched, normalized.headSha)\n\n if (reconciledPaths.length > 0) await this._indexManager.saveIndex()\n\n return { conflicts, fetchedPaths: Object.keys(fetched), reconciledPaths }\n }\n\n /**\n * \u30ED\u30FC\u30AB\u30EB\u306E\u5909\u66F4\u3092push\u3059\u308B\uFF08\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u66F4\u65B0\u3092\u884C\u3046\uFF09\n * @param {any} input - push \u5165\u529B\uFF08parentSha, changes \u7B49\uFF09\n * @param {any} [_adapter] - \u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u30A2\u30C0\u30D7\u30BF\n * @returns {Promise<object>} commitSha \u3092\u542B\u3080\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n async push(input: any, _adapter?: any): Promise<object> {\n if (input.parentSha === undefined || input.parentSha === null) {\n throw new Error('No parentSha set. pull required')\n }\n const currentIndex = await this._indexManager.getIndex()\n if (input.parentSha !== currentIndex.head) {\n throw new Error('\u975E\u4E92\u63DB\u306A\u66F4\u65B0 (non-fast-forward): pull \u304C\u5FC5\u8981\u3067\u3059')\n }\n if (!input.commitKey) {\n input.commitKey = await shaOf(input.parentSha + JSON.stringify(input.changes))\n }\n if (!input.changes || input.changes.length === 0) throw new Error('No changes to commit')\n\n const commitSha = await shaOf(input.parentSha + '|' + input.commitKey)\n for (const ch of input.changes as any[]) {\n await this._applyChangeLocally(ch)\n }\n this._indexManager.setHead(commitSha)\n this._indexManager.setLastCommitKey(input.commitKey)\n await this._indexManager.saveIndex()\n\n return { commitSha }\n }\n\n /**\n * \u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u9069\u7528\u3057\u3066\u30ED\u30FC\u30AB\u30EB\u3092\u7F6E\u304D\u63DB\u3048\u308B\n * @param {Record<string,string>} snapshot - \u30D1\u30B9->\u5185\u5BB9\u306E\u30DE\u30C3\u30D7\n * @param {string} headSha - \u9069\u7528\u5F8C\u306Ehead\n * @returns {Promise<void>}\n */\n async applyBaseSnapshot(snapshot: Record<string, string>, headSha: string): Promise<void> {\n const newShas: Record<string, string> = {}\n for (const [p, c] of Object.entries(snapshot)) newShas[p] = await shaOf(c)\n\n const toAddOrUpdate = await this._computeToAddOrUpdate(snapshot, newShas)\n const toRemove = await this._computeToRemove(snapshot)\n\n await this._applyRemovals(toRemove)\n await this._applyAddsOrUpdates(toAddOrUpdate, snapshot, newShas)\n\n this._indexManager.setHead(headSha)\n await this._indexManager.saveIndex()\n }\n\n /**\n * remote \u5F15\u6570\u3092\u6A19\u6E96\u306E RemoteSnapshotDescriptor \u306B\u5909\u63DB\u3059\u308B\n * @param {RemoteSnapshotDescriptor|string} remote - \u30EA\u30E2\u30FC\u30C8\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u307E\u305F\u306Fhead SHA\n * @param {Record<string,string>} [baseSnapshot] - \u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\n * @returns {Promise<RemoteSnapshotDescriptor>} \u6A19\u6E96\u5316\u3055\u308C\u305FRemoteSnapshotDescriptor\n */\n private async _normalizeRemoteInput(remote: RemoteSnapshotDescriptor | string, baseSnapshot?: Record<string, string>): Promise<RemoteSnapshotDescriptor> {\n if (typeof remote !== 'string') return remote\n const snapshot = baseSnapshot || {}\n const shas: Record<string, string> = {}\n for (const [p, c] of Object.entries(snapshot)) shas[p] = await shaOf(c)\n /**\n * \u6307\u5B9A\u30D1\u30B9\u306E\u5185\u5BB9\u3092 snapshot \u304B\u3089\u53D6\u5F97\u3059\u308B\uFF08\u5185\u90E8\u30E6\u30FC\u30C6\u30A3\u30EA\u30C6\u30A3\uFF09\n * @param {string[]} paths - \u53D6\u5F97\u3059\u308B\u30D1\u30B9\u4E00\u89A7\n * @returns {Promise<Record<string,string>>} path->content \u30DE\u30C3\u30D7\n */\n async function fetchContent(paths: string[]): Promise<Record<string, string>> {\n const out: Record<string, string> = {}\n for (const p of paths) {\n if (p in snapshot) out[p] = snapshot[p]\n }\n return out\n }\n return { headSha: remote, shas, fetchContent }\n }\n\n /**\n * \u8FFD\u52A0/\u66F4\u65B0\u5BFE\u8C61\u306E\u30D1\u30B9\u4E00\u89A7\u3092\u8A08\u7B97\u3059\u308B\n * @param {Record<string,string>} snapshot - \u30D1\u30B9->\u5185\u5BB9\u306E\u30DE\u30C3\u30D7\n * @param {Record<string,string>} newShas - \u30D1\u30B9->SHA\u306E\u30DE\u30C3\u30D7\n * @returns {Promise<string[]>} \u8FFD\u52A0/\u66F4\u65B0\u5BFE\u8C61\u306E\u30D1\u30B9\u914D\u5217\n */\n private async _computeToAddOrUpdate(snapshot: Record<string, string>, newShas: Record<string, string>): Promise<string[]> {\n const out: string[] = []\n for (const [p] of Object.entries(snapshot)) {\n const sha = newShas[p]\n let entry: any = undefined\n const infoTxt = await this._backend.readBlob(p, 'info')\n if (infoTxt) entry = JSON.parse(infoTxt)\n if (!entry || entry.baseSha !== sha) out.push(p)\n }\n return out\n }\n\n /**\n * \u524A\u9664\u5BFE\u8C61\u306E\u30D1\u30B9\u4E00\u89A7\u3092\u8A08\u7B97\u3059\u308B\n * @param {Record<string,string>} snapshot - \u30D1\u30B9->\u5185\u5BB9\u306E\u30DE\u30C3\u30D7\n * @returns {Promise<string[]>} \u524A\u9664\u5BFE\u8C61\u306E\u30D1\u30B9\u914D\u5217\n */\n private async _computeToRemove(snapshot: Record<string, string>): Promise<string[]> {\n const out: string[] = []\n const infos = await this._backend.listFiles(undefined, 'info')\n for (const it of infos) {\n const p = it.path\n if (!(p in snapshot)) out.push(p)\n }\n return out\n }\n\n /**\n * \u6307\u5B9A\u30D1\u30B9\u306E\u524A\u9664\u3092\u9069\u7528\u3059\u308B\n * @param {string[]} toRemove - \u524A\u9664\u5BFE\u8C61\u30D1\u30B9\u914D\u5217\n * @returns {Promise<void>}\n */\n private async _applyRemovals(toRemove: string[]): Promise<void> {\n for (const p of toRemove) {\n await this._backend.deleteBlob(p)\n let ie: any = undefined\n const infoTxt = await this._backend.readBlob(p, 'info')\n if (infoTxt) ie = JSON.parse(infoTxt)\n if (ie && ie.state === 'base') {\n await this._backend.deleteBlob(p, 'info')\n }\n }\n }\n\n /**\n * \u8FFD\u52A0/\u66F4\u65B0\u3092\u9069\u7528\u3059\u308B\n * @param {string[]} toAddOrUpdate - \u8FFD\u52A0/\u66F4\u65B0\u5BFE\u8C61\u306E\u30D1\u30B9\u914D\u5217\n * @param {Record<string,string>} snapshot - \u30D1\u30B9->\u5185\u5BB9\u306E\u30DE\u30C3\u30D7\n * @param {Record<string,string>} newShas - \u30D1\u30B9->SHA\u306E\u30DE\u30C3\u30D7\n * @returns {Promise<void>}\n */\n private async _applyAddsOrUpdates(toAddOrUpdate: string[], snapshot: Record<string, string>, newShas: Record<string, string>): Promise<void> {\n for (const p of toAddOrUpdate) {\n const content = snapshot[p]\n const sha = newShas[p]\n await this._backend.writeBlob(p, content, 'base')\n let existing: any = undefined\n const infoTxt = await this._backend.readBlob(p, 'info')\n if (infoTxt) existing = JSON.parse(infoTxt)\n if (!existing) {\n const entry = { path: p, state: 'base', baseSha: sha, updatedAt: Date.now() }\n await this._backend.writeBlob(p, JSON.stringify(entry), 'info')\n } else if (existing.state === 'base') {\n existing.baseSha = sha\n existing.updatedAt = Date.now()\n await this._backend.writeBlob(p, JSON.stringify(existing), 'info')\n }\n }\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u306E\u8FFD\u52A0/\u66F4\u65B0\u3092\u51E6\u7406\u3059\u308B\n * @param {Record<string,string>} remoteShas - \u30EA\u30E2\u30FC\u30C8\u30B5\u30A4\u30B6SHA\u30DE\u30C3\u30D7\n * @param {Record<string,string>} baseSnapshot - \u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\n * @param {string} remoteHead - \u30EA\u30E2\u30FC\u30C8\u30D8\u30C3\u30C9SHA\n * @param {Array<any>} conflicts - \u3053\u3093\u3075\u308A\u30AF\u30C8\u914D\u5217\n * @param {any} [adapterInstance] - \u30AA\u30D7\u30B7\u30E7\u30F3\u306Eadapter instance\n * @param {RemoteSnapshotDescriptor} [_normalized] - \u6B63\u898B\u5316\u3055\u308C\u305Fremote\u60C5\u5831\n * @returns {Promise<void>}\n */\n private async _processRemoteAddsAndUpdates(remoteShas: Record<string, string>, baseSnapshot: Record<string, string>, remoteHead: string, conflicts: Array<any>, adapterInstance?: any, _normalized?: RemoteSnapshotDescriptor): Promise<void> {\n for (const [p, remoteSha] of Object.entries(remoteShas)) {\n await this._handleRemotePath(p, remoteSha, baseSnapshot, conflicts, remoteHead, adapterInstance, _normalized)\n }\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u306E\u524A\u9664\u3092\u51E6\u7406\u3059\u308B\n * @param {Record<string,string>} remoteShas - \u30EA\u30E2\u30FC\u30C8\u30B5\u30A4\u30B6SHA\u30DE\u30C3\u30D7\n * @param {Array<any>} conflicts - \u3053\u3093\u3075\u308A\u30AF\u30C8\u914D\u5217\n * @returns {Promise<void>}\n */\n private async _processRemoteDeletions(remoteShas: Record<string, string>, conflicts: Array<any>): Promise<void> {\n const infos = await this._backend.listFiles(undefined, 'info')\n for (const it of infos) {\n const p = it.path\n if (!(p in remoteShas)) {\n let indexEntry: any = undefined\n if (it.info) {\n indexEntry = JSON.parse(it.info)\n }\n await this._handleRemoteDeletion(p, indexEntry, remoteShas, conflicts)\n }\n }\n }\n\n /**\n * \u30D7\u30EB\u6642\u306B\u4E2A\u5225\u30D1\u30B9\u304C\u65E2\u306B\u6574\u5408\u6E08\u307F\u304B\u5224\u5B9A\u3059\u308B\n * @param {string} p - \u30D1\u30B9\n * @param {string} sha - SHA\n * @param {RemoteSnapshotDescriptor} normalized - \u6B63\u898B\u5316\u3055\u308C\u305Fremote\u60C5\u5831\n * @param {string[]} pathsToFetch - \u53D6\u5F97\u5BFE\u8C61\u30D1\u30B9\u914D\u5217\n * @param {string[]} reconciledPaths - \u6574\u5408\u6E08\u307F\u30D1\u30B9\u914D\u5217\n * @returns {Promise<boolean>} \u6574\u5408\u6E08\u307F\u306A\u3089true\n */\n private async _classifyRemotePathForPull(p: string, sha: string, normalized: RemoteSnapshotDescriptor, pathsToFetch: string[], reconciledPaths: string[]): Promise<boolean> {\n let entry: any = undefined\n const infoTxt = await this._backend.readBlob(p, 'info')\n if (infoTxt) entry = JSON.parse(infoTxt)\n if (!entry) return false\n if (entry.baseSha === sha) return true\n\n const baseContent = await this._backend.readBlob(p, 'base')\n if (baseContent !== null) {\n const gitSha = await shaOfGitBlob(baseContent)\n if (gitSha === sha) {\n entry.baseSha = sha\n entry.state = entry.state || 'base'\n entry.updatedAt = Date.now()\n await this._backend.writeBlob(p, JSON.stringify(entry), 'info')\n reconciledPaths.push(p)\n return true\n }\n }\n return false\n }\n\n /**\n * \u500B\u5225\u306E\u30EA\u30E2\u30FC\u30C8\u30D1\u30B9\u3092\u51E6\u7406\u3059\u308B\uFF08\u65B0\u898F/\u65E2\u5B58\u306E\u632F\u308A\u5206\u3051\u3092\u884C\u3046\uFF09\n * @param {string} p - \u30D1\u30B9\n * @param {string} perFileRemoteSha - \u30D5\u30A1\u30A4\u30EB\u3054\u3068\u306E\u30EA\u30E2\u30FC\u30C8SHA\n * @param {Record<string,string>} baseSnapshot - \u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\n * @param {Array<any>} conflicts - \u3053\u3093\u3075\u308A\u30AF\u30C8\u914D\u5217\n * @param {string} remoteHeadSha - \u30EA\u30E2\u30FC\u30C8\u30D8\u30C3\u30C9SHA\n * @param {any} [adapterInstance] - \u30AA\u30D7\u30B7\u30E7\u30F3\u306Eadapter instance\n * @param {RemoteSnapshotDescriptor} [_normalized] - \u6B63\u898B\u5316\u3055\u308C\u305Fremote\u60C5\u5831\n * @returns {Promise<void>}\n */\n private async _handleRemotePath(p: string, perFileRemoteSha: string, baseSnapshot: Record<string, string>, conflicts: Array<any>, remoteHeadSha: string, adapterInstance?: any, _normalized?: RemoteSnapshotDescriptor): Promise<void> {\n let indexEntry: any = undefined\n const infoTxt = await this._backend.readBlob(p, 'info')\n if (infoTxt) indexEntry = JSON.parse(infoTxt)\n let localWorkspace: { sha: string; content: string } | undefined = undefined\n const wsBlob = await this._backend.readBlob(p, 'workspace')\n if (wsBlob !== null) {\n const wsSha = indexEntry?.workspaceSha || await shaOf(wsBlob)\n localWorkspace = { sha: wsSha, content: wsBlob }\n }\n let localBase: { sha: string; content: string } | undefined = undefined\n const baseBlob = await this._backend.readBlob(p, 'base')\n if (baseBlob !== null && indexEntry?.baseSha) {\n localBase = { sha: indexEntry.baseSha, content: baseBlob }\n }\n\n if (!indexEntry) return await this._handleRemoteNew(p, perFileRemoteSha, baseSnapshot, conflicts, localWorkspace, localBase, remoteHeadSha, adapterInstance, _normalized)\n return await this._handleRemoteExisting(p, indexEntry, perFileRemoteSha, baseSnapshot, conflicts, localWorkspace, remoteHeadSha, adapterInstance, _normalized)\n }\n\n /**\n * \u65B0\u898F\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3059\u308B\u51E6\u7406\uFF08\u8FFD\u52A0 or conflict\uFF09\n * @param {string} p - \u30D1\u30B9\n * @param {string} perFileRemoteSha - \u30D5\u30A1\u30A4\u30EB\u3054\u3068\u306E\u30EA\u30E2\u30FC\u30C8SHA\n * @param {Record<string,string>} baseSnapshot - \u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\n * @param {Array<any>} conflicts - \u3053\u3093\u3075\u308A\u30AF\u30C8\u914D\u5217\n * @param {Object|undefined} localWorkspace - \u30ED\u30FC\u30AB\u30EB workspace sha/content\n * @param {Object|undefined} localBase - \u30ED\u30FC\u30AB\u30EB base sha/content\n * @param {string} remoteHeadSha - \u30EA\u30E2\u30FC\u30C8\u30D8\u30C3\u30C9SHA\n * @param {any} [adapterInstance] - \u30AA\u30D7\u30B7\u30E7\u30F3\u306Eadapter instance\n * @param {RemoteSnapshotDescriptor} [_normalized] - \u6B63\u898B\u5316\u3055\u308C\u305Fremote\u60C5\u5831\n * @returns {Promise<void>}\n */\n private async _handleRemoteNew(p: string, perFileRemoteSha: string, baseSnapshot: Record<string, string>, conflicts: Array<any>, localWorkspace: { sha: string; content: string } | undefined, localBase: { sha: string; content: string } | undefined, remoteHeadSha: string, adapterInstance?: any, _normalized?: RemoteSnapshotDescriptor): Promise<void> {\n const workspaceSha = localWorkspace ? localWorkspace.sha : undefined\n if (localWorkspace) {\n await this._handleRemoteNewConflict(p, baseSnapshot[p], remoteHeadSha, conflicts, workspaceSha, localBase?.sha, _normalized)\n return\n }\n await this._handleRemoteNewAdd(p, perFileRemoteSha, baseSnapshot, remoteHeadSha, conflicts, workspaceSha, localBase?.sha, adapterInstance, _normalized)\n }\n\n /**\n * \u65B0\u898F\u3067\u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u304C\u767A\u751F\u3057\u305F\u5834\u5408\u306E\u51E6\u7406\n * @param {string} p - \u30D1\u30B9\n * @param {string|undefined} content - \u30B3\u30F3\u30C6\u30F3\u30C4\n * @param {string} remoteHeadSha - \u30EA\u30E2\u30FC\u30C8\u30D8\u30C3\u30C9SHA\n * @param {Array<any>} conflicts - \u3053\u3093\u3075\u308A\u30AF\u30C8\u914D\u5217\n * @param {string} [workspaceSha] - \u30ED\u30FC\u30AB\u30EB workspace SHA\n * @param {string} [baseSha] - base SHA\n * @param {RemoteSnapshotDescriptor} [_normalized] - \u6B63\u898B\u5316\u3055\u308C\u305Fremote\u60C5\u5831\n * @returns {Promise<void>}\n */\n private async _handleRemoteNewConflict(p: string, content: string | undefined, remoteHeadSha: string, conflicts: Array<any>, workspaceSha: string | undefined, baseSha: string | undefined, _normalized?: RemoteSnapshotDescriptor): Promise<void> {\n await this._conflictManager.persistRemoteContentAsConflict(p, content)\n let ie: any = undefined\n const infoTxt = await this._backend.readBlob(p, 'info')\n if (infoTxt) ie = JSON.parse(infoTxt)\n if (!ie) ie = { path: p }\n await this._conflictManager.setIndexEntryToConflict(p, ie, remoteHeadSha)\n await this._indexManager.saveIndex()\n // v0.0.4: Store remote metadata (info) in conflict segment for on-demand fetching\n const remoteInfo = { path: p, baseSha: remoteHeadSha, state: 'conflict', updatedAt: Date.now() }\n await this._backend.writeBlob(p, JSON.stringify(remoteInfo), 'conflict')\n conflicts.push({ path: p, remoteSha: remoteHeadSha, workspaceSha, baseSha })\n }\n\n /**\n * \u65B0\u898F\u8FFD\u52A0\u3092\u51E6\u7406\u3059\u308B\n * @param {string} p - \u30D1\u30B9\n * @param {string} perFileRemoteSha - \u30D5\u30A1\u30A4\u30EB\u3054\u3068\u306E\u30EA\u30E2\u30FC\u30C8SHA\n * @param {Record<string,string>} _baseSnapshot - \u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\n * @param {string} _remoteHeadSha - \u30EA\u30E2\u30FC\u30C8\u30D8\u30C3\u30C9SHA\n * @param {Array<any>} _conflicts - \u3053\u3093\u3075\u308A\u30AF\u30C8\u914D\u5217\n * @param {string} [_workspaceSha] - \u30ED\u30FC\u30AB\u30EB workspace SHA\n * @param {string} [_baseSha] - base SHA\n * @param {any} [_adapterInstance] - \u30AA\u30D7\u30B7\u30E7\u30F3\u306Eadapter instance\n * @param {RemoteSnapshotDescriptor} [_normalized] - \u6B63\u898B\u5316\u3055\u308C\u305Fremote\u60C5\u5831\n * @returns {Promise<void>}\n */\n private async _handleRemoteNewAdd(p: string, perFileRemoteSha: string, _baseSnapshot: Record<string, string>, _remoteHeadSha: string, _conflicts: Array<any>, _workspaceSha: string | undefined, _baseSha: string | undefined, _adapterInstance?: any, _normalized?: RemoteSnapshotDescriptor): Promise<void> {\n // Metadata-first: always record info with baseSha. Defer base blob write until on-demand fetch.\n const entry = { path: p, state: 'base', baseSha: perFileRemoteSha, updatedAt: Date.now() }\n await this._backend.writeBlob(p, JSON.stringify(entry), 'info')\n // Note: base content is NOT eagerly fetched here. On-demand fetch occurs when readBlob('base') is required.\n }\n\n /**\n * \u65E2\u5B58\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3059\u308B\u66F4\u65B0/\u7AF6\u5408\u51E6\u7406\n * @param {string} p - \u30D1\u30B9\n * @param {any} indexEntry - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30F3\u30C8\u30EA\n * @param {string} perFileRemoteSha - \u30D5\u30A1\u30A4\u30EB\u3054\u3068\u306E\u30EA\u30E2\u30FC\u30C8SHA\n * @param {Record<string,string>} baseSnapshot - \u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\n * @param {Array<any>} conflicts - \u3053\u3093\u3075\u308A\u30AF\u30C8\u914D\u5217\n * @param {Object|undefined} localWorkspace - \u30ED\u30FC\u30AB\u30EB workspace sha/content\n * @param {string} remoteHeadSha - \u30EA\u30E2\u30FC\u30C8\u30D8\u30C3\u30C9SHA\n * @param {any} [adapterInstance] - \u30AA\u30D7\u30B7\u30E7\u30F3\u306Eadapter instance\n * @param {RemoteSnapshotDescriptor} [_normalized] - \u6B63\u898B\u5316\u3055\u308C\u305Fremote\u60C5\u5831\n * @returns {Promise<void>}\n */\n private async _handleRemoteExisting(p: string, indexEntry: any, perFileRemoteSha: string, baseSnapshot: Record<string, string>, conflicts: Array<any>, localWorkspace: { sha: string; content: string } | undefined, remoteHeadSha: string, adapterInstance?: any, _normalized?: RemoteSnapshotDescriptor): Promise<void> {\n const baseSha = indexEntry.baseSha\n if (baseSha === perFileRemoteSha) return\n if (!localWorkspace || localWorkspace.sha === baseSha) {\n await this._handleRemoteExistingUpdate(p, indexEntry, perFileRemoteSha, baseSnapshot, conflicts, remoteHeadSha, adapterInstance, _normalized)\n } else {\n await this._handleRemoteExistingConflict(p, indexEntry, perFileRemoteSha, baseSnapshot, conflicts, localWorkspace, remoteHeadSha, adapterInstance, _normalized)\n }\n }\n\n /**\n * \u65E2\u5B58\u30D5\u30A1\u30A4\u30EB\u306E\u66F4\u65B0\u51E6\u7406\n * @param {string} p - \u30D1\u30B9\n * @param {any} indexEntry - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30F3\u30C8\u30EA\n * @param {string} perFileRemoteSha - \u30D5\u30A1\u30A4\u30EB\u3054\u3068\u306E\u30EA\u30E2\u30FC\u30C8SHA\n * @param {Record<string,string>} _baseSnapshot - \u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\n * @param {Array<any>} _conflicts - \u3053\u3093\u3075\u308A\u30AF\u30C8\u914D\u5217\n * @param {string} _remoteHeadSha - \u30EA\u30E2\u30FC\u30C8\u30D8\u30C3\u30C9SHA\n * @param {any} [_adapterInstance] - \u30AA\u30D7\u30B7\u30E7\u30F3\u306Eadapter instance\n * @param {RemoteSnapshotDescriptor} [_normalized] - \u6B63\u898B\u5316\u3055\u308C\u305Fremote\u60C5\u5831\n * @returns {Promise<void>}\n */\n private async _handleRemoteExistingUpdate(p: string, indexEntry: any, perFileRemoteSha: string, _baseSnapshot: Record<string, string>, _conflicts: Array<any>, _remoteHeadSha: string, _adapterInstance?: any, _normalized?: RemoteSnapshotDescriptor): Promise<void> {\n // Metadata-first: update info to new baseSha; defer base blob write until requested.\n indexEntry.baseSha = perFileRemoteSha\n indexEntry.state = 'base'\n indexEntry.updatedAt = Date.now()\n await this._backend.writeBlob(p, JSON.stringify(indexEntry), 'info')\n // Note: base content is NOT eagerly fetched here. On-demand fetch occurs when readBlob('base') is required.\n }\n\n /**\n * \u65E2\u5B58\u30D5\u30A1\u30A4\u30EB\u3067\u7AF6\u5408\u304C\u767A\u751F\u3057\u305F\u5834\u5408\u306E\u51E6\u7406\n * @param {string} p - \u30D1\u30B9\n * @param {any} indexEntry - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30F3\u30C8\u30EA\n * @param {string} perFileRemoteSha - \u30D5\u30A1\u30A4\u30EB\u3054\u3068\u306E\u30EA\u30E2\u30FC\u30C8SHA\n * @param {Record<string,string>} baseSnapshot - \u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\n * @param {Array<any>} conflicts - \u3053\u3093\u3075\u308A\u30AF\u30C8\u914D\u5217\n * @param {Object} localWorkspace - \u30ED\u30FC\u30AB\u30EB workspace\n * @param {string} localWorkspace.sha - workspace sha\n * @param {string} localWorkspace.content - workspace content\n * @param {string} remoteHeadSha - \u30EA\u30E2\u30FC\u30C8\u30D8\u30C3\u30C9SHA\n * @param {any} [_adapterInstance] - \u30AA\u30D7\u30B7\u30E7\u30F3\u306Eadapter instance\n * @param {RemoteSnapshotDescriptor} [_normalized] - \u6B63\u898B\u5316\u3055\u308C\u305Fremote\u60C5\u5831\n * @returns {Promise<void>}\n */\n private async _handleRemoteExistingConflict(p: string, indexEntry: any, perFileRemoteSha: string, baseSnapshot: Record<string, string>, conflicts: Array<any>, localWorkspace: { sha: string; content: string }, remoteHeadSha: string, _adapterInstance?: any, _normalized?: RemoteSnapshotDescriptor): Promise<void> {\n const baseSha = indexEntry.baseSha\n await this._conflictManager.persistRemoteContentAsConflict(p, baseSnapshot[p])\n this._conflictManager.setIndexEntryToConflict(p, indexEntry, remoteHeadSha)\n await this._indexManager.saveIndex()\n // v0.0.4: Store remote metadata (info) in conflict segment for on-demand fetching\n const remoteInfo = { path: p, baseSha: perFileRemoteSha, state: 'conflict', updatedAt: Date.now() }\n await this._backend.writeBlob(p, JSON.stringify(remoteInfo), 'conflict')\n conflicts.push({ path: p, baseSha, remoteSha: remoteHeadSha, workspaceSha: localWorkspace?.sha })\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u3067\u524A\u9664\u3055\u308C\u305F\u30D1\u30B9\u306E\u51E6\u7406\n * @param {string} p - \u30D1\u30B9\n * @param {any} indexEntry - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30F3\u30C8\u30EA\n * @param {Record<string,string>} _remoteShas - \u30EA\u30E2\u30FC\u30C8\u30B5\u30A4\u30B6SHA\u30DE\u30C3\u30D7\n * @param {Array<any>} conflicts - \u3053\u3093\u3075\u308A\u30AF\u30C8\u914D\u5217\n * @returns {Promise<void>}\n */\n private async _handleRemoteDeletion(p: string, indexEntry: any, _remoteShas: Record<string, string>, conflicts: Array<any>): Promise<void> {\n let localWorkspace: { sha: string; content: string } | undefined = undefined\n const wsBlob = await this._backend.readBlob(p, 'workspace')\n if (wsBlob !== null) {\n const wsSha = indexEntry?.workspaceSha || await shaOf(wsBlob)\n localWorkspace = { sha: wsSha, content: wsBlob }\n }\n if (!indexEntry || !indexEntry.baseSha) {\n return\n }\n\n if (!localWorkspace || localWorkspace.sha === indexEntry.baseSha) {\n await this._backend.deleteBlob(p, 'info')\n await this._backend.deleteBlob(p)\n } else {\n conflicts.push({ path: p, baseSha: indexEntry.baseSha, workspaceSha: localWorkspace?.sha })\n }\n }\n\n /**\n * \u5909\u66F4\u3092\u30ED\u30FC\u30AB\u30EB\u306B\u9069\u7528\u3059\u308B\uFF08create/update/delete\uFF09\n * @param {any} ch - \u5909\u66F4\u4F5C\u696D\uFF08type, path, content \u3092\u542B\u3080\uFF09\n * @returns {Promise<void>}\n */\n private async _applyChangeLocally(ch: any): Promise<void> {\n if (ch.type === 'create' || ch.type === 'update') {\n const sha = await shaOf(ch.content)\n let entry: any = undefined\n const infoTxt = await this._backend.readBlob(ch.path, 'info')\n if (infoTxt) entry = JSON.parse(infoTxt)\n if (!entry) entry = { path: ch.path }\n entry.baseSha = sha\n entry.state = 'base'\n entry.updatedAt = Date.now()\n entry.workspaceSha = undefined\n await this._backend.writeBlob(ch.path, JSON.stringify(entry), 'info')\n await this._applier.applyCreateOrUpdate(ch)\n } else if (ch.type === 'delete') {\n await this._applier.applyDelete(ch)\n }\n }\n\n /**\n * On-demand: fetch and store base content for a single path when missing.\n * @param {string} path - \u30D1\u30B9\n * @param {any} [adapterInstance] - optional adapter instance to fetch remote content\n * @returns {Promise<string|null>} fetched content or null\n */\n async fetchBaseIfMissing(path: string, adapterInstance?: any): Promise<string | null> {\n // return existing base if present\n const existing = await this._backend.readBlob(path, 'base')\n if (existing !== null) return existing\n\n // read info to find baseSha\n const ie: any = await this._readInfoEntry(path)\n if (!ie || !ie.baseSha) return null\n const baseSha = ie.baseSha\n\n // Try GitHub-style adapter first\n const fromAdapter = await this._tryFetchBaseWithAdapter(adapterInstance, baseSha, path)\n if (fromAdapter !== undefined) return fromAdapter\n\n // Fallback: adapter may expose a raw file fetch API (GitLab-style)\n const rawFetch = await this._tryFetchRawFile(adapterInstance, path, ie)\n if (rawFetch !== undefined) return rawFetch\n\n return null\n }\n\n /**\n * Read and parse the stored info entry for `path`.\n * Returns parsed object or null when missing/invalid.\n * @param {string} path - \u30D1\u30B9\n * @returns {Promise<any|null>} parsed object or null\n */\n private async _readInfoEntry(path: string): Promise<any | null> {\n try {\n const infoTxt = await this._backend.readBlob(path, 'info')\n if (!infoTxt) return null\n try {\n return JSON.parse(infoTxt)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('parse infoTxt failed', path, error)\n return null\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('readBlob(info) failed', path, error)\n return null\n }\n }\n\n /**\n * Attempt to fetch base content using adapterInstance.getBlob.\n * Returns string when fetched, null when fetch attempted but failed, or undefined when adapter not supported.\n * @param {any} adapterInstance - adapter instance to fetch from\n * @param {string} baseSha - base SHA\n * @param {string} path - \u30D1\u30B9\n * @returns {Promise<string|null|undefined>} fetched content, null, or undefined\n */\n private async _tryFetchBaseWithAdapter(adapterInstance: any, baseSha: string, path: string): Promise<string | null | undefined> {\n if (!adapterInstance || typeof adapterInstance.getBlob !== 'function') return undefined\n try {\n const b = await adapterInstance.getBlob(baseSha)\n if (b && typeof b.content !== 'undefined') return await this._handleFetchedBlob(b, path)\n return null\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('adapter.getBlob failed', error)\n return null\n }\n }\n\n /**\n * Handle a fetched blob-like object: decode if base64 and persist into backend.\n * Returns decoded content string, or null on failure.\n * @param {any} b - blob-like object with content and encoding\n * @param {string} path - \u30D1\u30B9\n * @returns {Promise<string|null>} decoded content or null on failure\n */\n private async _handleFetchedBlob(b: any, path: string): Promise<string | null> {\n try {\n const enc = b.encoding || 'utf-8'\n const content = enc === 'base64' ? this._decodeBase64ToString((b.content || '').replace(/\\n/g, '')) : b.content\n await this._backend.writeBlob(path, content, 'base')\n return content\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('handleFetchedBlob failed', error)\n return null\n }\n }\n\n /**\n * Attempt to fetch raw file using adapterInstance._fetchFileRaw if available.\n * Returns string when fetched, null when attempted but failed, or undefined when adapter not supported.\n * @param {any} adapterInstance - adapter instance to fetch from\n * @param {string} path - \u30D1\u30B9\n * @param {any} ie - info entry\n * @returns {Promise<string|null|undefined>} fetched content, null, or undefined\n */\n private async _tryFetchRawFile(adapterInstance: any, path: string, ie: any): Promise<string | null | undefined> {\n if (!adapterInstance || typeof adapterInstance._fetchFileRaw !== 'function') return undefined\n try {\n const raw = await adapterInstance._fetchFileRaw(path, ie.branch || 'main')\n if (typeof raw === 'string') {\n await this._backend.writeBlob(path, raw, 'base')\n return raw\n }\n return null\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('adapter._fetchFileRaw failed', error)\n return null\n }\n }\n\n /**\n * Decode a base64 string into UTF-8 text. Uses global Buffer when available,\n * falls back to atob/TextDecoder for browsers.\n * @param {string} safe - base64 \u6587\u5B57\u5217\n * @returns {string} decoded UTF-8 string\n */\n private _decodeBase64ToString(safe: string): string {\n // Try Buffer-based decode first, then atob-based decode, otherwise return input\n const bufDecoded = this._tryDecodeWithBuffer(safe)\n if (typeof bufDecoded === 'string') return bufDecoded\n const atobDecoded = this._tryDecodeWithAtob(safe)\n if (typeof atobDecoded === 'string') return atobDecoded\n return safe\n }\n\n /**\n * Convert a binary string (result of atob) into a UTF-8 string.\n * @param {string} bin - binary string\n * @returns {string} decoded UTF-8 string\n */\n private _binToUtf8(bin: string): string {\n const length_ = bin.length\n const bytes = new Uint8Array(length_)\n for (let index = 0; index < length_; index++) bytes[index] = bin.charCodeAt(index)\n return (typeof TextDecoder !== 'undefined') ? new TextDecoder().decode(bytes) : String.fromCharCode.apply(null, Array.from(bytes))\n }\n\n /**\n * Try to decode base64 using a global Buffer if available.\n * Returns decoded string or undefined when Buffer not available.\n * @param {string} safe - base64 \u6587\u5B57\u5217\n * @returns {string|undefined} decoded string or undefined\n */\n private _tryDecodeWithBuffer(safe: string): string | undefined {\n try {\n const bufGlobal = (globalThis as any).Buffer\n if (typeof bufGlobal !== 'undefined' && typeof bufGlobal.from === 'function') {\n return bufGlobal.from(safe, 'base64').toString('utf8')\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('buffer decode failed', error)\n }\n return undefined\n }\n\n /**\n * Try to decode base64 using atob/TextDecoder in browser.\n * Returns decoded string or undefined when atob not available or parse fails.\n * @param {string} safe - base64 \u6587\u5B57\u5217\n * @returns {string|undefined} decoded string or undefined\n */\n private _tryDecodeWithAtob(safe: string): string | undefined {\n try {\n if (typeof atob !== 'function') return undefined\n const bin = atob(safe)\n return this._binToUtf8(bin)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('atob decode failed', error)\n return undefined\n }\n }\n}\n\nexport default RemoteSynchronizer\n", "\uFEFFimport { IndexFile, AdapterMeta, AdapterOptions, AdapterOptionsBase } from './types.ts'\nimport { parseAdapterFromUrl, buildUrlFromAdapterOptions } from './utils/urlParser.ts'\nimport { StorageBackend } from './storageBackend.ts'\nimport { OpfsStorage } from './opfsStorage.ts'\nimport { GitHubAdapter } from '../git/githubAdapter.ts'\nimport { GitLabAdapter } from '../git/gitlabAdapter.ts'\nimport { Logger } from '../git/abstractAdapter.ts'\nimport type { CommitHistoryQuery, CommitHistoryPage } from '../git/adapter.ts'\nimport type { BranchListQuery, BranchListPage, RepositoryMetadata } from './types.ts'\nimport { shaOf } from './hashUtils.ts'\nimport { LocalChangeApplier } from './localChangeApplier.ts'\nimport { LocalFileManager } from './localFileManager.ts'\nimport { IndexManager } from './indexManager.ts'\nimport { ChangeTracker } from './changeTracker.ts'\nimport { ConflictManager } from './conflictManager.ts'\nimport { RemoteSynchronizer } from './remoteSynchronizer.ts'\n\nexport type RemoteSnapshotDescriptor = {\n headSha: string\n shas: Record<string, string>\n fetchContent: (_paths: string[]) => Promise<Record<string, string>>\n}\n\n/** Virtual file system - \u6C38\u7D9A\u5316\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\u3092\u62BD\u8C61\u5316\u3057\u305F\u4EEE\u60F3\u30D5\u30A1\u30A4\u30EB\u30B7\u30B9\u30C6\u30E0 */\nexport class VirtualFS {\n // adapter instance managed by VirtualFS\n private adapter: any | null = null\n // optional logger injected via constructor options; propagated to adapters when present\n private logger?: Logger\n // adapter metadata persisted in index\n private adapterMeta: AdapterMeta | null = null\n // `workspace` state moved to StorageBackend implementations; tombstones are\n // persisted in the backend as `info` entries with `state: 'deleted'.`.\n private indexManager: IndexManager\n private backend: StorageBackend\n private applier: LocalChangeApplier\n private localFileManager: LocalFileManager\n private changeTracker: ChangeTracker\n private conflictManager: ConflictManager\n private remoteSynchronizer: RemoteSynchronizer\n\n /**\n * VirtualFS \u306E\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u3092\u521D\u671F\u5316\u3057\u307E\u3059\u3002\n * @param {Object} [options] - \u30AA\u30D7\u30B7\u30E7\u30F3\u30BB\u30C3\u30C8\n * @param {StorageBackend} [options.backend] - \u30B9\u30C8\u30EC\u30FC\u30B8\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\n * @param {Logger} [options.logger] - \u30ED\u30AC\u30FC\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\n * @returns {void}\n */\n constructor(options?: { backend?: StorageBackend; logger?: Logger }) {\n if (options?.backend) this.backend = options.backend\n else this.backend = new OpfsStorage('default')\n // capture optional logger for adapter propagation\n if (options && options.logger) this.logger = options.logger\n this.applier = new LocalChangeApplier(this.backend)\n this.localFileManager = new LocalFileManager(this.backend)\n this.indexManager = new IndexManager(this.backend)\n this.changeTracker = new ChangeTracker(this.backend, this.indexManager)\n this.conflictManager = new ConflictManager(this.backend, this.indexManager)\n this.remoteSynchronizer = new RemoteSynchronizer(this.backend, this.indexManager, this.conflictManager, this.applier)\n }\n\n /**\n * public-facing property accessors for backwards compatibility with tests\n * @returns {string}\n */\n get head(): string {\n return this.indexManager.getHead()\n }\n\n /**\n * Setter for head\n * @param {string} h - head value\n * @returns {void}\n */\n set head(h: string) {\n this.indexManager.setHead(h)\n }\n\n /**\n * Get lastCommitKey\n * @returns {string|undefined}\n */\n get lastCommitKey(): string | undefined {\n return this.indexManager.getLastCommitKey()\n }\n\n /**\n * Set lastCommitKey\n * @param {string|undefined} k\n * @returns {void}\n */\n set lastCommitKey(k: string | undefined) {\n this.indexManager.setLastCommitKey(k)\n }\n\n /**\n * VirtualFS \u306E\u521D\u671F\u5316\u3092\u884C\u3044\u307E\u3059\uFF08\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\u521D\u671F\u5316\u3068 index \u8AAD\u307F\u8FBC\u307F\uFF09\u3002\n * @returns {Promise<void>}\n */\n async init() {\n await this.backend.init()\n await this.loadIndex()\n }\n\n /**\n * \u6C38\u7D9A\u5316\u30EC\u30A4\u30E4\u30FC\u304B\u3089 index \u3092\u8AAD\u307F\u8FBC\u307F\u3001\u5185\u90E8\u30DE\u30C3\u30D7\u3092\u521D\u671F\u5316\u3057\u307E\u3059\u3002\n * @returns {Promise<void>}\n */\n private async loadIndex() {\n await this.indexManager.loadIndex()\n try {\n const index = await this.indexManager.getIndex()\n this.adapterMeta = (index as any).adapter || null\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('loadIndex getIndex failed', error)\n this.adapterMeta = null\n }\n }\n\n /**\n * Set adapter instance and persist adapter metadata into index file.\n * Supports overloads:\n * - setAdapter(meta: AdapterMeta)\n * - setAdapter(type: string, url: string, branch?: string, token?: string)\n * - setAdapter(url: string, branch?: string, token?: string)\n * @param {AdapterMeta|string} metaOrTypeOrUrl\n * @returns {Promise<void>}\n */\n async setAdapter(metaOrTypeOrUrl?: AdapterMeta | string) {\n // keep declared arity of 1 for backwards-compatible tests; use arguments for overloads\n const argument1 = (arguments as any)[1]\n const argument2 = (arguments as any)[2]\n const argument3 = (arguments as any)[3]\n const meta = this._parseAdapterArgs(metaOrTypeOrUrl as any, argument1, argument2, argument3)\n if (!meta || typeof meta.type !== 'string') throw new Error('Adapter meta is required')\n this.adapterMeta = meta\n await this._tryPersistAdapterMeta()\n }\n\n /**\n * Parse arguments for `setAdapter` and return a fully normalized AdapterMeta.\n * The result always has {type, url, branch, token, opts} at the top level.\n * Accepts AdapterMeta, (type, url, branch?, token?), or (url, branch?, token?).\n * @param metaOrTypeOrUrl AdapterMeta or type or url\n * @param argument1 url (when first is type) OR branch (when first is url) OR undefined\n * @param argument2 branch (when first is type) OR token (when first is url) OR undefined\n * @param argument3 token (when first is type) OR undefined\n * @returns normalized AdapterMeta\n */\n private _parseAdapterArgs(metaOrTypeOrUrl: AdapterMeta | string, argument1?: string, argument2?: string, argument3?: string): AdapterMeta {\n // Overload 1: object (AdapterMeta)\n if (typeof metaOrTypeOrUrl === 'object' && metaOrTypeOrUrl !== null) {\n return this._normalizeFromMeta(metaOrTypeOrUrl as AdapterMeta)\n }\n const firstArgument = metaOrTypeOrUrl as string\n // Distinguish \"type + url\" vs \"url only\": if argument1 looks like a URL (starts with http)\n // then firstArgument is a \"type\"; otherwise firstArgument is a URL itself.\n const isTypeUrlForm = typeof argument1 === 'string' && /^https?:\\/\\//i.test(argument1)\n if (isTypeUrlForm) {\n // Overload 2: setAdapter(type, url, branch?, token?)\n return this._normalizeFromTypeUrl(firstArgument, argument1!, argument2, argument3)\n }\n // Overload 3: setAdapter(url, branch?, token?)\n return this._normalizeFromUrl(firstArgument, argument1, argument2)\n }\n\n /**\n * Normalize from AdapterMeta object \u2013 generate url from opts if missing.\n * @param meta raw AdapterMeta input\n * @returns fully normalized AdapterMeta\n */\n private _normalizeFromMeta(meta: AdapterMeta): AdapterMeta {\n const type = meta.type\n const rawOptions = (meta as any).opts || (meta as any).options || {}\n const options = this._stripOptionsFields(rawOptions)\n let url = meta.url\n if (!url) {\n try { url = buildUrlFromAdapterOptions(type, options) } catch { url = undefined }\n }\n const branch = meta.branch || rawOptions.branch || 'main'\n const token = meta.token || rawOptions.token || undefined\n return { type, url, branch, token, opts: options }\n }\n\n /**\n * Normalize from (type, url, branch?, token?) arguments.\n * @param type adapter type\n * @param url repository url\n * @param branch optional branch (defaults to 'main')\n * @param token optional token\n * @returns fully normalized AdapterMeta\n */\n private _normalizeFromTypeUrl(type: string, url: string, branch?: string, token?: string): AdapterMeta {\n const parsed = parseAdapterFromUrl(url, token, type as any)\n const options = this._stripOptionsFields(parsed.opts || {})\n return { type: parsed.type, url, branch: branch || 'main', token, opts: options }\n }\n\n /**\n * Normalize from (url, branch?, token?) arguments.\n * @param url repository url\n * @param branch optional branch (defaults to 'main')\n * @param token optional token\n * @returns fully normalized AdapterMeta\n */\n private _normalizeFromUrl(url: string, branch?: string, token?: string): AdapterMeta {\n const parsed = parseAdapterFromUrl(url, token)\n const options = this._stripOptionsFields(parsed.opts || {})\n return { type: parsed.type, url, branch: branch || 'main', token, opts: options }\n }\n\n /**\n * Strip branch/token from options to avoid duplication (they live at the top level).\n * Returns a new object with only host, owner, repo, projectId, etc.\n * @param options raw adapter options\n * @returns cleaned options without branch/token\n */\n private _stripOptionsFields(options: any): AdapterOptions {\n if (!options || typeof options !== 'object') return {} as any\n const cleaned = { ...options }\n delete cleaned.branch\n delete cleaned.token\n delete cleaned.defaultBranch\n delete cleaned.repositoryName\n delete cleaned.repositoryId\n return cleaned as AdapterOptions\n }\n\n /**\n * Return the persisted branch name from adapterMeta (top-level or opts fallback).\n * Defaults to 'main' when not found.\n * @returns {string} persisted branch name\n */\n private _getPersistedBranch(): string {\n if (!this.adapterMeta) return 'main'\n return this.adapterMeta.branch || (this.adapterMeta.opts && this.adapterMeta.opts.branch) || 'main'\n }\n\n /**\n * Try to inject the configured logger into the adapter instance (best-effort).\n * @returns {Promise<void>}\n */\n private async _tryInjectLogger(): Promise<void> {\n try {\n if (this.adapter && this.logger && typeof (this.adapter as any).setLogger === 'function') {\n (this.adapter as any).setLogger(this.logger)\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('adapter.setLogger failed', error)\n }\n }\n\n /**\n * Persist adapter metadata into the index file (best-effort).\n * @returns {Promise<void>}\n */\n private async _tryPersistAdapterMeta(): Promise<void> {\n try {\n const index = await this.indexManager.getIndex()\n if (this.adapterMeta) (index as any).adapter = this.adapterMeta\n else delete (index as any).adapter\n await this.backend.writeIndex(index)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('writeIndex failed', error)\n }\n }\n\n /**\n * Return persisted adapter metadata from the index (or cached meta).\n * This does not necessarily instantiate the adapter instance; use\n * `getAdapterInstance()` to obtain an instantiated adapter.\n * @returns {Promise<any|null>}\n */\n async getAdapter(): Promise<any | null> {\n if (this.adapterMeta) return this.adapterMeta\n try {\n const index = await this.indexManager.getIndex()\n const persisted = (index as any).adapter || null\n // validate persisted shape\n if (persisted && typeof persisted.type === 'string') {\n this.adapterMeta = persisted as AdapterMeta\n return this.adapterMeta\n }\n this.adapterMeta = null\n return null\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('getAdapter getIndex failed', error)\n return null\n }\n }\n\n /**\n * Return or lazily create the adapter instance based on persisted metadata.\n * @returns {Promise<any|null>}\n */\n async getAdapterInstance(): Promise<any | null> {\n if (this.adapter) return this.adapter\n // ensure adapterMeta populated from loaded index\n if (!this.adapterMeta) await this._ensureAdapterMetaLoaded()\n if (!this.adapterMeta || !this.adapterMeta.type) return null\n const type = this.adapterMeta.type\n const options = this.adapterMeta.opts || {}\n // instantiate via helper to reduce cognitive complexity for linter\n const created = this._instantiateAdapter(type, options)\n if (created) this.adapter = created\n return this.adapter || null\n }\n\n /**\n * Load adapterMeta from index if not present.\n * @returns {Promise<void>}\n */\n private async _ensureAdapterMetaLoaded(): Promise<void> {\n try {\n const index = await this.indexManager.getIndex()\n this.adapterMeta = (index as any).adapter || null\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('getAdapterInstance helper getIndex failed', error)\n this.adapterMeta = null\n }\n }\n\n /**\n * Create adapter instance for given type and options. Returns null on failure.\n * @param {string} type - adapter type string\n * @param {any} options - adapter options\n * @returns {any|null}\n */\n private _instantiateAdapter(type: string, options: any): any | null {\n try {\n // Merge in token from top-level adapterMeta (stripped from opts to avoid duplication)\n // and logger if available so created adapters receive it via DI\n const optionsWithLogger = { ...(options || {}) } as any\n if (this.adapterMeta && this.adapterMeta.token && !optionsWithLogger.token) {\n optionsWithLogger.token = this.adapterMeta.token\n }\n if (this.logger) optionsWithLogger.logger = this.logger\n if (type === 'github') return new GitHubAdapter(optionsWithLogger)\n if (type === 'gitlab') return new GitLabAdapter(optionsWithLogger)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('instantiate adapter failed', error)\n return null\n }\n return null\n }\n\n /**\n * Helper: obtain backend listFilesRaw in a safe manner.\n * @returns {Promise<any[]>}\n */\n private async _getBackendFilesRaw(): Promise<any[]> {\n try {\n if (this.backend && typeof (this.backend as any).listFilesRaw === 'function') {\n return await (this.backend as any).listFilesRaw()\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_getBackendFilesRaw failed', error)\n }\n return []\n }\n\n /**\n * Helper: apply parsed info text into stats object when possible.\n * @param infoTxt raw info text\n * @param stats stats object to mutate\n * @returns {void}\n */\n private _applyInfoTxtToStats(infoTxt: any, stats: any): void {\n if (!infoTxt) return\n try {\n const info = JSON.parse(infoTxt)\n if (typeof info.baseSha === 'string') stats.gitBlobSha = info.baseSha\n if (typeof info.updatedAt === 'number') stats.mtime = new Date(info.updatedAt)\n if (typeof info.size === 'number') stats.size = info.size\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('parse info failed', error)\n }\n }\n\n /**\n * Find a matched backend entry for the given filepath.\n * @param filepath target filepath\n * @param filesRaw backend raw listing\n * @returns {any|null}\n */\n private _findMatchedFile(filepath: string, filesRaw: Array<any>): any | null {\n if (!Array.isArray(filesRaw)) return null\n return filesRaw.find((f: any) => {\n if (!f || !f.path) return false\n return f.path === filepath || f.path.endsWith('/' + filepath) || f.path.endsWith('\\/' + filepath)\n })\n }\n\n /**\n * Create default stats object with consistent shape.\n * @param now current Date\n * @returns {any}\n */\n private _createDefaultStats(now: Date): any {\n return {\n dev: 0,\n ino: 0,\n mode: 0o100644,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: 0,\n size: 0,\n blksize: undefined,\n blocks: undefined,\n atime: now,\n mtime: now,\n ctime: now,\n birthtime: now,\n /** @returns {boolean} */\n isFile: () => true,\n /** @returns {boolean} */\n isDirectory: () => false,\n }\n }\n /**\n * Populate stats.gitCommitSha from adapterMeta if available.\n * @param stats stats object to mutate\n * @returns {void}\n */\n private _populateCommitShaFromMeta(stats: any): void {\n const branch = this._getPersistedBranch()\n if (!stats.gitCommitSha && branch && branch !== 'main') {\n stats.gitCommitSha = branch\n }\n }\n\n /**\n * Try to resolve commit SHA from an instantiated adapter when needed.\n * @param stats stats object to mutate\n * @returns {Promise<void>}\n */\n private async _resolveCommitShaFromAdapter(stats: any): Promise<void> {\n const instAdapter = await this._safeGetAdapterInstance()\n if (!instAdapter || stats.gitCommitSha) return\n if (typeof instAdapter.resolveRef !== 'function') return\n try {\n const branch = this._getPersistedBranch()\n const resolved = await instAdapter.resolveRef(branch)\n if (resolved) stats.gitCommitSha = resolved\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_resolveCommitShaFromAdapter resolveRef failed', error)\n }\n }\n\n /**\n * Safely get adapter instance, returning null on error.\n * @returns {Promise<any|null>}\n */\n private async _safeGetAdapterInstance(): Promise<any | null> {\n try {\n return await this.getAdapterInstance()\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_safeGetAdapterInstance failed', error)\n return null\n }\n }\n\n /**\n * Helper: populate stats.gitCommitSha using adapterMeta or adapter.resolveRef when available.\n * @param stats stats object to mutate\n * @returns {Promise<void>}\n */\n private async _resolveAdapterCommitShaIfNeeded(stats: any): Promise<void> {\n this._populateCommitShaFromMeta(stats)\n if (!stats.gitCommitSha) await this._resolveCommitShaFromAdapter(stats)\n }\n\n /**\n * Determine whether a normalized path is an exact file entry in the provided entries.\n * @param normalizedDirectory normalized directory string\n * @param keys index keys array\n * @param entries index entries object\n * @returns {boolean}\n */\n private _isExactFile(normalizedDirectory: string, keys: string[], entries: any): boolean {\n return keys.includes(normalizedDirectory) && (entries as any)[normalizedDirectory] && (entries as any)[normalizedDirectory].state !== 'deleted'\n }\n\n /**\n * Collect immediate child names from index entries for given directory.\n * @param normalizedDirectory normalized directory string\n * @param entries index entries object\n * @returns {Set<string>} set of immediate child names\n */\n private _collectNamesFromIndex(normalizedDirectory: string, entries: any): Set<string> {\n const outNames = new Set<string>()\n const keys = Object.keys(entries || {})\n for (const k of keys) {\n const v = (entries as any)[k]\n if (v && v.state === 'deleted') continue\n\n if (normalizedDirectory === '.' || normalizedDirectory === '') {\n this._collectNamesFromIndexRoot(k, outNames)\n continue\n }\n\n this._processIndexKeyForDirectory(k, normalizedDirectory, outNames)\n }\n return outNames\n }\n\n /**\n * Process a single index key for a non-root directory and add immediate child when applicable.\n * @param key index key\n * @param normalizedDirectory normalized directory string\n * @param outNames set to mutate\n * @returns {void}\n */\n private _processIndexKeyForDirectory(key: string, normalizedDirectory: string, outNames: Set<string>): void {\n if (key === normalizedDirectory) return\n if (key.startsWith(normalizedDirectory + '/')) {\n const rest = key.slice(normalizedDirectory.length + 1)\n const first = rest.indexOf('/') === -1 ? rest : rest.slice(0, rest.indexOf('/'))\n outNames.add(first)\n }\n }\n\n /**\n * Safe wrapper for backend.listFiles returning [] on failure.\n * @param normalizedDirectory directory path\n * @returns {Promise<any[]>}\n */\n private async _getBackendList(normalizedDirectory: string): Promise<any[]> {\n try {\n return await (this.backend as any).listFiles(normalizedDirectory, undefined, false)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_getBackendList failed', error)\n return []\n }\n }\n\n /**\n * Helper for collecting names when scanning root directory entries.\n * @param key index key\n * @param outNames set to mutate\n * @returns {void}\n */\n private _collectNamesFromIndexRoot(key: string, outNames: Set<string>): void {\n const first = key.indexOf('/') === -1 ? key : key.slice(0, key.indexOf('/'))\n outNames.add(first)\n }\n\n /**\n * Check whether normalizedDirectory corresponds to an exact file entry.\n * @param normalizedDirectory normalized directory string\n * @param entries index entries object\n * @returns {boolean}\n */\n private _hasExactEntry(normalizedDirectory: string, entries: any): boolean {\n const keys = Object.keys(entries || {})\n return this._isExactFile(normalizedDirectory, keys, entries)\n }\n\n /**\n * Consult backend.listFiles to collect immediate child names for given directory.\n /**\n * Best-effort: logs and returns empty set on failure.\n * @param {string} normalizedDirectory - normalized directory string\n * @returns {Promise<Set<string>>}\n */\n private async _collectNamesFromBackend(normalizedDirectory: string): Promise<Set<string>> {\n const outNames = new Set<string>()\n if (!this._backendSupportsListFiles()) return outNames\n const backendList = await this._getBackendList(normalizedDirectory)\n if (!Array.isArray(backendList) || backendList.length === 0) return outNames\n for (const it of backendList) this._processBackendEntry(it, normalizedDirectory, outNames)\n return outNames\n }\n\n /**\n * Return true when backend supports listFiles\n * @returns {boolean}\n */\n private _backendSupportsListFiles(): boolean {\n return !!(this.backend && typeof (this.backend as any).listFiles === 'function')\n }\n\n /**\n * Process a single backend listFiles entry and add immediate child name to outNames when applicable.\n * @param it backend entry\n * @param normalizedDirectory normalized directory string\n * @param outNames set to mutate\n * @returns {void}\n */\n private _processBackendEntry(it: any, normalizedDirectory: string, outNames: Set<string>): void {\n try {\n if (!it || !it.path) return\n const p = it.path\n if (p === normalizedDirectory) return\n if (p.startsWith(normalizedDirectory + '/')) {\n const rest = p.slice(normalizedDirectory.length + 1)\n const first = rest.indexOf('/') === -1 ? rest : rest.slice(0, rest.indexOf('/'))\n outNames.add(first)\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_processBackendEntry failed', error)\n }\n }\n\n /**\n * Build Dirent-like lightweight objects for given names.\n * @param names array of names\n * @param keys array of index keys\n * @param entries index entries object\n * @param normalizedDirectory normalized directory string\n * @returns {Array<any>} array of Dirent-like objects\n */\n private _buildDirentTypes(names: string[], keys: string[], entries: any, normalizedDirectory: string): Array<any> {\n const out: Array<any> = []\n for (const name of names) {\n const childPath = normalizedDirectory === '.' ? name : `${normalizedDirectory}/${name}`\n const { isFile, isDirectory } = this._determineChildType(childPath, keys, entries)\n /** @returns {boolean} */\n const _isFileFunction = function () { return isFile && !isDirectory }\n /** @returns {boolean} */\n const _isDirectoryFunction = function () { return isDirectory }\n out.push({ name, isFile: _isFileFunction, isDirectory: _isDirectoryFunction })\n }\n return out\n }\n\n /**\n * Determine whether a childPath corresponds to a file, directory, or both.\n * @param childPath path of child\n * @param keys index keys\n * @param entries index entries\n * @returns {{isFile:boolean,isDirectory:boolean}}\n */\n private _determineChildType(childPath: string, keys: string[], entries: any): { isFile: boolean; isDirectory: boolean } {\n let isDirectory = false\n let isFile = false\n for (const k of keys) {\n if (k === childPath && (entries as any)[k] && (entries as any)[k].state !== 'deleted') {\n isFile = true\n }\n if (k.startsWith(childPath + '/')) {\n isDirectory = true\n break\n }\n }\n return { isFile, isDirectory }\n }\n\n /**\n * Return persisted adapter metadata (if any).\n * @returns {any|null}\n */\n getAdapterMeta(): any | null {\n return this.adapterMeta\n }\n\n /**\n * \u30D5\u30A1\u30A4\u30EB\u3092\u66F8\u304D\u8FBC\u307F\u307E\u3059\uFF08\u30ED\u30FC\u30AB\u30EB\u7DE8\u96C6\uFF09\u3002\n * @param {string} filepath \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @param {string} content \u30B3\u30F3\u30C6\u30F3\u30C4\n * @returns {Promise<void>}\n */\n async writeFile(filepath: string, content: string) {\n // delegate workspace write to LocalFileManager then reload index\n await this.localFileManager.writeFile(filepath, content)\n await this.loadIndex()\n }\n\n\n\n /**\n * rename \u3092 delete + create \u306E\u5408\u6210\u3067\u884C\u3046\u30D8\u30EB\u30D1\n * @param from \u5143\u30D1\u30B9\n * @param to \u65B0\u30D1\u30B9\n */\n async renameFile(from: string, to: string) {\n // Use readFile to obtain actual content from workspace, backend blob, or base.\n const content = await this.readFile(from)\n if (content === null) throw new Error('source not found')\n\n // create new workspace entry with the same content\n await this.writeFile(to, content)\n\n // delete original path (creates tombstone if base existed)\n await this.unlink(from)\n }\n\n /**\n * \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9/\u30D9\u30FC\u30B9\u304B\u3089\u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\u3092\u8AAD\u307F\u51FA\u3057\u307E\u3059\u3002\n * @param {string} filepath \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<string|null>} \u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\u307E\u305F\u306F null\n */\n async readFile(filepath: string) {\n // Try workspace/base first\n let content = await this.localFileManager.readFile(filepath)\n if (content !== null) return content\n\n // On-demand: attempt to fetch base via RemoteSynchronizer using adapter if available\n try {\n const adapter = await this.getAdapterInstance()\n if (adapter && this.remoteSynchronizer && typeof (this.remoteSynchronizer as any).fetchBaseIfMissing === 'function') {\n await (this.remoteSynchronizer as any).fetchBaseIfMissing(filepath, adapter)\n // re-check after on-demand fetch\n content = await this.localFileManager.readFile(filepath)\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('readFile on-demand fetch failed', error)\n }\n\n return content\n }\n\n /**\n * \u885D\u7A81\u30D5\u30A1\u30A4\u30EB\uFF08.git-conflict/\u914D\u4E0B\uFF09\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param {string} filepath \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<string|null>} \u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\u307E\u305F\u306F null\n */\n async readConflict(filepath: string) {\n return await this.conflictManager.readConflict(filepath)\n }\n\n /**\n * fs.stat \u4E92\u63DB: \u6307\u5B9A\u30D5\u30A1\u30A4\u30EB\u306E\u30E1\u30BF\u60C5\u5831\u3092\u8FD4\u3059\n * \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u4E0A\u306E\u60C5\u5831\u3092\u512A\u5148\u3057\u3001\u672A\u53D6\u5F97\u6642\u306F Git \u306E\u30E1\u30BF\u60C5\u5831\u3067\u88DC\u5B8C\u3059\u308B\u3002\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<any>} stats \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n async stat(filepath: string) {\n if (!filepath || typeof filepath !== 'string') throw new TypeError('filepath is required')\n\n // consult backend listing to determine workspace presence\n const filesRaw: Array<any> = await this._getBackendFilesRaw()\n const matched = this._findMatchedFile(filepath, filesRaw)\n\n const now = new Date()\n const stats: any = this._createDefaultStats(now)\n\n // try to read info blob to extract baseSha or other metadata\n try {\n const infoTxt = await (this.backend as any).readBlob(filepath, 'info')\n this._applyInfoTxtToStats(infoTxt, stats)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('stat readBlob failed', error)\n }\n\n // include workspace presence marker when matched\n if (matched) {\n stats.workspacePath = matched.path\n }\n\n // include adapter/commit/branch identifiers when possible\n await this._resolveAdapterCommitShaIfNeeded(stats)\n\n return stats\n }\n\n /**\n * fs.unlink \u4E92\u63DB: \u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\u3059\u308B\n * @param {string} filepath - \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<void>}\n */\n async unlink(filepath: string) {\n if (!filepath || typeof filepath !== 'string') throw new TypeError('filepath is required')\n // Delegate to LocalFileManager.deleteFile (workspace/internal)\n await this.localFileManager.deleteFile(filepath)\n await this.loadIndex()\n }\n\n /**\n * fs.mkdir \u4E92\u63DB (\u7C21\u6613\u5B9F\u88C5): workspace \u5074\u306B\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u60C5\u5831\u3092\u66F8\u304D\u8FBC\u3080\n * @param {string} dirpath - \u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30D1\u30B9\n * @param {Object} [_options] - optional options\n * @param {boolean} [_options.recursive] - recursive flag\n * @param {number} [_options.mode] - mode flag\n * @returns {Promise<void>}\n */\n async mkdir(dirpath: string, _options?: { recursive?: boolean; mode?: number }) {\n if (!dirpath || typeof dirpath !== 'string') throw new TypeError('dirpath is required')\n // Best-effort: create an info entry to mark directory\n const info = { path: dirpath, state: 'dir', createdAt: Date.now() }\n if (this.backend && typeof (this.backend as any).writeBlob === 'function') {\n await (this.backend as any).writeBlob(dirpath, JSON.stringify(info), 'info-workspace').catch((error: any) => { throw Object.assign(new Error('\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u4F5C\u6210\u5931\u6557'), { code: 'EEXIST', cause: error }) })\n }\n }\n\n /**\n * fs.rmdir \u4E92\u63DB (\u7C21\u6613\u5B9F\u88C5)\n * @param {string} dirpath - \u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30D1\u30B9\n * @param {Object} [options] - optional options\n * @param {boolean} [options.recursive] - recursive delete flag\n * @returns {Promise<void>}\n */\n async rmdir(dirpath: string, options?: { recursive?: boolean }) {\n if (!dirpath || typeof dirpath !== 'string') throw new TypeError('dirpath is required')\n // Build children list from the reconstructed index paths so that\n // workspace-local entries (as returned by listPaths) are accurately\n // detected regardless of backend-specific URI prefixes.\n const children = await this._listChildrenOfDir(dirpath)\n if (children.length > 0 && !(options && options.recursive)) {\n const errorObject: any = new Error('Directory not empty')\n errorObject.code = 'ENOTEMPTY'\n throw errorObject\n }\n if (options && options.recursive) await this._deleteChildrenRecursive(children)\n }\n\n /**\n * Return list of child paths for given dirpath based on index entries.\n * @param {string} dirpath - directory path\n * @returns {Promise<string[]>} array of child paths\n */\n private async _listChildrenOfDir(dirpath: string): Promise<string[]> {\n const paths = await this.listPaths()\n return paths.filter((p) => p === dirpath || p.startsWith(dirpath + '/'))\n }\n\n /**\n * Delete array of children using localFileManager, logging failures per-child.\n * @param {string[]} children - array of paths to delete\n * @returns {Promise<void>}\n */\n private async _deleteChildrenRecursive(children: string[]): Promise<void> {\n for (const p of children) {\n try {\n await this.localFileManager.deleteFile(p)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('rmdir recursive delete failed for', p, error)\n }\n }\n }\n\n /**\n * fs.readdir \u4E92\u63DB (\u7C21\u6613\u5B9F\u88C5)\n * @param {string} dirpath - \u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30D1\u30B9\n * @param {Object} [options] - optional options\n * @param {boolean} [options.withFileTypes] - withFileTypes flag\n * @returns {Promise<string[]|Array<any>>} file names or Dirent array\n */\n async readdir(dirpath: string, options?: { withFileTypes?: boolean }) {\n if (!dirpath || typeof dirpath !== 'string') throw new TypeError('dirpath is required')\n\n // Fast-path: obtain index entries once and operate on keys array\n const index = await this.indexManager.getIndex()\n const entries = (index && (index as any).entries) || {}\n const keys = Object.keys(entries)\n\n const names = await this._gatherDirectoryNames(dirpath, entries, keys)\n const maybeEmpty = this._returnIfNoNames(names, options)\n if (maybeEmpty !== null) return maybeEmpty\n\n const normalizedDirectory = dirpath === '' ? '.' : dirpath\n if (options && options.withFileTypes) return this._buildDirentTypes(names, keys, entries, normalizedDirectory)\n return names\n }\n\n /**\n * Return an empty array when names is empty according to options, else null to continue.\n * @param {string[]|null|undefined} names - array of names\n * @param {Object} [options] - readdir options\n * @param {boolean} [options.withFileTypes] - withFileTypes flag\n * @returns {Array<any>|null} empty array or null\n */\n private _returnIfNoNames(names: string[] | null | undefined, options?: { withFileTypes?: boolean }): Array<any> | null {\n if (!names || names.length === 0) return options && options.withFileTypes ? [] : []\n return null\n }\n\n /**\n * Gather immediate child names for a directory using index and backend as fallback.\n * Throws ENOTDIR when the path represents a file.\n * @param {string} dirpath - original directory path\n * @param {any} entries - index entries object\n * @param {string[]} keys - array of index keys\n * @returns {Promise<string[]>} immediate child names\n */\n private async _gatherDirectoryNames(dirpath: string, entries: any, keys: string[]): Promise<string[]> {\n const normalizedDirectory = dirpath === '' ? '.' : dirpath\n const outNames = new Set<string>()\n\n const isExactFile = this._isExactFile(normalizedDirectory, keys, entries)\n\n // collect from index\n const indexNames = this._collectNamesFromIndex(normalizedDirectory, entries)\n for (const n of indexNames) outNames.add(n)\n\n // fallback to backend when index had no children\n if (outNames.size === 0 && normalizedDirectory !== '.' && !isExactFile) {\n const backendNames = await this._collectNamesFromBackend(normalizedDirectory)\n for (const n of backendNames) outNames.add(n)\n }\n\n if (isExactFile && outNames.size === 0) {\n const errorObject: any = new Error('\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3067\u306F\u3042\u308A\u307E\u305B\u3093')\n errorObject.code = 'ENOTDIR'\n throw errorObject\n }\n\n if (outNames.size === 0) return []\n return Array.from(outNames)\n }\n\n /**\n * \u6307\u5B9A\u30D1\u30B9\u306E\u30EA\u30E2\u30FC\u30C8\u885D\u7A81\u30D5\u30A1\u30A4\u30EB (.git-conflict/) \u3092\u524A\u9664\u3057\u3066\n * \u7AF6\u5408\u3092\u89E3\u6D88\u6E08\u3068\u30DE\u30FC\u30AF\u3057\u307E\u3059\u3002\n * @param {string} filepath \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<boolean>} \u6210\u529F\u3057\u305F\u3089 true\n */\n async resolveConflict(filepath: string) {\n return await this.conflictManager.resolveConflict(filepath)\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u306E\u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u9069\u7528\u3057\u307E\u3059\u3002\n * @param {{[path:string]:string}} snapshot path->content \u306E\u30DE\u30C3\u30D7\n * @param {string} headSha \u30EA\u30E2\u30FC\u30C8 HEAD\n * @returns {Promise<void>}\n */\n private async applyBaseSnapshot(snapshot: Record<string, string>, headSha: string) {\n return await this.remoteSynchronizer.applyBaseSnapshot(snapshot, headSha)\n }\n\n /**\n * \u6307\u5B9A\u30A8\u30E9\u30FC\u304C non-fast-forward \u3092\u793A\u3059\u304B\u5224\u5B9A\u3057\u307E\u3059\u3002\n * @param {any} error - \u4F8B\u5916\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n * @returns {boolean}\n */\n private _isNonFastForwardError(error: any) {\n const message = String(error && error.message ? error.message : error)\n return message.includes('422') || /fast\\s*forward/i.test(message) || /not a fast forward/i.test(message)\n }\n\n /**\n * \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u60C5\u5831\u3092\u8FD4\u3057\u307E\u3059\u3002\n * @returns {Promise<IndexFile>}\n */\n async getIndex(): Promise<IndexFile> {\n return this.indexManager.getIndex()\n }\n\n /**\n * \u767B\u9332\u3055\u308C\u3066\u3044\u308B\u30D1\u30B9\u4E00\u89A7\u3092\u8FD4\u3057\u307E\u3059\u3002\n * @returns {string[]}\n */\n private async listPaths(): Promise<string[]> {\n // Build paths from the reconstructed index so that workspace-local\n // info (workspace/info) takes precedence over git-scoped info.\n const index = await this.indexManager.getIndex()\n const entries = (index && (index as any).entries) || {}\n const out: string[] = []\n for (const k of Object.keys(entries)) {\n const v = (entries as any)[k]\n if (v && v.state === 'deleted') continue\n out.push(k)\n }\n return out\n }\n\n /**\n * \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3068\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u304B\u3089\u5909\u66F4\u30BB\u30C3\u30C8\u3092\u751F\u6210\u3057\u307E\u3059\u3002\n * @returns {Promise<Array<{type:string,path:string,content?:string,baseSha?:string}>>} \u5909\u66F4\u30EA\u30B9\u30C8\n */\n async getChangeSet() {\n return await this.changeTracker.getChangeSet()\n }\n\n /**\n * \u30ED\u30FC\u30AB\u30EB\u306B\u5BFE\u3059\u308B\u5909\u66F4\uFF08create/update/delete\uFF09\u3092\u9069\u7528\u3059\u308B\u30D8\u30EB\u30D1\u30FC\n * @param {any} ch \u5909\u66F4\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n * @returns {Promise<void>}\n */\n private async _applyChangeLocally(ch: any) {\n if (ch.type === 'create' || ch.type === 'update') {\n const sha = await shaOf(ch.content)\n // Backend manages base segment persistence\n let entry: any = undefined\n const infoTxt = await this.backend.readBlob(ch.path, 'info')\n if (infoTxt) entry = JSON.parse(infoTxt)\n if (!entry) entry = { path: ch.path }\n entry.baseSha = sha\n entry.state = 'base'\n entry.updatedAt = Date.now()\n entry.workspaceSha = undefined\n await this.backend.writeBlob(ch.path, JSON.stringify(entry), 'info')\n\n // Delegate to LocalChangeApplier which will persist base and clean workspace in the correct order\n await this.applier.applyCreateOrUpdate(ch)\n } else if (ch.type === 'delete') {\n await this.applier.applyDelete(ch)\n }\n }\n\n /**\n * GitLab \u98A8\u306E actions \u30D9\u30FC\u30B9\u30B3\u30DF\u30C3\u30C8\u30D5\u30ED\u30FC\u3067 push \u3092\u5B9F\u884C\u3057\u307E\u3059\u3002\n * @param {any} adapter - adapter instance\n * @param {any} input - push input\n * @param {string} branch - branch name\n * @returns {Promise<{commitSha:string}>}\n */\n private async _pushWithActions(adapter: any, input: any, branch: string) {\n const commitSha = await adapter.createCommitWithActions(branch, input.message, input.changes as any[], input.parentSha)\n await this._tryUpdateRef(adapter, branch, commitSha)\n return await this._applyChangesAndFinalize(commitSha, input)\n }\n\n /**\n * GitHub \u98A8\u306E blob/tree/commit \u30D5\u30ED\u30FC\u3067 push \u3092\u5B9F\u884C\u3057\u307E\u3059\u3002\n * @param {any} adapter - adapter instance\n * @param {any} input - push input\n * @param {string} branch - branch name\n * @returns {Promise<{commitSha:string}>}\n */\n private async _pushWithGitHubFlow(adapter: any, input: any, branch: string) {\n const blobMap = await adapter.createBlobs(input.changes as any[])\n const changesWithBlob = (input.changes as any[]).map((c) => ({ ...c, blobSha: blobMap[c.path] }))\n // Attempt to base the new tree on the parent commit's tree so we only modify diffs\n let baseTreeSha: string | undefined = undefined\n if (input.parentSha && typeof (adapter as any).getCommitTreeSha === 'function') {\n try {\n baseTreeSha = await (adapter as any).getCommitTreeSha(input.parentSha)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('getCommitTreeSha failed, continuing without baseTree', error)\n baseTreeSha = undefined\n }\n }\n const treeSha = await adapter.createTree(changesWithBlob, baseTreeSha)\n const commitSha = await adapter.createCommit(input.message, input.parentSha, treeSha)\n await this._tryUpdateRef(adapter, branch, commitSha)\n return await this._applyChangesAndFinalize(commitSha, input)\n }\n\n /**\n * Try to update remote ref and handle common non-fast-forward errors.\n * Throws when the remote reports a non-fast-forward conflict.\n * @param {any} adapter - adapter instance\n * @param {string} branch - branch name\n * @param {string} commitSha - commit SHA\n * @returns {Promise<void>}\n */\n private async _tryUpdateRef(adapter: any, branch: string, commitSha: string) {\n if (typeof adapter.updateRef === 'function') {\n try {\n await adapter.updateRef(`heads/${branch}`, commitSha)\n } catch (error: any) {\n if (this._isNonFastForwardError(error)) {\n throw new Error('\u975E\u4E92\u63DB\u306A\u66F4\u65B0 (non-fast-forward): pull \u304C\u5FC5\u8981\u3067\u3059')\n }\n if (typeof console !== 'undefined' && (console as any).warn) (console as any).warn('updateRef failed (non-422), continuing locally:', error)\n }\n }\n }\n\n /**\n * Apply changes locally, update index head and persist index.\n * Returns the commit result object for callers.\n * @param {string} commitSha - commit SHA\n * @param {any} input - push input\n * @returns {Promise<{commitSha:string}>}\n */\n private async _applyChangesAndFinalize(commitSha: string, input: any) {\n for (const ch of input.changes as any[]) {\n await this._applyChangeLocally(ch)\n }\n this.indexManager.setHead(commitSha)\n await this.indexManager.saveIndex()\n return { commitSha }\n }\n\n /**\n * Handle push when an adapter is provided (delegates to _pushWithActions/_pushWithGitHubFlow).\n * Records commitKey in index metadata and returns the push result.\n * @param {any} input - push input\n * @param {any} adapter - adapter instance\n * @returns {Promise<{commitSha:string}>}\n */\n private async _handlePushWithAdapter(input: any, adapter: any) {\n const branch = (input as any).ref || this._getPersistedBranch()\n const messageWithKey = `${input.message}\\n\\napigit-commit-key:${input.commitKey}`\n // If adapter supports createCommitWithActions (GitLab style), use it directly\n if ((adapter as any).createCommitWithActions) {\n (input as any).message = messageWithKey\n const actionResult = await this._pushWithActions(adapter, input, branch)\n this.indexManager.setLastCommitKey(input.commitKey)\n await this.indexManager.saveIndex()\n return actionResult\n }\n\n // Fallback to GitHub-style flow\n (input as any).message = messageWithKey\n const gitHubFlowResult = await this._pushWithGitHubFlow(adapter, input, branch)\n this.indexManager.setLastCommitKey(input.commitKey)\n await this.indexManager.saveIndex()\n return gitHubFlowResult\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u53D6\u308A\u8FBC\u307F\u3001\u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u60C5\u5831\u3092\u8FD4\u3057\u307E\u3059\u3002\n * @param {RemoteSnapshotDescriptor|string|Object} remote - \u30EA\u30E2\u30FC\u30C8\u60C5\u5831\n * @param {Record<string,string>} [baseSnapshot] - path->content \u30DE\u30C3\u30D7\n * @returns {Promise<{conflicts:Array<import('./types').ConflictEntry>}>}\n */\n async pull(\n remote: RemoteSnapshotDescriptor | string | { fetchSnapshot: () => Promise<RemoteSnapshotDescriptor> },\n baseSnapshot?: Record<string, string>\n ) {\n // Support new v0.0.4 TDD-friendly option: allow calling `pull({ ref })`\n // or calling `pull()` to use persisted adapterMeta.opts.branch.\n const maybeOptions: any = remote as any\n if (maybeOptions && typeof maybeOptions.ref === 'string') {\n return await this._pullByRef(maybeOptions.ref, baseSnapshot)\n }\n if (remote === undefined || remote === null) {\n const noArgumentsResult = await this._handlePullNoArgs(baseSnapshot)\n if (noArgumentsResult) return noArgumentsResult\n }\n\n const descriptorRaw = await this._resolveDescriptor(remote, baseSnapshot)\n const normalized: RemoteSnapshotDescriptor =\n typeof descriptorRaw === 'string' ? await this._normalizeRemoteInput(descriptorRaw, baseSnapshot) : (descriptorRaw as RemoteSnapshotDescriptor)\n\n const preIndex = await this.getIndex()\n const preIndexKeys = Object.keys(preIndex.entries)\n\n const instAdapter = await this.getAdapterInstance()\n // v0.0.4: pull must NOT pass baseSnapshot to remoteSynchronizer\n // metadata-first: only fetch tree, base content deferred until on-demand\n const pullResult: any = await this.remoteSynchronizer.pull(normalized, undefined, instAdapter)\n\n const postIndex = await this.getIndex()\n const postIndexKeys = Object.keys(postIndex.entries)\n const preSet = new Set(preIndexKeys)\n const addedPaths = postIndexKeys.filter((k) => !preSet.has(k))\n const remotePaths = Object.keys(normalized.shas || {})\n\n return {\n ...pullResult,\n remote: normalized,\n remotePaths,\n preIndexKeys,\n postIndexKeys,\n addedPaths\n }\n }\n\n /**\n * Pull by a specified commit-ish reference. Resolves the ref, fetches snapshot and\n * delegates to remote synchronizer. Persists adapter branch meta on success.\n * @param {string} reference commit-ish to resolve\n * @param {Record<string,string>=} baseSnapshot optional base snapshot\n * @returns {Promise<any>} pull result\n */\n private async _pullByRef(reference: string, baseSnapshot?: Record<string, string>): Promise<any> {\n const instAdapter = await this.getAdapterInstance()\n if (!instAdapter) throw new Error('Adapter instance not available')\n if (typeof instAdapter.resolveRef !== 'function') throw new Error('Adapter does not support resolveRef')\n const resolvedSha = await instAdapter.resolveRef(reference)\n const descriptor = await instAdapter.fetchSnapshot(resolvedSha)\n const normalized: RemoteSnapshotDescriptor = typeof descriptor === 'string' ? await this._normalizeRemoteInput(descriptor, baseSnapshot) : (descriptor as RemoteSnapshotDescriptor)\n // Ensure backend uses requested branch scope before writing base/index\n await this._trySetBackendBranch(reference)\n // v0.0.4: pull must NOT pass baseSnapshot to remoteSynchronizer\n const pullResult: any = await this.remoteSynchronizer.pull(normalized, undefined, instAdapter)\n // on success persist requested ref into adapter metadata (branch)\n await this._persistAdapterBranchMeta(reference, instAdapter).catch((error) => {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('persisting adapter metadata failed', error)\n })\n return { ...pullResult, remote: normalized, remotePaths: Object.keys(normalized.shas || {}) }\n }\n\n /**\n * Pull using the persisted adapterMeta.branch (or 'main').\n * @param {Record<string,string>=} baseSnapshot optional base snapshot\n * @returns {Promise<any>} pull result\n */\n private async _pullUsingPersistedBranch(baseSnapshot?: Record<string, string>): Promise<any> {\n const instAdapter = await this.getAdapterInstance()\n const branch = this._getPersistedBranch()\n await this._trySetBackendBranch(branch)\n const resolvedSha = await instAdapter!.resolveRef(branch)\n const descriptor = await instAdapter!.fetchSnapshot(resolvedSha)\n const normalized: RemoteSnapshotDescriptor = typeof descriptor === 'string' ? await this._normalizeRemoteInput(descriptor, baseSnapshot) : (descriptor as RemoteSnapshotDescriptor)\n // v0.0.4: pull must NOT pass baseSnapshot to remoteSynchronizer\n const pullResult: any = await this.remoteSynchronizer.pull(normalized, undefined, instAdapter)\n // do not persist branch change (we used existing branch)\n return { ...pullResult, remote: normalized, remotePaths: Object.keys(normalized.shas || {}) }\n }\n\n /**\n * Handle the case when pull() is called with no args: try persisted adapter branch if possible.\n * Returns the pull result when handled, or null to indicate caller should continue.\n * @param {Record<string,string>=} baseSnapshot optional base snapshot\n * @returns {Promise<any|null>}\n */\n private async _handlePullNoArgs(baseSnapshot?: Record<string, string>): Promise<any | null> {\n const instAdapter = await this.getAdapterInstance()\n if (instAdapter && typeof instAdapter.resolveRef === 'function') {\n try {\n return await this._pullUsingPersistedBranch(baseSnapshot)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('pull using persisted branch failed, continuing with empty remote', error)\n return { remote: null, remotePaths: [], preIndexKeys: [], postIndexKeys: [], addedPaths: [] }\n }\n }\n return null\n }\n\n /**\n * Persist the requested branch into adapter metadata (best-effort).\n * @param {string} branch - branch name to persist\n * @param {any} [_adapterInstance] - optional adapter instance (unused)\n * @returns {Promise<void>}\n */\n private async _persistAdapterBranchMeta(branch: string, _adapterInstance: any): Promise<void> {\n const meta = (this.adapterMeta) ? { ...(this.adapterMeta) } : (await this.getAdapter())\n if (!meta) return\n const newMeta = { ...(meta || {}), branch, opts: { ...(meta.opts || {}) } }\n // persist only metadata (adapter instance not passed)\n await this.setAdapter(newMeta)\n // Also inform backend about branch scope when backend supports it\n await this._trySetBackendBranch(branch)\n\n }\n\n /**\n * Best-effort: set backend branch scope when backend supports it.\n * @param branch branch name to set\n * @returns {Promise<void>}\n */\n private async _trySetBackendBranch(branch: string): Promise<void> {\n try {\n if (this.backend && typeof (this.backend as any).setBranch === 'function') {\n ; (this.backend as any).setBranch(branch)\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('backend.setBranch failed', error)\n }\n }\n\n /**\n * Ensure adapterMeta is loaded from index when missing.\n * @returns {Promise<boolean>} true when adapterMeta is available\n */\n private async _loadAdapterMetaIfNeeded(): Promise<boolean> {\n if (this.adapterMeta) return true\n try {\n const index = await this.indexManager.getIndex()\n this.adapterMeta = (index as any).adapter || null\n return !!this.adapterMeta\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('loading adapterMeta failed', error)\n this.adapterMeta = null\n return false\n }\n }\n\n /**\n * Persist current adapterMeta into the index file (best-effort).\n * @returns {Promise<void>}\n */\n private async _writeAdapterMetaToIndex(): Promise<void> {\n try {\n const index = await this.indexManager.getIndex()\n ; (index as any).adapter = this.adapterMeta\n await this.backend.writeIndex(index)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('writing index failed', error)\n }\n }\n\n /**\n * Normalize remote input which may be a headSha or a full descriptor.\n * @param {RemoteSnapshotDescriptor | string} remote remote descriptor or headSha\n * @param {Record<string,string>=} baseSnapshot optional snapshot when remote is a headSha\n * @returns {Promise<RemoteSnapshotDescriptor>} normalized descriptor\n */\n private async _normalizeRemoteInput(remote: RemoteSnapshotDescriptor | string, baseSnapshot?: Record<string, string>): Promise<RemoteSnapshotDescriptor> {\n if (typeof remote !== 'string') return remote\n const snapshot = baseSnapshot || {}\n const shas: Record<string, string> = {}\n for (const [p, c] of Object.entries(snapshot)) shas[p] = await shaOf(c)\n /**\n * Fetch content for the requested paths from the provided snapshot.\n * @param {string[]} paths requested paths\n * @returns {Promise<Record<string,string>>} path->content map\n */\n async function fetchContent(paths: string[]): Promise<Record<string, string>> {\n const out: Record<string, string> = {}\n for (const p of paths) {\n if (p in snapshot) out[p] = snapshot[p]\n }\n return out\n }\n return { headSha: remote, shas, fetchContent }\n }\n\n /**\n * Obtain remote snapshot (via persisted adapter if available) and\n * compute simple diffs against the current index.\n * Returns an object containing the resolved `remote` descriptor (or null),\n * `remoteShas` map and `diffs` array (strings like `added: path` / `updated: path`).\n * @param {RemoteSnapshotDescriptor|string|Object} [remote] - remote descriptor\n * @returns {Promise<{remote: RemoteSnapshotDescriptor|null, remoteShas: Record<string,string>, diffs: string[]}>}\n */\n async getRemoteDiffs(\n remote?: RemoteSnapshotDescriptor | string | { fetchSnapshot: () => Promise<RemoteSnapshotDescriptor> }\n ): Promise<{ remote: RemoteSnapshotDescriptor | null; remoteShas: Record<string, string>; diffs: string[] }> {\n let resolved: RemoteSnapshotDescriptor | string | null = null\n try {\n resolved = await this._resolveDescriptor(remote as any, undefined)\n } catch {\n resolved = null\n }\n\n const normalized = await this._toNormalizedDescriptor(resolved)\n const remoteShas: Record<string, string> = normalized?.shas || {}\n\n const diffs: string[] = []\n const index = await this.getIndex().catch(() => null)\n if (!index) return { remote: normalized, remoteShas, diffs }\n\n for (const [p, sha] of Object.entries(remoteShas)) {\n const entry = index.entries[p]\n if (!entry) diffs.push(`added: ${p}`)\n else if (entry.baseSha !== sha) diffs.push(`updated: ${p}`)\n }\n\n return { remote: normalized, remoteShas, diffs }\n }\n\n /**\n * Delegate commit history listing to the underlying adapter when available.\n * Thin passthrough used by UI/CLI to retrieve commit summaries and paging info.\n * @param {CommitHistoryQuery} query\n * @returns {Promise<CommitHistoryPage>}\n */\n async listCommits(query: CommitHistoryQuery): Promise<CommitHistoryPage> {\n const instAdapter = await this.getAdapterInstance()\n if (!instAdapter || typeof instAdapter.listCommits !== 'function') {\n throw new Error('Adapter instance not available or does not support listCommits')\n }\n return await instAdapter.listCommits(query)\n }\n\n /**\n * Delegate branch listing to the underlying adapter when available.\n * @param {BranchListQuery} query\n * @returns {Promise<BranchListPage>}\n */\n async listBranches(query?: BranchListQuery): Promise<BranchListPage> {\n const instAdapter = await this.getAdapterInstance()\n if (!instAdapter || typeof instAdapter.listBranches !== 'function') {\n throw new Error('Adapter instance not available or does not support listBranches')\n }\n const result = await instAdapter.listBranches(query)\n // Try to persist repository metadata when available (best-effort)\n await this._maybePersistRepositoryMetadata(instAdapter, result).catch((error) => {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('persist repository metadata failed', error)\n })\n return result\n }\n\n /**\n * Create a remote-only branch via the configured adapter.\n * @param {{name:string, fromRef?:string}} input\n * @returns {Promise<import('./types.ts').CreateBranchResult>}\n */\n async createBranch(input: import('./types.ts').CreateBranchInput): Promise<import('./types.ts').CreateBranchResult> {\n if (!input || !input.name || typeof input.name !== 'string' || input.name.trim() === '') {\n throw new Error('branch name is required')\n }\n\n const instAdapter = await this.getAdapterInstance()\n if (!instAdapter) throw new Error('Adapter instance not available')\n if (typeof instAdapter.createBranch !== 'function') throw new Error('Adapter does not support createBranch')\n\n // Delegate resolution of the source ref to a helper to reduce complexity\n const resolvedFrom = await this._resolveCreateBranchFrom(input, instAdapter)\n\n const result = await instAdapter.createBranch(input.name, resolvedFrom)\n return result as import('./types.ts').CreateBranchResult\n }\n\n /**\n * Resolve a source reference for createBranch.\n * Preference order: explicit input.fromRef, index.head, adapter default branch.\n * Returns empty string when no resolution found.\n * @param {import('./types.ts').CreateBranchInput} input createBranch input\n * @param {any} instAdapter adapter instance\n * @returns {Promise<string>} resolved ref or empty string\n */\n private async _resolveCreateBranchFrom(input: import('./types.ts').CreateBranchInput, instAdapter: any): Promise<string> {\n // Prefer explicit input.fromRef\n if (input && input.fromRef && typeof input.fromRef === 'string' && input.fromRef.trim() !== '') return input.fromRef\n\n // Try persisted index head\n try {\n const index = await this.getIndex()\n if (index && (index as any).head) return (index as any).head\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('[createBranch] getIndex error: ' + String(error))\n }\n\n // Try adapter default branch resolution\n const adapterResolved = await this._resolveAdapterDefaultBranch(instAdapter)\n if (adapterResolved) return adapterResolved\n\n // fallback to empty string\n return ''\n }\n\n /**\n * Attempt to resolve the default branch via adapter metadata.\n * @param {any} instAdapter adapter instance\n * @returns {Promise<string|null>} resolved SHA or null when not found\n */\n private async _resolveAdapterDefaultBranch(instAdapter: any): Promise<string | null> {\n if (this.adapterMeta && this.adapterMeta.opts && typeof instAdapter.resolveRef === 'function') {\n try {\n const defaultBranch = this._getPersistedBranch()\n const resolved = await instAdapter.resolveRef(defaultBranch)\n return resolved || null\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('[createBranch] resolveRef error: ' + String(error))\n return null\n }\n }\n return null\n }\n\n /**\n * Convenience to get default branch name from adapter repository metadata.\n * Returns null when adapter not available.\n * @returns {Promise<string|null>}\n */\n async getDefaultBranch(): Promise<string | null> {\n const instAdapter = await this.getAdapterInstance()\n if (!instAdapter || typeof instAdapter.getRepositoryMetadata !== 'function') return null\n try {\n const md: RepositoryMetadata = await instAdapter.getRepositoryMetadata()\n if (md) await this._persistRepositoryMetadata(md)\n return md && md.defaultBranch ? md.defaultBranch : null\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('getDefaultBranch failed', error)\n return null\n }\n }\n\n /**\n * Persist repository metadata into IndexFile.adapter.opts for session persistence.\n /**\n * Best-effort: failures are ignored.\n * @param {RepositoryMetadata} md - metadata to persist\n * @returns {Promise<void>}\n */\n private async _persistRepositoryMetadata(md: RepositoryMetadata): Promise<void> {\n try {\n const have = await this._loadAdapterMetaIfNeeded()\n if (!have) return\n const existing = (this.adapterMeta && this.adapterMeta.opts) as AdapterOptions | undefined\n const options: Partial<AdapterOptionsBase> = existing ? { ...existing } : {}\n options.defaultBranch = md.defaultBranch\n if (md.name) options.repositoryName = md.name\n if (md.id !== undefined) options.repositoryId = md.id\n this.adapterMeta!.opts = { ...existing, ...options } as AdapterOptions\n await this._writeAdapterMetaToIndex()\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('persist repository metadata aborted', error)\n }\n }\n\n /**\n * Try persisting repository metadata when available. Best-effort.\n * @param instAdapter adapter instance or null\n * @param result branch list result used for fallback default branch detection\n * @returns {Promise<void>}\n */\n private async _maybePersistRepositoryMetadata(instAdapter: any | null, result: any): Promise<void> {\n try {\n if (instAdapter && typeof instAdapter.getRepositoryMetadata === 'function') {\n const md = await instAdapter.getRepositoryMetadata().catch(() => null)\n if (md) await this._persistRepositoryMetadata(md)\n } else {\n await this._persistDefaultBranchCandidate(result)\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('maybePersistRepositoryMetadata failed', error)\n }\n }\n\n /**\n * Extracted helper to persist default branch candidate derived from branch list.\n * @param result branch list result\n * @returns {Promise<void>}\n */\n private async _persistDefaultBranchCandidate(result: any): Promise<void> {\n try {\n const defaultBranchCandidate = Array.isArray(result.items) ? result.items.find((item: any) => item && item.isDefault) : undefined\n if (defaultBranchCandidate) {\n await this._persistRepositoryMetadata({ defaultBranch: defaultBranchCandidate.name, name: '', id: undefined })\n }\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('persistDefaultBranchCandidate failed', error)\n }\n }\n\n /**\n * Normalize a resolved descriptor (string headSha or object) into a\n * RemoteSnapshotDescriptor or null.\n * @param {RemoteSnapshotDescriptor|string|null} resolved descriptor or headSha\n * @returns {Promise<RemoteSnapshotDescriptor|null>} \u6B63\u898F\u5316\u3055\u308C\u305F descriptor \u307E\u305F\u306F null\n */\n private async _toNormalizedDescriptor(resolved: RemoteSnapshotDescriptor | string | null): Promise<RemoteSnapshotDescriptor | null> {\n if (!resolved) return null\n if (typeof resolved !== 'string') return resolved as RemoteSnapshotDescriptor\n try {\n return await this._normalizeRemoteInput(resolved, {})\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('_toNormalizedDescriptor normalize failed', error)\n return null\n }\n }\n\n /**\n * Resolve the provided `remote` parameter into either a headSha string or a full\n * `RemoteSnapshotDescriptor`. Centralizes adapter fetching and fallback behavior\n * to keep `pull()` small and easier to lint.\n * @param remote remote descriptor or adapter-like object or headSha\n * @param baseSnapshot optional snapshot used when normalizing a headSha\n * @returns {Promise<RemoteSnapshotDescriptor|string>} resolved descriptor or headSha\n */\n private async _resolveDescriptor(\n remote: RemoteSnapshotDescriptor | string | { fetchSnapshot: () => Promise<RemoteSnapshotDescriptor> } | undefined,\n baseSnapshot?: Record<string, string>\n ): Promise<RemoteSnapshotDescriptor | string> {\n const remoteLike: any = remote as any\n const isAdapterLike = remoteLike && typeof remoteLike === 'object' && typeof remoteLike.fetchSnapshot === 'function' && !('headSha' in remoteLike)\n\n if (isAdapterLike) {\n const fromAdapter = await this._fetchSnapshotFromAdapterInstance()\n if (!fromAdapter) throw new Error('Adapter instance not available')\n return fromAdapter\n }\n\n if (remote === undefined || remote === null) {\n const fromAdapter = await this._fetchSnapshotFromAdapterInstance()\n if (fromAdapter) return fromAdapter\n return await this._normalizeRemoteInput('', baseSnapshot || {})\n }\n\n return remote as any\n }\n\n /**\n * Try to obtain a snapshot descriptor from the persisted adapter instance.\n * @returns {Promise<RemoteSnapshotDescriptor|null>} snapshot descriptor or null when unavailable\n */\n private async _fetchSnapshotFromAdapterInstance(): Promise<RemoteSnapshotDescriptor | null> {\n const adapterInstance = await this.getAdapterInstance()\n if (adapterInstance && typeof adapterInstance.fetchSnapshot === 'function') {\n // prefer branch configured in persisted adapter metadata, default to 'main'\n const branch = this._getPersistedBranch()\n return await adapterInstance.fetchSnapshot(branch)\n\n }\n return null\n }\n\n /**\n * \u5909\u66F4\u3092\u30B3\u30DF\u30C3\u30C8\u3057\u3066\u30EA\u30E2\u30FC\u30C8\u3078\u53CD\u6620\u3057\u307E\u3059\u3002adapter \u304C\u7121\u3051\u308C\u3070\u30ED\u30FC\u30AB\u30EB\u30B7\u30DF\u30E5\u30EC\u30FC\u30B7\u30E7\u30F3\u3057\u307E\u3059\u3002\n * @param {import('./types').CommitInput} input \u30B3\u30DF\u30C3\u30C8\u5165\u529B\n * @returns {Promise<{commitSha:string}>}\n */\n async push(input: import('./types.ts').CommitInput) {\n // Ensure parentSha defaults to current index head when not provided\n await this._ensureParentSha(input)\n\n // Ensure changes default to current workspace change set when not provided\n if (input.changes === undefined || input.changes === null) {\n input.changes = await this.getChangeSet()\n }\n\n // generate commitKey for idempotency if not provided (must be set for adapter flows)\n if (!input.commitKey) {\n input.commitKey = await shaOf((input.parentSha || '') + JSON.stringify(input.changes))\n }\n\n // Try to obtain a persisted/instantiated adapter from this VirtualFS.\n // If adapter resolution throws, let the exception bubble up (TDD expectation).\n const instAdapter = await this.getAdapterInstance()\n if (!instAdapter) {\n // remoteSynchronizer fallback removed: adapters are required for push in v0.0.4\n throw new Error('Adapter instance not available')\n }\n\n return await this._handlePushWithAdapter(input, instAdapter)\n }\n\n /**\n * Ensure `input.parentSha` is a string; prefer current index head when available.\n * @param input CommitInput\n */\n private async _ensureParentSha(input: import('./types.ts').CommitInput) {\n if (input.parentSha === undefined || input.parentSha === null) {\n try {\n const index = await this.getIndex()\n // `CommitInput.parentSha` is typed as string; use empty string when head is unavailable\n input.parentSha = (index && (index as any).head) || ''\n } catch (error) {\n // propagate as empty string to satisfy type expectations\n input.parentSha = ''\n }\n }\n }\n}\n\nexport default VirtualFS\n\n", "\uFEFFimport { IndexFile } from './types.ts'\nimport { StorageBackend, StorageBackendConstructor, Segment } from './storageBackend.ts'\n\n/**\n * IndexedDB \u3092\u7528\u3044\u305F\u6C38\u7D9A\u5316\u5B9F\u88C5\n */\nexport const IndexedDatabaseStorage: StorageBackendConstructor = class IndexedDatabaseStorage implements StorageBackend {\n /**\n * \u74B0\u5883\u306B IndexedDB \u304C\u5B58\u5728\u3059\u308B\u304B\u3092\u540C\u671F\u691C\u67FB\u3057\u307E\u3059\u3002\n * @returns {boolean} \u5229\u7528\u53EF\u80FD\u306A\u3089 true\n */\n static canUse(): boolean {\n try {\n return !!(globalThis as any).indexedDB\n } catch {\n return false\n }\n }\n private dbName: string\n private dbPromise: Promise<IDBDatabase>\n private currentBranch: string | null = null\n private root: string | undefined\n private rootPrefix: string = ''\n private static VAR_WORKSPACE_BASE = 'workspace'\n // Historically this was a separate workspace-info store, but some test\n // fakes expect info entries to be available in 'git-info'. Alias the\n // workspace-info identifier to the git-info table so fakes using a\n // unified info store behave correctly.\n private static VAR_WORKSPACE_INFO = 'git-info'\n private static VAR_BASE = 'git-base'\n private static VAR_CONFLICT = 'git-conflict'\n private static VAR_INFO = 'git-info'\n private static DEFAULT_DB_NAME = 'apigit_storage'\n\n\n /** \u5229\u7528\u53EF\u80FD\u306A DB \u540D\u306E\u4E00\u89A7\u3092\u8FD4\u3059\n * @param {string} [namespace] Optional namespace to filter roots\n * @returns {Promise<string[]>} available root names\n */\n static async availableRoots(namespace?: string): Promise<string[]> {\n const g: any = globalThis as any\n const idb = g.indexedDB\n if (!idb) return []\n\n // If indexedDB.databases is not supported, return empty list\n if (typeof idb.databases !== 'function') return []\n\n try {\n const names = await IndexedDatabaseStorage._namesFromDatabases(idb)\n // If no namespace specified, return the list of DB names (legacy behavior)\n if (!namespace) return names\n // If namespace matches an existing DB name, return a default root candidate\n if (names.includes(namespace)) return ['apigit_storage']\n return []\n } catch {\n return []\n }\n }\n\n /**\n * Retrieve unique database names from `indexedDB.databases()` result.\n * @param {any} idb IndexedDB global object\n * @returns {Promise<string[]>} unique database names\n */\n private static async _namesFromDatabases(idb: any): Promise<string[]> {\n const databases = await idb.databases()\n const names: string[] = []\n for await (const entry of (databases as any)) {\n if (entry && typeof entry.name === 'string') names.push(entry.name)\n }\n return Array.from(new Set(names))\n }\n\n /** \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\n * @param {string} namespace Database namespace\n * @param {string} [_root] Optional root directory prefix\n */\n constructor(namespace: string, _root?: string) {\n this.dbName = namespace || IndexedDatabaseStorage.DEFAULT_DB_NAME\n this.root = _root || undefined\n this.rootPrefix = this.root ? `${this.root}_` : ''\n // Kick off DB open immediately so dbPromise is always defined\n this.dbPromise = this.openDb()\n }\n\n /**\n * \u521D\u671F\u5316: DB \u3092\u30AA\u30FC\u30D7\u30F3\u3059\u308B\u307E\u3067\u5F85\u3064\n * @returns {Promise<void>} \u521D\u671F\u5316\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async init(): Promise<void> {\n await this.dbPromise\n }\n\n /**\n * DB \u3092\u958B\u3044\u3066 objectStore \u3092\u521D\u671F\u5316\u3059\u308B\n * @returns {Promise<IDBDatabase>} Opened IDBDatabase\n */\n private openDb(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const idb = (globalThis as any).indexedDB\n if (!idb) return reject(new Error('IndexedDB is not available'))\n const request = idb.open(this.dbName, 1)\n // Do not include test-only fallbacks in library code. If `open()`\n // returns a falsy value, treat it as an unsupported environment\n // and reject; test suites should provide a proper `indexedDB` shim\n // in their setup (e.g. `test/setupIndexedDB.js`).\n if (!request) return reject(new Error('indexedDB.open returned falsy request'))\n /**\n * Handle DB upgrade event\n * @param {any} event Upgrade event\n * @returns {void}\n */\n request.onupgradeneeded = (event: any) => this._handleUpgrade(event)\n /**\n * Handle open success\n * @returns {void}\n */\n request.onsuccess = () => this._onOpenSuccess(request, resolve)\n /**\n * Handle open error\n * @returns {void}\n */\n request.onerror = () => this._onOpenError(request, reject)\n })\n }\n\n /**\n * Handle DB upgrade event and create required object stores.\n * Creates the object stores used by this backend, names are resolved\n * through `_storeName` to include any configured `_root` prefix.\n * @param {any} event - Upgrade event from `indexedDB.open`\n * @returns {void}\n */\n private _handleUpgrade(event: any): void {\n const database = (event.target as IDBOpenDBRequest).result\n if (!database.objectStoreNames.contains(this._storeName(IndexedDatabaseStorage.VAR_WORKSPACE_BASE))) database.createObjectStore(this._storeName(IndexedDatabaseStorage.VAR_WORKSPACE_BASE))\n if (!database.objectStoreNames.contains(this._storeName(IndexedDatabaseStorage.VAR_WORKSPACE_INFO))) database.createObjectStore(this._storeName(IndexedDatabaseStorage.VAR_WORKSPACE_INFO))\n if (!database.objectStoreNames.contains(this._storeName(IndexedDatabaseStorage.VAR_BASE))) database.createObjectStore(this._storeName(IndexedDatabaseStorage.VAR_BASE))\n if (!database.objectStoreNames.contains(this._storeName(IndexedDatabaseStorage.VAR_CONFLICT))) database.createObjectStore(this._storeName(IndexedDatabaseStorage.VAR_CONFLICT))\n if (!database.objectStoreNames.contains(this._storeName(IndexedDatabaseStorage.VAR_INFO))) database.createObjectStore(this._storeName(IndexedDatabaseStorage.VAR_INFO))\n if (!database.objectStoreNames.contains(this._storeName('index'))) database.createObjectStore(this._storeName('index'))\n }\n\n /**\n * Create a handler to close DB on version change.\n * @param {IDBDatabase} databaseParameter Target DB\n * @returns {() => void}\n */\n private _makeVersionChangeHandler(databaseParameter: IDBDatabase) {\n return () => { databaseParameter.close() }\n }\n\n /**\n * Called when DB open succeeds.\n * @param {IDBOpenDBRequest} request IDB open request\n * @param {(_database: IDBDatabase) => void} resolve Resolver for the open promise\n * @returns {void}\n */\n private _onOpenSuccess(request: IDBOpenDBRequest, resolve: (_database: IDBDatabase) => void) {\n const database = request.result\n database.onversionchange = this._makeVersionChangeHandler(database)\n resolve(database)\n }\n\n /**\n * Called when DB open errors.\n * @param {IDBOpenDBRequest} request IDB open request\n * @param {(_error?: any) => void} reject Reject function for the open promise\n * @returns {void}\n */\n private _onOpenError(request: IDBOpenDBRequest, reject: (_error?: any) => void) {\n reject(request.error)\n }\n\n /**\n * \u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u30E9\u30C3\u30D1\u30FC\u3002cb \u5185\u306E\u51E6\u7406\u3092\u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u3067\u5B9F\u884C\u3057\u3001\u5FC5\u8981\u306A\u3089\u518D\u8A66\u884C\u3057\u307E\u3059\u3002\n * @param {string} storeName Store name\n * @param {IDBTransactionMode} mode Transaction mode\n * @param {(_store: IDBObjectStore) => void | Promise<void>} callback Transaction callback\n * @returns {Promise<void>} \u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u51E6\u7406\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n private async tx(storeName: string, mode: IDBTransactionMode, callback: (_store: IDBObjectStore) => void | Promise<void>): Promise<void> {\n const physical = this._storeName(storeName)\n try { return await this._performTxAttempt(physical, mode, callback) } catch (error: any) {\n const isInvalidState = error && (error.name === 'InvalidStateError' || /closing/i.test(String(error.message || '')))\n if (isInvalidState) { this.dbPromise = this.openDb(); return await this._performTxAttempt(physical, mode, callback) }\n throw error\n }\n }\n\n /**\n * \u5358\u4E00\u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u8A66\u884C\u5B9F\u884C\u3092\u884C\u3044\u307E\u3059\u3002\n * @param {string} storeName Store name\n * @param {IDBTransactionMode} mode Transaction mode\n * @param {(_store: IDBObjectStore) => void | Promise<void>} callback Transaction callback\n * @returns {Promise<void>} \u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u51E6\u7406\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n private async _performTxAttempt(storeName: string, mode: IDBTransactionMode, callback: (_store: IDBObjectStore) => void | Promise<void>): Promise<void> {\n const database = await this.dbPromise\n return new Promise<void>((resolve, reject) => {\n try {\n const { tx, proxyStore, getHasRequests } = this._beginTransaction(database, storeName, mode)\n /**\n * Transaction complete handler\n * @param {IDBTransaction} tx Transaction\n * @param {() => void} onComplete Complete callback\n * @param {() => void} onError Error callback\n * @param {boolean} hasRequests Whether requests were produced\n * @returns {void}\n */\n const handleTxComplete = () => { resolve() }\n /**\n * Transaction error handler\n * @returns {void}\n */\n const handleTxError = () => { reject(tx.error) }\n Promise.resolve(callback(proxyStore)).then(() => {\n this._finalizeTxSetup(tx, handleTxComplete, handleTxError, getHasRequests())\n }).catch(reject)\n } catch (error) {\n return reject(error)\n }\n })\n }\n\n /**\n * Begin a transaction and return a proxied store along with a getter for request activity.\n * @param {IDBDatabase} database open IDBDatabase\n * @param {string} storeName store name\n * @param {IDBTransactionMode} mode transaction mode\n * @returns {{tx:IDBTransaction, proxyStore:any, getHasRequests:() => boolean}}\n */\n private _beginTransaction(database: IDBDatabase, storeName: string, mode: IDBTransactionMode) {\n const tx = database.transaction(storeName, mode)\n const storeObject = tx.objectStore(storeName)\n let hasRequests = false\n const requestProducing = new Set(['put', 'get', 'delete', 'add', 'openCursor', 'openKeyCursor', 'clear'])\n /**\n * Mark that request-producing calls were observed in the proxy.\n * @param {boolean} v indicator that requests were produced\n * @returns {void}\n */\n const setHasRequests = (v: boolean) => { hasRequests = v }\n const proxyStore = this._createProxyForStore(storeObject as any, requestProducing, setHasRequests)\n /**\n * Return whether the proxied store observed request-producing calls.\n * @returns {boolean}\n */\n const getHasRequests = () => hasRequests\n return { tx, proxyStore, getHasRequests }\n }\n\n /**\n * Finalize transaction handlers and schedule completion when no requests observed.\n * @param {IDBTransaction} tx IndexedDB transaction\n * @param {() => void} onComplete Completion handler\n * @param {() => void} onError Error handler\n * @param {boolean} hasRequests Whether requests were produced\n * @returns {void}\n */\n private _finalizeTxSetup(tx: IDBTransaction, onComplete: () => void, onError: () => void, hasRequests: boolean): void {\n tx.oncomplete = onComplete\n tx.onerror = onError\n if (!hasRequests) {\n try {\n this._scheduleTxComplete(tx)\n } catch (error) {\n console.debug('scheduling tx completion failed', error)\n }\n }\n }\n\n /**\n * Create a proxy wrapper for an IDBObjectStore that detects whether\n * request-producing methods were invoked.\n * @param {any} storeObject IDB object store\n * @param {Set<string>} requestProducing Set of request-producing method names\n * @param {(_value: boolean) => void} setHasRequests Callback to set hasRequests flag\n * @returns {Proxy<any>} proxied store object\n */\n private _createProxyForStore(storeObject: any, requestProducing: Set<string>, setHasRequests: (_value: boolean) => void) {\n return new Proxy(storeObject, {\n /**\n * Proxy get handler. Detect calls to request-producing methods.\n * @param {any} target Target object\n * @param {string|symbol} property Property name\n * @param {any} _receiver Receiver object\n * @returns {any}\n */\n get: (target: any, property: string | symbol, _receiver: any) => {\n const orig = target[property]\n if (typeof orig === 'function') {\n return this._wrapStoreMethod(target, property, orig, requestProducing, setHasRequests)\n }\n return orig\n }\n })\n }\n\n /**\n * Wrap a store method to detect request-producing calls and invoke original.\n * @param {any} target Target object\n * @param {string|symbol} property Property name\n * @param {any} orig Original function\n * @param {Set<string>} requestProducing Set of request-producing method names\n * @param {(_value: boolean) => void} setHasRequests Callback to set hasRequests flag\n * @returns {Function}\n */\n private _wrapStoreMethod(target: any, property: string | symbol, orig: any, requestProducing: Set<string>, setHasRequests: (_value: boolean) => void) {\n return (...arguments_: any[]) => {\n try {\n if (typeof property === 'string' && requestProducing.has(property)) setHasRequests(true)\n } catch (error) {\n console.debug('proxy property detection failed', error)\n }\n return orig.apply(target, arguments_)\n }\n }\n\n /**\n * Schedule a microtask to invoke tx.oncomplete in case fake IndexedDB\n * implementations never fire it.\n * @param {IDBTransaction} tx IndexedDB transaction\n * @returns {void}\n */\n private _scheduleTxComplete(tx: IDBTransaction) {\n setTimeout(() => {\n try {\n if (typeof tx.oncomplete === 'function') tx.oncomplete(new Event('complete'))\n } catch (error) {\n console.debug('tx.oncomplete invocation failed', error)\n }\n }, 0)\n }\n\n /**\n * index \u3092\u8AAD\u307F\u51FA\u3059\n * @returns {Promise<IndexFile|null>} \u8AAD\u307F\u51FA\u3057\u305F IndexFile\u3001\u5B58\u5728\u3057\u306A\u3051\u308C\u3070 null\n */\n async readIndex(): Promise<IndexFile | null> {\n const database = await this.dbPromise\n // Read meta from 'index' store then reconstruct entries from VAR_INFO\n const meta: IndexFile | null = await this._readIndexMeta(database)\n const result: IndexFile = { head: '', entries: {} }\n if (meta) {\n this._applyMetaToResult(meta, result)\n }\n\n // Load workspace-local info first (workspace-info), then merge git-scoped info (.git/{branch}/info)\n await this._loadWorkspaceInfoEntries(result)\n await this._loadGitScopedInfoEntries(result)\n\n return result\n }\n\n /**\n * Apply metadata object to result IndexFile and set currentBranch if present.\n * @param {IndexFile} meta Metadata to apply\n * @param {IndexFile} result Result IndexFile to update\n * @returns {void}\n */\n private _applyMetaToResult(meta: IndexFile, result: IndexFile): void {\n result.head = meta.head || ''\n if ((meta as any).lastCommitKey) result.lastCommitKey = (meta as any).lastCommitKey\n // Preserve adapter metadata if present\n if ((meta as any).adapter) result.adapter = (meta as any).adapter\n // set current branch from persisted adapter metadata so we only load info for that branch\n try {\n const adp = (meta as any).adapter\n this.currentBranch = adp && (adp.branch || (adp.opts && adp.opts.branch)) ? (adp.branch || adp.opts.branch) : null\n } catch {\n this.currentBranch = null\n }\n }\n\n /**\n * Load workspace-local info entries into result.entries (workspace overrides branch-scoped)\n * @param {IndexFile} result IndexFile being populated\n * @returns {Promise<void>}\n */\n private async _loadWorkspaceInfoEntries(result: IndexFile): Promise<void> {\n try {\n const wsKeys = await this._listKeysFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO)\n for (const k of wsKeys) {\n const txt = await this._getFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, k)\n if (!txt) continue\n this._tryParseAssign(result, k, txt)\n }\n } catch {\n // ignore failures and continue\n }\n }\n\n /**\n * Load branch-scoped git info entries into result.entries without overwriting workspace-local entries\n * @param {IndexFile} result IndexFile being populated\n * @returns {Promise<void>}\n */\n private async _loadGitScopedInfoEntries(result: IndexFile): Promise<void> {\n const keys = await this._listKeysFromStore(IndexedDatabaseStorage.VAR_INFO)\n const branch = this.currentBranch || 'main'\n for (const k of keys) {\n if (!k.startsWith(branch + '::')) continue\n const filepath = k.slice((branch + '::').length)\n if (result.entries[filepath]) continue\n const txt = await this._getFromStore(IndexedDatabaseStorage.VAR_INFO, k)\n if (!txt) continue\n this._tryParseAssign(result, filepath, txt)\n }\n }\n\n /**\n * Try to JSON.parse and assign into result.entries safely.\n * @param {IndexFile} result Target IndexFile\n * @param {string} key Entry key\n * @param {string} txt JSON text to parse\n * @returns {void}\n */\n private _tryParseAssign(result: IndexFile, key: string, txt: string): void {\n try {\n result.entries[key] = JSON.parse(txt)\n } catch {\n // ignore parse errors\n }\n }\n\n /**\n * Read the index metadata entry from the 'index' object store.\n * @param {IDBDatabase} database open IDBDatabase instance\n * @returns {Promise<IndexFile|null>} parsed index metadata or null on error\n */\n private async _readIndexMeta(database: IDBDatabase): Promise<IndexFile | null> {\n return await new Promise<IndexFile | null>((resolve) => {\n try {\n const indexName = this._storeName('index')\n const tx = database.transaction(indexName, 'readonly')\n const store = tx.objectStore(indexName)\n const request = store.get('index')\n /**\n * Success handler for index get.\n * @returns {void}\n */\n request.onsuccess = () => { resolve(request.result ?? null) }\n /**\n * Error handler for index get.\n * @returns {void}\n */\n request.onerror = () => { resolve(null) }\n } catch { resolve(null) }\n })\n }\n\n /**\n * index \u3092\u66F8\u304D\u8FBC\u3080\n * @param {IndexFile} index - \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30D5\u30A1\u30A4\u30EB\n * @returns {Promise<void>} \u66F8\u8FBC\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async writeIndex(index: IndexFile): Promise<void> {\n // Write entries individually into info store, then write metadata into 'index'\n const entries = index.entries || {}\n // Only persist workspace-info for files that exist in workspace-base\n const toWrite = await this._gatherWorkspaceWrites(entries)\n if (toWrite.length > 0) {\n await this.tx(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, 'readwrite', async (store) => {\n for (const item of toWrite) store.put(JSON.stringify(item.v), item.k)\n })\n }\n await this.tx('index', 'readwrite', (store) => {\n const payload: any = { head: index.head }\n if ((index as any).lastCommitKey) payload.lastCommitKey = (index as any).lastCommitKey\n if ((index as any).adapter) payload.adapter = (index as any).adapter\n store.put(payload, 'index')\n })\n }\n\n /**\n * blob \u3092\u66F8\u304D\u8FBC\u3080\n * @param {string} filepath File path\n * @param {string} content File content\n * @param {Segment} [segment] Storage segment\n * @returns {Promise<void>} \u66F8\u8FBC\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async writeBlob(filepath: string, content: string, segment?: Segment): Promise<void> {\n const seg: Segment = segment ?? 'workspace'\n // treat info-workspace specially\n if (seg === 'info-workspace') {\n await this.tx(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, 'readwrite', (store) => { store.put(content, filepath) })\n return\n }\n const branch = this.currentBranch || 'main'\n const { storeName, key } = this._storeAndKeyForSegment(seg, filepath, branch)\n await this.tx(storeName, 'readwrite', (store) => { store.put(content, key) })\n\n // Do not recursively create info entry when writing into info store itself\n if (seg === 'info' || seg === 'conflictBlob') return\n\n // Create/merge info metadata\n const sha = await this.shaOf(content)\n const now = Date.now()\n await this._updateInfoForWrite(filepath, seg, sha, now)\n }\n\n /**\n * Update info store entry for a written blob.\n * @param {string} filepath File path\n * @param {Segment} seg Storage segment\n * @param {string} sha SHA hash of content\n * @param {number} now Current timestamp\n * @returns {Promise<void>}\n */\n private async _updateInfoForWrite(filepath: string, seg: Segment, sha: string, now: number): Promise<void> {\n if (seg === 'conflictBlob') return\n const branch = this.currentBranch || 'main'\n const infoKey = filepath\n\n const existingTxt = await this._resolveExistingInfoText(seg, branch, filepath, infoKey)\n const existing: any = existingTxt ? JSON.parse(existingTxt) : {}\n\n let entry: any = { path: filepath, updatedAt: now }\n if (seg === 'workspace') entry = this._buildWorkspaceEntry(existing, filepath, sha, now)\n else if (seg === 'base') entry = this._buildBaseEntry(existing, filepath, sha, now)\n else if (seg === 'conflict') entry = this._buildConflictEntry(existing, filepath, now)\n\n await this._persistInfoEntry(entry, seg, infoKey)\n }\n\n /**\n * Resolve existing info text used as basis for updates.\n * @param {Segment} seg Storage segment\n * @param {string} branch Branch name\n * @param {string} filepath File path\n * @param {string} infoKey Info store key\n * @returns {Promise<string|null>} existing info text or null\n */\n private async _resolveExistingInfoText(seg: Segment, branch: string, filepath: string, infoKey: string): Promise<string | null> {\n if (seg === 'workspace') {\n const gitBase = await this._getFromStore(IndexedDatabaseStorage.VAR_BASE, filepath).catch(() => null)\n if (gitBase !== null) {\n return await this._getFromStore(IndexedDatabaseStorage.VAR_INFO, filepath).catch(() => null)\n }\n return await this._getFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, infoKey).catch(() => null)\n }\n return await this._getFromStore(IndexedDatabaseStorage.VAR_INFO, infoKey).catch(() => null)\n }\n\n /**\n * Persist the constructed info entry to the appropriate store.\n * @param {any} entry Info entry object\n * @param {Segment} seg Storage segment\n * @param {string} infoKey Info store key\n * @returns {Promise<void>}\n */\n private async _persistInfoEntry(entry: any, seg: Segment, infoKey: string): Promise<void> {\n if (seg === 'workspace') {\n await this.tx(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, 'readwrite', (store) => { store.put(JSON.stringify(entry), infoKey) })\n } else {\n await this.tx(IndexedDatabaseStorage.VAR_INFO, 'readwrite', (store) => { store.put(JSON.stringify(entry), infoKey) })\n }\n }\n\n /**\n * Build info entry for workspace writes.\n * @param {any} existing Existing info entry\n * @param {string} filepath File path\n * @param {string} sha SHA hash of content\n * @param {number} now Current timestamp\n * @returns {any}\n */\n private _buildWorkspaceEntry(existing: any, filepath: string, sha: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.baseSha) entry.baseSha = existing.baseSha\n entry.workspaceSha = sha\n entry.state = entry.baseSha ? 'modified' : 'added'\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n return entry\n }\n\n /**\n * Build info entry for base writes.\n * @param {any} existing Existing info entry\n * @param {string} filepath File path\n * @param {string} sha SHA hash of content\n * @param {number} now Current timestamp\n * @returns {any}\n */\n private _buildBaseEntry(existing: any, filepath: string, sha: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.workspaceSha) entry.workspaceSha = existing.workspaceSha\n entry.baseSha = sha\n entry.state = 'base'\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n return entry\n }\n\n /**\n * Build info entry for conflict writes.\n * @param {any} existing Existing info entry\n * @param {string} filepath File path\n * @param {number} now Current timestamp\n * @returns {any}\n */\n private _buildConflictEntry(existing: any, filepath: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.baseSha) entry.baseSha = existing.baseSha\n if (existing && existing.workspaceSha) entry.workspaceSha = existing.workspaceSha\n entry.state = 'conflict'\n return entry\n }\n /**\n * blob \u3092\u8AAD\u307F\u51FA\u3059\n * @param {string} filepath File path\n * @param {Segment} [segment] Storage segment\n * @returns {Promise<string|null>} \u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\u3001\u5B58\u5728\u3057\u306A\u3051\u308C\u3070 null\n */\n async readBlob(filepath: string, segment?: Segment): Promise<string | null> {\n const branch = this.currentBranch || 'main'\n if (segment !== undefined) return await this._readBlobWithSegment(segment, filepath, branch)\n\n // segment\u672A\u6307\u5B9A\u306E\u5834\u5408\u306Fworkspace-base\u2192git-base\u306E\u9806\u3067\u53C2\u7167\n const workspaceContent = await this._getFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_BASE, filepath)\n if (workspaceContent !== null) return workspaceContent\n return await this._getFromStore(IndexedDatabaseStorage.VAR_BASE, filepath)\n }\n\n /**\n * Read blob when a segment is provided. Handles info-workspace/info-git/info and other segments.\n * @param {Segment} segment Storage segment\n * @param {string} filepath File path\n * @param {string} branch Branch name\n * @returns {Promise<string|null>} blob content or null\n */\n private async _readBlobWithSegment(segment: Segment, filepath: string, branch: string): Promise<string | null> {\n // Handle info variants first\n if (segment === 'info-git') return await this._getFromStore(IndexedDatabaseStorage.VAR_INFO, filepath)\n if (segment === 'info-workspace') return await this._getFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, filepath)\n if (segment === 'info') {\n const ws = await this._getFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, filepath)\n if (ws !== null) return ws\n return await this._getFromStore(IndexedDatabaseStorage.VAR_INFO, filepath)\n }\n\n // Default segments: map to store/key and read\n const { storeName, key } = this._storeAndKeyForSegment(segment, filepath, branch)\n return await this._getFromStore(storeName, key)\n }\n\n /**\n * blob \u3092\u524A\u9664\u3059\u308B\n * @param {string} filepath File path\n * @param {Segment} [segment] Storage segment\n * @returns {Promise<void>} \u524A\u9664\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async deleteBlob(filepath: string, segment?: Segment): Promise<void> {\n const branch = this.currentBranch || 'main'\n if (segment === 'workspace') { await this._deleteFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_BASE, filepath); await this._deleteFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, filepath); return }\n if (segment === 'base') { await this._deleteFromStore(IndexedDatabaseStorage.VAR_BASE, filepath); return }\n if (segment === 'conflict') { await this._deleteFromStore(IndexedDatabaseStorage.VAR_CONFLICT, filepath); return }\n if (segment === 'conflictBlob') {\n const { storeName, key } = this._storeAndKeyForSegment(segment, filepath, branch)\n await this._deleteFromStore(storeName, key)\n return\n }\n if (segment === 'info') {\n // remove both workspace-local info and git-scoped info for current branch\n await this._deleteFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, filepath)\n await this._deleteFromStore(IndexedDatabaseStorage.VAR_INFO, filepath)\n return\n }\n // segment\u672A\u6307\u5B9A\u306E\u5834\u5408\u306F\u3059\u3079\u3066\u306E\u30BB\u30B0\u30E1\u30F3\u30C8\u304B\u3089\u524A\u9664\n await this._deleteAllSegments(filepath, branch)\n }\n\n /**\n * Gather entries that should be written to workspace-info: those that exist in workspace-base.\n * @param {{[k: string]: any}} entries Index entries\n * @returns {Promise<Array<{k:string,v:any}>>}\n */\n private async _gatherWorkspaceWrites(entries: { [k: string]: any }): Promise<Array<{ k: string; v: any }>> {\n const toWrite: Array<{ k: string; v: any }> = []\n const branch = this.currentBranch || 'main'\n for (const filepath of Object.keys(entries)) {\n const existsWorkspace = await this._getFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_BASE, filepath).catch(() => null)\n if (existsWorkspace !== null) { toWrite.push({ k: filepath, v: entries[filepath] }); continue }\n // If not present in workspace base, check git base (branch-scoped)\n const baseKey = `${branch}::${filepath}`\n const existsBase = await this._getFromStore(IndexedDatabaseStorage.VAR_BASE, baseKey).catch(() => null)\n if (existsBase === null) continue\n toWrite.push({ k: filepath, v: entries[filepath] })\n }\n return toWrite\n }\n\n /**\n * Compute store name and key for a given segment and filepath.\n * @param {Segment} seg Storage segment\n * @param {string} filepath File path\n * @param {string} branch Branch name\n * @returns {{storeName:string,key:string}}\n */\n private _storeAndKeyForSegment(seg: Segment, filepath: string, branch: string): { storeName: string; key: string } {\n const storeName = seg === 'workspace'\n ? IndexedDatabaseStorage.VAR_WORKSPACE_BASE\n : seg === 'base'\n ? IndexedDatabaseStorage.VAR_BASE\n : seg === 'info'\n ? IndexedDatabaseStorage.VAR_INFO\n : IndexedDatabaseStorage.VAR_CONFLICT\n // For git-scoped segments, keys are prefixed with branch\n const key = (seg === 'workspace') ? filepath : (seg === 'conflictBlob' ? `${branch}::conflictBlob::${filepath}` : `${branch}::${filepath}`)\n return { storeName, key }\n }\n\n /**\n * Delete a filepath from all relevant stores for the given branch.\n * @param {string} filepath File path\n * @param {string} _branch Branch name\n * @returns {Promise<void>}\n */\n private async _deleteAllSegments(filepath: string, _branch: string): Promise<void> {\n await this._deleteFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_BASE, filepath)\n await this._deleteFromStore(IndexedDatabaseStorage.VAR_BASE, filepath)\n await this._deleteFromStore(IndexedDatabaseStorage.VAR_CONFLICT, filepath)\n await this._deleteFromStore(IndexedDatabaseStorage.VAR_CONFLICT, `${_branch}::conflictBlob::${filepath}`)\n await this._deleteFromStore(IndexedDatabaseStorage.VAR_INFO, filepath)\n await this._deleteFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, filepath)\n }\n\n /**\n * Read a value from a specific object store.\n * @param {string} storeName Object store name\n * @param {string} filepath Key to read\n * @returns {Promise<string|null>} value or null\n */\n private async _getFromStore(storeName: string, filepath: string): Promise<string | null> {\n const database = await this.dbPromise\n return new Promise<string | null>((resolve) => {\n try {\n const physical = this._storeName(storeName)\n const tx = database.transaction(physical, 'readonly')\n const store = tx.objectStore(physical)\n const request = store.get(filepath)\n /**\n * Index get success handler\n * @returns {void}\n */\n request.onsuccess = () => {\n const result = request.result ?? null\n if (result !== null) { resolve(result); return }\n // If not found and this is a git-scoped store, try branch-prefixed key as a fallback\n if (storeName !== IndexedDatabaseStorage.VAR_WORKSPACE_BASE && storeName !== IndexedDatabaseStorage.VAR_WORKSPACE_INFO) {\n this._getBranchPrefixedFromStore(store, filepath).then((r) => resolve(r)).catch(() => resolve(null))\n return\n }\n resolve(null)\n }\n /**\n * Index get error handler\n * @returns {void}\n */\n request.onerror = function () { resolve(null) }\n } catch { resolve(null) }\n })\n }\n\n /**\n * List all keys in an object store.\n * @param {string} storeName Object store name\n * @returns {Promise<string[]>} Array of keys contained in the store\n */\n private async _listKeysFromStore(storeName: string): Promise<string[]> {\n const database = await this.dbPromise\n return new Promise<string[]>((resolve) => {\n try {\n const physical = this._storeName(storeName)\n const tx = database.transaction(physical, 'readonly')\n const store = tx.objectStore(physical)\n const keys: string[] = []\n const request = store.openKeyCursor()\n /**\n * Cursor success handler bound to resolver and accumulator\n * @returns {void}\n */\n request.onsuccess = this._makeCursorSuccessHandler(resolve, keys)\n /**\n * Cursor error handler\n * @returns {void}\n */\n request.onerror = function () { resolve(keys) }\n } catch { resolve([]) }\n })\n }\n\n /**\n * Attempt to read a branch-prefixed key from the given store.\n * @param {any} store IDBObjectStore instance\n * @param {string} filepath Key without branch prefix\n * @returns {Promise<string|null>} resolved value or null\n */\n private _getBranchPrefixedFromStore(store: any, filepath: string): Promise<string | null> {\n return new Promise<string | null>((resolve) => {\n try {\n const branch = this.currentBranch || 'main'\n const request = store.get(branch + '::' + filepath)\n /**\n * Success handler for branch-prefixed get.\n * @returns {void}\n */\n request.onsuccess = () => { resolve(request.result ?? null) }\n /**\n * Error handler for branch-prefixed get.\n * @returns {void}\n */\n request.onerror = () => { resolve(null) }\n } catch { resolve(null) }\n })\n }\n\n /**\n * Map a logical store name to its physical store name including root prefix.\n * @param {string} name logical store identifier\n * @returns {string} physical store name used in IndexedDB\n */\n private _storeName(name: string): string {\n return this.rootPrefix ? `${this.rootPrefix}${name}` : name\n }\n\n /**\n * Create a cursor success handler bound to resolve and keys array.\n * @param {(_values: string[]) => void} resolve resolver\n * @param {string[]} keys accumulator\n * @returns {(event:any) => void}\n */\n private _makeCursorSuccessHandler(resolve: (_values: string[]) => void, keys: string[]) {\n return function (event: any) {\n const current = event.target.result\n if (!current) { resolve(keys); return }\n if (current.key !== undefined) {\n keys.push(current.key as string)\n }\n current.continue()\n }\n }\n\n /**\n * \u6307\u5B9A\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u914D\u4E0B\u306E\u30D5\u30A1\u30A4\u30EB\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param {string} [prefix] \u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\uFF08\u7701\u7565\u6642\u306F\u30EB\u30FC\u30C8\uFF09\n * @param {Segment} [segment] \u30BB\u30B0\u30E1\u30F3\u30C8\uFF08\u7701\u7565\u6642\u306F workspace\uFF09\n * @param {boolean} [recursive] \u30B5\u30D6\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3082\u542B\u3081\u308B\u304B\u3002\u7701\u7565\u6642\u306F true\n * @returns {Promise<Array<{ path: string; info: string | null }>>}\n */\n async listFiles(prefix?: string, segment?: Segment, recursive = true): Promise<Array<{ path: string; info: string | null }>> {\n const seg: Segment = segment ?? 'workspace'\n const storeName = seg === 'workspace' ? IndexedDatabaseStorage.VAR_WORKSPACE_BASE : seg === 'base' ? IndexedDatabaseStorage.VAR_BASE : seg === 'info' ? IndexedDatabaseStorage.VAR_INFO : IndexedDatabaseStorage.VAR_CONFLICT\n\n let keys: string[]\n try {\n keys = await this._listKeysFromStore(storeName)\n } catch {\n keys = []\n }\n\n const p = prefix ? prefix.replace(/^\\/+|\\/+$/g, '') : ''\n // For non-workspace stores, keys include branch prefix. Filter and strip it.\n keys = this._normalizeKeysForSegment(keys, seg)\n keys = this._filterKeys(keys, p, recursive)\n return await this._collectFiles(keys, seg)\n }\n\n /**\n * Raw listing that returns implementation-specific URIs and a normalized path.\n * @param {string} [prefix] optional prefix to filter\n * @param {boolean} [recursive] whether to include subdirectories\n * @returns {Promise<Array<{uri:string,path:string,info?:string|null}>>}\n */\n async listFilesRaw(prefix?: string, recursive = true): Promise<Array<{ uri: string; path: string; info?: string | null }>> {\n const stores = [\n IndexedDatabaseStorage.VAR_WORKSPACE_BASE,\n IndexedDatabaseStorage.VAR_WORKSPACE_INFO,\n IndexedDatabaseStorage.VAR_BASE,\n IndexedDatabaseStorage.VAR_INFO,\n IndexedDatabaseStorage.VAR_CONFLICT,\n ]\n\n const branch = this.currentBranch || 'main'\n const p = prefix ? prefix.replace(/^\\/+|\\/+$/g, '') : ''\n\n const out: Array<{ uri: string; path: string; info?: string | null }> = []\n\n for (const storeName of stores) {\n let keys: string[] = []\n try {\n keys = await this._listKeysFromStore(storeName)\n } catch {\n keys = []\n }\n\n const entries = await this._entriesFromStoreKeys(storeName, keys, branch, p, recursive)\n for (const entry of entries) out.push(entry)\n }\n\n return out\n }\n\n /**\n * Helper: build entries from store keys with filtering and path normalization\n * @param {string} storeName Object store name\n * @param {string[]} keys Array of keys\n * @param {string} branch Branch name\n * @param {string} prefix Path prefix filter\n * @param {boolean} recursive Whether to include subdirectories\n * @returns {Promise<Array<{uri:string,path:string,info?:string|null}>>}\n */\n private async _entriesFromStoreKeys(storeName: string, keys: string[], branch: string, prefix: string, recursive: boolean): Promise<Array<{ uri: string; path: string; info?: string | null }>> {\n const mapped = await Promise.all(keys.map((originalKey) => this._entryFromStoreKey(storeName, originalKey, branch, prefix, recursive)))\n return mapped.filter((x) => x !== null) as Array<{ uri: string; path: string; info?: string | null }>\n }\n\n /**\n * Build a single entry object from a store key. Returns null when the key is filtered out.\n * @param {string} storeName Object store name\n * @param {string} originalKey Original key from store\n * @param {string} branch Branch name\n * @param {string} prefix Path prefix filter\n * @param {boolean} recursive Whether to include subdirectories\n * @returns {Promise<{uri:string,path:string,info?:string|null}|null>}\n */\n private async _entryFromStoreKey(storeName: string, originalKey: string, branch: string, prefix: string, recursive: boolean): Promise<{ uri: string; path: string; info?: string | null } | null> {\n // Normalize may strip branch prefix for git-scoped stores\n const normalizedKey = (storeName !== IndexedDatabaseStorage.VAR_WORKSPACE_BASE && storeName !== IndexedDatabaseStorage.VAR_WORKSPACE_INFO && originalKey.startsWith(branch + '::'))\n ? originalKey.slice((branch + '::').length)\n : originalKey\n\n // Prefix filtering\n if (prefix && !(normalizedKey === prefix || normalizedKey.startsWith(prefix + '/'))) return null\n\n // Recursion filtering\n if (!recursive) {\n const rest = prefix ? normalizedKey.slice(prefix.length + 1) : normalizedKey\n if (rest.includes('/')) return null\n }\n\n const uri = `${this.dbName}/${storeName}/${originalKey}`\n const path = this._buildPathForStoreKey(storeName, normalizedKey, branch)\n const info = await this._resolveInfoForKey(normalizedKey, branch)\n return { uri, path, info }\n }\n\n /**\n * Build normalized path string for a store key.\n * @param {string} storeName Object store name\n * @param {string} normalizedKey Normalized key\n * @param {string} branch Branch name\n * @returns {string}\n */\n private _buildPathForStoreKey(storeName: string, normalizedKey: string, branch: string): string {\n if (storeName === IndexedDatabaseStorage.VAR_WORKSPACE_BASE || storeName === IndexedDatabaseStorage.VAR_WORKSPACE_INFO) {\n return `${this.dbName}/workspace/${normalizedKey}`\n }\n const tableMap: Record<string, string> = {\n [IndexedDatabaseStorage.VAR_BASE]: 'base',\n [IndexedDatabaseStorage.VAR_INFO]: 'info',\n [IndexedDatabaseStorage.VAR_CONFLICT]: 'conflict',\n }\n const conflictBlobPrefix = 'conflictBlob::'\n if (storeName === IndexedDatabaseStorage.VAR_CONFLICT && normalizedKey.startsWith(conflictBlobPrefix)) {\n const key = normalizedKey.slice(conflictBlobPrefix.length)\n return `${this.dbName}/.git/${branch}/conflictBlob/${key}`\n }\n const segName = tableMap[storeName] || 'base'\n return `${this.dbName}/.git/${branch}/${segName}/${normalizedKey}`\n }\n\n /**\n * Normalize keys for a given segment: strip branch prefix for non-workspace stores.\n * @param {string[]} keys Array of keys\n * @param {Segment} seg Storage segment\n * @returns {string[]}\n */\n private _normalizeKeysForSegment(keys: string[], seg: Segment): string[] {\n if (seg === 'workspace') return keys\n const branch = this.currentBranch || 'main'\n // Accept both branch-prefixed keys and legacy/unprefixed keys in the same\n // physical store (some test shims share workspace-info and git-info).\n const normalized = keys.map((k) => k.startsWith(branch + '::') ? k.slice((branch + '::').length) : k)\n if (seg === 'conflictBlob') {\n return normalized.map((k) => k.startsWith('conflictBlob::') ? k.slice('conflictBlob::'.length) : k)\n }\n return normalized\n }\n\n /**\n * Filter keys by prefix and recursion flag.\n * @param {string[]} keys Array of keys\n * @param {string} p Path prefix\n * @param {boolean} recursive Whether to include subdirectories\n * @returns {string[]}\n */\n private _filterKeys(keys: string[], p: string, recursive: boolean): string[] {\n if (p) keys = keys.filter((k) => k === p || k.startsWith(p + '/'))\n if (!recursive) {\n keys = keys.filter((k) => {\n const rest = p ? k.slice(p.length + (p ? 1 : 0)) : k\n return !rest.includes('/')\n })\n }\n return keys\n }\n\n /**\n * Collect file info objects for keys array.\n * @param {string[]} keys list of keys\n * @param {Segment} _seg segment (unused)\n * @returns {Promise<Array<{path:string, info:string|null}>>}\n */\n private async _collectFiles(keys: string[], _seg: Segment): Promise<Array<{ path: string; info: string | null }>> {\n const out: Array<{ path: string; info: string | null }> = []\n const branch = this.currentBranch || 'main'\n for (const k of keys) {\n const info = await this._resolveInfoForKey(k, branch)\n out.push({ path: k, info })\n }\n return out\n }\n\n /**\n * Resolve info value for a given key: prefer workspace-local, then branch-scoped.\n * @param {string} k key\n * @param {string} _branch branch name\n * @returns {Promise<string|null>}\n */\n private async _resolveInfoForKey(k: string, _branch: string): Promise<string | null> {\n let info: string | null = await this._getFromStore(IndexedDatabaseStorage.VAR_WORKSPACE_INFO, k)\n if (info === null) info = await this._getFromStore(IndexedDatabaseStorage.VAR_INFO, k)\n return info\n }\n\n /**\n * Calculate SHA-1 hex digest of given content.\n * @param {string} content Input string\n * @returns {Promise<string>} Hex encoded SHA-1 digest\n */\n private async shaOf(content: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(content)\n const hashBuffer = await crypto.subtle.digest('SHA-1', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n }\n\n /**\n * Delete a key from a specific object store.\n * @param {string} storeName Object store name\n * @param {string} filepath Key to delete\n * @returns {Promise<void>}\n */\n private async _deleteFromStore(storeName: string, filepath: string): Promise<void> {\n return this.tx(storeName, 'readwrite', (store) => { store.delete(filepath) })\n }\n\n /**\n * \u6307\u5B9A\u3055\u308C\u305F DB \u540D\u3092\u524A\u9664\u3057\u307E\u3059\n * @param {string} databaseName \u524A\u9664\u3059\u308B DB \u540D\n * @returns {Promise<void>}\n */\n static async delete(databaseName: string): Promise<void> {\n try {\n const idb = (globalThis as any).indexedDB\n if (!idb) throw new Error('IndexedDB is not available')\n\n return new Promise((resolve, reject) => {\n const request = idb.deleteDatabase(databaseName)\n if (!request) return reject(new Error('indexedDB.deleteDatabase returned falsy request'))\n\n /**\n * Success handler for deleteDatabase.\n * @returns {void}\n */\n request.onsuccess = function () { resolve() }\n /**\n * Error handler for deleteDatabase.\n * @returns {void}\n */\n request.onerror = function () { reject(new Error(`Failed to delete IndexedDB: ${request.error?.message}`)) }\n /**\n * Blocked handler for deleteDatabase.\n * @returns {void}\n */\n request.onblocked = function () {\n // DB is still in use, but allow the deletion to proceed\n console.warn(`IndexedDB deletion is blocked for \"${databaseName}\", but proceeding`)\n }\n })\n } catch (error) {\n throw new Error(`Failed to delete IndexedDB \"${databaseName}\": ${String(error)}`)\n }\n }\n}\n\nexport default IndexedDatabaseStorage\n\n", "\uFEFF\n/**\n * Compute SHA-1 hex digest for a string.\n * Prefer Web Crypto (`crypto.subtle.digest`) when available; otherwise\n * fall back to a bundled implementation.\n * @param message input string\n * @returns lower-case hex-encoded SHA-1 digest\n */\nasync function shaOf(message: string): Promise<string> {\n // Try Web Crypto first (works in browsers and Node 19+/22+ via globalThis.crypto)\n const webcrypto: any = (globalThis as any).crypto\n if (webcrypto && webcrypto.subtle && typeof webcrypto.subtle.digest === 'function') {\n const buf = new TextEncoder().encode(message)\n const digest = await webcrypto.subtle.digest('SHA-1', buf)\n const array = Array.from(new Uint8Array(digest))\n return array.map(b => b.toString(16).padStart(2, '0')).join('')\n }\n // Fallback to bundled synchronous implementation when Web Crypto not available.\n return computeSha1Fallback(message)\n}\n\n/**\n * Synchronous SHA-1 fallback implementation.\n * Kept as a separate function so `shaOf` remains simple for linting.\n * @param message input string\n * @returns lower-case hex-encoded SHA-1 digest\n */\nfunction computeSha1Fallback(message: string): string {\n const encoder = new TextEncoder()\n const bytes = Array.from(encoder.encode(message))\n const l = bytes.length * 8\n bytes.push(0x80)\n while ((bytes.length % 64) !== 56) bytes.push(0)\n for (let byteIndex = 7; byteIndex >= 0; byteIndex--) bytes.push((l >>> (byteIndex * 8)) & 0xff)\n\n const words: number[] = []\n for (let index = 0; index < bytes.length; index += 4) {\n words.push((bytes[index] << 24) | (bytes[index + 1] << 16) | (bytes[index + 2] << 8) | (bytes[index + 3]))\n }\n\n let h0 = 0x67452301\n let h1 = 0xEFCDAB89\n let h2 = 0x98BADCFE\n let h3 = 0x10325476\n let h4 = 0xC3D2E1F0\n\n const results = processWords(words)\n h0 = results[0]\n h1 = results[1]\n h2 = results[2]\n h3 = results[3]\n h4 = results[4]\n\n /**\n * Convert 32-bit number to 8-char hex string\n * @param n 32-bit number\n * @returns hex string\n */\n function toHex(n: number): string { return n.toString(16).padStart(8, '0') }\n\n return (toHex(h0) + toHex(h1) + toHex(h2) + toHex(h3) + toHex(h4)).toLowerCase()\n}\n\n/**\n * Process 512-bit blocks (16-word blocks expanded to 80 words) and\n * compute intermediate SHA-1 state.\n * @param words word array\n * @returns tuple [h0,h1,h2,h3,h4]\n */\nfunction processWords(words: number[]): number[] {\n let h0 = 0x67452301\n let h1 = 0xEFCDAB89\n let h2 = 0x98BADCFE\n let h3 = 0x10325476\n let h4 = 0xC3D2E1F0\n\n for (let index = 0; index < words.length; index += 16) {\n const w = new Array(80) as number[]\n for (let t = 0; t < 16; t++) w[t] = words[index + t] >>> 0\n for (let t = 16; t < 80; t++) {\n const temporary = w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16]\n w[t] = ((temporary << 1) | (temporary >>> 31)) >>> 0\n }\n const updated = processChunk(w, [h0, h1, h2, h3, h4])\n h0 = updated[0]\n h1 = updated[1]\n h2 = updated[2]\n h3 = updated[3]\n h4 = updated[4]\n }\n return [h0, h1, h2, h3, h4]\n}\n\n/**\n * Process a single 512-bit chunk (expanded to 80 words) and update state.\n * @param w expanded word array (80 entries)\n * @param h array [h0,h1,h2,h3,h4] current state\n * @returns updated [h0,h1,h2,h3,h4]\n */\nfunction processChunk(w: number[], h: number[]): number[] {\n let a = h[0], b = h[1], c = h[2], d = h[3], registerE = h[4]\n for (let t = 0; t < 80; t++) {\n let f: number, k: number\n if (t < 20) { f = (b & c) | (~b & d); k = 0x5A827999 }\n else if (t < 40) { f = b ^ c ^ d; k = 0x6ED9EBA1 }\n else if (t < 60) { f = (b & c) | (b & d) | (c & d); k = 0x8F1BBCDC }\n else { f = b ^ c ^ d; k = 0xCA62C1D6 }\n const temporaryValue = (((a << 5) | (a >>> 27)) + f + registerE + k + (w[t] >>> 0)) >>> 0\n registerE = d\n d = c\n c = ((b << 30) | (b >>> 2)) >>> 0\n b = a\n a = temporaryValue\n }\n return [((h[0] + a) >>> 0), ((h[1] + b) >>> 0), ((h[2] + c) >>> 0), ((h[3] + d) >>> 0), ((h[4] + registerE) >>> 0)]\n}\n\n/**\n * Parse existing info JSON stored in the in-memory store.\n * @param store In-memory storage object\n * @param filepath path key\n * @returns parsed info object or undefined when not present/invalid\n */\nfunction parseExistingInfo(store: any, filepath: string): any | undefined {\n const existingTxt = store.infoBlobs.has(filepath) ? store.infoBlobs.get(filepath) : null\n if (!existingTxt) return undefined\n try {\n return JSON.parse(existingTxt)\n } catch (error) {\n return undefined\n }\n}\n\n/**\n * Build info entry for a workspace write.\n * @param existing existing parsed info\n * @param filepath path key\n * @param sha workspace blob sha\n * @param now timestamp\n * @returns info entry object\n */\nfunction buildWorkspaceEntry(existing: any, filepath: string, sha: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.baseSha) entry.baseSha = existing.baseSha\n entry.workspaceSha = sha\n entry.state = entry.baseSha ? 'modified' : 'added'\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n return entry\n}\n\n/**\n * Build info entry for a base write.\n * @param existing existing parsed info\n * @param filepath path key\n * @param sha base blob sha\n * @param now timestamp\n * @returns info entry object\n */\nfunction buildBaseEntry(existing: any, filepath: string, sha: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.workspaceSha) entry.workspaceSha = existing.workspaceSha\n entry.baseSha = sha\n entry.state = 'base'\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n return entry\n}\n\n/**\n * Build info entry for a conflict write.\n * @param existing existing parsed info\n * @param filepath path key\n * @param now timestamp\n * @returns info entry object\n */\nfunction buildConflictEntry(existing: any, filepath: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.baseSha) entry.baseSha = existing.baseSha\n if (existing && existing.workspaceSha) entry.workspaceSha = existing.workspaceSha\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n entry.state = 'conflict'\n return entry\n}\n\n/**\n * Update in-memory info metadata when a blob is written to a segment.\n * @param store in-memory store object\n * @param filepath path key\n * @param seg segment name ('workspace'|'base'|'conflict'|'info')\n * @param content blob content\n * @returns Promise<void>\n */\nexport async function updateInfoForWrite(store: any, filepath: string, seg: string, content: string): Promise<void> {\n try {\n const now = Date.now()\n const existing = parseExistingInfo(store, filepath)\n if (seg === 'info') {\n await handleInfoSegment(store, filepath, content)\n return\n }\n\n const sha = await shaOf(content)\n let entry: any\n if (seg === 'workspace') entry = buildWorkspaceEntry(existing, filepath, sha, now)\n else if (seg === 'base') entry = buildBaseEntry(existing, filepath, sha, now)\n else if (seg === 'conflict') entry = buildConflictEntry(existing, filepath, now)\n else entry = { path: filepath, updatedAt: now }\n\n store.infoBlobs.set(filepath, JSON.stringify(entry))\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('updateInfoForWrite failed', error)\n return\n }\n}\n\n/**\n * Handle direct writes to the 'info' segment: store parsed JSON when possible\n * and fall back to raw text otherwise.\n * @param {any} store store object\n * @param {string} filepath file path\n * @param {string} content segment content\n */\nasync function handleInfoSegment(store: any, filepath: string, content: string): Promise<void> {\n try {\n const parsed = JSON.parse(content)\n store.infoBlobs.set(filepath, JSON.stringify(parsed))\n } catch (error) {\n store.infoBlobs.set(filepath, String(content))\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('handleInfoSegment: stored raw content due to parse error', error)\n }\n}\n\nexport default { updateInfoForWrite }\n\n", "\uFEFFimport { IndexFile } from './types.ts'\nimport { StorageBackend, StorageBackendConstructor } from './storageBackend.ts'\nimport { updateInfoForWrite } from './metadataManager.ts'\n\nconst BRANCH_SEP = '::'\nconst SEG_WORKSPACE = 'workspace'\nconst SEG_INFO_WORKSPACE = 'info-workspace'\nconst SEG_INFO_GIT = 'info-git'\n\n/**\n * \u30C6\u30B9\u30C8\u3084\u8EFD\u91CF\u52D5\u4F5C\u691C\u8A3C\u7528\u306E\u30A4\u30F3\u30E1\u30E2\u30EA\u5B9F\u88C5\u3002\n * `StorageBackend` \u3092\u5B9F\u88C5\u3057\u3001\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u5074\u3067\u5DEE\u3057\u66FF\u3048\u3066\u5229\u7528\u3067\u304D\u307E\u3059\u3002\n */\nexport const InMemoryStorage: StorageBackendConstructor = class InMemoryStorage implements StorageBackend {\n private rootKey: string\n private currentBranch: string | null = null\n\n // shared storage across instances keyed by root name\n private static stores: Map<string, {\n index: IndexFile,\n workspaceBlobs: Map<string, string>,\n baseBlobs: Map<string, string>,\n conflictBlobs: Map<string, string>,\n infoBlobs: Map<string, string>\n }> = new Map()\n\n /**\n * \u9759\u7684: \u3053\u306E\u5B9F\u88C5\u304C\u5229\u7528\u53EF\u80FD\u304B\u3092\u540C\u671F\u5224\u5B9A\u3057\u307E\u3059\u3002\n * \u30C6\u30B9\u30C8/\u30A4\u30F3\u30E1\u30E2\u30EA\u306A\u306E\u3067\u5E38\u306B true \u3092\u8FD4\u3057\u307E\u3059\u3002\n * @returns {boolean} \u5229\u7528\u53EF\u80FD\u306A\u3089 true\n */\n static canUse(): boolean {\n return true\n }\n\n /**\n * \u5229\u7528\u53EF\u80FD\u306A\u30EB\u30FC\u30C8\u540D\u3092\u8FD4\u3057\u307E\u3059\u3002\n * @param {string} [namespace] Optional namespace to filter roots\n * @returns {string[]} \u30EB\u30FC\u30C8\u540D\u306E\u914D\u5217\n */\n static availableRoots(namespace?: string): string[] {\n const keys = Array.from(InMemoryStorage.stores.keys())\n // keys are stored as namespace-prefixed keys like 'namespace/root'\n if (namespace) {\n const filtered = keys\n .filter((k) => k.startsWith(namespace + '/'))\n .map((k) => k.slice((namespace + '/').length))\n return filtered.length ? filtered : ['apigit_storage']\n }\n // Legacy behavior: return all registered root names across namespaces\n const roots = keys.map((k) => {\n const parts = k.split('/')\n return parts.length > 1 ? parts.slice(1).join('/') : parts[0]\n })\n const uniq = Array.from(new Set(roots))\n return uniq.length ? uniq : ['apigit_storage']\n }\n \n /**\n * \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u3002\u4E92\u63DB\u6027\u306E\u305F\u3081\u306B\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u540D\u3092\u53D7\u3051\u53D6\u308B\u304C\u7121\u8996\u3059\u308B\u3002\n * @param {string} namespace Database namespace\n * @param {string} [directory] Optional directory name (ignored)\n */\n constructor(namespace: string, directory?: string) {\n // Compose a namespace-prefixed store key\n const directoryName = directory ?? `__inmem_${Math.random().toString(36).slice(2)}`\n this.rootKey = namespace ? `${namespace}/${directoryName}` : directoryName\n if (!InMemoryStorage.stores.has(this.rootKey)) {\n InMemoryStorage.stores.set(this.rootKey, {\n index: { head: '', entries: {} },\n workspaceBlobs: new Map(),\n baseBlobs: new Map(),\n conflictBlobs: new Map(),\n infoBlobs: new Map()\n })\n }\n }\n\n /**\n * Set the current branch for segment-scoped operations.\n * @param {string | null} [branch] Branch name or null\n * @returns {void}\n */\n setBranch(branch?: string | null): void {\n this.currentBranch = branch || null\n }\n\n /**\n * \u521D\u671F\u5316\u51E6\u7406\uFF08\u30A4\u30F3\u30E1\u30E2\u30EA\u3067\u306F\u4F55\u3082\u3057\u306A\u3044\uFF09\n * @returns {Promise<void>} \u89E3\u6C7A\u6642\u306B\u521D\u671F\u5316\u5B8C\u4E86\n */\n async init(): Promise<void> {\n return\n }\n\n /**\n * \u73FE\u5728\u306E `IndexFile` \u3092\u8FD4\u3057\u307E\u3059\u3002\n * @returns {Promise<IndexFile|null>} IndexFile\uFF08\u5E38\u306B\u975Enull\uFF09\n */\n async readIndex(): Promise<IndexFile | null> {\n const store = InMemoryStorage.stores.get(this.rootKey)!\n // Reconstruct entries from infoBlobs map\n const result: IndexFile = { head: store.index.head || '', entries: {} }\n\n // Determine branch scope and load info entries\n const branch = this.currentBranch || 'main'\n // First, load workspace-local info entries (unprefixed keys)\n this._loadInMemoryWorkspaceInfo(store, result, branch)\n this._loadInMemoryBranchInfo(store, result, branch)\n if ((store.index as any).lastCommitKey) result.lastCommitKey = (store.index as any).lastCommitKey\n // Preserve adapter metadata if present\n if ((store.index as any).adapter) result.adapter = (store.index as any).adapter\n\n return result\n }\n\n /**\n * Load workspace-local info entries into result.entries (unprefixed keys)\n * @param {any} store Storage object\n * @param {IndexFile} result Result IndexFile\n * @param {string} branch Branch name\n * @returns {void}\n */\n private _loadInMemoryWorkspaceInfo(store: any, result: IndexFile, branch: string): void {\n for (const [k, v] of store.infoBlobs.entries()) {\n if (k.startsWith(branch + BRANCH_SEP)) continue\n const parsed = this._safeParseInfo(v, k)\n if (parsed) result.entries[k] = parsed\n }\n }\n\n /**\n * Load branch-scoped info entries into result.entries without overwriting workspace-local entries\n * @param {any} store Storage object\n * @param {IndexFile} result Result IndexFile\n * @param {string} branch Branch name\n * @returns {void}\n */\n private _loadInMemoryBranchInfo(store: any, result: IndexFile, branch: string): void {\n for (const [k, v] of store.infoBlobs.entries()) {\n if (!k.startsWith(branch + BRANCH_SEP)) continue\n const filepath = k.slice((branch + BRANCH_SEP).length)\n if (result.entries[filepath]) continue\n const parsed = this._safeParseInfo(v, k)\n if (!parsed) continue\n if (parsed && parsed.state === 'deleted') continue\n result.entries[filepath] = parsed\n }\n }\n\n /**\n * Safely parse stored info JSON and log parse errors.\n * @param {string} v JSON text\n * @param {string} key Entry key\n * @returns {any | null} parsed object or null\n */\n private _safeParseInfo(v: string, key: string): any | null {\n try {\n return JSON.parse(v)\n } catch (error) {\n if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('parse info failed', key, error)\n return null\n }\n }\n\n /**\n * IndexFile \u3092\u8A2D\u5B9A\u3057\u307E\u3059\u3002\n * @param {IndexFile} index \u66F8\u304D\u8FBC\u3080 IndexFile\n * @returns {Promise<void>}\n */\n async writeIndex(index: IndexFile): Promise<void> {\n const store = InMemoryStorage.stores.get(this.rootKey)!\n // write entries individually to infoBlobs, then persist meta\n const entries = index.entries || {}\n\n // Persist index entries into workspace-local info (unprefixed keys)\n // Only write info entries for files that exist in workspace or in base (branch-scoped)\n const branch = this.currentBranch || 'main'\n for (const filepath of Object.keys(entries)) {\n const existsInWorkspace = store.workspaceBlobs.has(filepath)\n const existsInBase = store.baseBlobs.has(`${branch}${BRANCH_SEP}${filepath}`)\n if (!existsInWorkspace && !existsInBase) continue\n store.infoBlobs.set(filepath, JSON.stringify(entries[filepath]))\n }\n const meta: any = { head: index.head }\n if ((index as any).lastCommitKey) meta.lastCommitKey = (index as any).lastCommitKey\n if ((index as any).adapter) meta.adapter = (index as any).adapter\n store.index = Object.assign({}, meta, { entries: {} })\n }\n\n /**\n * \u6307\u5B9A\u30D1\u30B9\u306B\u5BFE\u3057\u3066\u6587\u5B57\u5217\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u4FDD\u5B58\u3057\u307E\u3059\u3002\n * @param {string} filepath \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @param {string} content \u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\n * @param {any} [segment] Storage segment\n * @returns {Promise<void>}\n */\n async writeBlob(filepath: string, content: string, segment?: any): Promise<void> {\n const seg = segment || SEG_WORKSPACE\n const store = InMemoryStorage.stores.get(this.rootKey)!\n this._applyBlobToStore(store, seg, filepath, content)\n // update info metadata when writing to workspace/base/conflict\n // For workspace writes, if a git base exists for this file, treat this\n // update as coming from the git base and build workspace/info based on\n // the git-scoped info; otherwise fall back to the default helper.\n if (seg === SEG_WORKSPACE) {\n const handled = await this._handleWorkspaceBlobWrite(store, filepath, content)\n if (handled) return\n }\n // For explicit info-workspace/info-git writes, we've already stored\n // the provided content directly; skip the generic metadata updater\n if (seg === SEG_INFO_WORKSPACE || seg === SEG_INFO_GIT) return\n\n // conflictBlob is a content-only blob; don't update metadata as it would\n // overwrite the conflict entry with minimal data and lose remoteSha/state fields\n if (seg === 'conflictBlob') return\n\n // For conflict segment, always use direct (unprefixed) info update to ensure\n // workspace-local entries are maintained and existing fields like remoteSha\n // are preserved in the conflict entry.\n const wrapped = (seg === SEG_WORKSPACE || seg === 'conflict')\n ? this._wrapStoreForInfoNoPrefix(store)\n : this._wrapStoreForInfoPrefix(store)\n await updateInfoForWrite(wrapped, filepath, seg, content)\n }\n\n /**\n * Handle workspace blob writes that should be based on existing git-scoped info.\n * Returns true when the operation is handled and caller should return early.\n * @param {any} store Storage object\n * @param {string} filepath File path\n * @param {string} content File content\n * @returns {Promise<boolean>}\n */\n private async _handleWorkspaceBlobWrite(store: any, filepath: string, content: string): Promise<boolean> {\n const branch = this.currentBranch || 'main'\n const gitBaseKey = `${branch}${BRANCH_SEP}${filepath}`\n if (!store.baseBlobs.has(gitBaseKey)) return false\n const gitInfoTxt = store.infoBlobs.has(gitBaseKey) ? store.infoBlobs.get(gitBaseKey)! : null\n let existing: any = undefined\n if (gitInfoTxt) {\n try { existing = JSON.parse(gitInfoTxt) } catch (error) { if (typeof console !== 'undefined' && (console as any).debug) (console as any).debug('parse gitInfoTxt failed', error); existing = undefined }\n }\n const sha = await this.shaOf(content)\n const now = Date.now()\n const entry = this._buildWorkspaceInfoEntry(existing, filepath, sha, now)\n store.infoBlobs.set(filepath, JSON.stringify(entry))\n return true\n }\n\n /**\n * Persist a blob into the appropriate in-memory map for the segment.\n * @param {any} store Storage object\n * @param {string} seg Segment name\n * @param {string} filepath File path\n * @param {string} content File content\n * @returns {void}\n */\n private _applyBlobToStore(store: any, seg: string, filepath: string, content: string): void {\n const branch = this.currentBranch || 'main'\n if (seg === SEG_WORKSPACE) store.workspaceBlobs.set(filepath, content)\n else if (seg === 'base') store.baseBlobs.set(`${branch}${BRANCH_SEP}${filepath}`, content)\n else if (seg === 'conflict') store.conflictBlobs.set(`${branch}${BRANCH_SEP}${filepath}`, content)\n // v0.0.4: conflictBlob segment for on-demand fetched conflict content\n else if (seg === 'conflictBlob') store.conflictBlobs.set(`${branch}${BRANCH_SEP}conflictBlob${BRANCH_SEP}${filepath}`, content)\n // Writes to the generic 'info' segment should create/update the\n // workspace-local (unprefixed) info entry so that subsequent\n // readBlob('info') returns the expected value. Dedicated helpers\n // exist for explicit workspace/git info variants.\n else if (seg === 'info') store.infoBlobs.set(filepath, content)\n else if (seg === SEG_INFO_WORKSPACE) store.infoBlobs.set(filepath, content)\n else if (seg === SEG_INFO_GIT) store.infoBlobs.set(`${branch}${BRANCH_SEP}${filepath}`, content)\n else throw new Error('unknown segment')\n }\n\n /**\n * Build the info entry for a write into a given segment.\n * @param {string} seg Segment name\n * @param {any} existing Existing info entry\n * @param {string} filepath File path\n * @param {string} sha SHA hash\n * @param {number} now Current timestamp\n * @returns {any} info entry object\n */\n private _buildInfoEntryForSeg(seg: string, existing: any, filepath: string, sha: string, now: number): any {\n if (seg === SEG_WORKSPACE) return this._buildWorkspaceInfoEntry(existing, filepath, sha, now)\n if (seg === 'base') return this._buildBaseInfoEntry(existing, filepath, sha, now)\n if (seg === 'conflict') return this._buildConflictInfoEntry(existing, filepath, now)\n // v0.0.4: conflictBlob is same as conflict (don't update info)\n if (seg === 'conflictBlob') return this._buildConflictInfoEntry(existing, filepath, now)\n return { path: filepath, updatedAt: now }\n }\n\n /**\n * Build info entry when writing to the workspace segment\n * @param {any} existing Existing info entry\n * @param {string} filepath File path\n * @param {string} sha SHA hash\n * @param {number} now Current timestamp\n * @returns {any}\n */\n private _buildWorkspaceInfoEntry(existing: any, filepath: string, sha: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.baseSha) entry.baseSha = existing.baseSha\n entry.workspaceSha = sha\n entry.state = entry.baseSha ? 'modified' : 'added'\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n return entry\n }\n\n /**\n * Build info entry when writing to the base segment\n * @param {any} existing Existing info entry\n * @param {string} filepath File path\n * @param {string} sha SHA hash\n * @param {number} now Current timestamp\n * @returns {any}\n */\n private _buildBaseInfoEntry(existing: any, filepath: string, sha: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.workspaceSha) entry.workspaceSha = existing.workspaceSha\n entry.baseSha = sha\n entry.state = 'base'\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n return entry\n }\n\n /**\n * Build info entry when writing to the conflict segment\n * @param {any} existing Existing info entry\n * @param {string} filepath File path\n * @param {number} now Current timestamp\n * @returns {any}\n */\n private _buildConflictInfoEntry(existing: any, filepath: string, now: number): any {\n const entry: any = { path: filepath, updatedAt: now }\n if (existing && existing.baseSha) entry.baseSha = existing.baseSha\n if (existing && existing.workspaceSha) entry.workspaceSha = existing.workspaceSha\n if (existing && existing.remoteSha) entry.remoteSha = existing.remoteSha\n entry.state = 'conflict'\n return entry\n }\n\n /**\n * \u6307\u5B9A\u30D1\u30B9\u306E\u5185\u5BB9\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param {string} filepath \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @param {any} [segment] Storage segment\n * @returns {Promise<string|null>} \u5185\u5BB9\u3001\u5B58\u5728\u3057\u306A\u3051\u308C\u3070 null\n */\n async readBlob(filepath: string, segment?: any): Promise<string | null> {\n const store = InMemoryStorage.stores.get(this.rootKey)!\n return this._readInMemoryBlob(store, filepath, segment)\n }\n\n /**\n * Read blob with segment logic extracted for clarity.\n * @param {any} store Storage object\n * @param {string} filepath File path\n * @param {any} [segment] Storage segment\n * @returns {string | null}\n */\n private _readInMemoryBlob(store: any, filepath: string, segment?: any): string | null {\n // Delegate segment-specific handling to a helper for clarity\n if (segment !== undefined) return this._readInMemoryBlobWithSegment(store, filepath, String(segment))\n\n const workspace = store.workspaceBlobs\n if (workspace && workspace.has(filepath)) return workspace.get(filepath)!\n const base = store.baseBlobs\n const branch = this.currentBranch || 'main'\n if (base && base.has(`${branch}${BRANCH_SEP}${filepath}`)) return base.get(`${branch}${BRANCH_SEP}${filepath}`)!\n return null\n }\n\n /**\n * Handle reading when a segment is explicitly provided.\n * @param {any} store Storage object\n * @param {string} filepath File path\n * @param {string} seg Segment name\n * @returns {string | null}\n */\n private _readInMemoryBlobWithSegment(store: any, filepath: string, seg: string): string | null {\n const branch = this.currentBranch || 'main'\n // Delegate specific segment handling to helpers to reduce cognitive complexity\n if (seg === SEG_INFO_WORKSPACE) return this._handleInfoWorkspaceSegment(store, filepath)\n if (seg === SEG_INFO_GIT) return this._handleInfoGitSegment(store, branch, filepath)\n if (seg === 'info') return this._handleInfoGenericSegment(store, branch, filepath)\n if (seg === 'conflictBlob') return this._handleConflictBlobSegment(store, branch, filepath)\n\n const segmentToStore = {\n [SEG_WORKSPACE]: store.workspaceBlobs,\n base: store.baseBlobs,\n conflict: store.conflictBlobs,\n info: store.infoBlobs,\n } as Record<string, Map<string, string>>\n return this._getFromSegmentMap(segmentToStore, seg, branch, filepath)\n }\n\n /**\n * Handle explicit workspace-info segment read.\n * @param {any} store Storage object\n * @param {string} filepath File path\n * @returns {string|null}\n */\n private _handleInfoWorkspaceSegment(store: any, filepath: string): string | null {\n const infoWs = this._readInfoWorkspace(store, filepath)\n return infoWs !== undefined ? infoWs : null\n }\n\n /**\n * Handle explicit git-scoped info segment read.\n * @param {any} store Storage object\n * @param {string} branch Branch name\n * @param {string} filepath File path\n * @returns {string|null}\n */\n private _handleInfoGitSegment(store: any, branch: string, filepath: string): string | null {\n const infoGit = this._readInfoGit(store, branch, filepath)\n return infoGit !== undefined ? infoGit : null\n }\n\n /**\n * Handle generic info segment read (prefer workspace then git-prefixed).\n * @param {any} store Storage object\n * @param {string} branch Branch name\n * @param {string} filepath File path\n * @returns {string|null}\n */\n private _handleInfoGenericSegment(store: any, branch: string, filepath: string): string | null {\n const infoWs = this._readInfoWorkspace(store, filepath)\n if (infoWs !== undefined) return infoWs\n const infoGit = this._readInfoGit(store, branch, filepath)\n return infoGit !== undefined ? infoGit : null\n }\n\n /**\n * Handle conflictBlob explicit segment read.\n * @param {any} store Storage object\n * @param {string} branch Branch name\n * @param {string} filepath File path\n * @returns {string|null}\n */\n private _handleConflictBlobSegment(store: any, branch: string, filepath: string): string | null {\n const conflictBlob = this._readConflictBlob(store, branch, filepath)\n return conflictBlob !== undefined ? conflictBlob : null\n }\n\n /**\n * Read a branch-prefixed info entry if present.\n * @param {any} store storage object\n * @param {string} branch branch name\n * @param {string} filepath file path\n * @returns {string|null|undefined} stored info string or undefined when not present\n */\n private _readInfoGit(store: any, branch: string, filepath: string): string | null | undefined {\n if (store.infoBlobs.has(`${branch}${BRANCH_SEP}${filepath}`)) return store.infoBlobs.get(`${branch}${BRANCH_SEP}${filepath}`)!\n return undefined\n }\n\n /**\n * Read a workspace-local info entry if present.\n * @param {any} store storage object\n * @param {string} filepath file path\n * @returns {string|null|undefined} stored info string or undefined when not present\n */\n private _readInfoWorkspace(store: any, filepath: string): string | null | undefined {\n if (store.infoBlobs.has(filepath)) return store.infoBlobs.get(filepath)!\n return undefined\n }\n\n /**\n * Read an on-demand conflict blob if present.\n * @param {any} store storage object\n * @param {string} branch branch name\n * @param {string} filepath file path\n * @returns {string|null|undefined} stored conflict blob or undefined when not present\n */\n private _readConflictBlob(store: any, branch: string, filepath: string): string | null | undefined {\n const key = `${branch}${BRANCH_SEP}conflictBlob${BRANCH_SEP}${filepath}`\n if (store.conflictBlobs.has(key)) return store.conflictBlobs.get(key)!\n return undefined\n }\n\n /**\n * Helper to read from a mapped segment store using prefixed/unprefixed keys.\n * @param {Record<string, Map<string, string>>} map segment->store map\n * @param {string} seg requested segment\n * @param {string} branch branch name for prefixed keys\n * @param {string} filepath file path to lookup\n * @returns {string|null} stored value or null\n */\n private _getFromSegmentMap(map: Record<string, Map<string, string>>, seg: string, branch: string, filepath: string): string | null {\n const m = map[seg]\n if (!m) return null\n if (m.has(filepath)) return m.get(filepath)!\n const key = `${branch}${BRANCH_SEP}${filepath}`\n return m.has(key) ? m.get(key)! : null\n }\n\n /**\n * \u6307\u5B9A\u30D1\u30B9\u306E\u30A8\u30F3\u30C8\u30EA\u3092\u524A\u9664\u3057\u307E\u3059\u3002\n * @param {string} filepath \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @param {any} [segment] Storage segment\n * @returns {Promise<void>}\n */\n async deleteBlob(filepath: string, segment?: any): Promise<void> {\n // If segment specified, delete only that segment\n const store = InMemoryStorage.stores.get(this.rootKey)!\n const branch = this.currentBranch || 'main'\n if (segment === SEG_WORKSPACE) { store.workspaceBlobs.delete(filepath); return }\n if (segment === 'base') { store.baseBlobs.delete(`${branch}${BRANCH_SEP}${filepath}`); return }\n if (segment === 'conflict') { store.conflictBlobs.delete(`${branch}${BRANCH_SEP}${filepath}`); return }\n // v0.0.4: conflictBlob segment deletion\n if (segment === 'conflictBlob') { store.conflictBlobs.delete(`${branch}${BRANCH_SEP}conflictBlob${BRANCH_SEP}${filepath}`); return }\n if (segment === 'info') { store.infoBlobs.delete(filepath); store.infoBlobs.delete(`${branch}${BRANCH_SEP}${filepath}`); return }\n if (segment === SEG_INFO_WORKSPACE) { store.infoBlobs.delete(filepath); return }\n if (segment === SEG_INFO_GIT) { store.infoBlobs.delete(`${branch}${BRANCH_SEP}${filepath}`); return }\n // otherwise delete from all segments\n store.workspaceBlobs.delete(filepath)\n store.baseBlobs.delete(`${branch}${BRANCH_SEP}${filepath}`)\n store.conflictBlobs.delete(`${branch}${BRANCH_SEP}${filepath}`)\n store.conflictBlobs.delete(`${branch}${BRANCH_SEP}conflictBlob${BRANCH_SEP}${filepath}`)\n store.infoBlobs.delete(`${branch}${BRANCH_SEP}${filepath}`)\n store.infoBlobs.delete(filepath)\n }\n\n /**\n * \u6307\u5B9A\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u914D\u4E0B\u306E\u30D5\u30A1\u30A4\u30EB\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\n * @param {string} [prefix] \u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\uFF08\u4F8B: 'dir/sub'\uFF09\n * @param {any} [segment] \u30BB\u30B0\u30E1\u30F3\u30C8\uFF08'workspace' \u7B49\uFF09\u3002\u7701\u7565\u6642\u306F 'workspace'\n * @param {boolean} [recursive] \u30B5\u30D6\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3082\u542B\u3081\u308B\u304B\u3002\u7701\u7565\u6642\u306F true\n * @returns {Promise<Array<{ path: string; info: string | null }>>}\n */\n async listFiles(prefix?: string, segment?: any, recursive = true): Promise<Array<{ path: string; info: string | null }>> {\n const seg = segment || SEG_WORKSPACE\n const store = InMemoryStorage.stores.get(this.rootKey)!\n const segmentToStore = {\n [SEG_WORKSPACE]: store.workspaceBlobs,\n base: store.baseBlobs,\n conflict: store.conflictBlobs,\n info: store.infoBlobs,\n } as Record<string, Map<string, string>>\n\n const m = segmentToStore[String(seg)]\n if (!m) return []\n\n const p = prefix ? prefix.replace(/^\\/+|\\/+$/g, '') : ''\n const allKeys = Array.from(m.keys())\n const keys = this._resolveKeysForList(allKeys, String(seg), p, recursive)\n\n return this._collectFilesInMemory(keys, store)\n }\n\n /**\n * Resolve and filter keys for `listFiles` into final key list.\n * @param {string[]} allKeys All keys from store\n * @param {string} seg Segment name\n * @param {string} p Path prefix\n * @param {boolean} recursive Whether to include subdirectories\n * @returns {string[]} filtered keys\n */\n private _resolveKeysForList(allKeys: string[], seg: string, p: string, recursive: boolean): string[] {\n let keys = allKeys.slice()\n if (seg === 'info') {\n const branch = this.currentBranch || 'main'\n const unpref = keys.filter((k) => !k.startsWith(branch + BRANCH_SEP))\n const pref = keys.filter((k) => k.startsWith(branch + BRANCH_SEP)).map((k) => k.slice((branch + BRANCH_SEP).length))\n keys = Array.from(new Set(unpref.concat(pref)))\n } else if (seg !== SEG_WORKSPACE) {\n const branch = this.currentBranch || 'main'\n keys = keys.filter((k) => k.startsWith(branch + BRANCH_SEP)).map((k) => k.slice((branch + BRANCH_SEP).length))\n }\n return this._filterKeys(keys, p, recursive)\n }\n\n /**\n * Collect file info objects for keys array (InMemory implementation).\n * @param {string[]} keys Array of keys\n * @param {any} store Storage object\n * @returns {Array<{path:string, info:string|null}>}\n */\n private _collectFilesInMemory(keys: string[], store: any): Array<{ path: string; info: string | null }> {\n const out: Array<{ path: string; info: string | null }> = []\n const branch = this.currentBranch || 'main'\n for (const k of keys) {\n let info: string | null = null\n if (store.infoBlobs.has(k)) info = store.infoBlobs.get(k)!\n else if (store.infoBlobs.has(`${branch}${BRANCH_SEP}${k}`)) info = store.infoBlobs.get(`${branch}${BRANCH_SEP}${k}`)!\n out.push({ path: k, info })\n }\n return out\n }\n\n /**\n * Filter keys by prefix and recursion flag for InMemoryStorage\n * @param {string[]} keys Array of keys\n * @param {string} p Path prefix\n * @param {boolean} recursive Whether to include subdirectories\n * @returns {string[]}\n */\n private _filterKeys(keys: string[], p: string, recursive: boolean): string[] {\n if (p) keys = keys.filter((k) => k === p || k.startsWith(p + '/'))\n if (!recursive) {\n keys = keys.filter((k) => {\n const rest = p ? k.slice(p.length + (p ? 1 : 0)) : k\n return !rest.includes('/')\n })\n }\n return keys\n }\n\n /**\n * Wrap store to present branch-prefixed info accessors\n * @param {any} store Storage object\n * @returns {any} wrapped store view for info access\n */\n private _wrapStoreForInfoPrefix(store: any): any {\n const branch = this.currentBranch || 'main'\n /**\n * Create branch-prefixed storage key\n * @param {string} k key path\n * @returns {string} prefixed key\n */\n const prefixKey = (k: string) => `${branch}${BRANCH_SEP}${k}`\n return Object.assign({}, store, {\n infoBlobs: {\n /**\n * Check whether prefixed key exists\n * @param {string} k key\n * @returns {boolean}\n */\n has: (k: string) => store.infoBlobs.has(k) || store.infoBlobs.has(prefixKey(k)),\n /**\n * Get value preferring unprefixed then branch-prefixed key\n * @param {string} k key\n * @returns {string | undefined}\n */\n get: (k: string) => {\n if (store.infoBlobs.has(k)) return store.infoBlobs.get(k)\n return store.infoBlobs.get(prefixKey(k))\n },\n /**\n * Set value: prefer updating an existing unprefixed entry if present;\n * otherwise write into the branch-prefixed key. This preserves the\n * expected read semantics where workspace-local info takes precedence.\n * @param {string} k key\n * @param {string} v value\n * @returns {any}\n */\n set: (k: string, v: string) => {\n if (store.infoBlobs.has(k)) return store.infoBlobs.set(k, v)\n return store.infoBlobs.set(prefixKey(k), v)\n },\n /**\n * Delete both unprefixed and prefixed keys\n * @param {string} k key\n * @returns {boolean}\n */\n delete: (k: string) => { store.infoBlobs.delete(k); return store.infoBlobs.delete(prefixKey(k)) }\n }\n })\n }\n\n /**\n * Wrap store to present unprefixed info accessors\n * @param {any} store Storage object\n * @returns {any} wrapped store view for info access\n */\n private _wrapStoreForInfoNoPrefix(store: any): any {\n return Object.assign({}, store, {\n infoBlobs: {\n /**\n * Check whether key exists\n * @param {string} k key\n * @returns {boolean}\n */\n has: (k: string) => store.infoBlobs.has(k),\n /**\n * Get value for key\n * @param {string} k key\n * @returns {string | undefined}\n */\n get: (k: string) => store.infoBlobs.get(k),\n /**\n * Set value for key\n * @param {string} k key\n * @param {string} v value\n * @returns {void}\n */\n set: (k: string, v: string) => store.infoBlobs.set(k, v),\n /**\n * Delete key\n * @param {string} k key\n * @returns {boolean}\n */\n delete: (k: string) => store.infoBlobs.delete(k)\n }\n })\n }\n\n /**\n * Calculate SHA-1 hex digest of given content.\n * @param {string} content Input string\n * @returns {Promise<string>} Hex encoded SHA-1 digest\n */\n private async shaOf(content: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(content)\n const hashBuffer = await crypto.subtle.digest('SHA-1', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n }\n\n /**\n * \u6307\u5B9A\u3055\u308C\u305F\u30EB\u30FC\u30C8\u540D\u3092\u524A\u9664\u3057\u307E\u3059\n * @param {string} rootName \u524A\u9664\u3059\u308B\u30EB\u30FC\u30C8\u540D\n * @returns {void}\n */\n static delete(rootName: string): void {\n // Accept either a full namespaced key or a bare directory name.\n if (InMemoryStorage.stores.has(rootName)) {\n InMemoryStorage.stores.delete(rootName)\n return\n }\n // If a bare rootName was provided, try to find a namespaced key that ends with it\n for (const key of Array.from(InMemoryStorage.stores.keys())) {\n if (key === rootName || key.endsWith('/' + rootName)) {\n InMemoryStorage.stores.delete(key)\n return\n }\n }\n throw new Error(`InMemory root \"${rootName}\" not found`)\n }\n\n}\n\nexport default InMemoryStorage\n\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["OpfsStorage", "fh", "file", "writable", "existingTxt", "shaOf", "shaOf", "shaOf", "IndexedDatabaseStorage", "shaOf", "InMemoryStorage"]
|
|
7
7
|
}
|