@tutti-os/workspace-file-manager 0.0.3 → 0.0.5

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.
@@ -15,6 +15,14 @@ var nextopI18nModule = createScopedLocaleObjectsI18nModuleManifest({
15
15
  });
16
16
  var workspaceFileManagerEn = {
17
17
  backLabel: "Back",
18
+ arrangeApplicationLabel: "Application",
19
+ arrangeCreatedLabel: "Created",
20
+ arrangeDateAddedLabel: "Date Added",
21
+ arrangeKindLabel: "Kind",
22
+ arrangeLastOpenedLabel: "Last Opened",
23
+ arrangeMenuLabel: "Arrange",
24
+ arrangeNoneLabel: "None",
25
+ arrangeTagsLabel: "Tags",
18
26
  breadcrumbRootLabel: "workspace",
19
27
  cancelLabel: "Cancel",
20
28
  closeLabel: "Close",
@@ -96,6 +104,14 @@ var workspaceFileManagerEn = {
96
104
  };
97
105
  var workspaceFileManagerZhCN = {
98
106
  backLabel: "\u540E\u9000",
107
+ arrangeApplicationLabel: "\u5E94\u7528\u7A0B\u5E8F",
108
+ arrangeCreatedLabel: "\u521B\u5EFA\u65E5\u671F",
109
+ arrangeDateAddedLabel: "\u6DFB\u52A0\u65E5\u671F",
110
+ arrangeKindLabel: "\u79CD\u7C7B",
111
+ arrangeLastOpenedLabel: "\u4E0A\u6B21\u6253\u5F00\u65E5\u671F",
112
+ arrangeMenuLabel: "\u6392\u5217\u65B9\u5F0F",
113
+ arrangeNoneLabel: "\u65E0",
114
+ arrangeTagsLabel: "\u6807\u7B7E",
99
115
  breadcrumbRootLabel: "\u5DE5\u4F5C\u533A",
100
116
  cancelLabel: "\u53D6\u6D88",
101
117
  closeLabel: "\u5173\u95ED",
@@ -209,4 +225,4 @@ export {
209
225
  createWorkspaceFileManagerI18nRuntime,
210
226
  resolveRevealInFolderLabel
211
227
  };
212
- //# sourceMappingURL=chunk-P2UOYMTS.js.map
228
+ //# sourceMappingURL=chunk-AUUZNQ37.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/i18n/workspaceFileManagerI18n.ts"],"sourcesContent":["import {\n createScopedLocaleObjectsI18nModuleManifest,\n createScopedI18nRuntime,\n type I18nDictionary,\n type I18nRuntime\n} from \"@tutti-os/ui-i18n-runtime\";\n\ntype WorkspaceFileManagerI18nLocale = \"en\" | \"zh-CN\";\nexport const workspaceFileManagerI18nNamespace = \"workspaceFileManager\";\nexport const nextopI18nModule = createScopedLocaleObjectsI18nModuleManifest({\n localeObjectByLocale: {\n en: \"workspaceFileManagerEn\",\n \"zh-CN\": \"workspaceFileManagerZhCN\"\n },\n name: \"workspace-file-manager\",\n namespace: \"workspaceFileManager\",\n sourceRoot: \"packages/workspace/file-manager/src\"\n});\n\nconst workspaceFileManagerEn = {\n backLabel: \"Back\",\n arrangeApplicationLabel: \"Application\",\n arrangeCreatedLabel: \"Created\",\n arrangeDateAddedLabel: \"Date Added\",\n arrangeKindLabel: \"Kind\",\n arrangeLastOpenedLabel: \"Last Opened\",\n arrangeMenuLabel: \"Arrange\",\n arrangeNoneLabel: \"None\",\n arrangeTagsLabel: \"Tags\",\n breadcrumbRootLabel: \"workspace\",\n cancelLabel: \"Cancel\",\n closeLabel: \"Close\",\n copyLabel: \"Copy\",\n copyPathLabel: \"Copy path\",\n copyPathSuccessTitle: \"Path copied\",\n copySuccessTitle: \"Copied to clipboard\",\n createActionLabel: \"Create\",\n createDirectoryLabel: \"New folder\",\n createDirectoryPlaceholder: \"Folder name\",\n createFileLabel: \"New file\",\n createFilePlaceholder: \"File name\",\n createNameInvalid: \"Use a valid name without path separators\",\n createNameRequired: \"Enter a name to continue\",\n deleteConfirmDescription: \"Delete {{name}} from this workspace?\",\n deleteLabel: \"Delete\",\n deletingLabel: \"Deleting...\",\n downloadFailedTitle: \"Download failed\",\n downloadLabel: \"Download\",\n dropToImportLabel: \"Drop files here to import to the current folder\",\n emptyDirectory: \"No visible files in this folder\",\n forwardLabel: \"Forward\",\n loading: \"Loading\",\n modifiedLabel: \"Modified\",\n nameLabel: \"Name\",\n noSearchResults: \"No files matched your search\",\n openFailedTitle: \"Open failed\",\n openLabel: \"Open\",\n openInAppBrowserLabel: \"Nextop built-in browser\",\n openInDefaultBrowserLabel: \"Default Browser\",\n openWithLabel: \"Open With\",\n openWithLoadingLabel: \"Loading apps...\",\n openWithOtherLabel: \"Other...\",\n openWithOtherPickerPrompt: \"Choose an application to open this file:\",\n revealInFileExplorerLabel: \"Reveal in File Explorer\",\n revealInFileManagerLabel: \"Reveal in File Manager\",\n revealInFinderLabel: \"Reveal in Finder\",\n unknownErrorMessage: \"Something went wrong. Please try again.\",\n previewBinary:\n \"This file looks binary, so the preview stays read-only for now.\",\n previewDecodeFailed:\n \"We couldn't decode this file as UTF-8 text for preview.\",\n previewDirectoryLabel: \"Folder\",\n previewEmptyLabel: \"Select a file or folder to view details\",\n previewFileTooLarge:\n \"This file is larger than {{maxSize}}, so inline preview is disabled.\",\n previewLoadingLabel: \"Loading preview...\",\n previewTooLarge:\n \"This text file is larger than {{maxSize}}, so inline preview is disabled.\",\n previewUnavailableDownloadBody:\n \"Download {{name}} to open it in another environment.\",\n previewUnavailableOpenBody: \"Open {{name}} in your local app instead.\",\n previewUnavailableTitle: \"Can't preview this file\",\n previewUnsupported: \"Inline preview isn't available for this file type yet.\",\n revealFailedTitle: \"Could not reveal in file manager\",\n renameActionLabel: \"Rename\",\n renameLabel: \"Rename\",\n renamePlaceholder: \"New name\",\n refreshLabel: \"Refresh\",\n retryLabel: \"Retry\",\n searchPlaceholder: \"Search files\",\n searchResultsLabel: \"Search results\",\n sizeLabel: \"Size\",\n unsupportedImportBody:\n \"Importing local files into the workspace is not wired up in this desktop build yet.\",\n unsupportedImportTitle: \"Import not available yet\",\n unsupportedViewBody:\n \"Opening {{name}} from the file manager is not supported in this desktop build yet.\",\n unsupportedViewTitle: \"Open not available yet\",\n importConflictDescription:\n \"{{count}} file from this import already exists in this folder tree. Replace it?\",\n importConflictReplaceLabel: \"Replace files\",\n importConflictReviewLabel: \"Existing path\",\n importConflictSummaryFiltered: \"Filtered: {{count}}\",\n importConflictSummaryIgnored: \"Ignored: {{count}}\",\n importConflictSummaryReasonIgnored: \"Ignored by rules: {{count}}\",\n importConflictSummaryReasonSymlink: \"Skipped symlinks: {{count}}\",\n importConflictSummaryReasonSystemMetadata:\n \"Skipped system metadata: {{count}}\",\n importConflictSummarySelected: \"Selected: {{count}}\",\n importConflictTitle: \"Replace existing file?\",\n importFailedTitle: \"Import failed\",\n importLabel: \"Import\",\n importTypeConflictDescription:\n \"{{count}} import path conflicts with an existing file or folder using an incompatible type. Resolve it before retrying.\",\n importTypeConflictTitle: \"Import path conflict\",\n layoutIconViewLabel: \"Icon view\",\n layoutListViewLabel: \"List view\"\n} as const satisfies I18nDictionary;\n\nconst workspaceFileManagerZhCN = {\n backLabel: \"后退\",\n arrangeApplicationLabel: \"应用程序\",\n arrangeCreatedLabel: \"创建日期\",\n arrangeDateAddedLabel: \"添加日期\",\n arrangeKindLabel: \"种类\",\n arrangeLastOpenedLabel: \"上次打开日期\",\n arrangeMenuLabel: \"排列方式\",\n arrangeNoneLabel: \"无\",\n arrangeTagsLabel: \"标签\",\n breadcrumbRootLabel: \"工作区\",\n cancelLabel: \"取消\",\n closeLabel: \"关闭\",\n copyLabel: \"复制\",\n copyPathLabel: \"复制路径\",\n copyPathSuccessTitle: \"复制成功\",\n copySuccessTitle: \"已复制到剪贴板\",\n createActionLabel: \"创建\",\n createDirectoryLabel: \"新建文件夹\",\n createDirectoryPlaceholder: \"文件夹名称\",\n createFileLabel: \"新建文件\",\n createFilePlaceholder: \"文件名称\",\n createNameInvalid: \"请输入有效名称,且不要包含路径分隔符\",\n createNameRequired: \"请输入名称后再继续\",\n deleteConfirmDescription: \"要从这个工作区删除 {{name}} 吗?\",\n deleteLabel: \"删除\",\n deletingLabel: \"删除中...\",\n downloadFailedTitle: \"下载失败\",\n downloadLabel: \"下载\",\n dropToImportLabel: \"将文件拖到这里以导入到当前文件夹\",\n emptyDirectory: \"这个文件夹里没有可见文件\",\n forwardLabel: \"前进\",\n loading: \"加载中\",\n modifiedLabel: \"修改时间\",\n nameLabel: \"名称\",\n noSearchResults: \"没有匹配的文件\",\n openFailedTitle: \"打开失败\",\n openLabel: \"打开\",\n openInAppBrowserLabel: \"Nextop 内置的浏览器\",\n openInDefaultBrowserLabel: \"默认浏览器\",\n openWithLabel: \"打开方式\",\n openWithLoadingLabel: \"正在加载应用...\",\n openWithOtherLabel: \"其他...\",\n openWithOtherPickerPrompt: \"选择用来打开此文件的应用程序:\",\n revealInFileExplorerLabel: \"在文件资源管理器中显示\",\n revealInFileManagerLabel: \"在文件管理器中显示\",\n revealInFinderLabel: \"在 Finder 中显示\",\n unknownErrorMessage: \"出了点问题,请稍后再试。\",\n previewBinary: \"这个文件更像二进制内容,当前先保持只读占位。\",\n previewDecodeFailed: \"暂时无法按 UTF-8 文本解码这个文件。\",\n previewDirectoryLabel: \"文件夹\",\n previewEmptyLabel: \"选择文件或文件夹查看详情\",\n previewFileTooLarge: \"这个文件超过了 {{maxSize}},暂时不做内联预览。\",\n previewLoadingLabel: \"正在加载预览...\",\n previewTooLarge: \"这个文本文件超过了 {{maxSize}},暂时不做内联预览。\",\n previewUnavailableDownloadBody: \"下载 {{name}} 后再在其他环境中打开。\",\n previewUnavailableOpenBody: \"改为在本地应用中打开 {{name}}。\",\n previewUnavailableTitle: \"这个文件暂时无法预览\",\n previewUnsupported: \"这种文件类型暂时还不支持内联预览。\",\n revealFailedTitle: \"无法在文件管理器中显示\",\n renameActionLabel: \"重命名\",\n renameLabel: \"重命名\",\n renamePlaceholder: \"新名称\",\n refreshLabel: \"刷新\",\n retryLabel: \"重试\",\n searchPlaceholder: \"搜索文件\",\n searchResultsLabel: \"搜索结果\",\n sizeLabel: \"大小\",\n unsupportedImportBody:\n \"这个桌面版本暂时还没有把本地文件导入到工作区的链路接通。\",\n unsupportedImportTitle: \"暂不支持导入\",\n unsupportedViewBody:\n \"这个桌面版本暂时还不支持直接从文件管理器打开 {{name}}。\",\n unsupportedViewTitle: \"暂不支持打开\",\n importConflictDescription:\n \"这次导入里有 {{count}} 个文件在当前目录树中已经存在。要替换吗?\",\n importConflictReplaceLabel: \"替换文件\",\n importConflictReviewLabel: \"现有路径\",\n importConflictSummaryFiltered: \"已过滤:{{count}}\",\n importConflictSummaryIgnored: \"已忽略:{{count}}\",\n importConflictSummaryReasonIgnored: \"规则忽略:{{count}}\",\n importConflictSummaryReasonSymlink: \"已跳过符号链接:{{count}}\",\n importConflictSummaryReasonSystemMetadata: \"已跳过系统元数据:{{count}}\",\n importConflictSummarySelected: \"已选择:{{count}}\",\n importConflictTitle: \"替换已有文件?\",\n importFailedTitle: \"导入失败\",\n importLabel: \"导入\",\n importTypeConflictDescription:\n \"这次导入里有 {{count}} 个路径与现有文件或文件夹的类型不兼容。请先处理后再重试。\",\n importTypeConflictTitle: \"导入路径冲突\",\n layoutIconViewLabel: \"图标\",\n layoutListViewLabel: \"列表\"\n} as const satisfies I18nDictionary;\n\nexport type WorkspaceFileManagerI18nKey = keyof typeof workspaceFileManagerEn;\n\nexport type WorkspaceFileManagerI18nRuntime =\n I18nRuntime<WorkspaceFileManagerI18nKey>;\n\nconst workspaceFileManagerDefaults: Record<\n WorkspaceFileManagerI18nLocale,\n I18nDictionary\n> = {\n en: workspaceFileManagerEn,\n \"zh-CN\": workspaceFileManagerZhCN\n};\n\nexport const workspaceFileManagerI18nResources: Record<\n WorkspaceFileManagerI18nLocale,\n I18nDictionary\n> = {\n en: {\n [workspaceFileManagerI18nNamespace]: workspaceFileManagerDefaults.en\n },\n \"zh-CN\": {\n [workspaceFileManagerI18nNamespace]: workspaceFileManagerDefaults[\"zh-CN\"]\n }\n};\n\nexport function createWorkspaceFileManagerI18nRuntime(\n runtime: I18nRuntime<string>\n): WorkspaceFileManagerI18nRuntime {\n return createScopedI18nRuntime<WorkspaceFileManagerI18nKey>(\n runtime,\n workspaceFileManagerI18nNamespace\n );\n}\n\nexport function resolveRevealInFolderLabel(\n copy: WorkspaceFileManagerI18nRuntime,\n platform: NodeJS.Platform\n): string {\n if (platform === \"darwin\") {\n return copy.t(\"revealInFinderLabel\");\n }\n if (platform === \"win32\") {\n return copy.t(\"revealInFileExplorerLabel\");\n }\n return copy.t(\"revealInFileManagerLabel\");\n}\n"],"mappings":"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","names":[]}
@@ -1756,4 +1756,4 @@ export {
1756
1756
  buildWorkspaceFileBreadcrumbs,
1757
1757
  createWorkspaceFileManagerService
1758
1758
  };
1759
- //# sourceMappingURL=chunk-IMOFXYBB.js.map
1759
+ //# sourceMappingURL=chunk-HYOTD6NY.js.map
@@ -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 createdTimeMs?: number | null;\n lastOpenedMs?: number | null;\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"]}
@@ -1,4 +1,4 @@
1
- import { a as WorkspaceFileManagerI18nRuntime } from './index-CwydAjYx.js';
1
+ import { a as WorkspaceFileManagerI18nRuntime } from './index-xbXdkX5G.js';
2
2
 
3
3
  type WorkspaceFileManagerHostActionMessageStatus = "cancelled" | "completed" | "started";
4
4
  interface WorkspaceFileManagerHostActionMessage {
@@ -62,6 +62,8 @@ declare const workspaceFileManagerPersistedStateSchemaVersion: 2;
62
62
  interface WorkspaceFileEntry {
63
63
  hasChildren: boolean;
64
64
  kind: WorkspaceFileEntryKind;
65
+ createdTimeMs?: number | null;
66
+ lastOpenedMs?: number | null;
65
67
  mtimeMs: number | null;
66
68
  name: string;
67
69
  path: string;
@@ -1,2 +1,2 @@
1
- export { W as WorkspaceFileManagerI18nKey, a as WorkspaceFileManagerI18nRuntime, c as createWorkspaceFileManagerI18nRuntime, w as workspaceFileManagerI18nNamespace, b as workspaceFileManagerI18nResources } from '../index-CwydAjYx.js';
1
+ export { W as WorkspaceFileManagerI18nKey, a as WorkspaceFileManagerI18nRuntime, c as createWorkspaceFileManagerI18nRuntime, w as workspaceFileManagerI18nNamespace, b as workspaceFileManagerI18nResources } from '../index-xbXdkX5G.js';
2
2
  import '@tutti-os/ui-i18n-runtime';
@@ -2,7 +2,7 @@ import {
2
2
  createWorkspaceFileManagerI18nRuntime,
3
3
  workspaceFileManagerI18nNamespace,
4
4
  workspaceFileManagerI18nResources
5
- } from "../chunk-P2UOYMTS.js";
5
+ } from "../chunk-AUUZNQ37.js";
6
6
  export {
7
7
  createWorkspaceFileManagerI18nRuntime,
8
8
  workspaceFileManagerI18nNamespace,
@@ -4,6 +4,14 @@ type WorkspaceFileManagerI18nLocale = "en" | "zh-CN";
4
4
  declare const workspaceFileManagerI18nNamespace = "workspaceFileManager";
5
5
  declare const workspaceFileManagerEn: {
6
6
  readonly backLabel: "Back";
7
+ readonly arrangeApplicationLabel: "Application";
8
+ readonly arrangeCreatedLabel: "Created";
9
+ readonly arrangeDateAddedLabel: "Date Added";
10
+ readonly arrangeKindLabel: "Kind";
11
+ readonly arrangeLastOpenedLabel: "Last Opened";
12
+ readonly arrangeMenuLabel: "Arrange";
13
+ readonly arrangeNoneLabel: "None";
14
+ readonly arrangeTagsLabel: "Tags";
7
15
  readonly breadcrumbRootLabel: "workspace";
8
16
  readonly cancelLabel: "Cancel";
9
17
  readonly closeLabel: "Close";
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { y as WorkspaceFileOpenWithApplication, b as WorkspaceFileEntry, w as WorkspaceFileManagerSession } from './fileKinds-DQHup7UY.js';
2
- export { C as CreateWorkspaceFileManagerSessionInput, W as WorkspaceFileActivationTarget, a as WorkspaceFileDirectoryListing, c as WorkspaceFileEntryKind, d as WorkspaceFileImportConflict, e as WorkspaceFileImportSummary, f as WorkspaceFileImportSummaryReason, g as WorkspaceFileImportSummaryReasonCount, h as WorkspaceFileManagerCapabilities, i as WorkspaceFileManagerFileActivationRequest, j as WorkspaceFileManagerHost, k as WorkspaceFileManagerHostActionMessage, l as WorkspaceFileManagerHostActionMessageStatus, m as WorkspaceFileManagerHostActionResult, n as WorkspaceFileManagerHostExportResult, o as WorkspaceFileManagerHostFallbackAction, p as WorkspaceFileManagerHostFallbackActionKind, q as WorkspaceFileManagerHostFileActivationResult, r as WorkspaceFileManagerHostImportConflict, s as WorkspaceFileManagerHostImportResult, t as WorkspaceFileManagerMutationErrorMessage, u as WorkspaceFileManagerPersistedState, v as WorkspaceFileManagerService, x as WorkspaceFileManagerState, z as WorkspaceFilePreviewKind, A as WorkspaceFilePreviewState, B as WorkspaceFileSearchEntry, D as WorkspaceFileSearchResult, E as classifyWorkspaceFilePreviewKind, F as createWorkspaceFileManagerService, G as resolveWorkspaceFileActivationTarget } from './fileKinds-DQHup7UY.js';
3
- import { a as WorkspaceFileManagerI18nRuntime } from './index-CwydAjYx.js';
4
- export { W as WorkspaceFileManagerI18nKey, c as createWorkspaceFileManagerI18nRuntime, w as workspaceFileManagerI18nNamespace, b as workspaceFileManagerI18nResources } from './index-CwydAjYx.js';
1
+ import { y as WorkspaceFileOpenWithApplication, b as WorkspaceFileEntry, w as WorkspaceFileManagerSession } from './fileKinds-DGVPkO8z.js';
2
+ export { C as CreateWorkspaceFileManagerSessionInput, W as WorkspaceFileActivationTarget, a as WorkspaceFileDirectoryListing, c as WorkspaceFileEntryKind, d as WorkspaceFileImportConflict, e as WorkspaceFileImportSummary, f as WorkspaceFileImportSummaryReason, g as WorkspaceFileImportSummaryReasonCount, h as WorkspaceFileManagerCapabilities, i as WorkspaceFileManagerFileActivationRequest, j as WorkspaceFileManagerHost, k as WorkspaceFileManagerHostActionMessage, l as WorkspaceFileManagerHostActionMessageStatus, m as WorkspaceFileManagerHostActionResult, n as WorkspaceFileManagerHostExportResult, o as WorkspaceFileManagerHostFallbackAction, p as WorkspaceFileManagerHostFallbackActionKind, q as WorkspaceFileManagerHostFileActivationResult, r as WorkspaceFileManagerHostImportConflict, s as WorkspaceFileManagerHostImportResult, t as WorkspaceFileManagerMutationErrorMessage, u as WorkspaceFileManagerPersistedState, v as WorkspaceFileManagerService, x as WorkspaceFileManagerState, z as WorkspaceFilePreviewKind, A as WorkspaceFilePreviewState, B as WorkspaceFileSearchEntry, D as WorkspaceFileSearchResult, E as classifyWorkspaceFilePreviewKind, F as createWorkspaceFileManagerService, G as resolveWorkspaceFileActivationTarget } from './fileKinds-DGVPkO8z.js';
3
+ import { a as WorkspaceFileManagerI18nRuntime } from './index-xbXdkX5G.js';
4
+ export { W as WorkspaceFileManagerI18nKey, c as createWorkspaceFileManagerI18nRuntime, w as workspaceFileManagerI18nNamespace, b as workspaceFileManagerI18nResources } from './index-xbXdkX5G.js';
5
5
  import { ReactElement } from 'react';
6
6
  import { NextopDateLocale } from '@tutti-os/ui-system/date-format';
7
7
  export { decodeWorkspaceTextFile, isWorkspaceTextFileTooLarge, looksLikeBinaryText, resolveWorkspaceFileExtension, resolveWorkspaceImageMimeType, workspaceFilePreviewMaxBytes, workspaceFileTextMaxBytes } from '@tutti-os/workspace-file-preview';