@powerhousedao/connect 6.2.2-dev.10 → 6.2.2-dev.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/assets/document-icon-192x192.png +0 -0
  2. package/assets/document-icon-512x512.png +0 -0
  3. package/assets/pwa-192x192.png +0 -0
  4. package/assets/pwa-512x512-maskable.png +0 -0
  5. package/assets/pwa-512x512.png +0 -0
  6. package/dist/{AddDriveModal-MMHlkJBJ.js → AddDriveModal-B_Oft9Cv.js} +4 -4
  7. package/dist/{AddDriveModal-MMHlkJBJ.js.map → AddDriveModal-B_Oft9Cv.js.map} +1 -1
  8. package/dist/{ClearStorageModal-CriXdO7P.js → ClearStorageModal-DKxn1Qxa.js} +4 -4
  9. package/dist/{ClearStorageModal-CriXdO7P.js.map → ClearStorageModal-DKxn1Qxa.js.map} +1 -1
  10. package/dist/{CookiesPolicyModal-CkcUKPLb.js → CookiesPolicyModal-CYFTfkEN.js} +3 -3
  11. package/dist/{CookiesPolicyModal-CkcUKPLb.js.map → CookiesPolicyModal-CYFTfkEN.js.map} +1 -1
  12. package/dist/{CreateDocumentModal-CvsTh0HM.js → CreateDocumentModal-Dmg3R-Vh.js} +3 -3
  13. package/dist/{CreateDocumentModal-CvsTh0HM.js.map → CreateDocumentModal-Dmg3R-Vh.js.map} +1 -1
  14. package/dist/{DebugSettingsModal-YV8YMO9a.js → DebugSettingsModal-DUNPkZoc.js} +5 -5
  15. package/dist/{DebugSettingsModal-YV8YMO9a.js.map → DebugSettingsModal-DUNPkZoc.js.map} +1 -1
  16. package/dist/{DeleteDriveModal-DSTK8FYk.js → DeleteDriveModal-CzRPqyMf.js} +4 -4
  17. package/dist/{DeleteDriveModal-DSTK8FYk.js.map → DeleteDriveModal-CzRPqyMf.js.map} +1 -1
  18. package/dist/{DeleteItemModal-B2nJmjsP.js → DeleteItemModal-CaCrmQOG.js} +4 -4
  19. package/dist/{DeleteItemModal-B2nJmjsP.js.map → DeleteItemModal-CaCrmQOG.js.map} +1 -1
  20. package/dist/{DisclaimerModal-D5FO34u9.js → DisclaimerModal-D5Jhefcc.js} +3 -3
  21. package/dist/{DisclaimerModal-D5FO34u9.js.map → DisclaimerModal-D5Jhefcc.js.map} +1 -1
  22. package/dist/{DownloadDocumentWithErrorsModal-tEr3bbtN.js → DownloadDocumentWithErrorsModal-ZuX8WDCC.js} +3 -3
  23. package/dist/{DownloadDocumentWithErrorsModal-tEr3bbtN.js.map → DownloadDocumentWithErrorsModal-ZuX8WDCC.js.map} +1 -1
  24. package/dist/{DriveAuthRequiredModal-BA2vS3oF.js → DriveAuthRequiredModal-CPV5uXnf.js} +3 -3
  25. package/dist/{DriveAuthRequiredModal-BA2vS3oF.js.map → DriveAuthRequiredModal-CPV5uXnf.js.map} +1 -1
  26. package/dist/{DriveSettingsModal-kR3hQnh4.js → DriveSettingsModal-VNpuhty1.js} +3 -3
  27. package/dist/{DriveSettingsModal-kR3hQnh4.js.map → DriveSettingsModal-VNpuhty1.js.map} +1 -1
  28. package/dist/{InspectorModal-DKvjtozu.js → InspectorModal-B7wmgMfE.js} +6 -6
  29. package/dist/{InspectorModal-DKvjtozu.js.map → InspectorModal-B7wmgMfE.js.map} +1 -1
  30. package/dist/{MissingPackageModal-BQcCQbOn.js → MissingPackageModal-D4V6oYzy.js} +18 -6
  31. package/dist/MissingPackageModal-D4V6oYzy.js.map +1 -0
  32. package/dist/OpenFileDocumentsModal-DCrZnA6c.js +293 -0
  33. package/dist/OpenFileDocumentsModal-DCrZnA6c.js.map +1 -0
  34. package/dist/{SettingsModal-yk1gDZgB.js → SettingsModal-BsYFJB2W.js} +25 -12
  35. package/dist/SettingsModal-BsYFJB2W.js.map +1 -0
  36. package/dist/{UpgradeDriveModal-BZGSE9_r.js → UpgradeDriveModal-Ul4tyz-Q.js} +3 -3
  37. package/dist/{UpgradeDriveModal-BZGSE9_r.js.map → UpgradeDriveModal-Ul4tyz-Q.js.map} +1 -1
  38. package/dist/{app-loader-BrGV3wVg.js → app-loader-DG_ohYMb.js} +251 -34
  39. package/dist/app-loader-DG_ohYMb.js.map +1 -0
  40. package/dist/app-loader-aQ0Wk8uH.js +4 -0
  41. package/dist/{build-info-DDJ2GhCe.js → build-info-Do0SMo9O.js} +5 -5
  42. package/dist/{build-info-DDJ2GhCe.js.map → build-info-Do0SMo9O.js.map} +1 -1
  43. package/dist/components-BDpsXnOO.js +5 -0
  44. package/dist/{connection-state-DO_2lAEJ.js → connection-state-xPSbZ_4J.js} +3 -3
  45. package/dist/{connection-state-DO_2lAEJ.js.map → connection-state-xPSbZ_4J.js.map} +1 -1
  46. package/dist/{load-BrYKdy5m.js → load-y7fD2Bfj.js} +9 -9
  47. package/dist/{load-BrYKdy5m.js.map → load-y7fD2Bfj.js.map} +1 -1
  48. package/dist/main.js +1 -1
  49. package/dist/{package-DvEHDzEU.js → package-Bc_Nktb7.js} +4 -4
  50. package/dist/package-Bc_Nktb7.js.map +1 -0
  51. package/dist/{pglite-seed-z3B1JA38.js → pglite-seed-DRYYEWUq.js} +4 -4
  52. package/dist/{pglite-seed-z3B1JA38.js.map → pglite-seed-DRYYEWUq.js.map} +1 -1
  53. package/dist/pwa-manifest-link-CG8UajMz.js +34 -0
  54. package/dist/pwa-manifest-link-CG8UajMz.js.map +1 -0
  55. package/dist/{reactor-BRr4To9y.js → reactor-BzjtiHGa.js} +138 -11
  56. package/dist/reactor-BzjtiHGa.js.map +1 -0
  57. package/dist/{registerServiceWorker-nJIc0yEY.js → registerServiceWorker-uI4Gj6fl.js} +5 -3
  58. package/dist/registerServiceWorker-uI4Gj6fl.js.map +1 -0
  59. package/dist/{reload-connect-toast-D1Iqw9E_.js → reload-connect-toast-BkgP9i6_.js} +19 -3
  60. package/dist/{reload-connect-toast-D1Iqw9E_.js.map → reload-connect-toast-BkgP9i6_.js.map} +1 -1
  61. package/dist/start-connect.js +1 -1
  62. package/dist/style.css +16 -3
  63. package/dist/{toast-4t-VimvD.js → toast-BLv8rjmy.js} +3 -3
  64. package/dist/{toast-4t-VimvD.js.map → toast-BLv8rjmy.js.map} +1 -1
  65. package/dist/useRegistryPackages-DMhCvTWq.js +314 -0
  66. package/dist/useRegistryPackages-DMhCvTWq.js.map +1 -0
  67. package/package.json +11 -11
  68. package/dist/MissingPackageModal-BQcCQbOn.js.map +0 -1
  69. package/dist/SettingsModal-yk1gDZgB.js.map +0 -1
  70. package/dist/app-loader-Be9G3Rlk.js +0 -4
  71. package/dist/app-loader-BrGV3wVg.js.map +0 -1
  72. package/dist/components-BfW9xuar.js +0 -5
  73. package/dist/package-DvEHDzEU.js.map +0 -1
  74. package/dist/reactor-BRr4To9y.js.map +0 -1
  75. package/dist/registerServiceWorker-nJIc0yEY.js.map +0 -1
  76. package/dist/useRegistryPackages-BaYtekjQ.js +0 -179
  77. package/dist/useRegistryPackages-BaYtekjQ.js.map +0 -1
@@ -1,10 +1,10 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3a07410f-5ec1-51ae-b4b3-9e6c024d06d9")}catch(e){}}();
3
- import { t as package_default } from "./package-DvEHDzEU.js";
4
- import { i as shortGitSha, n as getGitUrl, t as getGitSha } from "./build-info-DDJ2GhCe.js";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a1de242c-bdbe-5781-8009-4f46499b422a")}catch(e){}}();
3
+ import { t as package_default } from "./package-Bc_Nktb7.js";
4
+ import { i as shortGitSha, n as getGitUrl, t as getGitSha } from "./build-info-Do0SMo9O.js";
5
5
  import { r as connectConfig } from "./connect.config-vgUeFoNp.js";
6
- import { n as toast } from "./toast-4t-VimvD.js";
7
- import { t as useRegistryPackages } from "./useRegistryPackages-BaYtekjQ.js";
6
+ import { n as toast } from "./toast-BLv8rjmy.js";
7
+ import { t as useRegistryPackages } from "./useRegistryPackages-DMhCvTWq.js";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  import { t } from "i18next";
10
10
  import { useCallback, useMemo, useState } from "react";
@@ -200,7 +200,7 @@ function parseBareName(spec) {
200
200
  }
201
201
  const ConnectPackageManager = () => {
202
202
  const packageManager = useVetraPackageManager();
203
- const { registryPackageList, updateRegistryPackageStatus, registerFallbackRegistryPackage } = useRegistryPackages();
203
+ const { registryPackageList, installedPackages, availablePackages, availableHasMore, isLoadingAvailable, isLoadingMoreAvailable, availableError, ensureAvailableLoaded, fetchAvailablePage, loadMoreAvailable, setAvailableSearch, updateRegistryPackageStatus, registerFallbackRegistryPackage } = useRegistryPackages();
204
204
  async function handleInstall(packageSpec) {
205
205
  if (!packageManager) return;
206
206
  const bareName = parseBareName(packageSpec);
@@ -212,7 +212,8 @@ const ConnectPackageManager = () => {
212
212
  toast(`Package "${packageSpec}" installed successfully`, { type: "connect-success" });
213
213
  } else {
214
214
  const message = result.error.message;
215
- toast(/failed to fetch|404|not found/i.test(message) ? `Could not install "${packageSpec}". The package isn't available on this registry, and the npmjs.org fallback could not resolve it either.` : `Failed to install "${packageSpec}": ${message}`, { type: "error" });
215
+ console.error(`[Connect][PackageManager] Install failed for "${packageSpec}":`, result.error);
216
+ toast(/failed to fetch|404|not found/i.test(message) ? `Couldn't install "${packageSpec}". It isn't available on this registry or via npm.` : `Couldn't install "${packageSpec}". Please try again.`, { type: "error" });
216
217
  }
217
218
  }
218
219
  function handleUninstall(packageName) {
@@ -222,14 +223,26 @@ const ConnectPackageManager = () => {
222
223
  updateRegistryPackageStatus(packageName, "available");
223
224
  toast(`Package "${packageName}" uninstalled successfully`, { type: "connect-success" });
224
225
  } catch (error) {
225
- toast(`Failed to uninstall "${packageName}": ${error instanceof Error ? error.message : "Unknown error"}`, { type: "error" });
226
+ console.error(`[Connect][PackageManager] Uninstall failed for "${packageName}":`, error);
227
+ toast(`Couldn't uninstall "${packageName}". Please try again.`, { type: "error" });
226
228
  }
227
229
  }
228
230
  return /* @__PURE__ */ jsx("div", {
229
- className: "flex h-full flex-1 flex-col",
231
+ className: "flex min-h-0 flex-1 flex-col",
230
232
  children: /* @__PURE__ */ jsx(PackageManager, {
231
233
  mutable: true,
232
- registryPackageList,
234
+ installedPackages,
235
+ availablePackages,
236
+ isAvailableLoading: isLoadingAvailable,
237
+ isLoadingMoreAvailable,
238
+ hasMoreAvailable: availableHasMore,
239
+ onLoadMoreAvailable: loadMoreAvailable,
240
+ availableError,
241
+ onAvailableRetry: () => {
242
+ fetchAvailablePage({ reset: true });
243
+ },
244
+ onAvailableSearchChange: setAvailableSearch,
245
+ onAvailableTabOpen: ensureAvailableLoaded,
233
246
  onInstall: handleInstall,
234
247
  onUninstall: handleUninstall
235
248
  })
@@ -285,5 +298,5 @@ const SettingsModal = () => {
285
298
  //#endregion
286
299
  export { SettingsModal };
287
300
 
288
- //# sourceMappingURL=SettingsModal-yk1gDZgB.js.map
289
- //# debugId=3a07410f-5ec1-51ae-b4b3-9e6c024d06d9
301
+ //# sourceMappingURL=SettingsModal-BsYFJB2W.js.map
302
+ //# debugId=a1de242c-bdbe-5781-8009-4f46499b422a
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsModal-BsYFJB2W.js","sources":["../src/components/modal/modals/settings/about.tsx","../src/components/modal/modals/settings/danger-zone.tsx","../src/components/modal/modals/settings/default-editor.tsx","../src/components/modal/modals/settings/package-manager.tsx","../src/components/modal/modals/SettingsModal.tsx"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport {\n getGitSha,\n getGitUrl,\n packageJson,\n shortGitSha,\n} from \"@powerhousedao/connect/utils\";\nimport { Icon } from \"@powerhousedao/design-system\";\nimport { About as BaseAbout } from \"@powerhousedao/design-system/connect\";\nimport {\n closePHModal,\n DriveCollectionId,\n showPHModal,\n useDrives,\n useDriveSystemInfo,\n useSyncList,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport { useMemo } from \"react\";\n\nexport const About: React.FC = () => {\n const onOpenInspector = () => {\n closePHModal();\n showPHModal({ type: \"inspector\" });\n };\n\n return (\n <div>\n <BaseAbout\n packageJson={packageJson}\n phCliVersion={\n typeof connectConfig.phCliVersion === \"string\"\n ? connectConfig.phCliVersion\n : undefined\n }\n />\n <AppGitHash />\n <ConnectedDrives />\n <div className=\"bg-background p-3\">\n <h2 className=\"mb-2 font-semibold text-foreground\">Inspector</h2>\n <p className=\"mb-3 text-sm font-normal text-foreground\">\n Explore the local database and sync state for debugging.\n </p>\n <button\n className=\"flex items-center gap-x-2 rounded-md border border-border bg-transparent px-3 py-1 text-sm font-medium text-foreground transition-colors hover:hover-effect\"\n onClick={onOpenInspector}\n type=\"button\"\n >\n Open Inspector <Icon name=\"CircleInfo\" size={16} />\n </button>\n </div>\n </div>\n );\n};\n\nfunction AppGitHash() {\n const sha = getGitSha();\n if (sha === \"unknown\") return null;\n const url = getGitUrl();\n const label = shortGitSha(sha);\n return (\n <div className=\"bg-background p-3 text-sm\">\n <span className=\"font-semibold\">Git hash: </span>\n {url ? (\n <a\n className=\"font-mono underline\"\n href={url}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n title={sha}\n >\n {label}\n </a>\n ) : (\n <span className=\"font-mono\" title={sha}>\n {label}\n </span>\n )}\n </div>\n );\n}\n\nfunction ConnectedDrives() {\n const drives = useDrives() ?? [];\n const remotes = useSyncList();\n\n const remoteDrives = useMemo(\n () =>\n drives.filter((d) =>\n remotes.some((r) =>\n r.meta.collectionId.equals(DriveCollectionId.forDrive(d.header.id)),\n ),\n ),\n [drives, remotes],\n );\n\n return (\n <div className=\"my-4 bg-background p-3\">\n <h2 className=\"mb-2 font-semibold text-foreground\">Connected drives</h2>\n {remoteDrives.length === 0 ? (\n <p className=\"text-sm font-normal text-foreground\">\n No connected remote drives.\n </p>\n ) : (\n <ul className=\"flex flex-col gap-3\">\n {remoteDrives.map((drive) => (\n <DriveAboutEntry key={drive.header.id} drive={drive} />\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nfunction DriveAboutEntry({ drive }: { drive: DocumentDriveDocument }) {\n const info = useDriveSystemInfo(drive);\n const name = drive.state.global.name || drive.header.name;\n\n return (\n <li className=\"text-sm text-foreground\">\n <div className=\"flex items-baseline gap-2\">\n <span className=\"font-medium\">{name}</span>\n {info.status === \"ready\" && (\n <span className=\"text-xs text-muted-foreground\">{info.host}</span>\n )}\n </div>\n {info.status === \"loading\" && (\n <div className=\"mt-1 text-xs text-muted-foreground\">Loading…</div>\n )}\n {info.status === \"error\" && (\n <div className=\"mt-1 text-xs text-destructive\">\n Could not load system info\n </div>\n )}\n {info.status === \"ready\" && (\n <div className=\"mt-1 text-xs text-foreground\">\n <div>\n <span className=\"font-medium\">Version:</span> {info.version}\n </div>\n <div>\n <span className=\"font-medium\">Git hash: </span>\n {info.gitUrl ? (\n <a\n className=\"font-mono hover:underline\"\n href={info.gitUrl}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n title={info.gitHash}\n >\n {shortGitSha(info.gitHash)}\n </a>\n ) : (\n <span className=\"font-mono\" title={info.gitHash}>\n {shortGitSha(info.gitHash)}\n </span>\n )}\n </div>\n </div>\n )}\n {info.status === \"local\" && (\n <div className=\"mt-1 text-xs text-muted-foreground\">\n Local drive — N/A\n </div>\n )}\n </li>\n );\n}\n","import { DangerZone as BaseDangerZone } from \"@powerhousedao/design-system/connect\";\nimport {\n deleteDrive,\n setSelectedDrive,\n showPHModal,\n useDrives,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\n\nexport const DangerZone: React.FC = () => {\n const drives = useDrives();\n\n const handleDeleteDrive = async (drive: DocumentDriveDocument) => {\n await deleteDrive(drive.header.id);\n setSelectedDrive(undefined);\n };\n\n const handleClearStorage = () => {\n showPHModal({ type: \"clearStorage\" });\n };\n\n return (\n <BaseDangerZone\n drives={drives ?? []}\n onDeleteDrive={(drive) => {\n void handleDeleteDrive(drive);\n }}\n onClearStorage={handleClearStorage}\n />\n );\n};\n","import { DefaultEditor as BaseDefaultEditor } from \"@powerhousedao/design-system/connect\";\nimport { useCallback, useState } from \"react\";\n\nconst documentModelEditorOptions = [\n { label: \"V1\", value: \"document-model-editor\" },\n { label: \"V2\", value: \"document-model-editor-v2\" },\n] as const;\n\nexport const DefaultEditor: React.FC = () => {\n const [documentModelEditor, setDocumentModelEditor] = useState<\n (typeof documentModelEditorOptions)[number]\n >(documentModelEditorOptions[1]);\n\n const handleSetDocumentEditor = useCallback((value: string) => {\n const option = documentModelEditorOptions.find((dm) => dm.value == value);\n if (option) {\n setDocumentModelEditor(option);\n }\n }, []);\n\n return (\n <BaseDefaultEditor\n documentModelEditor={documentModelEditor.value}\n setDocumentModelEditor={handleSetDocumentEditor}\n documentModelEditorOptions={\n documentModelEditorOptions as unknown as {\n value: string;\n label: string;\n }[]\n }\n />\n );\n};\n","import { useRegistryPackages } from \"@powerhousedao/connect/hooks\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport { PackageManager } from \"@powerhousedao/design-system/connect\";\nimport { useVetraPackageManager } from \"@powerhousedao/reactor-browser\";\nimport React from \"react\";\n\n/**\n * Split a `name@tag` spec into its bare package name. Mirrors the design-system's\n * `parsePackageSpec` — duplicated here to avoid reaching into a deep subpath\n * export. Scoped names split on the LAST `@`, unscoped on the first.\n */\nfunction parseBareName(spec: string): string {\n const trimmed = spec.trim();\n const at = trimmed.startsWith(\"@\")\n ? trimmed.lastIndexOf(\"@\")\n : trimmed.indexOf(\"@\");\n return at > 0 ? trimmed.slice(0, at) : trimmed;\n}\n\nexport const ConnectPackageManager: React.FC = () => {\n const packageManager = useVetraPackageManager();\n const {\n registryPackageList,\n installedPackages,\n availablePackages,\n availableHasMore,\n isLoadingAvailable,\n isLoadingMoreAvailable,\n availableError,\n ensureAvailableLoaded,\n fetchAvailablePage,\n loadMoreAvailable,\n setAvailableSearch,\n updateRegistryPackageStatus,\n registerFallbackRegistryPackage,\n } = useRegistryPackages();\n\n async function handleInstall(packageSpec: string) {\n if (!packageManager) return;\n\n // The spec may include an explicit `@tag` / `@version` suffix from the\n // search input. Pass it through to the package manager as-is (the CDN\n // route already handles `name@tag` specs), but track status under the\n // bare name so the Settings list doesn't fragment.\n const bareName = parseBareName(packageSpec);\n // Packages that were in `/packages` when the user clicked Install go\n // through `updateRegistryPackageStatus` and hit an existing entry.\n // Packages that landed via the npm-uplink fallback weren't in the list,\n // so we register them explicitly rather than silently upserting a\n // placeholder — keeping the \"does not exist\" error as a signal for any\n // other code path that reaches update without a matching entry.\n const wasKnownToRegistry = registryPackageList.some(\n (p) => p.name === bareName,\n );\n const result = await packageManager.addPackage(packageSpec);\n if (result.type === \"success\") {\n if (wasKnownToRegistry) {\n updateRegistryPackageStatus(bareName, \"registry-install\");\n } else {\n registerFallbackRegistryPackage(\n bareName,\n result.package,\n packageManager.getPackageVersion(bareName) ??\n packageManager.getPackageVersion(packageSpec),\n \"registry-install\",\n );\n }\n toast(`Package \"${packageSpec}\" installed successfully`, {\n type: \"connect-success\",\n });\n } else {\n const message = result.error.message;\n console.error(\n `[Connect][PackageManager] Install failed for \"${packageSpec}\":`,\n result.error,\n );\n // `BrowserPackageManager` raises a generic \"Failed to fetch dynamically\n // imported module\" when the registry CDN returns an error. That covers\n // both \"the name exists nowhere (not on this registry AND not on the\n // npmjs uplink)\" and \"the tarball is there but doesn't look like a\n // Powerhouse package\". Map to plain-language copy — never dump the raw\n // API / loader message into the toast.\n const isLikelyNotFound = /failed to fetch|404|not found/i.test(message);\n const userMessage = isLikelyNotFound\n ? `Couldn't install \"${packageSpec}\". It isn't available on this registry or via npm.`\n : `Couldn't install \"${packageSpec}\". Please try again.`;\n toast(userMessage, { type: \"error\" });\n }\n }\n\n function handleUninstall(packageName: string) {\n if (!packageManager) return;\n try {\n packageManager.removePackage(packageName);\n updateRegistryPackageStatus(packageName, \"available\");\n\n toast(`Package \"${packageName}\" uninstalled successfully`, {\n type: \"connect-success\",\n });\n } catch (error) {\n console.error(\n `[Connect][PackageManager] Uninstall failed for \"${packageName}\":`,\n error,\n );\n toast(`Couldn't uninstall \"${packageName}\". Please try again.`, {\n type: \"error\",\n });\n }\n }\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <PackageManager\n mutable={true}\n installedPackages={installedPackages}\n availablePackages={availablePackages}\n isAvailableLoading={isLoadingAvailable}\n isLoadingMoreAvailable={isLoadingMoreAvailable}\n hasMoreAvailable={availableHasMore}\n onLoadMoreAvailable={loadMoreAvailable}\n availableError={availableError}\n onAvailableRetry={() => {\n void fetchAvailablePage({ reset: true });\n }}\n onAvailableSearchChange={setAvailableSearch}\n onAvailableTabOpen={ensureAvailableLoaded}\n onInstall={handleInstall}\n onUninstall={handleUninstall}\n />\n </div>\n );\n};\n","import {\n SettingsModal as SettingsModalV2,\n ThemeSwitch,\n} from \"@powerhousedao/design-system/connect\";\nimport { closePHModal, usePHModal } from \"@powerhousedao/reactor-browser\";\nimport { t } from \"i18next\";\nimport { CircleHelp, Package, PenLine, TriangleAlert } from \"lucide-react\";\nimport React, { useMemo } from \"react\";\nimport { About } from \"./settings/about.js\";\nimport { DangerZone } from \"./settings/danger-zone.js\";\nimport { DefaultEditor } from \"./settings/default-editor.js\";\nimport { ConnectPackageManager } from \"./settings/package-manager.js\";\n\nconst iconProps = { size: 16 } as const;\n\nexport const SettingsModal: React.FC = () => {\n const phModal = usePHModal();\n const open = phModal?.type === \"settings\";\n\n const tabs = useMemo(\n () => [\n {\n id: \"package-manager\",\n icon: <Package {...iconProps} />,\n label: \"Package Manager\",\n content: ConnectPackageManager,\n },\n {\n id: \"default-editors\",\n icon: <PenLine {...iconProps} />,\n label: \"Default Editors\",\n content: DefaultEditor,\n },\n {\n id: \"danger-zone\",\n icon: <TriangleAlert {...iconProps} className=\"text-destructive\" />,\n label: <span className=\"text-destructive\">Danger Zone</span>,\n content: () => <DangerZone />,\n },\n {\n id: \"about\",\n icon: <CircleHelp {...iconProps} />,\n label: \"About\",\n content: About,\n },\n ],\n [],\n );\n\n return (\n <SettingsModalV2\n open={open}\n title={t(\"modals.connectSettings.title\")}\n onOpenChange={(status: boolean) => {\n if (!status) return closePHModal();\n }}\n tabs={tabs}\n navFooter={<ThemeSwitch horizontal />}\n />\n );\n};\n"],"names":["About","BaseAbout","packageJson","DangerZone","BaseDangerZone","DefaultEditor","BaseDefaultEditor","DefaultEditor","DangerZone","About","SettingsModalV2"],"mappings":";;;;;;;;;;;;;;;AAoBA,MAAaA,gBAAwB;CACnC,MAAM,wBAAwB;AAC5B,gBAAc;AACd,cAAY,EAAE,MAAM,aAAa,CAAC;;AAGpC,QACE,qBAAC,OAAD,EAAA,UAAA;EACE,oBAACC,OAAD;GACE,aAAaC;GACb,cACE,OAAO,cAAc,iBAAiB,WAClC,cAAc,eACd,KAAA;GAEN,CAAA;EACF,oBAAC,YAAD,EAAc,CAAA;EACd,oBAAC,iBAAD,EAAmB,CAAA;EACnB,qBAAC,OAAD;GAAK,WAAU;aAAf;IACE,oBAAC,MAAD;KAAI,WAAU;eAAqC;KAAc,CAAA;IACjE,oBAAC,KAAD;KAAG,WAAU;eAA2C;KAEpD,CAAA;IACJ,qBAAC,UAAD;KACE,WAAU;KACV,SAAS;KACT,MAAK;eAHP,CAIC,mBACgB,oBAAC,MAAD;MAAM,MAAK;MAAa,MAAM;MAAM,CAAA,CAC5C;;IACL;;EACF,EAAA,CAAA;;AAIV,SAAS,aAAa;CACpB,MAAM,MAAM,WAAW;AACvB,KAAI,QAAQ,UAAW,QAAO;CAC9B,MAAM,MAAM,WAAW;CACvB,MAAM,QAAQ,YAAY,IAAI;AAC9B,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,QAAD;GAAM,WAAU;aAAgB;GAAiB,CAAA,EAChD,MACC,oBAAC,KAAD;GACE,WAAU;GACV,MAAM;GACN,QAAO;GACP,KAAI;GACJ,OAAO;aAEN;GACC,CAAA,GAEJ,oBAAC,QAAD;GAAM,WAAU;GAAY,OAAO;aAChC;GACI,CAAA,CAEL;;;AAIV,SAAS,kBAAkB;CACzB,MAAM,SAAS,WAAW,IAAI,EAAE;CAChC,MAAM,UAAU,aAAa;CAE7B,MAAM,eAAe,cAEjB,OAAO,QAAQ,MACb,QAAQ,MAAM,MACZ,EAAE,KAAK,aAAa,OAAO,kBAAkB,SAAS,EAAE,OAAO,GAAG,CAAC,CACpE,CACF,EACH,CAAC,QAAQ,QAAQ,CAClB;AAED,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,MAAD;GAAI,WAAU;aAAqC;GAAqB,CAAA,EACvE,aAAa,WAAW,IACvB,oBAAC,KAAD;GAAG,WAAU;aAAsC;GAE/C,CAAA,GAEJ,oBAAC,MAAD;GAAI,WAAU;aACX,aAAa,KAAK,UACjB,oBAAC,iBAAD,EAA8C,OAAS,EAAjC,MAAM,OAAO,GAAoB,CACvD;GACC,CAAA,CAEH;;;AAIV,SAAS,gBAAgB,EAAE,SAA2C;CACpE,MAAM,OAAO,mBAAmB,MAAM;AAGtC,QACE,qBAAC,MAAD;EAAI,WAAU;YAAd;GACE,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,QAAD;KAAM,WAAU;eALT,MAAM,MAAM,OAAO,QAAQ,MAAM,OAAO;KAKJ,CAAA,EAC1C,KAAK,WAAW,WACf,oBAAC,QAAD;KAAM,WAAU;eAAiC,KAAK;KAAY,CAAA,CAEhE;;GACL,KAAK,WAAW,aACf,oBAAC,OAAD;IAAK,WAAU;cAAqC;IAAc,CAAA;GAEnE,KAAK,WAAW,WACf,oBAAC,OAAD;IAAK,WAAU;cAAgC;IAEzC,CAAA;GAEP,KAAK,WAAW,WACf,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,qBAAC,OAAD,EAAA,UAAA;KACE,oBAAC,QAAD;MAAM,WAAU;gBAAc;MAAe,CAAA;;KAAE,KAAK;KAChD,EAAA,CAAA,EACN,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,QAAD;KAAM,WAAU;eAAc;KAAiB,CAAA,EAC9C,KAAK,SACJ,oBAAC,KAAD;KACE,WAAU;KACV,MAAM,KAAK;KACX,QAAO;KACP,KAAI;KACJ,OAAO,KAAK;eAEX,YAAY,KAAK,QAAQ;KACxB,CAAA,GAEJ,oBAAC,QAAD;KAAM,WAAU;KAAY,OAAO,KAAK;eACrC,YAAY,KAAK,QAAQ;KACrB,CAAA,CAEL,EAAA,CAAA,CACF;;GAEP,KAAK,WAAW,WACf,oBAAC,OAAD;IAAK,WAAU;cAAqC;IAE9C,CAAA;GAEL;;;;;AC3JT,MAAaC,qBAA6B;CACxC,MAAM,SAAS,WAAW;CAE1B,MAAM,oBAAoB,OAAO,UAAiC;AAChE,QAAM,YAAY,MAAM,OAAO,GAAG;AAClC,mBAAiB,KAAA,EAAU;;CAG7B,MAAM,2BAA2B;AAC/B,cAAY,EAAE,MAAM,gBAAgB,CAAC;;AAGvC,QACE,oBAACC,YAAD;EACE,QAAQ,UAAU,EAAE;EACpB,gBAAgB,UAAU;AACnB,qBAAkB,MAAM;;EAE/B,gBAAgB;EAChB,CAAA;;;;ACzBN,MAAM,6BAA6B,CACjC;CAAE,OAAO;CAAM,OAAO;CAAyB,EAC/C;CAAE,OAAO;CAAM,OAAO;CAA4B,CACnD;AAED,MAAaC,wBAAgC;CAC3C,MAAM,CAAC,qBAAqB,0BAA0B,SAEpD,2BAA2B,GAAG;CAEhC,MAAM,0BAA0B,aAAa,UAAkB;EAC7D,MAAM,SAAS,2BAA2B,MAAM,OAAO,GAAG,SAAS,MAAM;AACzE,MAAI,OACF,wBAAuB,OAAO;IAE/B,EAAE,CAAC;AAEN,QACE,oBAACC,eAAD;EACE,qBAAqB,oBAAoB;EACzC,wBAAwB;EAEtB;EAKF,CAAA;;;;;;;;;ACnBN,SAAS,cAAc,MAAsB;CAC3C,MAAM,UAAU,KAAK,MAAM;CAC3B,MAAM,KAAK,QAAQ,WAAW,IAAI,GAC9B,QAAQ,YAAY,IAAI,GACxB,QAAQ,QAAQ,IAAI;AACxB,QAAO,KAAK,IAAI,QAAQ,MAAM,GAAG,GAAG,GAAG;;AAGzC,MAAa,8BAAwC;CACnD,MAAM,iBAAiB,wBAAwB;CAC/C,MAAM,EACJ,qBACA,mBACA,mBACA,kBACA,oBACA,wBACA,gBACA,uBACA,oBACA,mBACA,oBACA,6BACA,oCACE,qBAAqB;CAEzB,eAAe,cAAc,aAAqB;AAChD,MAAI,CAAC,eAAgB;EAMrB,MAAM,WAAW,cAAc,YAAY;EAO3C,MAAM,qBAAqB,oBAAoB,MAC5C,MAAM,EAAE,SAAS,SACnB;EACD,MAAM,SAAS,MAAM,eAAe,WAAW,YAAY;AAC3D,MAAI,OAAO,SAAS,WAAW;AAC7B,OAAI,mBACF,6BAA4B,UAAU,mBAAmB;OAEzD,iCACE,UACA,OAAO,SACP,eAAe,kBAAkB,SAAS,IACxC,eAAe,kBAAkB,YAAY,EAC/C,mBACD;AAEH,SAAM,YAAY,YAAY,2BAA2B,EACvD,MAAM,mBACP,CAAC;SACG;GACL,MAAM,UAAU,OAAO,MAAM;AAC7B,WAAQ,MACN,iDAAiD,YAAY,KAC7D,OAAO,MACR;AAWD,SAJyB,iCAAiC,KAAK,QAAQ,GAEnE,qBAAqB,YAAY,sDACjC,qBAAqB,YAAY,uBAClB,EAAE,MAAM,SAAS,CAAC;;;CAIzC,SAAS,gBAAgB,aAAqB;AAC5C,MAAI,CAAC,eAAgB;AACrB,MAAI;AACF,kBAAe,cAAc,YAAY;AACzC,+BAA4B,aAAa,YAAY;AAErD,SAAM,YAAY,YAAY,6BAA6B,EACzD,MAAM,mBACP,CAAC;WACK,OAAO;AACd,WAAQ,MACN,mDAAmD,YAAY,KAC/D,MACD;AACD,SAAM,uBAAuB,YAAY,uBAAuB,EAC9D,MAAM,SACP,CAAC;;;AAIN,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,gBAAD;GACE,SAAS;GACU;GACA;GACnB,oBAAoB;GACI;GACxB,kBAAkB;GAClB,qBAAqB;GACL;GAChB,wBAAwB;AACjB,uBAAmB,EAAE,OAAO,MAAM,CAAC;;GAE1C,yBAAyB;GACzB,oBAAoB;GACpB,WAAW;GACX,aAAa;GACb,CAAA;EACE,CAAA;;;;ACpHV,MAAM,YAAY,EAAE,MAAM,IAAI;AAE9B,MAAa,sBAAgC;CAE3C,MAAM,OADU,YAAY,EACN,SAAS;CAE/B,MAAM,OAAO,cACL;EACJ;GACE,IAAI;GACJ,MAAM,oBAAC,SAAD,EAAS,GAAI,WAAa,CAAA;GAChC,OAAO;GACP,SAAS;GACV;EACD;GACE,IAAI;GACJ,MAAM,oBAAC,SAAD,EAAS,GAAI,WAAa,CAAA;GAChC,OAAO;GACP,SAASC;GACV;EACD;GACE,IAAI;GACJ,MAAM,oBAAC,eAAD;IAAe,GAAI;IAAW,WAAU;IAAqB,CAAA;GACnE,OAAO,oBAAC,QAAD;IAAM,WAAU;cAAmB;IAAkB,CAAA;GAC5D,eAAe,oBAACC,cAAD,EAAc,CAAA;GAC9B;EACD;GACE,IAAI;GACJ,MAAM,oBAAC,YAAD,EAAY,GAAI,WAAa,CAAA;GACnC,OAAO;GACP,SAASC;GACV;EACF,EACD,EAAE,CACH;AAED,QACE,oBAACC,iBAAD;EACQ;EACN,OAAO,EAAE,+BAA+B;EACxC,eAAe,WAAoB;AACjC,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAE9B;EACN,WAAW,oBAAC,aAAD,EAAa,YAAA,MAAa,CAAA;EACrC,CAAA","debug_id":"a1de242c-bdbe-5781-8009-4f46499b422a"}
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="d0cff9c7-cc95-58d8-a8e7-1950202bec87")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="f3f737bf-a881-54cb-ae94-2c0265b6ac48")}catch(e){}}();
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { useTranslation } from "react-i18next";
5
5
  import "react";
@@ -30,5 +30,5 @@ const UpgradeDriveModal = () => {
30
30
  //#endregion
31
31
  export { UpgradeDriveModal };
32
32
 
33
- //# sourceMappingURL=UpgradeDriveModal-BZGSE9_r.js.map
34
- //# debugId=d0cff9c7-cc95-58d8-a8e7-1950202bec87
33
+ //# sourceMappingURL=UpgradeDriveModal-Ul4tyz-Q.js.map
34
+ //# debugId=f3f737bf-a881-54cb-ae94-2c0265b6ac48
@@ -1 +1 @@
1
- {"version":3,"file":"UpgradeDriveModal-BZGSE9_r.js","sources":["../src/components/modal/modals/UpgradeDriveModal.tsx"],"sourcesContent":["import { ConnectUpgradeDriveModal } from \"@powerhousedao/design-system/connect\";\nimport { closePHModal, usePHModal } from \"@powerhousedao/reactor-browser\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nexport const UpgradeDriveModal: React.FC = () => {\n const phModal = usePHModal();\n const open = phModal?.type === \"upgradeDrive\";\n const driveId = open ? phModal.driveId : undefined;\n\n const { t } = useTranslation();\n\n const onContinue = () => {\n // TODO: Implement upgrade drive\n console.log(\"Upgrade drive: \", driveId);\n closePHModal();\n };\n\n return (\n <ConnectUpgradeDriveModal\n open={open}\n onContinue={onContinue}\n header={t(\"modals.upgradeDrive.header\")}\n body={t(\"modals.upgradeDrive.body\")}\n cancelLabel={t(\"common.cancel\")}\n continueLabel={t(\"common.continue\")}\n onOpenChange={(status: boolean) => {\n if (!status) return closePHModal();\n }}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAKA,MAAa,0BAAoC;CAC/C,MAAM,UAAU,YAAY;CAC5B,MAAM,OAAO,SAAS,SAAS;CAC/B,MAAM,UAAU,OAAO,QAAQ,UAAU,KAAA;CAEzC,MAAM,EAAE,MAAM,gBAAgB;CAE9B,MAAM,mBAAmB;AAEvB,UAAQ,IAAI,mBAAmB,QAAQ;AACvC,gBAAc;;AAGhB,QACE,oBAAC,0BAAD;EACQ;EACM;EACZ,QAAQ,EAAE,6BAA6B;EACvC,MAAM,EAAE,2BAA2B;EACnC,aAAa,EAAE,gBAAgB;EAC/B,eAAe,EAAE,kBAAkB;EACnC,eAAe,WAAoB;AACjC,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,CAAA","debug_id":"d0cff9c7-cc95-58d8-a8e7-1950202bec87"}
1
+ {"version":3,"file":"UpgradeDriveModal-Ul4tyz-Q.js","sources":["../src/components/modal/modals/UpgradeDriveModal.tsx"],"sourcesContent":["import { ConnectUpgradeDriveModal } from \"@powerhousedao/design-system/connect\";\nimport { closePHModal, usePHModal } from \"@powerhousedao/reactor-browser\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nexport const UpgradeDriveModal: React.FC = () => {\n const phModal = usePHModal();\n const open = phModal?.type === \"upgradeDrive\";\n const driveId = open ? phModal.driveId : undefined;\n\n const { t } = useTranslation();\n\n const onContinue = () => {\n // TODO: Implement upgrade drive\n console.log(\"Upgrade drive: \", driveId);\n closePHModal();\n };\n\n return (\n <ConnectUpgradeDriveModal\n open={open}\n onContinue={onContinue}\n header={t(\"modals.upgradeDrive.header\")}\n body={t(\"modals.upgradeDrive.body\")}\n cancelLabel={t(\"common.cancel\")}\n continueLabel={t(\"common.continue\")}\n onOpenChange={(status: boolean) => {\n if (!status) return closePHModal();\n }}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAKA,MAAa,0BAAoC;CAC/C,MAAM,UAAU,YAAY;CAC5B,MAAM,OAAO,SAAS,SAAS;CAC/B,MAAM,UAAU,OAAO,QAAQ,UAAU,KAAA;CAEzC,MAAM,EAAE,MAAM,gBAAgB;CAE9B,MAAM,mBAAmB;AAEvB,UAAQ,IAAI,mBAAmB,QAAQ;AACvC,gBAAc;;AAGhB,QACE,oBAAC,0BAAD;EACQ;EACM;EACZ,QAAQ,EAAE,6BAA6B;EACvC,MAAM,EAAE,2BAA2B;EACnC,aAAa,EAAE,gBAAgB;EAC/B,eAAe,EAAE,kBAAkB;EACnC,eAAe,WAAoB;AACjC,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,CAAA","debug_id":"f3f737bf-a881-54cb-ae94-2c0265b6ac48"}
@@ -1,19 +1,19 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="0f26aa55-63fe-5fc1-9943-71992142e31b")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="baee3198-555c-5f1f-8e4d-821a86679aae")}catch(e){}}();
3
3
  import { n as getRuntimeConfig } from "./runtime-config-DL3QjcfM.js";
4
4
  import { c as idbError } from "./pglite-major-B39aOEiE.js";
5
5
  import { n as cloneFileData, r as migrateIdb } from "./pglite-migrate-core-Boxqqx-c.js";
6
- import { i as i18n, n as setSentryModule } from "./reload-connect-toast-D1Iqw9E_.js";
6
+ import { i as i18n, n as setSentryModule } from "./reload-connect-toast-BkgP9i6_.js";
7
7
  import { a as defaultPHDocumentEditorConfig, i as defaultPHAppConfig, r as connectConfig } from "./connect.config-vgUeFoNp.js";
8
- import { f as PRIMARY_IDB_NAMES, r as subscribeWorkerConnection, s as getCachedMigrationMajor, t as getWorkerConnectionStatus, u as subscribeMigrationMajor } from "./connection-state-DO_2lAEJ.js";
9
- import { n as serviceWorkerManager, r as subscribeServiceWorkerUpdate, t as getServiceWorkerUpdateAvailable } from "./registerServiceWorker-nJIc0yEY.js";
10
- import { n as toast, t as ToastContainer } from "./toast-4t-VimvD.js";
8
+ import { f as PRIMARY_IDB_NAMES, r as subscribeWorkerConnection, s as getCachedMigrationMajor, t as getWorkerConnectionStatus, u as subscribeMigrationMajor } from "./connection-state-xPSbZ_4J.js";
9
+ import { n as serviceWorkerManager, r as subscribeServiceWorkerUpdate, t as getServiceWorkerUpdateAvailable } from "./registerServiceWorker-uI4Gj6fl.js";
10
+ import { n as toast, t as ToastContainer } from "./toast-BLv8rjmy.js";
11
11
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
12
12
  import { Trans, useTranslation } from "react-i18next";
13
13
  import React, { StrictMode, Suspense, lazy, useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
14
- import { DriveCollectionId, getRevisionFromDate, initTheme, logout, openRenown, setPHAppConfig, setPHDocumentEditorConfig, setRevisionHistoryVisible, setSelectedDrive, setSelectedNode, showPHModal, useAppModuleById, useConnectionStates, useDefaultAppModule, useDocumentById, useDocumentModelModuleById, useDocumentOperations, useDrives, useEditorModuleById, useEditorPreloader, useFallbackEditorModule, useIsAddDriveEnabled, useNodeParentFolderById, usePHModal, usePackageDiscoveryService, useReactorClientModule, useRevisionHistoryVisible, useSelectedDocument, useSelectedDocumentId, useSelectedDriveSafe, useSelectedFolder, useSelectedTimelineItem, useSyncList, useTheme, useUser, useVetraPackageManager, useVetraPackages } from "@powerhousedao/reactor-browser";
14
+ import { DriveCollectionId, addFileWithProgress, getRevisionFromDate, initTheme, logout, openRenown, setPHAppConfig, setPHDocumentEditorConfig, setRevisionHistoryVisible, setSelectedDrive, setSelectedNode, showPHModal, useAppModuleById, useConnectionStates, useDefaultAppModule, useDocumentById, useDocumentModelModuleById, useDocumentOperations, useDrives, useEditorModuleById, useEditorPreloader, useFallbackEditorModule, useIsAddDriveEnabled, useNodeParentFolderById, usePHModal, usePackageDiscoveryService, useReactorClientModule, useRevisionHistoryVisible, useSelectedDocument, useSelectedDocumentId, useSelectedDriveSafe, useSelectedFolder, useSelectedTimelineItem, useSyncList, useTheme, useUser, useVetraPackageManager, useVetraPackages } from "@powerhousedao/reactor-browser";
15
15
  import { childLogger } from "document-model";
16
- import { ConnectSidebar, ConnectTooltipProvider, CookieBanner, DefaultEditorLoader, DriveAuthGate, DropZoneWrapper, HomeScreen, HomeScreenAddDriveItem, HomeScreenItem, LogoAnimation, PackageInstallModal, RevisionHistory, SidebarAddDriveItem, SidebarItem, useEns } from "@powerhousedao/design-system/connect";
16
+ import { ConnectSidebar, ConnectTooltipProvider, CookieBanner, DefaultEditorLoader, DriveAuthGate, DropZoneWrapper, HomeScreen, HomeScreenAddDriveItem, HomeScreenItem, LogoAnimation, PackageInstallModal, RevisionHistory, SidebarAddDriveItem, SidebarItem, UploadFileListContainer, formatFileSize, mapProgressStageToStatus, useEns } from "@powerhousedao/design-system/connect";
17
17
  import { z } from "zod";
18
18
  import { Outlet, RouterProvider, createBrowserRouter, createRoutesFromChildren, matchRoutes, useLocation, useNavigationType } from "react-router-dom";
19
19
  import { useHotkeys } from "react-hotkeys-hook";
@@ -75,6 +75,184 @@ var DocumentEditorDebugTools = class {
75
75
  }
76
76
  };
77
77
  //#endregion
78
+ //#region src/utils/launch-queue.ts
79
+ let pendingImportFiles = [];
80
+ const pendingListeners = /* @__PURE__ */ new Set();
81
+ function notifyPendingListeners() {
82
+ for (const listener of pendingListeners) listener();
83
+ }
84
+ function getPendingImportFiles() {
85
+ return pendingImportFiles;
86
+ }
87
+ /** Stable identity of a pending file (also the picker's pre-check cache key). */
88
+ function pendingFileKey(file) {
89
+ return `${file.name}|${file.size}|${file.lastModified}`;
90
+ }
91
+ function addPendingImportFiles(files) {
92
+ const seen = new Set(pendingImportFiles.map(pendingFileKey));
93
+ const fresh = files.filter((file) => {
94
+ const key = pendingFileKey(file);
95
+ if (seen.has(key)) return false;
96
+ seen.add(key);
97
+ return true;
98
+ });
99
+ if (fresh.length === 0) return;
100
+ pendingImportFiles = [...pendingImportFiles, ...fresh];
101
+ notifyPendingListeners();
102
+ }
103
+ function clearPendingImportFiles() {
104
+ if (pendingImportFiles.length === 0) return;
105
+ pendingImportFiles = [];
106
+ notifyPendingListeners();
107
+ }
108
+ function subscribePendingImportFiles(cb) {
109
+ pendingListeners.add(cb);
110
+ return () => {
111
+ pendingListeners.delete(cb);
112
+ };
113
+ }
114
+ async function handleLaunchParams(params) {
115
+ const handles = params.files.filter((handle) => handle.kind === "file");
116
+ if (handles.length === 0) return;
117
+ const files = [];
118
+ for (const handle of handles) try {
119
+ files.push(await handle.getFile());
120
+ } catch (error) {
121
+ console.error("Failed to read launched file:", handle.name, error);
122
+ }
123
+ if (files.length === 0) return;
124
+ addPendingImportFiles(files);
125
+ showPHModal({ type: "openFileDocuments" });
126
+ }
127
+ function maybeReopenImportModal() {
128
+ if (getPendingImportFiles().length === 0) return;
129
+ if (window.ph?.modal !== void 0) return;
130
+ showPHModal({ type: "openFileDocuments" });
131
+ }
132
+ let initialized = false;
133
+ /**
134
+ * Register the launchQueue consumer that receives files opened with Connect
135
+ * through the OS file association. Idempotent (safe under StrictMode double
136
+ * effects) and a no-op where the File Handling API doesn't exist — Firefox,
137
+ * Safari, and any context without an installed PWA manifest simply never
138
+ * deliver launches.
139
+ */
140
+ function initLaunchQueueFileHandling() {
141
+ if (initialized) return;
142
+ initialized = true;
143
+ window.addEventListener("ph:modalUpdated", maybeReopenImportModal);
144
+ window.launchQueue?.setConsumer((params) => {
145
+ handleLaunchParams(params);
146
+ });
147
+ }
148
+ //#endregion
149
+ //#region src/utils/open-file-uploads.ts
150
+ let uploads = [];
151
+ const listeners$3 = /* @__PURE__ */ new Set();
152
+ function notifyUploadListeners() {
153
+ for (const listener of listeners$3) listener();
154
+ }
155
+ function getOpenFileUploads() {
156
+ return uploads;
157
+ }
158
+ function subscribeOpenFileUploads(cb) {
159
+ listeners$3.add(cb);
160
+ return () => {
161
+ listeners$3.delete(cb);
162
+ };
163
+ }
164
+ function removeOpenFileUpload(id) {
165
+ const next = uploads.filter((upload) => upload.id !== id);
166
+ if (next.length === uploads.length) return;
167
+ uploads = next;
168
+ notifyUploadListeners();
169
+ }
170
+ function clearOpenFileUploads() {
171
+ if (uploads.length === 0) return;
172
+ uploads = [];
173
+ notifyUploadListeners();
174
+ }
175
+ function addOpenFileUploads(rows) {
176
+ uploads = [...uploads, ...rows];
177
+ notifyUploadListeners();
178
+ }
179
+ function patchOpenFileUpload(id, patch) {
180
+ uploads = uploads.map((upload) => upload.id === id ? {
181
+ ...upload,
182
+ ...patch
183
+ } : upload);
184
+ notifyUploadListeners();
185
+ }
186
+ let uploadCounter = 0;
187
+ let importChain = Promise.resolve();
188
+ /**
189
+ * Import one file and resolve once the flow truly ends. Completion is
190
+ * tracked through the progress stages, NOT the returned promise — the
191
+ * package-discovery retry path resolves early and keeps reporting through
192
+ * the callback. `resolveConflict: "duplicate"` is always passed: duplicates
193
+ * were resolved in the picker (rename), so the conflict stage must never
194
+ * fire — this also covers a duplicate appearing between pre-check and import.
195
+ */
196
+ function importOne(row, driveId, documentTypes) {
197
+ return new Promise((resolve) => {
198
+ let settled = false;
199
+ const settle = (fileNode) => {
200
+ if (settled) return;
201
+ settled = true;
202
+ resolve(fileNode);
203
+ };
204
+ addFileWithProgress(row.file, driveId, row.name, void 0, (progress) => {
205
+ patchOpenFileUpload(row.id, {
206
+ status: mapProgressStageToStatus(progress.stage),
207
+ progress: progress.progress,
208
+ ...progress.error ? { errorDetails: progress.error } : {},
209
+ ...progress.documentType ? { documentType: progress.documentType } : {},
210
+ ...progress.fileNode ? { fileNode: progress.fileNode } : {}
211
+ });
212
+ switch (progress.stage) {
213
+ case "complete":
214
+ settle(progress.fileNode);
215
+ break;
216
+ case "failed":
217
+ case "unsupported-document-type":
218
+ settle(void 0);
219
+ break;
220
+ default: break;
221
+ }
222
+ }, documentTypes, "duplicate").catch(() => {
223
+ settle(void 0);
224
+ });
225
+ });
226
+ }
227
+ /**
228
+ * Run a confirmed batch of imports into a drive, feeding the floating upload
229
+ * panel. Rows appear immediately (queued), files import sequentially, and a
230
+ * single-file batch that succeeds opens its document in the editor.
231
+ */
232
+ function runOpenFileImports(args) {
233
+ const { driveId, imports, documentTypes } = args;
234
+ if (imports.length === 0) return importChain;
235
+ const rows = imports.map(({ file, name }) => ({
236
+ id: `open-file-${++uploadCounter}`,
237
+ file,
238
+ name
239
+ }));
240
+ addOpenFileUploads(rows.map((row) => ({
241
+ id: row.id,
242
+ fileName: row.name,
243
+ fileSize: formatFileSize(row.file.size),
244
+ status: "pending",
245
+ progress: 0
246
+ })));
247
+ const run = async () => {
248
+ const results = [];
249
+ for (const row of rows) results.push(await importOne(row, driveId, documentTypes));
250
+ if (rows.length === 1 && results[0]) setSelectedNode(results[0]);
251
+ };
252
+ importChain = importChain.then(run, run);
253
+ return importChain;
254
+ }
255
+ //#endregion
78
256
  //#region src/components/migration-status.ts
79
257
  let current = null;
80
258
  const listeners$2 = /* @__PURE__ */ new Set();
@@ -1106,16 +1284,38 @@ function canRetry(reason) {
1106
1284
  }
1107
1285
  function MissingModelBanner() {
1108
1286
  const failed = useFailedInstallations();
1287
+ const discoveryService = usePackageDiscoveryService();
1109
1288
  const [open, setOpen] = useState(false);
1289
+ const [dismissed, setDismissed] = useState(false);
1290
+ useEffect(() => {
1291
+ return discoveryService?.subscribeEvents((event) => {
1292
+ if (event.type === "load-failed") setDismissed(false);
1293
+ });
1294
+ }, [discoveryService]);
1110
1295
  if (failed.length === 0) return null;
1111
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
1112
- className: "flex items-center justify-between gap-3 bg-warning/10 px-4 py-2 text-sm text-warning",
1113
- children: [/* @__PURE__ */ jsx("span", { children: failed.length === 1 ? "1 document type couldn't load (missing model)." : `${failed.length} document types couldn't load (missing models).` }), /* @__PURE__ */ jsx("button", {
1114
- type: "button",
1115
- onClick: () => setOpen(true),
1116
- className: "rounded-md border border-warning bg-background px-3 py-1 text-warning hover:hover-effect",
1117
- children: "View"
1118
- })]
1296
+ return /* @__PURE__ */ jsxs(Fragment, { children: [dismissed ? null : /* @__PURE__ */ jsx("div", {
1297
+ className: "absolute inset-x-0 top-0 z-200 bg-background",
1298
+ children: /* @__PURE__ */ jsxs("div", {
1299
+ className: "flex items-center justify-between gap-3 bg-warning/10 px-4 py-2 text-sm text-warning",
1300
+ children: [/* @__PURE__ */ jsx("span", { children: failed.length === 1 ? "1 document type couldn't load (missing model)." : `${failed.length} document types couldn't load (missing models).` }), /* @__PURE__ */ jsxs("div", {
1301
+ className: "flex items-center gap-2",
1302
+ children: [/* @__PURE__ */ jsx("button", {
1303
+ type: "button",
1304
+ onClick: () => setOpen(true),
1305
+ className: "rounded-md border border-warning bg-background px-3 py-1 text-warning hover:hover-effect",
1306
+ children: "View"
1307
+ }), /* @__PURE__ */ jsx("button", {
1308
+ type: "button",
1309
+ onClick: () => setDismissed(true),
1310
+ "aria-label": "Dismiss",
1311
+ className: "flex items-center text-warning hover:hover-effect",
1312
+ children: /* @__PURE__ */ jsx(Icon, {
1313
+ name: "XmarkLight",
1314
+ size: 16
1315
+ })
1316
+ })]
1317
+ })]
1318
+ })
1119
1319
  }), /* @__PURE__ */ jsx(MissingModelDetailsModal, {
1120
1320
  open,
1121
1321
  failed,
@@ -1218,6 +1418,18 @@ function MissingModelDetailsModal(props) {
1218
1418
  });
1219
1419
  }
1220
1420
  //#endregion
1421
+ //#region src/components/open-file-upload-list.tsx
1422
+ function OpenFileUploadList() {
1423
+ const uploads = useSyncExternalStore(subscribeOpenFileUploads, getOpenFileUploads);
1424
+ return /* @__PURE__ */ jsx(UploadFileListContainer, {
1425
+ uploadsArray: uploads,
1426
+ uploadsCount: uploads.length,
1427
+ removeUpload: removeOpenFileUpload,
1428
+ clearAllUploads: clearOpenFileUploads,
1429
+ setSelectedNode
1430
+ });
1431
+ }
1432
+ //#endregion
1221
1433
  //#region src/components/package-install-prompt.tsx
1222
1434
  function PackageInstallPrompt() {
1223
1435
  const pendingInstallations = usePendingInstallations();
@@ -1258,10 +1470,14 @@ const App = () => {
1258
1470
  else if (connectConfig.offline) serviceWorkerManager.registerServiceWorker(false);
1259
1471
  else serviceWorkerManager.unregisterAll();
1260
1472
  }, []);
1473
+ useEffect(() => {
1474
+ initLaunchQueueFileHandling();
1475
+ }, []);
1261
1476
  return /* @__PURE__ */ jsxs(SentryProvider, { children: [
1262
1477
  /* @__PURE__ */ jsx(ToastContainer, { position: "bottom-right" }),
1263
1478
  /* @__PURE__ */ jsx(MissingModelBanner, {}),
1264
1479
  /* @__PURE__ */ jsx(Router, {}),
1480
+ /* @__PURE__ */ jsx(OpenFileUploadList, {}),
1265
1481
  /* @__PURE__ */ jsx(PackageInstallPrompt, {}),
1266
1482
  /* @__PURE__ */ jsx(Analytics, {}),
1267
1483
  /* @__PURE__ */ jsx(OpenPanel, {})
@@ -1789,18 +2005,18 @@ const MigrationBanner = () => {
1789
2005
  };
1790
2006
  //#endregion
1791
2007
  //#region src/components/modal/modals-container.tsx
1792
- const AddDriveModal$1 = lazy(() => import("./AddDriveModal-MMHlkJBJ.js").then((m) => ({ default: m.AddDriveModal })));
1793
- const ClearStorageModal = lazy(() => import("./ClearStorageModal-CriXdO7P.js").then((m) => ({ default: m.ClearStorageModal })));
1794
- const CookiesPolicyModal = lazy(() => import("./CookiesPolicyModal-CkcUKPLb.js").then((m) => ({ default: m.CookiesPolicyModal })));
1795
- const CreateDocumentModal$1 = lazy(() => import("./CreateDocumentModal-CvsTh0HM.js").then((m) => ({ default: m.CreateDocumentModal })));
1796
- const DebugSettingsModal = lazy(() => import("./DebugSettingsModal-YV8YMO9a.js").then((m) => ({ default: m.DebugSettingsModal })));
1797
- const DeleteDriveModal = lazy(() => import("./DeleteDriveModal-DSTK8FYk.js").then((m) => ({ default: m.DeleteDriveModal })));
1798
- const DeleteItemModal = lazy(() => import("./DeleteItemModal-B2nJmjsP.js").then((m) => ({ default: m.DeleteItemModal })));
1799
- const DisclaimerModal = lazy(() => import("./DisclaimerModal-D5FO34u9.js").then((m) => ({ default: m.DisclaimerModal })));
1800
- const DriveSettingsModal$1 = lazy(() => import("./DriveSettingsModal-kR3hQnh4.js").then((m) => ({ default: m.DriveSettingsModal })));
1801
- const DownloadDocumentWithErrorsModal = lazy(() => import("./DownloadDocumentWithErrorsModal-tEr3bbtN.js").then((m) => ({ default: m.DownloadDocumentWithErrorsModal })));
1802
- const SettingsModal$1 = lazy(() => import("./SettingsModal-yk1gDZgB.js").then((m) => ({ default: m.SettingsModal })));
1803
- const UpgradeDriveModal = lazy(() => import("./UpgradeDriveModal-BZGSE9_r.js").then((m) => ({ default: m.UpgradeDriveModal })));
2008
+ const AddDriveModal$1 = lazy(() => import("./AddDriveModal-B_Oft9Cv.js").then((m) => ({ default: m.AddDriveModal })));
2009
+ const ClearStorageModal = lazy(() => import("./ClearStorageModal-DKxn1Qxa.js").then((m) => ({ default: m.ClearStorageModal })));
2010
+ const CookiesPolicyModal = lazy(() => import("./CookiesPolicyModal-CYFTfkEN.js").then((m) => ({ default: m.CookiesPolicyModal })));
2011
+ const CreateDocumentModal$1 = lazy(() => import("./CreateDocumentModal-Dmg3R-Vh.js").then((m) => ({ default: m.CreateDocumentModal })));
2012
+ const DebugSettingsModal = lazy(() => import("./DebugSettingsModal-DUNPkZoc.js").then((m) => ({ default: m.DebugSettingsModal })));
2013
+ const DeleteDriveModal = lazy(() => import("./DeleteDriveModal-CzRPqyMf.js").then((m) => ({ default: m.DeleteDriveModal })));
2014
+ const DeleteItemModal = lazy(() => import("./DeleteItemModal-CaCrmQOG.js").then((m) => ({ default: m.DeleteItemModal })));
2015
+ const DisclaimerModal = lazy(() => import("./DisclaimerModal-D5Jhefcc.js").then((m) => ({ default: m.DisclaimerModal })));
2016
+ const DriveSettingsModal$1 = lazy(() => import("./DriveSettingsModal-VNpuhty1.js").then((m) => ({ default: m.DriveSettingsModal })));
2017
+ const DownloadDocumentWithErrorsModal = lazy(() => import("./DownloadDocumentWithErrorsModal-ZuX8WDCC.js").then((m) => ({ default: m.DownloadDocumentWithErrorsModal })));
2018
+ const SettingsModal$1 = lazy(() => import("./SettingsModal-BsYFJB2W.js").then((m) => ({ default: m.SettingsModal })));
2019
+ const UpgradeDriveModal = lazy(() => import("./UpgradeDriveModal-Ul4tyz-Q.js").then((m) => ({ default: m.UpgradeDriveModal })));
1804
2020
  const modalComponents = {
1805
2021
  addDrive: AddDriveModal$1,
1806
2022
  clearStorage: ClearStorageModal,
@@ -1812,11 +2028,12 @@ const modalComponents = {
1812
2028
  disclaimer: DisclaimerModal,
1813
2029
  driveSettings: DriveSettingsModal$1,
1814
2030
  downloadDocumentWithErrors: DownloadDocumentWithErrorsModal,
1815
- inspector: lazy(() => import("./InspectorModal-DKvjtozu.js").then((m) => ({ default: m.InspectorModal }))),
2031
+ inspector: lazy(() => import("./InspectorModal-B7wmgMfE.js").then((m) => ({ default: m.InspectorModal }))),
1816
2032
  settings: SettingsModal$1,
1817
2033
  upgradeDrive: UpgradeDriveModal,
1818
- missingPackage: lazy(() => import("./MissingPackageModal-BQcCQbOn.js").then((m) => ({ default: m.ConnectMissingPackageModal }))),
1819
- driveAuthRequired: lazy(() => import("./DriveAuthRequiredModal-BA2vS3oF.js").then((m) => ({ default: m.DriveAuthRequiredModal })))
2034
+ missingPackage: lazy(() => import("./MissingPackageModal-D4V6oYzy.js").then((m) => ({ default: m.ConnectMissingPackageModal }))),
2035
+ driveAuthRequired: lazy(() => import("./DriveAuthRequiredModal-CPV5uXnf.js").then((m) => ({ default: m.DriveAuthRequiredModal }))),
2036
+ openFileDocuments: lazy(() => import("./OpenFileDocumentsModal-DCrZnA6c.js").then((m) => ({ default: m.OpenFileDocumentsModal })))
1820
2037
  };
1821
2038
  const ModalsContainer = lazy(() => {
1822
2039
  return Promise.resolve({ default: () => {
@@ -1856,7 +2073,7 @@ const ServiceWorkerUpdatePrompt = () => {
1856
2073
  //#endregion
1857
2074
  //#region src/components/app-loader.tsx
1858
2075
  const AppLoader = (props) => {
1859
- const Load = lazy(() => import("./load-BrYKdy5m.js").then((m) => m.loadComponent(props.localPackage)));
2076
+ const Load = lazy(() => import("./load-y7fD2Bfj.js").then((m) => m.loadComponent(props.localPackage)));
1860
2077
  return /* @__PURE__ */ jsx(StrictMode, { children: /* @__PURE__ */ jsxs(ErrorBoundary$1, {
1861
2078
  fallbackRender: (props) => /* @__PURE__ */ jsx(AppSkeleton, { children: /* @__PURE__ */ jsx(DetailedFallback, { ...props }) }),
1862
2079
  resetKeys: [props.localPackage],
@@ -1885,7 +2102,7 @@ const AppLoader = (props) => {
1885
2102
  }) });
1886
2103
  };
1887
2104
  //#endregion
1888
- export { DocumentEditor as a, App as c, DocumentEditorContainer as d, OpenPanel as f, Root as i, AppContainer as l, AppSkeleton as m, Sidebar as n, DriveIcon as o, Analytics as p, Router as r, CookieBanner$1 as s, AppLoader as t, EditorLoader as u };
2105
+ export { getPendingImportFiles as _, DocumentEditor as a, App as c, DocumentEditorContainer as d, OpenPanel as f, clearPendingImportFiles as g, runOpenFileImports as h, Root as i, AppContainer as l, AppSkeleton as m, Sidebar as n, DriveIcon as o, Analytics as p, Router as r, CookieBanner$1 as s, AppLoader as t, EditorLoader as u, pendingFileKey as v, subscribePendingImportFiles as y };
1889
2106
 
1890
- //# sourceMappingURL=app-loader-BrGV3wVg.js.map
1891
- //# debugId=0f26aa55-63fe-5fc1-9943-71992142e31b
2107
+ //# sourceMappingURL=app-loader-DG_ohYMb.js.map
2108
+ //# debugId=baee3198-555c-5f1f-8e4d-821a86679aae