@powerhousedao/connect 6.2.1-dev.0 → 6.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/{AddDriveModal-D-nbV40j.js → AddDriveModal-vA-eqqPS.js} +24 -10
  2. package/dist/AddDriveModal-vA-eqqPS.js.map +1 -0
  3. package/dist/{ClearStorageModal-BoHhAIcb.js → ClearStorageModal-Dm00WyUu.js} +4 -4
  4. package/dist/{ClearStorageModal-BoHhAIcb.js.map → ClearStorageModal-Dm00WyUu.js.map} +1 -1
  5. package/dist/{CookiesPolicyModal-CkcUKPLb.js → CookiesPolicyModal-1nOh6oN3.js} +3 -3
  6. package/dist/{CookiesPolicyModal-CkcUKPLb.js.map → CookiesPolicyModal-1nOh6oN3.js.map} +1 -1
  7. package/dist/{CreateDocumentModal-CvsTh0HM.js → CreateDocumentModal-nQbLVDq3.js} +3 -3
  8. package/dist/{CreateDocumentModal-CvsTh0HM.js.map → CreateDocumentModal-nQbLVDq3.js.map} +1 -1
  9. package/dist/{DebugSettingsModal-BVerP6Sp.js → DebugSettingsModal-CWZkbU7v.js} +6 -6
  10. package/dist/{DebugSettingsModal-BVerP6Sp.js.map → DebugSettingsModal-CWZkbU7v.js.map} +1 -1
  11. package/dist/{DeleteDriveModal-DSTK8FYk.js → DeleteDriveModal-6P0T1QgD.js} +4 -4
  12. package/dist/{DeleteDriveModal-DSTK8FYk.js.map → DeleteDriveModal-6P0T1QgD.js.map} +1 -1
  13. package/dist/{DeleteItemModal-B2nJmjsP.js → DeleteItemModal-BmV1aQyZ.js} +4 -4
  14. package/dist/{DeleteItemModal-B2nJmjsP.js.map → DeleteItemModal-BmV1aQyZ.js.map} +1 -1
  15. package/dist/{DisclaimerModal-D5FO34u9.js → DisclaimerModal-CVTFfN0_.js} +3 -3
  16. package/dist/{DisclaimerModal-D5FO34u9.js.map → DisclaimerModal-CVTFfN0_.js.map} +1 -1
  17. package/dist/{DownloadDocumentWithErrorsModal-tEr3bbtN.js → DownloadDocumentWithErrorsModal-CXeFUtaz.js} +3 -3
  18. package/dist/{DownloadDocumentWithErrorsModal-tEr3bbtN.js.map → DownloadDocumentWithErrorsModal-CXeFUtaz.js.map} +1 -1
  19. package/dist/{DriveAuthRequiredModal-BA2vS3oF.js → DriveAuthRequiredModal-DDlfeXD_.js} +3 -3
  20. package/dist/{DriveAuthRequiredModal-BA2vS3oF.js.map → DriveAuthRequiredModal-DDlfeXD_.js.map} +1 -1
  21. package/dist/{DriveSettingsModal-kR3hQnh4.js → DriveSettingsModal-CsNFEJ9E.js} +4 -4
  22. package/dist/DriveSettingsModal-CsNFEJ9E.js.map +1 -0
  23. package/dist/{InspectorModal-YtFXHkxp.js → InspectorModal-wChBJ6R5.js} +35 -84
  24. package/dist/InspectorModal-wChBJ6R5.js.map +1 -0
  25. package/dist/{MissingPackageModal-BQcCQbOn.js → MissingPackageModal-Bn036mWQ.js} +4 -4
  26. package/dist/{MissingPackageModal-BQcCQbOn.js.map → MissingPackageModal-Bn036mWQ.js.map} +1 -1
  27. package/dist/{SettingsModal-Cs-Wu3Rm.js → SettingsModal-1i3Dr5eT.js} +9 -9
  28. package/dist/SettingsModal-1i3Dr5eT.js.map +1 -0
  29. package/dist/{UpgradeDriveModal-BZGSE9_r.js → UpgradeDriveModal-C7lV4rAX.js} +3 -3
  30. package/dist/{UpgradeDriveModal-BZGSE9_r.js.map → UpgradeDriveModal-C7lV4rAX.js.map} +1 -1
  31. package/dist/{app-loader-CJrQEUby.js → app-loader-C5IWlQ7x.js} +258 -193
  32. package/dist/app-loader-C5IWlQ7x.js.map +1 -0
  33. package/dist/app-loader-DYpRh5ax.js +4 -0
  34. package/dist/{build-info-DtsaVWhi.js → build-info-zGvEjLMy.js} +5 -8
  35. package/dist/{build-info-DtsaVWhi.js.map → build-info-zGvEjLMy.js.map} +1 -1
  36. package/dist/components-CiPNtuf_.js +5 -0
  37. package/dist/{connect.config-p8UTNojR.js → connect.config-BDYNejx3.js} +3 -3
  38. package/dist/{connect.config-p8UTNojR.js.map → connect.config-BDYNejx3.js.map} +1 -1
  39. package/dist/{load-HWRrVQ7W.js → load-Bt4B0U-v.js} +11 -11
  40. package/dist/{load-HWRrVQ7W.js.map → load-Bt4B0U-v.js.map} +1 -1
  41. package/dist/main.js +1 -1
  42. package/dist/{package-CSEQB3Fe.js → package-CNJ1Q-58.js} +4 -5
  43. package/dist/package-CNJ1Q-58.js.map +1 -0
  44. package/dist/{pglite-major-B39aOEiE.js → pglite-runtime-CHa5UyCw.js} +47 -8
  45. package/dist/pglite-runtime-CHa5UyCw.js.map +1 -0
  46. package/dist/{pglite-seed-OvaK2kRv.js → pglite-seed-CvnZdEbx.js} +4 -4
  47. package/dist/{pglite-seed-OvaK2kRv.js.map → pglite-seed-CvnZdEbx.js.map} +1 -1
  48. package/dist/{reactor-CGjsDjJC.js → reactor-DWY9_ifj.js} +17 -229
  49. package/dist/reactor-DWY9_ifj.js.map +1 -0
  50. package/dist/{registerServiceWorker-BGIXpgGV.js → registerServiceWorker-Dc4QY0Sd.js} +4 -4
  51. package/dist/{registerServiceWorker-BGIXpgGV.js.map → registerServiceWorker-Dc4QY0Sd.js.map} +1 -1
  52. package/dist/{reload-connect-toast-D1Iqw9E_.js → reload-connect-toast-DIFQ9FCX.js} +3 -3
  53. package/dist/{reload-connect-toast-D1Iqw9E_.js.map → reload-connect-toast-DIFQ9FCX.js.map} +1 -1
  54. package/dist/start-connect.js +1 -1
  55. package/dist/{toast-4t-VimvD.js → toast-BEy42aYx.js} +3 -3
  56. package/dist/{toast-4t-VimvD.js.map → toast-BEy42aYx.js.map} +1 -1
  57. package/dist/{useRegistryPackages-BaYtekjQ.js → useRegistryPackages-B-gFECmd.js} +3 -3
  58. package/dist/{useRegistryPackages-BaYtekjQ.js.map → useRegistryPackages-B-gFECmd.js.map} +1 -1
  59. package/package.json +10 -11
  60. package/dist/AddDriveModal-D-nbV40j.js.map +0 -1
  61. package/dist/DriveSettingsModal-kR3hQnh4.js.map +0 -1
  62. package/dist/InspectorModal-YtFXHkxp.js.map +0 -1
  63. package/dist/SettingsModal-Cs-Wu3Rm.js.map +0 -1
  64. package/dist/app-loader-CJrQEUby.js.map +0 -1
  65. package/dist/app-loader-Da5NyqEp.js +0 -4
  66. package/dist/components-CYms4mPU.js +0 -5
  67. package/dist/connection-state-B7b2E8-L.js +0 -123
  68. package/dist/connection-state-B7b2E8-L.js.map +0 -1
  69. package/dist/package-CSEQB3Fe.js.map +0 -1
  70. package/dist/pglite-major-B39aOEiE.js.map +0 -1
  71. package/dist/pglite-migrate-core-Boxqqx-c.js +0 -143
  72. package/dist/pglite-migrate-core-Boxqqx-c.js.map +0 -1
  73. package/dist/reactor-CGjsDjJC.js.map +0 -1
  74. package/dist/reactor.worker.d.ts +0 -1
  75. package/dist/reactor.worker.js +0 -316
  76. package/dist/reactor.worker.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"SettingsModal-Cs-Wu3Rm.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 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 // `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\". Tell the user in plain terms before dumping the\n // raw error so the \"install from npm\" fallback case is self-explanatory.\n const isLikelyNotFound = /failed to fetch|404|not found/i.test(message);\n const userMessage = isLikelyNotFound\n ? `Could not install \"${packageSpec}\". The package isn't available on this registry, and the npmjs.org fallback could not resolve it either.`\n : `Failed to install \"${packageSpec}\": ${message}`;\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 const message = error instanceof Error ? error.message : \"Unknown error\";\n toast(`Failed to uninstall \"${packageName}\": ${message}`, {\n type: \"error\",\n });\n }\n }\n\n return (\n <div className=\"flex h-full flex-1 flex-col\">\n <PackageManager\n mutable={true}\n registryPackageList={registryPackageList}\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":"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","debug_id":"61fd57cb-11fb-5f80-8334-fc67a116c324"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-loader-CJrQEUby.js","sources":["../src/utils/browser.ts","../src/utils/document-editor-debug-tools.ts","../src/components/migration-status.ts","../src/utils/pglite-migration.ts","../src/hooks/useAcceptedCookies.ts","../src/services/openpanel/buffer.ts","../src/services/openpanel/client.ts","../src/services/openpanel/events.json","../src/services/openpanel/events.ts","../src/services/openpanel/processor.ts","../src/services/openpanel/factory.ts","../src/hooks/useIsEmbedded.ts","../src/hooks/useCookieBanner.ts","../src/hooks/useFailedInstallations.ts","../src/hooks/useInitSentry.ts","../src/hooks/usePendingInstallations.ts","../src/hooks/useUndoRedoShortcuts.ts","../src/components/app-skeleton.tsx","../src/components/error-boundary.tsx","../src/components/analytics.tsx","../src/components/openpanel-traits.ts","../src/components/openpanel.tsx","../src/components/document-editor-container.tsx","../src/components/editor-loader.tsx","../src/components/app-container.tsx","../src/context/sentry-provider.tsx","../src/components/missing-model-banner.tsx","../src/components/package-install-prompt.tsx","../src/components/app.tsx","../src/components/cookie-banner.tsx","../src/components/drive-icon.tsx","../src/components/editors.tsx","../src/components/root.tsx","../src/components/use-drive-auth-gate.ts","../src/pages/content.tsx","../src/components/router.tsx","../src/components/sidebar.tsx","../src/components/connection-banner.tsx","../src/components/migration-banner.tsx","../src/components/modal/modals-container.tsx","../src/components/service-worker-update-prompt.tsx","../src/components/app-loader.tsx"],"sourcesContent":["export function getBasePath() {\n if (typeof document === \"undefined\") {\n return \"/\";\n }\n\n const baseEl = document.querySelector(\"base\");\n const href = baseEl?.getAttribute(\"href\");\n return href || \"/\";\n}\n","import type {\n Operation,\n PHDocument,\n} from \"@powerhousedao/shared/document-model\";\n\nexport class DocumentEditorDebugTools {\n private document: PHDocument | undefined;\n private operations: Operation[] = [];\n\n constructor(document?: PHDocument) {\n if (document) {\n this.document = document;\n }\n }\n\n private operationsToTableObject(operations: Operation[]) {\n return operations.map((op) => ({\n ...op,\n input: JSON.stringify(op.action.input),\n }));\n }\n\n public setDocument(document: PHDocument) {\n this.document = document;\n }\n\n public getDocument() {\n return this.document;\n }\n\n public getOperations() {\n return this.operations;\n }\n\n public pushOperation(operation: Operation) {\n this.operations.push(operation);\n }\n\n public operationsTable() {\n if (!this.document) {\n console.warn(\"No document\");\n }\n const ops = Object.values(this.document?.operations || {})\n .filter((array): array is Operation[] => array !== undefined)\n .flatMap((array) => array)\n .sort((a, b) => a.index - b.index);\n\n console.table(this.operationsToTableObject(ops));\n }\n\n public scopeOperationsTable(scope: string) {\n if (!this.document) {\n console.warn(\"No document\");\n }\n const ops = this.document?.operations[scope] || [];\n console.table(this.operationsToTableObject(ops));\n }\n\n public operationsLog() {\n console.log(this.operations);\n }\n\n public operationsLogTable() {\n console.table(this.operationsToTableObject(this.operations));\n }\n\n public clear() {\n this.operations = [];\n this.document = undefined;\n }\n}\n","export type MigrationPhase = \"clone\" | \"dump\" | \"restore\";\n\nexport type MigrationStatus = {\n idbName: string;\n phase: MigrationPhase;\n};\n\nlet current: MigrationStatus | null = null;\nconst listeners = new Set<() => void>();\n\nexport function setMigrationStatus(status: MigrationStatus | null): void {\n current = status;\n for (const l of listeners) l();\n}\n\nexport function getMigrationStatus(): MigrationStatus | null {\n return current;\n}\n\nexport function subscribeMigrationStatus(cb: () => void): () => void {\n listeners.add(cb);\n return () => {\n listeners.delete(cb);\n };\n}\n","import { setMigrationStatus } from \"../components/migration-status.js\";\nimport { idbError } from \"./pglite-idb.js\";\nimport {\n type BackupStrategy,\n cloneFileData,\n migrateIdb,\n} from \"./pglite-migrate-core.js\";\nimport { PRIMARY_IDB_NAMES } from \"./storage-namespace.js\";\n\nconst BACKUP_PREFIX = \"ph-pglite-backup::\";\nconst BACKUP_INDEX_KEY = \"ph:pglite-backups\";\nconst BACKUP_RETENTION_MS = 30 * 24 * 60 * 60 * 1000;\n\ntype BackupRecord = { name: string; idbName: string; createdAt: number };\n\nfunction deleteIdb(name: string, timeoutMs = 15_000): Promise<void> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.deleteDatabase(name);\n let settled = false;\n const done = (fn: () => void) => {\n if (settled) return;\n settled = true;\n fn();\n };\n const timer = setTimeout(\n () =>\n done(() =>\n reject(\n new Error(`IDB delete timed out for ${name} after ${timeoutMs}ms`),\n ),\n ),\n timeoutMs,\n );\n req.onsuccess = () =>\n done(() => {\n clearTimeout(timer);\n resolve();\n });\n req.onerror = () =>\n done(() => {\n clearTimeout(timer);\n reject(idbError(req, `IDB delete failed for ${name}`));\n });\n });\n}\n\nfunction readBackupIndex(): BackupRecord[] {\n try {\n const raw = localStorage.getItem(BACKUP_INDEX_KEY);\n if (!raw) return [];\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as BackupRecord[]) : [];\n } catch {\n return [];\n }\n}\n\nfunction writeBackupIndex(records: BackupRecord[]): void {\n try {\n localStorage.setItem(BACKUP_INDEX_KEY, JSON.stringify(records));\n } catch {\n // ignore quota errors — janitor is best-effort\n }\n}\n\nfunction registerBackup(rec: BackupRecord): void {\n writeBackupIndex([...readBackupIndex(), rec]);\n}\n\nfunction forgetBackup(name: string): void {\n writeBackupIndex(readBackupIndex().filter((r) => r.name !== name));\n}\n\nasync function janitor(): Promise<void> {\n const cutoff = Date.now() - BACKUP_RETENTION_MS;\n const keep: BackupRecord[] = [];\n for (const rec of readBackupIndex()) {\n if (rec.createdAt >= cutoff) {\n keep.push(rec);\n continue;\n }\n try {\n await deleteIdb(rec.name);\n } catch (err) {\n console.warn(`Failed to delete expired pglite backup ${rec.name}`, err);\n keep.push(rec);\n }\n }\n writeBackupIndex(keep);\n}\n\n// Persistent backup to an IDB dir, indexed in localStorage with 30-day\n// retention (the janitor reaps expired ones); success keeps the backup.\nfunction createPersistentBackup(): BackupStrategy {\n return {\n snapshot: async (idbName) => {\n const backupName = `${BACKUP_PREFIX}${idbName}::${new Date().toISOString()}`;\n await cloneFileData(idbName, backupName);\n registerBackup({ name: backupName, idbName, createdAt: Date.now() });\n return backupName;\n },\n rollback: async (handle, idbName, cause) => {\n const backupName = handle as string;\n try {\n // clone clears-and-replaces in one txn; no pre-clear (which could empty the dir).\n await cloneFileData(backupName, idbName);\n } catch (rollbackErr) {\n console.error(\n `PGlite migration rollback failed for ${idbName}; backup ${backupName} retained. Primary migration error:`,\n cause,\n \"Rollback error:\",\n rollbackErr,\n );\n return;\n }\n await deleteIdb(backupName).catch(() => undefined);\n forgetBackup(backupName);\n },\n discard: async (handle) => {\n const backupName = handle as string;\n await deleteIdb(backupName).catch(() => undefined);\n forgetBackup(backupName);\n },\n commit: () => Promise.resolve(),\n };\n}\n\nasync function migrateAllLocked(): Promise<void> {\n const backup = createPersistentBackup();\n try {\n for (const idbName of PRIMARY_IDB_NAMES) {\n await migrateIdb(\n idbName,\n (phase) => setMigrationStatus({ idbName, phase }),\n backup,\n );\n }\n } finally {\n setMigrationStatus(null);\n }\n}\n\nexport async function migrateAllIfNeeded(): Promise<void> {\n janitor().catch((err) => console.warn(\"PGlite backup janitor failed\", err));\n\n const hasLocks =\n typeof navigator !== \"undefined\" &&\n \"locks\" in navigator &&\n typeof navigator.locks.request === \"function\";\n\n if (!hasLocks) {\n await migrateAllLocked();\n return;\n }\n\n await navigator.locks.request(\n \"ph-pglite-migration\",\n { mode: \"exclusive\" },\n async () => {\n await migrateAllLocked();\n },\n );\n}\n","import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { useSyncExternalStore } from \"react\";\n\nconst namespace = connectConfig.routerBasename;\n\nconst ACCEPTED_COOKIES_KEY_STORAGE = `${namespace}:acceptedCookies`;\n\nexport interface AcceptedCookies {\n analytics: boolean;\n marketing: boolean;\n functional: boolean;\n}\n\nconst listeners = new Set<() => void>();\n\nlet cookies: AcceptedCookies = getInitial();\n\nfunction getInitial(): AcceptedCookies {\n try {\n const value = localStorage.getItem(ACCEPTED_COOKIES_KEY_STORAGE);\n return value\n ? (JSON.parse(value) as AcceptedCookies)\n : { analytics: false, marketing: false, functional: false };\n } catch {\n return { analytics: false, marketing: false, functional: false };\n }\n}\n\nfunction getCookies(): AcceptedCookies {\n return cookies;\n}\n\nfunction setCookies(setter: (prev: AcceptedCookies) => AcceptedCookies) {\n cookies = setter(cookies);\n localStorage.setItem(ACCEPTED_COOKIES_KEY_STORAGE, JSON.stringify(cookies));\n listeners.forEach((fn) => fn());\n}\n\nfunction subscribe(fn: () => void) {\n listeners.add(fn);\n return () => listeners.delete(fn);\n}\n\nexport const useAcceptedCookies = () => {\n const cookies = useSyncExternalStore(subscribe, getCookies, getCookies);\n return [cookies, setCookies] as const;\n};\n","import type { OpenPanelTracker } from \"./processor.js\";\n\n/**\n * Hard cap on pre-init events held in memory. When full, the oldest entry is\n * evicted (drop-oldest) so the most-recent events survive. Bounded, so an\n * uninitialised client never leaks; `resetOpenPanelClient()` discards it\n * entirely so pre-consent events are never replayed.\n */\nconst BUFFER_CAP = 200;\n\ntype BufferEntry = [name: string, props: Record<string, unknown> | undefined];\n\nconst buffer: BufferEntry[] = [];\nlet activeClient: OpenPanelTracker | undefined;\nlet errorHandler: ((err: unknown) => void) | undefined;\n\nfunction defaultOnError(err: unknown): void {\n console.warn(\"[useOpenPanelAnalytics] track failed:\", err);\n}\n\n/**\n * Forward a single event to the active client, swallowing any throw.\n *\n * The outer try/catch handles synchronous throws from `client.track`; the\n * inner `.catch()` handles rejected promises. Both are needed because\n * `Promise.resolve(x).catch()` cannot catch a throw from evaluating `x`.\n */\nfunction forward(\n client: OpenPanelTracker,\n name: string,\n props: Record<string, unknown> | undefined,\n): void {\n try {\n Promise.resolve(client.track(name, props)).catch((err) =>\n (errorHandler ?? defaultOnError)(err),\n );\n } catch (err) {\n (errorHandler ?? defaultOnError)(err);\n }\n}\n\n/**\n * Drain the pre-init buffer in FIFO order through `client.track`, then forward\n * subsequent events directly. Called once from `getOpenPanelClient()`.\n */\nexport function drainOpenPanelBuffer(\n client: OpenPanelTracker,\n onError?: (err: unknown) => void,\n): void {\n activeClient = client;\n errorHandler = onError;\n\n // Splice atomically so any track() during the drain is forwarded directly\n // (activeClient is set) rather than re-buffered.\n const pending = buffer.splice(0, buffer.length);\n for (const [name, props] of pending) {\n forward(client, name, props);\n }\n}\n\n/**\n * Clear the buffer and reset the active client. Buffered pre-consent events\n * are discarded so they are not replayed if the user later re-accepts.\n */\nexport function clearOpenPanelBuffer(): void {\n buffer.length = 0;\n activeClient = undefined;\n errorHandler = undefined;\n}\n\n/**\n * Track an analytics event. Sync, never throws. Forwards immediately when the\n * client is initialised, otherwise buffers (FIFO, cap 200, drop-oldest).\n */\nexport function track(name: string, props?: Record<string, unknown>): void {\n if (activeClient) {\n forward(activeClient, name, props);\n return;\n }\n\n if (buffer.length >= BUFFER_CAP) {\n buffer.shift();\n }\n buffer.push([name, props]);\n}\n","import type { OpenPanel } from \"@openpanel/web\";\n\nimport { clearOpenPanelBuffer, drainOpenPanelBuffer } from \"./buffer.js\";\nimport type { OpenPanelConfig } from \"./types.js\";\n\nlet client: OpenPanel | undefined;\n\n/**\n * Returns the cached `OpenPanel` singleton, building it on first call.\n *\n * When `config.clientId` is empty it returns `undefined` without importing\n * `@openpanel/web`, so the bundler can tree-shake the SDK out of production.\n */\nexport async function getOpenPanelClient(\n config: OpenPanelConfig,\n): Promise<OpenPanel | undefined> {\n if (!config.clientId) {\n return undefined;\n }\n\n if (client) {\n return client;\n }\n\n // Dynamic import keeps @openpanel/web out of the initial chunk.\n const { OpenPanel: OpenPanelClass } = await import(\"@openpanel/web\");\n\n client = new OpenPanelClass({\n clientId: config.clientId,\n ...(config.apiUrl ? { apiUrl: config.apiUrl } : {}),\n trackScreenViews: true,\n trackOutgoingLinks: true,\n });\n\n // The web SDK has no `globalProperties` constructor option.\n client.setGlobalProperties({ app: \"connect\" });\n\n // Runs once (the `if (client)` guard above), so the buffer is never\n // double-drained.\n drainOpenPanelBuffer(client);\n\n return client;\n}\n\n/**\n * Clears the cached singleton and the pre-init buffer. Call on consent\n * revocation or during tests; buffered events are discarded, not replayed.\n */\nexport function resetOpenPanelClient(): void {\n client = undefined;\n clearOpenPanelBuffer();\n}\n","","import type { OperationWithContext } from \"@powerhousedao/shared/document-model\";\nimport { z } from \"zod\";\n\nimport type { OpenPanelEventMapping } from \"./types.js\";\nimport rawEvents from \"./events.json\" with { type: \"json\" };\n\nconst EventMappingSchema = z\n .object({\n documentType: z.string().min(1),\n actionTypes: z.array(z.string().min(1)).min(1),\n alias: z.string().optional(),\n })\n .strict();\n\nconst EventMappingsSchema = z.array(EventMappingSchema).readonly();\n\n/**\n * Parses and validates the event mapping table, returning the validated array\n * and an O(1) lookup map. Accepts a `raw` override for tests. Throws on zod\n * failures and on duplicate `(documentType, actionType)` pairs.\n */\nexport function loadEvents(raw: unknown = rawEvents): {\n mappings: readonly OpenPanelEventMapping[];\n lookupMap: Map<string, Map<string, OpenPanelEventMapping>>;\n} {\n const result = EventMappingsSchema.safeParse(raw);\n if (!result.success) {\n throw new Error(`Invalid OpenPanel events.json: ${result.error.message}`);\n }\n\n const mappings = result.data as readonly OpenPanelEventMapping[];\n const lookupMap = new Map<string, Map<string, OpenPanelEventMapping>>();\n\n for (const mapping of mappings) {\n let inner = lookupMap.get(mapping.documentType);\n if (!inner) {\n inner = new Map<string, OpenPanelEventMapping>();\n lookupMap.set(mapping.documentType, inner);\n }\n\n for (const actionType of mapping.actionTypes) {\n if (inner.has(actionType)) {\n throw new Error(\n `Duplicate OpenPanel event mapping for ${mapping.documentType}/${actionType}`,\n );\n }\n inner.set(actionType, mapping);\n }\n }\n\n return { mappings, lookupMap };\n}\n\nconst { mappings: defaultMappings, lookupMap: defaultLookupMap } = loadEvents();\n\n/** Validated mapping array from the bundled events.json. */\nexport const eventMappings: readonly OpenPanelEventMapping[] = defaultMappings;\n\n/** O(1) lookup map: documentType → actionType → mapping. */\nexport const eventLookupMap: Map<\n string,\n Map<string, OpenPanelEventMapping>\n> = defaultLookupMap;\n\n/**\n * Normalizes a document type into a safe event-name segment: lowercased, `/`\n * replaced with `.`, and any character outside `[a-z0-9._-]` stripped.\n * e.g. `powerhouse/document-drive` → `powerhouse.document-drive`.\n */\nexport function normalize(documentType: string): string {\n return documentType\n .toLowerCase()\n .replace(/\\//g, \".\")\n .replace(/[^a-z0-9._-]/g, \"\");\n}\n\n/**\n * Derives the OpenPanel event name: `mapping.alias` when present, otherwise\n * `${normalize(documentType)}.${actionType.toLowerCase()}`.\n */\nexport function deriveEventName(\n mapping: OpenPanelEventMapping,\n op: OperationWithContext,\n): string {\n if (mapping.alias) {\n return mapping.alias;\n }\n return `${normalize(op.context.documentType)}.${op.operation.action.type.toLowerCase()}`;\n}\n\n/**\n * Builds the default properties attached to every OpenPanel event. The `app`\n * property is stamped globally by the client, not here.\n */\nexport function buildDefaultProperties(op: OperationWithContext): {\n documentType: string;\n actionType: string;\n documentId: string;\n scope: string;\n branch: string;\n} {\n return {\n documentType: op.context.documentType,\n actionType: op.operation.action.type,\n documentId: op.context.documentId,\n scope: op.context.scope,\n branch: op.context.branch,\n };\n}\n","import type { OperationWithContext } from \"@powerhousedao/shared/document-model\";\nimport type { IProcessor } from \"@powerhousedao/shared/processors\";\n\nimport { buildDefaultProperties, deriveEventName } from \"./events.js\";\nimport type { OpenPanelEventMapping } from \"./types.js\";\n\n/**\n * Minimal structural type for the injected analytics client. Keeps\n * `@openpanel/web` out of the runtime import graph and makes test fakes\n * trivial; the real `OpenPanel` instance satisfies it structurally.\n */\nexport type OpenPanelTracker = {\n track: (name: string, properties?: Record<string, unknown>) => unknown;\n flush?: () => void;\n};\n\n/**\n * Read-only reactor `IProcessor` that translates matching document operations\n * into OpenPanel analytics events. Operations whose `(documentType, actionType)`\n * pair is absent from the lookup map are skipped; per-operation errors are\n * routed to `onError` and never thrown back to the manager.\n */\nexport class OpenPanelProcessor implements IProcessor {\n constructor(\n private readonly client: OpenPanelTracker,\n private readonly lookupMap: Map<string, Map<string, OpenPanelEventMapping>>,\n private readonly onError: (\n err: unknown,\n op?: OperationWithContext,\n ) => void = (err) =>\n console.warn(\"[OpenPanelProcessor] Error tracking event:\", err),\n ) {}\n\n async onOperations(operations: OperationWithContext[]): Promise<void> {\n for (const op of operations) {\n const inner = this.lookupMap.get(op.context.documentType);\n if (!inner) continue;\n\n const mapping = inner.get(op.operation.action.type);\n if (!mapping) continue;\n\n const name = deriveEventName(mapping, op);\n const payload = buildDefaultProperties(op);\n\n try {\n await this.client.track(name, payload);\n } catch (err) {\n this.onError(err, op);\n }\n }\n }\n\n onDisconnect(): Promise<void> {\n this.client.flush?.();\n return Promise.resolve();\n }\n}\n","import type { OperationWithContext } from \"@powerhousedao/shared/document-model\";\nimport type { PHDocumentHeader } from \"@powerhousedao/shared/document-model\";\nimport type {\n ProcessorFactory,\n ProcessorRecord,\n} from \"@powerhousedao/shared/processors\";\n\nimport { OpenPanelProcessor, type OpenPanelTracker } from \"./processor.js\";\nimport type { OpenPanelEventMapping } from \"./types.js\";\n\nexport type OpenPanelProcessorFactoryConfig = {\n /** The initialized analytics client to forward events to. */\n client: OpenPanelTracker;\n\n /** Loaded event mapping data, as returned by `loadEvents()`. */\n events: {\n mappings: readonly OpenPanelEventMapping[];\n lookupMap: Map<string, Map<string, OpenPanelEventMapping>>;\n };\n\n /** Replay window. Defaults to `\"current\"` (no historical replay). */\n startFrom?: \"current\" | \"beginning\";\n\n /** Error handler; defaults to `console.warn`. */\n onError?: (err: unknown, op?: OperationWithContext) => void;\n};\n\n/**\n * Returns a `ProcessorFactory` that, for each drive, creates a single\n * `OpenPanelProcessor` record whose `filter.documentType` is the union of all\n * document types present in the event mapping table.\n */\nexport function createOpenPanelProcessorFactory(\n config: OpenPanelProcessorFactoryConfig,\n): ProcessorFactory {\n return function openPanelProcessorFactory(\n _driveHeader: PHDocumentHeader,\n ): ProcessorRecord[] {\n const documentType = Array.from(config.events.lookupMap.keys());\n\n const processor = new OpenPanelProcessor(\n config.client,\n config.events.lookupMap,\n config.onError,\n );\n\n const record: ProcessorRecord = {\n processor,\n filter: { documentType },\n startFrom: config.startFrom ?? \"current\",\n };\n\n return [record];\n };\n}\n","/**\n * Detects whether Connect is being rendered inside another app (e.g. inside\n * an iframe in the vetra-cli drive editor). When `?embed=1` is present in the\n * URL, chrome that doesn't make sense in the embedded context — the cookie\n * banner, the outer sidebar — is suppressed.\n */\nexport function getIsEmbedded(): boolean {\n if (typeof window === \"undefined\") return false;\n try {\n const params = new URLSearchParams(window.location.search);\n const value = params.get(\"embed\");\n return value !== null && value !== \"0\" && value !== \"false\";\n } catch {\n return false;\n }\n}\n\nexport function useIsEmbedded(): boolean {\n return getIsEmbedded();\n}\n","import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { useSyncExternalStore } from \"react\";\nimport { getIsEmbedded } from \"./useIsEmbedded.js\";\n\nconst namespace = connectConfig.routerBasename;\n\nexport const COOKIE_BANNER_KEY_STORAGE = `${namespace}:display-cookie-banner`;\n\nconst listeners = new Set<() => void>();\n\nlet bannerShown = getInitial();\n\nfunction getInitial(): boolean {\n if (getIsEmbedded()) return false;\n try {\n const value = localStorage.getItem(COOKIE_BANNER_KEY_STORAGE);\n return value !== \"false\";\n } catch (error) {\n console.error(error);\n return true;\n }\n}\n\nfunction getCookieBannerState(): boolean {\n return bannerShown;\n}\n\nfunction setCookieBannerState(state: boolean) {\n bannerShown = state;\n localStorage.setItem(COOKIE_BANNER_KEY_STORAGE, JSON.stringify(state));\n}\n\nfunction subscribe(fn: () => void) {\n listeners.add(fn);\n return () => listeners.delete(fn);\n}\n\nexport const useCookieBanner = () => {\n const cookieBannerShown = useSyncExternalStore(\n subscribe,\n getCookieBannerState,\n getCookieBannerState,\n );\n return [cookieBannerShown, setCookieBannerState] as const;\n};\n","import {\n usePackageDiscoveryService,\n type FailedInstallation,\n} from \"@powerhousedao/reactor-browser\";\nimport { useSyncExternalStore } from \"react\";\n\nconst emptyArray: FailedInstallation[] = [];\n\nexport function useFailedInstallations() {\n const discoveryService = usePackageDiscoveryService();\n return useSyncExternalStore(\n (cb) => discoveryService?.subscribeFailed(cb) ?? (() => {}),\n () => discoveryService?.getFailedInstallations() ?? emptyArray,\n );\n}\n","import { connectConfig } from \"@powerhousedao/connect/config\";\n\nimport type { BrowserOptions } from \"@sentry/react\";\n\nimport { childLogger } from \"document-model\";\nimport React, { useEffect } from \"react\";\nimport {\n createRoutesFromChildren,\n matchRoutes,\n useLocation,\n useNavigationType,\n} from \"react-router-dom\";\nimport { setSentryModule } from \"../services/sentry.js\";\nimport { useAcceptedCookies } from \"./useAcceptedCookies.js\";\n\nconst logger = childLogger([\"sentry\"]);\n\nlet clientStarted = false;\n\nasync function getSentry() {\n return await import(\"@sentry/react\");\n}\n\nasync function initSentry() {\n const Sentry = await getSentry();\n const integrations: BrowserOptions[\"integrations\"] = [\n Sentry.httpClientIntegration(),\n Sentry.extraErrorDataIntegration({ depth: 5 }),\n Sentry.replayIntegration(),\n Sentry.captureConsoleIntegration({ levels: [\"error\"] }),\n ];\n if (connectConfig.sentry.tracing) {\n integrations.push(\n Sentry.reactRouterV6BrowserTracingIntegration({\n useEffect: React.useEffect,\n useLocation,\n useNavigationType,\n createRoutesFromChildren,\n matchRoutes,\n }),\n );\n }\n\n Sentry.init({\n release: connectConfig.sentry.release,\n dsn: connectConfig.sentry.dsn ?? undefined,\n environment: connectConfig.sentry.env,\n integrations,\n ignoreErrors: [\n \"User is not allowed to create files\",\n \"User is not allowed to move documents\",\n \"The user aborted a request.\",\n ],\n sendDefaultPii: true,\n tracesSampleRate: 1.0,\n replaysSessionSampleRate: 0.1,\n replaysOnErrorSampleRate: 1.0,\n beforeSend(event, hint) {\n const error = hint.originalException;\n if (\n error instanceof TypeError &&\n error.message.includes(\"Failed to fetch\") &&\n !navigator.onLine\n ) {\n // If fetch fails because user is offline then ignores the error\n return null;\n }\n return event;\n },\n });\n\n setSentryModule(Sentry);\n clientStarted = true;\n}\n\nasync function closeClient() {\n if (!clientStarted) {\n return;\n }\n const sentry = await getSentry();\n setSentryModule(undefined);\n const client = sentry.getClient();\n return client?.close();\n}\n\nexport function useInitSentry() {\n const [acceptedCookies] = useAcceptedCookies();\n const { analytics } = acceptedCookies;\n\n useEffect(() => {\n if (!analytics) {\n closeClient().catch((error: unknown) => logger.error(\"@error\", error));\n return;\n }\n\n // Sentry is disabled when `dsn` is null, undefined, or an empty\n // string — covers both the new schema default (`null`) and any\n // hand-edited config that omits the DSN.\n if (\n clientStarted ||\n connectConfig.sentry.dsn === null ||\n connectConfig.sentry.dsn === undefined ||\n connectConfig.sentry.dsn === \"\"\n ) {\n return;\n }\n\n initSentry().catch((error: unknown) => logger.error(\"@error\", error));\n }, [analytics]);\n}\n","import {\n usePackageDiscoveryService,\n type PendingInstallation,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useRef, useSyncExternalStore } from \"react\";\n\nconst emptyArray: readonly PendingInstallation[] = [];\n\nexport function usePendingInstallations() {\n const discoveryService = usePackageDiscoveryService();\n const cacheRef = useRef<readonly PendingInstallation[]>(emptyArray);\n\n const getSnapshot = useCallback(() => {\n if (!discoveryService) return emptyArray;\n const next = discoveryService.getPendingInstallations() ?? emptyArray;\n const prev = cacheRef.current;\n if (\n next === prev ||\n (next.length === prev.length && next.every((p, i) => p === prev[i]))\n ) {\n return prev;\n }\n cacheRef.current = next;\n return next;\n }, [discoveryService]);\n\n return useSyncExternalStore(\n (cb) => discoveryService?.subscribePending(cb) ?? (() => {}),\n getSnapshot,\n );\n}\n","import { useHotkeys } from \"react-hotkeys-hook\";\n\nexport interface UseUndoRedoShortcutsProps {\n undo: () => void;\n redo: () => void;\n canUndo: boolean;\n canRedo: boolean;\n}\n\nexport const useUndoRedoShortcuts = (props: UseUndoRedoShortcutsProps) => {\n const { undo, redo, canRedo, canUndo } = props;\n const isMac = window.navigator.userAgent.includes(\"Mac\");\n\n let undoShortcut = \"ctrl+z\";\n let redoShortcut = \"ctrl+y\";\n\n if (isMac) {\n undoShortcut = \"mod+z\";\n redoShortcut = \"mod+shift+z\";\n }\n\n // set handler for undo\n useHotkeys(\n undoShortcut,\n (event) => {\n event.preventDefault();\n if (canUndo) {\n undo();\n }\n },\n {},\n [canUndo, undo],\n );\n\n // set handler for redo\n useHotkeys(\n redoShortcut,\n (event) => {\n event.preventDefault();\n if (canRedo) {\n redo();\n }\n },\n {},\n [canRedo, redo],\n );\n};\n","import { getBasePath } from \"@powerhousedao/connect/utils\";\nimport { getIsEmbedded } from \"@powerhousedao/connect/hooks\";\nimport {\n ConnectSidebar,\n HomeScreen,\n LogoAnimation,\n} from \"@powerhousedao/design-system/connect\";\nimport { initTheme } from \"@powerhousedao/reactor-browser\";\nimport {\n useEffect,\n useState,\n useSyncExternalStore,\n type PropsWithChildren,\n} from \"react\";\nimport {\n getMigrationStatus,\n subscribeMigrationStatus,\n type MigrationPhase,\n} from \"./migration-status.js\";\nconst LOADER_DELAY = 250;\n\nconst PHASE_LABEL: Record<MigrationPhase, string> = {\n clone: \"Backing up local database…\",\n dump: \"Exporting data from previous version…\",\n restore: \"Restoring data into the new database…\",\n};\n\nconst MigrationOverlay = () => {\n const status = useSyncExternalStore(\n subscribeMigrationStatus,\n getMigrationStatus,\n () => null,\n );\n if (!status) return null;\n return (\n <div className=\"absolute inset-0 z-20 flex items-center justify-center\">\n <div className=\"rounded-lg bg-card/90 px-6 py-4 text-sm text-foreground shadow-lg\">\n <div className=\"font-medium\">Upgrading local database…</div>\n <div className=\"text-foreground\">{PHASE_LABEL[status.phase]}</div>\n </div>\n </div>\n );\n};\n\nconst Loader = ({ delay = LOADER_DELAY }: { delay?: number }) => {\n const isSSR = typeof window === \"undefined\";\n const showInitialLoader =\n typeof document !== \"undefined\" &&\n document.body.getAttribute(\"data-show-loader\") === \"true\";\n if (!isSSR) {\n initTheme();\n }\n\n const [showLoading, setShowLoading] = useState(!delay || showInitialLoader);\n\n useEffect(() => {\n const id = setTimeout(() => {\n setShowLoading(true);\n }, delay);\n\n return () => clearTimeout(id);\n }, []);\n\n return (\n <div\n className={`skeleton-loader absolute inset-0 z-10 flex items-center justify-center ${showLoading ? \"\" : \"hidden\"}`}\n >\n <div className=\"animate-pulse overflow-hidden rounded-full shadow-lg\">\n <LogoAnimation />\n </div>\n {isSSR ? (\n <script\n dangerouslySetInnerHTML={{\n __html: `setTimeout(() => {\n document.querySelector('.skeleton-loader')?.classList.remove('hidden');\n document.body.setAttribute('data-show-loader', 'true');\n }, ${delay})`,\n }}\n />\n ) : null}\n </div>\n );\n};\n\nexport const AppSkeleton: React.FC<PropsWithChildren> = (props) => {\n const isSSR = typeof window === \"undefined\";\n const isHomeScreen = !isSSR && window.location.pathname === getBasePath();\n /* Match Root's behavior: when Connect is rendered inside an embed (e.g. the\n * vetra-studio BUILD iframe), suppress the sidebar during the Suspense\n * fallback so the loading state matches the loaded state. */\n const isEmbedded = !isSSR && getIsEmbedded();\n return (\n <div className=\"flex h-screen overflow-hidden bg-background\">\n {!isEmbedded && (\n <ConnectSidebar\n className=\"animate-pulse\"\n onLogin={undefined}\n onDisconnect={undefined}\n onClickSettings={undefined}\n address={undefined}\n />\n )}\n <HomeScreen\n containerClassName={\n isSSR || !isHomeScreen ? \"home-screen hidden\" : undefined\n }\n children={props.children ?? null}\n />\n {isSSR ? (\n <script\n dangerouslySetInnerHTML={{\n __html: `\n const baseEl = document.querySelector('base');\n const href = baseEl?.getAttribute('href');\n const basePath = href || '/';\n if (window.location.pathname === basePath) {\n document.querySelector('.home-screen')?.classList.remove('hidden')\n }`,\n }}\n />\n ) : null}\n {!props.children ? <Loader /> : null}\n <MigrationOverlay />\n </div>\n );\n};\n\nexport default AppSkeleton;\n","import { Icon, PowerhouseButton } from \"@powerhousedao/design-system\";\nimport { childLogger } from \"document-model\";\nimport type { ReactNode } from \"react\";\nimport {\n ErrorBoundary as ReactErrorBoundary,\n type FallbackProps,\n} from \"react-error-boundary\";\n\nconst logger = childLogger([\"Connect\"]);\n\n/**\n * Available fallback UI variants for the ErrorBoundary component.\n *\n * - `\"silent\"` - Renders nothing when an error occurs (useful for modals)\n * - `\"text\"` - Displays a simple centered text message\n * - `\"detailed\"` - Shows full error details including message and JSON representation\n */\ntype ErrorFallbackVariant = \"silent\" | \"text\" | \"detailed\";\n\n/**\n * Base props shared by all ErrorBoundary configurations.\n */\ntype BaseErrorBoundaryProps = {\n /** Content to wrap with error boundary protection */\n children: ReactNode;\n /** Optional callback invoked when an error is caught (in addition to logging) */\n onError?: (error: Error, info: React.ErrorInfo) => void;\n /** When any value in this array changes, the error boundary resets */\n resetKeys?: unknown[];\n /** Logger context path for error logging (e.g., [\"Connect\", \"Editor\"]) */\n loggerContext?: string[];\n};\n\n/**\n * Props for using a predefined fallback variant.\n */\ntype VariantErrorBoundaryProps = BaseErrorBoundaryProps & {\n /** The fallback UI variant to display on error */\n variant: ErrorFallbackVariant;\n /** Custom message for the \"text\" variant (default: \"Something went wrong\") */\n fallbackMessage?: string;\n};\n\n/**\n * Props for using a custom fallback render function.\n */\ntype CustomFallbackErrorBoundaryProps = BaseErrorBoundaryProps & {\n /** Custom render function for the fallback UI */\n fallbackRender: (props: FallbackProps) => ReactNode;\n};\n\n/**\n * Union type for all ErrorBoundary prop configurations.\n * Use either a variant or a custom fallbackRender, but not both.\n */\ntype ErrorBoundaryProps =\n | VariantErrorBoundaryProps\n | CustomFallbackErrorBoundaryProps;\n\nfunction hasCustomFallback(\n props: ErrorBoundaryProps,\n): props is CustomFallbackErrorBoundaryProps {\n return \"fallbackRender\" in props;\n}\n\nfunction SilentFallback() {\n return null;\n}\n\n/**\n * Simple text-based fallback component.\n * Displays a centered message when an error occurs.\n */\nfunction TextFallback({\n message = \"Something went wrong\",\n}: {\n message?: string;\n}) {\n return <div className=\"text-center\">{message}</div>;\n}\n\n/**\n * Detailed fallback component showing full error information.\n * Displays error message with a collapsible details section.\n * Useful for development and debugging purposes.\n */\nfunction DetailedFallback({ error, resetErrorBoundary }: FallbackProps) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorDetails =\n error instanceof Error\n ? (error.stack ?? String(error.cause))\n : JSON.stringify(error, null, 2);\n const hasDetails = errorDetails !== \"{}\";\n\n return (\n <div className=\"z-10 mx-auto flex max-w-[80%] flex-1 items-center justify-center p-6\">\n <div className=\"w-full max-w-lg rounded-lg border border-border bg-background p-6 shadow-sm\">\n <div className=\"mb-3 flex items-center gap-2\">\n <Icon name=\"Error\" className=\"size-5 shrink-0\" />\n <h1 className=\"text-lg font-semibold\">Something went wrong</h1>\n </div>\n <p className=\"mb-4 text-sm text-foreground\">{errorMessage}</p>\n {hasDetails && (\n <details className=\"group\">\n <summary className=\"cursor-pointer text-sm font-medium text-foreground underline select-none hover:hover-effect\">\n Show details\n </summary>\n <pre className=\"mt-2 max-h-48 overflow-auto rounded-sm bg-muted p-3 text-xs\">\n {errorDetails}\n </pre>\n </details>\n )}\n <PowerhouseButton\n type=\"button\"\n onClick={resetErrorBoundary}\n className=\"mt-4 px-3 py-1.5 text-base font-medium\"\n >\n Try again\n </PowerhouseButton>\n </div>\n </div>\n );\n}\n\n/**\n * Centered error message fallback component.\n * Displays the error message in a centered, full-size container.\n * Suitable for use as a custom fallbackRender when you need simple error display.\n */\nfunction CenteredErrorMessage({ error }: FallbackProps) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return (\n <div className=\"flex size-full items-center justify-center\">\n <h3 className=\"text-lg font-semibold\">{errorMessage}</h3>\n </div>\n );\n}\n\nfunction getFallbackComponent(\n variant: ErrorFallbackVariant,\n fallbackMessage?: string,\n): (props: FallbackProps) => ReactNode {\n switch (variant) {\n case \"silent\":\n return SilentFallback;\n case \"text\":\n return () => <TextFallback message={fallbackMessage} />;\n case \"detailed\":\n return DetailedFallback;\n default:\n return CenteredErrorMessage;\n }\n}\n\n/**\n * Unified error boundary component for catching and handling React errors.\n *\n * Built on top of `react-error-boundary`, this component provides:\n * - Automatic error logging with configurable context\n * - Multiple fallback UI variants (silent, text, detailed)\n * - Support for custom fallback render functions\n * - Reset capability via `resetKeys`\n *\n * @example\n * // Using a predefined variant\n * <ErrorBoundary variant=\"detailed\" loggerContext={[\"Connect\", \"Editor\"]}>\n * <EditorComponent />\n * </ErrorBoundary>\n *\n * @example\n * // Using a custom message with the text variant\n * <ErrorBoundary variant=\"text\" fallbackMessage=\"Failed to load drives\">\n * <DrivesList />\n * </ErrorBoundary>\n *\n * @example\n * // Using a custom fallback render\n * <ErrorBoundary\n * fallbackRender={CenteredErrorMessage}\n * onError={(error) => trackError(error)}\n * >\n * <MyComponent />\n * </ErrorBoundary>\n *\n * @example\n * // Silent mode for modals (renders null on error)\n * <ErrorBoundary variant=\"silent\" loggerContext={[\"Connect\", \"Modals\"]}>\n * <ModalContent />\n * </ErrorBoundary>\n */\nexport function ErrorBoundary(props: ErrorBoundaryProps) {\n const { children, onError, resetKeys, loggerContext } = props;\n\n const handleError = (error: Error, info: React.ErrorInfo) => {\n if (\n error.message.includes(\"Failed to fetch dynamically imported module\") &&\n error.message.includes(\"node_modules/.vite\")\n ) {\n console.error(error);\n console.log(\"Outdated chunk detected, reloading page...\");\n window.location.reload();\n return;\n }\n\n const contextLogger = loggerContext ? childLogger(loggerContext) : logger;\n contextLogger.error(\"@error @info\", error, info);\n onError?.(error, info);\n };\n\n const fallbackRender = hasCustomFallback(props)\n ? props.fallbackRender\n : getFallbackComponent(props.variant, props.fallbackMessage);\n\n return (\n <ReactErrorBoundary\n fallbackRender={fallbackRender}\n onError={handleError}\n resetKeys={resetKeys}\n >\n {children}\n </ReactErrorBoundary>\n );\n}\n\nexport { CenteredErrorMessage, DetailedFallback, TextFallback };\nexport type { FallbackProps };\n","import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { useAcceptedCookies } from \"@powerhousedao/connect/hooks\";\nimport { useEffect } from \"react\";\n\ndeclare global {\n interface Window {\n gtag?: (...args: any[]) => void;\n dataLayer?: any[];\n }\n}\n\nfunction gtag(...args: (string | Date)[]) {\n window.dataLayer?.push(...args);\n}\n\nexport const Analytics = () => {\n const gaTrackingId = connectConfig.gaTrackingId;\n const [{ analytics }] = useAcceptedCookies();\n const useAnalytics = gaTrackingId && analytics;\n\n useEffect(() => {\n if (useAnalytics) {\n // Create the GA script tag\n const script = document.createElement(\"script\");\n script.src = `https://www.googletagmanager.com/gtag/js?id=${gaTrackingId}`;\n script.async = true;\n document.head.appendChild(script);\n\n // Initialize GA\n window.dataLayer = window.dataLayer || [];\n\n gtag(\"js\", new Date());\n gtag(\"config\", gaTrackingId);\n\n // Clean up the script if no longer enabled\n return () => {\n document.head.removeChild(script);\n };\n }\n }, [useAnalytics, gaTrackingId]);\n\n return null;\n};\n","import type { User } from \"@renown/sdk\";\n\n/**\n * Builds the OpenPanel identity traits from a renown User.\n *\n * Canonical trait schema (shared with Renown and Vetra — each app sends every\n * field it has data for, under these names):\n * - `address`, `did`, `networkId`, `chainId`, `caip2` — wallet/chain facts.\n * - `ensName`, `ensAvatar` — raw ENS facts.\n * - `username`, `userImage`, `profileDocumentId`, `profileCreatedAt` — raw\n * Renown profile facts.\n * - `accountType` — wallet-adapter concept; only Renown has it.\n *\n * Rules:\n * - `credential` (contains a JWT) is **never** forwarded.\n * - Traits carry raw facts only; resolved presentation values (avatar,\n * display name) go in OpenPanel's native identify fields — see\n * {@link buildIdentifyPayload}.\n * - Optional fields (`ens`, `profile`) are only included when their value is\n * non-nullish (guards against `null` from `RenownProfile` fields as well\n * as plain `undefined`).\n *\n * Mirror the Sentry pattern in `store/user.ts`: destructure off `credential`\n * first, then assemble the trait payload from the remainder.\n */\nexport function buildTraits(user: User): Record<string, unknown> {\n // Destructure credential off so it can never accidentally make it into the\n // returned object.\n const { credential: _credential, ...rest } = user;\n\n const traits: Record<string, unknown> = {\n address: rest.address,\n did: rest.did,\n networkId: rest.networkId,\n chainId: rest.chainId,\n caip2: `${rest.networkId}:${rest.chainId}`,\n };\n\n // ens fields — optional on the User type\n if (rest.ens?.name != null) {\n traits.ensName = rest.ens.name;\n }\n if (rest.ens?.avatarUrl != null) {\n traits.ensAvatar = rest.ens.avatarUrl;\n }\n\n // profile fields — optional on InternalUser; RenownProfile members can be\n // null, so guard with != null (catches both null and undefined)\n if (rest.profile?.username != null) {\n traits.username = rest.profile.username;\n }\n if (rest.profile?.userImage != null) {\n traits.userImage = rest.profile.userImage;\n }\n if (rest.profile?.documentId != null) {\n traits.profileDocumentId = rest.profile.documentId;\n }\n if (rest.profile?.createdAt != null) {\n traits.profileCreatedAt = rest.profile.createdAt;\n }\n\n return traits;\n}\n\n/**\n * Builds the full `identify()` payload:\n * - `profileId` is the wallet address — the cross-app profile key shared with\n * Renown and Vetra.\n * - `avatar` / `firstName` are OpenPanel's native profile fields (they drive\n * the picture and name in the dashboard UI), resolved as\n * `userImage ?? ensAvatar` and `ensName ?? username`.\n * - `properties` are the raw traits from {@link buildTraits}.\n */\nexport function buildIdentifyPayload(user: User): {\n profileId: string;\n avatar?: string;\n firstName?: string;\n properties: Record<string, unknown>;\n} {\n const avatar = user.profile?.userImage ?? user.ens?.avatarUrl;\n const firstName = user.ens?.name ?? user.profile?.username;\n\n return {\n profileId: user.address,\n ...(avatar != null ? { avatar } : {}),\n ...(firstName != null ? { firstName } : {}),\n properties: buildTraits(user),\n };\n}\n","import type { OpenPanel as OpenPanelClient } from \"@openpanel/web\";\nimport { connectConfig } from \"@powerhousedao/connect/config\";\nimport { useAcceptedCookies } from \"@powerhousedao/connect/hooks\";\nimport {\n createOpenPanelProcessorFactory,\n eventLookupMap,\n eventMappings,\n getOpenPanelClient,\n resetOpenPanelClient,\n} from \"@powerhousedao/connect/services\";\nimport {\n useReactorClientModule,\n useUser,\n} from \"@powerhousedao/reactor-browser\";\nimport { useEffect, useRef, useState } from \"react\";\n\nimport { buildIdentifyPayload } from \"./openpanel-traits.js\";\n\ndeclare global {\n interface Window {\n openPanel?: OpenPanelClient;\n }\n}\n\n/**\n * `OpenPanel` is a `null`-rendering component that manages the full lifecycle\n * of the OpenPanel analytics subsystem.\n *\n * Gates:\n * - `useAcceptedCookies().analytics === true` — the existing analytics cookie.\n * - `connectConfig.openPanel.clientId` non-empty — no client ID → no-op.\n *\n * Behaviour when both gates pass:\n * 1. Lazy-imports `@openpanel/web` and builds the singleton via\n * `getOpenPanelClient(connectConfig.openPanel)`.\n * 2. Exposes the client on `window.openPanel` for the card-6\n * `useOpenPanelAnalytics()` hook to consume.\n * 3. If `connectConfig.openPanel.trackOperations`, registers the processor\n * factory against `processorManager` so document operations are forwarded.\n * 4. Calls `client.identify()` when the renown user transitions from\n * `undefined` → defined (login). The profile ID is the wallet address —\n * the cross-app key shared with Renown and Vetra.\n * 5. Calls `client.clear()` when the user transitions from defined →\n * `undefined` (logout).\n *\n * Teardown (unmount **or** consent revocation):\n * - `unregisterFactory(\"openpanel\")` to remove the processor.\n * - `resetOpenPanelClient()` to clear the singleton.\n * - `window.openPanel` is cleared.\n *\n * Mirrors the Sentry pattern in `store/user.ts` for login/logout detection.\n * Analytics failures are caught and forwarded to `console.warn` — they must\n * never throw into the application.\n *\n * Mounted next to `<Analytics />` in `app.tsx`.\n */\nexport function OpenPanel(): null {\n const [{ analytics }] = useAcceptedCookies();\n const user = useUser();\n const module = useReactorClientModule();\n const reactorClientModule = module?.kind === \"browser\" ? module : undefined;\n\n const [client, setClient] = useState<OpenPanelClient | undefined>();\n\n /**\n * Tracks the previous `user` value so we can detect the two transitions:\n * undefined → defined (login)\n * defined → undefined (logout)\n */\n const prevUserRef = useRef<ReturnType<typeof useUser>>(undefined);\n\n const enabled = analytics && !!connectConfig.openPanel.clientId;\n const processorManager = reactorClientModule?.reactorModule?.processorManager;\n\n useEffect(() => {\n if (!enabled) return;\n\n let cancelled = false;\n\n // Read via a call — TS would otherwise narrow direct reads to always-false.\n const isCancelled = () => cancelled;\n\n const setup = async () => {\n let builtClient: OpenPanelClient | undefined;\n try {\n builtClient = await getOpenPanelClient(connectConfig.openPanel);\n } catch (err) {\n console.warn(\"[OpenPanel] Failed to build client:\", err);\n return;\n }\n\n if (isCancelled() || !builtClient) return;\n\n setClient(builtClient);\n window.openPanel = builtClient;\n\n if (connectConfig.openPanel.trackOperations && processorManager) {\n try {\n await processorManager.registerFactory(\n \"openpanel\",\n createOpenPanelProcessorFactory({\n client: builtClient,\n events: { mappings: eventMappings, lookupMap: eventLookupMap },\n startFrom: \"current\",\n }),\n );\n // Guard against teardown happening while registerFactory was in flight.\n if (isCancelled()) {\n await processorManager\n .unregisterFactory(\"openpanel\")\n .catch((err: unknown) =>\n console.warn(\n \"[OpenPanel] Failed to unregister factory after cancellation:\",\n err,\n ),\n );\n }\n } catch (err) {\n console.warn(\n \"[OpenPanel] Failed to register processor factory:\",\n err,\n );\n }\n }\n };\n\n void setup();\n\n return () => {\n cancelled = true;\n\n // Reset the user-tracking ref so that when consent is re-granted (and a\n // new client is built) any currently-logged-in user is re-identified.\n prevUserRef.current = undefined;\n\n if (connectConfig.openPanel.trackOperations && processorManager) {\n void processorManager\n .unregisterFactory(\"openpanel\")\n .catch((err: unknown) =>\n console.warn(\n \"[OpenPanel] Failed to unregister processor factory:\",\n err,\n ),\n );\n }\n\n resetOpenPanelClient();\n window.openPanel = undefined;\n setClient(undefined);\n };\n }, [enabled, processorManager]);\n\n // detect login/logout transitions\n useEffect(() => {\n if (!enabled || !client) return;\n\n const prev = prevUserRef.current;\n prevUserRef.current = user;\n\n if (!prev && user) {\n // Login: undefined → defined (or client became available with user\n // already logged in — prevUserRef is undefined in both cases).\n try {\n void client.identify(buildIdentifyPayload(user));\n } catch (err) {\n console.warn(\"[OpenPanel] Failed to identify user:\", err);\n }\n } else if (prev && !user) {\n // Logout: defined → undefined\n try {\n void client.clear();\n } catch (err) {\n console.warn(\"[OpenPanel] Failed to clear user:\", err);\n }\n }\n }, [client, user, enabled]);\n\n return null;\n}\n","import { DocumentEditor } from \"@powerhousedao/connect/components\";\nimport {\n setSelectedNode,\n useNodeParentFolderById,\n useSelectedDocument,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\nexport function DocumentEditorContainer() {\n const [selectedDocument] = useSelectedDocument();\n const parentFolder = useNodeParentFolderById(selectedDocument.header.id);\n\n // TODO: unused\n const _onOpenSwitchboardLink = useMemo(() => {\n return async () => {\n //\n };\n }, []);\n\n const _onClose = useCallback(() => {\n setSelectedNode(parentFolder);\n }, [parentFolder]);\n\n return (\n <div\n id=\"document-editor-container\"\n className=\"flex-1\"\n data-document-type={selectedDocument.header.documentType}\n >\n <DocumentEditor document={selectedDocument} />\n </div>\n );\n}\n","import { DefaultEditorLoader } from \"@powerhousedao/design-system/connect\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { useEffect, useState } from \"react\";\n\ntype Props = ComponentProps<typeof DefaultEditorLoader> & {\n loadingTimeout?: number;\n customEditorLoader?: ReactNode;\n};\nexport function EditorLoader(props: Props) {\n const [showLoading, setShowLoading] = useState(false);\n\n // only shows the loader after some time has passed\n useEffect(() => {\n setTimeout(() => {\n setShowLoading(true);\n }, props.loadingTimeout ?? 200);\n }, [props]);\n\n if (!showLoading) return null;\n\n const { customEditorLoader, ...defaultProps } = props;\n\n if (customEditorLoader) return <>{customEditorLoader}</>;\n\n return <DefaultEditorLoader {...defaultProps} />;\n}\n","import { DropZoneWrapper } from \"@powerhousedao/design-system/connect\";\nimport { GenericDriveExplorer } from \"@powerhousedao/powerhouse-vetra-packages/editors\";\nimport {\n useAppModuleById,\n useDefaultAppModule,\n useSelectedDocumentId,\n useSelectedDriveSafe,\n} from \"@powerhousedao/reactor-browser\";\nimport { Suspense } from \"react\";\nimport { DocumentEditorContainer } from \"./document-editor-container.js\";\nimport { EditorLoader } from \"./editor-loader.js\";\nimport { ErrorBoundary } from \"./error-boundary.js\";\n\nexport function AppContainer() {\n const [selectedDrive] = useSelectedDriveSafe();\n const selectedDocumentId = useSelectedDocumentId();\n\n const app = useAppModuleById(selectedDrive?.header.meta?.preferredEditor);\n const defaultApp = useDefaultAppModule();\n\n if (!selectedDrive) {\n return <EditorLoader />;\n }\n\n const AppComponent =\n app?.Component ?? defaultApp?.Component ?? GenericDriveExplorer.Component;\n\n if (!AppComponent) {\n throw new Error(\"No app component found\");\n }\n return (\n <ErrorBoundary\n variant=\"detailed\"\n resetKeys={[selectedDrive.header.id]}\n loggerContext={[\"Connect\", \"App\"]}\n >\n <Suspense fallback={<EditorLoader />}>\n <DropZoneWrapper className=\"flex h-full flex-col overflow-auto\">\n <AppComponent>\n {selectedDocumentId ? <DocumentEditorContainer /> : null}\n </AppComponent>\n </DropZoneWrapper>\n </Suspense>\n </ErrorBoundary>\n );\n}\n","import { useInitSentry } from \"@powerhousedao/connect/hooks\";\n\ninterface SentryProviderProps {\n children?: React.ReactNode;\n}\n\nexport const SentryProvider: React.FC<SentryProviderProps> = ({ children }) => {\n useInitSentry();\n\n return children;\n};\n","import { Modal } from \"@powerhousedao/design-system\";\nimport {\n usePackageDiscoveryService,\n type FailedInstallation,\n type FailedInstallationReason,\n} from \"@powerhousedao/reactor-browser\";\nimport { useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useFailedInstallations } from \"../hooks/useFailedInstallations.js\";\n\nconst reasonLabels: Record<FailedInstallationReason, string> = {\n \"no-registry\": \"No package registry is configured.\",\n \"not-in-registry\": \"No matching package found in the registry.\",\n \"registry-error\": \"Couldn't reach the package registry.\",\n \"install-failed\": \"Package failed to install.\",\n dismissed: \"Installation was dismissed.\",\n offline: \"You're offline — this package can't be loaded until you reconnect.\",\n};\n\nfunction canRetry(reason: FailedInstallationReason): boolean {\n return reason !== \"no-registry\";\n}\n\nexport function MissingModelBanner() {\n const failed = useFailedInstallations();\n const [open, setOpen] = useState(false);\n\n if (failed.length === 0) return null;\n\n return (\n <>\n <div className=\"flex items-center justify-between gap-3 bg-warning/10 px-4 py-2 text-sm text-warning\">\n <span>\n {failed.length === 1\n ? \"1 document type couldn't load (missing model).\"\n : `${failed.length} document types couldn't load (missing models).`}\n </span>\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className=\"rounded-md border border-warning bg-background px-3 py-1 text-warning hover:hover-effect\"\n >\n View\n </button>\n </div>\n <MissingModelDetailsModal\n open={open}\n failed={failed}\n onClose={() => setOpen(false)}\n />\n </>\n );\n}\n\ntype DetailsProps = {\n readonly open: boolean;\n readonly failed: FailedInstallation[];\n readonly onClose: () => void;\n};\n\nfunction MissingModelDetailsModal(props: DetailsProps) {\n const { open, failed, onClose } = props;\n const discoveryService = usePackageDiscoveryService();\n const [retrying, setRetrying] = useState<Set<string>>(() => new Set());\n\n async function handleRetry(documentType: string) {\n if (!discoveryService) return;\n setRetrying((prev) => new Set(prev).add(documentType));\n try {\n await discoveryService.retryInstallation(documentType);\n } finally {\n setRetrying((prev) => {\n const next = new Set(prev);\n next.delete(documentType);\n return next;\n });\n }\n }\n\n return (\n <Modal\n open={open}\n onOpenChange={(isOpen) => {\n if (!isOpen) onClose();\n }}\n contentProps={{ className: \"rounded-3xl\" }}\n >\n <div className=\"w-[520px] max-w-[90vw] bg-background p-6\">\n <div className=\"border-b border-border pb-2 text-2xl font-bold text-foreground\">\n Missing document models\n </div>\n <div className=\"my-4 text-sm text-foreground\">\n The following document types couldn't be loaded. Documents using them\n won't display until the underlying package is installed.\n </div>\n {failed.length === 0 ? (\n <div className=\"rounded-xl bg-background p-4 text-sm text-foreground\">\n No outstanding failures.\n </div>\n ) : (\n <div className=\"flex max-h-[60vh] flex-col gap-3 overflow-y-auto\">\n {failed.map((entry) => {\n const isRetrying = retrying.has(entry.documentType);\n const retryDisabled = !canRetry(entry.reason) || isRetrying;\n return (\n <div\n key={entry.documentType}\n className=\"rounded-xl bg-background p-4\"\n >\n <div className=\"mb-1 font-mono text-sm font-semibold text-foreground\">\n {entry.documentType}\n </div>\n <div className=\"mb-2 text-xs text-foreground\">\n {reasonLabels[entry.reason]}\n </div>\n {entry.packageNames.length > 0 ? (\n <div className=\"mb-2 text-xs text-muted-foreground\">\n Package{entry.packageNames.length > 1 ? \"s\" : \"\"}:{\" \"}\n {entry.packageNames.join(\", \")}\n </div>\n ) : null}\n {entry.error ? (\n <div className=\"mb-2 font-mono text-xs wrap-break-word text-destructive\">\n {entry.error.message}\n </div>\n ) : null}\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n onClick={() => void handleRetry(entry.documentType)}\n disabled={retryDisabled}\n title={\n canRetry(entry.reason)\n ? undefined\n : \"No registry is configured; nothing to retry against.\"\n }\n className={twMerge(\n \"min-h-[32px] rounded-xl px-3 py-1 text-sm font-semibold text-foreground transition-all hover:hover-effect\",\n retryDisabled\n ? \"cursor-not-allowed bg-secondary hover:hover-effect\"\n : \"bg-primary text-primary-foreground active:active-effect\",\n )}\n >\n {isRetrying ? \"Retrying...\" : \"Try install again\"}\n </button>\n </div>\n </div>\n );\n })}\n </div>\n )}\n <div className=\"mt-4 flex justify-end\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"min-h-[36px] rounded-xl border border-border bg-background px-4 py-2 text-sm font-semibold text-foreground hover:hover-effect\"\n >\n Close\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import {\n PackageInstallModal,\n type PendingPackageInstallation,\n} from \"@powerhousedao/design-system/connect\";\nimport { usePackageDiscoveryService } from \"@powerhousedao/reactor-browser\";\nimport { usePendingInstallations } from \"../hooks/usePendingInstallations.js\";\n\nexport function PackageInstallPrompt() {\n const pendingInstallations = usePendingInstallations();\n const discoveryService = usePackageDiscoveryService();\n\n if (!discoveryService || pendingInstallations.length === 0) return null;\n\n const installations: PendingPackageInstallation[] =\n pendingInstallations.flatMap((p) =>\n p.packageNames.map((packageName) => ({\n documentType: p.documentType,\n packageName,\n })),\n );\n\n return (\n <PackageInstallModal\n pendingInstallations={installations}\n onInstall={(packageName) =>\n discoveryService.approveInstallation(packageName)\n }\n onDismiss={(packageName) =>\n discoveryService.dismissInstallation(packageName)\n }\n />\n );\n}\n","import {\n Analytics,\n OpenPanel,\n Router,\n} from \"@powerhousedao/connect/components\";\n\nimport { connectConfig } from \"@powerhousedao/connect/config\";\nimport { SentryProvider } from \"@powerhousedao/connect/context\";\nimport {\n DocumentEditorDebugTools,\n serviceWorkerManager,\n} from \"@powerhousedao/connect/utils\";\nimport { useEditorPreloader, useTheme } from \"@powerhousedao/reactor-browser\";\nimport { useEffect } from \"react\";\nimport { ToastContainer } from \"../services/toast.js\";\nimport { MissingModelBanner } from \"./missing-model-banner.js\";\nimport { PackageInstallPrompt } from \"./package-install-prompt.js\";\n\nexport const App = () => {\n useTheme(); // keeps the OS-preference change listener active\n useEditorPreloader(); // warms editor chunks during idle time\n\n // refresh page on vite preload error due to outdated chunks — but only when\n // the failing dynamic import is one of Connect's own chunks. External\n // dynamic imports (e.g. the package manager loading a package from the\n // configured CDN) should let the error propagate so the caller can surface\n // it; reloading here drops any open state and hides the real failure.\n useEffect(() => {\n const handlePreloadError = (event: Event) => {\n const payload = (event as Event & { payload?: unknown }).payload;\n const message =\n payload instanceof Error\n ? payload.message\n : typeof payload === \"string\"\n ? payload\n : \"\";\n const failedUrl = message.match(/https?:\\/\\/[^\\s\"']+/)?.[0];\n\n if (failedUrl && !failedUrl.startsWith(window.location.origin)) {\n console.debug(\n `[Connect] Skipping reload — vite:preloadError for off-origin URL: ${failedUrl}`,\n );\n return;\n }\n\n console.log(\"Outdated chunks detected, reloading page...\");\n window.location.reload();\n };\n\n window.addEventListener(\"vite:preloadError\", handlePreloadError);\n\n return () => {\n window.removeEventListener(\"vite:preloadError\", handlePreloadError);\n };\n }, []);\n\n useEffect(() => {\n if (import.meta.env.MODE === \"development\") {\n window.documentEditorDebugTools = new DocumentEditorDebugTools();\n } else if (connectConfig.offline) {\n serviceWorkerManager.registerServiceWorker(false);\n } else {\n // Offline disabled — drop any worker a previous offline build left running.\n void serviceWorkerManager.unregisterAll();\n }\n }, []);\n\n return (\n <SentryProvider>\n <ToastContainer position=\"bottom-right\" />\n <MissingModelBanner />\n <Router />\n <PackageInstallPrompt />\n <Analytics />\n <OpenPanel />\n </SentryProvider>\n );\n};\n","import {\n useAcceptedCookies,\n useCookieBanner,\n} from \"@powerhousedao/connect/hooks\";\nimport type { CookieInput } from \"@powerhousedao/design-system/connect\";\nimport { CookieBanner as PHCookieBanner } from \"@powerhousedao/design-system/connect\";\nimport { showPHModal } from \"@powerhousedao/reactor-browser\";\nimport { Trans, useTranslation } from \"react-i18next\";\nimport { i18n } from \"@powerhousedao/connect/i18n\";\n\nconst isCookieAccepted = (cookies: CookieInput[], id: string) => {\n return cookies.some((cookie) => cookie.id === id && cookie.value);\n};\n\nexport const CookieBanner = () => {\n const { t } = useTranslation(undefined, {\n useSuspense: true,\n i18n,\n });\n const [showBanner, setShowBanner] = useCookieBanner();\n const [, setAcceptedCookies] = useAcceptedCookies();\n\n const cookiesInput: CookieInput[] = [\n {\n id: \"analytics-cookie\",\n label: t(\"cookieBanner.cookies.analytics\"),\n value: true,\n },\n ];\n\n const handleAccept = (cookies: CookieInput[]) => {\n setShowBanner(false);\n\n if (isCookieAccepted(cookies, \"analytics-cookie\")) {\n setAcceptedCookies((acceptedCookies) => ({\n ...acceptedCookies,\n analytics: true,\n }));\n }\n };\n\n const handleReject = () => {\n setShowBanner(false);\n setAcceptedCookies(() => ({\n analytics: false,\n functional: false,\n marketing: false,\n }));\n };\n\n if (!showBanner) {\n return null;\n }\n\n return (\n <div className=\"absolute inset-0 z-10000 backdrop-blur-sm\">\n <div className=\"absolute inset-0 bg-primary opacity-15\" />\n <div className=\"absolute inset-x-0 bottom-0 flex justify-center bg-background px-10 pt-10 pb-16 shadow-lg\">\n <PHCookieBanner\n className=\"max-w-[1024px]\"\n cookies={cookiesInput}\n onSubmit={handleAccept}\n onReject={handleReject}\n submitLabel={t(\"cookieBanner.accept\")}\n rejectLabel={t(\"cookieBanner.reject\")}\n >\n <p className=\"font-semibold text-muted-foreground\">\n <Trans\n key={\"cookieBanner.message\"}\n i18nKey=\"cookieBanner.message\"\n components={{\n a: (\n <a\n onClick={() => showPHModal({ type: \"cookiesPolicy\" })}\n key={\"cookieBanner.message-link\"}\n className=\"cursor-pointer text-foreground hover:underline\"\n />\n ),\n }}\n />\n </p>\n </PHCookieBanner>\n </div>\n </div>\n );\n};\n","import { Icon } from \"@powerhousedao/design-system\";\nimport { DriveCollectionId, useSyncList } from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport { useMemo } from \"react\";\n\nexport function DriveIcon({\n drive,\n}: {\n drive: DocumentDriveDocument | undefined;\n}) {\n const remotes = useSyncList();\n const isRemoteDrive = useMemo(() => {\n if (!drive) return false;\n\n return remotes.some((remote) =>\n remote.meta.collectionId.equals(\n DriveCollectionId.forDrive(drive.header.id),\n ),\n );\n }, [remotes, drive]);\n\n const driveIconSrc = drive?.state.global.icon;\n\n if (driveIconSrc) {\n return (\n <img src={driveIconSrc} alt={drive.header.name} height={32} width={32} />\n );\n }\n\n if (!isRemoteDrive) {\n return <Icon name=\"Hdd\" size={32} />;\n }\n\n return <Icon name=\"Server\" size={32} />;\n}\n","import { EditorLoader } from \"@powerhousedao/connect/components\";\nimport { useUndoRedoShortcuts } from \"@powerhousedao/connect/hooks\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport { RevisionHistory } from \"@powerhousedao/design-system/connect\";\nimport {\n getRevisionFromDate,\n setRevisionHistoryVisible,\n showPHModal,\n useDocumentById,\n useDocumentModelModuleById,\n useDocumentOperations,\n useEditorModuleById,\n useFallbackEditorModule,\n useRevisionHistoryVisible,\n useSelectedTimelineItem,\n useVetraPackageManager,\n useVetraPackages,\n} from \"@powerhousedao/reactor-browser\";\nimport type { PHDocument } from \"@powerhousedao/shared/document-model\";\nimport { redo, undo } from \"@powerhousedao/shared/document-model\";\nimport { Suspense, useEffect, useState } from \"react\";\nimport { CenteredErrorMessage, ErrorBoundary } from \"./error-boundary.js\";\n\ntype Props<TDocument extends PHDocument = PHDocument> = {\n document: TDocument;\n};\n\nfunction EditorError({ message }: { message: React.ReactNode }) {\n return (\n <div className=\"flex size-full items-center justify-center\">\n <h3 className=\"text-lg font-semibold\">{message}</h3>\n </div>\n );\n}\n\nexport const DocumentEditor: React.FC<Props> = (props) => {\n const { document: initialDocument } = props;\n const selectedTimelineItem = useSelectedTimelineItem();\n const revisionHistoryVisible = useRevisionHistoryVisible();\n const [document, dispatch] = useDocumentById(initialDocument.header.id);\n const documentId = document?.header.id ?? undefined;\n const documentName = document?.header.name ?? undefined;\n const documentType = document?.header.documentType ?? undefined;\n const preferredEditor = document?.header.meta?.preferredEditor ?? undefined;\n const {\n globalOperations,\n localOperations,\n isLoading: isLoadingOperations,\n refetch: refetchOperations,\n } = useDocumentOperations(documentId);\n\n // Refetch operations when revision history panel opens\n useEffect(() => {\n if (revisionHistoryVisible) {\n void refetchOperations();\n }\n }, [revisionHistoryVisible, refetchOperations]);\n\n const globalRevisionNumber = document?.header.revision.global ?? 0;\n const localRevisionNumber = document?.header.revision.local ?? 0;\n const documentModelModule = useDocumentModelModuleById(documentType);\n const preferredEditorModule = useEditorModuleById(preferredEditor);\n const fallbackEditorModule = useFallbackEditorModule(documentType);\n const editorModule = preferredEditorModule ?? fallbackEditorModule;\n const vetraPackages = useVetraPackages();\n const packageManager = useVetraPackageManager();\n const owningPackageName = editorModule\n ? vetraPackages.find((pkg) => pkg.editors.includes(editorModule))?.manifest\n .name\n : undefined;\n const owningPackageVersion =\n owningPackageName && packageManager\n ? packageManager.getPackageVersion(owningPackageName)\n : undefined;\n const editorBundleKey = owningPackageName\n ? `${owningPackageName}@${owningPackageVersion ?? \"unknown\"}`\n : (editorModule?.config.id ?? \"no-editor\");\n const isLoadingDocument = !document;\n const isLoadingEditor =\n editorModule &&\n documentType &&\n !editorModule.documentTypes.includes(documentType) &&\n !editorModule.documentTypes.includes(\"*\");\n\n const canUndo = globalRevisionNumber > 0 || localRevisionNumber > 0;\n const canRedo = !!document?.clipboard.length;\n const addUndoAction = () => dispatch(undo());\n const addRedoAction = () => dispatch(redo());\n useUndoRedoShortcuts({\n undo: addUndoAction,\n redo: addRedoAction,\n canUndo,\n canRedo,\n });\n\n useEffect(() => {\n return () => {\n window.documentEditorDebugTools?.clear();\n };\n }, []);\n\n const [editorError, setEditorError] = useState<\n | {\n error: any;\n info: React.ErrorInfo;\n documentId?: string;\n // clear: () => void;\n }\n | undefined\n >(undefined);\n\n useEffect(() => {\n if (editorError && editorError.documentId !== documentId) {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setEditorError(undefined);\n }\n }, [editorError, documentId]);\n\n const handleEditorError = (error: Error, info: React.ErrorInfo) => {\n setEditorError({\n error,\n documentId,\n info,\n });\n };\n\n if (isLoadingEditor) {\n return <EditorLoader message=\"Loading editor\" />;\n }\n\n if (isLoadingDocument) {\n return <EditorLoader message=\"Loading document\" />;\n }\n\n if (!documentModelModule) {\n return (\n <EditorError\n message={\n <div className=\"text-center leading-10\">\n <p>\n Unable to open the document because the document model \"\n {documentType}\" is not supported.\n </p>\n <p>\n Go to the{\" \"}\n <button\n type=\"button\"\n className=\"cursor-pointer underline\"\n onClick={() => {\n showPHModal({ type: \"settings\" });\n }}\n >\n package manager\n </button>{\" \"}\n to install this document model\n </p>\n </div>\n }\n />\n );\n }\n\n if (!editorModule) {\n return (\n <EditorError\n message={\n <div className=\"text-center leading-10\">\n <p>Unable to open the document because no editor has been found</p>\n <p>\n Go to the{\" \"}\n <button\n type=\"button\"\n className=\"cursor-pointer underline\"\n onClick={() => {\n showPHModal({ type: \"settings\" });\n }}\n >\n package manager\n </button>{\" \"}\n an editor for the \"${documentType}\" document type\n </p>\n </div>\n }\n />\n );\n }\n const EditorComponent = editorModule.Component;\n\n return (\n <div\n className=\"relative h-full\"\n id=\"document-editor-context\"\n data-editor={editorModule.config.id}\n data-document-type={documentType}\n >\n {revisionHistoryVisible ? (\n isLoadingOperations ? (\n <EditorLoader message=\"Loading operations\" />\n ) : (\n <RevisionHistory\n key={documentId}\n documentTitle={documentName ?? \"\"}\n documentId={documentId ?? \"\"}\n globalOperations={globalOperations}\n localOperations={localOperations}\n onClose={() => setRevisionHistoryVisible(false)}\n documentState={document.state}\n onCopyState={() => {\n toast(\"Copied document state to clipboard\", { type: \"success\" });\n }}\n onCopyDocId={() => {\n toast(\"Copied document ID to clipboard\", { type: \"success\" });\n }}\n />\n )\n ) : (\n <Suspense\n fallback={<EditorLoader message=\"Loading editor\" />}\n name=\"EditorLoader\"\n >\n <ErrorBoundary\n fallbackRender={CenteredErrorMessage}\n resetKeys={[documentId]}\n onError={handleEditorError}\n loggerContext={[\"Connect\", \"DocumentEditor\"]}\n >\n {!editorError?.error && (\n <EditorComponent\n key={`${editorBundleKey}:${documentId}`}\n context={{\n readMode: !!selectedTimelineItem,\n selectedTimelineRevision: getRevisionFromDate(\n selectedTimelineItem?.startDate,\n selectedTimelineItem?.endDate,\n globalOperations,\n ),\n }}\n documentId={document.header.id}\n />\n )}\n </ErrorBoundary>\n </Suspense>\n )}\n </div>\n );\n};\n","import { Sidebar } from \"@powerhousedao/connect/components\";\nimport { useIsEmbedded } from \"@powerhousedao/connect/hooks\";\nimport { Suspense } from \"react\";\nimport { Outlet } from \"react-router-dom\";\n\nexport function Root() {\n const isEmbedded = useIsEmbedded();\n return (\n <div className=\"h-screen bg-background\">\n <div\n className={`flex h-screen items-stretch overflow-auto`}\n role=\"presentation\"\n tabIndex={0}\n >\n <Suspense name=\"Root\">\n {!isEmbedded && <Sidebar />}\n <div className=\"relative flex-1 overflow-auto\">\n <Outlet />\n </div>\n </Suspense>\n </div>\n </div>\n );\n}\n","import {\n useConnectionStates,\n useUser,\n type ConnectionStateSnapshot,\n} from \"@powerhousedao/reactor-browser\";\n\n/** Return code for the auth gate decision:\n * - `\"login\"` : anonymous user, a channel rejected with `requiresAuth`.\n * - `\"unauthorized\"` : signed in, but a channel was rejected — they aren't the owner.\n * - `null` : no auth barrier, carry on. */\nexport type AuthGate = \"login\" | \"unauthorized\" | null;\n\nexport function computeAuthGate(\n isAuthenticated: boolean,\n connectionStates: ReadonlyMap<string, ConnectionStateSnapshot>,\n): AuthGate {\n let sawAuthError = false;\n for (const snap of connectionStates.values()) {\n if (snap.state === \"error\" && snap.requiresAuth) {\n sawAuthError = true;\n break;\n }\n }\n if (!sawAuthError) return null;\n return isAuthenticated ? \"unauthorized\" : \"login\";\n}\n\n/** Live wrapper over {@link computeAuthGate}. */\nexport function useDriveAuthGate(): { gate: AuthGate } {\n const user = useUser();\n const connectionStates = useConnectionStates();\n return { gate: computeAuthGate(Boolean(user), connectionStates) };\n}\n","import { AppContainer, DriveIcon } from \"@powerhousedao/connect/components\";\nimport {\n defaultPHAppConfig,\n defaultPHDocumentEditorConfig,\n} from \"@powerhousedao/connect/config\";\nimport {\n DriveAuthGate,\n HomeScreen,\n HomeScreenAddDriveItem,\n HomeScreenItem,\n} from \"@powerhousedao/design-system/connect\";\nimport {\n openRenown,\n logout,\n setPHAppConfig,\n setPHDocumentEditorConfig,\n setSelectedDrive,\n useAppModuleById,\n useDrives,\n useIsAddDriveEnabled,\n useSelectedDocumentId,\n useSelectedDriveSafe,\n useSelectedFolder,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport { useEffect } from \"react\";\nimport { getRuntimeConfig } from \"../runtime-config.js\";\nimport { useDriveAuthGate } from \"../components/use-drive-auth-gate.js\";\n\nexport function Content() {\n const { gate } = useDriveAuthGate();\n const [selectedDrive] = useSelectedDriveSafe();\n const selectedFolder = useSelectedFolder();\n const selectedDocumentId = useSelectedDocumentId();\n\n useEffect(() => {\n if (!selectedDocumentId) {\n setPHDocumentEditorConfig(defaultPHDocumentEditorConfig);\n }\n }, [selectedDocumentId]);\n\n useEffect(() => {\n if (!selectedDrive) {\n setPHAppConfig(defaultPHAppConfig);\n }\n }, [selectedDrive]);\n\n const showHomeScreen =\n !selectedDocumentId && !selectedDrive && !selectedFolder;\n return (\n <ContentContainer>\n {gate ? (\n <div className=\"flex h-full items-center justify-center p-4\">\n <DriveAuthGate\n mode={gate}\n onLogin={openRenown}\n onLogout={() => void logout()}\n />\n </div>\n ) : showHomeScreen ? (\n <HomeScreenContainer />\n ) : (\n <AppContainer />\n )}\n </ContentContainer>\n );\n}\n\nfunction ContentContainer({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"flex h-full flex-col overflow-auto\" id=\"content-view\">\n {children}\n </div>\n );\n}\n\nfunction DriveItem({ drive }: { drive: DocumentDriveDocument }) {\n const editorModule = useAppModuleById(drive.header.meta?.preferredEditor);\n const description = editorModule?.config.name || \"Drive Explorer App\";\n return (\n <HomeScreenItem\n key={drive.header.id}\n title={drive.state.global.name || drive.header.name}\n description={description}\n icon={<DriveIcon drive={drive} />}\n onClick={() => setSelectedDrive(drive)}\n />\n );\n}\n\nfunction HomeScreenContainer() {\n const drives = useDrives();\n const isAddDriveEnabled = useIsAddDriveEnabled();\n const runtimeConfig = getRuntimeConfig();\n const homeBackground = runtimeConfig.connect?.branding?.homeBackground;\n return (\n <HomeScreen homeBackground={homeBackground}>\n {drives?.map((drive) => {\n return <DriveItem key={drive.header.id} drive={drive} />;\n })}\n {isAddDriveEnabled && <HomeScreenAddDriveItem />}\n </HomeScreen>\n );\n}\n","import { Root } from \"@powerhousedao/connect/components\";\nimport { connectConfig } from \"@powerhousedao/connect/config\";\nimport { Content } from \"@powerhousedao/connect/pages\";\nimport { Suspense } from \"react\";\nimport type { RouteObject } from \"react-router-dom\";\nimport { RouterProvider, createBrowserRouter } from \"react-router-dom\";\n\nfunction createRouter(routes: RouteObject[]) {\n const routerBasename = connectConfig.routerBasename;\n\n return createBrowserRouter(routes, {\n basename: routerBasename,\n future: {\n v7_fetcherPersist: true,\n v7_relativeSplatPath: true,\n },\n });\n}\n\nfunction createRoutes() {\n const routes: RouteObject[] = [\n {\n index: true,\n path: \"d?/:driveId?/*?\",\n element: (\n <Suspense name=\"Drive\">\n <Content />\n </Suspense>\n ),\n },\n ];\n\n return [\n {\n element: (\n <Suspense name=\"RouteRoot\">\n <Root />\n </Suspense>\n ),\n children: routes,\n },\n ];\n}\n\nconst routes = createRoutes();\nconst router = createRouter(routes);\n\nexport const Router = () => {\n return <RouterProvider router={router} />;\n};\n","import { DriveIcon } from \"@powerhousedao/connect/components\";\nimport {\n ConnectSidebar,\n ConnectTooltipProvider,\n SidebarAddDriveItem,\n SidebarItem,\n useEns,\n} from \"@powerhousedao/design-system/connect\";\n\nimport {\n logout,\n openRenown,\n setSelectedDrive,\n showPHModal,\n useIsAddDriveEnabled,\n useDrives,\n useSelectedDriveSafe,\n useUser,\n} from \"@powerhousedao/reactor-browser\";\nimport { ErrorBoundary } from \"./error-boundary.js\";\n\nexport function Sidebar() {\n const user = useUser();\n const drives = useDrives();\n const isAddDriveEnabled = useIsAddDriveEnabled();\n const [selectedDrive] = useSelectedDriveSafe();\n const connectDebug = localStorage.getItem(\"CONNECT_DEBUG\") === \"true\";\n\n const ensName = user?.ens?.name || user?.profile?.username || undefined;\n const avatarUrl =\n user?.ens?.avatarUrl || user?.profile?.userImage || undefined;\n\n const ensInfo = useEns(!avatarUrl ? user?.address : undefined);\n\n const onClickSettings = () => {\n showPHModal({ type: \"settings\" });\n };\n\n const onAddDriveClick = () => {\n showPHModal({ type: \"addDrive\" });\n };\n\n const etherscanUrl = user?.address\n ? `https://etherscan.io/address/${user.address}`\n : \"\";\n\n return (\n <ConnectTooltipProvider>\n <ConnectSidebar\n id=\"sidebar\"\n onClick={() => setSelectedDrive(undefined)}\n onClickSettings={onClickSettings}\n address={user?.address}\n onLogin={openRenown}\n onDisconnect={() => {\n void logout();\n }}\n ensName={ensName || ensInfo.data?.ens}\n avatarUrl={\n avatarUrl ||\n ensInfo.data?.avatar_small ||\n ensInfo.data?.avatar_url ||\n undefined\n }\n etherscanUrl={etherscanUrl}\n showDebug={connectDebug}\n onDebugClick={() => showPHModal({ type: \"debugSettings\" })}\n >\n <ErrorBoundary\n variant=\"text\"\n fallbackMessage=\"There was an error loading drives\"\n loggerContext={[\"Connect\", \"Sidebar\"]}\n >\n {drives?.map((drive, index) => (\n <SidebarItem\n key={index}\n title={drive.header.name}\n onClick={() => setSelectedDrive(drive)}\n active={selectedDrive?.header.id === drive.header.id}\n icon={<DriveIcon drive={drive} />}\n />\n ))}\n {isAddDriveEnabled && (\n <SidebarAddDriveItem onClick={onAddDriveClick} />\n )}\n </ErrorBoundary>\n </ConnectSidebar>\n </ConnectTooltipProvider>\n );\n}\n","import { useSyncExternalStore } from \"react\";\nimport {\n getWorkerConnectionStatus,\n subscribeWorkerConnection,\n type WorkerConnectionStatus,\n} from \"../connection-state.js\";\n\nconst CONNECTED: WorkerConnectionStatus = \"connected\";\n\nexport const ConnectionBanner: React.FC = () => {\n const status = useSyncExternalStore(\n subscribeWorkerConnection,\n getWorkerConnectionStatus,\n () => CONNECTED,\n );\n\n if (status !== \"lost\") {\n return null;\n }\n\n return (\n <div className=\"absolute inset-x-0 top-0 z-30 flex justify-center p-3\">\n <div className=\"flex max-w-3xl items-center gap-3 rounded-lg border border-destructive bg-warning px-4 py-3 text-sm text-warning-foreground shadow-lg\">\n <div className=\"flex-1\">\n <div className=\"font-semibold\">Lost connection to the reactor</div>\n <div className=\"text-foreground\">\n The background worker stopped responding. Reload to reconnect.\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"rounded-sm bg-primary px-3 py-1 text-sm font-medium text-primary-foreground hover:hover-effect\"\n >\n Reload\n </button>\n </div>\n </div>\n );\n};\n","import {\n CURRENT_PG_MAJOR,\n getCachedMigrationMajor,\n migrateAllIfNeeded,\n subscribeMigrationMajor,\n} from \"@powerhousedao/connect/utils\";\nimport { useReactorClientModule } from \"@powerhousedao/reactor-browser\";\nimport type { IWorkerAdminClient } from \"@powerhousedao/reactor-browser/rpc\";\nimport { useState, useSyncExternalStore } from \"react\";\n\nfunction BannerShell({\n title,\n body,\n error,\n children,\n}: {\n title: string;\n body: string;\n error?: string | null;\n children?: React.ReactNode;\n}) {\n return (\n <div className=\"absolute inset-x-0 top-0 z-30 flex justify-center p-3\">\n <div className=\"flex max-w-3xl items-center gap-3 rounded-lg border border-warning bg-warning px-4 py-3 text-sm text-warning-foreground shadow-lg\">\n <div className=\"flex-1\">\n <div className=\"font-semibold\">{title}</div>\n <div className=\"text-foreground\">{body}</div>\n {error && (\n <div className=\"mt-2 font-medium text-destructive\">\n Migration failed: {error}\n </div>\n )}\n </div>\n {children}\n </div>\n </div>\n );\n}\n\nconst actionButton =\n \"rounded-sm bg-primary px-3 py-1 text-sm font-medium text-primary-foreground hover:hover-effect disabled:disabled-effect\";\nconst dismissButton =\n \"rounded-sm border border-foreground bg-transparent px-3 py-1 text-sm font-medium text-foreground hover:hover-effect disabled:disabled-effect\";\n\nlet browserDismissed = false;\nconst browserListeners = new Set<() => void>();\n\nfunction WorkerMigrationBanner({\n adminClient,\n}: {\n adminClient: IWorkerAdminClient;\n}) {\n const state = useSyncExternalStore(\n (cb) => adminClient.subscribeMigration(cb),\n () => adminClient.getMigrationState(),\n );\n const [dismissed, setDismissed] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n if (state.status === \"idle\") return null;\n if (state.status === \"needed\" && dismissed) return null;\n\n const migrating = state.status === \"migrating\";\n const handleMigrate = () => {\n setError(null);\n adminClient.migrate().catch((err: unknown) => {\n setError(err instanceof Error ? err.message : String(err));\n });\n };\n\n return (\n <BannerShell\n title={\n migrating\n ? `Migrating to Postgres ${CURRENT_PG_MAJOR}…`\n : `Your local database uses Postgres ${state.legacyMajor ?? \"?\"}.`\n }\n body={\n migrating\n ? `Working (${state.phase ?? \"starting\"}). Your data is backed up first.`\n : `Migrate to Postgres ${CURRENT_PG_MAJOR} to pick up the latest features. Your data will be backed up first.`\n }\n error={error ?? (state.status === \"failed\" ? state.error : null)}\n >\n {!migrating && (\n <button type=\"button\" onClick={handleMigrate} className={actionButton}>\n {state.status === \"failed\" ? \"Retry\" : \"Migrate now\"}\n </button>\n )}\n {state.status === \"needed\" && (\n <button\n type=\"button\"\n onClick={() => setDismissed(true)}\n className={dismissButton}\n >\n Dismiss\n </button>\n )}\n </BannerShell>\n );\n}\n\nfunction BrowserMigrationBanner() {\n const isDismissed = useSyncExternalStore(\n (cb) => {\n browserListeners.add(cb);\n return () => browserListeners.delete(cb);\n },\n () => browserDismissed,\n () => false,\n );\n const major = useSyncExternalStore(\n subscribeMigrationMajor,\n getCachedMigrationMajor,\n () => undefined,\n );\n const [migrating, setMigrating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n if (major === undefined || major === null || major === CURRENT_PG_MAJOR) {\n return null;\n }\n if (isDismissed) return null;\n\n const handleMigrate = () => {\n setError(null);\n setMigrating(true);\n migrateAllIfNeeded()\n .then(() => window.location.reload())\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : String(err));\n setMigrating(false);\n });\n };\n\n return (\n <BannerShell\n title={`Your local database uses Postgres ${major}.`}\n body={`Migrate to Postgres ${CURRENT_PG_MAJOR} to pick up the latest features. Your data will be backed up first.`}\n error={error}\n >\n <button\n type=\"button\"\n disabled={migrating}\n onClick={handleMigrate}\n className={actionButton}\n >\n {migrating ? \"Migrating…\" : \"Migrate now\"}\n </button>\n <button\n type=\"button\"\n disabled={migrating}\n onClick={() => {\n browserDismissed = true;\n for (const l of browserListeners) l();\n }}\n className={dismissButton}\n >\n Dismiss\n </button>\n </BannerShell>\n );\n}\n\nexport const MigrationBanner: React.FC = () => {\n const module = useReactorClientModule();\n if (module?.kind === \"worker\") {\n return <WorkerMigrationBanner adminClient={module.adminClient} />;\n }\n return <BrowserMigrationBanner />;\n};\n","import { usePHModal } from \"@powerhousedao/reactor-browser\";\nimport { lazy, Suspense } from \"react\";\nimport { ErrorBoundary } from \"../error-boundary.js\";\n\nconst AddDriveModal = lazy(() =>\n import(\"./modals/AddDriveModal.js\").then((m) => ({\n default: m.AddDriveModal,\n })),\n);\nconst ClearStorageModal = lazy(() =>\n import(\"./modals/ClearStorageModal.js\").then((m) => ({\n default: m.ClearStorageModal,\n })),\n);\nconst CookiesPolicyModal = lazy(() =>\n import(\"./modals/CookiesPolicyModal.js\").then((m) => ({\n default: m.CookiesPolicyModal,\n })),\n);\nconst CreateDocumentModal = lazy(() =>\n import(\"./modals/CreateDocumentModal.js\").then((m) => ({\n default: m.CreateDocumentModal,\n })),\n);\nconst DebugSettingsModal = lazy(() =>\n import(\"./modals/DebugSettingsModal.js\").then((m) => ({\n default: m.DebugSettingsModal,\n })),\n);\nconst DeleteDriveModal = lazy(() =>\n import(\"./modals/DeleteDriveModal.js\").then((m) => ({\n default: m.DeleteDriveModal,\n })),\n);\nconst DeleteItemModal = lazy(() =>\n import(\"./modals/DeleteItemModal.js\").then((m) => ({\n default: m.DeleteItemModal,\n })),\n);\nconst DisclaimerModal = lazy(() =>\n import(\"./modals/DisclaimerModal.js\").then((m) => ({\n default: m.DisclaimerModal,\n })),\n);\nconst DriveSettingsModal = lazy(() =>\n import(\"./modals/DriveSettingsModal.js\").then((m) => ({\n default: m.DriveSettingsModal,\n })),\n);\nconst DownloadDocumentWithErrorsModal = lazy(() =>\n import(\"./modals/DownloadDocumentWithErrorsModal.js\").then((m) => ({\n default: m.DownloadDocumentWithErrorsModal,\n })),\n);\nconst SettingsModal = lazy(() =>\n import(\"./modals/SettingsModal.js\").then((m) => ({\n default: m.SettingsModal,\n })),\n);\nconst UpgradeDriveModal = lazy(() =>\n import(\"./modals/UpgradeDriveModal.js\").then((m) => ({\n default: m.UpgradeDriveModal,\n })),\n);\nconst InspectorModal = lazy(() =>\n import(\"./modals/InspectorModal/index.js\").then((m) => ({\n default: m.InspectorModal,\n })),\n);\nconst MissingPackageModal = lazy(() =>\n import(\"./modals/MissingPackageModal.js\").then((m) => ({\n default: m.ConnectMissingPackageModal,\n })),\n);\nconst DriveAuthRequiredModal = lazy(() =>\n import(\"./modals/DriveAuthRequiredModal.js\").then((m) => ({\n default: m.DriveAuthRequiredModal,\n })),\n);\nconst modalComponents = {\n addDrive: AddDriveModal,\n clearStorage: ClearStorageModal,\n cookiesPolicy: CookiesPolicyModal,\n createDocument: CreateDocumentModal,\n debugSettings: DebugSettingsModal,\n deleteDrive: DeleteDriveModal,\n deleteItem: DeleteItemModal,\n disclaimer: DisclaimerModal,\n driveSettings: DriveSettingsModal,\n downloadDocumentWithErrors: DownloadDocumentWithErrorsModal,\n inspector: InspectorModal,\n settings: SettingsModal,\n upgradeDrive: UpgradeDriveModal,\n missingPackage: MissingPackageModal,\n driveAuthRequired: DriveAuthRequiredModal,\n} as const;\n\nexport const ModalsContainer = lazy(() => {\n return Promise.resolve({\n default: () => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const phModal = usePHModal();\n\n if (!phModal?.type) return null;\n\n const ModalComponent = modalComponents[phModal.type];\n\n return ModalComponent ? (\n <ErrorBoundary variant=\"silent\" loggerContext={[\"Connect\", \"Modals\"]}>\n <Suspense fallback={null}>\n <ModalComponent />\n </Suspense>\n </ErrorBoundary>\n ) : null;\n },\n });\n});\n","import {\n getServiceWorkerUpdateAvailable,\n serviceWorkerManager,\n subscribeServiceWorkerUpdate,\n} from \"@powerhousedao/connect/utils\";\nimport { useSyncExternalStore } from \"react\";\n\n// Prompts the user to load a waiting service-worker update, so a new version\n// never reloads over in-progress work.\nexport const ServiceWorkerUpdatePrompt: React.FC = () => {\n const updateAvailable = useSyncExternalStore(\n subscribeServiceWorkerUpdate,\n getServiceWorkerUpdateAvailable,\n () => false,\n );\n\n if (!updateAvailable) return null;\n\n return (\n <div className=\"absolute inset-x-0 bottom-0 z-30 flex justify-center p-3\">\n <div className=\"flex max-w-3xl items-center gap-3 rounded-lg border border-foreground bg-primary px-4 py-3 text-sm text-primary-foreground shadow-lg\">\n <div className=\"flex-1 font-medium\">\n A new version of Connect is available.\n </div>\n <button\n type=\"button\"\n onClick={() => serviceWorkerManager.applyUpdate()}\n className=\"rounded-sm bg-primary-foreground px-3 py-1 text-sm font-medium text-primary hover:hover-effect\"\n >\n Refresh\n </button>\n </div>\n </div>\n );\n};\n","import \"@powerhousedao/connect/i18n\";\nimport type { DocumentModelLib } from \"document-model\";\nimport { lazy, StrictMode, Suspense } from \"react\";\nimport AppSkeleton from \"./app-skeleton.js\";\nimport { DetailedFallback, ErrorBoundary } from \"./error-boundary.js\";\nimport { App, CookieBanner } from \"./index.js\";\nimport { ConnectionBanner } from \"./connection-banner.js\";\nimport { MigrationBanner } from \"./migration-banner.js\";\nimport { ModalsContainer } from \"./modal/modals-container.js\";\nimport { ServiceWorkerUpdatePrompt } from \"./service-worker-update-prompt.js\";\n\nexport const AppLoader = (props: { localPackage?: DocumentModelLib }) => {\n const Load = lazy(() =>\n import(\"./load.js\").then((m) => m.loadComponent(props.localPackage)),\n );\n return (\n <StrictMode>\n <ErrorBoundary\n fallbackRender={(props) => (\n <AppSkeleton children={<DetailedFallback {...props} />} />\n )}\n resetKeys={[props.localPackage]}\n loggerContext={[\"Connect\"]}\n >\n <Suspense fallback={<AppSkeleton />} name=\"AppLoader\">\n {/* eslint-disable-next-line react-hooks/static-components */}\n <Load {...props}>\n <App />\n </Load>\n </Suspense>\n <Suspense name=\"CookieBanner\">\n <CookieBanner />\n </Suspense>\n <Suspense name=\"ModalsContainer\">\n <ModalsContainer />\n </Suspense>\n <MigrationBanner />\n <ServiceWorkerUpdatePrompt />\n <ConnectionBanner />\n </ErrorBoundary>\n </StrictMode>\n );\n};\n"],"names":["listeners","listeners","getInitial","subscribe","rawEvents","emptyArray","logger","logger","ErrorBoundary","ReactErrorBoundary","ErrorBoundary","CookieBanner","PHCookieBanner","ErrorBoundary","ErrorBoundary","AddDriveModal","CreateDocumentModal","DriveSettingsModal","SettingsModal","ErrorBoundary","ErrorBoundary","CookieBanner"],"mappings":"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","debug_id":"71b80a7f-acde-5be6-8882-b7ad10f2ec2e"}
@@ -1,4 +0,0 @@
1
- import { t as AppLoader } from "./app-loader-CJrQEUby.js";
2
- export { AppLoader };
3
- !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]="e3e3b5ec-4fcd-5a9b-9740-319355b806ef")}catch(e){}}();
4
- //# debugId=e3e3b5ec-4fcd-5a9b-9740-319355b806ef
@@ -1,5 +0,0 @@
1
- import "./reload-connect-toast-D1Iqw9E_.js";
2
- import { t as AppLoader } from "./app-loader-CJrQEUby.js";
3
- export { AppLoader };
4
- !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]="ff74b1bd-d268-5aaa-a3c1-40a96f546c1b")}catch(e){}}();
5
- //# debugId=ff74b1bd-d268-5aaa-a3c1-40a96f546c1b
@@ -1,123 +0,0 @@
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]="3d461450-bb34-5169-9062-77a7f5e78a09")}catch(e){}}();
3
- import { n as getRuntimeConfig } from "./runtime-config-DL3QjcfM.js";
4
- import { n as isMigratableMajor, t as coerceMajor, u as readPgVersionFile } from "./pglite-major-B39aOEiE.js";
5
- import { t as PH_CONNECT_BASE_PATH } from "./connect.config-p8UTNojR.js";
6
- import { ROOT_STORAGE_NAMESPACE, getStorageNamespace } from "@powerhousedao/shared/connect";
7
- import { DEFAULT_RELATIONAL_PROCESSOR_DB_NAME, hashNamespace } from "@powerhousedao/shared/processors";
8
- //#region src/utils/reactor-namespace.ts
9
- function resolveReactorNamespace(input) {
10
- const explicit = input.explicit?.trim();
11
- if (explicit) return explicit;
12
- const base = getStorageNamespace(input.basePath);
13
- const endpoint = input.endpoint?.trim();
14
- if (endpoint) return `${base}--${hashNamespace(endpoint, 8)}`;
15
- return base;
16
- }
17
- //#endregion
18
- //#region src/utils/storage-namespace.ts
19
- const REACTOR_INSTANCE_NAMESPACE = resolveReactorNamespace({
20
- basePath: PH_CONNECT_BASE_PATH,
21
- explicit: getRuntimeConfig().connect.instance?.namespace ?? void 0
22
- });
23
- const REACTOR_PGLITE_NAME = REACTOR_INSTANCE_NAMESPACE;
24
- const RELATIONAL_PGLITE_NAME = REACTOR_INSTANCE_NAMESPACE === ROOT_STORAGE_NAMESPACE ? DEFAULT_RELATIONAL_PROCESSOR_DB_NAME : `${REACTOR_INSTANCE_NAMESPACE}-${DEFAULT_RELATIONAL_PROCESSOR_DB_NAME}`;
25
- const REACTOR_IDB_NAME = `/pglite/${REACTOR_PGLITE_NAME}`;
26
- const RELATIONAL_IDB_NAME = `/pglite/${RELATIONAL_PGLITE_NAME}`;
27
- const PRIMARY_IDB_NAMES = [REACTOR_IDB_NAME, RELATIONAL_IDB_NAME];
28
- //#endregion
29
- //#region src/utils/pglite-runtime.ts
30
- let cachedReactorMajor;
31
- let inflight;
32
- const majorListeners = /* @__PURE__ */ new Set();
33
- let cachedMigrationMajor;
34
- let migrationInflight;
35
- const migrationListeners = /* @__PURE__ */ new Set();
36
- function notifyMajorChanged() {
37
- for (const l of majorListeners) l();
38
- }
39
- function notifyMigrationChanged() {
40
- for (const l of migrationListeners) l();
41
- }
42
- function subscribeReactorPgMajor(cb) {
43
- majorListeners.add(cb);
44
- return () => {
45
- majorListeners.delete(cb);
46
- };
47
- }
48
- async function detectReactorPgMajor() {
49
- if (cachedReactorMajor !== void 0) return cachedReactorMajor;
50
- if (inflight) return inflight;
51
- inflight = (async () => {
52
- const major = coerceMajor(await readPgVersionFile(REACTOR_IDB_NAME));
53
- cachedReactorMajor = major;
54
- notifyMajorChanged();
55
- return major;
56
- })();
57
- try {
58
- return await inflight;
59
- } finally {
60
- inflight = void 0;
61
- }
62
- }
63
- function getCachedReactorPgMajor() {
64
- return cachedReactorMajor;
65
- }
66
- function invalidateReactorPgMajorCache() {
67
- cachedReactorMajor = void 0;
68
- cachedMigrationMajor = void 0;
69
- notifyMajorChanged();
70
- notifyMigrationChanged();
71
- }
72
- function subscribeMigrationMajor(cb) {
73
- migrationListeners.add(cb);
74
- return () => {
75
- migrationListeners.delete(cb);
76
- };
77
- }
78
- function getCachedMigrationMajor() {
79
- return cachedMigrationMajor;
80
- }
81
- /**
82
- * Legacy major the migration banner should prompt for: the first primary store
83
- * (reactor or relational) on a supported, non-current major. Spans both stores
84
- * to match migrateAllIfNeeded.
85
- */
86
- async function detectMigrationMajor() {
87
- if (cachedMigrationMajor !== void 0) return cachedMigrationMajor;
88
- if (migrationInflight) return migrationInflight;
89
- migrationInflight = (async () => {
90
- const legacy = (await Promise.all([readPgVersionFile(REACTOR_IDB_NAME), readPgVersionFile(RELATIONAL_IDB_NAME)])).find(isMigratableMajor) ?? null;
91
- cachedMigrationMajor = legacy;
92
- notifyMigrationChanged();
93
- return legacy;
94
- })();
95
- try {
96
- return await migrationInflight;
97
- } finally {
98
- migrationInflight = void 0;
99
- }
100
- }
101
- //#endregion
102
- //#region src/connection-state.ts
103
- let status = "connected";
104
- const listeners = /* @__PURE__ */ new Set();
105
- function getWorkerConnectionStatus() {
106
- return status;
107
- }
108
- function setWorkerConnectionStatus(next) {
109
- if (status === next) return;
110
- status = next;
111
- for (const listener of [...listeners]) listener();
112
- }
113
- function subscribeWorkerConnection(listener) {
114
- listeners.add(listener);
115
- return () => {
116
- listeners.delete(listener);
117
- };
118
- }
119
- //#endregion
120
- export { detectReactorPgMajor as a, invalidateReactorPgMajorCache as c, PRIMARY_IDB_NAMES as d, REACTOR_INSTANCE_NAMESPACE as f, detectMigrationMajor as i, subscribeMigrationMajor as l, RELATIONAL_PGLITE_NAME as m, setWorkerConnectionStatus as n, getCachedMigrationMajor as o, REACTOR_PGLITE_NAME as p, subscribeWorkerConnection as r, getCachedReactorPgMajor as s, getWorkerConnectionStatus as t, subscribeReactorPgMajor as u };
121
-
122
- //# sourceMappingURL=connection-state-B7b2E8-L.js.map
123
- //# debugId=3d461450-bb34-5169-9062-77a7f5e78a09
@@ -1 +0,0 @@
1
- {"version":3,"file":"connection-state-B7b2E8-L.js","sources":["../src/utils/reactor-namespace.ts","../src/utils/storage-namespace.ts","../src/utils/pglite-runtime.ts","../src/connection-state.ts"],"sourcesContent":["import { getStorageNamespace } from \"@powerhousedao/shared/connect\";\nimport { hashNamespace } from \"@powerhousedao/shared/processors\";\n\nexport type ReactorNamespaceInput = {\n basePath: string;\n explicit?: string;\n endpoint?: string;\n};\n\nexport function resolveReactorNamespace(input: ReactorNamespaceInput): string {\n const explicit = input.explicit?.trim();\n if (explicit) {\n return explicit;\n }\n const base = getStorageNamespace(input.basePath);\n const endpoint = input.endpoint?.trim();\n if (endpoint) {\n return `${base}--${hashNamespace(endpoint, 8)}`;\n }\n return base;\n}\n","import { DEFAULT_RELATIONAL_PROCESSOR_DB_NAME } from \"@powerhousedao/shared/processors\";\nimport { ROOT_STORAGE_NAMESPACE } from \"@powerhousedao/shared/connect\";\nimport { PH_CONNECT_BASE_PATH } from \"../connect.config.js\";\nimport { getRuntimeConfig } from \"../runtime-config.js\";\nimport { resolveReactorNamespace } from \"./reactor-namespace.js\";\n\nexport const REACTOR_INSTANCE_NAMESPACE = resolveReactorNamespace({\n basePath: PH_CONNECT_BASE_PATH,\n explicit: getRuntimeConfig().connect.instance?.namespace ?? undefined,\n});\n\nexport const REACTOR_PGLITE_NAME = REACTOR_INSTANCE_NAMESPACE;\n\nexport const RELATIONAL_PGLITE_NAME =\n REACTOR_INSTANCE_NAMESPACE === ROOT_STORAGE_NAMESPACE\n ? DEFAULT_RELATIONAL_PROCESSOR_DB_NAME\n : `${REACTOR_INSTANCE_NAMESPACE}-${DEFAULT_RELATIONAL_PROCESSOR_DB_NAME}`;\n\n// Here, not pglite-idb.ts, so those IDB helpers stay free of runtime-config\n// and remain importable by the reactor SharedWorker.\nexport const REACTOR_IDB_NAME = `/pglite/${REACTOR_PGLITE_NAME}`;\nexport const RELATIONAL_IDB_NAME = `/pglite/${RELATIONAL_PGLITE_NAME}`;\nexport const PRIMARY_IDB_NAMES = [\n REACTOR_IDB_NAME,\n RELATIONAL_IDB_NAME,\n] as const;\n","import { readPgVersionFile } from \"./pglite-idb.js\";\nimport {\n coerceMajor,\n isMigratableMajor,\n type DetectedMajor,\n} from \"./pglite-major.js\";\nimport { REACTOR_IDB_NAME, RELATIONAL_IDB_NAME } from \"./storage-namespace.js\";\n\nexport {\n CURRENT_PG_MAJOR,\n SUPPORTED_PG_MAJORS,\n coerceMajor,\n resolvePgMajorForRuntime,\n loadPGliteModule,\n loadPgDump,\n type SupportedPgMajor,\n type DetectedMajor,\n} from \"./pglite-major.js\";\n\nlet cachedReactorMajor: DetectedMajor | undefined;\nlet inflight: Promise<DetectedMajor> | undefined;\nconst majorListeners = new Set<() => void>();\n\nlet cachedMigrationMajor: DetectedMajor | undefined;\nlet migrationInflight: Promise<DetectedMajor> | undefined;\nconst migrationListeners = new Set<() => void>();\n\nfunction notifyMajorChanged() {\n for (const l of majorListeners) l();\n}\n\nfunction notifyMigrationChanged() {\n for (const l of migrationListeners) l();\n}\n\nexport function subscribeReactorPgMajor(cb: () => void): () => void {\n majorListeners.add(cb);\n return () => {\n majorListeners.delete(cb);\n };\n}\n\nexport async function detectReactorPgMajor(): Promise<DetectedMajor> {\n if (cachedReactorMajor !== undefined) return cachedReactorMajor;\n if (inflight) return inflight;\n\n inflight = (async () => {\n const major = coerceMajor(await readPgVersionFile(REACTOR_IDB_NAME));\n cachedReactorMajor = major;\n notifyMajorChanged();\n return major;\n })();\n try {\n return await inflight;\n } finally {\n inflight = undefined;\n }\n}\n\nexport function getCachedReactorPgMajor(): DetectedMajor | undefined {\n return cachedReactorMajor;\n}\n\nexport function invalidateReactorPgMajorCache(): void {\n cachedReactorMajor = undefined;\n cachedMigrationMajor = undefined;\n notifyMajorChanged();\n notifyMigrationChanged();\n}\n\nexport async function detectRelationalPgMajor(): Promise<DetectedMajor> {\n return coerceMajor(await readPgVersionFile(RELATIONAL_IDB_NAME));\n}\n\nexport function subscribeMigrationMajor(cb: () => void): () => void {\n migrationListeners.add(cb);\n return () => {\n migrationListeners.delete(cb);\n };\n}\n\nexport function getCachedMigrationMajor(): DetectedMajor | undefined {\n return cachedMigrationMajor;\n}\n\n/**\n * Legacy major the migration banner should prompt for: the first primary store\n * (reactor or relational) on a supported, non-current major. Spans both stores\n * to match migrateAllIfNeeded.\n */\nexport async function detectMigrationMajor(): Promise<DetectedMajor> {\n if (cachedMigrationMajor !== undefined) return cachedMigrationMajor;\n if (migrationInflight) return migrationInflight;\n\n migrationInflight = (async () => {\n const majors = await Promise.all([\n readPgVersionFile(REACTOR_IDB_NAME),\n readPgVersionFile(RELATIONAL_IDB_NAME),\n ]);\n const legacy = majors.find(isMigratableMajor) ?? null;\n cachedMigrationMajor = legacy;\n notifyMigrationChanged();\n return legacy;\n })();\n try {\n return await migrationInflight;\n } finally {\n migrationInflight = undefined;\n }\n}\n","export type WorkerConnectionStatus = \"connected\" | \"lost\";\n\nlet status: WorkerConnectionStatus = \"connected\";\nconst listeners = new Set<() => void>();\n\nexport function getWorkerConnectionStatus(): WorkerConnectionStatus {\n return status;\n}\n\nexport function setWorkerConnectionStatus(next: WorkerConnectionStatus): void {\n if (status === next) {\n return;\n }\n status = next;\n for (const listener of [...listeners]) {\n listener();\n }\n}\n\nexport function subscribeWorkerConnection(listener: () => void): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n"],"names":[],"mappings":";;;;;;;;AASA,SAAgB,wBAAwB,OAAsC;CAC5E,MAAM,WAAW,MAAM,UAAU,MAAM;AACvC,KAAI,SACF,QAAO;CAET,MAAM,OAAO,oBAAoB,MAAM,SAAS;CAChD,MAAM,WAAW,MAAM,UAAU,MAAM;AACvC,KAAI,SACF,QAAO,GAAG,KAAK,IAAI,cAAc,UAAU,EAAE;AAE/C,QAAO;;;;ACbT,MAAa,6BAA6B,wBAAwB;CAChE,UAAU;CACV,UAAU,kBAAkB,CAAC,QAAQ,UAAU,aAAa,KAAA;CAC7D,CAAC;AAEF,MAAa,sBAAsB;AAEnC,MAAa,yBACX,+BAA+B,yBAC3B,uCACA,GAAG,2BAA2B,GAAG;AAIvC,MAAa,mBAAmB,WAAW;AAC3C,MAAa,sBAAsB,WAAW;AAC9C,MAAa,oBAAoB,CAC/B,kBACA,oBACD;;;ACND,IAAI;AACJ,IAAI;AACJ,MAAM,iCAAiB,IAAI,KAAiB;AAE5C,IAAI;AACJ,IAAI;AACJ,MAAM,qCAAqB,IAAI,KAAiB;AAEhD,SAAS,qBAAqB;AAC5B,MAAK,MAAM,KAAK,eAAgB,IAAG;;AAGrC,SAAS,yBAAyB;AAChC,MAAK,MAAM,KAAK,mBAAoB,IAAG;;AAGzC,SAAgB,wBAAwB,IAA4B;AAClE,gBAAe,IAAI,GAAG;AACtB,cAAa;AACX,iBAAe,OAAO,GAAG;;;AAI7B,eAAsB,uBAA+C;AACnE,KAAI,uBAAuB,KAAA,EAAW,QAAO;AAC7C,KAAI,SAAU,QAAO;AAErB,aAAY,YAAY;EACtB,MAAM,QAAQ,YAAY,MAAM,kBAAkB,iBAAiB,CAAC;AACpE,uBAAqB;AACrB,sBAAoB;AACpB,SAAO;KACL;AACJ,KAAI;AACF,SAAO,MAAM;WACL;AACR,aAAW,KAAA;;;AAIf,SAAgB,0BAAqD;AACnE,QAAO;;AAGT,SAAgB,gCAAsC;AACpD,sBAAqB,KAAA;AACrB,wBAAuB,KAAA;AACvB,qBAAoB;AACpB,yBAAwB;;AAO1B,SAAgB,wBAAwB,IAA4B;AAClE,oBAAmB,IAAI,GAAG;AAC1B,cAAa;AACX,qBAAmB,OAAO,GAAG;;;AAIjC,SAAgB,0BAAqD;AACnE,QAAO;;;;;;;AAQT,eAAsB,uBAA+C;AACnE,KAAI,yBAAyB,KAAA,EAAW,QAAO;AAC/C,KAAI,kBAAmB,QAAO;AAE9B,sBAAqB,YAAY;EAK/B,MAAM,UAJS,MAAM,QAAQ,IAAI,CAC/B,kBAAkB,iBAAiB,EACnC,kBAAkB,oBAAoB,CACvC,CAAC,EACoB,KAAK,kBAAkB,IAAI;AACjD,yBAAuB;AACvB,0BAAwB;AACxB,SAAO;KACL;AACJ,KAAI;AACF,SAAO,MAAM;WACL;AACR,sBAAoB,KAAA;;;;;ACzGxB,IAAI,SAAiC;AACrC,MAAM,4BAAY,IAAI,KAAiB;AAEvC,SAAgB,4BAAoD;AAClE,QAAO;;AAGT,SAAgB,0BAA0B,MAAoC;AAC5E,KAAI,WAAW,KACb;AAEF,UAAS;AACT,MAAK,MAAM,YAAY,CAAC,GAAG,UAAU,CACnC,WAAU;;AAId,SAAgB,0BAA0B,UAAkC;AAC1E,WAAU,IAAI,SAAS;AACvB,cAAa;AACX,YAAU,OAAO,SAAS","debug_id":"3d461450-bb34-5169-9062-77a7f5e78a09"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"package-CSEQB3Fe.js","sources":["../package.json"],"sourcesContent":[""],"names":[],"mappings":"","debug_id":"2c295f11-bafa-5c8d-a84f-030da266a328"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pglite-major-B39aOEiE.js","sources":["../src/utils/pglite-idb.ts","../src/utils/pglite-major.ts"],"sourcesContent":["export const IDB_STORE_NAME = \"FILE_DATA\";\nexport const IDB_DB_VERSION = 21;\n\ntype FileDataValue = {\n contents: Uint8Array | number[];\n mode: number;\n timestamp: Date | number;\n};\n\nexport function idbError(\n req: IDBRequest | IDBTransaction,\n context: string,\n): Error {\n const cause = req.error ?? new Error(\"unknown IDB error\");\n return new Error(`${context}: ${cause.message}`, { cause });\n}\n\nexport function indexedDbExists(name: string): Promise<boolean> {\n if (typeof indexedDB.databases === \"function\") {\n return indexedDB\n .databases()\n .then((dbs) => dbs.some((d) => d.name === name))\n .catch(() => true);\n }\n return Promise.resolve(true);\n}\n\nexport function openIdb(\n name: string,\n version: number,\n upgrade?: (db: IDBDatabase) => void,\n): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(name, version);\n req.onerror = () => reject(idbError(req, `IDB open failed for ${name}`));\n req.onblocked = () => reject(new Error(`IDB open blocked for ${name}`));\n req.onupgradeneeded = () => upgrade?.(req.result);\n req.onsuccess = () => resolve(req.result);\n });\n}\n\nexport function createFileDataStore(db: IDBDatabase): void {\n if (!db.objectStoreNames.contains(IDB_STORE_NAME)) {\n const store = db.createObjectStore(IDB_STORE_NAME);\n store.createIndex(\"timestamp\", \"timestamp\", { unique: false });\n }\n}\n\nexport async function readPgVersionFile(\n idbName: string,\n): Promise<number | null> {\n if (!(await indexedDbExists(idbName))) return null;\n let db: IDBDatabase;\n try {\n db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);\n } catch {\n return null;\n }\n try {\n if (!db.objectStoreNames.contains(IDB_STORE_NAME)) return null;\n const tx = db.transaction(IDB_STORE_NAME, \"readonly\");\n const store = tx.objectStore(IDB_STORE_NAME);\n const value = await new Promise<FileDataValue | null>((resolve, reject) => {\n const req = store.openCursor();\n req.onerror = () =>\n reject(idbError(req, `FILE_DATA cursor failed for ${idbName}`));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) return resolve(null);\n const key = typeof cursor.key === \"string\" ? cursor.key : \"\";\n if (key.endsWith(\"/PG_VERSION\")) {\n resolve(cursor.value as FileDataValue);\n } else {\n cursor.continue();\n }\n };\n });\n if (!value) return null;\n const bytes =\n value.contents instanceof Uint8Array\n ? value.contents\n : new Uint8Array(value.contents);\n const text = new TextDecoder().decode(bytes).trim();\n const major = parseInt(text, 10);\n return Number.isFinite(major) ? major : null;\n } finally {\n db.close();\n }\n}\n","import type * as CurrentPGliteModuleNs from \"@electric-sql/pglite\";\n\nexport const CURRENT_PG_MAJOR = 17;\nexport const SUPPORTED_PG_MAJORS = [16, 17] as const;\nexport type SupportedPgMajor = (typeof SUPPORTED_PG_MAJORS)[number];\nexport type DetectedMajor = SupportedPgMajor | null;\n\ntype CurrentPGliteModule = typeof CurrentPGliteModuleNs;\n\nexport function coerceMajor(value: number | null): DetectedMajor {\n if (value === null) return null;\n return (SUPPORTED_PG_MAJORS as readonly number[]).includes(value)\n ? (value as SupportedPgMajor)\n : null;\n}\n\nexport function isMigratableMajor(\n value: number | null,\n): value is SupportedPgMajor {\n const major = coerceMajor(value);\n return major !== null && major !== CURRENT_PG_MAJOR;\n}\n\n/**\n * Pick the PGlite major to use for *new* reactor clients: fall back to the\n * current version when there is no existing data dir.\n */\nexport function resolvePgMajorForRuntime(\n detected: DetectedMajor,\n): SupportedPgMajor {\n return detected ?? CURRENT_PG_MAJOR;\n}\n\n/**\n * Loads the PGlite module that matches an on-disk data dir major version.\n *\n * The 0.2.x and 0.3.x modules expose the same runtime interface (PGlite class,\n * `idb://` data-dir support, waitReady, exec/query/transaction, close). The\n * return type is pinned to the current package's module so callers can use it\n * against `kysely-pglite-dialect` which peer-depends on both majors.\n */\nexport async function loadPGliteModule(\n major: SupportedPgMajor,\n): Promise<CurrentPGliteModule> {\n if (major === 16) {\n return (await import(\"pglite-legacy-02\")) as unknown as CurrentPGliteModule;\n }\n if (major === 17) return import(\"@electric-sql/pglite\");\n throw new Error(`Unsupported PGlite major: ${String(major)}`);\n}\n\ntype PgDumpFn = (options: {\n pg: unknown;\n}) => Promise<{ text(): Promise<string> }>;\n\n/**\n * Loads the pg_dump tool for the given PGlite major. pg_dump's VFS layout is\n * version-specific, so using the wrong major against a live PGlite instance\n * fails with Emscripten ENOENT (errno 44).\n */\nexport async function loadPgDump(major: SupportedPgMajor): Promise<PgDumpFn> {\n if (major === 16) {\n const mod = (await import(\"pglite-tools-legacy-02/pg_dump\")) as {\n pgDump: PgDumpFn;\n };\n return mod.pgDump;\n }\n if (major === 17) {\n const mod = (await import(\"@electric-sql/pglite-tools/pg_dump\")) as {\n pgDump: PgDumpFn;\n };\n return mod.pgDump;\n }\n throw new Error(`Unsupported PGlite major: ${String(major)}`);\n}\n"],"names":[],"mappings":"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","debug_id":"ddbad278-3c18-5b56-abbb-371faa5f9b3a"}