@tutti-os/workspace-file-manager 0.0.1
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/LICENSE +202 -0
- package/README.md +51 -0
- package/dist/chunk-2AG4ND4D.js +208 -0
- package/dist/chunk-2AG4ND4D.js.map +1 -0
- package/dist/chunk-IMOFXYBB.js +1759 -0
- package/dist/chunk-IMOFXYBB.js.map +1 -0
- package/dist/fileKinds-MpDaZhVB.d.ts +392 -0
- package/dist/i18n/index.d.ts +2 -0
- package/dist/i18n/index.js +11 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index-6L2biT8M.d.ts +90 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +2802 -0
- package/dist/index.js.map +1 -0
- package/dist/services/index.d.ts +8 -0
- package/dist/services/index.js +41 -0
- package/dist/services/index.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/services/internal/workspaceFileManagerStore.ts","../src/services/workspaceFileManagerTypes.ts","../src/services/internal/model/fileKinds.ts","../src/services/internal/model/formatters.ts","../src/services/internal/model/paths.ts","../src/services/internal/model/validation.ts","../src/services/internal/workspaceFileManagerSession.ts","../src/services/internal/workspaceFileManagerActivationController.ts","../src/services/internal/workspaceFileManagerMutationController.ts","../src/services/internal/workspaceFileManagerNavigationController.ts","../src/services/internal/workspaceFileManagerPreviewController.ts","../src/services/internal/workspaceFileManagerImportController.ts","../src/services/internal/model/openWithApplicationsCache.ts","../src/services/internal/workspaceFileManagerService.ts","../src/services/createWorkspaceFileManagerService.ts"],"sourcesContent":["import { proxy } from \"valtio\";\nimport {\n workspaceFileManagerPersistedStateSchemaVersion,\n workspaceFileManagerLogicalRoot,\n type WorkspaceFileManagerCapabilities,\n type WorkspaceFileManagerPersistedState,\n type WorkspaceFileManagerState\n} from \"../workspaceFileManagerTypes.ts\";\nimport { normalizeWorkspaceFilePath } from \"../workspaceFileManagerModel.ts\";\n\nexport function createWorkspaceFileManagerStore(input: {\n capabilities: WorkspaceFileManagerCapabilities;\n initialDirectoryPath?: string;\n persistedState?: WorkspaceFileManagerPersistedState | null;\n workspaceID: string;\n}): WorkspaceFileManagerState {\n const persistedState = normalizeWorkspaceFileManagerPersistedState(\n input.persistedState\n );\n const initialDirectoryPath = normalizeWorkspaceFilePath(\n input.initialDirectoryPath\n );\n return proxy<WorkspaceFileManagerState>({\n busyAction: null,\n capabilities: input.capabilities,\n contextMenu: null,\n contextMenuEntryPath: null,\n createDialog: null,\n currentDirectoryPath:\n persistedState?.currentDirectoryPath ??\n initialDirectoryPath ??\n workspaceFileManagerLogicalRoot,\n deleteDialog: null,\n inlineRenameEntryPath: null,\n inlineRenameValidation: null,\n dragDepth: 0,\n entries: [],\n error: null,\n isLoading: false,\n isMutating: false,\n isSearching: false,\n navigationBackStack: persistedState?.navigationBackStack ?? [],\n navigationForwardStack: persistedState?.navigationForwardStack ?? [],\n pendingDirectoryPath: null,\n previewState: { status: \"empty\" },\n root: workspaceFileManagerLogicalRoot,\n searchEntries: [],\n searchError: null,\n searchQuery: \"\",\n selectedPath: null,\n unsupportedDialog: null,\n importConflictDialog: null,\n workspaceID: input.workspaceID\n });\n}\n\nexport function getWorkspaceFileManagerPersistedState(\n state: WorkspaceFileManagerState\n): WorkspaceFileManagerPersistedState {\n return {\n currentDirectoryPath: normalizeWorkspaceFilePath(\n state.currentDirectoryPath,\n state.root\n ),\n navigationBackStack: normalizePersistedStack(\n state.navigationBackStack,\n state.root\n ),\n navigationForwardStack: normalizePersistedStack(\n state.navigationForwardStack,\n state.root\n ),\n schemaVersion: workspaceFileManagerPersistedStateSchemaVersion\n };\n}\n\nexport function normalizeWorkspaceFileManagerPersistedState(\n value: WorkspaceFileManagerPersistedState | null | undefined\n): WorkspaceFileManagerPersistedState | null {\n if (\n !isPersistedStateRecord(value) ||\n value.schemaVersion !== workspaceFileManagerPersistedStateSchemaVersion ||\n typeof value.currentDirectoryPath !== \"string\" ||\n !isStringArray(value.navigationBackStack) ||\n !isStringArray(value.navigationForwardStack)\n ) {\n return null;\n }\n\n return {\n currentDirectoryPath: normalizeWorkspaceFilePath(\n value.currentDirectoryPath\n ),\n navigationBackStack: normalizePersistedStack(value.navigationBackStack),\n navigationForwardStack: normalizePersistedStack(\n value.navigationForwardStack\n ),\n schemaVersion: workspaceFileManagerPersistedStateSchemaVersion\n };\n}\n\nfunction isPersistedStateRecord(\n value: unknown\n): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return (\n Array.isArray(value) && value.every((item) => typeof item === \"string\")\n );\n}\n\nfunction normalizePersistedStack(\n values: readonly string[] | undefined,\n root?: string | null\n): string[] {\n if (!Array.isArray(values)) {\n return [];\n }\n return values\n .map((value) =>\n typeof value === \"string\" ? normalizeWorkspaceFilePath(value, root) : null\n )\n .filter((value): value is string => value !== null);\n}\n","import type {\n WorkspaceFileManagerHostFallbackAction,\n WorkspaceFileManagerHostImportConflict\n} from \"./workspaceFileManagerHostTypes.ts\";\n\nexport const workspaceFileManagerLogicalRoot = \"/\" as const;\n\nexport type WorkspaceFileEntryKind = \"file\" | \"directory\" | \"unknown\";\nexport type WorkspaceFileSearchMatchTarget = \"basename\" | \"path\";\nexport type WorkspaceFileImportConflictKind = \"replaceable\" | \"type_mismatch\";\nexport type WorkspaceFilePreviewKind = \"image\" | \"text\";\nexport const workspaceFileManagerPersistedStateSchemaVersion = 2 as const;\n\nexport interface WorkspaceFileEntry {\n hasChildren: boolean;\n kind: WorkspaceFileEntryKind;\n mtimeMs: number | null;\n name: string;\n path: string;\n sizeBytes: number | null;\n}\n\nexport interface WorkspaceFileActivationTarget {\n fileKind: WorkspaceFilePreviewKind;\n mtimeMs: number | null;\n name: string;\n path: string;\n sizeBytes: number | null;\n}\n\nexport type WorkspaceFilePreviewState =\n | { status: \"empty\" }\n | { entry: WorkspaceFileEntry; status: \"directory\" }\n | { entry: WorkspaceFileActivationTarget; status: \"loading\" }\n | { content: string; entry: WorkspaceFileActivationTarget; status: \"text\" }\n | { entry: WorkspaceFileActivationTarget; objectUrl: string; status: \"image\" }\n | { entry: WorkspaceFileEntry; message: string; status: \"unsupported\" }\n | { entry: WorkspaceFileEntry; message: string; status: \"readonly\" }\n | { entry: WorkspaceFileEntry; message: string; status: \"error\" };\n\nexport interface WorkspaceFileDirectoryListing {\n directoryPath: string;\n entries: WorkspaceFileEntry[];\n root: string;\n workspaceID: string;\n}\n\nexport interface WorkspaceFileSearchEntry {\n directoryPath: string;\n kind: WorkspaceFileEntryKind;\n matchIndices: number[];\n matchTarget: WorkspaceFileSearchMatchTarget;\n name: string;\n path: string;\n score: number;\n}\n\nexport interface WorkspaceFileSearchResult {\n entries: WorkspaceFileSearchEntry[];\n root: string;\n workspaceID: string;\n}\n\nexport interface WorkspaceFileImportConflict {\n conflictKind: WorkspaceFileImportConflictKind;\n destinationKind: WorkspaceFileEntryKind;\n destinationPath: string;\n name: string;\n sourcePath: string;\n}\n\nexport type WorkspaceFileImportSummaryReason =\n | \"ignored\"\n | \"symlink\"\n | \"system_metadata\";\n\nexport interface WorkspaceFileImportSummaryReasonCount {\n count: number;\n reason: WorkspaceFileImportSummaryReason;\n}\n\nexport interface WorkspaceFileImportSummary {\n filteredCount?: number;\n ignoredCount?: number;\n reasonBreakdown?: WorkspaceFileImportSummaryReasonCount[];\n selectedCount?: number;\n}\n\nexport interface WorkspaceFileManagerPersistedState {\n currentDirectoryPath: string;\n navigationBackStack: string[];\n navigationForwardStack: string[];\n schemaVersion: typeof workspaceFileManagerPersistedStateSchemaVersion;\n}\n\nexport interface WorkspaceFileSearchInput {\n includeKinds?: Extract<WorkspaceFileEntryKind, \"file\" | \"directory\">[];\n limit?: number;\n query: string;\n}\n\nexport interface WorkspaceFileOpenWithApplication {\n applicationPath: string;\n iconDataUrl?: string | null;\n name: string;\n}\n\nexport interface WorkspaceFileManagerCapabilities {\n canCopy: boolean;\n canCreateDirectory: boolean;\n canCreateFile: boolean;\n canDelete: boolean;\n canExport: boolean;\n canImportFromDrop: boolean;\n canImportFromPicker: boolean;\n canMove: boolean;\n canOpenInAppBrowser: boolean;\n canOpenInDefaultBrowser: boolean;\n canOpenWith: boolean;\n canPickOtherOpenWithApplication: boolean;\n canRevealInFolder: boolean;\n canRename: boolean;\n canSearch: boolean;\n}\n\nexport type WorkspaceFileManagerBusyAction =\n | \"create\"\n | \"delete\"\n | \"export\"\n | \"import\"\n | \"move\"\n | \"rename\"\n | \"view\";\n\nexport interface WorkspaceFileManagerCreateDialogState {\n errorMessage: string | null;\n kind: \"directory\" | \"file\";\n name: string;\n}\n\nexport type WorkspaceFileManagerInlineRenameValidation = \"invalid\" | \"required\";\n\nexport interface WorkspaceFileManagerDeleteDialogState {\n entryPath: string;\n}\n\nexport interface WorkspaceFileManagerContextMenuState {\n entryPath: string | null;\n x: number;\n y: number;\n}\n\nexport interface WorkspaceFileManagerUnsupportedDialogState {\n actions?: WorkspaceFileManagerHostFallbackAction[] | null;\n entryPath?: string | null;\n kind: \"import\" | \"view\";\n message?: string | null;\n title?: string | null;\n}\n\nexport interface WorkspaceFileManagerState {\n busyAction: WorkspaceFileManagerBusyAction | null;\n capabilities: WorkspaceFileManagerCapabilities;\n contextMenu: WorkspaceFileManagerContextMenuState | null;\n contextMenuEntryPath: string | null;\n createDialog: WorkspaceFileManagerCreateDialogState | null;\n currentDirectoryPath: string;\n deleteDialog: WorkspaceFileManagerDeleteDialogState | null;\n inlineRenameEntryPath: string | null;\n inlineRenameValidation: WorkspaceFileManagerInlineRenameValidation | null;\n dragDepth: number;\n entries: WorkspaceFileEntry[];\n error: string | null;\n isLoading: boolean;\n isMutating: boolean;\n isSearching: boolean;\n navigationBackStack: string[];\n navigationForwardStack: string[];\n pendingDirectoryPath: string | null;\n previewState: WorkspaceFilePreviewState;\n root: string;\n searchEntries: WorkspaceFileSearchEntry[];\n searchError: string | null;\n searchQuery: string;\n selectedPath: string | null;\n unsupportedDialog: WorkspaceFileManagerUnsupportedDialogState | null;\n importConflictDialog: WorkspaceFileManagerHostImportConflict | null;\n workspaceID: string;\n}\n","import {\n classifyWorkspaceFilePreviewKind as classifySharedWorkspaceFilePreviewKind,\n resolveWorkspaceFileActivationTarget as resolveSharedWorkspaceFileActivationTarget,\n resolveWorkspaceFilePreviewReadiness as resolveSharedWorkspaceFilePreviewReadiness\n} from \"@tutti-os/workspace-file-preview\";\nimport type {\n WorkspaceFilePreviewLoadedState,\n WorkspaceFilePreviewReadonlyReason\n} from \"@tutti-os/workspace-file-preview\";\nimport type {\n WorkspaceFileActivationTarget,\n WorkspaceFileEntry,\n WorkspaceFilePreviewKind\n} from \"../../workspaceFileManagerTypes.ts\";\n\nexport {\n copyWorkspaceFilePreviewBytes,\n createWorkspaceFilePreviewLoadedState,\n decodeWorkspaceTextFile,\n formatWorkspacePreviewByteLimit,\n isWorkspaceFileBrowserOpenable,\n isWorkspacePreviewFileTooLarge,\n isWorkspaceTextFileTooLarge,\n looksLikeBinaryText,\n normalizeWorkspaceFilePreviewBytes,\n resolveWorkspaceFileExtension,\n resolveWorkspaceFileVisualKind,\n resolveWorkspaceImageMimeType,\n workspaceFilePreviewMaxBytes,\n workspaceFileTextMaxBytes\n} from \"@tutti-os/workspace-file-preview\";\nexport type { WorkspaceFileVisualKind } from \"@tutti-os/workspace-file-preview\";\n\nexport function classifyWorkspaceFilePreviewKind(\n entry: WorkspaceFileEntry\n): WorkspaceFilePreviewKind | null {\n return classifySharedWorkspaceFilePreviewKind(entry);\n}\n\nexport function resolveWorkspaceFileActivationTarget(\n entry: WorkspaceFileEntry\n): WorkspaceFileActivationTarget | null {\n const target = resolveSharedWorkspaceFileActivationTarget(entry);\n if (!target) {\n return null;\n }\n\n return {\n fileKind: target.fileKind,\n mtimeMs: target.mtimeMs ?? null,\n name: target.name,\n path: target.path,\n sizeBytes: target.sizeBytes ?? null\n };\n}\n\nexport type WorkspaceFilePreviewReadiness =\n | { entry: WorkspaceFileEntry; status: \"directory\" }\n | {\n entry: WorkspaceFileEntry;\n maxSizeBytes: number;\n reason: Extract<\n WorkspaceFilePreviewReadonlyReason,\n \"file_too_large\" | \"text_too_large\"\n >;\n status: \"readonly\";\n }\n | { entry: WorkspaceFileEntry; status: \"unsupported\" }\n | {\n entry: WorkspaceFileEntry;\n status: \"ready\";\n target: WorkspaceFileActivationTarget;\n };\n\nexport function resolveWorkspaceFilePreviewReadiness(\n entry: WorkspaceFileEntry\n): WorkspaceFilePreviewReadiness {\n const readiness = resolveSharedWorkspaceFilePreviewReadiness(entry);\n if (readiness.status !== \"ready\") {\n return readiness;\n }\n\n return {\n entry,\n status: \"ready\",\n target: {\n fileKind: readiness.target.fileKind,\n mtimeMs: readiness.target.mtimeMs ?? null,\n name: readiness.target.name,\n path: readiness.target.path,\n sizeBytes: readiness.target.sizeBytes ?? null\n }\n };\n}\n\nexport type WorkspaceFilePreviewLoadedResult = WorkspaceFilePreviewLoadedState<\n WorkspaceFileEntry,\n WorkspaceFileActivationTarget\n>;\n","import { formatNextopShortDateTime } from \"@tutti-os/ui-system/date-format\";\nimport type { NextopDateLocale } from \"@tutti-os/ui-system/date-format\";\n\nexport function formatWorkspaceFileBytes(sizeBytes: number | null): string {\n if (sizeBytes === null || !Number.isFinite(sizeBytes)) {\n return \"--\";\n }\n if (sizeBytes < 1024) {\n return `${sizeBytes} B`;\n }\n const units = [\"KB\", \"MB\", \"GB\", \"TB\"];\n let value = sizeBytes / 1024;\n let unitIndex = 0;\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex += 1;\n }\n return `${value >= 10 ? value.toFixed(1) : value.toFixed(2)} ${units[unitIndex]}`;\n}\n\nexport function formatWorkspaceFileModifiedTime(\n mtimeMs: number | null,\n locale?: NextopDateLocale\n): string {\n if (mtimeMs === null || !Number.isFinite(mtimeMs) || mtimeMs <= 0) {\n return \"--\";\n }\n return formatNextopShortDateTime(mtimeMs, locale);\n}\n\nexport function splitWorkspaceFileName(name: string): {\n end: string;\n start: string;\n} {\n const extensionIndex = name.lastIndexOf(\".\");\n const hasExtension = extensionIndex > 0 && extensionIndex < name.length - 1;\n if (hasExtension) {\n return {\n end: name.slice(extensionIndex),\n start: name.slice(0, extensionIndex)\n };\n }\n if (name.length <= 24) {\n return { end: \"\", start: name };\n }\n return {\n end: name.slice(-10),\n start: name.slice(0, -10)\n };\n}\n","import {\n workspaceFileManagerLogicalRoot,\n type WorkspaceFileEntry\n} from \"../../workspaceFileManagerTypes.ts\";\n\nexport function normalizeWorkspaceFilePath(\n value?: string | null,\n rootPath?: string | null\n): string {\n const root = normalizeWorkspaceFileAbsolutePath(rootPath);\n const raw = String(value ?? \"\")\n .trim()\n .replaceAll(\"\\\\\", \"/\");\n if (!raw) {\n return root;\n }\n\n if (!raw.startsWith(\"/\") && root) {\n return normalizeWorkspaceFileAbsolutePath(`${root}/${raw}`);\n }\n\n return normalizeWorkspaceFileAbsolutePath(raw);\n}\n\nfunction normalizeWorkspaceFileAbsolutePath(value?: string | null): string {\n const raw = String(value ?? \"\")\n .trim()\n .replaceAll(\"\\\\\", \"/\");\n if (!raw) {\n return workspaceFileManagerLogicalRoot;\n }\n\n const segments = raw\n .split(\"/\")\n .filter(Boolean)\n .filter((segment) => segment !== \".\");\n const result: string[] = [];\n for (const segment of segments) {\n if (segment === \"..\") {\n result.pop();\n continue;\n }\n result.push(segment);\n }\n\n if (result.length === 0) {\n return workspaceFileManagerLogicalRoot;\n }\n return `/${result.join(\"/\")}`;\n}\n\nexport function workspaceFileName(path: string): string {\n return (\n normalizeWorkspaceFilePath(path).split(\"/\").filter(Boolean).at(-1) ??\n \"workspace\"\n );\n}\n\nexport function workspaceFileDirectory(\n path: string,\n rootPath?: string | null\n): string {\n const root = normalizeWorkspaceFilePath(rootPath);\n const normalized = normalizeWorkspaceFilePath(path, root);\n if (normalized === root) {\n return root;\n }\n\n const parts = normalized.split(\"/\").filter(Boolean);\n parts.pop();\n if (parts.length === 0) {\n return root;\n }\n const directory = `/${parts.join(\"/\")}`;\n if (root !== workspaceFileManagerLogicalRoot) {\n return isWorkspaceFilePathWithinRoot(directory, root) ? directory : root;\n }\n return directory;\n}\n\nexport function isHiddenWorkspaceDirectoryEntry(\n entry: WorkspaceFileEntry\n): boolean {\n return entry.kind === \"directory\" && entry.name.startsWith(\".\");\n}\n\nexport function workspaceFilePathHasHiddenSegment(path: string): boolean {\n return normalizeWorkspaceFilePath(path)\n .split(\"/\")\n .filter(Boolean)\n .some((segment) => segment.startsWith(\".\"));\n}\n\nexport function filterVisibleWorkspaceEntries(\n entries: WorkspaceFileEntry[]\n): WorkspaceFileEntry[] {\n return entries.filter((entry) => !isHiddenWorkspaceDirectoryEntry(entry));\n}\n\nexport function sortWorkspaceEntries(\n entries: WorkspaceFileEntry[]\n): WorkspaceFileEntry[] {\n return [...entries].sort((left, right) => {\n if (left.kind !== right.kind) {\n return left.kind === \"directory\" ? -1 : 1;\n }\n return left.name.localeCompare(right.name, undefined, {\n sensitivity: \"base\"\n });\n });\n}\n\nexport function buildWorkspaceFileBreadcrumbs(\n path: string,\n rootLabel: string,\n rootPath?: string | null\n): Array<{ label: string; path: string }> {\n const root = normalizeWorkspaceFilePath(rootPath);\n const current = normalizeWorkspaceFilePath(path, root);\n const relative =\n current === root ? \"\" : current.slice(root.length).replace(/^\\//, \"\");\n const breadcrumbs: Array<{ label: string; path: string }> = [\n { label: rootLabel, path: root }\n ];\n let cursor = root;\n for (const segment of relative.split(\"/\").filter(Boolean)) {\n cursor = `${cursor}/${segment}`.replace(/\\/+/g, \"/\");\n breadcrumbs.push({ label: segment, path: cursor });\n }\n return breadcrumbs;\n}\n\nexport function isWorkspaceFilePathWithinRoot(\n path: string,\n rootPath?: string | null\n): boolean {\n const root = normalizeWorkspaceFilePath(rootPath);\n const normalized = normalizeWorkspaceFilePath(path, root);\n return (\n root === workspaceFileManagerLogicalRoot ||\n normalized === root ||\n normalized.startsWith(`${root}/`)\n );\n}\n","export function validateWorkspaceFileEntryName(\n name: string\n): \"invalid\" | \"required\" | null {\n const trimmed = name.trim();\n if (!trimmed) {\n return \"required\";\n }\n if (\n trimmed.includes(\"/\") ||\n trimmed.includes(\"\\\\\") ||\n trimmed === \".\" ||\n trimmed === \"..\"\n ) {\n return \"invalid\";\n }\n return null;\n}\n","import { subscribe } from \"valtio/vanilla\";\nimport {\n normalizeWorkspaceFilePath,\n validateWorkspaceFileEntryName\n} from \"../workspaceFileManagerModel.ts\";\nimport { getWorkspaceFileManagerPersistedState } from \"./workspaceFileManagerStore.ts\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../../i18n/workspaceFileManagerI18n.ts\";\nimport type {\n CreateWorkspaceFileManagerSessionInput,\n WorkspaceFileManagerHost,\n WorkspaceFileManagerMutationErrorMessage\n} from \"../workspaceFileManagerHost.interface.ts\";\nimport type {\n WorkspaceFileManagerFileActivationRequest,\n WorkspaceFileManagerHostActionMessage,\n WorkspaceFileManagerHostActionResult,\n WorkspaceFileManagerHostFallbackAction\n} from \"../workspaceFileManagerHostTypes.ts\";\nimport type { WorkspaceFileManagerSession } from \"../workspaceFileManagerService.interface.ts\";\nimport type {\n WorkspaceFileEntry,\n WorkspaceFileOpenWithApplication,\n WorkspaceFileManagerPersistedState,\n WorkspaceFileManagerState\n} from \"../workspaceFileManagerTypes.ts\";\nimport { WorkspaceFileManagerActivationController } from \"./workspaceFileManagerActivationController.ts\";\nimport { WorkspaceFileManagerMutationController } from \"./workspaceFileManagerMutationController.ts\";\nimport { WorkspaceFileManagerNavigationController } from \"./workspaceFileManagerNavigationController.ts\";\nimport { WorkspaceFileManagerPreviewController } from \"./workspaceFileManagerPreviewController.ts\";\nimport { WorkspaceFileManagerImportController } from \"./workspaceFileManagerImportController.ts\";\nimport {\n resolveWorkspaceFileOpenWithCacheKey,\n WorkspaceFileOpenWithApplicationsCache\n} from \"./model/openWithApplicationsCache.ts\";\n\nexport interface WorkspaceFileManagerSessionInput {\n copy: WorkspaceFileManagerI18nRuntime;\n host: WorkspaceFileManagerHost;\n onHostActionMessage?: (\n message: WorkspaceFileManagerHostActionMessage\n ) => void;\n onMutationErrorMessage?: (\n message: WorkspaceFileManagerMutationErrorMessage\n ) => boolean | void;\n persistence?: CreateWorkspaceFileManagerSessionInput[\"persistence\"];\n store: WorkspaceFileManagerState;\n}\n\ntype WorkspaceFileManagerHostActionResultFallback =\n | {\n actionKind?: \"export\";\n entry: WorkspaceFileEntry;\n kind: \"view\";\n }\n | { actionKind?: \"import\"; kind: \"import\" };\n\nexport class DefaultWorkspaceFileManagerSession implements WorkspaceFileManagerSession {\n readonly store: WorkspaceFileManagerState;\n private readonly host: WorkspaceFileManagerHost;\n private hasInitialized = false;\n private initializePromise: Promise<void> | null = null;\n private isActive = false;\n private isDisposed = false;\n private lastObservedEntries: WorkspaceFileManagerState[\"entries\"];\n private lastObservedPersistedState: string;\n private lastObservedSelectedPath: WorkspaceFileManagerState[\"selectedPath\"];\n private lastRevealRequestID: string | null = null;\n private readonly onHostActionMessage?: (\n message: WorkspaceFileManagerHostActionMessage\n ) => void;\n private readonly onMutationErrorMessage?: (\n message: WorkspaceFileManagerMutationErrorMessage\n ) => boolean | void;\n private searchRequestSeq = 0;\n private readonly activationController: WorkspaceFileManagerActivationController;\n private copy: WorkspaceFileManagerI18nRuntime;\n private readonly mutationController: WorkspaceFileManagerMutationController;\n private readonly navigationController: WorkspaceFileManagerNavigationController;\n private readonly previewController: WorkspaceFileManagerPreviewController;\n private readonly persistence?: CreateWorkspaceFileManagerSessionInput[\"persistence\"];\n private unsubscribeStore: (() => void) | null = null;\n private readonly importController: WorkspaceFileManagerImportController;\n private readonly openWithApplicationsCache =\n new WorkspaceFileOpenWithApplicationsCache();\n\n constructor(input: WorkspaceFileManagerSessionInput) {\n this.copy = input.copy;\n this.host = input.host;\n this.onHostActionMessage = input.onHostActionMessage;\n this.onMutationErrorMessage = input.onMutationErrorMessage;\n this.persistence = input.persistence;\n this.store = input.store;\n this.navigationController = new WorkspaceFileManagerNavigationController({\n host: input.host,\n resolveErrorMessage: (error) => this.resolveErrorMessage(error),\n store: this.store\n });\n this.activationController = new WorkspaceFileManagerActivationController({\n copy: () => this.copy,\n host: input.host,\n loadDirectory: (path) => this.navigationController.loadDirectory(path),\n resolveErrorMessage: (error, overrides) =>\n this.resolveErrorMessage(error, overrides),\n store: this.store\n });\n this.mutationController = new WorkspaceFileManagerMutationController({\n host: input.host,\n onErrorMessage: (message) => this.onMutationErrorMessage?.(message),\n refresh: () => this.refresh(),\n resolveErrorMessage: (error) => this.resolveErrorMessage(error),\n store: this.store\n });\n this.previewController = new WorkspaceFileManagerPreviewController({\n copy: () => this.copy,\n host: input.host,\n isDisposed: () => this.isDisposed,\n resolveErrorMessage: (error, overrides) =>\n this.resolveErrorMessage(error, overrides),\n store: this.store\n });\n this.importController = new WorkspaceFileManagerImportController({\n applyHostActionResult: (result, fallback) =>\n this.applyHostActionResult(result, fallback),\n copy: () => this.copy,\n host: input.host,\n refresh: () => this.refresh(),\n resolveErrorMessage: (error) => this.resolveErrorMessage(error),\n store: this.store\n });\n this.lastObservedEntries = this.store.entries;\n this.lastObservedPersistedState = serializePersistedState(\n this.getPersistedState()\n );\n this.lastObservedSelectedPath = this.store.selectedPath;\n }\n\n async activateFile(request: WorkspaceFileManagerFileActivationRequest) {\n return this.activationController.activateFile(request);\n }\n\n async applyRevealIntent(\n intent: {\n path: string;\n requestID: string;\n } | null\n ): Promise<void> {\n if (!intent?.path || !intent.requestID) {\n return;\n }\n if (intent.requestID === this.lastRevealRequestID) {\n return;\n }\n this.lastRevealRequestID = intent.requestID;\n await this.revealPath(intent.path);\n }\n\n closeContextMenu(): void {\n this.store.contextMenu = null;\n this.store.contextMenuEntryPath = null;\n }\n\n closeCreateDialog(): void {\n if (this.store.busyAction === \"create\") {\n return;\n }\n this.store.createDialog = null;\n }\n\n closeDeleteDialog(): void {\n if (this.store.busyAction === \"delete\") {\n return;\n }\n this.store.deleteDialog = null;\n }\n\n cancelInlineRename(): void {\n if (this.store.busyAction === \"rename\") {\n return;\n }\n this.store.inlineRenameEntryPath = null;\n this.store.inlineRenameValidation = null;\n }\n\n closeTransientUi(): void {\n this.store.contextMenu = null;\n this.store.contextMenuEntryPath = null;\n if (this.store.busyAction !== null) {\n return;\n }\n this.store.createDialog = null;\n this.store.deleteDialog = null;\n this.store.inlineRenameEntryPath = null;\n this.store.inlineRenameValidation = null;\n this.store.unsupportedDialog = null;\n this.store.importConflictDialog = null;\n }\n\n closeUnsupportedDialog(): void {\n if (this.store.busyAction === \"view\") {\n return;\n }\n this.store.unsupportedDialog = null;\n }\n\n closeImportConflictDialog(): void {\n if (this.store.busyAction === \"import\") {\n return;\n }\n this.store.importConflictDialog = null;\n }\n\n async confirmCreateDialog(): Promise<void> {\n const createDialog = this.store.createDialog;\n if (!createDialog) {\n return;\n }\n const validation = validateWorkspaceFileEntryName(createDialog.name);\n if (validation) {\n this.store.createDialog = {\n ...createDialog,\n errorMessage:\n validation === \"required\"\n ? this.copy.t(\"createNameRequired\")\n : this.copy.t(\"createNameInvalid\")\n };\n return;\n }\n\n const path =\n `${this.store.currentDirectoryPath}/${createDialog.name.trim()}`.replaceAll(\n /\\/+/g,\n \"/\"\n );\n this.store.busyAction = \"create\";\n try {\n if (createDialog.kind === \"directory\") {\n await this.createDirectory(path);\n } else {\n await this.createFile(path);\n }\n this.store.createDialog = null;\n } finally {\n this.store.busyAction = null;\n }\n }\n\n async confirmDeleteDialog(): Promise<void> {\n const deleteDialog = this.store.deleteDialog;\n if (!deleteDialog) {\n return;\n }\n this.store.busyAction = \"delete\";\n try {\n this.store.selectedPath = deleteDialog.entryPath;\n await this.deleteSelected();\n this.store.deleteDialog = null;\n } finally {\n this.store.busyAction = null;\n }\n }\n\n async confirmInlineRename(newName: string): Promise<boolean> {\n const inlineRenameEntryPath = this.store.inlineRenameEntryPath;\n if (!inlineRenameEntryPath) {\n return true;\n }\n const entry = this.store.entries.find(\n (candidate) => candidate.path === inlineRenameEntryPath\n );\n if (!entry) {\n this.store.inlineRenameEntryPath = null;\n this.store.inlineRenameValidation = null;\n return true;\n }\n\n const trimmedName = newName.trim();\n if (trimmedName === entry.name) {\n this.store.inlineRenameEntryPath = null;\n this.store.inlineRenameValidation = null;\n return true;\n }\n\n const validation = validateWorkspaceFileEntryName(trimmedName);\n if (validation) {\n this.store.inlineRenameValidation = validation;\n return false;\n }\n\n this.store.inlineRenameValidation = null;\n this.store.busyAction = \"rename\";\n try {\n await this.mutationController.renameEntry(entry, trimmedName);\n this.store.inlineRenameEntryPath = null;\n return true;\n } finally {\n this.store.busyAction = null;\n }\n }\n\n async confirmImportConflict(): Promise<void> {\n await this.importController.confirmImportConflict();\n }\n\n async createDirectory(path: string): Promise<void> {\n await this.mutationController.createDirectory(path);\n }\n\n async createFile(path: string): Promise<void> {\n await this.mutationController.createFile(path);\n }\n\n async deleteSelected(): Promise<void> {\n await this.mutationController.deleteSelected();\n }\n\n decrementDragDepth(): void {\n this.store.dragDepth =\n this.store.dragDepth <= 1 ? 0 : this.store.dragDepth - 1;\n }\n\n dispose(): void {\n this.isDisposed = true;\n this.hasInitialized = false;\n this.initializePromise = null;\n this.isActive = false;\n this.searchRequestSeq += 1;\n this.store.isSearching = false;\n this.unsubscribeStore?.();\n this.unsubscribeStore = null;\n this.previewController.dispose();\n }\n\n async goBack(): Promise<void> {\n await this.navigationController.goBack();\n }\n\n async goForward(): Promise<void> {\n await this.navigationController.goForward();\n }\n\n getPersistedState(): WorkspaceFileManagerPersistedState {\n return getWorkspaceFileManagerPersistedState(this.store);\n }\n\n async handleActivationFallbackAction(\n action: WorkspaceFileManagerHostFallbackAction\n ): Promise<void> {\n await this.activationController.handleFallbackAction(action);\n }\n\n async exportEntry(\n entry: WorkspaceFileEntry\n ): Promise<WorkspaceFileManagerHostActionResult> {\n if (!this.host.exportEntry) {\n return { supported: false } as const;\n }\n\n this.store.busyAction = \"export\";\n this.store.error = null;\n try {\n const result = await this.host.exportEntry({\n entry,\n workspaceID: this.store.workspaceID\n });\n this.applyHostActionResult(result, {\n actionKind: \"export\",\n entry,\n kind: \"view\"\n });\n return result;\n } catch (error) {\n const result = {\n message: this.resolveErrorMessage(error),\n supported: false,\n title: this.copy.t(\"downloadFailedTitle\")\n } as const;\n this.applyHostActionResult(result, {\n actionKind: \"export\",\n entry,\n kind: \"view\"\n });\n return result;\n } finally {\n this.store.busyAction = null;\n }\n }\n\n incrementDragDepth(): void {\n if (!this.isActive) {\n return;\n }\n this.store.dragDepth += 1;\n }\n\n async initialize(): Promise<void> {\n if (this.hasInitialized) {\n return;\n }\n if (this.initializePromise) {\n await this.initializePromise;\n return;\n }\n this.isDisposed = false;\n this.initializePromise = (async () => {\n this.observeStore();\n if (!this.hasLoadedDirectoryState()) {\n await this.navigationController.loadDirectory();\n }\n await this.previewController.syncPreviewState();\n this.hasInitialized = true;\n })();\n try {\n await this.initializePromise;\n } finally {\n this.initializePromise = null;\n }\n }\n\n async loadDirectory(path = this.store.currentDirectoryPath): Promise<void> {\n await this.navigationController.loadDirectory(path);\n }\n\n openContextMenu(input: {\n entryPath: string | null;\n x: number;\n y: number;\n }): void {\n this.store.contextMenuEntryPath = input.entryPath;\n this.store.contextMenu = input;\n }\n\n openCreateDirectoryDialog(): void {\n this.store.contextMenu = null;\n this.store.contextMenuEntryPath = null;\n this.store.createDialog = {\n errorMessage: null,\n kind: \"directory\",\n name: \"\"\n };\n }\n\n openCreateFileDialog(): void {\n this.store.contextMenu = null;\n this.store.contextMenuEntryPath = null;\n this.store.createDialog = {\n errorMessage: null,\n kind: \"file\",\n name: \"\"\n };\n }\n\n openDeleteDialog(entry: WorkspaceFileEntry): void {\n this.store.contextMenu = null;\n this.store.contextMenuEntryPath = null;\n this.store.deleteDialog = {\n entryPath: entry.path\n };\n }\n\n startInlineRename(entry: WorkspaceFileEntry): void {\n this.store.contextMenu = null;\n this.store.contextMenuEntryPath = null;\n this.store.inlineRenameEntryPath = entry.path;\n this.store.inlineRenameValidation = null;\n this.store.selectedPath = entry.path;\n }\n\n async copyToClipboard(entry: WorkspaceFileEntry): Promise<void> {\n if (!this.host.copyEntriesToClipboard) {\n return;\n }\n\n await this.host.copyEntriesToClipboard({\n paths: [entry.path],\n workspaceID: this.store.workspaceID\n });\n }\n\n getCachedOpenWithApplications(\n entry: WorkspaceFileEntry\n ): WorkspaceFileOpenWithApplication[] | null {\n if (!this.host.listOpenWithApplications) {\n return null;\n }\n return this.openWithApplicationsCache.get(\n resolveWorkspaceFileOpenWithCacheKey(entry)\n );\n }\n\n async listOpenWithApplications(\n entry: WorkspaceFileEntry\n ): Promise<WorkspaceFileOpenWithApplication[]> {\n if (!this.host.listOpenWithApplications) {\n return [];\n }\n return this.openWithApplicationsCache.resolve(\n resolveWorkspaceFileOpenWithCacheKey(entry),\n () =>\n this.host.listOpenWithApplications!({\n path: entry.path,\n workspaceID: this.store.workspaceID\n })\n );\n }\n\n async openEntry(entry: WorkspaceFileEntry): Promise<void> {\n await this.activationController.openEntry(entry);\n }\n\n async openFileWithApplication(\n entry: WorkspaceFileEntry,\n applicationPath: string\n ): Promise<void> {\n if (!this.host.openFileWithApplication) {\n return;\n }\n this.store.contextMenu = null;\n this.store.contextMenuEntryPath = null;\n await this.host.openFileWithApplication({\n applicationPath,\n path: entry.path,\n workspaceID: this.store.workspaceID\n });\n }\n\n async openFileInAppBrowser(entry: WorkspaceFileEntry): Promise<void> {\n if (!this.host.openFileInAppBrowser) {\n return;\n }\n this.store.contextMenu = null;\n this.store.contextMenuEntryPath = null;\n await this.host.openFileInAppBrowser({\n path: entry.path,\n workspaceID: this.store.workspaceID\n });\n }\n\n async openFileInDefaultBrowser(entry: WorkspaceFileEntry): Promise<void> {\n if (!this.host.openFileInDefaultBrowser) {\n return;\n }\n this.store.contextMenu = null;\n this.store.contextMenuEntryPath = null;\n await this.host.openFileInDefaultBrowser({\n path: entry.path,\n workspaceID: this.store.workspaceID\n });\n }\n\n async openFileWithOtherApplication(entry: WorkspaceFileEntry): Promise<void> {\n if (!this.host.openFileWithOtherApplication) {\n return;\n }\n this.store.contextMenu = null;\n this.store.contextMenuEntryPath = null;\n await this.host.openFileWithOtherApplication({\n applicationPickerPrompt: this.copy.t(\"openWithOtherPickerPrompt\"),\n path: entry.path,\n workspaceID: this.store.workspaceID\n });\n }\n\n async revealEntry(entry: WorkspaceFileEntry): Promise<void> {\n if (!this.host.revealEntry) {\n return;\n }\n this.store.contextMenu = null;\n this.store.contextMenuEntryPath = null;\n await this.host.revealEntry({\n path: entry.path,\n workspaceID: this.store.workspaceID\n });\n }\n\n async moveEntry(\n entry: WorkspaceFileEntry,\n targetDirectoryPath: string\n ): Promise<void> {\n this.store.busyAction = \"move\";\n try {\n await this.mutationController.moveEntry(entry, targetDirectoryPath);\n } finally {\n this.store.busyAction = null;\n }\n }\n\n async refresh(): Promise<void> {\n await this.navigationController.refresh();\n }\n\n async revealPath(path: string): Promise<void> {\n await this.navigationController.revealPath(path);\n }\n\n resetDragDepth(): void {\n this.store.dragDepth = 0;\n }\n\n async search(query: string): Promise<void> {\n const requestID = ++this.searchRequestSeq;\n this.store.searchQuery = query;\n this.store.searchError = null;\n if (!this.host.search || query.trim() === \"\") {\n this.store.searchEntries = [];\n this.store.isSearching = false;\n return;\n }\n\n this.store.isSearching = true;\n try {\n const result = await this.host.search({\n query,\n workspaceID: this.store.workspaceID\n });\n if (this.isDisposed || requestID !== this.searchRequestSeq) {\n return;\n }\n this.store.searchEntries = result.entries;\n } catch (error) {\n if (!this.isDisposed && requestID === this.searchRequestSeq) {\n this.store.searchError = this.resolveErrorMessage(error);\n }\n } finally {\n if (!this.isDisposed && requestID === this.searchRequestSeq) {\n this.store.isSearching = false;\n }\n }\n }\n\n select(path: string | null): void {\n const nextSelectedPath = path\n ? normalizeWorkspaceFilePath(path, this.store.root)\n : null;\n if (this.store.selectedPath === nextSelectedPath) {\n return;\n }\n this.store.selectedPath = nextSelectedPath;\n }\n\n setActive(active: boolean): void {\n if (this.isActive === active) {\n return;\n }\n this.isActive = active;\n if (active) {\n return;\n }\n this.store.contextMenu = null;\n this.store.contextMenuEntryPath = null;\n this.store.dragDepth = 0;\n }\n\n setI18nRuntime(copy: WorkspaceFileManagerI18nRuntime): void {\n if (this.copy === copy) {\n return;\n }\n this.copy = copy;\n void this.previewController.syncPreviewState();\n }\n\n updateCreateDialogName(name: string): void {\n if (!this.store.createDialog) {\n return;\n }\n this.store.createDialog = {\n ...this.store.createDialog,\n errorMessage: null,\n name\n };\n }\n\n clearInlineRenameValidation(): void {\n this.store.inlineRenameValidation = null;\n }\n\n async importDroppedFiles(\n dataTransfer: Pick<DataTransfer, \"files\" | \"items\">,\n targetDirectoryPath: string\n ): Promise<WorkspaceFileManagerHostActionResult> {\n return this.importController.importDroppedFiles(\n dataTransfer,\n targetDirectoryPath\n );\n }\n\n async importFiles(\n targetDirectoryPath: string\n ): Promise<WorkspaceFileManagerHostActionResult> {\n return this.importController.importFiles(targetDirectoryPath);\n }\n\n private applyHostActionResult(\n result: WorkspaceFileManagerHostActionResult | void,\n fallback: WorkspaceFileManagerHostActionResultFallback\n ): void {\n if (!result) {\n return;\n }\n\n this.notifyHostActionMessages(result, fallback);\n\n if (result.importConflict) {\n this.store.unsupportedDialog = null;\n this.store.importConflictDialog = result.importConflict;\n return;\n }\n\n if (result.supported === false) {\n this.store.importConflictDialog = null;\n this.store.unsupportedDialog = {\n entryPath: \"entry\" in fallback ? fallback.entry.path : null,\n kind: fallback.kind,\n message: result.message,\n title: result.title\n };\n return;\n }\n\n this.store.unsupportedDialog = null;\n this.store.importConflictDialog = null;\n }\n\n private hasLoadedDirectoryState(): boolean {\n return (\n this.store.error !== null ||\n this.store.entries.length > 0 ||\n this.store.selectedPath !== null\n );\n }\n\n private notifyHostActionMessages(\n result: WorkspaceFileManagerHostActionResult,\n fallback: WorkspaceFileManagerHostActionResultFallback\n ): void {\n if (!this.onHostActionMessage) {\n return;\n }\n\n const entry = \"entry\" in fallback ? fallback.entry : null;\n const actionKind =\n fallback.actionKind ?? (fallback.kind === \"import\" ? \"import\" : \"export\");\n if (result.cancelledMessage?.trim()) {\n this.notifyHostActionMessage(actionKind, entry, \"cancelled\", result);\n return;\n }\n if (result.supported === false || result.importConflict) {\n return;\n }\n if (result.completedMessage?.trim()) {\n this.notifyHostActionMessage(actionKind, entry, \"completed\", result);\n return;\n }\n this.notifyHostActionMessage(actionKind, entry, \"started\", result);\n }\n\n private notifyHostActionMessage(\n actionKind: WorkspaceFileManagerHostActionMessage[\"actionKind\"],\n entry: WorkspaceFileEntry | null,\n status: WorkspaceFileManagerHostActionMessage[\"status\"],\n result: WorkspaceFileManagerHostActionResult\n ): void {\n const messageByStatus = {\n cancelled: \"cancelledMessage\",\n completed: \"completedMessage\",\n started: \"startedMessage\"\n } as const;\n const message = result[messageByStatus[status]]?.trim();\n if (!message) {\n return;\n }\n this.onHostActionMessage?.({\n actionKind,\n entry,\n message,\n status\n });\n }\n\n private observeStore(): void {\n if (this.unsubscribeStore) {\n return;\n }\n\n this.lastObservedEntries = this.store.entries;\n this.lastObservedSelectedPath = this.store.selectedPath;\n this.unsubscribeStore = subscribe(this.store, () => {\n if (this.isDisposed) {\n return;\n }\n if (\n this.lastObservedEntries === this.store.entries &&\n this.lastObservedSelectedPath === this.store.selectedPath\n ) {\n this.savePersistedStateIfChanged();\n return;\n }\n this.lastObservedEntries = this.store.entries;\n this.lastObservedSelectedPath = this.store.selectedPath;\n this.savePersistedStateIfChanged();\n void this.previewController.syncPreviewState();\n this.warmOpenWithApplicationsCache(this.store.entries);\n });\n }\n\n private warmOpenWithApplicationsCache(\n entries: WorkspaceFileManagerState[\"entries\"]\n ): void {\n if (!this.host.listOpenWithApplications || this.store.isLoading) {\n return;\n }\n this.openWithApplicationsCache.scheduleWarmup(entries, (entry) =>\n this.listOpenWithApplications(entry)\n );\n }\n\n private savePersistedStateIfChanged(): void {\n if (!this.persistence?.save) {\n return;\n }\n const nextState = this.getPersistedState();\n const serialized = serializePersistedState(nextState);\n if (serialized === this.lastObservedPersistedState) {\n return;\n }\n this.lastObservedPersistedState = serialized;\n this.persistence.save(nextState);\n }\n\n private resolveErrorMessage(\n error: unknown,\n overrides: Record<string, string | undefined> = {}\n ): string {\n const filteredOverrides = Object.fromEntries(\n Object.entries(overrides).filter((entry) => entry[1] !== undefined)\n ) as Record<string, string>;\n if (this.host.resolveErrorMessage) {\n return this.host.resolveErrorMessage(error, filteredOverrides);\n }\n\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n typeof (error as { code?: unknown }).code === \"string\"\n ) {\n const override = filteredOverrides[(error as { code: string }).code];\n if (override) {\n return override;\n }\n }\n\n return this.copy.t(\"unknownErrorMessage\");\n }\n}\n\nfunction serializePersistedState(\n state: WorkspaceFileManagerPersistedState\n): string {\n return JSON.stringify(state);\n}\n","import { resolveWorkspaceFileActivationTarget } from \"../workspaceFileManagerModel.ts\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../../i18n/workspaceFileManagerI18n.ts\";\nimport type { WorkspaceFileManagerHost } from \"../workspaceFileManagerHost.interface.ts\";\nimport type {\n WorkspaceFileManagerFileActivationRequest,\n WorkspaceFileManagerHostFallbackAction,\n WorkspaceFileManagerHostFileActivationResult\n} from \"../workspaceFileManagerHostTypes.ts\";\nimport type {\n WorkspaceFileEntry,\n WorkspaceFileManagerState\n} from \"../workspaceFileManagerTypes.ts\";\n\nexport interface WorkspaceFileManagerActivationControllerInput {\n copy: () => WorkspaceFileManagerI18nRuntime;\n host: WorkspaceFileManagerHost;\n loadDirectory: (path: string) => Promise<void>;\n resolveErrorMessage: (\n error: unknown,\n overrides?: Record<string, string | undefined>\n ) => string;\n store: WorkspaceFileManagerState;\n}\n\nexport class WorkspaceFileManagerActivationController {\n private readonly copy: () => WorkspaceFileManagerI18nRuntime;\n private readonly host: WorkspaceFileManagerHost;\n private readonly loadDirectory: (path: string) => Promise<void>;\n private readonly resolveErrorMessage: (\n error: unknown,\n overrides?: Record<string, string | undefined>\n ) => string;\n private readonly store: WorkspaceFileManagerState;\n\n constructor(input: WorkspaceFileManagerActivationControllerInput) {\n this.copy = input.copy;\n this.host = input.host;\n this.loadDirectory = input.loadDirectory;\n this.resolveErrorMessage = input.resolveErrorMessage;\n this.store = input.store;\n }\n\n async activateFile(\n request: WorkspaceFileManagerFileActivationRequest\n ): Promise<WorkspaceFileManagerHostFileActivationResult> {\n const copy = this.copy();\n if (!this.host.activateFile) {\n return {\n disposition: \"unsupported\",\n message: copy.t(\"unsupportedViewBody\", { name: request.entry.name }),\n title: copy.t(\"unsupportedViewTitle\")\n } as const;\n }\n\n try {\n const result = await this.host.activateFile(\n request,\n this.store.workspaceID\n );\n if (result.disposition !== \"fallback\" || !result.actions) {\n return result;\n }\n\n const fallbackActionKinds = new Set(\n result.actions.map((action) => action.kind)\n );\n return {\n ...result,\n actions: result.actions.map((action) =>\n this.wrapFallbackAction(action, copy)\n ),\n message:\n result.message ??\n (fallbackActionKinds.has(\"download\")\n ? copy.t(\"previewUnavailableDownloadBody\", {\n name: request.entry.name\n })\n : copy.t(\"previewUnavailableOpenBody\", {\n name: request.entry.name\n })),\n title: result.title ?? copy.t(\"previewUnavailableTitle\")\n };\n } catch (error) {\n return {\n actions: [\n {\n kind: \"open\",\n label: copy.t(\"retryLabel\"),\n onSelect: async () => this.activateFile(request)\n }\n ],\n disposition: \"unsupported\",\n message: this.resolveErrorMessage(error),\n title: copy.t(\"openFailedTitle\")\n } as const;\n }\n }\n\n async handleFallbackAction(\n action: WorkspaceFileManagerHostFallbackAction\n ): Promise<void> {\n if (action.kind === \"none\" || !action.onSelect) {\n return;\n }\n\n const entryPath = this.store.unsupportedDialog?.entryPath ?? null;\n const entry = entryPath ? this.findEntry(entryPath) : null;\n this.store.busyAction = \"view\";\n try {\n const result = await action.onSelect();\n if (!entry) {\n this.store.unsupportedDialog = null;\n return;\n }\n this.applyActivationResult(result, entry);\n } finally {\n this.store.busyAction = null;\n }\n }\n\n async openEntry(entry: WorkspaceFileEntry): Promise<void> {\n this.store.contextMenu = null;\n\n if (entry.kind === \"directory\") {\n this.store.pendingDirectoryPath = entry.path;\n try {\n await this.loadDirectory(entry.path);\n } finally {\n if (this.store.pendingDirectoryPath === entry.path) {\n this.store.pendingDirectoryPath = null;\n }\n }\n return;\n }\n\n this.store.busyAction = \"view\";\n try {\n const result = await this.activateFile({\n entry,\n target: resolveWorkspaceFileActivationTarget(entry)\n });\n this.applyActivationResult(result, entry);\n } finally {\n this.store.busyAction = null;\n }\n }\n\n private applyActivationResult(\n result: WorkspaceFileManagerHostFileActivationResult | void,\n entry: WorkspaceFileEntry\n ): void {\n if (!result || result.disposition === \"handled\") {\n this.store.unsupportedDialog = null;\n return;\n }\n\n this.store.importConflictDialog = null;\n this.store.unsupportedDialog = {\n actions: result.actions ?? null,\n entryPath: entry.path,\n kind: \"view\",\n message: result.message,\n title: result.title\n };\n }\n\n private findEntry(entryPath: string): WorkspaceFileEntry | null {\n return this.store.entries.find((entry) => entry.path === entryPath) ?? null;\n }\n\n private wrapFallbackAction(\n action: WorkspaceFileManagerHostFallbackAction,\n copy: WorkspaceFileManagerI18nRuntime\n ): WorkspaceFileManagerHostFallbackAction {\n if (action.kind === \"none\" || !action.onSelect) {\n return action;\n }\n\n return {\n ...action,\n onSelect: async () => {\n try {\n return await action.onSelect();\n } catch (error) {\n return {\n actions: [\n this.wrapFallbackAction(\n {\n ...action,\n label: copy.t(\"retryLabel\")\n },\n copy\n )\n ],\n disposition: \"unsupported\",\n message: this.resolveErrorMessage(error),\n title:\n action.kind === \"download\"\n ? copy.t(\"downloadFailedTitle\")\n : copy.t(\"openFailedTitle\")\n } as const;\n }\n }\n };\n }\n}\n","import {\n normalizeWorkspaceFilePath,\n workspaceFileDirectory\n} from \"../workspaceFileManagerModel.ts\";\nimport type {\n WorkspaceFileManagerHost,\n WorkspaceFileManagerMutationErrorMessage\n} from \"../workspaceFileManagerHost.interface.ts\";\nimport type {\n WorkspaceFileEntry,\n WorkspaceFileEntryKind,\n WorkspaceFileManagerState\n} from \"../workspaceFileManagerTypes.ts\";\n\nexport interface WorkspaceFileManagerMutationControllerInput {\n host: WorkspaceFileManagerHost;\n onErrorMessage?: (\n message: WorkspaceFileManagerMutationErrorMessage\n ) => boolean | void;\n refresh: () => Promise<void>;\n resolveErrorMessage: (error: unknown) => string;\n store: WorkspaceFileManagerState;\n}\n\nexport class WorkspaceFileManagerMutationController {\n private readonly host: WorkspaceFileManagerHost;\n private readonly onErrorMessage?: (\n message: WorkspaceFileManagerMutationErrorMessage\n ) => boolean | void;\n private readonly refresh: () => Promise<void>;\n private readonly resolveErrorMessage: (error: unknown) => string;\n private readonly store: WorkspaceFileManagerState;\n\n constructor(input: WorkspaceFileManagerMutationControllerInput) {\n this.host = input.host;\n this.onErrorMessage = input.onErrorMessage;\n this.refresh = input.refresh;\n this.resolveErrorMessage = input.resolveErrorMessage;\n this.store = input.store;\n }\n\n async createDirectory(path: string): Promise<void> {\n if (!this.host.createDirectory) {\n return;\n }\n await this.mutate(\n \"create\",\n () =>\n this.host.createDirectory?.({\n path: normalizeWorkspaceFilePath(path, this.store.root),\n workspaceID: this.store.workspaceID\n }) ?? Promise.resolve()\n );\n }\n\n async createFile(path: string): Promise<void> {\n if (!this.host.createFile) {\n return;\n }\n await this.mutate(\n \"create\",\n () =>\n this.host.createFile?.({\n path: normalizeWorkspaceFilePath(path, this.store.root),\n workspaceID: this.store.workspaceID\n }) ?? Promise.resolve()\n );\n }\n\n async deleteSelected(): Promise<void> {\n if (!this.host.deleteEntry || !this.store.selectedPath) {\n return;\n }\n\n const entry = this.store.entries.find(\n (candidate) => candidate.path === this.store.selectedPath\n );\n await this.mutate(\n \"delete\",\n () =>\n this.host.deleteEntry?.({\n kind: entryKindForDelete(entry?.kind),\n path: this.store.selectedPath ?? \"\",\n workspaceID: this.store.workspaceID\n }) ?? Promise.resolve()\n );\n this.store.selectedPath = null;\n }\n\n async moveEntry(\n entry: WorkspaceFileEntry,\n targetDirectoryPath: string\n ): Promise<void> {\n if (!this.host.moveEntry || entry.kind === \"unknown\") {\n return;\n }\n\n const entryKind = entry.kind;\n const normalizedTargetDirectoryPath = normalizeWorkspaceFilePath(\n targetDirectoryPath,\n this.store.root\n );\n if (entry.path === normalizedTargetDirectoryPath) {\n return;\n }\n if (\n entry.kind === \"directory\" &&\n normalizedTargetDirectoryPath.startsWith(`${entry.path}/`)\n ) {\n return;\n }\n if (\n workspaceFileDirectory(entry.path, this.store.root) ===\n normalizedTargetDirectoryPath\n ) {\n return;\n }\n\n let movedPath: string | null = null;\n await this.mutate(\"move\", async () => {\n const movedEntry =\n (await this.host.moveEntry?.({\n kind: entryKind,\n path: entry.path,\n targetDirectoryPath: normalizedTargetDirectoryPath,\n workspaceID: this.store.workspaceID\n })) ?? null;\n movedPath = movedEntry?.path ?? null;\n });\n this.store.selectedPath = movedPath;\n }\n\n async renameEntry(entry: WorkspaceFileEntry, newName: string): Promise<void> {\n if (!this.host.renameEntry) {\n return;\n }\n\n let renamedPath: string | null = null;\n await this.mutate(\"rename\", async () => {\n const renamedEntry =\n (await this.host.renameEntry?.({\n newName: newName.trim(),\n path: entry.path,\n workspaceID: this.store.workspaceID\n })) ?? null;\n renamedPath = renamedEntry?.path ?? null;\n });\n this.store.selectedPath = renamedPath;\n }\n\n private async mutate(\n actionKind: WorkspaceFileManagerMutationErrorMessage[\"actionKind\"],\n operation: () => Promise<unknown>\n ): Promise<void> {\n this.store.isMutating = true;\n this.store.error = null;\n try {\n await operation();\n await this.refresh();\n } catch (error) {\n const message = this.resolveErrorMessage(error);\n const handled = this.onErrorMessage?.({\n actionKind,\n error,\n message\n });\n if (!handled) {\n this.store.error = message;\n }\n } finally {\n this.store.isMutating = false;\n }\n }\n}\n\nfunction entryKindForDelete(\n kind: WorkspaceFileEntryKind | undefined\n): \"file\" | \"directory\" | null {\n if (kind === \"file\" || kind === \"directory\") {\n return kind;\n }\n return null;\n}\n","import {\n normalizeWorkspaceFilePath,\n sortWorkspaceEntries,\n workspaceFileDirectory,\n workspaceFilePathHasHiddenSegment\n} from \"../workspaceFileManagerModel.ts\";\nimport type { WorkspaceFileManagerHost } from \"../workspaceFileManagerHost.interface.ts\";\nimport type { WorkspaceFileManagerState } from \"../workspaceFileManagerTypes.ts\";\n\nexport interface WorkspaceFileManagerNavigationControllerInput {\n host: WorkspaceFileManagerHost;\n resolveErrorMessage: (error: unknown) => string;\n store: WorkspaceFileManagerState;\n}\n\nexport class WorkspaceFileManagerNavigationController {\n private readonly host: WorkspaceFileManagerHost;\n private readonly resolveErrorMessage: (error: unknown) => string;\n private readonly store: WorkspaceFileManagerState;\n private requestSeq = 0;\n\n constructor(input: WorkspaceFileManagerNavigationControllerInput) {\n this.host = input.host;\n this.resolveErrorMessage = input.resolveErrorMessage;\n this.store = input.store;\n }\n\n async goBack(): Promise<void> {\n const previous = this.store.navigationBackStack.pop();\n if (!previous) {\n return;\n }\n this.store.navigationForwardStack.push(this.store.currentDirectoryPath);\n await this.replaceDirectory(previous);\n }\n\n async goForward(): Promise<void> {\n const next = this.store.navigationForwardStack.pop();\n if (!next) {\n return;\n }\n this.store.navigationBackStack.push(this.store.currentDirectoryPath);\n await this.replaceDirectory(next);\n }\n\n async loadDirectory(path = this.store.currentDirectoryPath): Promise<void> {\n const normalizedPath = normalizeWorkspaceFilePath(path, this.store.root);\n const requestID = ++this.requestSeq;\n this.store.isLoading = true;\n this.store.error = null;\n\n try {\n const listing = await this.host.listDirectory({\n includeHidden: workspaceFilePathHasHiddenSegment(normalizedPath),\n path: this.resolveRequestPath(normalizedPath),\n workspaceID: this.store.workspaceID\n });\n if (requestID !== this.requestSeq) {\n return;\n }\n\n const previousDirectoryPath = this.store.currentDirectoryPath;\n if (\n previousDirectoryPath !== listing.directoryPath &&\n previousDirectoryPath !== \"/\"\n ) {\n this.store.navigationBackStack.push(this.store.currentDirectoryPath);\n this.store.navigationForwardStack = [];\n }\n this.store.root = normalizeWorkspaceFilePath(listing.root);\n this.store.currentDirectoryPath = listing.directoryPath;\n this.store.entries = sortWorkspaceEntries(listing.entries);\n this.store.selectedPath = null;\n } catch (error) {\n if (requestID === this.requestSeq) {\n this.store.error = this.resolveErrorMessage(error);\n }\n } finally {\n if (requestID === this.requestSeq) {\n this.store.isLoading = false;\n }\n }\n }\n\n async refresh(): Promise<void> {\n await this.loadDirectory(this.store.currentDirectoryPath);\n }\n\n async revealPath(path: string): Promise<void> {\n const normalizedPath = normalizeWorkspaceFilePath(path, this.store.root);\n const directoryPath = workspaceFileDirectory(\n normalizedPath,\n this.store.root\n );\n const requestID = ++this.requestSeq;\n this.store.isLoading = true;\n this.store.error = null;\n\n try {\n const listing = await this.host.listDirectory({\n includeHidden: workspaceFilePathHasHiddenSegment(normalizedPath),\n path: this.resolveRequestPath(directoryPath),\n workspaceID: this.store.workspaceID\n });\n if (requestID !== this.requestSeq) {\n return;\n }\n\n const previousDirectoryPath = this.store.currentDirectoryPath;\n if (\n previousDirectoryPath !== listing.directoryPath &&\n previousDirectoryPath !== \"/\"\n ) {\n this.store.navigationBackStack.push(this.store.currentDirectoryPath);\n this.store.navigationForwardStack = [];\n }\n this.store.root = normalizeWorkspaceFilePath(listing.root);\n this.store.currentDirectoryPath = listing.directoryPath;\n this.store.entries = sortWorkspaceEntries(listing.entries);\n this.store.selectedPath = normalizedPath;\n } catch (error) {\n if (requestID === this.requestSeq) {\n this.store.error = this.resolveErrorMessage(error);\n }\n } finally {\n if (requestID === this.requestSeq) {\n this.store.isLoading = false;\n }\n }\n }\n\n private async replaceDirectory(path: string): Promise<void> {\n const normalizedPath = normalizeWorkspaceFilePath(path, this.store.root);\n const requestID = ++this.requestSeq;\n this.store.isLoading = true;\n this.store.error = null;\n try {\n const listing = await this.host.listDirectory({\n includeHidden: workspaceFilePathHasHiddenSegment(normalizedPath),\n path: this.resolveRequestPath(normalizedPath),\n workspaceID: this.store.workspaceID\n });\n if (requestID !== this.requestSeq) {\n return;\n }\n this.store.root = normalizeWorkspaceFilePath(listing.root);\n this.store.currentDirectoryPath = listing.directoryPath;\n this.store.entries = sortWorkspaceEntries(listing.entries);\n this.store.selectedPath = null;\n } catch (error) {\n if (requestID === this.requestSeq) {\n this.store.error = this.resolveErrorMessage(error);\n }\n } finally {\n if (requestID === this.requestSeq) {\n this.store.isLoading = false;\n }\n }\n }\n\n private resolveRequestPath(path: string): string {\n if (this.store.root === \"/\" && path === \"/\") {\n return \"\";\n }\n return path;\n }\n}\n","import type { WorkspaceFilePreviewReadonlyReason } from \"@tutti-os/workspace-file-preview\";\nimport {\n createWorkspaceFilePreviewLoadedState,\n formatWorkspacePreviewByteLimit,\n normalizeWorkspaceFilePreviewBytes,\n resolveWorkspaceFilePreviewReadiness,\n workspaceFilePreviewMaxBytes\n} from \"../workspaceFileManagerModel.ts\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../../i18n/workspaceFileManagerI18n.ts\";\nimport type { WorkspaceFileManagerHost } from \"../workspaceFileManagerHost.interface.ts\";\nimport type { WorkspaceFileManagerState } from \"../workspaceFileManagerTypes.ts\";\n\nexport interface WorkspaceFileManagerPreviewControllerInput {\n copy: () => WorkspaceFileManagerI18nRuntime;\n host: WorkspaceFileManagerHost;\n isDisposed: () => boolean;\n resolveErrorMessage: (\n error: unknown,\n overrides?: Record<string, string | undefined>\n ) => string;\n store: WorkspaceFileManagerState;\n}\n\nexport class WorkspaceFileManagerPreviewController {\n private readonly copy: () => WorkspaceFileManagerI18nRuntime;\n private readonly host: WorkspaceFileManagerHost;\n private readonly isDisposed: () => boolean;\n private readonly resolveErrorMessage: (\n error: unknown,\n overrides?: Record<string, string | undefined>\n ) => string;\n private readonly store: WorkspaceFileManagerState;\n private previewObjectUrl: string | null = null;\n private previewRequestSeq = 0;\n\n constructor(input: WorkspaceFileManagerPreviewControllerInput) {\n this.copy = input.copy;\n this.host = input.host;\n this.isDisposed = input.isDisposed;\n this.resolveErrorMessage = input.resolveErrorMessage;\n this.store = input.store;\n }\n\n dispose(): void {\n this.previewRequestSeq += 1;\n this.revokePreviewObjectUrl();\n }\n\n async syncPreviewState(): Promise<void> {\n const requestID = this.previewRequestSeq + 1;\n this.previewRequestSeq = requestID;\n this.revokePreviewObjectUrl();\n\n const selectedEntry =\n this.store.entries.find(\n (entry) => entry.path === this.store.selectedPath\n ) ?? null;\n const copy = this.copy();\n\n if (!selectedEntry) {\n this.store.previewState = { status: \"empty\" };\n return;\n }\n\n const readiness = resolveWorkspaceFilePreviewReadiness(selectedEntry);\n if (readiness.status === \"directory\") {\n this.store.previewState = {\n entry: selectedEntry,\n status: \"directory\"\n };\n return;\n }\n if (readiness.status === \"unsupported\") {\n this.store.previewState = {\n entry: selectedEntry,\n message: copy.t(\"previewUnsupported\"),\n status: \"unsupported\"\n };\n return;\n }\n if (readiness.status === \"readonly\") {\n this.store.previewState = {\n entry: selectedEntry,\n message: resolveWorkspaceFileManagerPreviewReadonlyMessage(\n copy,\n readiness.reason,\n readiness.maxSizeBytes\n ),\n status: \"readonly\"\n };\n return;\n }\n\n const activationTarget = readiness.target;\n\n this.store.previewState = {\n entry: activationTarget,\n status: \"loading\"\n };\n\n if (!this.host.readPreviewFile) {\n this.store.previewState = {\n entry: selectedEntry,\n message: copy.t(\"previewUnsupported\"),\n status: \"unsupported\"\n };\n return;\n }\n\n try {\n const bytes = normalizeWorkspaceFilePreviewBytes(\n await this.host.readPreviewFile(\n this.store.workspaceID,\n selectedEntry.path\n )\n );\n if (this.isDisposed() || requestID !== this.previewRequestSeq) {\n return;\n }\n\n const loadedState = createWorkspaceFilePreviewLoadedState({\n bytes,\n entry: selectedEntry,\n target: activationTarget\n });\n if (loadedState.status === \"image\") {\n const objectUrl = URL.createObjectURL(\n new Blob([loadedState.bytes], {\n type: loadedState.contentType\n })\n );\n if (this.isDisposed() || requestID !== this.previewRequestSeq) {\n URL.revokeObjectURL(objectUrl);\n return;\n }\n\n this.previewObjectUrl = objectUrl;\n this.store.previewState = {\n entry: activationTarget,\n objectUrl,\n status: \"image\"\n };\n return;\n }\n\n if (loadedState.status === \"text\") {\n this.store.previewState = loadedState;\n return;\n }\n\n if (loadedState.status === \"readonly\") {\n this.store.previewState = {\n entry: selectedEntry,\n message: resolveWorkspaceFileManagerPreviewReadonlyMessage(\n copy,\n loadedState.reason,\n loadedState.maxSizeBytes\n ),\n status: \"readonly\"\n };\n }\n } catch (error) {\n if (this.isDisposed() || requestID !== this.previewRequestSeq) {\n return;\n }\n\n this.store.previewState = {\n entry: selectedEntry,\n message: this.resolveErrorMessage(error, {\n preview_file_too_large: copy.t(\"previewFileTooLarge\", {\n maxSize: formatWorkspacePreviewByteLimit(\n workspaceFilePreviewMaxBytes\n )\n })\n }),\n status: \"error\"\n };\n }\n }\n\n private revokePreviewObjectUrl(): void {\n if (!this.previewObjectUrl) {\n return;\n }\n URL.revokeObjectURL(this.previewObjectUrl);\n this.previewObjectUrl = null;\n }\n}\n\nfunction resolveWorkspaceFileManagerPreviewReadonlyMessage(\n copy: WorkspaceFileManagerI18nRuntime,\n reason: WorkspaceFilePreviewReadonlyReason,\n maxSizeBytes?: number\n): string {\n switch (reason) {\n case \"binary\":\n return copy.t(\"previewBinary\");\n case \"decode_failed\":\n return copy.t(\"previewDecodeFailed\");\n case \"file_too_large\":\n return copy.t(\"previewFileTooLarge\", {\n maxSize: formatWorkspacePreviewByteLimit(maxSizeBytes ?? 0)\n });\n case \"text_too_large\":\n return copy.t(\"previewTooLarge\", {\n maxSize: formatWorkspacePreviewByteLimit(maxSizeBytes ?? 0)\n });\n }\n}\n","import type { WorkspaceFileManagerI18nRuntime } from \"../../i18n/workspaceFileManagerI18n.ts\";\nimport type { WorkspaceFileManagerHost } from \"../workspaceFileManagerHost.interface.ts\";\nimport type { WorkspaceFileManagerHostActionResult } from \"../workspaceFileManagerHostTypes.ts\";\nimport type { WorkspaceFileManagerState } from \"../workspaceFileManagerTypes.ts\";\n\nexport interface WorkspaceFileManagerImportControllerInput {\n applyHostActionResult: (\n result: WorkspaceFileManagerHostActionResult | void,\n fallback: { kind: \"import\" }\n ) => void;\n copy: () => WorkspaceFileManagerI18nRuntime;\n host: WorkspaceFileManagerHost;\n refresh: () => Promise<void>;\n resolveErrorMessage: (error: unknown) => string;\n store: WorkspaceFileManagerState;\n}\n\nexport class WorkspaceFileManagerImportController {\n private readonly applyHostActionResult: (\n result: WorkspaceFileManagerHostActionResult | void,\n fallback: { kind: \"import\" }\n ) => void;\n private readonly copy: () => WorkspaceFileManagerI18nRuntime;\n private readonly host: WorkspaceFileManagerHost;\n private readonly refresh: () => Promise<void>;\n private readonly resolveErrorMessage: (error: unknown) => string;\n private readonly store: WorkspaceFileManagerState;\n\n constructor(input: WorkspaceFileManagerImportControllerInput) {\n this.applyHostActionResult = input.applyHostActionResult;\n this.copy = input.copy;\n this.host = input.host;\n this.refresh = input.refresh;\n this.resolveErrorMessage = input.resolveErrorMessage;\n this.store = input.store;\n }\n\n async confirmImportConflict(): Promise<void> {\n const importConflictDialog = this.store.importConflictDialog;\n if (!importConflictDialog?.onConfirm) {\n return;\n }\n\n this.store.busyAction = \"import\";\n try {\n const result = await importConflictDialog.onConfirm();\n this.store.importConflictDialog = null;\n this.applyHostActionResult(result, { kind: \"import\" });\n } finally {\n this.store.busyAction = null;\n }\n }\n\n async importDroppedFiles(\n dataTransfer: Pick<DataTransfer, \"files\" | \"items\">,\n targetDirectoryPath: string\n ): Promise<WorkspaceFileManagerHostActionResult> {\n if (!this.host.resolveDroppedPaths || !this.host.importPaths) {\n const result = {\n message: this.copy().t(\"unsupportedImportBody\"),\n supported: false,\n title: this.copy().t(\"unsupportedImportTitle\")\n } as const;\n this.applyHostActionResult(result, { kind: \"import\" });\n return result;\n }\n\n const sourcePaths = this.host.resolveDroppedPaths(dataTransfer);\n if (sourcePaths.length === 0) {\n return { supported: true } as const;\n }\n\n this.store.busyAction = \"import\";\n try {\n const result = await this.wrapImportAction(\n () =>\n this.host.importPaths?.(\n this.store.workspaceID,\n targetDirectoryPath,\n sourcePaths\n ) ?? Promise.resolve({ supported: true } as const)\n );\n this.applyHostActionResult(result, { kind: \"import\" });\n return result;\n } finally {\n this.store.busyAction = null;\n }\n }\n\n async importFiles(\n targetDirectoryPath: string\n ): Promise<WorkspaceFileManagerHostActionResult> {\n if (!this.host.importFiles) {\n const result = {\n message: this.copy().t(\"unsupportedImportBody\"),\n supported: false,\n title: this.copy().t(\"unsupportedImportTitle\")\n } as const;\n this.applyHostActionResult(result, { kind: \"import\" });\n return result;\n }\n\n this.store.busyAction = \"import\";\n try {\n const result = await this.wrapImportAction(\n () =>\n this.host.importFiles?.(\n this.store.workspaceID,\n targetDirectoryPath\n ) ?? Promise.resolve({ supported: true } as const)\n );\n this.applyHostActionResult(result, { kind: \"import\" });\n return result;\n } finally {\n this.store.busyAction = null;\n }\n }\n\n private async wrapImportAction(\n action: () => Promise<WorkspaceFileManagerHostActionResult>\n ): Promise<WorkspaceFileManagerHostActionResult> {\n try {\n const result = await action();\n if (result.importConflict) {\n const importConflict = result.importConflict;\n const importConflictConfirm = importConflict.onConfirm;\n return {\n ...result,\n importConflict: {\n ...importConflict,\n onConfirm: importConflictConfirm\n ? async () => {\n const confirmResult = await importConflictConfirm();\n await this.refresh();\n return confirmResult;\n }\n : undefined\n }\n };\n }\n await this.refresh();\n return result;\n } catch (error) {\n return {\n message: this.resolveErrorMessage(error),\n supported: false,\n title: this.copy().t(\"importFailedTitle\")\n };\n }\n }\n}\n","import { resolveWorkspaceFileExtension } from \"@tutti-os/workspace-file-preview\";\nimport type {\n WorkspaceFileEntry,\n WorkspaceFileOpenWithApplication\n} from \"../../workspaceFileManagerTypes.ts\";\n\nconst openWithWarmupLimit = 8;\n\nexport function resolveWorkspaceFileOpenWithCacheKey(\n entry: Pick<WorkspaceFileEntry, \"kind\" | \"name\" | \"path\">\n): string {\n const extension = resolveWorkspaceFileExtension(\n entry.path || entry.name || \"\"\n );\n return `${entry.kind}:${extension || \"(no-ext)\"}`;\n}\n\nexport class WorkspaceFileOpenWithApplicationsCache {\n private readonly applicationsByKey = new Map<\n string,\n WorkspaceFileOpenWithApplication[]\n >();\n private readonly inflightByKey = new Map<\n string,\n Promise<WorkspaceFileOpenWithApplication[]>\n >();\n private readonly warmupScheduledKeys = new Set<string>();\n\n get(key: string): WorkspaceFileOpenWithApplication[] | null {\n return this.applicationsByKey.get(key) ?? null;\n }\n\n async resolve(\n key: string,\n load: () => Promise<WorkspaceFileOpenWithApplication[]>\n ): Promise<WorkspaceFileOpenWithApplication[]> {\n const cached = this.applicationsByKey.get(key);\n if (cached) {\n return cached;\n }\n\n const inflight = this.inflightByKey.get(key);\n if (inflight) {\n return inflight;\n }\n\n const promise = load()\n .then((applications) => {\n this.applicationsByKey.set(key, applications);\n this.inflightByKey.delete(key);\n return applications;\n })\n .catch((error) => {\n this.inflightByKey.delete(key);\n throw error;\n });\n this.inflightByKey.set(key, promise);\n return promise;\n }\n\n scheduleWarmup(\n entries: readonly WorkspaceFileEntry[],\n load: (\n entry: WorkspaceFileEntry\n ) => Promise<WorkspaceFileOpenWithApplication[]>\n ): void {\n let scheduled = 0;\n const seenKeys = new Set<string>();\n\n for (const entry of entries) {\n if (entry.kind !== \"file\" || scheduled >= openWithWarmupLimit) {\n continue;\n }\n\n const key = resolveWorkspaceFileOpenWithCacheKey(entry);\n if (\n seenKeys.has(key) ||\n this.applicationsByKey.has(key) ||\n this.inflightByKey.has(key) ||\n this.warmupScheduledKeys.has(key)\n ) {\n continue;\n }\n\n seenKeys.add(key);\n this.warmupScheduledKeys.add(key);\n scheduled += 1;\n void load(entry).finally(() => {\n this.warmupScheduledKeys.delete(key);\n });\n }\n }\n}\n","import {\n createWorkspaceFileManagerStore,\n normalizeWorkspaceFileManagerPersistedState\n} from \"./workspaceFileManagerStore.ts\";\nimport { DefaultWorkspaceFileManagerSession } from \"./workspaceFileManagerSession.ts\";\nimport type { WorkspaceFileManagerService } from \"../workspaceFileManagerService.interface.ts\";\nimport type { CreateWorkspaceFileManagerSessionInput } from \"../workspaceFileManagerHost.interface.ts\";\nimport type { WorkspaceFileManagerCapabilities } from \"../workspaceFileManagerTypes.ts\";\n\nexport class DefaultWorkspaceFileManagerService implements WorkspaceFileManagerService {\n createSession(input: CreateWorkspaceFileManagerSessionInput) {\n const capabilities = capabilitiesFromHost(input);\n const store = createWorkspaceFileManagerStore({\n capabilities,\n initialDirectoryPath: input.initialDirectoryPath,\n persistedState: normalizeWorkspaceFileManagerPersistedState(\n input.persistedState ?? input.persistence?.load?.()\n ),\n workspaceID: input.workspaceID\n });\n\n return new DefaultWorkspaceFileManagerSession({\n copy: input.i18n,\n host: input.host,\n onHostActionMessage: input.onHostActionMessage,\n onMutationErrorMessage: input.onMutationErrorMessage,\n persistence: input.persistence,\n store\n });\n }\n}\n\nfunction capabilitiesFromHost(\n input: CreateWorkspaceFileManagerSessionInput\n): WorkspaceFileManagerCapabilities {\n return {\n canCopy: input.host.copyEntriesToClipboard !== undefined,\n canCreateDirectory: input.host.createDirectory !== undefined,\n canCreateFile: input.host.createFile !== undefined,\n canDelete: input.host.deleteEntry !== undefined,\n canExport: input.host.exportEntry !== undefined,\n canImportFromDrop:\n input.host.resolveDroppedPaths !== undefined &&\n input.host.importPaths !== undefined,\n canImportFromPicker: input.host.importFiles !== undefined,\n canMove: input.host.moveEntry !== undefined,\n canOpenInAppBrowser: input.host.openFileInAppBrowser !== undefined,\n canOpenInDefaultBrowser: input.host.openFileInDefaultBrowser !== undefined,\n canOpenWith: input.host.listOpenWithApplications !== undefined,\n canPickOtherOpenWithApplication:\n input.host.openFileWithOtherApplication !== undefined,\n canRevealInFolder: input.host.revealEntry !== undefined,\n canRename: input.host.renameEntry !== undefined,\n canSearch: input.host.search !== undefined\n };\n}\n","import { DefaultWorkspaceFileManagerService } from \"./internal/workspaceFileManagerService.ts\";\nimport type { WorkspaceFileManagerService } from \"./workspaceFileManagerService.interface.ts\";\n\nexport function createWorkspaceFileManagerService(): WorkspaceFileManagerService {\n return new DefaultWorkspaceFileManagerService();\n}\n"],"mappings":"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","names":["resolveWorkspaceFileExtension"]}
|