@powerhousedao/connect 6.0.0-dev.135 → 6.0.0-dev.137

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 (27) hide show
  1. package/dist/{AddDriveModal-A2SuEFot.js → AddDriveModal-CT8C5KqN.js} +7 -7
  2. package/dist/AddDriveModal-CT8C5KqN.js.map +1 -0
  3. package/dist/{ClearStorageModal-BW6OgSQZ.js → ClearStorageModal-CGFmu0pv.js} +2 -2
  4. package/dist/{ClearStorageModal-BW6OgSQZ.js.map → ClearStorageModal-CGFmu0pv.js.map} +1 -1
  5. package/dist/{DebugSettingsModal-Ko7M_1hz.js → DebugSettingsModal-ZNWhlMQN.js} +3 -3
  6. package/dist/{DebugSettingsModal-Ko7M_1hz.js.map → DebugSettingsModal-ZNWhlMQN.js.map} +1 -1
  7. package/dist/{SettingsModal-Cic7jYhm.js → SettingsModal-DRmB1j5k.js} +3 -3
  8. package/dist/{SettingsModal-Cic7jYhm.js.map → SettingsModal-DRmB1j5k.js.map} +1 -1
  9. package/dist/{connect.config-CUbxYkCy.js → connect.config-DDu1QWU1.js} +3 -3
  10. package/dist/connect.config-DDu1QWU1.js.map +1 -0
  11. package/dist/{load-Cj671zwU.js → load-DGz2lnhL.js} +4 -4
  12. package/dist/{load-Cj671zwU.js.map → load-DGz2lnhL.js.map} +1 -1
  13. package/dist/main.js +1 -1
  14. package/dist/{package-J4OYYMmC.js → package-uT53xnG6.js} +2 -2
  15. package/dist/package-uT53xnG6.js.map +1 -0
  16. package/dist/{reactor-Be0fd4-f.js → reactor-XtvM2Ar4.js} +3 -3
  17. package/dist/{reactor-Be0fd4-f.js.map → reactor-XtvM2Ar4.js.map} +1 -1
  18. package/dist/{registerServiceWorker-fSbJUcrq.js → registerServiceWorker-19nMRUMW.js} +2 -2
  19. package/dist/{registerServiceWorker-fSbJUcrq.js.map → registerServiceWorker-19nMRUMW.js.map} +1 -1
  20. package/dist/{sidebar-DNioAbBU.js → sidebar-NyKzP7ZT.js} +182 -182
  21. package/dist/sidebar-NyKzP7ZT.js.map +1 -0
  22. package/dist/start-connect.js +1 -1
  23. package/package.json +9 -9
  24. package/dist/AddDriveModal-A2SuEFot.js.map +0 -1
  25. package/dist/connect.config-CUbxYkCy.js.map +0 -1
  26. package/dist/package-J4OYYMmC.js.map +0 -1
  27. package/dist/sidebar-DNioAbBU.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { t as toast$1 } from "./toast-iD-70hL8.js";
2
- import { addDrive, addRemoteDrive, closePHModal, setSelectedDrive, useDriveEditorModules, usePHModal, useRenown, useUser } from "@powerhousedao/reactor-browser";
2
+ import { addDrive, addRemoteDrive, closePHModal, setSelectedDrive, useAppModules, usePHModal, useRenown, useUser } from "@powerhousedao/reactor-browser";
3
3
  import { AddDriveModal as AddDriveModal$1 } from "@powerhousedao/design-system/connect";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  import { t } from "i18next";
@@ -13,10 +13,10 @@ function AddDriveModal() {
13
13
  const open = usePHModal()?.type === "addDrive";
14
14
  const user = useUser();
15
15
  const renown = useRenown();
16
- const driveEditorModules = useDriveEditorModules();
16
+ const appModules = useAppModules();
17
17
  const onAddLocalDrive = async (data) => {
18
18
  try {
19
- const app = driveEditorModules?.find((a) => a.id === data.appId);
19
+ const app = appModules?.find((a) => a.id === data.appId);
20
20
  const newDrive = await addDrive({
21
21
  id: "",
22
22
  slug: "",
@@ -55,7 +55,7 @@ function AddDriveModal() {
55
55
  await onAddRemoteDrive(data);
56
56
  closePHModal();
57
57
  }
58
- const ready = !!driveEditorModules?.length;
58
+ const ready = !!appModules?.length;
59
59
  return /* @__PURE__ */ jsx(AddDriveModal$1, {
60
60
  open: open && ready,
61
61
  onAddLocalDrive: onAddLocalDriveSubmit,
@@ -75,14 +75,14 @@ function AddDriveModal() {
75
75
  onOpenChange: (status) => {
76
76
  if (!status) return closePHModal();
77
77
  },
78
- appOptions: driveEditorModules?.map((pkg) => ({
78
+ appOptions: appModules?.map((pkg) => ({
79
79
  id: pkg.id,
80
80
  name: pkg.name,
81
- driveEditor: pkg.id
81
+ app: pkg.id
82
82
  })) || []
83
83
  });
84
84
  }
85
85
  //#endregion
86
86
  export { AddDriveModal };
87
87
 
88
- //# sourceMappingURL=AddDriveModal-A2SuEFot.js.map
88
+ //# sourceMappingURL=AddDriveModal-CT8C5KqN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddDriveModal-CT8C5KqN.js","names":["ConnectAddLocalDriveModal"],"sources":["../src/components/modal/modals/AddDriveModal.tsx"],"sourcesContent":["import { toast } from \"@powerhousedao/connect/services\";\nimport type {\n AddLocalDriveInput,\n AddRemoteDriveInput,\n} from \"@powerhousedao/design-system/connect\";\nimport { AddDriveModal as ConnectAddLocalDriveModal } from \"@powerhousedao/design-system/connect\";\nimport {\n addDrive,\n addRemoteDrive,\n closePHModal,\n setSelectedDrive,\n useAppModules,\n usePHModal,\n useRenown,\n useUser,\n} from \"@powerhousedao/reactor-browser\";\nimport { t } from \"i18next\";\n\nasync function requestPublicDriveFromReactor(\n url: string,\n headers?: Record<string, string>,\n): Promise<{ id: string; name: string }> {\n const response = await fetch(url, { headers: headers ?? {} });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n return (await response.json()) as { id: string; name: string };\n}\n\nexport function AddDriveModal() {\n const phModal = usePHModal();\n const open = phModal?.type === \"addDrive\";\n const user = useUser();\n const renown = useRenown();\n const appModules = useAppModules();\n const onAddLocalDrive = async (data: AddLocalDriveInput) => {\n try {\n const app = appModules?.find((a) => a.id === data.appId);\n const newDrive = await addDrive(\n {\n id: \"\",\n slug: \"\",\n global: {\n name: data.name,\n icon: null,\n },\n local: {\n availableOffline: data.availableOffline,\n sharingType: data.sharingType.toLowerCase(),\n listeners: [],\n triggers: [],\n },\n },\n app?.id,\n );\n\n toast(t(\"notifications.addDriveSuccess\"), {\n type: \"connect-success\",\n });\n\n if (!newDrive) {\n return;\n }\n\n setSelectedDrive(newDrive);\n } catch (e) {\n console.error(e);\n }\n };\n\n const onAddRemoteDrive = async (data: AddRemoteDriveInput) => {\n try {\n const driveId = await addRemoteDrive(data.url, data.id);\n\n toast(t(\"notifications.addDriveSuccess\"), {\n type: \"connect-success\",\n });\n\n setSelectedDrive(driveId);\n } catch (e) {\n console.error(e);\n }\n };\n async function onAddLocalDriveSubmit(data: AddLocalDriveInput) {\n await onAddLocalDrive(data);\n closePHModal();\n }\n\n async function onAddRemoteDriveSubmit(data: AddRemoteDriveInput) {\n await onAddRemoteDrive(data);\n closePHModal();\n }\n\n const ready = !!appModules?.length;\n\n return (\n <ConnectAddLocalDriveModal\n open={open && ready}\n onAddLocalDrive={onAddLocalDriveSubmit}\n onAddRemoteDrive={onAddRemoteDriveSubmit}\n requestPublicDrive={async (url: string) => {\n try {\n if (user) {\n const authToken = await renown?.getBearerToken?.({\n expiresIn: 10,\n aud: url,\n });\n return requestPublicDriveFromReactor(url, {\n Authorization: `Bearer ${authToken}`,\n });\n }\n return requestPublicDriveFromReactor(url);\n } catch (error) {\n console.error(error);\n return requestPublicDriveFromReactor(url);\n }\n }}\n onOpenChange={(status) => {\n if (!status) return closePHModal();\n }}\n appOptions={\n appModules?.map((pkg) => ({\n id: pkg.id,\n name: pkg.name,\n app: pkg.id,\n })) || []\n }\n />\n );\n}\n"],"mappings":";;;;;;AAkBA,eAAe,8BACb,KACA,SACuC;CACvC,MAAM,WAAW,MAAM,MAAM,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,CAAC;AAC7D,KAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,QAAQ,SAAS,SAAS;AAE5C,QAAQ,MAAM,SAAS,MAAM;;AAG/B,SAAgB,gBAAgB;CAE9B,MAAM,OADU,YAAY,EACN,SAAS;CAC/B,MAAM,OAAO,SAAS;CACtB,MAAM,SAAS,WAAW;CAC1B,MAAM,aAAa,eAAe;CAClC,MAAM,kBAAkB,OAAO,SAA6B;AAC1D,MAAI;GACF,MAAM,MAAM,YAAY,MAAM,MAAM,EAAE,OAAO,KAAK,MAAM;GACxD,MAAM,WAAW,MAAM,SACrB;IACE,IAAI;IACJ,MAAM;IACN,QAAQ;KACN,MAAM,KAAK;KACX,MAAM;KACP;IACD,OAAO;KACL,kBAAkB,KAAK;KACvB,aAAa,KAAK,YAAY,aAAa;KAC3C,WAAW,EAAE;KACb,UAAU,EAAE;KACb;IACF,EACD,KAAK,GACN;AAED,WAAM,EAAE,gCAAgC,EAAE,EACxC,MAAM,mBACP,CAAC;AAEF,OAAI,CAAC,SACH;AAGF,oBAAiB,SAAS;WACnB,GAAG;AACV,WAAQ,MAAM,EAAE;;;CAIpB,MAAM,mBAAmB,OAAO,SAA8B;AAC5D,MAAI;GACF,MAAM,UAAU,MAAM,eAAe,KAAK,KAAK,KAAK,GAAG;AAEvD,WAAM,EAAE,gCAAgC,EAAE,EACxC,MAAM,mBACP,CAAC;AAEF,oBAAiB,QAAQ;WAClB,GAAG;AACV,WAAQ,MAAM,EAAE;;;CAGpB,eAAe,sBAAsB,MAA0B;AAC7D,QAAM,gBAAgB,KAAK;AAC3B,gBAAc;;CAGhB,eAAe,uBAAuB,MAA2B;AAC/D,QAAM,iBAAiB,KAAK;AAC5B,gBAAc;;CAGhB,MAAM,QAAQ,CAAC,CAAC,YAAY;AAE5B,QACE,oBAACA,iBAAD;EACE,MAAM,QAAQ;EACd,iBAAiB;EACjB,kBAAkB;EAClB,oBAAoB,OAAO,QAAgB;AACzC,OAAI;AACF,QAAI,KAKF,QAAO,8BAA8B,KAAK,EACxC,eAAe,UALC,MAAM,QAAQ,iBAAiB;KAC/C,WAAW;KACX,KAAK;KACN,CAAC,IAGD,CAAC;AAEJ,WAAO,8BAA8B,IAAI;YAClC,OAAO;AACd,YAAQ,MAAM,MAAM;AACpB,WAAO,8BAA8B,IAAI;;;EAG7C,eAAe,WAAW;AACxB,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,YACE,YAAY,KAAK,SAAS;GACxB,IAAI,IAAI;GACR,MAAM,IAAI;GACV,KAAK,IAAI;GACV,EAAE,IAAI,EAAE;EAEX,CAAA"}
@@ -1,4 +1,4 @@
1
- import { t as clearReactorStorage } from "./reactor-Be0fd4-f.js";
1
+ import { t as clearReactorStorage } from "./reactor-XtvM2Ar4.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-BW6OgSQZ.js.map
44
+ //# sourceMappingURL=ClearStorageModal-CGFmu0pv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClearStorageModal-BW6OgSQZ.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-CGFmu0pv.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,5 +1,5 @@
1
- import { t as connectConfig } from "./connect.config-CUbxYkCy.js";
2
- import { t as serviceWorkerManager } from "./registerServiceWorker-fSbJUcrq.js";
1
+ import { t as connectConfig } from "./connect.config-DDu1QWU1.js";
2
+ import { t as serviceWorkerManager } from "./registerServiceWorker-19nMRUMW.js";
3
3
  import { closePHModal, usePHModal } from "@powerhousedao/reactor-browser";
4
4
  import { useEffect, useState } from "react";
5
5
  import { Combobox, FormInput } from "@powerhousedao/design-system/connect";
@@ -136,4 +136,4 @@ const DebugSettingsModal = () => {
136
136
  //#endregion
137
137
  export { DebugSettingsModal };
138
138
 
139
- //# sourceMappingURL=DebugSettingsModal-Ko7M_1hz.js.map
139
+ //# sourceMappingURL=DebugSettingsModal-ZNWhlMQN.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DebugSettingsModal-Ko7M_1hz.js","names":[],"sources":["../src/components/modal/modals/DebugSettingsModal.tsx"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { serviceWorkerManager } from \"@powerhousedao/connect/utils\";\nimport { Icon, Modal, PowerhouseButton } from \"@powerhousedao/design-system\";\nimport { Combobox, FormInput } from \"@powerhousedao/design-system/connect\";\nimport { closePHModal, usePHModal } from \"@powerhousedao/reactor-browser\";\nimport { useEffect, useState } from \"react\";\n\nexport const DebugSettingsModal: React.FC = () => {\n const phModal = usePHModal();\n const open = phModal?.type === \"debugSettings\";\n\n const [appVersion, setAppVersion] = useState(connectConfig.appVersion);\n const [serviceWorkerDebugMode, setServiceWorkerDebugMode] = useState({\n label: serviceWorkerManager.debug ? \"Enabled\" : \"Disabled\",\n value: serviceWorkerManager.debug,\n });\n\n useEffect(() => {\n serviceWorkerManager.setDebug(serviceWorkerDebugMode.value);\n }, [serviceWorkerDebugMode]);\n\n return (\n <Modal\n open={open}\n onOpenChange={(status) => {\n if (!status) return closePHModal();\n }}\n contentProps={{\n className: \"rounded-2xl\",\n }}\n >\n <div className=\"w-[700px] rounded-2xl p-6\">\n <div className=\"mb-6 flex justify-between\">\n <div className=\"text-xl font-bold\">Debug Tools</div>\n <button id=\"close-modal\" onClick={() => closePHModal()}>\n <Icon name=\"Xmark\" size={28} />\n </button>\n </div>\n <div className=\"flex text-sm font-bold\">\n <Icon name=\"Ring\" size={22} />\n <span className=\"ml-2\">App Version: {connectConfig.appVersion}</span>\n </div>\n <div className=\"mt-4 flex text-sm font-bold\">\n <Icon name=\"Hdd\" size={22} />\n <span className=\"ml-2\">Drive Tools:</span>\n </div>\n\n <div className=\"mt-4 flex text-sm font-bold\">\n <Icon name=\"Gear\" size={22} />\n <span className=\"ml-2\">Service Worker Tools:</span>\n </div>\n <div className=\"mt-2 flex items-end justify-between pl-4\">\n <div className=\"w-[400px]\">\n <label htmlFor=\"serviceWorkerDebugMode\" className=\"text-xs\">\n Service Worker Debug Mode:\n </label>\n <Combobox\n id=\"serviceWorkerDebugMode\"\n onChange={(value) => {\n setServiceWorkerDebugMode(\n value as typeof serviceWorkerDebugMode,\n );\n }}\n value={serviceWorkerDebugMode}\n options={[\n { label: \"Enabled\", value: true },\n { label: \"Disabled\", value: false },\n ]}\n />\n </div>\n </div>\n <div className=\"mt-2 flex items-end justify-between pl-4\">\n <div className=\"w-[400px]\">\n <label htmlFor=\"appVersion\" className=\"text-xs\">\n Set invalid app version:\n </label>\n <FormInput\n containerClassName=\"p-1 bg-white border border-gray-200 rounded-md text-sm\"\n inputClassName=\"text-xs font-normal\"\n id=\"appVersion\"\n icon={\n <div className=\"flex h-full items-center text-xs\">Version:</div>\n }\n value={appVersion}\n onChange={(element) => setAppVersion(element.target.value)}\n />\n </div>\n <div className=\"mb-1 flex items-center justify-center\">\n <PowerhouseButton\n color={appVersion === \"\" ? \"light\" : \"red\"}\n size=\"small\"\n disabled={appVersion === \"\"}\n onClick={() => {\n // @ts-expect-error todo add send message method to service worker manager class\n serviceWorkerManager.sendMessage({\n type: \"SET_APP_VERSION\",\n version: appVersion,\n });\n setAppVersion(\"\");\n }}\n >\n Add Invalid App Version\n </PowerhouseButton>\n </div>\n </div>\n </div>\n </Modal>\n );\n};\n"],"mappings":";;;;;;;;AAOA,MAAa,2BAAqC;CAEhD,MAAM,OADU,YAAY,EACN,SAAS;CAE/B,MAAM,CAAC,YAAY,iBAAiB,SAAS,cAAc,WAAW;CACtE,MAAM,CAAC,wBAAwB,6BAA6B,SAAS;EACnE,OAAO,qBAAqB,QAAQ,YAAY;EAChD,OAAO,qBAAqB;EAC7B,CAAC;AAEF,iBAAgB;AACd,uBAAqB,SAAS,uBAAuB,MAAM;IAC1D,CAAC,uBAAuB,CAAC;AAE5B,QACE,oBAAC,OAAD;EACQ;EACN,eAAe,WAAW;AACxB,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,cAAc,EACZ,WAAW,eACZ;YAED,qBAAC,OAAD;GAAK,WAAU;aAAf;IACE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,OAAD;MAAK,WAAU;gBAAoB;MAAiB,CAAA,EACpD,oBAAC,UAAD;MAAQ,IAAG;MAAc,eAAe,cAAc;gBACpD,oBAAC,MAAD;OAAM,MAAK;OAAQ,MAAM;OAAM,CAAA;MACxB,CAAA,CACL;;IACN,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,MAAD;MAAM,MAAK;MAAO,MAAM;MAAM,CAAA,EAC9B,qBAAC,QAAD;MAAM,WAAU;gBAAhB,CAAuB,iBAAc,cAAc,WAAkB;QACjE;;IACN,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,MAAD;MAAM,MAAK;MAAM,MAAM;MAAM,CAAA,EAC7B,oBAAC,QAAD;MAAM,WAAU;gBAAO;MAAmB,CAAA,CACtC;;IAEN,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,MAAD;MAAM,MAAK;MAAO,MAAM;MAAM,CAAA,EAC9B,oBAAC,QAAD;MAAM,WAAU;gBAAO;MAA4B,CAAA,CAC/C;;IACN,oBAAC,OAAD;KAAK,WAAU;eACb,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,SAAD;OAAO,SAAQ;OAAyB,WAAU;iBAAU;OAEpD,CAAA,EACR,oBAAC,UAAD;OACE,IAAG;OACH,WAAW,UAAU;AACnB,kCACE,MACD;;OAEH,OAAO;OACP,SAAS,CACP;QAAE,OAAO;QAAW,OAAO;QAAM,EACjC;QAAE,OAAO;QAAY,OAAO;QAAO,CACpC;OACD,CAAA,CACE;;KACF,CAAA;IACN,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,SAAD;OAAO,SAAQ;OAAa,WAAU;iBAAU;OAExC,CAAA,EACR,oBAAC,WAAD;OACE,oBAAmB;OACnB,gBAAe;OACf,IAAG;OACH,MACE,oBAAC,OAAD;QAAK,WAAU;kBAAmC;QAAc,CAAA;OAElE,OAAO;OACP,WAAW,YAAY,cAAc,QAAQ,OAAO,MAAM;OAC1D,CAAA,CACE;SACN,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,kBAAD;OACE,OAAO,eAAe,KAAK,UAAU;OACrC,MAAK;OACL,UAAU,eAAe;OACzB,eAAe;AAEb,6BAAqB,YAAY;SAC/B,MAAM;SACN,SAAS;SACV,CAAC;AACF,sBAAc,GAAG;;iBAEpB;OAEkB,CAAA;MACf,CAAA,CACF;;IACF;;EACA,CAAA"}
1
+ {"version":3,"file":"DebugSettingsModal-ZNWhlMQN.js","names":[],"sources":["../src/components/modal/modals/DebugSettingsModal.tsx"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { serviceWorkerManager } from \"@powerhousedao/connect/utils\";\nimport { Icon, Modal, PowerhouseButton } from \"@powerhousedao/design-system\";\nimport { Combobox, FormInput } from \"@powerhousedao/design-system/connect\";\nimport { closePHModal, usePHModal } from \"@powerhousedao/reactor-browser\";\nimport { useEffect, useState } from \"react\";\n\nexport const DebugSettingsModal: React.FC = () => {\n const phModal = usePHModal();\n const open = phModal?.type === \"debugSettings\";\n\n const [appVersion, setAppVersion] = useState(connectConfig.appVersion);\n const [serviceWorkerDebugMode, setServiceWorkerDebugMode] = useState({\n label: serviceWorkerManager.debug ? \"Enabled\" : \"Disabled\",\n value: serviceWorkerManager.debug,\n });\n\n useEffect(() => {\n serviceWorkerManager.setDebug(serviceWorkerDebugMode.value);\n }, [serviceWorkerDebugMode]);\n\n return (\n <Modal\n open={open}\n onOpenChange={(status) => {\n if (!status) return closePHModal();\n }}\n contentProps={{\n className: \"rounded-2xl\",\n }}\n >\n <div className=\"w-[700px] rounded-2xl p-6\">\n <div className=\"mb-6 flex justify-between\">\n <div className=\"text-xl font-bold\">Debug Tools</div>\n <button id=\"close-modal\" onClick={() => closePHModal()}>\n <Icon name=\"Xmark\" size={28} />\n </button>\n </div>\n <div className=\"flex text-sm font-bold\">\n <Icon name=\"Ring\" size={22} />\n <span className=\"ml-2\">App Version: {connectConfig.appVersion}</span>\n </div>\n <div className=\"mt-4 flex text-sm font-bold\">\n <Icon name=\"Hdd\" size={22} />\n <span className=\"ml-2\">Drive Tools:</span>\n </div>\n\n <div className=\"mt-4 flex text-sm font-bold\">\n <Icon name=\"Gear\" size={22} />\n <span className=\"ml-2\">Service Worker Tools:</span>\n </div>\n <div className=\"mt-2 flex items-end justify-between pl-4\">\n <div className=\"w-[400px]\">\n <label htmlFor=\"serviceWorkerDebugMode\" className=\"text-xs\">\n Service Worker Debug Mode:\n </label>\n <Combobox\n id=\"serviceWorkerDebugMode\"\n onChange={(value) => {\n setServiceWorkerDebugMode(\n value as typeof serviceWorkerDebugMode,\n );\n }}\n value={serviceWorkerDebugMode}\n options={[\n { label: \"Enabled\", value: true },\n { label: \"Disabled\", value: false },\n ]}\n />\n </div>\n </div>\n <div className=\"mt-2 flex items-end justify-between pl-4\">\n <div className=\"w-[400px]\">\n <label htmlFor=\"appVersion\" className=\"text-xs\">\n Set invalid app version:\n </label>\n <FormInput\n containerClassName=\"p-1 bg-white border border-gray-200 rounded-md text-sm\"\n inputClassName=\"text-xs font-normal\"\n id=\"appVersion\"\n icon={\n <div className=\"flex h-full items-center text-xs\">Version:</div>\n }\n value={appVersion}\n onChange={(element) => setAppVersion(element.target.value)}\n />\n </div>\n <div className=\"mb-1 flex items-center justify-center\">\n <PowerhouseButton\n color={appVersion === \"\" ? \"light\" : \"red\"}\n size=\"small\"\n disabled={appVersion === \"\"}\n onClick={() => {\n // @ts-expect-error todo add send message method to service worker manager class\n serviceWorkerManager.sendMessage({\n type: \"SET_APP_VERSION\",\n version: appVersion,\n });\n setAppVersion(\"\");\n }}\n >\n Add Invalid App Version\n </PowerhouseButton>\n </div>\n </div>\n </div>\n </Modal>\n );\n};\n"],"mappings":";;;;;;;;AAOA,MAAa,2BAAqC;CAEhD,MAAM,OADU,YAAY,EACN,SAAS;CAE/B,MAAM,CAAC,YAAY,iBAAiB,SAAS,cAAc,WAAW;CACtE,MAAM,CAAC,wBAAwB,6BAA6B,SAAS;EACnE,OAAO,qBAAqB,QAAQ,YAAY;EAChD,OAAO,qBAAqB;EAC7B,CAAC;AAEF,iBAAgB;AACd,uBAAqB,SAAS,uBAAuB,MAAM;IAC1D,CAAC,uBAAuB,CAAC;AAE5B,QACE,oBAAC,OAAD;EACQ;EACN,eAAe,WAAW;AACxB,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,cAAc,EACZ,WAAW,eACZ;YAED,qBAAC,OAAD;GAAK,WAAU;aAAf;IACE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,OAAD;MAAK,WAAU;gBAAoB;MAAiB,CAAA,EACpD,oBAAC,UAAD;MAAQ,IAAG;MAAc,eAAe,cAAc;gBACpD,oBAAC,MAAD;OAAM,MAAK;OAAQ,MAAM;OAAM,CAAA;MACxB,CAAA,CACL;;IACN,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,MAAD;MAAM,MAAK;MAAO,MAAM;MAAM,CAAA,EAC9B,qBAAC,QAAD;MAAM,WAAU;gBAAhB,CAAuB,iBAAc,cAAc,WAAkB;QACjE;;IACN,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,MAAD;MAAM,MAAK;MAAM,MAAM;MAAM,CAAA,EAC7B,oBAAC,QAAD;MAAM,WAAU;gBAAO;MAAmB,CAAA,CACtC;;IAEN,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,MAAD;MAAM,MAAK;MAAO,MAAM;MAAM,CAAA,EAC9B,oBAAC,QAAD;MAAM,WAAU;gBAAO;MAA4B,CAAA,CAC/C;;IACN,oBAAC,OAAD;KAAK,WAAU;eACb,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,SAAD;OAAO,SAAQ;OAAyB,WAAU;iBAAU;OAEpD,CAAA,EACR,oBAAC,UAAD;OACE,IAAG;OACH,WAAW,UAAU;AACnB,kCACE,MACD;;OAEH,OAAO;OACP,SAAS,CACP;QAAE,OAAO;QAAW,OAAO;QAAM,EACjC;QAAE,OAAO;QAAY,OAAO;QAAO,CACpC;OACD,CAAA,CACE;;KACF,CAAA;IACN,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,SAAD;OAAO,SAAQ;OAAa,WAAU;iBAAU;OAExC,CAAA,EACR,oBAAC,WAAD;OACE,oBAAmB;OACnB,gBAAe;OACf,IAAG;OACH,MACE,oBAAC,OAAD;QAAK,WAAU;kBAAmC;QAAc,CAAA;OAElE,OAAO;OACP,WAAW,YAAY,cAAc,QAAQ,OAAO,MAAM;OAC1D,CAAA,CACE;SACN,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,kBAAD;OACE,OAAO,eAAe,KAAK,UAAU;OACrC,MAAK;OACL,UAAU,eAAe;OACzB,eAAe;AAEb,6BAAqB,YAAY;SAC/B,MAAM;SACN,SAAS;SACV,CAAC;AACF,sBAAc,GAAG;;iBAEpB;OAEkB,CAAA;MACf,CAAA,CACF;;IACF;;EACA,CAAA"}
@@ -1,7 +1,7 @@
1
- import { t as connectConfig } from "./connect.config-CUbxYkCy.js";
1
+ import { t as connectConfig } from "./connect.config-DDu1QWU1.js";
2
2
  import { t as toast$1 } from "./toast-iD-70hL8.js";
3
3
  import { t as useRegistryPackages } from "./useRegistryPackages-Ctlhv061.js";
4
- import { t as package_default } from "./package-J4OYYMmC.js";
4
+ import { t as package_default } from "./package-uT53xnG6.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-Cic7jYhm.js.map
153
+ //# sourceMappingURL=SettingsModal-DRmB1j5k.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsModal-Cic7jYhm.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-DRmB1j5k.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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"}
@@ -62,7 +62,7 @@ function getPHGlobalConfigFromEnv() {
62
62
  }
63
63
  const phGlobalConfigFromEnv = getPHGlobalConfigFromEnv();
64
64
  const defaultPHDocumentEditorConfig = { isExternalControlsEnabled: phGlobalConfigFromEnv.isExternalControlsEnabled };
65
- const defaultPHDriveEditorConfig = {
65
+ const defaultPHAppConfig = {
66
66
  allowedDocumentTypes: phGlobalConfigFromEnv.allowedDocumentTypes,
67
67
  isDragAndDropEnabled: phGlobalConfigFromEnv.isDragAndDropEnabled
68
68
  };
@@ -135,6 +135,6 @@ const connectConfig = {
135
135
  packagesRegistry: env.PH_CONNECT_PACKAGES_REGISTRY
136
136
  };
137
137
  //#endregion
138
- export { phGlobalConfigFromEnv as i, defaultPHDocumentEditorConfig as n, defaultPHDriveEditorConfig as r, connectConfig as t };
138
+ export { phGlobalConfigFromEnv as i, defaultPHAppConfig as n, defaultPHDocumentEditorConfig as r, connectConfig as t };
139
139
 
140
- //# sourceMappingURL=connect.config-CUbxYkCy.js.map
140
+ //# sourceMappingURL=connect.config-DDu1QWU1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.config-DDu1QWU1.js","names":[],"sources":["../src/connect.config.ts"],"sourcesContent":["import {\n setLogLevel,\n type FullPHGlobalConfig,\n type PHAppConfig,\n type PHDocumentEditorConfig,\n type PHGlobalConfig,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n loadRuntimeEnv,\n normalizeBasePath,\n} from \"@powerhousedao/shared/connect\";\nimport { logger } from \"document-model\";\n\n// Load environment variables with validation and defaults\nexport const env = loadRuntimeEnv({\n processEnv: import.meta.env,\n});\n\nfunction getRouterBasenameFromBasePath(basePath: string) {\n return basePath.endsWith(\"/\") ? basePath : basePath + \"/\";\n}\n\nfunction getPHGlobalConfigFromEnv(): PHGlobalConfig {\n const basePath = env.PH_CONNECT_BASE_PATH || import.meta.env.BASE_URL;\n const routerBasename = getRouterBasenameFromBasePath(basePath);\n const config = {\n basePath,\n routerBasename,\n allowList: undefined,\n allowedDocumentTypes: [],\n isDragAndDropEnabled: true,\n isEditorDebugModeEnabled: false,\n isEditorReadModeEnabled: false,\n isExternalControlsEnabled: false,\n version: env.PH_CONNECT_VERSION,\n logLevel: env.PH_CONNECT_LOG_LEVEL,\n requiresHardRefresh: env.PH_CONNECT_REQUIRES_HARD_REFRESH,\n warnOutdatedApp: env.PH_CONNECT_WARN_OUTDATED_APP,\n studioMode: env.PH_CONNECT_STUDIO_MODE,\n versionCheckInterval: env.PH_CONNECT_VERSION_CHECK_INTERVAL,\n cliVersion: env.PH_CONNECT_CLI_VERSION,\n fileUploadOperationsChunkSize:\n env.PH_CONNECT_FILE_UPLOAD_OPERATIONS_CHUNK_SIZE,\n gaTrackingId: env.PH_CONNECT_GA_TRACKING_ID,\n defaultDrivesUrl: env.PH_CONNECT_DEFAULT_DRIVES_URL,\n drivesPreserveStrategy: env.PH_CONNECT_DRIVES_PRESERVE_STRATEGY,\n enabledEditors: env.PH_CONNECT_ENABLED_EDITORS?.split(\",\"),\n disabledEditors: env.PH_CONNECT_DISABLED_EDITORS.split(\",\"),\n\n /* Processors */\n isExternalProcessorsEnabled: env.PH_CONNECT_EXTERNAL_PROCESSORS_ENABLED,\n isAnalyticsEnabled: env.PH_CONNECT_ANALYTICS_ENABLED,\n isAnalyticsExternalProcessorsEnabled:\n env.PH_CONNECT_EXTERNAL_PROCESSORS_ENABLED &&\n env.PH_CONNECT_EXTERNAL_ANALYTICS_PROCESSORS_ENABLED,\n analyticsDatabaseName: env.PH_CONNECT_ANALYTICS_DATABASE_NAME,\n isRelationalProcessorsEnabled: env.PH_CONNECT_RELATIONAL_PROCESSORS_ENABLED,\n isExternalRelationalProcessorsEnabled:\n env.PH_CONNECT_EXTERNAL_PROCESSORS_ENABLED &&\n env.PH_CONNECT_EXTERNAL_RELATIONAL_PROCESSORS_ENABLED,\n\n renownUrl: env.PH_CONNECT_RENOWN_URL,\n renownNetworkId: env.PH_CONNECT_RENOWN_NETWORK_ID,\n renownChainId: env.PH_CONNECT_RENOWN_CHAIN_ID,\n sentryRelease: env.PH_CONNECT_SENTRY_RELEASE,\n sentryDsn: env.PH_CONNECT_SENTRY_DSN,\n sentryEnv: env.PH_CONNECT_SENTRY_ENV,\n isDiffAnalyticsEnabled: env.PH_CONNECT_DIFF_ANALYTICS_ENABLED,\n isDriveAnalyticsEnabled: env.PH_CONNECT_DRIVE_ANALYTICS_ENABLED,\n isPublicDrivesEnabled: env.PH_CONNECT_PUBLIC_DRIVES_ENABLED,\n isCloudDrivesEnabled: env.PH_CONNECT_CLOUD_DRIVES_ENABLED,\n isLocalDrivesEnabled: env.PH_CONNECT_LOCAL_DRIVES_ENABLED,\n isSentryTracingEnabled: env.PH_CONNECT_SENTRY_TRACING_ENABLED,\n isDocumentModelSelectionSettingsEnabled:\n !env.PH_CONNECT_HIDE_DOCUMENT_MODEL_SELECTION_SETTINGS,\n isAddDriveEnabled: !env.PH_CONNECT_DISABLE_ADD_DRIVE,\n isAddPublicDrivesEnabled: !env.PH_CONNECT_DISABLE_ADD_PUBLIC_DRIVES,\n isDeletePublicDrivesEnabled: !env.PH_CONNECT_DISABLE_DELETE_PUBLIC_DRIVES,\n isAddCloudDrivesEnabled: !env.PH_CONNECT_DISABLE_ADD_CLOUD_DRIVES,\n isDeleteCloudDrivesEnabled: !env.PH_CONNECT_DISABLE_DELETE_CLOUD_DRIVES,\n isAddLocalDrivesEnabled: !env.PH_CONNECT_DISABLE_ADD_LOCAL_DRIVES,\n isDeleteLocalDrivesEnabled: !env.PH_CONNECT_DISABLE_DELETE_LOCAL_DRIVES,\n isAnalyticsDatabaseWorkerEnabled:\n !env.PH_CONNECT_ANALYTICS_DATABASE_WORKER_DISABLED,\n isExternalPackagesEnabled: !env.PH_CONNECT_EXTERNAL_PACKAGES_DISABLED,\n } satisfies FullPHGlobalConfig;\n\n return config;\n}\n\nexport const phGlobalConfigFromEnv = getPHGlobalConfigFromEnv();\n\nexport const defaultPHDocumentEditorConfig: PHDocumentEditorConfig = {\n isExternalControlsEnabled: phGlobalConfigFromEnv.isExternalControlsEnabled,\n};\n\nexport const defaultPHAppConfig: PHAppConfig = {\n allowedDocumentTypes: phGlobalConfigFromEnv.allowedDocumentTypes,\n isDragAndDropEnabled: phGlobalConfigFromEnv.isDragAndDropEnabled,\n};\n\n// Set log level from validated config\nsetLogLevel(env.PH_CONNECT_LOG_LEVEL);\nlogger.debug(\"Setting log level to @level.\", env.PH_CONNECT_LOG_LEVEL);\n\n// Normalize the base path to ensure it starts and ends with a forward slash\nconst PH_CONNECT_BASE_PATH = normalizeBasePath(\n env.PH_CONNECT_BASE_PATH || import.meta.env.BASE_URL,\n);\n\n// Analytics database name with custom logic\nconst PH_CONNECT_ANALYTICS_DATABASE_NAME =\n env.PH_CONNECT_ANALYTICS_DATABASE_NAME ||\n `${PH_CONNECT_BASE_PATH.replace(/\\//g, \"\")}:analytics`;\n\nexport const connectConfig = {\n appVersion: env.PH_CONNECT_VERSION,\n studioMode: env.PH_CONNECT_STUDIO_MODE,\n warnOutdatedApp: env.PH_CONNECT_WARN_OUTDATED_APP,\n appVersionCheckInterval: env.PH_CONNECT_VERSION_CHECK_INTERVAL,\n routerBasename: PH_CONNECT_BASE_PATH,\n externalPackagesEnabled: !env.PH_CONNECT_EXTERNAL_PACKAGES_DISABLED,\n processors: {\n enabled: env.PH_CONNECT_PROCESSORS_ENABLED,\n externalProcessorsEnabled: env.PH_CONNECT_EXTERNAL_PROCESSORS_ENABLED,\n },\n analytics: {\n enabled: env.PH_CONNECT_ANALYTICS_ENABLED,\n databaseName: PH_CONNECT_ANALYTICS_DATABASE_NAME,\n useWorker: !env.PH_CONNECT_ANALYTICS_DATABASE_WORKER_DISABLED,\n driveAnalyticsEnabled: env.PH_CONNECT_DRIVE_ANALYTICS_ENABLED,\n diffProcessorEnabled: env.PH_CONNECT_DIFF_ANALYTICS_ENABLED,\n externalProcessorsEnabled: env.PH_CONNECT_EXTERNAL_PROCESSORS_ENABLED,\n },\n relational: {\n enabled: env.PH_CONNECT_RELATIONAL_PROCESSORS_ENABLED,\n externalProcessorsEnabled:\n env.PH_CONNECT_EXTERNAL_RELATIONAL_PROCESSORS_ENABLED,\n },\n renown: {\n url: env.PH_CONNECT_RENOWN_URL,\n networkId: env.PH_CONNECT_RENOWN_NETWORK_ID,\n chainId: env.PH_CONNECT_RENOWN_CHAIN_ID,\n },\n sentry: {\n release: env.PH_CONNECT_SENTRY_RELEASE,\n dsn: env.PH_CONNECT_SENTRY_DSN,\n env: env.PH_CONNECT_SENTRY_ENV,\n tracing: env.PH_CONNECT_SENTRY_TRACING_ENABLED,\n },\n content: {\n showSearchBar: env.PH_CONNECT_SEARCH_BAR_ENABLED,\n showDocumentModelSelectionSetting:\n !env.PH_CONNECT_HIDE_DOCUMENT_MODEL_SELECTION_SETTINGS,\n inspectorEnabled: env.PH_CONNECT_INSPECTOR_ENABLED,\n },\n drives: {\n addDriveEnabled: !env.PH_CONNECT_DISABLE_ADD_DRIVE,\n preserveStrategy: env.PH_CONNECT_DRIVES_PRESERVE_STRATEGY,\n sections: {\n LOCAL: {\n enabled: env.PH_CONNECT_LOCAL_DRIVES_ENABLED,\n allowAdd: !env.PH_CONNECT_DISABLE_ADD_LOCAL_DRIVES,\n allowDelete: !env.PH_CONNECT_DISABLE_DELETE_LOCAL_DRIVES,\n },\n CLOUD: {\n enabled: env.PH_CONNECT_CLOUD_DRIVES_ENABLED,\n allowAdd: !env.PH_CONNECT_DISABLE_ADD_CLOUD_DRIVES,\n allowDelete: !env.PH_CONNECT_DISABLE_DELETE_CLOUD_DRIVES,\n },\n PUBLIC: {\n enabled: env.PH_CONNECT_PUBLIC_DRIVES_ENABLED,\n allowAdd: !env.PH_CONNECT_DISABLE_ADD_PUBLIC_DRIVES,\n allowDelete: !env.PH_CONNECT_DISABLE_DELETE_PUBLIC_DRIVES,\n },\n },\n },\n gaTrackingId: env.PH_CONNECT_GA_TRACKING_ID,\n phCliVersion: env.PH_CONNECT_CLI_VERSION,\n packagesRegistry: env.PH_CONNECT_PACKAGES_REGISTRY,\n} as const;\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { t as connectConfig } from "./connect.config-CUbxYkCy.js";
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-J4OYYMmC.js";
4
- import { n as createReactor } from "./reactor-Be0fd4-f.js";
3
+ import { t as package_default } from "./package-uT53xnG6.js";
4
+ import { n as createReactor } from "./reactor-XtvM2Ar4.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-Cj671zwU.js.map
105
+ //# sourceMappingURL=load-DGz2lnhL.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"load-Cj671zwU.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 { VetraPackage } from \"@powerhousedao/reactor-browser\";\nimport { type ReactNode } from \"react\";\n\nexport async function loadComponent(localPackage?: VetraPackage) {\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,cAA6B;AAC/D,OAAM,cAAc,aAAa;AACjC,QAAO,EACL,UAAU,EAAE,eAAyC;AACnD,oBAAkB;AAClB,yBAAuB;AACvB,SAAO;IAEV"}
1
+ {"version":3,"file":"load-DGz2lnhL.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 { VetraPackage } from \"@powerhousedao/reactor-browser\";\nimport { type ReactNode } from \"react\";\n\nexport async function loadComponent(localPackage?: VetraPackage) {\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,cAA6B;AAC/D,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-DNioAbBU.js";
1
+ import { t as AppLoader } from "./sidebar-NyKzP7ZT.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.135",
5
+ version: "6.0.0-dev.137",
6
6
  description: "Powerhouse Connect",
7
7
  main: "dist/index.html",
8
8
  type: "module",
@@ -106,4 +106,4 @@ var package_default = {
106
106
  //#endregion
107
107
  export { package_default as t };
108
108
 
109
- //# sourceMappingURL=package-J4OYYMmC.js.map
109
+ //# sourceMappingURL=package-uT53xnG6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-uT53xnG6.js","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
@@ -1,12 +1,12 @@
1
- import { i as phGlobalConfigFromEnv, t as connectConfig } from "./connect.config-CUbxYkCy.js";
1
+ import { i as phGlobalConfigFromEnv, t as connectConfig } from "./connect.config-DDu1QWU1.js";
2
2
  import { t as toast } from "./toast-iD-70hL8.js";
3
3
  import { BrowserLocalStorage, COMMON_PACKAGE_ID, ChannelScheme, DEFAULT_DRIVE_EDITOR_ID, DocumentCache, DocumentChangeType, ReactorBuilder, ReactorClientBuilder, addPHEventHandlers, addRemoteDrive, convertLegacyLibToVetraPackage, createAnalyticsStore, dropAllReactorStorage, extractDriveSlugFromPath, extractNodeSlugFromPath, getDrives, login, refreshReactorDataClient, setDefaultPHGlobalConfig, setDocumentCache, setDrives, setFeatures, setPHToast, setReactorClient, setReactorClientModule, setRenown, setSelectedDrive, setSelectedNode, setVetraPackageManager } from "@powerhousedao/reactor-browser";
4
4
  import { ConsoleLogger, documentModelDocumentModelModule, logger, setLogLevel as setLogLevel$1 } from "document-model";
5
+ import { DocumentModelEditor, GenericDriveExplorer } from "@powerhousedao/powerhouse-vetra-packages/editors";
5
6
  import { PGlite } from "@electric-sql/pglite";
6
7
  import { BrowserKeyStorage, RenownBuilder, RenownCryptoBuilder, createSignatureVerifier } from "@renown/sdk";
7
8
  import { Kysely } from "kysely";
8
9
  import { PGliteDialect } from "kysely-pglite-dialect";
9
- import { DocumentModelEditor, GenericDriveExplorer } from "@powerhousedao/powerhouse-vetra-packages/editors";
10
10
  import { createState, defaultBaseState } from "@powerhousedao/shared/document-model";
11
11
  import { live } from "@electric-sql/pglite/live";
12
12
  import { PGliteWorker } from "@electric-sql/pglite/worker";
@@ -583,4 +583,4 @@ function getDriveUrl() {
583
583
  //#endregion
584
584
  export { createReactor as n, clearReactorStorage as t };
585
585
 
586
- //# sourceMappingURL=reactor-Be0fd4-f.js.map
586
+ //# sourceMappingURL=reactor-XtvM2Ar4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reactor-Be0fd4-f.js","names":["#storage","#cdnUrl","#toCdnUrl","#loadCommonPackage","#registerPackage","#loadVetraPackage","#localPackage","#packagesMemo","#packages","#loadPackage","#unmountStylesheet","#notifyPackagesChanged","#subscribers","#loadPackageFromNodeModules","#importPackage","#loadPackageFromRegistry","#mountStylesheet","#stylesheets"],"sources":["../src/utils/reactor.ts","../src/store/document-model.ts","../src/store/editor.ts","../src/feature-flags.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 * @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 for (const url of defaultDriveUrls) {\n try {\n await addRemoteDrive(url);\n } catch (error) {\n console.error(`Failed to add default drive ${url}:`, error);\n }\n }\n}\n","import type { VetraDocumentModelModule } from \"@powerhousedao/reactor-browser\";\nimport { driveDocumentModelModule } from \"@powerhousedao/shared/document-drive\";\nimport {\n createState,\n defaultBaseState,\n} from \"@powerhousedao/shared/document-model\";\nimport { documentModelDocumentModelModule } from \"document-model\";\n\nexport function loadDocumentModelDocumentModelModule() {\n const global = documentModelDocumentModelModule.documentModel.global;\n const name = global.name;\n const documentType = global.id;\n const unsafeIdFromDocumentType = documentType;\n const extension = global.extension;\n const specifications = global.specifications;\n const reducer = documentModelDocumentModelModule.reducer;\n const actions = documentModelDocumentModelModule.actions;\n const utils = documentModelDocumentModelModule.utils;\n const vetraDocumentModelModule: VetraDocumentModelModule = {\n id: unsafeIdFromDocumentType,\n name,\n documentType,\n extension,\n specifications,\n reducer,\n actions,\n utils,\n documentModel: createState(defaultBaseState(), global),\n };\n return vetraDocumentModelModule;\n}\n\nexport function loadDriveDocumentModelModule() {\n const global = driveDocumentModelModule.documentModel.global;\n const name = global.name;\n const documentType = global.id;\n const unsafeIdFromDocumentType = documentType;\n const extension = global.extension;\n const specifications = global.specifications;\n const reducer = driveDocumentModelModule.reducer;\n const actions = driveDocumentModelModule.actions;\n const utils = driveDocumentModelModule.utils;\n const vetraDocumentModelModule: VetraDocumentModelModule = {\n id: unsafeIdFromDocumentType,\n name,\n documentType,\n extension,\n specifications,\n reducer,\n actions,\n utils,\n documentModel: createState(defaultBaseState(), global),\n };\n return vetraDocumentModelModule;\n}\n","import {\n DocumentModelEditor,\n GenericDriveExplorer,\n} from \"@powerhousedao/powerhouse-vetra-packages/editors\";\nimport type { VetraEditorModule } from \"@powerhousedao/reactor-browser\";\nimport { DEFAULT_DRIVE_EDITOR_ID } from \"@powerhousedao/reactor-browser\";\n\nexport function loadGenericDriveExplorerEditorModule(): VetraEditorModule {\n const name = \"Generic Drive Explorer\";\n const documentTypes = [\"powerhouse/document-drive\"];\n const Component = GenericDriveExplorer.Component;\n const vetraEditorModule: VetraEditorModule = {\n id: DEFAULT_DRIVE_EDITOR_ID,\n name,\n documentTypes,\n Component,\n };\n return vetraEditorModule;\n}\n\nexport function loadDocumentModelEditor(): VetraEditorModule {\n const name = \"Document Model Editor\";\n const id = \"document-model-editor-v2\";\n const documentTypes = [\"powerhouse/document-model\"];\n const Component = DocumentModelEditor.Component;\n const vetraEditorModule: VetraEditorModule = {\n id,\n name,\n documentTypes,\n Component,\n };\n return vetraEditorModule;\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 type {\n IPackagesListener,\n PackageManagerInstallResult,\n VetraPackage,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n BrowserLocalStorage,\n COMMON_PACKAGE_ID,\n convertLegacyLibToVetraPackage,\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 vetraVetraPackage from \"@powerhousedao/vetra\";\nimport {\n loadDocumentModelDocumentModelModule,\n loadDriveDocumentModelModule,\n} from \"./store/document-model.js\";\nimport {\n loadDocumentModelEditor,\n loadGenericDriveExplorerEditorModule,\n} from \"./store/editor.js\";\n\ntype PackageMeta = {\n name: string;\n importUrl: string | null;\n stylesheetUrl: string | null;\n};\n\ntype PackageWithMeta = PackageMeta & {\n loadedPackage: VetraPackage;\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, VetraPackage> = new Map();\n #subscribers = new Set<IPackagesListener>();\n #packagesMemo: VetraPackage[] = [];\n #stylesheets: Map<string, HTMLLinkElement> = new Map();\n #localPackage: VetraPackage | undefined;\n\n #cdnUrl: string | null;\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?: VetraPackage) {\n const commonPackageWithMeta = this.#loadCommonPackage();\n this.#registerPackage(commonPackageWithMeta);\n const vetraVetraPackageWithMeta = this.#loadVetraPackage();\n this.#registerPackage(vetraVetraPackageWithMeta);\n if (localPackage) {\n this.#localPackage = localPackage;\n this.#registerPackage({\n name: LOCAL_PACKAGE_NAME,\n stylesheetUrl: null,\n importUrl: null,\n loadedPackage: localPackage,\n });\n }\n for (const packageName of this.#storage.keys()) {\n await this.addPackage(packageName);\n }\n }\n\n get packages() {\n return this.#packagesMemo;\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?.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 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\n .values()\n .flatMap((p) => p.modules.documentModelModules ?? []),\n ).find((m) => m.documentType === documentType);\n\n if (documentModelModule) return Promise.resolve(documentModelModule);\n return Promise.reject(new Error(\"Model not available\"));\n }\n\n #loadCommonPackage(): PackageWithMeta {\n const documentModelDocumentModelModule =\n loadDocumentModelDocumentModelModule();\n const driveDocumentModelModule = loadDriveDocumentModelModule();\n const documentModelEditorModule = loadDocumentModelEditor();\n const genericDriveExplorerEditorModule =\n loadGenericDriveExplorerEditorModule();\n const name = COMMON_PACKAGE_NAME;\n const importUrl = null;\n const stylesheetUrl = null;\n const loadedPackage: VetraPackage = {\n id: COMMON_PACKAGE_ID,\n name,\n description: \"Common\",\n category: \"Common\",\n author: {\n name: \"Powerhouse\",\n website: \"https://powerhousedao.com\",\n },\n modules: {\n documentModelModules: [\n documentModelDocumentModelModule,\n driveDocumentModelModule,\n ],\n editorModules: [\n documentModelEditorModule,\n genericDriveExplorerEditorModule,\n ],\n },\n upgradeManifests: [],\n };\n return {\n name,\n importUrl,\n stylesheetUrl,\n loadedPackage,\n };\n }\n\n #loadVetraPackage(): PackageWithMeta {\n const name = vetraVetraPackage.manifest.name;\n const importUrl = null;\n const stylesheetUrl = null;\n const loadedPackage: VetraPackage = convertLegacyLibToVetraPackage(\n vetraVetraPackage as DocumentModelLib,\n );\n return {\n name,\n importUrl,\n stylesheetUrl,\n loadedPackage,\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\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\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 importedPackage = (await import(\n /* @vite-ignore */ importUrl\n )) as DocumentModelLib;\n const loadedPackage = convertLegacyLibToVetraPackage(importedPackage);\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 } = 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 });\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};\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 IProcessorHostModule } from \"@powerhousedao/shared/processors\";\nimport { getDb } from \"../pglite.db.js\";\n\nexport async function createProcessorHostModule(): Promise<\n IProcessorHostModule | undefined\n> {\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 };\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 dropAllReactorStorage,\n extractDriveSlugFromPath,\n extractNodeSlugFromPath,\n getDrives,\n login,\n refreshReactorDataClient,\n setDefaultPHGlobalConfig,\n setDocumentCache,\n setDrives,\n setFeatures,\n setPHToast,\n setReactorClient,\n setReactorClientModule,\n setRenown,\n setSelectedDrive,\n setSelectedNode,\n setVetraPackageManager,\n type PHToastFn,\n type VetraPackage,\n} from \"@powerhousedao/reactor-browser\";\nimport type { ProcessorFactoryBuilder } from \"@powerhousedao/shared/processors\";\nimport {\n BrowserKeyStorage,\n RenownBuilder,\n RenownCryptoBuilder,\n} from \"@renown/sdk\";\nimport { logger } from \"document-model\";\nimport { initFeatureFlags } from \"../feature-flags.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 const pg = window.ph?.reactorClientModule?.pg;\n if (!pg) {\n throw new Error(\"PGlite not found\");\n }\n\n await dropAllReactorStorage(pg);\n\n await pg.close();\n}\n\nexport async function createReactor(localPackage?: VetraPackage) {\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);\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.modules.documentModelModules)\n .filter(\n (module, index, modules) =>\n module !== undefined &&\n // deduplicate by documentType and version\n modules.findIndex(\n (m) =>\n m?.documentType === module.documentType &&\n m.version === module.version,\n ) === index,\n )\n .filter((d) => d !== undefined);\n\n // get upgrade manifests from packages\n const upgradeManifests = packageManager.packages\n .flatMap((pkg) => pkg.upgradeManifests)\n .filter((u) => u !== undefined);\n\n // create reactor v2 with all versions and upgrade manifests\n const reactorClientModule = await createBrowserReactor(\n documentModelModules,\n upgradeManifests,\n renown,\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 (\n pkg,\n ): pkg is VetraPackage & { processorFactory: ProcessorFactoryBuilder } =>\n pkg.processorFactory !== undefined,\n );\n\n if (packagesWithProcessorFactories.length > 0) {\n const processorHostModule = await createProcessorHostModule();\n if (processorHostModule !== undefined) {\n await Promise.all(\n packagesWithProcessorFactories.map(async (pkg) => {\n const { id, name, processorFactory } = pkg;\n logger.info(\"Loading processor factory: @name\", name);\n try {\n const factory = await processorFactory(processorHostModule);\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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"}
1
+ {"version":3,"file":"reactor-XtvM2Ar4.js","names":["#storage","#cdnUrl","#toCdnUrl","#loadCommonPackage","#registerPackage","#loadVetraPackage","#localPackage","#packagesMemo","#packages","#loadPackage","#unmountStylesheet","#notifyPackagesChanged","#subscribers","#loadPackageFromNodeModules","#importPackage","#loadPackageFromRegistry","#mountStylesheet","#stylesheets"],"sources":["../src/utils/reactor.ts","../src/store/document-model.ts","../src/store/editor.ts","../src/feature-flags.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 * @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 for (const url of defaultDriveUrls) {\n try {\n await addRemoteDrive(url);\n } catch (error) {\n console.error(`Failed to add default drive ${url}:`, error);\n }\n }\n}\n","import type { VetraDocumentModelModule } from \"@powerhousedao/reactor-browser\";\nimport { driveDocumentModelModule } from \"@powerhousedao/shared/document-drive\";\nimport {\n createState,\n defaultBaseState,\n} from \"@powerhousedao/shared/document-model\";\nimport { documentModelDocumentModelModule } from \"document-model\";\n\nexport function loadDocumentModelDocumentModelModule() {\n const global = documentModelDocumentModelModule.documentModel.global;\n const name = global.name;\n const documentType = global.id;\n const unsafeIdFromDocumentType = documentType;\n const extension = global.extension;\n const specifications = global.specifications;\n const reducer = documentModelDocumentModelModule.reducer;\n const actions = documentModelDocumentModelModule.actions;\n const utils = documentModelDocumentModelModule.utils;\n const vetraDocumentModelModule: VetraDocumentModelModule = {\n id: unsafeIdFromDocumentType,\n name,\n documentType,\n extension,\n specifications,\n reducer,\n actions,\n utils,\n documentModel: createState(defaultBaseState(), global),\n };\n return vetraDocumentModelModule;\n}\n\nexport function loadDriveDocumentModelModule() {\n const global = driveDocumentModelModule.documentModel.global;\n const name = global.name;\n const documentType = global.id;\n const unsafeIdFromDocumentType = documentType;\n const extension = global.extension;\n const specifications = global.specifications;\n const reducer = driveDocumentModelModule.reducer;\n const actions = driveDocumentModelModule.actions;\n const utils = driveDocumentModelModule.utils;\n const vetraDocumentModelModule: VetraDocumentModelModule = {\n id: unsafeIdFromDocumentType,\n name,\n documentType,\n extension,\n specifications,\n reducer,\n actions,\n utils,\n documentModel: createState(defaultBaseState(), global),\n };\n return vetraDocumentModelModule;\n}\n","import {\n DocumentModelEditor,\n GenericDriveExplorer,\n} from \"@powerhousedao/powerhouse-vetra-packages/editors\";\nimport type { VetraEditorModule } from \"@powerhousedao/reactor-browser\";\nimport { DEFAULT_DRIVE_EDITOR_ID } from \"@powerhousedao/reactor-browser\";\n\nexport function loadGenericDriveExplorerEditorModule(): VetraEditorModule {\n const name = \"Generic Drive Explorer\";\n const documentTypes = [\"powerhouse/document-drive\"];\n const Component = GenericDriveExplorer.Component;\n const vetraEditorModule: VetraEditorModule = {\n id: DEFAULT_DRIVE_EDITOR_ID,\n name,\n documentTypes,\n Component,\n };\n return vetraEditorModule;\n}\n\nexport function loadDocumentModelEditor(): VetraEditorModule {\n const name = \"Document Model Editor\";\n const id = \"document-model-editor-v2\";\n const documentTypes = [\"powerhouse/document-model\"];\n const Component = DocumentModelEditor.Component;\n const vetraEditorModule: VetraEditorModule = {\n id,\n name,\n documentTypes,\n Component,\n };\n return vetraEditorModule;\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 type {\n IPackagesListener,\n PackageManagerInstallResult,\n VetraPackage,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n BrowserLocalStorage,\n COMMON_PACKAGE_ID,\n convertLegacyLibToVetraPackage,\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 vetraVetraPackage from \"@powerhousedao/vetra\";\nimport {\n loadDocumentModelDocumentModelModule,\n loadDriveDocumentModelModule,\n} from \"./store/document-model.js\";\nimport {\n loadDocumentModelEditor,\n loadGenericDriveExplorerEditorModule,\n} from \"./store/editor.js\";\n\ntype PackageMeta = {\n name: string;\n importUrl: string | null;\n stylesheetUrl: string | null;\n};\n\ntype PackageWithMeta = PackageMeta & {\n loadedPackage: VetraPackage;\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, VetraPackage> = new Map();\n #subscribers = new Set<IPackagesListener>();\n #packagesMemo: VetraPackage[] = [];\n #stylesheets: Map<string, HTMLLinkElement> = new Map();\n #localPackage: VetraPackage | undefined;\n\n #cdnUrl: string | null;\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?: VetraPackage) {\n const commonPackageWithMeta = this.#loadCommonPackage();\n this.#registerPackage(commonPackageWithMeta);\n const vetraVetraPackageWithMeta = this.#loadVetraPackage();\n this.#registerPackage(vetraVetraPackageWithMeta);\n if (localPackage) {\n this.#localPackage = localPackage;\n this.#registerPackage({\n name: LOCAL_PACKAGE_NAME,\n stylesheetUrl: null,\n importUrl: null,\n loadedPackage: localPackage,\n });\n }\n for (const packageName of this.#storage.keys()) {\n await this.addPackage(packageName);\n }\n }\n\n get packages() {\n return this.#packagesMemo;\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?.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 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\n .values()\n .flatMap((p) => p.modules.documentModelModules ?? []),\n ).find((m) => m.documentType === documentType);\n\n if (documentModelModule) return Promise.resolve(documentModelModule);\n return Promise.reject(new Error(\"Model not available\"));\n }\n\n #loadCommonPackage(): PackageWithMeta {\n const documentModelDocumentModelModule =\n loadDocumentModelDocumentModelModule();\n const driveDocumentModelModule = loadDriveDocumentModelModule();\n const documentModelEditorModule = loadDocumentModelEditor();\n const genericDriveExplorerEditorModule =\n loadGenericDriveExplorerEditorModule();\n const name = COMMON_PACKAGE_NAME;\n const importUrl = null;\n const stylesheetUrl = null;\n const loadedPackage: VetraPackage = {\n id: COMMON_PACKAGE_ID,\n name,\n description: \"Common\",\n category: \"Common\",\n author: {\n name: \"Powerhouse\",\n website: \"https://powerhousedao.com\",\n },\n modules: {\n documentModelModules: [\n documentModelDocumentModelModule,\n driveDocumentModelModule,\n ],\n editorModules: [\n documentModelEditorModule,\n genericDriveExplorerEditorModule,\n ],\n },\n upgradeManifests: [],\n };\n return {\n name,\n importUrl,\n stylesheetUrl,\n loadedPackage,\n };\n }\n\n #loadVetraPackage(): PackageWithMeta {\n const name = vetraVetraPackage.manifest.name;\n const importUrl = null;\n const stylesheetUrl = null;\n const loadedPackage: VetraPackage = convertLegacyLibToVetraPackage(\n vetraVetraPackage as DocumentModelLib,\n );\n return {\n name,\n importUrl,\n stylesheetUrl,\n loadedPackage,\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\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\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 importedPackage = (await import(\n /* @vite-ignore */ importUrl\n )) as DocumentModelLib;\n const loadedPackage = convertLegacyLibToVetraPackage(importedPackage);\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 } = 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 });\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};\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 IProcessorHostModule } from \"@powerhousedao/shared/processors\";\nimport { getDb } from \"../pglite.db.js\";\n\nexport async function createProcessorHostModule(): Promise<\n IProcessorHostModule | undefined\n> {\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 };\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 dropAllReactorStorage,\n extractDriveSlugFromPath,\n extractNodeSlugFromPath,\n getDrives,\n login,\n refreshReactorDataClient,\n setDefaultPHGlobalConfig,\n setDocumentCache,\n setDrives,\n setFeatures,\n setPHToast,\n setReactorClient,\n setReactorClientModule,\n setRenown,\n setSelectedDrive,\n setSelectedNode,\n setVetraPackageManager,\n type PHToastFn,\n type VetraPackage,\n} from \"@powerhousedao/reactor-browser\";\nimport type { ProcessorFactoryBuilder } from \"@powerhousedao/shared/processors\";\nimport {\n BrowserKeyStorage,\n RenownBuilder,\n RenownCryptoBuilder,\n} from \"@renown/sdk\";\nimport { logger } from \"document-model\";\nimport { initFeatureFlags } from \"../feature-flags.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 const pg = window.ph?.reactorClientModule?.pg;\n if (!pg) {\n throw new Error(\"PGlite not found\");\n }\n\n await dropAllReactorStorage(pg);\n\n await pg.close();\n}\n\nexport async function createReactor(localPackage?: VetraPackage) {\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);\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.modules.documentModelModules)\n .filter(\n (module, index, modules) =>\n module !== undefined &&\n // deduplicate by documentType and version\n modules.findIndex(\n (m) =>\n m?.documentType === module.documentType &&\n m.version === module.version,\n ) === index,\n )\n .filter((d) => d !== undefined);\n\n // get upgrade manifests from packages\n const upgradeManifests = packageManager.packages\n .flatMap((pkg) => pkg.upgradeManifests)\n .filter((u) => u !== undefined);\n\n // create reactor v2 with all versions and upgrade manifests\n const reactorClientModule = await createBrowserReactor(\n documentModelModules,\n upgradeManifests,\n renown,\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 (\n pkg,\n ): pkg is VetraPackage & { processorFactory: ProcessorFactoryBuilder } =>\n pkg.processorFactory !== undefined,\n );\n\n if (packagesWithProcessorFactories.length > 0) {\n const processorHostModule = await createProcessorHostModule();\n if (processorHostModule !== undefined) {\n await Promise.all(\n packagesWithProcessorFactories.map(async (pkg) => {\n const { id, name, processorFactory } = pkg;\n logger.info(\"Loading processor factory: @name\", name);\n try {\n const factory = await processorFactory(processorHostModule);\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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"}
@@ -1,4 +1,4 @@
1
- import { t as connectConfig } from "./connect.config-CUbxYkCy.js";
1
+ import { t as connectConfig } from "./connect.config-DDu1QWU1.js";
2
2
  //#region src/utils/registerServiceWorker.ts
3
3
  const serviceWorkerScriptPath = [connectConfig.routerBasename, "service-worker.js"].join("/").replace(/\/{2,}/gm, "/");
4
4
  var ServiceWorkerManager = class {
@@ -73,4 +73,4 @@ const serviceWorkerManager = new ServiceWorkerManager();
73
73
  //#endregion
74
74
  export { serviceWorkerManager as t };
75
75
 
76
- //# sourceMappingURL=registerServiceWorker-fSbJUcrq.js.map
76
+ //# sourceMappingURL=registerServiceWorker-19nMRUMW.js.map