@powerhousedao/connect 6.0.0-dev.176 → 6.0.0-dev.178

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.
@@ -1,4 +1,4 @@
1
- import { t as clearReactorStorage } from "./reactor-Cc15SaWl.js";
1
+ import { t as clearReactorStorage } from "./reactor-c5gHyb6M.js";
2
2
  import { closePHModal, setSelectedDrive, setSelectedNode, showPHModal, usePHModal } from "@powerhousedao/reactor-browser";
3
3
  import { childLogger } from "document-model";
4
4
  import { useState } from "react";
@@ -41,4 +41,4 @@ function ClearStorageModal() {
41
41
  //#endregion
42
42
  export { ClearStorageModal };
43
43
 
44
- //# sourceMappingURL=ClearStorageModal-Bzf3Ys-O.js.map
44
+ //# sourceMappingURL=ClearStorageModal-lyh2_0P5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClearStorageModal-Bzf3Ys-O.js","names":["logger"],"sources":["../src/components/modal/modals/ClearStorageModal.tsx"],"sourcesContent":["import { clearReactorStorage } from \"@powerhousedao/connect/store\";\nimport { ConnectConfirmationModal } from \"@powerhousedao/design-system/connect\";\nimport {\n closePHModal,\n setSelectedDrive,\n setSelectedNode,\n showPHModal,\n usePHModal,\n} from \"@powerhousedao/reactor-browser\";\nimport { childLogger } from \"document-model\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nconst logger = childLogger([\"ClearStorage\"]);\n\nexport function ClearStorageModal() {\n const phModal = usePHModal();\n const open = phModal?.type === \"clearStorage\";\n const { t } = useTranslation();\n const [loading, setLoading] = useState(false);\n\n function clearStorage() {\n setLoading(true);\n clearReactorStorage()\n .then(() => {\n logger.info(\"Storage cleared\");\n setSelectedDrive(undefined);\n setSelectedNode(undefined);\n window.location.reload();\n })\n .catch((error) => {\n logger.error(\"Error clearing storage: @error\", error);\n setLoading(false);\n });\n }\n\n return (\n <ConnectConfirmationModal\n open={open}\n header={t(\"modals.connectSettings.clearStorage.confirmation.title\")}\n title={t(\"modals.connectSettings.clearStorage.confirmation.title\")}\n body={t(\"modals.connectSettings.clearStorage.confirmation.body\")}\n cancelLabel={t(\"common.cancel\")}\n continueLabel={t(\n \"modals.connectSettings.clearStorage.confirmation.clearButton\",\n )}\n onCancel={() => showPHModal({ type: \"settings\" })}\n onContinue={clearStorage}\n onOpenChange={(status: boolean) => {\n if (!status) return closePHModal();\n }}\n continueButtonProps={{\n disabled: loading,\n }}\n />\n );\n}\n"],"mappings":";;;;;;;;AAaA,MAAMA,WAAS,YAAY,CAAC,eAAe,CAAC;AAE5C,SAAgB,oBAAoB;CAElC,MAAM,OADU,YAAY,EACN,SAAS;CAC/B,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAE7C,SAAS,eAAe;AACtB,aAAW,KAAK;AAChB,uBAAqB,CAClB,WAAW;AACV,YAAO,KAAK,kBAAkB;AAC9B,oBAAiB,KAAA,EAAU;AAC3B,mBAAgB,KAAA,EAAU;AAC1B,UAAO,SAAS,QAAQ;IACxB,CACD,OAAO,UAAU;AAChB,YAAO,MAAM,kCAAkC,MAAM;AACrD,cAAW,MAAM;IACjB;;AAGN,QACE,oBAAC,0BAAD;EACQ;EACN,QAAQ,EAAE,yDAAyD;EACnE,OAAO,EAAE,yDAAyD;EAClE,MAAM,EAAE,wDAAwD;EAChE,aAAa,EAAE,gBAAgB;EAC/B,eAAe,EACb,+DACD;EACD,gBAAgB,YAAY,EAAE,MAAM,YAAY,CAAC;EACjD,YAAY;EACZ,eAAe,WAAoB;AACjC,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,qBAAqB,EACnB,UAAU,SACX;EACD,CAAA"}
1
+ {"version":3,"file":"ClearStorageModal-lyh2_0P5.js","names":["logger"],"sources":["../src/components/modal/modals/ClearStorageModal.tsx"],"sourcesContent":["import { clearReactorStorage } from \"@powerhousedao/connect/store\";\nimport { ConnectConfirmationModal } from \"@powerhousedao/design-system/connect\";\nimport {\n closePHModal,\n setSelectedDrive,\n setSelectedNode,\n showPHModal,\n usePHModal,\n} from \"@powerhousedao/reactor-browser\";\nimport { childLogger } from \"document-model\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nconst logger = childLogger([\"ClearStorage\"]);\n\nexport function ClearStorageModal() {\n const phModal = usePHModal();\n const open = phModal?.type === \"clearStorage\";\n const { t } = useTranslation();\n const [loading, setLoading] = useState(false);\n\n function clearStorage() {\n setLoading(true);\n clearReactorStorage()\n .then(() => {\n logger.info(\"Storage cleared\");\n setSelectedDrive(undefined);\n setSelectedNode(undefined);\n window.location.reload();\n })\n .catch((error) => {\n logger.error(\"Error clearing storage: @error\", error);\n setLoading(false);\n });\n }\n\n return (\n <ConnectConfirmationModal\n open={open}\n header={t(\"modals.connectSettings.clearStorage.confirmation.title\")}\n title={t(\"modals.connectSettings.clearStorage.confirmation.title\")}\n body={t(\"modals.connectSettings.clearStorage.confirmation.body\")}\n cancelLabel={t(\"common.cancel\")}\n continueLabel={t(\n \"modals.connectSettings.clearStorage.confirmation.clearButton\",\n )}\n onCancel={() => showPHModal({ type: \"settings\" })}\n onContinue={clearStorage}\n onOpenChange={(status: boolean) => {\n if (!status) return closePHModal();\n }}\n continueButtonProps={{\n disabled: loading,\n }}\n />\n );\n}\n"],"mappings":";;;;;;;;AAaA,MAAMA,WAAS,YAAY,CAAC,eAAe,CAAC;AAE5C,SAAgB,oBAAoB;CAElC,MAAM,OADU,YAAY,EACN,SAAS;CAC/B,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAE7C,SAAS,eAAe;AACtB,aAAW,KAAK;AAChB,uBAAqB,CAClB,WAAW;AACV,YAAO,KAAK,kBAAkB;AAC9B,oBAAiB,KAAA,EAAU;AAC3B,mBAAgB,KAAA,EAAU;AAC1B,UAAO,SAAS,QAAQ;IACxB,CACD,OAAO,UAAU;AAChB,YAAO,MAAM,kCAAkC,MAAM;AACrD,cAAW,MAAM;IACjB;;AAGN,QACE,oBAAC,0BAAD;EACQ;EACN,QAAQ,EAAE,yDAAyD;EACnE,OAAO,EAAE,yDAAyD;EAClE,MAAM,EAAE,wDAAwD;EAChE,aAAa,EAAE,gBAAgB;EAC/B,eAAe,EACb,+DACD;EACD,gBAAgB,YAAY,EAAE,MAAM,YAAY,CAAC;EACjD,YAAY;EACZ,eAAe,WAAoB;AACjC,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,qBAAqB,EACnB,UAAU,SACX;EACD,CAAA"}
@@ -1,4 +1,4 @@
1
- import { t as useRegistryPackages } from "./useRegistryPackages-DSzf8iPN.js";
1
+ import { t as useRegistryPackages } from "./useRegistryPackages-D-NoyoE4.js";
2
2
  import { closePHModal, usePHModal, useVetraPackageManager } from "@powerhousedao/reactor-browser";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { PackageInstallModal } from "@powerhousedao/design-system/connect/index";
@@ -31,4 +31,4 @@ function ConnectMissingPackageModal() {
31
31
  //#endregion
32
32
  export { ConnectMissingPackageModal };
33
33
 
34
- //# sourceMappingURL=MissingPackageModal-cr5tZDVw.js.map
34
+ //# sourceMappingURL=MissingPackageModal-7VpP86dg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MissingPackageModal-cr5tZDVw.js","names":[],"sources":["../src/components/modal/modals/MissingPackageModal.tsx"],"sourcesContent":["import { useRegistryPackages } from \"@powerhousedao/connect/hooks\";\nimport {\n PackageInstallModal,\n type PendingPackageInstallation,\n} from \"@powerhousedao/design-system/connect/index\";\nimport {\n closePHModal,\n usePHModal,\n useVetraPackageManager,\n} from \"@powerhousedao/reactor-browser\";\n\nexport function ConnectMissingPackageModal() {\n const phModal = usePHModal();\n const { registryPackageList, updateRegistryPackageStatus } =\n useRegistryPackages();\n const packageManager = useVetraPackageManager();\n const open = phModal?.type === \"missingPackage\";\n\n const documentType = open ? phModal.documentType : undefined;\n\n if (!packageManager || !documentType) return null;\n\n const pendingInstallations: PendingPackageInstallation[] = registryPackageList\n .filter((rp) => rp.documentTypes.includes(documentType))\n .map((rp) => ({\n documentType,\n packageName: rp.name,\n }));\n\n async function onInstall(packageName: string) {\n const result = await packageManager?.addPackage(packageName);\n if (result?.type === \"success\") {\n updateRegistryPackageStatus(packageName, \"registry-install\");\n }\n }\n\n function onDismiss(packageName: string) {\n updateRegistryPackageStatus(packageName, \"dismissed\");\n }\n\n return (\n <PackageInstallModal\n pendingInstallations={pendingInstallations}\n onInstall={onInstall}\n onDismiss={onDismiss}\n onOpenChange={(status: boolean) => {\n if (!status) return closePHModal();\n }}\n />\n );\n}\n"],"mappings":";;;;;AAWA,SAAgB,6BAA6B;CAC3C,MAAM,UAAU,YAAY;CAC5B,MAAM,EAAE,qBAAqB,gCAC3B,qBAAqB;CACvB,MAAM,iBAAiB,wBAAwB;CAG/C,MAAM,eAFO,SAAS,SAAS,mBAEH,QAAQ,eAAe,KAAA;AAEnD,KAAI,CAAC,kBAAkB,CAAC,aAAc,QAAO;CAE7C,MAAM,uBAAqD,oBACxD,QAAQ,OAAO,GAAG,cAAc,SAAS,aAAa,CAAC,CACvD,KAAK,QAAQ;EACZ;EACA,aAAa,GAAG;EACjB,EAAE;CAEL,eAAe,UAAU,aAAqB;AAE5C,OADe,MAAM,gBAAgB,WAAW,YAAY,GAChD,SAAS,UACnB,6BAA4B,aAAa,mBAAmB;;CAIhE,SAAS,UAAU,aAAqB;AACtC,8BAA4B,aAAa,YAAY;;AAGvD,QACE,oBAAC,qBAAD;EACwB;EACX;EACA;EACX,eAAe,WAAoB;AACjC,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,CAAA"}
1
+ {"version":3,"file":"MissingPackageModal-7VpP86dg.js","names":[],"sources":["../src/components/modal/modals/MissingPackageModal.tsx"],"sourcesContent":["import { useRegistryPackages } from \"@powerhousedao/connect/hooks\";\nimport {\n PackageInstallModal,\n type PendingPackageInstallation,\n} from \"@powerhousedao/design-system/connect/index\";\nimport {\n closePHModal,\n usePHModal,\n useVetraPackageManager,\n} from \"@powerhousedao/reactor-browser\";\n\nexport function ConnectMissingPackageModal() {\n const phModal = usePHModal();\n const { registryPackageList, updateRegistryPackageStatus } =\n useRegistryPackages();\n const packageManager = useVetraPackageManager();\n const open = phModal?.type === \"missingPackage\";\n\n const documentType = open ? phModal.documentType : undefined;\n\n if (!packageManager || !documentType) return null;\n\n const pendingInstallations: PendingPackageInstallation[] = registryPackageList\n .filter((rp) => rp.documentTypes.includes(documentType))\n .map((rp) => ({\n documentType,\n packageName: rp.name,\n }));\n\n async function onInstall(packageName: string) {\n const result = await packageManager?.addPackage(packageName);\n if (result?.type === \"success\") {\n updateRegistryPackageStatus(packageName, \"registry-install\");\n }\n }\n\n function onDismiss(packageName: string) {\n updateRegistryPackageStatus(packageName, \"dismissed\");\n }\n\n return (\n <PackageInstallModal\n pendingInstallations={pendingInstallations}\n onInstall={onInstall}\n onDismiss={onDismiss}\n onOpenChange={(status: boolean) => {\n if (!status) return closePHModal();\n }}\n />\n );\n}\n"],"mappings":";;;;;AAWA,SAAgB,6BAA6B;CAC3C,MAAM,UAAU,YAAY;CAC5B,MAAM,EAAE,qBAAqB,gCAC3B,qBAAqB;CACvB,MAAM,iBAAiB,wBAAwB;CAG/C,MAAM,eAFO,SAAS,SAAS,mBAEH,QAAQ,eAAe,KAAA;AAEnD,KAAI,CAAC,kBAAkB,CAAC,aAAc,QAAO;CAE7C,MAAM,uBAAqD,oBACxD,QAAQ,OAAO,GAAG,cAAc,SAAS,aAAa,CAAC,CACvD,KAAK,QAAQ;EACZ;EACA,aAAa,GAAG;EACjB,EAAE;CAEL,eAAe,UAAU,aAAqB;AAE5C,OADe,MAAM,gBAAgB,WAAW,YAAY,GAChD,SAAS,UACnB,6BAA4B,aAAa,mBAAmB;;CAIhE,SAAS,UAAU,aAAqB;AACtC,8BAA4B,aAAa,YAAY;;AAGvD,QACE,oBAAC,qBAAD;EACwB;EACX;EACA;EACX,eAAe,WAAoB;AACjC,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { t as connectConfig } from "./connect.config-DDu1QWU1.js";
2
2
  import { t as toast$1 } from "./toast-iD-70hL8.js";
3
- import { t as useRegistryPackages } from "./useRegistryPackages-DSzf8iPN.js";
4
- import { t as package_default } from "./package-DW-JM-RS.js";
3
+ import { t as useRegistryPackages } from "./useRegistryPackages-D-NoyoE4.js";
4
+ import { t as package_default } from "./package-o99rauty.js";
5
5
  import { closePHModal, deleteDrive, setSelectedDrive, showPHModal, useDrives, usePHModal, useVetraPackageManager } from "@powerhousedao/reactor-browser";
6
6
  import { useCallback, useMemo, useState } from "react";
7
7
  import { About, DangerZone, DefaultEditor, PackageManager, SettingsModal as SettingsModal$1 } from "@powerhousedao/design-system/connect";
@@ -150,4 +150,4 @@ const SettingsModal = () => {
150
150
  //#endregion
151
151
  export { SettingsModal };
152
152
 
153
- //# sourceMappingURL=SettingsModal-lPXsUl7D.js.map
153
+ //# sourceMappingURL=SettingsModal-DXizOr6D.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsModal-lPXsUl7D.js","names":["About","BaseAbout","packageJson","DangerZone","BaseDangerZone","DefaultEditor","BaseDefaultEditor","DefaultEditor","DangerZone","About","SettingsModalV2"],"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 { packageJson } from \"@powerhousedao/connect/utils\";\nimport { About as BaseAbout } from \"@powerhousedao/design-system/connect\";\n\nexport const About: React.FC = () => {\n return (\n <BaseAbout\n packageJson={packageJson}\n phCliVersion={\n typeof connectConfig.phCliVersion === \"string\"\n ? connectConfig.phCliVersion\n : undefined\n }\n />\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={handleDeleteDrive}\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\nexport const ConnectPackageManager: React.FC = () => {\n const packageManager = useVetraPackageManager();\n const { registryPackageList, updateRegistryPackageStatus } =\n useRegistryPackages();\n\n async function handleInstall(packageName: string) {\n if (!packageManager) return;\n\n const result = await packageManager.addPackage(packageName);\n if (result.type === \"success\") {\n updateRegistryPackageStatus(packageName, \"registry-install\");\n toast(`Package \"${packageName}\" installed successfully`, {\n type: \"connect-success\",\n });\n } else {\n const message = result.error.message;\n toast(`Failed to install \"${packageName}\": ${message}`, {\n type: \"error\",\n });\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 { Icon } from \"@powerhousedao/design-system\";\nimport { SettingsModal as SettingsModalV2 } from \"@powerhousedao/design-system/connect\";\nimport { closePHModal, usePHModal } from \"@powerhousedao/reactor-browser\";\nimport { t } from \"i18next\";\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\nexport const SettingsModal: React.FC = () => {\n const phModal = usePHModal();\n const open = phModal?.type === \"settings\";\n function onRefresh() {\n window.location.reload();\n }\n\n const tabs = useMemo(\n () => [\n {\n id: \"package-manager\",\n icon: <Icon name=\"PackageManager\" size={12} />,\n label: \"Package Manager\",\n content: ConnectPackageManager,\n },\n {\n id: \"default-editors\",\n icon: <Icon name=\"Edit\" size={12} />,\n label: \"Default Editors\",\n content: DefaultEditor,\n },\n {\n id: \"danger-zone\",\n icon: <Icon name=\"Danger\" size={12} className=\"text-red-900\" />,\n label: <span className=\"text-red-900\">Danger Zone</span>,\n content: () => <DangerZone />,\n },\n {\n id: \"about\",\n icon: <Icon name=\"QuestionSquare\" size={12} />,\n label: \"About\",\n content: About,\n },\n ],\n [onRefresh],\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 />\n );\n};\n"],"mappings":";;;;;;;;;;;AAIA,MAAaA,gBAAwB;AACnC,QACE,oBAACC,OAAD;EACE,aAAaC;EACb,cACE,OAAO,cAAc,iBAAiB,WAClC,cAAc,eACd,KAAA;EAEN,CAAA;;;;ACJN,MAAaC,qBAA6B;CACxC,MAAM,SAAS,WAAW;CAE1B,MAAM,oBAAoB,OAAO,UAAiC;AAChE,QAAM,YAAY,MAAM,OAAO,GAAG;AAClC,mBAAiB,KAAA,EAAU;;CAG7B,MAAM,2BAA2B;AAC/B,cAAY,EAAE,MAAM,gBAAgB,CAAC;;AAGvC,QACE,oBAACC,YAAD;EACE,QAAQ,UAAU,EAAE;EACpB,eAAe;EACf,gBAAgB;EAChB,CAAA;;;;ACvBN,MAAM,6BAA6B,CACjC;CAAE,OAAO;CAAM,OAAO;CAAyB,EAC/C;CAAE,OAAO;CAAM,OAAO;CAA4B,CACnD;AAED,MAAaC,wBAAgC;CAC3C,MAAM,CAAC,qBAAqB,0BAA0B,SAEpD,2BAA2B,GAAG;CAEhC,MAAM,0BAA0B,aAAa,UAAkB;EAC7D,MAAM,SAAS,2BAA2B,MAAM,OAAO,GAAG,SAAS,MAAM;AACzE,MAAI,OACF,wBAAuB,OAAO;IAE/B,EAAE,CAAC;AAEN,QACE,oBAACC,eAAD;EACE,qBAAqB,oBAAoB;EACzC,wBAAwB;EAEtB;EAKF,CAAA;;;;ACxBN,MAAa,8BAAwC;CACnD,MAAM,iBAAiB,wBAAwB;CAC/C,MAAM,EAAE,qBAAqB,gCAC3B,qBAAqB;CAEvB,eAAe,cAAc,aAAqB;AAChD,MAAI,CAAC,eAAgB;EAErB,MAAM,SAAS,MAAM,eAAe,WAAW,YAAY;AAC3D,MAAI,OAAO,SAAS,WAAW;AAC7B,+BAA4B,aAAa,mBAAmB;AAC5D,WAAM,YAAY,YAAY,2BAA2B,EACvD,MAAM,mBACP,CAAC;SACG;GACL,MAAM,UAAU,OAAO,MAAM;AAC7B,WAAM,sBAAsB,YAAY,KAAK,WAAW,EACtD,MAAM,SACP,CAAC;;;CAIN,SAAS,gBAAgB,aAAqB;AAC5C,MAAI,CAAC,eAAgB;AACrB,MAAI;AACF,kBAAe,cAAc,YAAY;AACzC,+BAA4B,aAAa,YAAY;AAErD,WAAM,YAAY,YAAY,6BAA6B,EACzD,MAAM,mBACP,CAAC;WACK,OAAO;AAEd,WAAM,wBAAwB,YAAY,KAD1B,iBAAiB,QAAQ,MAAM,UAAU,mBACC,EACxD,MAAM,SACP,CAAC;;;AAIN,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,gBAAD;GACE,SAAS;GACY;GACrB,WAAW;GACX,aAAa;GACb,CAAA;EACE,CAAA;;;;AC3CV,MAAa,sBAAgC;CAE3C,MAAM,OADU,YAAY,EACN,SAAS;CAC/B,SAAS,YAAY;AACnB,SAAO,SAAS,QAAQ;;CAG1B,MAAM,OAAO,cACL;EACJ;GACE,IAAI;GACJ,MAAM,oBAAC,MAAD;IAAM,MAAK;IAAiB,MAAM;IAAM,CAAA;GAC9C,OAAO;GACP,SAAS;GACV;EACD;GACE,IAAI;GACJ,MAAM,oBAAC,MAAD;IAAM,MAAK;IAAO,MAAM;IAAM,CAAA;GACpC,OAAO;GACP,SAASC;GACV;EACD;GACE,IAAI;GACJ,MAAM,oBAAC,MAAD;IAAM,MAAK;IAAS,MAAM;IAAI,WAAU;IAAiB,CAAA;GAC/D,OAAO,oBAAC,QAAD;IAAM,WAAU;cAAe;IAAkB,CAAA;GACxD,eAAe,oBAACC,cAAD,EAAc,CAAA;GAC9B;EACD;GACE,IAAI;GACJ,MAAM,oBAAC,MAAD;IAAM,MAAK;IAAiB,MAAM;IAAM,CAAA;GAC9C,OAAO;GACP,SAASC;GACV;EACF,EACD,CAAC,UAAU,CACZ;AAED,QACE,oBAACC,iBAAD;EACQ;EACN,OAAO,EAAE,+BAA+B;EACxC,eAAe,WAAoB;AACjC,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAE9B;EACN,CAAA"}
1
+ {"version":3,"file":"SettingsModal-DXizOr6D.js","names":["About","BaseAbout","packageJson","DangerZone","BaseDangerZone","DefaultEditor","BaseDefaultEditor","DefaultEditor","DangerZone","About","SettingsModalV2"],"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 { packageJson } from \"@powerhousedao/connect/utils\";\nimport { About as BaseAbout } from \"@powerhousedao/design-system/connect\";\n\nexport const About: React.FC = () => {\n return (\n <BaseAbout\n packageJson={packageJson}\n phCliVersion={\n typeof connectConfig.phCliVersion === \"string\"\n ? connectConfig.phCliVersion\n : undefined\n }\n />\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={handleDeleteDrive}\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\nexport const ConnectPackageManager: React.FC = () => {\n const packageManager = useVetraPackageManager();\n const { registryPackageList, updateRegistryPackageStatus } =\n useRegistryPackages();\n\n async function handleInstall(packageName: string) {\n if (!packageManager) return;\n\n const result = await packageManager.addPackage(packageName);\n if (result.type === \"success\") {\n updateRegistryPackageStatus(packageName, \"registry-install\");\n toast(`Package \"${packageName}\" installed successfully`, {\n type: \"connect-success\",\n });\n } else {\n const message = result.error.message;\n toast(`Failed to install \"${packageName}\": ${message}`, {\n type: \"error\",\n });\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 { Icon } from \"@powerhousedao/design-system\";\nimport { SettingsModal as SettingsModalV2 } from \"@powerhousedao/design-system/connect\";\nimport { closePHModal, usePHModal } from \"@powerhousedao/reactor-browser\";\nimport { t } from \"i18next\";\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\nexport const SettingsModal: React.FC = () => {\n const phModal = usePHModal();\n const open = phModal?.type === \"settings\";\n function onRefresh() {\n window.location.reload();\n }\n\n const tabs = useMemo(\n () => [\n {\n id: \"package-manager\",\n icon: <Icon name=\"PackageManager\" size={12} />,\n label: \"Package Manager\",\n content: ConnectPackageManager,\n },\n {\n id: \"default-editors\",\n icon: <Icon name=\"Edit\" size={12} />,\n label: \"Default Editors\",\n content: DefaultEditor,\n },\n {\n id: \"danger-zone\",\n icon: <Icon name=\"Danger\" size={12} className=\"text-red-900\" />,\n label: <span className=\"text-red-900\">Danger Zone</span>,\n content: () => <DangerZone />,\n },\n {\n id: \"about\",\n icon: <Icon name=\"QuestionSquare\" size={12} />,\n label: \"About\",\n content: About,\n },\n ],\n [onRefresh],\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 />\n );\n};\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { t as connectConfig } from "./connect.config-DDu1QWU1.js";
2
2
  import { t as toast } from "./toast-iD-70hL8.js";
3
- import { t as package_default } from "./package-DW-JM-RS.js";
4
- import { n as createReactor } from "./reactor-Cc15SaWl.js";
3
+ import { t as package_default } from "./package-o99rauty.js";
4
+ import { n as createReactor } from "./reactor-c5gHyb6M.js";
5
5
  import { useUser } from "@powerhousedao/reactor-browser";
6
6
  import { logger } from "document-model";
7
7
  import { createElement, useEffect } from "react";
@@ -102,4 +102,4 @@ async function loadComponent(localPackage) {
102
102
  //#endregion
103
103
  export { loadComponent };
104
104
 
105
- //# sourceMappingURL=load-Dsi2HpPk.js.map
105
+ //# sourceMappingURL=load-DMuvH92l.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"load-Dsi2HpPk.js","names":["packageJson"],"sources":["../src/components/reload-connect-toast.tsx","../src/hooks/useCheckLatestVersion.ts","../src/hooks/utils.ts","../src/store/user.ts","../src/components/load.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\n\nexport const ReloadConnectToast = () => {\n const { t } = useTranslation();\n\n return (\n <div>\n <p className=\"font-medium\">{t(\"notifications.reloadApp\")}</p>\n <button\n onClick={() => location.reload()}\n className=\"underline decoration-solid underline-offset-2\"\n >\n {t(\"common.reloadConnect\")} 🔄\n </button>\n </div>\n );\n};\n","import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { isLatestVersion } from \"@powerhousedao/connect/hooks\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport { logger } from \"document-model\";\nimport { createElement, useEffect } from \"react\";\nimport { ReloadConnectToast } from \"../components/reload-connect-toast.js\";\n\nexport const useCheckLatestVersion = () => {\n async function checkLatestVersion() {\n const result = await isLatestVersion();\n if (result === null) return;\n // ignore dev/staging versions\n if (result.isLatest || result.currentVersion.includes(\"-\")) {\n return true;\n }\n\n if (\n import.meta.env.MODE === \"development\" ||\n connectConfig.studioMode ||\n !connectConfig.warnOutdatedApp\n ) {\n logger.warn(\n \"Connect is outdated: \\nCurrent: @currentVersion\\nLatest: @latestVersion\",\n result.currentVersion,\n result.latestVersion,\n );\n } else {\n toast(createElement(ReloadConnectToast), {\n type: \"connect-warning\",\n toastId: \"outdated-app\",\n autoClose: false,\n });\n }\n }\n\n useEffect(() => {\n checkLatestVersion().catch(console.error);\n }, []);\n};\n","import { packageJson } from \"../utils/package-json.js\";\n\nexport const isMac = window.navigator.appVersion.includes(\"Mac\");\n\nconst urlBranchMap: Record<string, string> = {\n \"staging/makerdao\": \"deployments/staging/makerdao\",\n \"staging/arbitrum\": \"arb-ltip\",\n \"staging/powerhouse\": \"staging\",\n makerdao: \"deployments/makerdao\",\n arbitrum: \"deployments/arbitrum\",\n arbgrants: \"deployments/arbitrum\",\n localhost: \"develop\",\n};\n\nconst getGithubLinkFromUrl = () => {\n const githubLink = \"https://raw.githubusercontent.com/powerhouse-inc/connect\";\n const url = window.location.href;\n\n const env = Object.keys(urlBranchMap).find((env) => url.includes(env));\n const value = env ? urlBranchMap[env] : undefined;\n if (!value) {\n return undefined;\n } else {\n return `${githubLink}/${value}/package.json`;\n }\n};\n\nconst fetchLatestVersion = async () => {\n const link = getGithubLinkFromUrl();\n if (!link) {\n return undefined;\n }\n const result = await fetch(link);\n const data = (await result.json()) as { version: string };\n const { version } = data;\n return version;\n};\n\nexport const isLatestVersion = async () => {\n const currentVersion = packageJson.version;\n const deployed = await fetchLatestVersion();\n\n if (deployed) {\n return {\n isLatest: deployed === currentVersion,\n currentVersion,\n latestVersion: deployed,\n };\n }\n\n return null;\n};\n","import { useUser } from \"@powerhousedao/reactor-browser\";\nimport type { User as SentryUser } from \"@sentry/react\";\nimport { setUser as setSentryUser } from \"@sentry/react\";\nimport { useEffect } from \"react\";\n\nexport function useSetSentryUser() {\n const user = useUser();\n useEffect(() => {\n let sentryUser: SentryUser | null = null;\n if (user) {\n // saves the user info except the credential\n const { credential, ...rest } = user;\n sentryUser = { id: rest.did, username: rest.ens?.name, ...rest };\n }\n setSentryUser(sentryUser);\n }, [user]);\n}\n","import { useCheckLatestVersion } from \"@powerhousedao/connect/hooks\";\nimport \"@powerhousedao/connect/i18n\";\nimport { createReactor, useSetSentryUser } from \"@powerhousedao/connect/store\";\nimport type { DocumentModelLib } from \"document-model\";\nimport { type ReactNode } from \"react\";\n\nexport async function loadComponent(localPackage?: DocumentModelLib) {\n await createReactor(localPackage);\n return {\n default: ({ children }: { children?: ReactNode }) => {\n useSetSentryUser();\n useCheckLatestVersion();\n return children;\n },\n };\n}\n"],"mappings":";;;;;;;;;;;AAEA,MAAa,2BAA2B;CACtC,MAAM,EAAE,MAAM,gBAAgB;AAE9B,QACE,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,KAAD;EAAG,WAAU;YAAe,EAAE,0BAA0B;EAAK,CAAA,EAC7D,qBAAC,UAAD;EACE,eAAe,SAAS,QAAQ;EAChC,WAAU;YAFZ,CAIG,EAAE,uBAAuB,EAAC,MACpB;IACL,EAAA,CAAA;;;;ACPV,MAAa,8BAA8B;CACzC,eAAe,qBAAqB;EAClC,MAAM,SAAS,MAAM,iBAAiB;AACtC,MAAI,WAAW,KAAM;AAErB,MAAI,OAAO,YAAY,OAAO,eAAe,SAAS,IAAI,CACxD,QAAO;AAGT,MACE,OAAO,KAAK,IAAI,SAAS,iBACzB,cAAc,cACd,CAAC,cAAc,gBAEf,QAAO,KACL,2EACA,OAAO,gBACP,OAAO,cACR;MAED,OAAM,cAAc,mBAAmB,EAAE;GACvC,MAAM;GACN,SAAS;GACT,WAAW;GACZ,CAAC;;AAIN,iBAAgB;AACd,sBAAoB,CAAC,MAAM,QAAQ,MAAM;IACxC,EAAE,CAAC;;ACnCa,OAAO,UAAU,WAAW,SAAS,MAAM;AAEhE,MAAM,eAAuC;CAC3C,oBAAoB;CACpB,oBAAoB;CACpB,sBAAsB;CACtB,UAAU;CACV,UAAU;CACV,WAAW;CACX,WAAW;CACZ;AAED,MAAM,6BAA6B;CACjC,MAAM,aAAa;CACnB,MAAM,MAAM,OAAO,SAAS;CAE5B,MAAM,MAAM,OAAO,KAAK,aAAa,CAAC,MAAM,QAAQ,IAAI,SAAS,IAAI,CAAC;CACtE,MAAM,QAAQ,MAAM,aAAa,OAAO,KAAA;AACxC,KAAI,CAAC,MACH;KAEA,QAAO,GAAG,WAAW,GAAG,MAAM;;AAIlC,MAAM,qBAAqB,YAAY;CACrC,MAAM,OAAO,sBAAsB;AACnC,KAAI,CAAC,KACH;CAIF,MAAM,EAAE,YADM,OADC,MAAM,MAAM,KAAK,EACL,MAAM;AAEjC,QAAO;;AAGT,MAAa,kBAAkB,YAAY;CACzC,MAAM,iBAAiBA,gBAAY;CACnC,MAAM,WAAW,MAAM,oBAAoB;AAE3C,KAAI,SACF,QAAO;EACL,UAAU,aAAa;EACvB;EACA,eAAe;EAChB;AAGH,QAAO;;;;AC7CT,SAAgB,mBAAmB;CACjC,MAAM,OAAO,SAAS;AACtB,iBAAgB;EACd,IAAI,aAAgC;AACpC,MAAI,MAAM;GAER,MAAM,EAAE,YAAY,GAAG,SAAS;AAChC,gBAAa;IAAE,IAAI,KAAK;IAAK,UAAU,KAAK,KAAK;IAAM,GAAG;IAAM;;AAElE,UAAc,WAAW;IACxB,CAAC,KAAK,CAAC;;;;ACTZ,eAAsB,cAAc,cAAiC;AACnE,OAAM,cAAc,aAAa;AACjC,QAAO,EACL,UAAU,EAAE,eAAyC;AACnD,oBAAkB;AAClB,yBAAuB;AACvB,SAAO;IAEV"}
1
+ {"version":3,"file":"load-DMuvH92l.js","names":["packageJson"],"sources":["../src/components/reload-connect-toast.tsx","../src/hooks/useCheckLatestVersion.ts","../src/hooks/utils.ts","../src/store/user.ts","../src/components/load.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\n\nexport const ReloadConnectToast = () => {\n const { t } = useTranslation();\n\n return (\n <div>\n <p className=\"font-medium\">{t(\"notifications.reloadApp\")}</p>\n <button\n onClick={() => location.reload()}\n className=\"underline decoration-solid underline-offset-2\"\n >\n {t(\"common.reloadConnect\")} 🔄\n </button>\n </div>\n );\n};\n","import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { isLatestVersion } from \"@powerhousedao/connect/hooks\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport { logger } from \"document-model\";\nimport { createElement, useEffect } from \"react\";\nimport { ReloadConnectToast } from \"../components/reload-connect-toast.js\";\n\nexport const useCheckLatestVersion = () => {\n async function checkLatestVersion() {\n const result = await isLatestVersion();\n if (result === null) return;\n // ignore dev/staging versions\n if (result.isLatest || result.currentVersion.includes(\"-\")) {\n return true;\n }\n\n if (\n import.meta.env.MODE === \"development\" ||\n connectConfig.studioMode ||\n !connectConfig.warnOutdatedApp\n ) {\n logger.warn(\n \"Connect is outdated: \\nCurrent: @currentVersion\\nLatest: @latestVersion\",\n result.currentVersion,\n result.latestVersion,\n );\n } else {\n toast(createElement(ReloadConnectToast), {\n type: \"connect-warning\",\n toastId: \"outdated-app\",\n autoClose: false,\n });\n }\n }\n\n useEffect(() => {\n checkLatestVersion().catch(console.error);\n }, []);\n};\n","import { packageJson } from \"../utils/package-json.js\";\n\nexport const isMac = window.navigator.appVersion.includes(\"Mac\");\n\nconst urlBranchMap: Record<string, string> = {\n \"staging/makerdao\": \"deployments/staging/makerdao\",\n \"staging/arbitrum\": \"arb-ltip\",\n \"staging/powerhouse\": \"staging\",\n makerdao: \"deployments/makerdao\",\n arbitrum: \"deployments/arbitrum\",\n arbgrants: \"deployments/arbitrum\",\n localhost: \"develop\",\n};\n\nconst getGithubLinkFromUrl = () => {\n const githubLink = \"https://raw.githubusercontent.com/powerhouse-inc/connect\";\n const url = window.location.href;\n\n const env = Object.keys(urlBranchMap).find((env) => url.includes(env));\n const value = env ? urlBranchMap[env] : undefined;\n if (!value) {\n return undefined;\n } else {\n return `${githubLink}/${value}/package.json`;\n }\n};\n\nconst fetchLatestVersion = async () => {\n const link = getGithubLinkFromUrl();\n if (!link) {\n return undefined;\n }\n const result = await fetch(link);\n const data = (await result.json()) as { version: string };\n const { version } = data;\n return version;\n};\n\nexport const isLatestVersion = async () => {\n const currentVersion = packageJson.version;\n const deployed = await fetchLatestVersion();\n\n if (deployed) {\n return {\n isLatest: deployed === currentVersion,\n currentVersion,\n latestVersion: deployed,\n };\n }\n\n return null;\n};\n","import { useUser } from \"@powerhousedao/reactor-browser\";\nimport type { User as SentryUser } from \"@sentry/react\";\nimport { setUser as setSentryUser } from \"@sentry/react\";\nimport { useEffect } from \"react\";\n\nexport function useSetSentryUser() {\n const user = useUser();\n useEffect(() => {\n let sentryUser: SentryUser | null = null;\n if (user) {\n // saves the user info except the credential\n const { credential, ...rest } = user;\n sentryUser = { id: rest.did, username: rest.ens?.name, ...rest };\n }\n setSentryUser(sentryUser);\n }, [user]);\n}\n","import { useCheckLatestVersion } from \"@powerhousedao/connect/hooks\";\nimport \"@powerhousedao/connect/i18n\";\nimport { createReactor, useSetSentryUser } from \"@powerhousedao/connect/store\";\nimport type { DocumentModelLib } from \"document-model\";\nimport { type ReactNode } from \"react\";\n\nexport async function loadComponent(localPackage?: DocumentModelLib) {\n await createReactor(localPackage);\n return {\n default: ({ children }: { children?: ReactNode }) => {\n useSetSentryUser();\n useCheckLatestVersion();\n return children;\n },\n };\n}\n"],"mappings":";;;;;;;;;;;AAEA,MAAa,2BAA2B;CACtC,MAAM,EAAE,MAAM,gBAAgB;AAE9B,QACE,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,KAAD;EAAG,WAAU;YAAe,EAAE,0BAA0B;EAAK,CAAA,EAC7D,qBAAC,UAAD;EACE,eAAe,SAAS,QAAQ;EAChC,WAAU;YAFZ,CAIG,EAAE,uBAAuB,EAAC,MACpB;IACL,EAAA,CAAA;;;;ACPV,MAAa,8BAA8B;CACzC,eAAe,qBAAqB;EAClC,MAAM,SAAS,MAAM,iBAAiB;AACtC,MAAI,WAAW,KAAM;AAErB,MAAI,OAAO,YAAY,OAAO,eAAe,SAAS,IAAI,CACxD,QAAO;AAGT,MACE,OAAO,KAAK,IAAI,SAAS,iBACzB,cAAc,cACd,CAAC,cAAc,gBAEf,QAAO,KACL,2EACA,OAAO,gBACP,OAAO,cACR;MAED,OAAM,cAAc,mBAAmB,EAAE;GACvC,MAAM;GACN,SAAS;GACT,WAAW;GACZ,CAAC;;AAIN,iBAAgB;AACd,sBAAoB,CAAC,MAAM,QAAQ,MAAM;IACxC,EAAE,CAAC;;ACnCa,OAAO,UAAU,WAAW,SAAS,MAAM;AAEhE,MAAM,eAAuC;CAC3C,oBAAoB;CACpB,oBAAoB;CACpB,sBAAsB;CACtB,UAAU;CACV,UAAU;CACV,WAAW;CACX,WAAW;CACZ;AAED,MAAM,6BAA6B;CACjC,MAAM,aAAa;CACnB,MAAM,MAAM,OAAO,SAAS;CAE5B,MAAM,MAAM,OAAO,KAAK,aAAa,CAAC,MAAM,QAAQ,IAAI,SAAS,IAAI,CAAC;CACtE,MAAM,QAAQ,MAAM,aAAa,OAAO,KAAA;AACxC,KAAI,CAAC,MACH;KAEA,QAAO,GAAG,WAAW,GAAG,MAAM;;AAIlC,MAAM,qBAAqB,YAAY;CACrC,MAAM,OAAO,sBAAsB;AACnC,KAAI,CAAC,KACH;CAIF,MAAM,EAAE,YADM,OADC,MAAM,MAAM,KAAK,EACL,MAAM;AAEjC,QAAO;;AAGT,MAAa,kBAAkB,YAAY;CACzC,MAAM,iBAAiBA,gBAAY;CACnC,MAAM,WAAW,MAAM,oBAAoB;AAE3C,KAAI,SACF,QAAO;EACL,UAAU,aAAa;EACvB;EACA,eAAe;EAChB;AAGH,QAAO;;;;AC7CT,SAAgB,mBAAmB;CACjC,MAAM,OAAO,SAAS;AACtB,iBAAgB;EACd,IAAI,aAAgC;AACpC,MAAI,MAAM;GAER,MAAM,EAAE,YAAY,GAAG,SAAS;AAChC,gBAAa;IAAE,IAAI,KAAK;IAAK,UAAU,KAAK,KAAK;IAAM,GAAG;IAAM;;AAElE,UAAc,WAAW;IACxB,CAAC,KAAK,CAAC;;;;ACTZ,eAAsB,cAAc,cAAiC;AACnE,OAAM,cAAc,aAAa;AACjC,QAAO,EACL,UAAU,EAAE,eAAyC;AACnD,oBAAkB;AAClB,yBAAuB;AACvB,SAAO;IAEV"}
package/dist/main.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as AppLoader } from "./sidebar-C4J77D6n.js";
1
+ import { t as AppLoader } from "./sidebar-aGcc7GEz.js";
2
2
  import { createRoot } from "react-dom/client";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  //#region main.tsx
@@ -2,7 +2,7 @@
2
2
  var package_default = {
3
3
  name: "@powerhousedao/connect",
4
4
  productName: "Powerhouse-Connect",
5
- version: "6.0.0-dev.176",
5
+ version: "6.0.0-dev.178",
6
6
  description: "Powerhouse Connect",
7
7
  main: "dist/index.html",
8
8
  type: "module",
@@ -109,4 +109,4 @@ var package_default = {
109
109
  //#endregion
110
110
  export { package_default as t };
111
111
 
112
- //# sourceMappingURL=package-DW-JM-RS.js.map
112
+ //# sourceMappingURL=package-o99rauty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-o99rauty.js","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
@@ -11,7 +11,9 @@ import { PGliteWorker } from "@electric-sql/pglite/worker";
11
11
  import { createRelationalDb } from "@powerhousedao/shared/processors";
12
12
  import { OpenFeature } from "@openfeature/web-sdk";
13
13
  import * as common from "@powerhousedao/powerhouse-vetra-packages";
14
+ import commonPkg from "@powerhousedao/powerhouse-vetra-packages/package.json" with { type: "json" };
14
15
  import * as vetra from "@powerhousedao/vetra";
16
+ import vetraPkg from "@powerhousedao/vetra/package.json" with { type: "json" };
15
17
  //#region src/utils/reactor.ts
16
18
  /**
17
19
  * Creates a Reactor that plugs into legacy storage but syncs through the new
@@ -360,6 +362,16 @@ var PackageDiscoveryService = class {
360
362
  };
361
363
  //#endregion
362
364
  //#region src/package-manager.ts
365
+ async function fetchPackageJsonVersion(baseUrl) {
366
+ try {
367
+ const res = await fetch(baseUrl);
368
+ if (!res.ok) return void 0;
369
+ const pkg = await res.json();
370
+ return typeof pkg.version === "string" ? pkg.version : void 0;
371
+ } catch {
372
+ return;
373
+ }
374
+ }
363
375
  const LOCAL_PACKAGE_NAME = "Local";
364
376
  const LOCAL_PACKAGES = [
365
377
  LOCAL_PACKAGE_NAME,
@@ -375,6 +387,7 @@ var BrowserPackageManager = class {
375
387
  #stylesheets = /* @__PURE__ */ new Map();
376
388
  #localPackage;
377
389
  #cdnUrl;
390
+ #localPackageVersion;
378
391
  constructor(namespace, registryUrl) {
379
392
  this.#storage = new BrowserLocalStorage(namespace + ":PH_PACKAGES");
380
393
  this.registryUrl = registryUrl;
@@ -384,15 +397,15 @@ var BrowserPackageManager = class {
384
397
  if (baseUrl.includes("/-/cdn")) return baseUrl;
385
398
  return `${baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl}/-/cdn`;
386
399
  }
387
- async init(localPackage) {
400
+ async init(localPackage, localPackageVersion) {
388
401
  const commonPackageWithMeta = this.#loadCommonPackage();
389
402
  this.#registerPackage(commonPackageWithMeta);
390
403
  const vetraPackageWithMeta = this.#loadVetraPackage();
391
404
  this.#registerPackage(vetraPackageWithMeta);
392
- if (localPackage) this.updateLocalPackage(localPackage);
405
+ if (localPackage) this.updateLocalPackage(localPackage, localPackageVersion);
393
406
  for (const packageName of this.#storage.keys()) await this.addPackage(packageName);
394
407
  }
395
- updateLocalPackage(pkg) {
408
+ updateLocalPackage(pkg, version) {
396
409
  console.debug("Updating local package:", pkg);
397
410
  this.#localPackage = pkg;
398
411
  this.#registerPackage({
@@ -401,6 +414,15 @@ var BrowserPackageManager = class {
401
414
  importUrl: null,
402
415
  loadedPackage: pkg
403
416
  });
417
+ if (version) {
418
+ this.#localPackageVersion = version;
419
+ this.#notifyPackagesChanged();
420
+ return;
421
+ }
422
+ fetchPackageJsonVersion("/package.json").then((fetchedVersion) => {
423
+ this.#localPackageVersion = fetchedVersion;
424
+ if (fetchedVersion) this.#notifyPackagesChanged();
425
+ }).catch(() => {});
404
426
  }
405
427
  get packages() {
406
428
  return this.#packagesMemo;
@@ -416,6 +438,10 @@ var BrowserPackageManager = class {
416
438
  if (packageMeta.importUrl === `/node_modules/${packageName}`) return "local-install";
417
439
  return "registry-install";
418
440
  }
441
+ getPackageVersion(packageName) {
442
+ if (packageName === this.#localPackage?.manifest.name) return this.#localPackageVersion;
443
+ return this.#storage.get(packageName)?.version;
444
+ }
419
445
  async addPackage(packageName) {
420
446
  const existingPackage = this.#packages.get(packageName);
421
447
  if (existingPackage) return {
@@ -466,7 +492,8 @@ var BrowserPackageManager = class {
466
492
  name: common.manifest.name,
467
493
  importUrl: null,
468
494
  stylesheetUrl: null,
469
- loadedPackage: common
495
+ loadedPackage: common,
496
+ version: commonPkg.version
470
497
  };
471
498
  }
472
499
  #loadVetraPackage() {
@@ -474,26 +501,31 @@ var BrowserPackageManager = class {
474
501
  name: vetra.manifest.name,
475
502
  importUrl: null,
476
503
  stylesheetUrl: null,
477
- loadedPackage: vetra
504
+ loadedPackage: vetra,
505
+ version: vetraPkg.version
478
506
  };
479
507
  }
480
508
  async #loadPackageFromNodeModules(name) {
481
509
  const importUrl = `/node_modules/${name}/browser/index.js`;
482
510
  const stylesheetUrl = `/node_modules/${name}/style.css`;
483
- return await this.#importPackage({
511
+ const packageWithMeta = await this.#importPackage({
484
512
  name,
485
513
  importUrl,
486
514
  stylesheetUrl
487
515
  });
516
+ packageWithMeta.version = await fetchPackageJsonVersion(`/node_modules/${name}/package.json`);
517
+ return packageWithMeta;
488
518
  }
489
519
  async #loadPackageFromRegistry(name) {
490
520
  const importUrl = `${this.#cdnUrl}/${name}/browser/index.js`;
491
521
  const stylesheetUrl = `${this.#cdnUrl}/${name}/style.css`;
492
- return await this.#importPackage({
522
+ const packageWithMeta = await this.#importPackage({
493
523
  name,
494
524
  importUrl,
495
525
  stylesheetUrl
496
526
  });
527
+ packageWithMeta.version = await fetchPackageJsonVersion(`${this.#cdnUrl}/${name}/package.json`);
528
+ return packageWithMeta;
497
529
  }
498
530
  async #importPackage(packageMeta) {
499
531
  const { name, importUrl, stylesheetUrl } = packageMeta;
@@ -519,13 +551,14 @@ var BrowserPackageManager = class {
519
551
  return await this.#loadPackageFromRegistry(packageName);
520
552
  }
521
553
  #registerPackage(packageWithMeta) {
522
- const { name, loadedPackage, importUrl, stylesheetUrl } = packageWithMeta;
554
+ const { name, loadedPackage, importUrl, stylesheetUrl, version } = packageWithMeta;
523
555
  if (stylesheetUrl !== null) this.#mountStylesheet(name, stylesheetUrl);
524
556
  this.#packages.set(name, loadedPackage);
525
557
  this.#storage.set(name, {
526
558
  name,
527
559
  importUrl,
528
- stylesheetUrl
560
+ stylesheetUrl,
561
+ version
529
562
  });
530
563
  this.#notifyPackagesChanged();
531
564
  }
@@ -634,7 +667,7 @@ async function createReactor(localPackage) {
634
667
  const packagesConfig = await loadPackagesConfig();
635
668
  const packageManager = new BrowserPackageManager(phGlobalConfigFromEnv.routerBasename ?? "", PH_PACKAGE_REGISTRY_URL);
636
669
  setVetraPackageManager(packageManager);
637
- await packageManager.init(localPackage);
670
+ await packageManager.init(localPackage, packagesConfig.localPackage?.version);
638
671
  (await packageManager.addPackages(packagesConfig.packages)).map((r) => {
639
672
  if (r.type === "error") console.error(r.error);
640
673
  });
@@ -723,4 +756,4 @@ function getDriveUrl() {
723
756
  //#endregion
724
757
  export { createReactor as n, clearReactorStorage as t };
725
758
 
726
- //# sourceMappingURL=reactor-Cc15SaWl.js.map
759
+ //# sourceMappingURL=reactor-c5gHyb6M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactor-c5gHyb6M.js","names":["#packageManager","#registryClient","#mode","#dismissedStorage","#findModuleInLoadedPackages","#deferred","#discover","#discoveredTypes","#pending","#addToPending","#findTypesByPackage","#emitEvent","#notifyPendingChanged","#pendingMemo","#pendingSubscribers","#eventSubscribers","#createDeferredEntry","#storage","#cdnUrl","#toCdnUrl","#loadCommonPackage","#registerPackage","#loadVetraPackage","#localPackage","#localPackageVersion","#notifyPackagesChanged","#packagesMemo","#packages","#loadPackage","#unmountStylesheet","#subscribers","#loadPackageFromNodeModules","#importPackage","#loadPackageFromRegistry","#mountStylesheet","#stylesheets"],"sources":["../src/utils/reactor.ts","../src/feature-flags.ts","../src/package-discovery.ts","../src/package-manager.ts","../src/packages.config.ts","../src/pglite.db.ts","../src/store/processor-host-module.ts","../src/store/reactor.ts"],"sourcesContent":["import { PGlite } from \"@electric-sql/pglite\";\nimport {\n addRemoteDrive,\n ChannelScheme,\n ReactorBuilder,\n ReactorClientBuilder,\n type BrowserReactorClientModule,\n type Database,\n type IDocumentModelLoader,\n type JwtHandler,\n type SignerConfig,\n} from \"@powerhousedao/reactor-browser\";\nimport type {\n DocumentModelModule,\n UpgradeManifest,\n} from \"@powerhousedao/shared/document-model\";\nimport { createSignatureVerifier, type IRenown } from \"@renown/sdk\";\nimport { ConsoleLogger } from \"document-model\";\nimport { Kysely } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\n\n/**\n * Creates a Reactor that plugs into legacy storage but syncs through the new\n * Reactor GQL API.\n */\nexport async function createBrowserReactor(\n documentModelModules: DocumentModelModule[],\n upgradeManifests: UpgradeManifest<readonly number[]>[],\n renown: IRenown,\n documentModelLoader?: IDocumentModelLoader,\n): Promise<BrowserReactorClientModule> {\n const signerConfig: SignerConfig = {\n signer: renown.signer,\n verifier: createSignatureVerifier(),\n };\n\n const jwtHandler: JwtHandler = async (url: string) => {\n if (!renown.user) {\n return undefined;\n }\n return renown.getBearerToken({ expiresIn: 10, aud: url });\n };\n\n const pg = new PGlite(\"idb://reactor\", {\n relaxedDurability: true,\n });\n const logger = new ConsoleLogger([\"reactor-client\"]);\n const builder = new ReactorClientBuilder()\n .withLogger(logger)\n .withSigner(signerConfig)\n .withReactorBuilder(\n new ReactorBuilder()\n .withDocumentModels(documentModelModules)\n .withUpgradeManifests(upgradeManifests)\n .withChannelScheme(ChannelScheme.CONNECT)\n .withJwtHandler(jwtHandler)\n .withKysely(\n new Kysely<Database>({\n dialect: new PGliteDialect(pg),\n }),\n ),\n );\n\n if (documentModelLoader) {\n builder.withDocumentModelLoader(documentModelLoader);\n }\n\n const module = await builder.buildModule();\n return {\n ...module,\n pg,\n } as BrowserReactorClientModule;\n}\n\n/**\n * Parse default drives from environment variable.\n * Returns an array of drive REST endpoint URLs (e.g., \"https://example.com/d/powerhouse\").\n */\nexport function getDefaultDrivesFromEnv(): string[] {\n const envValue = import.meta.env.PH_CONNECT_DEFAULT_DRIVES_URL as\n | string\n | undefined;\n if (!envValue) return [];\n return envValue.split(\",\").filter((url) => url.trim().length > 0);\n}\n\n/**\n * Add default drives for the new reactor via sync manager.\n *\n * Retries with linear backoff to handle the common race where Connect's\n * dev server is ready before the switchboard has finished binding its port.\n *\n * @param defaultDriveUrls - Array of drive REST endpoint URLs (e.g., \"https://example.com/d/powerhouse\")\n */\nexport async function addDefaultDrivesForNewReactor(\n defaultDriveUrls: string[],\n): Promise<void> {\n const MAX_ATTEMPTS = 3;\n const BACKOFF_MS = 2000;\n\n for (const url of defaultDriveUrls) {\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n try {\n await addRemoteDrive(url);\n break;\n } catch (error) {\n if (attempt === MAX_ATTEMPTS) {\n console.error(\n `Failed to add default drive ${url} after ${MAX_ATTEMPTS} attempts:`,\n error,\n );\n } else {\n const delay = BACKOFF_MS * attempt;\n console.warn(\n `Default drive ${url} not reachable (attempt ${attempt}/${MAX_ATTEMPTS}), retrying in ${delay}ms...`,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n }\n}\n","import {\n OpenFeature,\n type ErrorCode,\n type JsonValue,\n type Provider,\n type ResolutionDetails,\n} from \"@openfeature/web-sdk\";\nimport { logger, setLogLevel, type ILogger } from \"document-model\";\nimport { connectConfig } from \"./connect.config.js\";\n\n/**\n * QueryParamProvider reads feature flags from URL query parameters.\n *\n * Usage:\n * const params = new URLSearchParams(window.location.search);\n * const provider = new QueryParamProvider(params);\n * await OpenFeature.setProviderAndWait(provider);\n *\n * Query parameter format:\n * ?FEATURE_DUAL_ACTION_CREATE_ENABLED=true&FEATURE_FOO=false\n */\nexport class QueryParamProvider implements Provider {\n public readonly runsOn = \"client\" as const;\n\n readonly metadata = {\n name: \"QueryParamProvider\",\n } as const;\n\n private flags: Map<string, string>;\n\n constructor(searchParams: URLSearchParams) {\n this.flags = new Map();\n\n // Extract all query parameters that look like feature flags\n for (const [key, value] of searchParams.entries()) {\n this.flags.set(key, value);\n }\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n ): ResolutionDetails<boolean> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n // Parse boolean from string\n const boolValue = value.toLowerCase() === \"true\" || value === \"1\";\n\n return {\n value: boolValue,\n reason: \"STATIC\",\n variant: value,\n };\n }\n\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n ): ResolutionDetails<string> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n return {\n value,\n reason: \"STATIC\",\n variant: value,\n };\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n ): ResolutionDetails<number> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n const numValue = Number(value);\n\n if (isNaN(numValue)) {\n return {\n value: defaultValue,\n reason: \"ERROR\",\n errorCode: \"PARSE_ERROR\" as ErrorCode,\n errorMessage: `Failed to parse \"${value}\" as a number`,\n };\n }\n\n return {\n value: numValue,\n reason: \"STATIC\",\n variant: value,\n };\n }\n\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n ): ResolutionDetails<T> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n try {\n const objValue = JSON.parse(value) as T;\n return {\n value: objValue,\n reason: \"STATIC\",\n variant: value,\n };\n } catch (error) {\n return {\n value: defaultValue,\n reason: \"ERROR\",\n errorCode: \"PARSE_ERROR\" as ErrorCode,\n errorMessage: `Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n}\n\n/**\n * Initialize OpenFeature with the QueryParamProvider.\n * Reads feature flags from query parameters.\n */\nexport async function initFeatureFlags(\n searchParams?: URLSearchParams,\n): Promise<Map<string, boolean>> {\n const params =\n searchParams ??\n (typeof window !== \"undefined\"\n ? new URLSearchParams(window.location.search)\n : new URLSearchParams());\n const provider = new QueryParamProvider(params);\n await OpenFeature.setProviderAndWait(provider);\n\n const features = new Map<string, boolean>();\n const client = OpenFeature.getClient();\n\n // Query param overrides env var for inspector\n const inspectorFromParam = params.has(FEATURE_INSPECTOR_ENABLED);\n const inspectorEnabled = inspectorFromParam\n ? client.getBooleanValue(\n FEATURE_INSPECTOR_ENABLED,\n FEATURE_INSPECTOR_ENABLED_DEFAULT,\n )\n : connectConfig.content.inspectorEnabled;\n features.set(FEATURE_INSPECTOR_ENABLED, inspectorEnabled);\n\n // Handle LOG_LEVEL query param override\n const logLevelParam = params.get(\"LOG_LEVEL\");\n if (logLevelParam) {\n const validLogLevels = [\"verbose\", \"debug\", \"info\", \"warn\", \"error\"];\n if (validLogLevels.includes(logLevelParam.toLowerCase())) {\n setLogLevel(logLevelParam.toLowerCase() as ILogger[\"level\"]);\n logger.info(\n \"Log level set to @level via query param\",\n logLevelParam.toLowerCase(),\n );\n } else {\n logger.warn(\n \"Invalid LOG_LEVEL query param: @param. Valid values: @validLevels\",\n logLevelParam,\n validLogLevels.join(\", \"),\n );\n }\n }\n\n return features;\n}\n\nconst FEATURE_INSPECTOR_ENABLED = \"FEATURE_INSPECTOR_ENABLED\";\nconst FEATURE_INSPECTOR_ENABLED_DEFAULT = false;\n\n/**\n * If true, shows the inspector button in the sidebar.\n * Defaults to false (hidden).\n */\nexport async function isInspectorEnabled(): Promise<boolean> {\n const client = OpenFeature.getClient();\n return Promise.resolve(\n client.getBooleanValue(\n FEATURE_INSPECTOR_ENABLED,\n FEATURE_INSPECTOR_ENABLED_DEFAULT,\n ),\n );\n}\n","import {\n BrowserLocalStorage,\n type IDocumentModelLoader,\n type IPackageDiscoveryService,\n type DiscoveryEvent,\n type DiscoveryEventListener,\n type PendingInstallation,\n} from \"@powerhousedao/reactor-browser\";\nimport type { RegistryClient } from \"@powerhousedao/reactor-browser\";\nimport type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport type { BrowserPackageManager } from \"./package-manager.js\";\n\nexport type DiscoveryMode = \"immediate\" | \"manual\";\n\ntype DeferredEntry = {\n packageNames: string[];\n resolve: (module: DocumentModelModule<any>) => void;\n reject: (reason: unknown) => void;\n promise: Promise<DocumentModelModule<any>>;\n};\n\nexport class PackageDiscoveryService\n implements IDocumentModelLoader, IPackageDiscoveryService\n{\n #packageManager: BrowserPackageManager;\n #registryClient: RegistryClient;\n #mode: DiscoveryMode;\n\n #deferred = new Map<string, DeferredEntry>();\n #pending = new Map<string, PendingInstallation>();\n #pendingMemo: PendingInstallation[] = [];\n #pendingSubscribers = new Set<() => void>();\n #eventSubscribers = new Set<DiscoveryEventListener>();\n #dismissedStorage: BrowserLocalStorage<boolean>;\n #discoveredTypes = new Map<string, string[]>();\n\n constructor(\n packageManager: BrowserPackageManager,\n registryClient: RegistryClient,\n options: { mode: DiscoveryMode; storageKey: string },\n ) {\n this.#packageManager = packageManager;\n this.#registryClient = registryClient;\n this.#mode = options.mode;\n this.#dismissedStorage = new BrowserLocalStorage<boolean>(\n options.storageKey + \":PH_DISMISSED_TYPES\",\n );\n }\n\n load(documentType: string): Promise<DocumentModelModule<any>> {\n const existing = this.#findModuleInLoadedPackages(documentType);\n if (existing) {\n return Promise.resolve(existing);\n }\n\n if (this.#dismissedStorage.has(documentType)) {\n return Promise.reject(\n new Error(`Document type \"${documentType}\" was dismissed`),\n );\n }\n\n const tracked = this.#deferred.get(documentType);\n if (tracked) {\n return tracked.promise;\n }\n\n return this.#discover(documentType);\n }\n\n promptInstallation(documentType: string): void {\n const packageNames = this.#discoveredTypes.get(documentType);\n if (!packageNames) return;\n if (this.#pending.has(documentType)) return;\n\n this.#discoveredTypes.delete(documentType);\n this.#addToPending(documentType, packageNames);\n }\n\n async approveInstallation(packageName: string): Promise<void> {\n const affectedTypes = this.#findTypesByPackage(packageName);\n if (affectedTypes.length === 0) return;\n\n const result = await this.#packageManager.addPackage(packageName);\n if (result.type === \"error\") {\n this.#emitEvent({\n type: \"installation-failed\",\n packageName,\n error: result.error,\n });\n for (const documentType of affectedTypes) {\n const entry = this.#deferred.get(documentType);\n if (entry) {\n entry.reject(result.error);\n this.#deferred.delete(documentType);\n this.#pending.delete(documentType);\n }\n }\n this.#notifyPendingChanged();\n return;\n }\n\n this.#emitEvent({\n type: \"installation-approved\",\n packageName,\n documentTypes: affectedTypes,\n });\n\n for (const documentType of affectedTypes) {\n const entry = this.#deferred.get(documentType);\n if (!entry) continue;\n\n const module = this.#findModuleInLoadedPackages(documentType);\n if (module) {\n entry.resolve(module);\n } else {\n entry.reject(\n new Error(\n `Package \"${packageName}\" installed but module for \"${documentType}\" not found`,\n ),\n );\n }\n this.#deferred.delete(documentType);\n this.#pending.delete(documentType);\n }\n this.#notifyPendingChanged();\n }\n\n dismissInstallation(packageName: string): void {\n const affectedTypes = this.#findTypesByPackage(packageName);\n if (affectedTypes.length === 0) return;\n\n for (const documentType of affectedTypes) {\n this.#dismissedStorage.set(documentType, true);\n const entry = this.#deferred.get(documentType);\n if (entry) {\n entry.reject(\n new Error(`Document type \"${documentType}\" was dismissed`),\n );\n }\n this.#deferred.delete(documentType);\n this.#pending.delete(documentType);\n this.#discoveredTypes.delete(documentType);\n }\n\n this.#emitEvent({\n type: \"installation-dismissed\",\n packageName,\n documentTypes: affectedTypes,\n });\n this.#notifyPendingChanged();\n }\n\n getPendingInstallations(): PendingInstallation[] {\n return this.#pendingMemo;\n }\n\n subscribePending(listener: () => void): () => void {\n this.#pendingSubscribers.add(listener);\n return () => {\n this.#pendingSubscribers.delete(listener);\n };\n }\n\n subscribeEvents(listener: DiscoveryEventListener): () => void {\n this.#eventSubscribers.add(listener);\n return () => {\n this.#eventSubscribers.delete(listener);\n };\n }\n\n async #discover(documentType: string): Promise<DocumentModelModule<any>> {\n let packageNames: string[];\n try {\n packageNames =\n await this.#registryClient.getPackagesByDocumentType(documentType);\n } catch (error) {\n this.#emitEvent({\n type: \"registry-query-failed\",\n documentType,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n return Promise.reject(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n if (packageNames.length === 0) {\n return Promise.reject(\n new Error(`No packages found for document type \"${documentType}\"`),\n );\n }\n\n const entry = this.#createDeferredEntry(documentType, packageNames);\n\n this.#emitEvent({\n type: \"type-discovered\",\n documentType,\n packageNames,\n });\n\n if (this.#mode === \"immediate\") {\n this.#addToPending(documentType, packageNames);\n } else {\n this.#discoveredTypes.set(documentType, packageNames);\n }\n\n return entry.promise;\n }\n\n #createDeferredEntry(\n documentType: string,\n packageNames: string[],\n ): DeferredEntry {\n let resolve!: (module: DocumentModelModule<any>) => void;\n let reject!: (reason: unknown) => void;\n const promise = new Promise<DocumentModelModule<any>>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n const entry: DeferredEntry = { packageNames, resolve, reject, promise };\n this.#deferred.set(documentType, entry);\n return entry;\n }\n\n #addToPending(documentType: string, packageNames: string[]): void {\n const installation: PendingInstallation = { documentType, packageNames };\n this.#pending.set(documentType, installation);\n this.#emitEvent({\n type: \"installation-prompted\",\n documentType,\n packageNames,\n });\n this.#notifyPendingChanged();\n }\n\n #findModuleInLoadedPackages(\n documentType: string,\n ): DocumentModelModule<any> | undefined {\n return this.#packageManager.packages\n .flatMap((p) => p.documentModels)\n .find((m) => m.documentModel.global.id === documentType);\n }\n\n #findTypesByPackage(packageName: string): string[] {\n const types: string[] = [];\n for (const [documentType, entry] of this.#deferred) {\n if (entry.packageNames.includes(packageName)) {\n types.push(documentType);\n }\n }\n return types;\n }\n\n #notifyPendingChanged(): void {\n this.#pendingMemo = Array.from(this.#pending.values());\n for (const listener of this.#pendingSubscribers) {\n listener();\n }\n }\n\n #emitEvent(event: DiscoveryEvent): void {\n for (const listener of this.#eventSubscribers) {\n listener(event);\n }\n }\n}\n","import * as common from \"@powerhousedao/powerhouse-vetra-packages\";\nimport commonPkg from \"@powerhousedao/powerhouse-vetra-packages/package.json\" with { type: \"json\" };\nimport type {\n IPackagesListener,\n PackageManagerInstallResult,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n BrowserLocalStorage,\n type IPackageListerUnsubscribe,\n type IPackageManager,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n type DocumentModelLib,\n type DocumentModelModule,\n} from \"@powerhousedao/shared/document-model\";\nimport * as vetra from \"@powerhousedao/vetra\";\nimport vetraPkg from \"@powerhousedao/vetra/package.json\" with { type: \"json\" };\n\ntype PackageMeta = {\n name: string;\n importUrl: string | null;\n stylesheetUrl: string | null;\n version?: string;\n};\n\ntype PackageWithMeta = PackageMeta & {\n loadedPackage: DocumentModelLib;\n};\n\nasync function fetchPackageJsonVersion(\n baseUrl: string,\n): Promise<string | undefined> {\n try {\n const res = await fetch(baseUrl);\n if (!res.ok) return undefined;\n const pkg = (await res.json()) as { version?: unknown };\n return typeof pkg.version === \"string\" ? pkg.version : undefined;\n } catch {\n return undefined;\n }\n}\n\nconst LOCAL_PACKAGE_NAME = \"Local\" as const;\nconst COMMON_PACKAGE_NAME = \"Common\" as const;\nconst VETRA_PACKAGE_NAME = \"@powerhousedao/vetra\" as const;\nconst LOCAL_PACKAGES: string[] = [\n LOCAL_PACKAGE_NAME,\n COMMON_PACKAGE_NAME,\n VETRA_PACKAGE_NAME,\n];\n\nexport class BrowserPackageManager implements IPackageManager {\n registryUrl: string | null;\n #storage: BrowserLocalStorage<PackageMeta>;\n #packages: Map<string, DocumentModelLib> = new Map();\n #subscribers = new Set<IPackagesListener>();\n #packagesMemo: DocumentModelLib[] = [];\n #stylesheets: Map<string, HTMLLinkElement> = new Map();\n #localPackage: DocumentModelLib | undefined;\n\n #cdnUrl: string | null;\n #localPackageVersion: string | undefined;\n\n constructor(namespace: string, registryUrl: string | null) {\n this.#storage = new BrowserLocalStorage<PackageMeta>(\n namespace + \":PH_PACKAGES\",\n );\n this.registryUrl = registryUrl;\n this.#cdnUrl = registryUrl !== null ? this.#toCdnUrl(registryUrl) : null;\n }\n\n #toCdnUrl(baseUrl: string): string {\n if (baseUrl.includes(\"/-/cdn\")) return baseUrl;\n const base = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n return `${base}/-/cdn`;\n }\n\n async init(localPackage?: DocumentModelLib, localPackageVersion?: string) {\n const commonPackageWithMeta = this.#loadCommonPackage();\n this.#registerPackage(commonPackageWithMeta);\n const vetraPackageWithMeta = this.#loadVetraPackage();\n this.#registerPackage(vetraPackageWithMeta);\n if (localPackage) {\n this.updateLocalPackage(localPackage, localPackageVersion);\n }\n for (const packageName of this.#storage.keys()) {\n await this.addPackage(packageName);\n }\n }\n\n updateLocalPackage(pkg: DocumentModelLib, version?: string) {\n console.debug(\"Updating local package:\", pkg);\n this.#localPackage = pkg;\n this.#registerPackage({\n name: LOCAL_PACKAGE_NAME,\n stylesheetUrl: null,\n importUrl: null,\n loadedPackage: pkg,\n });\n if (version) {\n this.#localPackageVersion = version;\n this.#notifyPackagesChanged();\n return;\n }\n fetchPackageJsonVersion(\"/package.json\")\n .then((fetchedVersion) => {\n this.#localPackageVersion = fetchedVersion;\n if (fetchedVersion) this.#notifyPackagesChanged();\n })\n .catch(() => {});\n }\n\n get packages() {\n return this.#packagesMemo;\n }\n\n get cdnUrl(): string | null {\n return this.#cdnUrl;\n }\n\n getPackageSource(packageName: string) {\n // check vs the constant name we use for common packages\n if (LOCAL_PACKAGES.includes(packageName)) {\n return \"common\";\n }\n // check if the package has the same name as the local project\n if (packageName === this.#localPackage?.manifest.name) return \"project\";\n const packageMeta = this.#storage.get(packageName);\n // if meta does not exist the package is not installed\n if (!packageMeta) return null;\n // if imported from node_modules then the package is installed locally\n if (packageMeta.importUrl === `/node_modules/${packageName}`)\n return \"local-install\";\n // all other import urls point to a registry\n return \"registry-install\";\n }\n\n getPackageVersion(packageName: string): string | undefined {\n if (packageName === this.#localPackage?.manifest.name) {\n return this.#localPackageVersion;\n }\n return this.#storage.get(packageName)?.version;\n }\n\n async addPackage(packageName: string): Promise<PackageManagerInstallResult> {\n const existingPackage = this.#packages.get(packageName);\n if (existingPackage) {\n return {\n type: \"success\",\n package: existingPackage,\n };\n }\n try {\n const packageWithMeta = await this.#loadPackage(packageName);\n this.#registerPackage(packageWithMeta);\n\n return {\n type: \"success\",\n package: packageWithMeta.loadedPackage,\n };\n } catch (error) {\n return {\n type: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }\n\n async addPackages(packageNames: string[]) {\n const results: PackageManagerInstallResult[] = [];\n for (const packageName of packageNames) {\n const result = await this.addPackage(packageName);\n results.push(result);\n }\n return results;\n }\n\n removePackage(name: string) {\n this.#packages.delete(name);\n this.#storage.delete(name);\n this.#unmountStylesheet(name);\n this.#notifyPackagesChanged();\n }\n\n subscribe(handler: IPackagesListener): IPackageListerUnsubscribe {\n this.#subscribers.add(handler);\n return () => {\n this.#subscribers.delete(handler);\n };\n }\n\n load(documentType: string): Promise<DocumentModelModule<any>> {\n const documentModelModule = Array.from(\n this.#packages.values().flatMap((p) => p.documentModels),\n ).find((m) => m.documentModel.global.id === documentType);\n\n if (documentModelModule) return Promise.resolve(documentModelModule);\n return Promise.reject(new Error(\"Model not available\"));\n }\n\n #loadCommonPackage(): PackageWithMeta {\n return {\n name: common.manifest.name,\n importUrl: null,\n stylesheetUrl: null,\n loadedPackage: common,\n version: commonPkg.version,\n };\n }\n\n #loadVetraPackage(): PackageWithMeta {\n return {\n name: vetra.manifest.name,\n importUrl: null,\n stylesheetUrl: null,\n loadedPackage: vetra,\n version: vetraPkg.version,\n };\n }\n\n async #loadPackageFromNodeModules(name: string): Promise<PackageWithMeta> {\n const importUrl = `/node_modules/${name}/browser/index.js`;\n const stylesheetUrl = `/node_modules/${name}/style.css`;\n\n const packageWithMeta = await this.#importPackage({\n name,\n importUrl,\n stylesheetUrl,\n });\n packageWithMeta.version = await fetchPackageJsonVersion(\n `/node_modules/${name}/package.json`,\n );\n\n return packageWithMeta;\n }\n\n async #loadPackageFromRegistry(name: string): Promise<PackageWithMeta> {\n const importUrl = `${this.#cdnUrl}/${name}/browser/index.js`;\n const stylesheetUrl = `${this.#cdnUrl}/${name}/style.css`;\n const packageWithMeta = await this.#importPackage({\n name,\n importUrl,\n stylesheetUrl,\n });\n packageWithMeta.version = await fetchPackageJsonVersion(\n `${this.#cdnUrl}/${name}/package.json`,\n );\n\n return packageWithMeta;\n }\n\n async #importPackage(packageMeta: PackageMeta) {\n const { name, importUrl, stylesheetUrl } = packageMeta;\n if (!importUrl) {\n throw new Error(`Import url not defined for package \"${name}\".`);\n }\n\n const loadedPackage = (await import(\n /* @vite-ignore */ importUrl\n )) as DocumentModelLib;\n\n return {\n name,\n loadedPackage,\n importUrl,\n stylesheetUrl,\n };\n }\n\n async #loadPackage(packageName: string): Promise<PackageWithMeta> {\n if (LOCAL_PACKAGES.includes(packageName)) {\n throw new Error(\n `Package \"${packageName}\" is a local package and cannot be loaded dynamically.`,\n );\n }\n\n // only attemp to load from node_modules in dev mode\n if (!import.meta.env.PROD) {\n try {\n const packageWithMeta =\n await this.#loadPackageFromNodeModules(packageName);\n return packageWithMeta;\n } catch (error) {\n console.warn(\n `Failed to load package \"${packageName}\" from node_modules:`,\n error,\n );\n }\n }\n\n if (!this.registryUrl) {\n throw new Error(\"Registry url not defined.\");\n }\n\n return await this.#loadPackageFromRegistry(packageName);\n }\n\n #registerPackage(packageWithMeta: PackageWithMeta) {\n const { name, loadedPackage, importUrl, stylesheetUrl, version } =\n packageWithMeta;\n\n if (stylesheetUrl !== null) {\n this.#mountStylesheet(name, stylesheetUrl);\n }\n this.#packages.set(name, loadedPackage);\n this.#storage.set(name, {\n name,\n importUrl,\n stylesheetUrl,\n version,\n });\n\n this.#notifyPackagesChanged();\n }\n\n #mountStylesheet(name: string, href: string) {\n const existing = this.#stylesheets.get(name);\n\n if (existing) return existing;\n\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = href;\n document.head.appendChild(link);\n\n this.#stylesheets.set(name, link);\n }\n\n #unmountStylesheet(name: string): void {\n const link = this.#stylesheets.get(name);\n if (!link) return;\n\n link.remove();\n this.#stylesheets.delete(name);\n }\n\n #notifyPackagesChanged() {\n this.#packagesMemo = Array.from(this.#packages.values());\n const packages = this.packages;\n this.#subscribers.forEach((handler) => {\n handler({ packages });\n });\n }\n}\n","export type PackagesConfig = {\n packages: string[];\n localPackage?: { name: string; version: string } | null;\n};\n\nfunction assertPackagesConfig(value: unknown): asserts value is PackagesConfig {\n if (typeof value !== \"object\" || value === null) {\n throw new Error(\"ph-packages.json must be a JSON object\");\n }\n\n const obj = value as Record<string, unknown>;\n\n if (!Array.isArray(obj.packages)) {\n throw new Error(\"ph-packages.json: 'packages' must be an array\");\n }\n\n if (!obj.packages.every((item) => typeof item === \"string\")) {\n throw new Error(\"ph-packages.json: 'packages' must be an array of strings\");\n }\n}\n\nlet cached: PackagesConfig | undefined;\n\nexport async function loadPackagesConfig(): Promise<PackagesConfig> {\n if (cached) return cached;\n\n const basePath = import.meta.env.BASE_URL ?? \"/\";\n const url = `${basePath}ph-packages.json`;\n const res = await fetch(url);\n const json: unknown = await res.json();\n assertPackagesConfig(json);\n cached = json;\n return cached;\n}\n\n/**\n * Returns the cached config synchronously.\n * Must be called after `loadPackagesConfig()` has resolved.\n */\nexport function getPackagesConfig(): PackagesConfig {\n if (!cached) {\n throw new Error(\n \"Packages config not loaded yet. Call loadPackagesConfig() first.\",\n );\n }\n return cached;\n}\n","import { live } from \"@electric-sql/pglite/live\";\nimport { PGliteWorker } from \"@electric-sql/pglite/worker\";\nimport { createRelationalDb } from \"@powerhousedao/shared/processors\";\nimport { Kysely } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\n\nexport async function getDb() {\n const worker = new Worker(new URL(\"./pglite.worker.js\", import.meta.url), {\n type: \"module\",\n });\n\n const pgLite = await PGliteWorker.create(worker, {\n extensions: { live },\n });\n\n const kysely = new Kysely({\n dialect: new PGliteDialect(pgLite),\n });\n\n const relationalDb = createRelationalDb(kysely);\n\n return { pgLite, relationalDb };\n}\n","import { createAnalyticsStore } from \"@powerhousedao/reactor-browser\";\nimport type { Action } from \"@powerhousedao/shared/document-model\";\nimport { type IProcessorHostModule } from \"@powerhousedao/shared/processors\";\nimport { getDb } from \"../pglite.db.js\";\n\nexport interface IReactorDispatch {\n executeAsync(\n documentIdentifier: string,\n branch: string,\n actions: Action[],\n signal?: AbortSignal,\n ): Promise<{ id: string; status: string }>;\n}\n\ninterface INamedReadModel {\n readonly name: string;\n}\n\nexport async function createProcessorHostModule(\n reactorClient: IReactorDispatch,\n readModels: INamedReadModel[],\n): Promise<IProcessorHostModule | undefined> {\n try {\n const { pgLite, relationalDb } = await getDb();\n const { store: analyticsStore } = await createAnalyticsStore({\n pgLite,\n });\n const processorApp = \"connect\" as const;\n return {\n relationalDb,\n analyticsStore,\n processorApp,\n dispatch: {\n async execute(docId, branch, actions, signal) {\n const jobInfo = await reactorClient.executeAsync(\n docId,\n branch,\n actions,\n signal,\n );\n return { id: jobInfo.id, status: jobInfo.status };\n },\n },\n getReadModel<T>(name: string): T {\n const model = readModels.find((m) => m.name === name);\n if (!model) {\n throw new Error(`Read model \"${name}\" not found`);\n }\n return model as unknown as T;\n },\n };\n } catch (error) {\n console.error(`Failed to initialize processor host module:`);\n console.error(error);\n }\n}\n","import { phGlobalConfigFromEnv } from \"@powerhousedao/connect/config\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport {\n addDefaultDrivesForNewReactor,\n createBrowserReactor,\n getDefaultDrivesFromEnv,\n} from \"@powerhousedao/connect/utils\";\nimport {\n addPHEventHandlers,\n addRemoteDrive,\n DocumentCache,\n DocumentChangeType,\n extractDriveSlugFromPath,\n extractNodeSlugFromPath,\n getDrives,\n login,\n refreshReactorDataClient,\n RegistryClient,\n setDefaultPHGlobalConfig,\n setDocumentCache,\n setDrives,\n setFeatures,\n setPackageDiscoveryService,\n setPHToast,\n setReactorClient,\n setReactorClientModule,\n setRenown,\n setSelectedDrive,\n setSelectedNode,\n setVetraPackageManager,\n type PHToastFn,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n BrowserKeyStorage,\n RenownBuilder,\n RenownCryptoBuilder,\n} from \"@renown/sdk\";\nimport {\n logger,\n type DocumentModelLib,\n type UpgradeManifest,\n} from \"document-model\";\nimport { initFeatureFlags } from \"../feature-flags.js\";\nimport { PackageDiscoveryService } from \"../package-discovery.js\";\nimport { BrowserPackageManager } from \"../package-manager.js\";\nimport { loadPackagesConfig } from \"../packages.config.js\";\nimport { createProcessorHostModule } from \"./processor-host-module.js\";\n\nexport async function clearReactorStorage() {\n await window.ph?.reactorClientModule?.pg?.close();\n\n // Dropping tables inside an existing PGlite instance is unreliable with\n // `relaxedDurability: true` followed by an immediate page reload — pending\n // IDB writes can be lost. Deleting the underlying database outright sidesteps\n // flush-timing; the next startup re-creates and re-migrates from scratch.\n const dbs = await indexedDB.databases();\n const targets = dbs\n .map((d) => d.name)\n .filter((n): n is string => !!n && /pglite|reactor/i.test(n));\n\n await Promise.all(\n targets.map(\n (name) =>\n new Promise<void>((resolve) => {\n const req = indexedDB.deleteDatabase(name);\n req.onsuccess = req.onerror = req.onblocked = () => resolve();\n }),\n ),\n );\n}\n\nexport async function createReactor(localPackage?: DocumentModelLib) {\n if (!window.ph) {\n window.ph = {};\n }\n if (window.ph.loading) return;\n\n window.ph.loading = true;\n\n // add window event handlers for updates\n addPHEventHandlers();\n\n // register toast function for use in editor components\n setPHToast(toast as PHToastFn);\n\n // initialize feature flags\n const features = await initFeatureFlags();\n\n logger.info(\n \"Features: @features\",\n JSON.stringify(Object.fromEntries(features), null, 2),\n );\n\n // initialize renown crypto\n const keyPairStorage = await BrowserKeyStorage.create();\n const renownCrypto = await new RenownCryptoBuilder()\n .withKeyPairStorage(keyPairStorage)\n .build();\n\n // initialize Renown\n const renown = await new RenownBuilder(\"connect\", {\n basename: phGlobalConfigFromEnv.routerBasename,\n baseUrl: phGlobalConfigFromEnv.renownUrl,\n })\n .withCrypto(renownCrypto)\n .build();\n\n // load packages list from ph-packages.json (replaceable post-build)\n const packagesConfig = await loadPackagesConfig();\n\n // initialize package manager\n const packageManager = new BrowserPackageManager(\n phGlobalConfigFromEnv.routerBasename ?? \"\",\n PH_PACKAGE_REGISTRY_URL,\n );\n setVetraPackageManager(packageManager);\n await packageManager.init(localPackage, packagesConfig.localPackage?.version);\n const packagesResult = await packageManager.addPackages(\n packagesConfig.packages,\n );\n packagesResult.map((r) => {\n if (r.type === \"error\") console.error(r.error);\n });\n\n // get document models to set in the reactor (all versions)\n const documentModelModules = packageManager.packages\n .flatMap((pkg) => pkg.documentModels)\n .filter(\n (module, index, modules) =>\n // deduplicate by documentType and version\n modules.findIndex(\n (m) =>\n m.documentModel.global.id === module.documentModel.global.id &&\n m.version === module.version,\n ) === index,\n );\n\n // get upgrade manifests from packages\n const upgradeManifests = packageManager.packages\n .flatMap((pkg) => pkg.upgradeManifests)\n .filter(\n (manifest, index, manifests) =>\n // deduplicate by documentType and version\n manifest !== undefined &&\n manifests.findIndex(\n (m) => m && m.documentType === manifest.documentType,\n ) === index,\n ) as UpgradeManifest<readonly number[]>[];\n\n // initialize package discovery service for auto-installing unknown document types\n const discoveryService =\n packageManager.cdnUrl !== null\n ? new PackageDiscoveryService(\n packageManager,\n new RegistryClient(packageManager.cdnUrl),\n {\n mode: \"immediate\",\n storageKey: phGlobalConfigFromEnv.routerBasename ?? \"\",\n },\n )\n : undefined;\n\n if (discoveryService) {\n setPackageDiscoveryService(discoveryService);\n }\n\n // create reactor v2 with all versions and upgrade manifests\n const reactorClientModule = await createBrowserReactor(\n documentModelModules,\n upgradeManifests,\n renown,\n discoveryService,\n );\n\n // get the drives from the reactor\n const drives = await getDrives(reactorClientModule.client);\n\n // set the selected drive and node from the path\n const path = window.location.pathname;\n const driveSlug = extractDriveSlugFromPath(path);\n const nodeSlug = extractNodeSlugFromPath(path);\n\n // initialize user from URL parameter\n const didFromUrl = getDidFromUrl();\n await login(didFromUrl, renown);\n\n const documentCache = new DocumentCache(reactorClientModule.client);\n\n // dispatch the events to set the values in the window object\n setDefaultPHGlobalConfig(phGlobalConfigFromEnv);\n setReactorClientModule(reactorClientModule);\n setReactorClient(reactorClientModule.client);\n setDocumentCache(documentCache);\n setRenown(renown);\n setDrives(drives);\n setSelectedDrive(driveSlug);\n setSelectedNode(nodeSlug);\n setFeatures(features);\n\n // Add default drives for new reactor (after window.ph is set up)\n const defaultDrivesConfig = getDefaultDrivesFromEnv();\n if (defaultDrivesConfig.length > 0) {\n await addDefaultDrivesForNewReactor(defaultDrivesConfig);\n }\n\n // if remoteUrl is set and drive not already existing add remote drive and open it\n const remoteUrl = getDriveUrl();\n if (remoteUrl) {\n try {\n await addRemoteDrive(remoteUrl);\n } catch (error) {\n console.error(`Failed to add remote drive from ${remoteUrl}:`, error);\n }\n }\n\n // Subscribe via ReactorClient interface\n const reactorClient = reactorClientModule.client;\n reactorClient.subscribe({ type: \"powerhouse/document-drive\" }, (event) => {\n logger.verbose(\"ReactorClient subscription event: @event\", event);\n refreshReactorDataClient(reactorClientModule.client).catch((e) =>\n logger.error(\"@error\", e),\n );\n });\n\n // Redirect when a currently-viewed document or drive is deleted remotely\n reactorClient.subscribe({}, (event) => {\n if (event.type !== DocumentChangeType.Deleted) return;\n const deletedId = event.context?.childId;\n if (!deletedId) return;\n\n const selectedDriveId = window.ph?.selectedDriveId;\n const selectedNodeId = window.ph?.selectedNodeId;\n\n if (selectedDriveId && deletedId === selectedDriveId) {\n setSelectedDrive(undefined);\n toast(\"The drive you were viewing has been deleted\");\n return;\n }\n\n if (selectedNodeId && deletedId === selectedNodeId) {\n setSelectedNode(undefined);\n toast(\"The document you were editing has been deleted\");\n }\n });\n\n // Refresh from ReactorClient to pick up any synced drives\n await refreshReactorDataClient(reactorClientModule.client);\n\n // Setup processor factories for packages that have them\n const packagesWithProcessorFactories = packageManager.packages.filter(\n (pkg) => pkg.processorFactory !== undefined,\n );\n\n if (packagesWithProcessorFactories.length > 0) {\n const readModels =\n reactorClientModule.reactorModule?.readModelCoordinator?.readModels ?? [];\n const processorHostModule = await createProcessorHostModule(\n reactorClientModule.client,\n readModels,\n );\n if (processorHostModule !== undefined) {\n await Promise.all(\n packagesWithProcessorFactories.map(async (pkg) => {\n const { manifest, processorFactory } = pkg;\n const name = manifest.name;\n const id = manifest.name;\n logger.info(\"Loading processor factory: @name\", name);\n try {\n const factory = await processorFactory?.(processorHostModule);\n if (!factory) return;\n await reactorClientModule.reactorModule?.processorManager.registerFactory(\n id,\n factory,\n );\n } catch (error) {\n logger.error(`Error registering processor: @name`, name);\n logger.error(\"@error\", error);\n }\n }),\n );\n }\n }\n\n window.ph.loading = false;\n}\n\nfunction getDidFromUrl() {\n const searchParams = new URLSearchParams(window.location.search);\n const didComponent = searchParams.get(\"user\");\n const did = didComponent ? decodeURIComponent(didComponent) : undefined;\n return did;\n}\n\nfunction getDriveUrl() {\n const searchParams = new URLSearchParams(window.location.search);\n const driveUrl = searchParams.get(\"driveUrl\");\n const url = driveUrl ? decodeURIComponent(driveUrl) : undefined;\n return url;\n}\n"],"mappings":"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"}
@@ -509,7 +509,7 @@ const AppSkeleton = (props) => {
509
509
  //#endregion
510
510
  //#region src/components/modal/modals-container.tsx
511
511
  const AddDriveModal$1 = lazy(() => import("./AddDriveModal-CBK9gEWg.js").then((m) => ({ default: m.AddDriveModal })));
512
- const ClearStorageModal = lazy(() => import("./ClearStorageModal-Bzf3Ys-O.js").then((m) => ({ default: m.ClearStorageModal })));
512
+ const ClearStorageModal = lazy(() => import("./ClearStorageModal-lyh2_0P5.js").then((m) => ({ default: m.ClearStorageModal })));
513
513
  const CookiesPolicyModal = lazy(() => import("./CookiesPolicyModal-Gae1QuhA.js").then((m) => ({ default: m.CookiesPolicyModal })));
514
514
  const CreateDocumentModal$1 = lazy(() => import("./CreateDocumentModal-5i6rmv3C.js").then((m) => ({ default: m.CreateDocumentModal })));
515
515
  const DebugSettingsModal = lazy(() => import("./DebugSettingsModal-ZNWhlMQN.js").then((m) => ({ default: m.DebugSettingsModal })));
@@ -518,7 +518,7 @@ const DeleteItemModal = lazy(() => import("./DeleteItemModal-CkWegLlh.js").then(
518
518
  const DisclaimerModal = lazy(() => import("./DisclaimerModal-CCnvwoB5.js").then((m) => ({ default: m.DisclaimerModal })));
519
519
  const DriveSettingsModal$1 = lazy(() => import("./DriveSettingsModal-DxMjOsLg.js").then((m) => ({ default: m.DriveSettingsModal })));
520
520
  const ExportDocumentWithErrorsModal = lazy(() => import("./ExportDocumentWithErrorsModal-hgliF8Gy.js").then((m) => ({ default: m.ExportDocumentWithErrorsModal })));
521
- const SettingsModal$1 = lazy(() => import("./SettingsModal-lPXsUl7D.js").then((m) => ({ default: m.SettingsModal })));
521
+ const SettingsModal$1 = lazy(() => import("./SettingsModal-DXizOr6D.js").then((m) => ({ default: m.SettingsModal })));
522
522
  const UpgradeDriveModal = lazy(() => import("./UpgradeDriveModal-DldcNCaT.js").then((m) => ({ default: m.UpgradeDriveModal })));
523
523
  const modalComponents = {
524
524
  addDrive: AddDriveModal$1,
@@ -534,7 +534,7 @@ const modalComponents = {
534
534
  inspector: lazy(() => import("./InspectorModal-C4rE0Y5E.js").then((m) => ({ default: m.InspectorModal }))),
535
535
  settings: SettingsModal$1,
536
536
  upgradeDrive: UpgradeDriveModal,
537
- missingPackage: lazy(() => import("./MissingPackageModal-cr5tZDVw.js").then((m) => ({ default: m.ConnectMissingPackageModal })))
537
+ missingPackage: lazy(() => import("./MissingPackageModal-7VpP86dg.js").then((m) => ({ default: m.ConnectMissingPackageModal })))
538
538
  };
539
539
  const ModalsContainer = lazy(async () => {
540
540
  return { default: () => {
@@ -554,7 +554,7 @@ const ModalsContainer = lazy(async () => {
554
554
  //#endregion
555
555
  //#region src/components/app-loader.tsx
556
556
  const AppLoader = (props) => {
557
- const Load = lazy(() => import("./load-Dsi2HpPk.js").then((m) => m.loadComponent(props.localPackage)));
557
+ const Load = lazy(() => import("./load-DMuvH92l.js").then((m) => m.loadComponent(props.localPackage)));
558
558
  return /* @__PURE__ */ jsx(StrictMode, { children: /* @__PURE__ */ jsxs(ErrorBoundary$1, {
559
559
  fallbackRender: (props) => /* @__PURE__ */ jsx(AppSkeleton, { children: /* @__PURE__ */ jsx(DetailedFallback, { ...props }) }),
560
560
  resetKeys: [props.localPackage],
@@ -1206,4 +1206,4 @@ function Sidebar() {
1206
1206
  //#endregion
1207
1207
  export { AppLoader as t };
1208
1208
 
1209
- //# sourceMappingURL=sidebar-C4J77D6n.js.map
1209
+ //# sourceMappingURL=sidebar-aGcc7GEz.js.map