@powerhousedao/connect 6.1.0 → 6.2.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env +11 -49
- package/README.md +4 -0
- package/dist/{AddDriveModal-Cg2qcYp6.js → AddDriveModal-kzL41qdg.js} +17 -7
- package/dist/AddDriveModal-kzL41qdg.js.map +1 -0
- package/dist/{ClearStorageModal-D2K3LkHV.js → ClearStorageModal-DIKwqiia.js} +7 -7
- package/dist/{ClearStorageModal-D2K3LkHV.js.map → ClearStorageModal-DIKwqiia.js.map} +1 -1
- package/dist/{CookiesPolicyModal-4QzcllDR.js → CookiesPolicyModal-1nOh6oN3.js} +5 -5
- package/dist/{CookiesPolicyModal-4QzcllDR.js.map → CookiesPolicyModal-1nOh6oN3.js.map} +1 -1
- package/dist/{CreateDocumentModal-7vgZ8nbM.js → CreateDocumentModal-nQbLVDq3.js} +4 -4
- package/dist/{CreateDocumentModal-7vgZ8nbM.js.map → CreateDocumentModal-nQbLVDq3.js.map} +1 -1
- package/dist/{DebugSettingsModal-B1FRL4rp.js → DebugSettingsModal-CJunSkZB.js} +8 -8
- package/dist/{DebugSettingsModal-B1FRL4rp.js.map → DebugSettingsModal-CJunSkZB.js.map} +1 -1
- package/dist/{DeleteDriveModal-ABue_rOY.js → DeleteDriveModal-6P0T1QgD.js} +6 -6
- package/dist/{DeleteDriveModal-ABue_rOY.js.map → DeleteDriveModal-6P0T1QgD.js.map} +1 -1
- package/dist/{DeleteItemModal-B6aHnYPD.js → DeleteItemModal-BmV1aQyZ.js} +7 -7
- package/dist/{DeleteItemModal-B6aHnYPD.js.map → DeleteItemModal-BmV1aQyZ.js.map} +1 -1
- package/dist/{DisclaimerModal-CfDeiBz8.js → DisclaimerModal-CVTFfN0_.js} +6 -6
- package/dist/{DisclaimerModal-CfDeiBz8.js.map → DisclaimerModal-CVTFfN0_.js.map} +1 -1
- package/dist/{DownloadDocumentWithErrorsModal-CaAPGg04.js → DownloadDocumentWithErrorsModal-CXeFUtaz.js} +5 -5
- package/dist/{DownloadDocumentWithErrorsModal-CaAPGg04.js.map → DownloadDocumentWithErrorsModal-CXeFUtaz.js.map} +1 -1
- package/dist/{DriveSettingsModal-CNtCO4-y.js → DriveSettingsModal-L5sM-rIh.js} +5 -5
- package/dist/{DriveSettingsModal-CNtCO4-y.js.map → DriveSettingsModal-L5sM-rIh.js.map} +1 -1
- package/dist/{InspectorModal-ywEL5GKA.js → InspectorModal-C7pIf6OO.js} +8 -8
- package/dist/{InspectorModal-ywEL5GKA.js.map → InspectorModal-C7pIf6OO.js.map} +1 -1
- package/dist/{MissingPackageModal-CUdcDjSO.js → MissingPackageModal-D_N96M6a.js} +5 -5
- package/dist/{MissingPackageModal-CUdcDjSO.js.map → MissingPackageModal-D_N96M6a.js.map} +1 -1
- package/dist/{SettingsModal-5dMD1lq9.js → SettingsModal-Dz3u5m_G.js} +11 -11
- package/dist/{SettingsModal-5dMD1lq9.js.map → SettingsModal-Dz3u5m_G.js.map} +1 -1
- package/dist/{UpgradeDriveModal-BwI5E5k3.js → UpgradeDriveModal-CyAUDCU7.js} +6 -6
- package/dist/{UpgradeDriveModal-BwI5E5k3.js.map → UpgradeDriveModal-CyAUDCU7.js.map} +1 -1
- package/dist/app-loader-C2ua5JsF.js +4 -0
- package/dist/{sidebar-CO3JjI3G.js → app-loader-CCPp_d0K.js} +894 -854
- package/dist/app-loader-CCPp_d0K.js.map +1 -0
- package/dist/{build-info-B3CWTvMu.js → build-info-DaWwuuKb.js} +4 -4
- package/dist/{build-info-B3CWTvMu.js.map → build-info-DaWwuuKb.js.map} +1 -1
- package/dist/components-CILkbSlg.js +5 -0
- package/dist/connect.config-aPx3rHZQ.js +161 -0
- package/dist/connect.config-aPx3rHZQ.js.map +1 -0
- package/dist/{load-D-7n7rPU.js → load-DalJBk1C.js} +13 -25
- package/dist/load-DalJBk1C.js.map +1 -0
- package/dist/main.js +5 -3
- package/dist/main.js.map +1 -1
- package/dist/{package-Dk3L0oWJ.js → package-BPfA1bwo.js} +6 -5
- package/dist/package-BPfA1bwo.js.map +1 -0
- package/dist/{pglite-runtime-Btp8ZXVH.js → pglite-runtime-toc1-TWa.js} +12 -6
- package/dist/pglite-runtime-toc1-TWa.js.map +1 -0
- package/dist/{pglite-seed-b1mJUaip.js → pglite-seed-D8oSKkep.js} +7 -7
- package/dist/pglite-seed-D8oSKkep.js.map +1 -0
- package/dist/pglite.worker.js +5 -5
- package/dist/pglite.worker.js.map +1 -1
- package/dist/pglite.worker.legacy.js +4 -4
- package/dist/pglite.worker.legacy.js.map +1 -1
- package/dist/{reactor-BixVsAMj.js → reactor-BlxTyHZ5.js} +92 -45
- package/dist/reactor-BlxTyHZ5.js.map +1 -0
- package/dist/{registerServiceWorker-BkUnxLqB.js → registerServiceWorker-B7uKpkci.js} +4 -4
- package/dist/{registerServiceWorker-BkUnxLqB.js.map → registerServiceWorker-B7uKpkci.js.map} +1 -1
- package/dist/{i18n-BuVT7wFQ.js → reload-connect-toast-CwvSc6F-.js} +19 -5
- package/dist/reload-connect-toast-CwvSc6F-.js.map +1 -0
- package/dist/runtime-config-DL3QjcfM.js +24 -0
- package/dist/runtime-config-DL3QjcfM.js.map +1 -0
- package/dist/start-connect.d.ts.map +1 -1
- package/dist/start-connect.js +5 -3
- package/dist/start-connect.js.map +1 -1
- package/dist/style.css +7 -0
- package/dist/{toast-DnODOv28.js → toast-BEy42aYx.js} +3 -3
- package/dist/{toast-DnODOv28.js.map → toast-BEy42aYx.js.map} +1 -1
- package/dist/{useRegistryPackages-PUiMxd73.js → useRegistryPackages-Bh0luCvV.js} +6 -6
- package/dist/useRegistryPackages-Bh0luCvV.js.map +1 -0
- package/package.json +11 -10
- package/public/powerhouse.config.json +33 -0
- package/dist/AddDriveModal-Cg2qcYp6.js.map +0 -1
- package/dist/connect.config-B2xP5Iez.js +0 -148
- package/dist/connect.config-B2xP5Iez.js.map +0 -1
- package/dist/i18n-BuVT7wFQ.js.map +0 -1
- package/dist/load-D-7n7rPU.js.map +0 -1
- package/dist/package-Dk3L0oWJ.js.map +0 -1
- package/dist/packages.config-CiH8KJVN.js +0 -32
- package/dist/packages.config-CiH8KJVN.js.map +0 -1
- package/dist/pglite-runtime-Btp8ZXVH.js.map +0 -1
- package/dist/pglite-seed-b1mJUaip.js.map +0 -1
- package/dist/reactor-BixVsAMj.js.map +0 -1
- package/dist/sidebar-CO3JjI3G.js.map +0 -1
- package/dist/useRegistryPackages-PUiMxd73.js.map +0 -1
- package/public/ph-packages.json +0 -4
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="6e2dc610-87df-54ad-827d-933fda38b2f7")}catch(e){}}();
|
|
3
|
-
import { setLogLevel } from "@powerhousedao/reactor-browser";
|
|
4
|
-
import { loadRuntimeEnv, normalizeBasePath } from "@powerhousedao/shared/connect";
|
|
5
|
-
import { logger } from "document-model";
|
|
6
|
-
//#region src/connect.config.ts
|
|
7
|
-
const env = loadRuntimeEnv({ processEnv: import.meta.env });
|
|
8
|
-
function getRouterBasenameFromBasePath(basePath) {
|
|
9
|
-
return basePath.endsWith("/") ? basePath : basePath + "/";
|
|
10
|
-
}
|
|
11
|
-
function getPHGlobalConfigFromEnv() {
|
|
12
|
-
const basePath = env.PH_CONNECT_BASE_PATH || import.meta.env.BASE_URL;
|
|
13
|
-
return {
|
|
14
|
-
basePath,
|
|
15
|
-
routerBasename: getRouterBasenameFromBasePath(basePath),
|
|
16
|
-
allowList: void 0,
|
|
17
|
-
allowedDocumentTypes: [],
|
|
18
|
-
isDragAndDropEnabled: true,
|
|
19
|
-
isEditorDebugModeEnabled: false,
|
|
20
|
-
isEditorReadModeEnabled: false,
|
|
21
|
-
isExternalControlsEnabled: false,
|
|
22
|
-
version: env.PH_CONNECT_VERSION,
|
|
23
|
-
logLevel: env.PH_CONNECT_LOG_LEVEL,
|
|
24
|
-
requiresHardRefresh: env.PH_CONNECT_REQUIRES_HARD_REFRESH,
|
|
25
|
-
warnOutdatedApp: env.PH_CONNECT_WARN_OUTDATED_APP,
|
|
26
|
-
studioMode: env.PH_CONNECT_STUDIO_MODE,
|
|
27
|
-
versionCheckInterval: env.PH_CONNECT_VERSION_CHECK_INTERVAL,
|
|
28
|
-
cliVersion: env.PH_CONNECT_CLI_VERSION,
|
|
29
|
-
fileUploadOperationsChunkSize: env.PH_CONNECT_FILE_UPLOAD_OPERATIONS_CHUNK_SIZE,
|
|
30
|
-
gaTrackingId: env.PH_CONNECT_GA_TRACKING_ID,
|
|
31
|
-
defaultDrivesUrl: env.PH_CONNECT_DEFAULT_DRIVES_URL,
|
|
32
|
-
drivesPreserveStrategy: env.PH_CONNECT_DRIVES_PRESERVE_STRATEGY,
|
|
33
|
-
enabledEditors: env.PH_CONNECT_ENABLED_EDITORS?.split(","),
|
|
34
|
-
disabledEditors: env.PH_CONNECT_DISABLED_EDITORS.split(","),
|
|
35
|
-
isExternalProcessorsEnabled: env.PH_CONNECT_EXTERNAL_PROCESSORS_ENABLED,
|
|
36
|
-
isAnalyticsEnabled: env.PH_CONNECT_ANALYTICS_ENABLED,
|
|
37
|
-
isAnalyticsExternalProcessorsEnabled: env.PH_CONNECT_EXTERNAL_PROCESSORS_ENABLED && env.PH_CONNECT_EXTERNAL_ANALYTICS_PROCESSORS_ENABLED,
|
|
38
|
-
analyticsDatabaseName: env.PH_CONNECT_ANALYTICS_DATABASE_NAME,
|
|
39
|
-
isRelationalProcessorsEnabled: env.PH_CONNECT_RELATIONAL_PROCESSORS_ENABLED,
|
|
40
|
-
isExternalRelationalProcessorsEnabled: env.PH_CONNECT_EXTERNAL_PROCESSORS_ENABLED && env.PH_CONNECT_EXTERNAL_RELATIONAL_PROCESSORS_ENABLED,
|
|
41
|
-
renownUrl: env.PH_CONNECT_RENOWN_URL,
|
|
42
|
-
renownNetworkId: env.PH_CONNECT_RENOWN_NETWORK_ID,
|
|
43
|
-
renownChainId: env.PH_CONNECT_RENOWN_CHAIN_ID,
|
|
44
|
-
sentryRelease: env.PH_CONNECT_SENTRY_RELEASE,
|
|
45
|
-
sentryDsn: env.PH_CONNECT_SENTRY_DSN,
|
|
46
|
-
sentryEnv: env.PH_CONNECT_SENTRY_ENV,
|
|
47
|
-
isDiffAnalyticsEnabled: env.PH_CONNECT_DIFF_ANALYTICS_ENABLED,
|
|
48
|
-
isDriveAnalyticsEnabled: env.PH_CONNECT_DRIVE_ANALYTICS_ENABLED,
|
|
49
|
-
isPublicDrivesEnabled: env.PH_CONNECT_PUBLIC_DRIVES_ENABLED,
|
|
50
|
-
isCloudDrivesEnabled: env.PH_CONNECT_CLOUD_DRIVES_ENABLED,
|
|
51
|
-
isLocalDrivesEnabled: env.PH_CONNECT_LOCAL_DRIVES_ENABLED,
|
|
52
|
-
isSentryTracingEnabled: env.PH_CONNECT_SENTRY_TRACING_ENABLED,
|
|
53
|
-
isDocumentModelSelectionSettingsEnabled: !env.PH_CONNECT_HIDE_DOCUMENT_MODEL_SELECTION_SETTINGS,
|
|
54
|
-
isAddDriveEnabled: !env.PH_CONNECT_DISABLE_ADD_DRIVE,
|
|
55
|
-
isAddPublicDrivesEnabled: !env.PH_CONNECT_DISABLE_ADD_PUBLIC_DRIVES,
|
|
56
|
-
isDeletePublicDrivesEnabled: !env.PH_CONNECT_DISABLE_DELETE_PUBLIC_DRIVES,
|
|
57
|
-
isAddCloudDrivesEnabled: !env.PH_CONNECT_DISABLE_ADD_CLOUD_DRIVES,
|
|
58
|
-
isDeleteCloudDrivesEnabled: !env.PH_CONNECT_DISABLE_DELETE_CLOUD_DRIVES,
|
|
59
|
-
isAddLocalDrivesEnabled: !env.PH_CONNECT_DISABLE_ADD_LOCAL_DRIVES,
|
|
60
|
-
isDeleteLocalDrivesEnabled: !env.PH_CONNECT_DISABLE_DELETE_LOCAL_DRIVES,
|
|
61
|
-
isAnalyticsDatabaseWorkerEnabled: !env.PH_CONNECT_ANALYTICS_DATABASE_WORKER_DISABLED,
|
|
62
|
-
isExternalPackagesEnabled: !env.PH_CONNECT_EXTERNAL_PACKAGES_DISABLED
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
const phGlobalConfigFromEnv = getPHGlobalConfigFromEnv();
|
|
66
|
-
const defaultPHDocumentEditorConfig = { isExternalControlsEnabled: phGlobalConfigFromEnv.isExternalControlsEnabled };
|
|
67
|
-
const defaultPHAppConfig = {
|
|
68
|
-
allowedDocumentTypes: phGlobalConfigFromEnv.allowedDocumentTypes,
|
|
69
|
-
isDragAndDropEnabled: phGlobalConfigFromEnv.isDragAndDropEnabled
|
|
70
|
-
};
|
|
71
|
-
setLogLevel(env.PH_CONNECT_LOG_LEVEL);
|
|
72
|
-
logger.debug("Setting log level to @level.", env.PH_CONNECT_LOG_LEVEL);
|
|
73
|
-
const PH_CONNECT_BASE_PATH = normalizeBasePath(env.PH_CONNECT_BASE_PATH || import.meta.env.BASE_URL);
|
|
74
|
-
const PH_CONNECT_ANALYTICS_DATABASE_NAME = env.PH_CONNECT_ANALYTICS_DATABASE_NAME || `${PH_CONNECT_BASE_PATH.replace(/\//g, "")}:analytics`;
|
|
75
|
-
const connectConfig = {
|
|
76
|
-
appVersion: env.PH_CONNECT_VERSION,
|
|
77
|
-
studioMode: env.PH_CONNECT_STUDIO_MODE,
|
|
78
|
-
warnOutdatedApp: env.PH_CONNECT_WARN_OUTDATED_APP,
|
|
79
|
-
appVersionCheckInterval: env.PH_CONNECT_VERSION_CHECK_INTERVAL,
|
|
80
|
-
routerBasename: PH_CONNECT_BASE_PATH,
|
|
81
|
-
externalPackagesEnabled: !env.PH_CONNECT_EXTERNAL_PACKAGES_DISABLED,
|
|
82
|
-
processors: {
|
|
83
|
-
enabled: env.PH_CONNECT_PROCESSORS_ENABLED,
|
|
84
|
-
externalProcessorsEnabled: env.PH_CONNECT_EXTERNAL_PROCESSORS_ENABLED
|
|
85
|
-
},
|
|
86
|
-
analytics: {
|
|
87
|
-
enabled: env.PH_CONNECT_ANALYTICS_ENABLED,
|
|
88
|
-
databaseName: PH_CONNECT_ANALYTICS_DATABASE_NAME,
|
|
89
|
-
useWorker: !env.PH_CONNECT_ANALYTICS_DATABASE_WORKER_DISABLED,
|
|
90
|
-
driveAnalyticsEnabled: env.PH_CONNECT_DRIVE_ANALYTICS_ENABLED,
|
|
91
|
-
diffProcessorEnabled: env.PH_CONNECT_DIFF_ANALYTICS_ENABLED,
|
|
92
|
-
externalProcessorsEnabled: env.PH_CONNECT_EXTERNAL_PROCESSORS_ENABLED
|
|
93
|
-
},
|
|
94
|
-
relational: {
|
|
95
|
-
enabled: env.PH_CONNECT_RELATIONAL_PROCESSORS_ENABLED,
|
|
96
|
-
externalProcessorsEnabled: env.PH_CONNECT_EXTERNAL_RELATIONAL_PROCESSORS_ENABLED
|
|
97
|
-
},
|
|
98
|
-
openPanel: {
|
|
99
|
-
clientId: env.PH_CONNECT_OPENPANEL_CLIENT_ID ?? "",
|
|
100
|
-
apiUrl: env.PH_CONNECT_OPENPANEL_API_URL,
|
|
101
|
-
trackUiEvents: env.PH_CONNECT_OPENPANEL_TRACK_UI_EVENTS,
|
|
102
|
-
trackOperations: env.PH_CONNECT_OPENPANEL_TRACK_OPERATIONS
|
|
103
|
-
},
|
|
104
|
-
renown: {
|
|
105
|
-
url: env.PH_CONNECT_RENOWN_URL,
|
|
106
|
-
networkId: env.PH_CONNECT_RENOWN_NETWORK_ID,
|
|
107
|
-
chainId: env.PH_CONNECT_RENOWN_CHAIN_ID
|
|
108
|
-
},
|
|
109
|
-
sentry: {
|
|
110
|
-
release: env.PH_CONNECT_SENTRY_RELEASE,
|
|
111
|
-
dsn: env.PH_CONNECT_SENTRY_DSN,
|
|
112
|
-
env: env.PH_CONNECT_SENTRY_ENV,
|
|
113
|
-
tracing: env.PH_CONNECT_SENTRY_TRACING_ENABLED
|
|
114
|
-
},
|
|
115
|
-
content: {
|
|
116
|
-
showSearchBar: env.PH_CONNECT_SEARCH_BAR_ENABLED,
|
|
117
|
-
showDocumentModelSelectionSetting: !env.PH_CONNECT_HIDE_DOCUMENT_MODEL_SELECTION_SETTINGS
|
|
118
|
-
},
|
|
119
|
-
drives: {
|
|
120
|
-
addDriveEnabled: !env.PH_CONNECT_DISABLE_ADD_DRIVE,
|
|
121
|
-
preserveStrategy: env.PH_CONNECT_DRIVES_PRESERVE_STRATEGY,
|
|
122
|
-
sections: {
|
|
123
|
-
LOCAL: {
|
|
124
|
-
enabled: env.PH_CONNECT_LOCAL_DRIVES_ENABLED,
|
|
125
|
-
allowAdd: !env.PH_CONNECT_DISABLE_ADD_LOCAL_DRIVES,
|
|
126
|
-
allowDelete: !env.PH_CONNECT_DISABLE_DELETE_LOCAL_DRIVES
|
|
127
|
-
},
|
|
128
|
-
CLOUD: {
|
|
129
|
-
enabled: env.PH_CONNECT_CLOUD_DRIVES_ENABLED,
|
|
130
|
-
allowAdd: !env.PH_CONNECT_DISABLE_ADD_CLOUD_DRIVES,
|
|
131
|
-
allowDelete: !env.PH_CONNECT_DISABLE_DELETE_CLOUD_DRIVES
|
|
132
|
-
},
|
|
133
|
-
PUBLIC: {
|
|
134
|
-
enabled: env.PH_CONNECT_PUBLIC_DRIVES_ENABLED,
|
|
135
|
-
allowAdd: !env.PH_CONNECT_DISABLE_ADD_PUBLIC_DRIVES,
|
|
136
|
-
allowDelete: !env.PH_CONNECT_DISABLE_DELETE_PUBLIC_DRIVES
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
},
|
|
140
|
-
gaTrackingId: env.PH_CONNECT_GA_TRACKING_ID,
|
|
141
|
-
phCliVersion: env.PH_CONNECT_CLI_VERSION,
|
|
142
|
-
packagesRegistry: env.PH_CONNECT_PACKAGES_REGISTRY
|
|
143
|
-
};
|
|
144
|
-
//#endregion
|
|
145
|
-
export { phGlobalConfigFromEnv as i, defaultPHAppConfig as n, defaultPHDocumentEditorConfig as r, connectConfig as t };
|
|
146
|
-
|
|
147
|
-
//# sourceMappingURL=connect.config-B2xP5Iez.js.map
|
|
148
|
-
//# debugId=6e2dc610-87df-54ad-827d-933fda38b2f7
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connect.config-B2xP5Iez.js","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 openPanel: {\n clientId: env.PH_CONNECT_OPENPANEL_CLIENT_ID ?? \"\",\n apiUrl: env.PH_CONNECT_OPENPANEL_API_URL,\n // Intentionally dormant — no call sites gate on this yet; UI-event tracking is future work.\n trackUiEvents: env.PH_CONNECT_OPENPANEL_TRACK_UI_EVENTS,\n trackOperations: env.PH_CONNECT_OPENPANEL_TRACK_OPERATIONS,\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 },\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"],"names":[],"mappings":"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","debug_id":"6e2dc610-87df-54ad-827d-933fda38b2f7"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"i18n-BuVT7wFQ.js","sources":["../src/i18n/locales/en.json","../src/i18n/index.ts"],"sourcesContent":["","import type { Resource } from \"i18next\";\nimport i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\n\nimport translationEN from \"./locales/en.json\" with { type: \"json\" };\n\nconst resources: Resource = {\n en: {\n code: \"en\",\n name: \"English\",\n translation: translationEN,\n },\n};\n\ni18n\n .use(initReactI18next)\n .init({\n resources,\n fallbackLng: \"en\",\n debug: false,\n interpolation: {\n escapeValue: false,\n },\n })\n .catch((e: unknown) => {\n console.error(e);\n });\n\nexport { i18n };\nexport default i18n;\n"],"names":["translationEN"],"mappings":";;;;ACcA,KACG,IAAI,iBAAiB,CACrB,KAAK;CACJ,WAXwB,EAC1B,IAAI;EACF,MAAM;EACN,MAAM;EACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACD,EACF;CAMG,aAAa;CACb,OAAO;CACP,eAAe,EACb,aAAa,OACd;CACF,CAAC,CACD,OAAO,MAAe;AACrB,SAAQ,MAAM,EAAE;EAChB","debug_id":"f135862c-7273-56da-8a52-04187b2d0b63"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"load-D-7n7rPU.js","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: _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 {\n detectReactorPgMajor,\n seedPendingPgVersion,\n} from \"@powerhousedao/connect/utils\";\nimport { initTheme } from \"@powerhousedao/reactor-browser\";\nimport type { DocumentModelLib } from \"document-model\";\nimport { type ReactNode } from \"react\";\n\nexport async function loadComponent(localPackage?: DocumentModelLib) {\n await seedPendingPgVersion();\n await detectReactorPgMajor();\n await createReactor(localPackage);\n return {\n default: ({ children }: { children?: ReactNode }) => {\n initTheme();\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useSetSentryUser();\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useCheckLatestVersion();\n return children;\n },\n };\n}\n"],"names":["packageJson"],"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,aAAa,GAAG,SAAS;AAC7C,gBAAa;IAAE,IAAI,KAAK;IAAK,UAAU,KAAK,KAAK;IAAM,GAAG;IAAM;;AAElE,UAAc,WAAW;IACxB,CAAC,KAAK,CAAC;;;;ACJZ,eAAsB,cAAc,cAAiC;AACnE,OAAM,sBAAsB;AAC5B,OAAM,sBAAsB;AAC5B,OAAM,cAAc,aAAa;AACjC,QAAO,EACL,UAAU,EAAE,eAAyC;AACnD,aAAW;AAEX,oBAAkB;AAElB,yBAAuB;AACvB,SAAO;IAEV","debug_id":"ec0531d6-9ad5-5294-a19b-bdafa7f41882"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"package-Dk3L0oWJ.js","sources":["../package.json"],"sourcesContent":[""],"names":[],"mappings":"","debug_id":"67c4c0b6-0d8f-5258-af15-524ed8cca175"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
//#region src/packages.config.ts
|
|
2
|
-
|
|
3
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="7f114cbb-36f3-5b27-a65c-dd233bc41499")}catch(e){}}();
|
|
4
|
-
function assertPackagesConfig(value) {
|
|
5
|
-
if (typeof value !== "object" || value === null) throw new Error("ph-packages.json must be a JSON object");
|
|
6
|
-
const obj = value;
|
|
7
|
-
if (!Array.isArray(obj.packages)) throw new Error("ph-packages.json: 'packages' must be an array");
|
|
8
|
-
if (!obj.packages.every((item) => typeof item === "string")) throw new Error("ph-packages.json: 'packages' must be an array of strings");
|
|
9
|
-
if (obj.registryUrl !== void 0 && obj.registryUrl !== null && typeof obj.registryUrl !== "string") throw new Error("ph-packages.json: 'registryUrl' must be a string, null, or omitted");
|
|
10
|
-
}
|
|
11
|
-
let cached;
|
|
12
|
-
async function loadPackagesConfig() {
|
|
13
|
-
if (cached) return cached;
|
|
14
|
-
const url = `${import.meta.env.BASE_URL ?? "/"}ph-packages.json`;
|
|
15
|
-
const json = await (await fetch(url)).json();
|
|
16
|
-
assertPackagesConfig(json);
|
|
17
|
-
cached = json;
|
|
18
|
-
return cached;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Returns the cached config synchronously.
|
|
22
|
-
* Must be called after `loadPackagesConfig()` has resolved.
|
|
23
|
-
*/
|
|
24
|
-
function getPackagesConfig() {
|
|
25
|
-
if (!cached) throw new Error("Packages config not loaded yet. Call loadPackagesConfig() first.");
|
|
26
|
-
return cached;
|
|
27
|
-
}
|
|
28
|
-
//#endregion
|
|
29
|
-
export { loadPackagesConfig as n, getPackagesConfig as t };
|
|
30
|
-
|
|
31
|
-
//# sourceMappingURL=packages.config-CiH8KJVN.js.map
|
|
32
|
-
//# debugId=7f114cbb-36f3-5b27-a65c-dd233bc41499
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"packages.config-CiH8KJVN.js","sources":["../src/packages.config.ts"],"sourcesContent":["export type PackagesConfig = {\n packages: string[];\n localPackage?: { name: string; version: string } | null;\n registryUrl?: string | null;\n};\n\nfunction assertPackagesConfig(value: unknown): asserts value is PackagesConfig {\n if (typeof value !== \"object\" || value === null) {\n throw new Error(\"ph-packages.json must be a JSON object\");\n }\n\n const obj = value as Record<string, unknown>;\n\n if (!Array.isArray(obj.packages)) {\n throw new Error(\"ph-packages.json: 'packages' must be an array\");\n }\n\n if (!obj.packages.every((item) => typeof item === \"string\")) {\n throw new Error(\"ph-packages.json: 'packages' must be an array of strings\");\n }\n\n if (\n obj.registryUrl !== undefined &&\n obj.registryUrl !== null &&\n typeof obj.registryUrl !== \"string\"\n ) {\n throw new Error(\n \"ph-packages.json: 'registryUrl' must be a string, null, or omitted\",\n );\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"],"names":[],"mappings":";;;AAMA,SAAS,qBAAqB,OAAiD;AAC7E,KAAI,OAAO,UAAU,YAAY,UAAU,KACzC,OAAM,IAAI,MAAM,yCAAyC;CAG3D,MAAM,MAAM;AAEZ,KAAI,CAAC,MAAM,QAAQ,IAAI,SAAS,CAC9B,OAAM,IAAI,MAAM,gDAAgD;AAGlE,KAAI,CAAC,IAAI,SAAS,OAAO,SAAS,OAAO,SAAS,SAAS,CACzD,OAAM,IAAI,MAAM,2DAA2D;AAG7E,KACE,IAAI,gBAAgB,KAAA,KACpB,IAAI,gBAAgB,QACpB,OAAO,IAAI,gBAAgB,SAE3B,OAAM,IAAI,MACR,qEACD;;AAIL,IAAI;AAEJ,eAAsB,qBAA8C;AAClE,KAAI,OAAQ,QAAO;CAGnB,MAAM,MAAM,GADK,OAAO,KAAK,IAAI,YAAY,IACrB;CAExB,MAAM,OAAgB,OADV,MAAM,MAAM,IAAI,EACI,MAAM;AACtC,sBAAqB,KAAK;AAC1B,UAAS;AACT,QAAO;;;;;;AAOT,SAAgB,oBAAoC;AAClD,KAAI,CAAC,OACH,OAAM,IAAI,MACR,mEACD;AAEH,QAAO","debug_id":"7f114cbb-36f3-5b27-a65c-dd233bc41499"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pglite-runtime-Btp8ZXVH.js","sources":["../src/utils/pglite-idb.ts","../src/utils/pglite-runtime.ts"],"sourcesContent":["import { DEFAULT_RELATIONAL_PROCESSOR_DB_NAME } from \"@powerhousedao/shared/processors\";\n\nexport const IDB_STORE_NAME = \"FILE_DATA\";\nexport const IDB_DB_VERSION = 21;\n\nexport const REACTOR_IDB_NAME = \"/pglite/reactor\";\nexport const RELATIONAL_IDB_NAME = `/pglite/${DEFAULT_RELATIONAL_PROCESSOR_DB_NAME}`;\n\nexport const PRIMARY_IDB_NAMES = [\n REACTOR_IDB_NAME,\n RELATIONAL_IDB_NAME,\n] as const;\n\ntype FileDataValue = {\n contents: Uint8Array | number[];\n mode: number;\n timestamp: Date | number;\n};\n\nexport function idbError(\n req: IDBRequest | IDBTransaction,\n context: string,\n): Error {\n const cause = req.error ?? new Error(\"unknown IDB error\");\n return new Error(`${context}: ${cause.message}`, { cause });\n}\n\nexport function indexedDbExists(name: string): Promise<boolean> {\n if (typeof indexedDB.databases === \"function\") {\n return indexedDB\n .databases()\n .then((dbs) => dbs.some((d) => d.name === name))\n .catch(() => true);\n }\n return Promise.resolve(true);\n}\n\nexport function openIdb(\n name: string,\n version: number,\n upgrade?: (db: IDBDatabase) => void,\n): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(name, version);\n req.onerror = () => reject(idbError(req, `IDB open failed for ${name}`));\n req.onblocked = () => reject(new Error(`IDB open blocked for ${name}`));\n req.onupgradeneeded = () => upgrade?.(req.result);\n req.onsuccess = () => resolve(req.result);\n });\n}\n\nexport function createFileDataStore(db: IDBDatabase): void {\n if (!db.objectStoreNames.contains(IDB_STORE_NAME)) {\n const store = db.createObjectStore(IDB_STORE_NAME);\n store.createIndex(\"timestamp\", \"timestamp\", { unique: false });\n }\n}\n\nexport async function readPgVersionFile(\n idbName: string,\n): Promise<number | null> {\n if (!(await indexedDbExists(idbName))) return null;\n let db: IDBDatabase;\n try {\n db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);\n } catch {\n return null;\n }\n try {\n if (!db.objectStoreNames.contains(IDB_STORE_NAME)) return null;\n const tx = db.transaction(IDB_STORE_NAME, \"readonly\");\n const store = tx.objectStore(IDB_STORE_NAME);\n const value = await new Promise<FileDataValue | null>((resolve, reject) => {\n const req = store.openCursor();\n req.onerror = () =>\n reject(idbError(req, `FILE_DATA cursor failed for ${idbName}`));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) return resolve(null);\n const key = typeof cursor.key === \"string\" ? cursor.key : \"\";\n if (key.endsWith(\"/PG_VERSION\")) {\n resolve(cursor.value as FileDataValue);\n } else {\n cursor.continue();\n }\n };\n });\n if (!value) return null;\n const bytes =\n value.contents instanceof Uint8Array\n ? value.contents\n : new Uint8Array(value.contents);\n const text = new TextDecoder().decode(bytes).trim();\n const major = parseInt(text, 10);\n return Number.isFinite(major) ? major : null;\n } finally {\n db.close();\n }\n}\n","import type * as CurrentPGliteModuleNs from \"@electric-sql/pglite\";\nimport {\n readPgVersionFile,\n REACTOR_IDB_NAME,\n RELATIONAL_IDB_NAME,\n} from \"./pglite-idb.js\";\n\nexport const CURRENT_PG_MAJOR = 17;\nexport const SUPPORTED_PG_MAJORS = [16, 17] as const;\nexport type SupportedPgMajor = (typeof SUPPORTED_PG_MAJORS)[number];\n\ntype DetectedMajor = SupportedPgMajor | null;\n\ntype CurrentPGliteModule = typeof CurrentPGliteModuleNs;\n\nlet cachedReactorMajor: DetectedMajor | undefined;\nlet inflight: Promise<DetectedMajor> | undefined;\nconst majorListeners = new Set<() => void>();\n\nfunction notifyMajorChanged() {\n for (const l of majorListeners) l();\n}\n\nexport function subscribeReactorPgMajor(cb: () => void): () => void {\n majorListeners.add(cb);\n return () => {\n majorListeners.delete(cb);\n };\n}\n\nfunction coerceMajor(value: number | null): DetectedMajor {\n if (value === null) return null;\n return (SUPPORTED_PG_MAJORS as readonly number[]).includes(value)\n ? (value as SupportedPgMajor)\n : null;\n}\n\nexport async function detectReactorPgMajor(): Promise<DetectedMajor> {\n if (cachedReactorMajor !== undefined) return cachedReactorMajor;\n if (inflight) return inflight;\n\n inflight = (async () => {\n const major = coerceMajor(await readPgVersionFile(REACTOR_IDB_NAME));\n cachedReactorMajor = major;\n notifyMajorChanged();\n return major;\n })();\n try {\n return await inflight;\n } finally {\n inflight = undefined;\n }\n}\n\nexport function getCachedReactorPgMajor(): DetectedMajor | undefined {\n return cachedReactorMajor;\n}\n\nexport function invalidateReactorPgMajorCache(): void {\n cachedReactorMajor = undefined;\n notifyMajorChanged();\n}\n\nexport async function detectRelationalPgMajor(): Promise<DetectedMajor> {\n return coerceMajor(await readPgVersionFile(RELATIONAL_IDB_NAME));\n}\n\n/**\n * Pick the PGlite major to use for *new* reactor clients: fall back to the\n * current version when there is no existing data dir.\n */\nexport function resolvePgMajorForRuntime(\n detected: DetectedMajor,\n): SupportedPgMajor {\n return detected ?? CURRENT_PG_MAJOR;\n}\n\n/**\n * Loads the PGlite module that matches an on-disk data dir major version.\n *\n * The 0.2.x and 0.3.x modules expose the same runtime interface (PGlite class,\n * `idb://` data-dir support, waitReady, exec/query/transaction, close). The\n * return type is pinned to the current package's module so callers can use it\n * against `kysely-pglite-dialect` which peer-depends on both majors.\n */\nexport async function loadPGliteModule(\n major: SupportedPgMajor,\n): Promise<CurrentPGliteModule> {\n if (major === 16) {\n return (await import(\"pglite-legacy-02\")) as unknown as CurrentPGliteModule;\n }\n if (major === 17) return import(\"@electric-sql/pglite\");\n throw new Error(`Unsupported PGlite major: ${String(major)}`);\n}\n\ntype PgDumpFn = (options: {\n pg: unknown;\n}) => Promise<{ text(): Promise<string> }>;\n\n/**\n * Loads the pg_dump tool for the given PGlite major. pg_dump's VFS layout is\n * version-specific, so using the wrong major against a live PGlite instance\n * fails with Emscripten ENOENT (errno 44).\n */\nexport async function loadPgDump(major: SupportedPgMajor): Promise<PgDumpFn> {\n if (major === 16) {\n const mod = (await import(\"pglite-tools-legacy-02/pg_dump\")) as {\n pgDump: PgDumpFn;\n };\n return mod.pgDump;\n }\n if (major === 17) {\n const mod = (await import(\"@electric-sql/pglite-tools/pg_dump\")) as {\n pgDump: PgDumpFn;\n };\n return mod.pgDump;\n }\n throw new Error(`Unsupported PGlite major: ${String(major)}`);\n}\n"],"names":[],"mappings":"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","debug_id":"7934ff5b-6633-5fdc-8cfc-d34fefb943b9"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pglite-seed-b1mJUaip.js","sources":["../src/utils/pglite-seed.ts"],"sourcesContent":["import { invalidateReactorPgMajorCache } from \"./pglite-runtime.js\";\n\nexport const PENDING_PG_SEED_KEY = \"ph:pending-pg-seed\";\n\n/**\n * If the Debug Inspector requested a forced PG version reset, this runs\n * before the reactor is created on the subsequent page load: opens a fresh\n * PGlite of the requested major against `idb://reactor`, lets `initdb`\n * populate `PG_VERSION`, then closes. The next step of app boot then\n * detects this fresh data dir and picks the matching runtime.\n */\nexport async function seedPendingPgVersion(): Promise<void> {\n const raw = localStorage.getItem(PENDING_PG_SEED_KEY);\n if (!raw) return;\n\n const major = parseInt(raw, 10);\n console.info(`[pglite-seed] Seeding fresh PG${major} data dir...`);\n\n try {\n if (major === 16) {\n const { PGlite } = await import(\"pglite-legacy-02\");\n const pg = new PGlite(\"idb://reactor\");\n try {\n await pg.waitReady;\n } finally {\n await pg.close();\n }\n } else if (major === 17) {\n const { PGlite } = await import(\"@electric-sql/pglite\");\n const pg = new PGlite(\"idb://reactor\");\n try {\n await pg.waitReady;\n } finally {\n await pg.close();\n }\n } else {\n console.warn(`[pglite-seed] Unsupported version ${raw}, skipping`);\n return;\n }\n console.info(`[pglite-seed] Seeded PG${major} data dir.`);\n } finally {\n localStorage.removeItem(PENDING_PG_SEED_KEY);\n invalidateReactorPgMajorCache();\n }\n}\n"],"names":[],"mappings":";;;;AAEA,MAAa,sBAAsB;;;;;;;;AASnC,eAAsB,uBAAsC;CAC1D,MAAM,MAAM,aAAa,QAAQ,oBAAoB;AACrD,KAAI,CAAC,IAAK;CAEV,MAAM,QAAQ,SAAS,KAAK,GAAG;AAC/B,SAAQ,KAAK,iCAAiC,MAAM,cAAc;AAElE,KAAI;AACF,MAAI,UAAU,IAAI;GAChB,MAAM,EAAE,WAAW,MAAM,OAAO;GAChC,MAAM,KAAK,IAAI,OAAO,gBAAgB;AACtC,OAAI;AACF,UAAM,GAAG;aACD;AACR,UAAM,GAAG,OAAO;;aAET,UAAU,IAAI;GACvB,MAAM,EAAE,WAAW,MAAM,OAAO;GAChC,MAAM,KAAK,IAAI,OAAO,gBAAgB;AACtC,OAAI;AACF,UAAM,GAAG;aACD;AACR,UAAM,GAAG,OAAO;;SAEb;AACL,WAAQ,KAAK,qCAAqC,IAAI,YAAY;AAClE;;AAEF,UAAQ,KAAK,0BAA0B,MAAM,YAAY;WACjD;AACR,eAAa,WAAW,oBAAoB;AAC5C,iCAA+B","debug_id":"a10d30b6-6e0e-5609-ac46-867e7535e754"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reactor-BixVsAMj.js","sources":["../src/utils/reactor.ts","../src/feature-flags.ts","../src/no-registry-discovery.ts","../src/package-discovery.ts","../src/package-manager.ts","../src/pglite.db.ts","../src/store/processor-host-module.ts","../src/store/reactor.ts"],"sourcesContent":["import {\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\";\nimport {\n detectReactorPgMajor,\n loadPGliteModule,\n resolvePgMajorForRuntime,\n} from \"./pglite-runtime.js\";\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 detected = await detectReactorPgMajor();\n const major = resolvePgMajorForRuntime(detected);\n if (major !== 17) {\n console.warn(\n `[reactor] Running against legacy PGlite data dir (Postgres ${major}). Migrate to PG17 from the banner or the Inspector → Debug tab.`,\n );\n }\n const { PGlite } = await loadPGliteModule(major);\n const pg = new PGlite(\"idb://reactor\", {\n relaxedDurability: true,\n });\n const logger = new ConsoleLogger([\"reactor-client\"]);\n const builder = new ReactorClientBuilder()\n .withLogger(logger)\n .withSigner(signerConfig)\n .withReactorBuilder(\n new ReactorBuilder()\n .withDocumentModels(documentModelModules)\n .withUpgradeManifests(upgradeManifests)\n .withChannelScheme(ChannelScheme.CONNECT)\n .withJwtHandler(jwtHandler)\n .withKysely(\n new Kysely<Database>({\n dialect: new PGliteDialect(pg),\n }),\n ),\n );\n\n if (documentModelLoader) {\n builder.withDocumentModelLoader(documentModelLoader);\n }\n\n const module = await builder.buildModule();\n return {\n ...module,\n pg,\n } as BrowserReactorClientModule;\n}\n\n/**\n * Parse default drives from environment variable.\n * Returns an array of drive REST endpoint URLs (e.g., \"https://example.com/d/powerhouse\").\n */\nexport function getDefaultDrivesFromEnv(): string[] {\n const envValue = import.meta.env.PH_CONNECT_DEFAULT_DRIVES_URL as\n | string\n | undefined;\n if (!envValue) return [];\n return envValue.split(\",\").filter((url) => url.trim().length > 0);\n}\n\n/**\n * Add default drives for the new reactor via sync manager.\n *\n * Retries with linear backoff to handle the common race where Connect's\n * dev server is ready before the switchboard has finished binding its port.\n *\n * @param defaultDriveUrls - Array of drive REST endpoint URLs (e.g., \"https://example.com/d/powerhouse\")\n * @param options - Forwarded to addRemoteDrive. Pass `awaitInitialSync: true`\n * when the URL pins a drive slug that must resolve before selection.\n */\nexport async function addDefaultDrivesForNewReactor(\n defaultDriveUrls: string[],\n options?: { awaitInitialSync?: boolean; initialSyncTimeoutMs?: number },\n): Promise<void> {\n const MAX_ATTEMPTS = 3;\n const BACKOFF_MS = 2000;\n\n for (const url of defaultDriveUrls) {\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n try {\n await addRemoteDrive(url, undefined, options);\n break;\n } catch (error) {\n if (attempt === MAX_ATTEMPTS) {\n console.error(\n `Failed to add default drive ${url} after ${MAX_ATTEMPTS} attempts:`,\n error,\n );\n } else {\n const delay = BACKOFF_MS * attempt;\n console.warn(\n `Default drive ${url} not reachable (attempt ${attempt}/${MAX_ATTEMPTS}), retrying in ${delay}ms...`,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n }\n}\n","import {\n OpenFeature,\n type ErrorCode,\n type JsonValue,\n type Provider,\n type ResolutionDetails,\n} from \"@openfeature/web-sdk\";\nimport { logger, setLogLevel, type ILogger } from \"document-model\";\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\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","import {\n type IDocumentModelLoader,\n type IPackageDiscoveryService,\n type DiscoveryEvent,\n type DiscoveryEventListener,\n type FailedInstallation,\n type PendingInstallation,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport type { BrowserPackageManager } from \"./package-manager.js\";\n\n/**\n * Discovery service used when no package registry is configured. Every load\n * for an unknown document type is recorded as a failure with reason\n * \"no-registry\" so the UI can surface the issue; the modal install flow is a\n * no-op because there is no registry to query.\n */\nexport class NoRegistryDiscoveryService\n implements IDocumentModelLoader, IPackageDiscoveryService\n{\n #packageManager: BrowserPackageManager;\n #failed = new Map<string, FailedInstallation>();\n #failedMemo: FailedInstallation[] = [];\n #failedSubscribers = new Set<() => void>();\n #eventSubscribers = new Set<DiscoveryEventListener>();\n\n constructor(packageManager: BrowserPackageManager) {\n this.#packageManager = packageManager;\n }\n\n load(documentType: string): Promise<DocumentModelModule<any>> {\n const existing = this.#findModuleInLoadedPackages(documentType);\n if (existing) {\n this.#clearFailed(documentType);\n return Promise.resolve(existing);\n }\n\n this.#recordFailure(documentType);\n return Promise.reject(\n new Error(\n `No package registry configured; cannot resolve \"${documentType}\"`,\n ),\n );\n }\n\n promptInstallation(): void {\n // no registry to query — nothing to prompt\n }\n\n approveInstallation(): Promise<void> {\n return Promise.resolve();\n }\n\n dismissInstallation(): void {\n // nothing to dismiss\n }\n\n getPendingInstallations(): PendingInstallation[] {\n return [];\n }\n\n subscribePending(): () => void {\n return () => {};\n }\n\n getFailedInstallations(): FailedInstallation[] {\n return this.#failedMemo;\n }\n\n subscribeFailed(listener: () => void): () => void {\n this.#failedSubscribers.add(listener);\n return () => {\n this.#failedSubscribers.delete(listener);\n };\n }\n\n subscribeEvents(listener: DiscoveryEventListener): () => void {\n this.#eventSubscribers.add(listener);\n return () => {\n this.#eventSubscribers.delete(listener);\n };\n }\n\n retryInstallation(documentType: string): Promise<void> {\n // Retry is a no-op without a registry, but re-emitting the failure lets\n // a UI that cleared the row know the underlying condition still holds.\n this.#recordFailure(documentType);\n return Promise.resolve();\n }\n\n #findModuleInLoadedPackages(\n documentType: string,\n ): DocumentModelModule<any> | undefined {\n return this.#packageManager.packages\n .flatMap((p) => p.documentModels)\n .find((m) => m.documentModel.global.id === documentType);\n }\n\n #recordFailure(documentType: string): void {\n this.#failed.set(documentType, {\n documentType,\n reason: \"no-registry\",\n packageNames: [],\n error: null,\n });\n this.#emitEvent({\n type: \"load-failed\",\n documentType,\n reason: \"no-registry\",\n });\n this.#notifyFailedChanged();\n }\n\n #clearFailed(documentType: string): void {\n if (this.#failed.delete(documentType)) {\n this.#notifyFailedChanged();\n }\n }\n\n #notifyFailedChanged(): void {\n this.#failedMemo = Array.from(this.#failed.values());\n for (const listener of this.#failedSubscribers) {\n listener();\n }\n }\n\n #emitEvent(event: DiscoveryEvent): void {\n for (const listener of this.#eventSubscribers) {\n listener(event);\n }\n }\n}\n","import {\n BrowserLocalStorage,\n type IDocumentModelLoader,\n type IPackageDiscoveryService,\n type DiscoveryEvent,\n type DiscoveryEventListener,\n type FailedInstallation,\n type FailedInstallationReason,\n type PendingInstallation,\n} from \"@powerhousedao/reactor-browser\";\nimport type { RegistryClient } from \"@powerhousedao/reactor-browser\";\nimport type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport type { BrowserPackageManager } from \"./package-manager.js\";\n\nexport type DiscoveryMode = \"immediate\" | \"manual\";\n\ntype DeferredEntry = {\n packageNames: string[];\n resolve: (module: DocumentModelModule<any>) => void;\n reject: (reason: unknown) => void;\n promise: Promise<DocumentModelModule<any>>;\n};\n\nexport class PackageDiscoveryService\n implements IDocumentModelLoader, IPackageDiscoveryService\n{\n #packageManager: BrowserPackageManager;\n #registryClient: RegistryClient;\n #mode: DiscoveryMode;\n\n #deferred = new Map<string, DeferredEntry>();\n #pending = new Map<string, PendingInstallation>();\n #pendingMemo: PendingInstallation[] = [];\n #pendingSubscribers = new Set<() => void>();\n #failed = new Map<string, FailedInstallation>();\n #failedMemo: FailedInstallation[] = [];\n #failedSubscribers = new Set<() => void>();\n #eventSubscribers = new Set<DiscoveryEventListener>();\n #dismissedStorage: BrowserLocalStorage<boolean>;\n #discoveredTypes = new Map<string, string[]>();\n\n constructor(\n packageManager: BrowserPackageManager,\n registryClient: RegistryClient,\n options: { mode: DiscoveryMode; storageKey: string },\n ) {\n this.#packageManager = packageManager;\n this.#registryClient = registryClient;\n this.#mode = options.mode;\n this.#dismissedStorage = new BrowserLocalStorage<boolean>(\n options.storageKey + \":PH_DISMISSED_TYPES\",\n );\n }\n\n load(documentType: string): Promise<DocumentModelModule<any>> {\n const existing = this.#findModuleInLoadedPackages(documentType);\n if (existing) {\n this.#clearFailed(documentType);\n return Promise.resolve(existing);\n }\n\n if (this.#dismissedStorage.has(documentType)) {\n this.#recordFailure(documentType, \"dismissed\", [], null);\n return Promise.reject(\n new Error(`Document type \"${documentType}\" was dismissed`),\n );\n }\n\n const tracked = this.#deferred.get(documentType);\n if (tracked) {\n return tracked.promise;\n }\n\n return this.#discover(documentType);\n }\n\n promptInstallation(documentType: string): void {\n const packageNames = this.#discoveredTypes.get(documentType);\n if (!packageNames) return;\n if (this.#pending.has(documentType)) return;\n\n this.#discoveredTypes.delete(documentType);\n this.#addToPending(documentType, packageNames);\n }\n\n async approveInstallation(packageName: string): Promise<void> {\n const affectedTypes = this.#findTypesByPackage(packageName);\n if (affectedTypes.length === 0) return;\n\n const result = await this.#packageManager.addPackage(packageName);\n if (result.type === \"error\") {\n this.#emitEvent({\n type: \"installation-failed\",\n packageName,\n error: result.error,\n });\n for (const documentType of affectedTypes) {\n const entry = this.#deferred.get(documentType);\n if (entry) {\n entry.reject(result.error);\n this.#deferred.delete(documentType);\n this.#pending.delete(documentType);\n }\n this.#recordFailure(\n documentType,\n \"install-failed\",\n [packageName],\n result.error,\n );\n }\n this.#notifyPendingChanged();\n return;\n }\n\n this.#emitEvent({\n type: \"installation-approved\",\n packageName,\n documentTypes: affectedTypes,\n });\n\n for (const documentType of affectedTypes) {\n const entry = this.#deferred.get(documentType);\n if (!entry) continue;\n\n const module = this.#findModuleInLoadedPackages(documentType);\n if (module) {\n entry.resolve(module);\n this.#clearFailed(documentType);\n } else {\n const error = new Error(\n `Package \"${packageName}\" installed but module for \"${documentType}\" not found`,\n );\n entry.reject(error);\n this.#recordFailure(\n documentType,\n \"install-failed\",\n [packageName],\n error,\n );\n }\n this.#deferred.delete(documentType);\n this.#pending.delete(documentType);\n }\n this.#notifyPendingChanged();\n }\n\n dismissInstallation(packageName: string): void {\n const affectedTypes = this.#findTypesByPackage(packageName);\n if (affectedTypes.length === 0) return;\n\n for (const documentType of affectedTypes) {\n this.#dismissedStorage.set(documentType, true);\n const entry = this.#deferred.get(documentType);\n if (entry) {\n entry.reject(\n new Error(`Document type \"${documentType}\" was dismissed`),\n );\n }\n this.#deferred.delete(documentType);\n this.#pending.delete(documentType);\n this.#discoveredTypes.delete(documentType);\n this.#recordFailure(documentType, \"dismissed\", [packageName], null);\n }\n\n this.#emitEvent({\n type: \"installation-dismissed\",\n packageName,\n documentTypes: affectedTypes,\n });\n this.#notifyPendingChanged();\n }\n\n getPendingInstallations(): PendingInstallation[] {\n return this.#pendingMemo;\n }\n\n subscribePending(listener: () => void): () => void {\n this.#pendingSubscribers.add(listener);\n return () => {\n this.#pendingSubscribers.delete(listener);\n };\n }\n\n getFailedInstallations(): FailedInstallation[] {\n return this.#failedMemo;\n }\n\n subscribeFailed(listener: () => void): () => void {\n this.#failedSubscribers.add(listener);\n return () => {\n this.#failedSubscribers.delete(listener);\n };\n }\n\n subscribeEvents(listener: DiscoveryEventListener): () => void {\n this.#eventSubscribers.add(listener);\n return () => {\n this.#eventSubscribers.delete(listener);\n };\n }\n\n async retryInstallation(documentType: string): Promise<void> {\n this.#dismissedStorage.delete(documentType);\n this.#clearFailed(documentType);\n try {\n await this.#discover(documentType);\n } catch {\n // failure has been recorded via #recordFailure; swallow so the\n // caller (UI button) doesn't have to handle the rejection\n }\n }\n\n async #discover(documentType: string): Promise<DocumentModelModule<any>> {\n let packageNames: string[];\n try {\n packageNames =\n await this.#registryClient.getPackagesByDocumentType(documentType);\n } catch (error) {\n const normalized =\n error instanceof Error ? error : new Error(String(error));\n this.#emitEvent({\n type: \"registry-query-failed\",\n documentType,\n error: normalized,\n });\n this.#recordFailure(documentType, \"registry-error\", [], normalized);\n return Promise.reject(normalized);\n }\n\n if (packageNames.length === 0) {\n this.#recordFailure(documentType, \"not-in-registry\", [], null);\n return Promise.reject(\n new Error(`No packages found for document type \"${documentType}\"`),\n );\n }\n\n const entry = this.#createDeferredEntry(documentType, packageNames);\n\n this.#emitEvent({\n type: \"type-discovered\",\n documentType,\n packageNames,\n });\n\n if (this.#mode === \"immediate\") {\n this.#addToPending(documentType, packageNames);\n } else {\n this.#discoveredTypes.set(documentType, packageNames);\n }\n\n return entry.promise;\n }\n\n #createDeferredEntry(\n documentType: string,\n packageNames: string[],\n ): DeferredEntry {\n let resolve!: (module: DocumentModelModule<any>) => void;\n let reject!: (reason: unknown) => void;\n const promise = new Promise<DocumentModelModule<any>>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n const entry: DeferredEntry = { packageNames, resolve, reject, promise };\n this.#deferred.set(documentType, entry);\n return entry;\n }\n\n #addToPending(documentType: string, packageNames: string[]): void {\n const installation: PendingInstallation = { documentType, packageNames };\n this.#pending.set(documentType, installation);\n this.#emitEvent({\n type: \"installation-prompted\",\n documentType,\n packageNames,\n });\n this.#notifyPendingChanged();\n }\n\n #findModuleInLoadedPackages(\n documentType: string,\n ): DocumentModelModule<any> | undefined {\n return this.#packageManager.packages\n .flatMap((p) => p.documentModels)\n .find((m) => m.documentModel.global.id === documentType);\n }\n\n #findTypesByPackage(packageName: string): string[] {\n const types: string[] = [];\n for (const [documentType, entry] of this.#deferred) {\n if (entry.packageNames.includes(packageName)) {\n types.push(documentType);\n }\n }\n return types;\n }\n\n #notifyPendingChanged(): void {\n this.#pendingMemo = Array.from(this.#pending.values());\n for (const listener of this.#pendingSubscribers) {\n listener();\n }\n }\n\n #notifyFailedChanged(): void {\n this.#failedMemo = Array.from(this.#failed.values());\n for (const listener of this.#failedSubscribers) {\n listener();\n }\n }\n\n #recordFailure(\n documentType: string,\n reason: FailedInstallationReason,\n packageNames: string[],\n error: Error | null,\n ): void {\n this.#failed.set(documentType, {\n documentType,\n reason,\n packageNames,\n error,\n });\n this.#emitEvent({ type: \"load-failed\", documentType, reason });\n this.#notifyFailedChanged();\n }\n\n #clearFailed(documentType: string): void {\n if (this.#failed.delete(documentType)) {\n this.#notifyFailedChanged();\n }\n }\n\n #emitEvent(event: DiscoveryEvent): void {\n for (const listener of this.#eventSubscribers) {\n listener(event);\n }\n }\n}\n","import * as common from \"@powerhousedao/powerhouse-vetra-packages\";\nimport commonPkg from \"@powerhousedao/powerhouse-vetra-packages/package.json\" with { type: \"json\" };\nimport type {\n IPackagesListener,\n PackageManagerInstallResult,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n BrowserLocalStorage,\n type IPackageListerUnsubscribe,\n type IPackageManager,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n type DocumentModelLib,\n type DocumentModelModule,\n} from \"@powerhousedao/shared/document-model\";\nimport * as vetra from \"@powerhousedao/vetra\";\nimport vetraPkg from \"@powerhousedao/vetra/package.json\" with { type: \"json\" };\n\ntype PackageMeta = {\n name: string;\n importUrl: string | null;\n stylesheetUrl: string | null;\n version?: string;\n /**\n * Full spec the user asked for (e.g. `@scope/pkg@2.0.0-beta.2`). Kept so a\n * reload re-installs exactly the tag/version originally picked rather than\n * sliding to `latest`. Absent for legacy entries and local packages.\n */\n spec?: string;\n};\n\n/**\n * Strip any `@tag` / `@version` suffix from a package spec, returning the bare\n * package name. Mirrors `parsePackageSpec` on the UI side.\n */\nfunction parseBareName(spec: string): string {\n const trimmed = spec.trim();\n const at = trimmed.startsWith(\"@\")\n ? trimmed.lastIndexOf(\"@\")\n : trimmed.indexOf(\"@\");\n return at > 0 ? trimmed.slice(0, at) : trimmed;\n}\n\ntype PackageWithMeta = PackageMeta & {\n loadedPackage: DocumentModelLib<any>;\n spec?: string;\n};\n\nasync function fetchPackageJsonVersion(\n baseUrl: string,\n): Promise<string | undefined> {\n try {\n const res = await fetch(baseUrl);\n if (!res.ok) return undefined;\n const pkg = (await res.json()) as { version?: unknown };\n return typeof pkg.version === \"string\" ? pkg.version : undefined;\n } catch {\n return undefined;\n }\n}\n\nconst LOCAL_PACKAGE_NAME = \"Local\" as const;\n\nexport class BrowserPackageManager implements IPackageManager {\n registryUrl: string | null;\n #storage: BrowserLocalStorage<PackageMeta>;\n #packages: Map<string, DocumentModelLib<any>> = new Map();\n #subscribers = new Set<IPackagesListener>();\n #packagesMemo: DocumentModelLib<any>[] = [];\n #stylesheets: Map<string, HTMLStyleElement> = new Map();\n #localPackage: DocumentModelLib<any> | undefined;\n\n #cdnUrl: string | null;\n #localPackageVersion: string | undefined;\n #localPackageNames: Set<string> = new Set([LOCAL_PACKAGE_NAME]);\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(\n localPackage?: DocumentModelLib<any>,\n localPackageVersion?: string,\n ) {\n this.addLocalPackage(common.manifest.name, common, commonPkg.version);\n this.addLocalPackage(vetra.manifest.name, vetra, vetraPkg.version);\n if (localPackage) {\n this.updateLocalPackage(localPackage, localPackageVersion);\n }\n for (const packageName of this.#storage.keys()) {\n // Re-hydrate with the originally-requested spec so a tag/version pick\n // sticks across reloads. Fall back to the bare key for legacy entries\n // (pre-spec) and for entries that never had a tag.\n const existingMeta = this.#storage.get(packageName);\n const specForReload = existingMeta?.spec ?? packageName;\n console.debug(\n `[Connect][PackageManager] Rehydrating \"${packageName}\" via spec \"${specForReload}\"`,\n );\n const result = await this.addPackage(specForReload);\n // Previously-installed package that no longer resolves (version\n // withdrawn from npm, registry moved, etc.) would otherwise\n // 404-toast on every boot forever. Drop it from persistent storage\n // so the failure is one-shot instead of sticky.\n if (result.type === \"error\") {\n this.#storage.delete(packageName);\n }\n }\n }\n\n addLocalPackage(\n name: string,\n loadedPackage: DocumentModelLib<any>,\n version?: string,\n ) {\n this.#localPackageNames.add(name);\n this.#registerPackage({\n name,\n importUrl: null,\n stylesheetUrl: null,\n loadedPackage,\n version,\n });\n }\n\n updateLocalPackage(pkg: DocumentModelLib<any>, version?: string) {\n console.debug(\"Updating local package:\", pkg);\n this.#localPackage = pkg;\n this.#registerPackage({\n name: LOCAL_PACKAGE_NAME,\n stylesheetUrl: null,\n importUrl: null,\n loadedPackage: pkg,\n });\n if (version) {\n this.#localPackageVersion = version;\n this.#notifyPackagesChanged();\n return;\n }\n fetchPackageJsonVersion(\"/package.json\")\n .then((fetchedVersion) => {\n this.#localPackageVersion = fetchedVersion;\n if (fetchedVersion) this.#notifyPackagesChanged();\n })\n .catch(() => {});\n }\n\n get packages() {\n return this.#packagesMemo;\n }\n\n get cdnUrl(): string | null {\n return this.#cdnUrl;\n }\n\n getPackageSource(packageName: string) {\n // check vs packages registered as local (Common, Vetra, bundled packages...)\n if (this.#localPackageNames.has(packageName)) {\n return \"common\";\n }\n // check if the package has the same name as the local project\n if (packageName === this.#localPackage?.manifest.name) return \"project\";\n const packageMeta = this.#storage.get(packageName);\n // if meta does not exist the package is not installed\n if (!packageMeta) return null;\n // if imported from node_modules then the package is installed locally\n if (packageMeta.importUrl === `/node_modules/${packageName}`)\n return \"local-install\";\n // all other import urls point to a registry\n return \"registry-install\";\n }\n\n /**\n * Return the registry-installed packages keyed by their storage name (which\n * is the registry spec, e.g. \"@powerhousedao/clint-common\"), with the\n * installed version when known. Excludes bundled (common) packages, the\n * local project package, and packages resolved out of `/node_modules/`.\n */\n getRegistryPackages(): { name: string; version: string | undefined }[] {\n const out: { name: string; version: string | undefined }[] = [];\n for (const [name, meta] of this.#storage) {\n if (this.#localPackageNames.has(name)) continue;\n if (name === LOCAL_PACKAGE_NAME) continue;\n if (meta.importUrl === `/node_modules/${name}`) continue;\n out.push({ name, version: meta.version });\n }\n return out;\n }\n\n getPackageVersion(packageName: string): string | undefined {\n if (packageName === this.#localPackage?.manifest.name) {\n return this.#localPackageVersion;\n }\n return this.#storage.get(packageName)?.version;\n }\n\n async addPackage(packageSpec: string): Promise<PackageManagerInstallResult> {\n // `packageSpec` may include a `@tag` / `@version` suffix (e.g. user picked\n // a specific version in the package manager UI, or re-hydrated on reload\n // from the persisted spec). We always register/look up by the bare name so\n // status tracking, version lookups, and uninstall all go through a single\n // canonical key. The spec itself is kept on the meta so reloads re-fetch\n // the same tag.\n const bareName = parseBareName(packageSpec);\n const hasTagOrVersion = bareName !== packageSpec;\n console.debug(\n `[Connect][PackageManager] addPackage spec=\"${packageSpec}\" bareName=\"${bareName}\"`,\n );\n\n const existingPackage = this.#packages.get(bareName);\n if (existingPackage) {\n const requestedVersion = hasTagOrVersion\n ? packageSpec.slice(bareName.length + 1)\n : undefined;\n const currentVersion = this.#storage.get(bareName)?.version;\n const isLocal = this.#localPackageNames.has(bareName);\n const sameVersion =\n !requestedVersion ||\n !currentVersion ||\n requestedVersion === currentVersion;\n if (isLocal || sameVersion) {\n console.debug(\n `[Connect][PackageManager] \"${bareName}\" already loaded; skipping re-fetch`,\n );\n return {\n type: \"success\",\n package: existingPackage,\n };\n }\n console.debug(\n `[Connect][PackageManager] \"${bareName}\" version bump ${currentVersion} → ${requestedVersion}; refetching`,\n );\n }\n try {\n const packageWithMeta = await this.#loadPackage(packageSpec);\n // `#loadPackage*` set `name` to whatever spec it built the URL from.\n // Canonicalize to the bare name for the map/storage keys, and stash the\n // original spec separately so reloads re-use it.\n packageWithMeta.name = bareName;\n if (hasTagOrVersion) {\n packageWithMeta.spec = packageSpec;\n }\n // Swap stylesheets only once the new package is in hand. If `#loadPackage`\n // throws above, the old stylesheet stays mounted and the UI keeps\n // rendering the previous version instead of unstyled markup.\n if (existingPackage) {\n this.#unmountStylesheet(bareName);\n }\n this.#registerPackage(packageWithMeta);\n\n return {\n type: \"success\",\n package: packageWithMeta.loadedPackage,\n };\n } catch (error) {\n const normalized =\n error instanceof Error ? error : new Error(String(error));\n console.error(\n `[Connect][PackageManager] Failed to install package \"${packageSpec}\": ${normalized.message}`,\n normalized,\n );\n return {\n type: \"error\",\n error: normalized,\n };\n }\n }\n\n async addPackages(packageNames: string[]) {\n const results: PackageManagerInstallResult[] = [];\n for (const packageName of packageNames) {\n const result = await this.addPackage(packageName);\n results.push(result);\n }\n return results;\n }\n\n removePackage(name: string) {\n this.#packages.delete(name);\n this.#storage.delete(name);\n this.#unmountStylesheet(name);\n this.#notifyPackagesChanged();\n }\n\n subscribe(handler: IPackagesListener): IPackageListerUnsubscribe {\n this.#subscribers.add(handler);\n return () => {\n this.#subscribers.delete(handler);\n };\n }\n\n load(documentType: string): Promise<DocumentModelModule<any>> {\n const documentModelModule = Array.from(\n this.#packages.values().flatMap((p) => p.documentModels),\n ).find((m) => m.documentModel.global.id === documentType);\n\n if (documentModelModule) return Promise.resolve(documentModelModule);\n return Promise.reject(new Error(\"Model not available\"));\n }\n\n async #loadPackageFromNodeModules(name: string): Promise<PackageWithMeta> {\n const importUrl = `/node_modules/${name}/browser/index.js`;\n const stylesheetUrl = `/node_modules/${name}/style.css`;\n\n const packageWithMeta = await this.#importPackage({\n name,\n importUrl,\n stylesheetUrl,\n });\n packageWithMeta.version = await fetchPackageJsonVersion(\n `/node_modules/${name}/package.json`,\n );\n\n return packageWithMeta;\n }\n\n async #loadPackageFromRegistry(name: string): Promise<PackageWithMeta> {\n const importUrl = `${this.#cdnUrl}/${name}/browser/index.js`;\n const stylesheetUrl = `${this.#cdnUrl}/${name}/style.css`;\n const packageWithMeta = await this.#importPackage({\n name,\n importUrl,\n stylesheetUrl,\n });\n packageWithMeta.version = await fetchPackageJsonVersion(\n `${this.#cdnUrl}/${name}/package.json`,\n );\n\n return packageWithMeta;\n }\n\n async #importPackage(packageMeta: PackageMeta): Promise<PackageWithMeta> {\n const { name, importUrl, stylesheetUrl } = packageMeta;\n if (!importUrl) {\n throw new Error(`Import url not defined for package \"${name}\".`);\n }\n\n const loadedPackage = (await import(\n /* @vite-ignore */ importUrl\n )) as DocumentModelLib<any>;\n\n return {\n name,\n loadedPackage,\n importUrl,\n stylesheetUrl,\n };\n }\n\n async #loadPackage(packageName: string): Promise<PackageWithMeta> {\n if (this.#localPackageNames.has(packageName)) {\n throw new Error(\n `Package \"${packageName}\" is a local package and cannot be loaded dynamically.`,\n );\n }\n\n // only attemp to load from node_modules in dev mode\n if (!import.meta.env.PROD) {\n try {\n const packageWithMeta =\n await this.#loadPackageFromNodeModules(packageName);\n return packageWithMeta;\n } catch (error) {\n console.warn(\n `Failed to load package \"${packageName}\" from node_modules:`,\n error,\n );\n }\n }\n\n if (!this.registryUrl) {\n throw new Error(\"Registry url not defined.\");\n }\n\n return await this.#loadPackageFromRegistry(packageName);\n }\n\n #registerPackage(packageWithMeta: PackageWithMeta) {\n const { name, loadedPackage, importUrl, stylesheetUrl, version, spec } =\n packageWithMeta;\n\n if (stylesheetUrl !== null) {\n this.#mountStylesheet(name, stylesheetUrl);\n }\n this.#packages.set(name, loadedPackage);\n this.#storage.set(name, {\n name,\n importUrl,\n stylesheetUrl,\n version,\n ...(spec ? { spec } : {}),\n });\n console.debug(\n `[Connect][PackageManager] Registered \"${name}\" (version=${version ?? \"?\"}, spec=${spec ?? \"—\"})`,\n );\n\n this.#notifyPackagesChanged();\n }\n\n #mountStylesheet(name: string, href: string) {\n const existing = this.#stylesheets.get(name);\n if (existing) return existing;\n\n const style = document.createElement(\"style\");\n style.textContent = `@import url(\"${href}\") layer(external-packages);`;\n document.head.appendChild(style);\n\n this.#stylesheets.set(name, style);\n }\n\n #unmountStylesheet(name: string): void {\n const style = this.#stylesheets.get(name);\n if (!style) return;\n\n style.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","import type { PGliteWorker } from \"@electric-sql/pglite/worker\";\nimport { createRelationalDb } from \"@powerhousedao/shared/processors\";\nimport { Kysely } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\nimport {\n detectRelationalPgMajor,\n resolvePgMajorForRuntime,\n type SupportedPgMajor,\n} from \"./utils/pglite-runtime.js\";\n\nasync function createPGliteWorkerForMajor(\n major: SupportedPgMajor,\n): Promise<PGliteWorker> {\n if (major === 16) {\n const [legacyWorker, legacyLive] = await Promise.all([\n import(\"pglite-legacy-02/worker\"),\n import(\"pglite-legacy-02/live\"),\n ]);\n const worker = new Worker(\n new URL(\"./pglite.worker.legacy.js\", import.meta.url),\n { type: \"module\" },\n );\n return legacyWorker.PGliteWorker.create(worker, {\n extensions: { live: legacyLive.live },\n }) as unknown as PGliteWorker;\n }\n const [{ PGliteWorker }, { live }] = await Promise.all([\n import(\"@electric-sql/pglite/worker\"),\n import(\"@electric-sql/pglite/live\"),\n ]);\n const worker = new Worker(new URL(\"./pglite.worker.js\", import.meta.url), {\n type: \"module\",\n });\n return PGliteWorker.create(worker, { extensions: { live } });\n}\n\nexport async function getDb() {\n const detected = await detectRelationalPgMajor();\n const major = resolvePgMajorForRuntime(detected);\n if (major !== 17) {\n console.warn(\n `[reactor] Relational worker is opening legacy Postgres ${major} data dir. Migrate to PG17 from the banner or the Inspector → Debug tab.`,\n );\n }\n\n const pgLite = await createPGliteWorkerForMajor(major);\n\n const kysely = new Kysely({\n dialect: new PGliteDialect(pgLite),\n });\n\n const relationalDb = createRelationalDb(kysely);\n\n return { pgLite, relationalDb };\n}\n","import { createAnalyticsStore } from \"@powerhousedao/reactor-browser\";\nimport type { Action } from \"@powerhousedao/shared/document-model\";\nimport { type IProcessorHostModule } from \"@powerhousedao/shared/processors\";\nimport { getDb } from \"../pglite.db.js\";\n\nexport interface IReactorDispatch {\n executeAsync(\n documentIdentifier: string,\n branch: string,\n actions: Action[],\n signal?: AbortSignal,\n ): Promise<{ id: string; status: string }>;\n}\n\ninterface INamedReadModel {\n readonly name: string;\n}\n\nexport async function createProcessorHostModule(\n reactorClient: IReactorDispatch,\n readModels: INamedReadModel[],\n): Promise<IProcessorHostModule | undefined> {\n try {\n const { pgLite, relationalDb } = await getDb();\n const { store: analyticsStore } = await createAnalyticsStore({\n pgLite,\n });\n const processorApp = \"connect\" as const;\n return {\n relationalDb,\n analyticsStore,\n processorApp,\n dispatch: {\n async execute(docId, branch, actions, signal) {\n const jobInfo = await reactorClient.executeAsync(\n docId,\n branch,\n actions,\n signal,\n );\n return { id: jobInfo.id, status: jobInfo.status };\n },\n },\n getReadModel<T>(name: string): T {\n const model = readModels.find((m) => m.name === name);\n if (!model) {\n throw new Error(`Read model \"${name}\" not found`);\n }\n return model as unknown as T;\n },\n };\n } catch (error) {\n console.error(`Failed to initialize processor host module:`);\n console.error(error);\n }\n}\n","import { phGlobalConfigFromEnv } from \"@powerhousedao/connect/config\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport {\n addDefaultDrivesForNewReactor,\n createBrowserReactor,\n getDefaultDrivesFromEnv,\n} from \"@powerhousedao/connect/utils\";\nimport {\n addPHEventHandlers,\n addRemoteDrive,\n DocumentCache,\n DocumentChangeType,\n extractDriveSlugFromPath,\n extractNodeSlugFromPath,\n getDrives,\n login,\n refreshReactorDataClient,\n RegistryClient,\n setDefaultPHGlobalConfig,\n setDocumentCache,\n setDrives,\n setFeatures,\n setPackageDiscoveryService,\n setPHToast,\n setReactorClient,\n setReactorClientModule,\n setRenown,\n setSelectedDrive,\n setSelectedNode,\n setVetraPackageManager,\n type IPackageManager,\n type PHToastFn,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n BrowserKeyStorage,\n RenownBuilder,\n RenownCryptoBuilder,\n} from \"@renown/sdk\";\nimport {\n logger,\n type DocumentModelLib,\n type UpgradeManifest,\n} from \"document-model\";\nimport { initFeatureFlags } from \"../feature-flags.js\";\nimport { NoRegistryDiscoveryService } from \"../no-registry-discovery.js\";\nimport { PackageDiscoveryService } from \"../package-discovery.js\";\nimport { BrowserPackageManager } from \"../package-manager.js\";\nimport { loadPackagesConfig } from \"../packages.config.js\";\nimport { createProcessorHostModule } from \"./processor-host-module.js\";\n\n/**\n * Subscribe to the `/__packages` SSE channel exposed by ph-clint's\n * static-mode `connect-server.js`. On each `packages-changed` event the\n * server sends the full live list; we diff against what the packageManager\n * already has loaded and call `addPackage`/`removePackage` to converge.\n *\n * Best-effort — silently no-ops when the SSE endpoint doesn't exist\n * (e.g. running under vite dev, or hosted somewhere without this protocol).\n */\nfunction subscribeToPackagesChannel(packageManager: IPackageManager): void {\n if (typeof window === \"undefined\" || typeof EventSource === \"undefined\") {\n return;\n }\n let source: EventSource;\n try {\n source = new EventSource(\"/__packages\");\n } catch (err) {\n console.debug(\"[Connect] /__packages subscribe failed:\", err);\n return;\n }\n let firstEvent = true;\n source.addEventListener(\"packages-changed\", (event) => {\n try {\n const payload = JSON.parse((event as MessageEvent<string>).data) as {\n packages?: unknown;\n };\n if (!Array.isArray(payload.packages)) return;\n const next = payload.packages.filter(\n (p): p is string => typeof p === \"string\",\n );\n // Split each incoming spec into (bareName, version). The server may\n // send either bare names (\"@scope/pkg\") or version-qualified specs\n // (\"@scope/pkg@1.2.3\"). parseBareName-style logic: for scoped specs\n // the first `@` belongs to the scope, so version starts after the\n // last `@` only when that `@` is past index 0.\n const parseBare = (\n spec: string,\n ): { bareName: string; version?: string } => {\n const at = spec.startsWith(\"@\")\n ? spec.lastIndexOf(\"@\")\n : spec.indexOf(\"@\");\n if (at > 0) {\n return { bareName: spec.slice(0, at), version: spec.slice(at + 1) };\n }\n return { bareName: spec };\n };\n\n // Diff against the registry-tracked subset only. Bundled \"common\"\n // packages and the project's local package never appear in the\n // server's list and removing them on every event would wipe the\n // drive editors and break the AddDrive modal.\n const currentByName = new Map(\n packageManager\n .getRegistryPackages()\n .map(({ name, version }) => [name, version]),\n );\n const nextByName = new Map<string, string | undefined>();\n for (const spec of next) {\n const { bareName, version } = parseBare(spec);\n nextByName.set(bareName, version);\n }\n\n const isFirst = firstEvent;\n firstEvent = false;\n\n for (const name of currentByName.keys()) {\n if (!nextByName.has(name)) {\n packageManager.removePackage(name);\n if (!isFirst) {\n toast(`Removed package ${name}`, { type: \"connect-deleted\" });\n }\n }\n }\n for (const spec of next) {\n const { bareName, version } = parseBare(spec);\n const currentVersion = currentByName.get(bareName);\n const isKnown = currentByName.has(bareName);\n // Skip when the package is already present at the same version (or\n // when no version info is available on either side to compare).\n if (\n isKnown &&\n (!version || !currentVersion || version === currentVersion)\n ) {\n continue;\n }\n const isUpdate = isKnown;\n Promise.resolve(packageManager.addPackage(spec)).then(\n (result) => {\n if (result.type === \"error\") {\n console.error(\n `[Connect] /__packages addPackage(${spec}) failed:`,\n result.error,\n );\n return;\n }\n if (isFirst) return;\n const name = result.package.manifest.name;\n toast(\n isUpdate\n ? `Updated package ${name}`\n : `Installed package ${name}`,\n { type: \"connect-success\" },\n );\n },\n (err: unknown) => {\n console.error(\n `[Connect] /__packages addPackage(${spec}) threw:`,\n err,\n );\n },\n );\n }\n } catch (err) {\n console.error(\"[Connect] /__packages event parse failed:\", err);\n }\n });\n source.addEventListener(\"error\", () => {\n // EventSource auto-reconnects; nothing to do.\n });\n}\n\nexport async function clearReactorStorage() {\n await window.ph?.reactorClientModule?.pg?.close();\n\n // Dropping tables inside an existing PGlite instance is unreliable with\n // `relaxedDurability: true` followed by an immediate page reload — pending\n // IDB writes can be lost. Deleting the underlying database outright sidesteps\n // flush-timing; the next startup re-creates and re-migrates from scratch.\n const dbs = await indexedDB.databases();\n const targets = dbs\n .map((d) => d.name)\n .filter(\n (n): n is string =>\n !!n && !n.startsWith(\"ph-pglite-backup::\") && /pglite|reactor/i.test(n),\n );\n\n await Promise.all(\n targets.map(\n (name) =>\n new Promise<void>((resolve) => {\n const req = indexedDB.deleteDatabase(name);\n req.onsuccess = req.onerror = req.onblocked = () => resolve();\n }),\n ),\n );\n}\n\nexport async function createReactor(localPackage?: DocumentModelLib) {\n if (!window.ph) {\n window.ph = {};\n }\n if (window.ph.loading) return;\n\n window.ph.loading = true;\n\n // add window event handlers for updates\n addPHEventHandlers();\n\n // register toast function for use in editor components\n setPHToast(toast as PHToastFn);\n\n // initialize feature flags\n const features = await initFeatureFlags();\n\n logger.info(\n \"Features: @features\",\n JSON.stringify(Object.fromEntries(features), null, 2),\n );\n\n // initialize renown crypto\n const keyPairStorage = await BrowserKeyStorage.create();\n const renownCrypto = await new RenownCryptoBuilder()\n .withKeyPairStorage(keyPairStorage)\n .build();\n\n // initialize Renown\n const renown = await new RenownBuilder(\"connect\", {\n basename: phGlobalConfigFromEnv.routerBasename,\n baseUrl: phGlobalConfigFromEnv.renownUrl,\n })\n .withCrypto(renownCrypto)\n .build();\n\n // load packages list from ph-packages.json (replaceable post-build)\n const packagesConfig = await loadPackagesConfig();\n\n // initialize package manager\n const packageManager = new BrowserPackageManager(\n phGlobalConfigFromEnv.routerBasename ?? \"\",\n packagesConfig.registryUrl ?? null,\n );\n setVetraPackageManager(packageManager);\n await packageManager.init(localPackage, packagesConfig.localPackage?.version);\n // Register any packages marked as provider: \"local\" in powerhouse.config.json\n // that the vite plugin bundled into this build. The virtual module is only\n // emitted when `phBundledPackagesPlugin` is registered (ph-cli's Connect\n // flow); running `vite dev` against apps/connect's own config has no\n // bundled packages, so a resolution failure here is expected. The\n // indirection + @vite-ignore also keeps Vite's dep scanner from treating\n // the specifier as a real npm package to pre-bundle.\n try {\n const bundledPackagesModule = \"ph-bundled-packages-virtual\";\n const { default: registerBundledPackages } = (await import(\n /* @vite-ignore */ bundledPackagesModule\n )) as { default: (pm: IPackageManager) => void };\n registerBundledPackages(packageManager);\n } catch {\n // no bundled packages in this build\n }\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 // Subscribe to the static-mode `/__packages` SSE channel so live publishes\n // (e.g. ph-clint's publish-reload trigger pushing a new list) flow into the\n // running tab without a page reload. The channel only exists in static\n // hosting; failures are silently ignored when running in vite dev or any\n // host that doesn't speak this protocol.\n subscribeToPackagesChannel(packageManager);\n\n // get document models to set in the reactor (all versions)\n const documentModelModules = packageManager.packages\n .flatMap((pkg) => pkg.documentModels)\n .filter(\n (module, index, modules) =>\n // deduplicate by documentType and version\n modules.findIndex(\n (m) =>\n m.documentModel.global.id === module.documentModel.global.id &&\n m.version === module.version,\n ) === index,\n );\n\n // get upgrade manifests from packages\n const upgradeManifests = packageManager.packages\n .flatMap((pkg) => pkg.upgradeManifests)\n .filter(\n (manifest, index, manifests) =>\n // deduplicate by documentType and version\n manifest !== undefined &&\n manifests.findIndex(\n (m) => m && m.documentType === manifest.documentType,\n ) === index,\n ) as UpgradeManifest<readonly number[]>[];\n\n // initialize package discovery service for auto-installing unknown document types\n const discoveryService =\n packageManager.cdnUrl !== null\n ? new PackageDiscoveryService(\n packageManager,\n new RegistryClient(packageManager.cdnUrl),\n {\n mode: \"immediate\",\n storageKey: phGlobalConfigFromEnv.routerBasename ?? \"\",\n },\n )\n : new NoRegistryDiscoveryService(packageManager);\n\n setPackageDiscoveryService(discoveryService);\n\n // create reactor v2 with all versions and upgrade manifests\n const reactorClientModule = await createBrowserReactor(\n documentModelModules,\n upgradeManifests,\n renown,\n discoveryService,\n );\n\n // get the drives from the reactor\n const drives = await getDrives(reactorClientModule.client);\n\n // set the selected drive and node from the path\n const path = window.location.pathname;\n const driveSlug = extractDriveSlugFromPath(path);\n const nodeSlug = extractNodeSlugFromPath(path);\n\n // initialize user from URL parameter\n const didFromUrl = getDidFromUrl();\n await login(didFromUrl, renown);\n\n const documentCache = new DocumentCache(reactorClientModule.client);\n\n // dispatch the events to set the values in the window object\n setDefaultPHGlobalConfig(phGlobalConfigFromEnv);\n setReactorClientModule(reactorClientModule);\n setReactorClient(reactorClientModule.client);\n setDocumentCache(documentCache);\n setRenown(renown);\n setDrives(drives);\n setFeatures(features);\n\n // When the URL pins a drive slug, default drives and any URL-supplied\n // remote drive must be materialized before setSelectedDrive runs —\n // otherwise the slug is unknown and the URL gets rewritten to \"/\".\n const driveResolutionRequired = Boolean(driveSlug);\n\n const defaultDrivesConfig = getDefaultDrivesFromEnv();\n if (defaultDrivesConfig.length > 0) {\n await addDefaultDrivesForNewReactor(\n defaultDrivesConfig,\n driveResolutionRequired\n ? { awaitInitialSync: true, initialSyncTimeoutMs: 15_000 }\n : undefined,\n );\n }\n\n const remoteUrl = getDriveUrl();\n if (remoteUrl) {\n try {\n await addRemoteDrive(remoteUrl, undefined, {\n awaitInitialSync: driveResolutionRequired,\n initialSyncTimeoutMs: 15_000,\n });\n } catch (error) {\n console.error(`Failed to add remote drive from ${remoteUrl}:`, error);\n }\n }\n\n if (driveResolutionRequired) {\n await refreshReactorDataClient(reactorClientModule.client);\n }\n\n setSelectedDrive(driveSlug);\n setSelectedNode(nodeSlug);\n\n // Subscribe via ReactorClient interface\n const reactorClient = reactorClientModule.client;\n reactorClient.subscribe({ type: \"powerhouse/document-drive\" }, (event) => {\n logger.verbose(\"ReactorClient subscription event: @event\", event);\n refreshReactorDataClient(reactorClientModule.client).catch((e) =>\n logger.error(\"@error\", e),\n );\n });\n\n // Redirect when a currently-viewed document or drive is deleted remotely\n reactorClient.subscribe({}, (event) => {\n if (event.type !== DocumentChangeType.Deleted) return;\n const deletedId = event.context?.childId;\n if (!deletedId) return;\n\n const selectedDriveId = window.ph?.selectedDriveId;\n const selectedNodeId = window.ph?.selectedNodeId;\n\n if (selectedDriveId && deletedId === selectedDriveId) {\n setSelectedDrive(undefined);\n toast(\"The drive you were viewing has been deleted\");\n return;\n }\n\n if (selectedNodeId && deletedId === selectedNodeId) {\n setSelectedNode(undefined);\n toast(\"The document you were editing has been deleted\");\n }\n });\n\n // Refresh from ReactorClient to pick up any synced drives\n await refreshReactorDataClient(reactorClientModule.client);\n\n // Setup processor factories for packages that have them\n const packagesWithProcessorFactories = packageManager.packages.filter(\n (pkg) => pkg.processorFactory !== undefined,\n );\n\n if (packagesWithProcessorFactories.length > 0) {\n const readModels =\n reactorClientModule.reactorModule?.readModelCoordinator?.readModels ?? [];\n const processorHostModule = await createProcessorHostModule(\n reactorClientModule.client,\n readModels,\n );\n if (processorHostModule !== undefined) {\n await Promise.all(\n packagesWithProcessorFactories.map(async (pkg) => {\n const { manifest, processorFactory } = pkg;\n const name = manifest.name;\n const id = manifest.name;\n const version = packageManager.getPackageVersion(name);\n const label = version ? `${name}@${version}` : name;\n logger.info(\"Loading processor factory: @label\", label);\n try {\n const factory = await processorFactory?.(processorHostModule);\n if (!factory) return;\n await reactorClientModule.reactorModule?.processorManager.registerFactory(\n id,\n factory,\n );\n } catch (error) {\n logger.error(`Error registering processor: @label`, label);\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"],"names":["#packageManager","#findModuleInLoadedPackages","#clearFailed","#recordFailure","#failedMemo","#failedSubscribers","#eventSubscribers","#failed","#emitEvent","#notifyFailedChanged","#packageManager","#registryClient","#mode","#dismissedStorage","#findModuleInLoadedPackages","#clearFailed","#recordFailure","#deferred","#discover","#discoveredTypes","#pending","#addToPending","#findTypesByPackage","#emitEvent","#notifyPendingChanged","#pendingMemo","#pendingSubscribers","#failedMemo","#failedSubscribers","#eventSubscribers","#createDeferredEntry","#failed","#notifyFailedChanged","#storage","#cdnUrl","#toCdnUrl","#localPackageNames","#registerPackage","#localPackage","#localPackageVersion","#notifyPackagesChanged","#packagesMemo","#packages","#loadPackage","#unmountStylesheet","#subscribers","#loadPackageFromNodeModules","#importPackage","#loadPackageFromRegistry","#mountStylesheet","#stylesheets"],"mappings":"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","debug_id":"9e491f10-59f4-5003-b829-42865399276c"}
|