@powerhousedao/connect 6.2.3-dev.25 → 6.2.3-dev.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/{ClearStorageModal-InfiThmU.js → ClearStorageModal-_GRaYbAp.js} +4 -4
  2. package/dist/{ClearStorageModal-InfiThmU.js.map → ClearStorageModal-_GRaYbAp.js.map} +1 -1
  3. package/dist/{DebugSettingsModal-DGB3wq4y.js → DebugSettingsModal-DCRVefgf.js} +4 -4
  4. package/dist/{DebugSettingsModal-DGB3wq4y.js.map → DebugSettingsModal-DCRVefgf.js.map} +1 -1
  5. package/dist/{InspectorModal-CITS4ldi.js → InspectorModal-CDL37XLR.js} +4 -4
  6. package/dist/{InspectorModal-CITS4ldi.js.map → InspectorModal-CDL37XLR.js.map} +1 -1
  7. package/dist/{MissingPackageModal-Dmu03EX7.js → MissingPackageModal-HFUPQMML.js} +4 -4
  8. package/dist/{MissingPackageModal-Dmu03EX7.js.map → MissingPackageModal-HFUPQMML.js.map} +1 -1
  9. package/dist/{OpenFileDocumentsModal-Cym38LC9.js → OpenFileDocumentsModal-Cl0ukgmZ.js} +4 -4
  10. package/dist/{OpenFileDocumentsModal-Cym38LC9.js.map → OpenFileDocumentsModal-Cl0ukgmZ.js.map} +1 -1
  11. package/dist/{SettingsModal-Bqch-LlY.js → SettingsModal-B5GFvIqu.js} +6 -9
  12. package/dist/{SettingsModal-Bqch-LlY.js.map → SettingsModal-B5GFvIqu.js.map} +1 -1
  13. package/dist/{app-loader-k3McuyRp.js → app-loader-BRm3NjUX.js} +10 -10
  14. package/dist/{app-loader-k3McuyRp.js.map → app-loader-BRm3NjUX.js.map} +1 -1
  15. package/dist/app-loader-DyM1CY4K.js +4 -0
  16. package/dist/{build-info-BW_vU5c0.js → build-info-CRzCyE8K.js} +5 -5
  17. package/dist/{build-info-BW_vU5c0.js.map → build-info-CRzCyE8K.js.map} +1 -1
  18. package/dist/{components-i7X_YR6e.js → components-BPwZnhhU.js} +3 -3
  19. package/dist/{load-C1kCFFvW.js → load-DVPS_VqN.js} +5 -5
  20. package/dist/{load-C1kCFFvW.js.map → load-DVPS_VqN.js.map} +1 -1
  21. package/dist/main.js +1 -1
  22. package/dist/{package-manager-Bw4hKQ3s.js → package-manager-BbzIV9aN.js} +13 -3
  23. package/dist/package-manager-BbzIV9aN.js.map +1 -0
  24. package/dist/{reactor-B9xdtXLQ.js → reactor-9ZEESTUg.js} +5 -5
  25. package/dist/{reactor-B9xdtXLQ.js.map → reactor-9ZEESTUg.js.map} +1 -1
  26. package/dist/start-connect.js +1 -1
  27. package/dist/style.css +1 -1
  28. package/dist/{useRegistryPackages-BcKgNT71.js → useRegistryPackages-DuoU75ap.js} +4 -4
  29. package/dist/{useRegistryPackages-BcKgNT71.js.map → useRegistryPackages-DuoU75ap.js.map} +1 -1
  30. package/package.json +15 -18
  31. package/style.css +3 -5
  32. package/dist/app-loader-DDaPW-Ky.js +0 -4
  33. package/dist/package-manager-Bw4hKQ3s.js.map +0 -1
@@ -0,0 +1,4 @@
1
+ import { t as AppLoader } from "./app-loader-BRm3NjUX.js";
2
+ export { AppLoader };
3
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b240df7b-d29a-5a53-9f62-0c815cc6d349")}catch(e){}}();
4
+ //# debugId=b240df7b-d29a-5a53-9f62-0c815cc6d349
@@ -1,12 +1,12 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4a581f4e-84d3-5e99-ba44-93f9894c0c31")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b4167cb3-2628-50be-9f2c-ec4d0fae7db6")}catch(e){}}();
3
3
  import { buildTreeUrl, shortGitSha } from "@powerhousedao/shared";
4
4
  //#region src/utils/build-info.ts
5
5
  function getVersion() {
6
- return "6.2.3-dev.25";
6
+ return "6.2.3-dev.26";
7
7
  }
8
8
  function getGitSha() {
9
- return "e44ced14916428517ebc9e26d9bfb53d1d86cbc0";
9
+ return "25dd1c83d3dd25a0a08cc0e858e91a55da97043e";
10
10
  }
11
11
  /**
12
12
  * Build identity baked in at build time (define PH_CONNECT_BUILD_HASH —
@@ -24,5 +24,5 @@ function getGitUrl() {
24
24
  //#endregion
25
25
  export { shortGitSha as a, getVersion as i, getGitSha as n, getGitUrl as r, getBuildHash as t };
26
26
 
27
- //# sourceMappingURL=build-info-BW_vU5c0.js.map
28
- //# debugId=4a581f4e-84d3-5e99-ba44-93f9894c0c31
27
+ //# sourceMappingURL=build-info-CRzCyE8K.js.map
28
+ //# debugId=b4167cb3-2628-50be-9f2c-ec4d0fae7db6
@@ -1 +1 @@
1
- {"version":3,"file":"build-info-BW_vU5c0.js","sources":["../src/utils/build-info.ts"],"sourcesContent":["import { buildTreeUrl, shortGitSha } from \"@powerhousedao/shared\";\nimport { packageJson } from \"./package-json.js\";\n\nexport { shortGitSha };\n\ndeclare const CONNECT_VERSION: string | undefined;\ndeclare const CONNECT_GIT_SHA: string | undefined;\ndeclare const PH_CONNECT_BUILD_HASH: string | undefined;\n\nexport function getVersion(): string {\n if (typeof CONNECT_VERSION !== \"undefined\") return CONNECT_VERSION;\n return (\n process.env.WORKSPACE_VERSION ??\n process.env.npm_package_version ??\n packageJson.version\n );\n}\n\nexport function getGitSha(): string {\n if (typeof CONNECT_GIT_SHA !== \"undefined\") return CONNECT_GIT_SHA;\n return process.env.WORKSPACE_GIT_SHA ?? \"unknown\";\n}\n\n/**\n * Build identity baked in at build time (define PH_CONNECT_BUILD_HASH —\n * see builder-tools' connectBuildHashPlugin). Identical builds of the same\n * inputs produce the same hash; any change to the deployed content (Connect\n * version, project config, package list, build options) changes it.\n */\nexport function getBuildHash(): string {\n if (typeof PH_CONNECT_BUILD_HASH !== \"undefined\")\n return PH_CONNECT_BUILD_HASH;\n return \"unknown\";\n}\n\nexport function getGitUrl(): string | null {\n return buildTreeUrl(getGitSha());\n}\n"],"names":[],"mappings":";;;;AASA,SAAgB,aAAqB;CACS,OAAA;AAM9C;AAEA,SAAgB,YAAoB;CACU,OAAA;AAE9C;;;;;;;AAQA,SAAgB,eAAuB;CACrC,IAAI,OAAO,0BAA0B,aACnC,OAAO;CACT,OAAO;AACT;AAEA,SAAgB,YAA2B;CACzC,OAAO,aAAa,UAAU,CAAC;AACjC","debug_id":"4a581f4e-84d3-5e99-ba44-93f9894c0c31"}
1
+ {"version":3,"file":"build-info-CRzCyE8K.js","sources":["../src/utils/build-info.ts"],"sourcesContent":["import { buildTreeUrl, shortGitSha } from \"@powerhousedao/shared\";\nimport { packageJson } from \"./package-json.js\";\n\nexport { shortGitSha };\n\ndeclare const CONNECT_VERSION: string | undefined;\ndeclare const CONNECT_GIT_SHA: string | undefined;\ndeclare const PH_CONNECT_BUILD_HASH: string | undefined;\n\nexport function getVersion(): string {\n if (typeof CONNECT_VERSION !== \"undefined\") return CONNECT_VERSION;\n return (\n process.env.WORKSPACE_VERSION ??\n process.env.npm_package_version ??\n packageJson.version\n );\n}\n\nexport function getGitSha(): string {\n if (typeof CONNECT_GIT_SHA !== \"undefined\") return CONNECT_GIT_SHA;\n return process.env.WORKSPACE_GIT_SHA ?? \"unknown\";\n}\n\n/**\n * Build identity baked in at build time (define PH_CONNECT_BUILD_HASH —\n * see builder-tools' connectBuildHashPlugin). Identical builds of the same\n * inputs produce the same hash; any change to the deployed content (Connect\n * version, project config, package list, build options) changes it.\n */\nexport function getBuildHash(): string {\n if (typeof PH_CONNECT_BUILD_HASH !== \"undefined\")\n return PH_CONNECT_BUILD_HASH;\n return \"unknown\";\n}\n\nexport function getGitUrl(): string | null {\n return buildTreeUrl(getGitSha());\n}\n"],"names":[],"mappings":";;;;AASA,SAAgB,aAAqB;CACS,OAAA;AAM9C;AAEA,SAAgB,YAAoB;CACU,OAAA;AAE9C;;;;;;;AAQA,SAAgB,eAAuB;CACrC,IAAI,OAAO,0BAA0B,aACnC,OAAO;CACT,OAAO;AACT;AAEA,SAAgB,YAA2B;CACzC,OAAO,aAAa,UAAU,CAAC;AACjC","debug_id":"b4167cb3-2628-50be-9f2c-ec4d0fae7db6"}
@@ -1,5 +1,5 @@
1
1
  import { t as AppSkeleton } from "./app-skeleton--Me5zlSz.js";
2
- import { _ as EditorLoader, a as Root, b as Analytics, c as DriveIcon, g as AppContainer, i as Router, l as DotsLoader, n as Sidebar, o as Footer, r as SearchBar, s as DocumentEditor, t as AppLoader, u as App, v as DocumentEditorContainer, y as OpenPanel } from "./app-loader-k3McuyRp.js";
2
+ import { _ as EditorLoader, a as Root, b as Analytics, c as DriveIcon, g as AppContainer, i as Router, l as DotsLoader, n as Sidebar, o as Footer, r as SearchBar, s as DocumentEditor, t as AppLoader, u as App, v as DocumentEditorContainer, y as OpenPanel } from "./app-loader-BRm3NjUX.js";
3
3
  export { Analytics, App, AppContainer, AppLoader, AppSkeleton, DocumentEditor, DocumentEditorContainer, DotsLoader, DriveIcon, EditorLoader, Footer, OpenPanel, Root, Router, SearchBar, Sidebar };
4
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="1551b63c-ffbb-518a-a38a-c8343303a708")}catch(e){}}();
5
- //# debugId=1551b63c-ffbb-518a-a38a-c8343303a708
4
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="6f20b3b2-7db9-511e-8566-1b76fbcc76b4")}catch(e){}}();
5
+ //# debugId=6f20b3b2-7db9-511e-8566-1b76fbcc76b4
@@ -1,13 +1,13 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="629b8c84-cb6a-500f-8816-1cc9628789f3")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="f1fb63ce-3d47-5aaf-ae69-e6940c799447")}catch(e){}}();
3
3
  import { r as loadRuntimeConfig, t as applyConnectBranding } from "./runtime-config-DtJIUgYw.js";
4
4
  import "./i18n-CTgT1HG-.js";
5
5
  import { r as connectConfig } from "./connect.config-Dgs13R1s.js";
6
6
  import { n as setUser } from "./sentry-jfDyrxdX.js";
7
- import { t as getBuildHash } from "./build-info-BW_vU5c0.js";
7
+ import { t as getBuildHash } from "./build-info-CRzCyE8K.js";
8
8
  import { a as detectReactorPgMajor, i as detectMigrationMajor } from "./connection-state-Cy8xRCm_.js";
9
9
  import { n as seedPendingPgVersion } from "./pglite-seed-D6fqQApT.js";
10
- import { n as createReactor } from "./reactor-B9xdtXLQ.js";
10
+ import { n as createReactor } from "./reactor-9ZEESTUg.js";
11
11
  import { useEffect } from "react";
12
12
  import { initTheme, useUser } from "@powerhousedao/reactor-browser";
13
13
  import { logger } from "document-model";
@@ -129,5 +129,5 @@ async function loadComponent(localPackage) {
129
129
  //#endregion
130
130
  export { loadComponent };
131
131
 
132
- //# sourceMappingURL=load-C1kCFFvW.js.map
133
- //# debugId=629b8c84-cb6a-500f-8816-1cc9628789f3
132
+ //# sourceMappingURL=load-DVPS_VqN.js.map
133
+ //# debugId=f1fb63ce-3d47-5aaf-ae69-e6940c799447
@@ -1 +1 @@
1
- {"version":3,"file":"load-C1kCFFvW.js","sources":["../src/hooks/useCheckLatestVersion.ts","../src/hooks/utils.ts","../src/store/user.ts","../src/components/load.tsx"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { getBuildHashStatus } from \"@powerhousedao/connect/hooks\";\nimport { logger } from \"document-model\";\nimport { useEffect } from \"react\";\n\n// Session-scoped guard: records the deployed hash this tab already reloaded\n// for, so a broken or rolling deploy (server hash keeps changing under us)\n// cannot turn the tab into a reload loop. Cleared implicitly with the tab.\nconst RELOADED_FOR_KEY = \"ph-reloaded-for-build-hash\";\n\n/**\n * Drop the service worker's stale caches (precache + the NetworkFirst shell\n * cache) before reloading onto a new deploy, so the post-reload navigation\n * is answered from the network / fresh build instead of leftovers of the\n * build we are leaving. Best-effort: if the Caches API is unavailable or a\n * delete fails, the reload still picks up the new shell (the navigation\n * route is NetworkFirst).\n */\nasync function clearStaleCaches(): Promise<void> {\n try {\n if (!(\"caches\" in window)) return;\n const keys = await window.caches.keys();\n await Promise.all(\n keys\n .filter((key) => key.includes(\"precache\") || key.includes(\"ph-shell\"))\n .map((key) => window.caches.delete(key)),\n );\n } catch (error) {\n logger.warn(\n \"Failed to clear stale caches before update reload @error\",\n error,\n );\n }\n}\n\n/**\n * Detects that the server is serving a different build than the one this\n * page was loaded from (a new deploy) and reloads onto it — once per session\n * per deployed hash. Checked on mount and whenever the tab returns to the\n * foreground, so a deploy that lands while the tab sits open is picked up on\n * the next focus without a manual reload. The in-tab \"new version available\"\n * service-worker prompt (ServiceWorkerUpdatePrompt) remains the opt-in path\n * for workers that are waiting but not yet controlling.\n */\nexport const useCheckLatestVersion = () => {\n useEffect(() => {\n if (\n import.meta.env.MODE === \"development\" ||\n connectConfig.studioMode ||\n !connectConfig.warnOutdatedApp\n ) {\n return;\n }\n\n const checkBuildHash = async () => {\n const status = await getBuildHashStatus();\n if (!status || status.isCurrent) return;\n\n const reloadedFor = window.sessionStorage.getItem(RELOADED_FOR_KEY);\n if (reloadedFor === status.deployedHash) return;\n window.sessionStorage.setItem(RELOADED_FOR_KEY, status.deployedHash);\n\n logger.info(\n \"New deploy detected — reloading from build @currentHash to @deployedHash\",\n status.currentHash,\n status.deployedHash,\n );\n await clearStaleCaches();\n window.location.reload();\n };\n\n void checkBuildHash();\n const onVisibilityChange = () => {\n if (document.visibilityState === \"visible\") void checkBuildHash();\n };\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n return () => {\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n };\n }, []);\n};\n","import { getBuildHash } from \"../utils/build-info.js\";\n\nexport const isMac = window.navigator.appVersion.includes(\"Mac\");\n\nexport interface BuildHashStatus {\n /** Hash baked into the running build. */\n currentHash: string;\n /** Hash the server is currently serving. */\n deployedHash: string;\n /** true when the running build matches what the server serves. */\n isCurrent: boolean;\n}\n\n/**\n * Same-origin build-identity probe. The build bakes a hash of the inputs that\n * determine the deployed content into the bundle (define\n * `PH_CONNECT_BUILD_HASH`, see builder-tools' connectBuildHashPlugin) and\n * emits `build-hash.json` next to the app (served no-cache). Comparing the\n * two tells us whether the server is serving a different build than the one\n * this page was loaded from — the reliable \"a new deploy went out\" signal.\n * Unlike the old GitHub-raw version check it works on localhost (it compares\n * against what the origin actually serves, not a remote branch head) and\n * needs no network beyond the app's own origin.\n *\n * Returns null when there is nothing to compare: dev/studio builds (no hash\n * baked), a server predating `build-hash.json`, an offline fetch, or a\n * malformed body.\n */\nexport const getBuildHashStatus = async (): Promise<BuildHashStatus | null> => {\n const currentHash = getBuildHash();\n if (!currentHash || currentHash === \"unknown\") return null;\n try {\n const result = await fetch(`${import.meta.env.BASE_URL}build-hash.json`, {\n cache: \"no-cache\",\n });\n if (!result.ok) return null;\n const data = (await result.json()) as { hash?: unknown };\n if (typeof data.hash !== \"string\" || !data.hash) return null;\n return {\n currentHash,\n deployedHash: data.hash,\n isCurrent: data.hash === currentHash,\n };\n } catch {\n return null;\n }\n};\n","import { useUser } from \"@powerhousedao/reactor-browser\";\nimport type { User as SentryUser } from \"@sentry/react\";\nimport { useEffect } from \"react\";\nimport { setUser as setSentryUser } from \"../services/sentry.js\";\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 detectMigrationMajor,\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\";\nimport { applyConnectBranding, loadRuntimeConfig } from \"../runtime-config.js\";\n\nexport async function loadComponent(localPackage?: DocumentModelLib) {\n await seedPendingPgVersion();\n await Promise.all([detectReactorPgMajor(), detectMigrationMajor()]);\n const runtimeConfig = await loadRuntimeConfig();\n applyConnectBranding(runtimeConfig);\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":[],"mappings":";;;;;;;;;;;;;;AAQA,MAAM,mBAAmB;;;;;;;;;AAUzB,eAAe,mBAAkC;CAC/C,IAAI;EACF,IAAI,EAAE,YAAY,SAAS;EAC3B,MAAM,OAAO,MAAM,OAAO,OAAO,KAAK;EACtC,MAAM,QAAQ,IACZ,KACG,QAAQ,QAAQ,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,UAAU,CAAC,CAAC,CACrE,KAAK,QAAQ,OAAO,OAAO,OAAO,GAAG,CAAC,CAC3C;CACF,SAAS,OAAO;EACd,OAAO,KACL,4DACA,KACF;CACF;AACF;;;;;;;;;;AAWA,MAAa,8BAA8B;CACzC,gBAAgB;EACd,IACE,YAAY,IAAI,SAAS,iBACzB,cAAc,cACd,CAAC,cAAc,iBAEf;EAGF,MAAM,iBAAiB,YAAY;GACjC,MAAM,SAAS,MAAM,mBAAmB;GACxC,IAAI,CAAC,UAAU,OAAO,WAAW;GAGjC,IADoB,OAAO,eAAe,QAAQ,gBACpC,MAAM,OAAO,cAAc;GACzC,OAAO,eAAe,QAAQ,kBAAkB,OAAO,YAAY;GAEnE,OAAO,KACL,4EACA,OAAO,aACP,OAAO,YACT;GACA,MAAM,iBAAiB;GACvB,OAAO,SAAS,OAAO;EACzB;EAEA,eAAoB;EACpB,MAAM,2BAA2B;GAC/B,IAAI,SAAS,oBAAoB,WAAW,eAAoB;EAClE;EACA,SAAS,iBAAiB,oBAAoB,kBAAkB;EAChE,aAAa;GACX,SAAS,oBAAoB,oBAAoB,kBAAkB;EACrE;CACF,GAAG,CAAC,CAAC;AACP;AC9EqB,OAAO,UAAU,WAAW,SAAS,KAAK;;;;;;;;;;;;;;;;AA0B/D,MAAa,qBAAqB,YAA6C;CAC7E,MAAM,cAAc,aAAa;CACjC,IAAI,CAAC,eAAe,gBAAgB,WAAW,OAAO;CACtD,IAAI;EACF,MAAM,SAAS,MAAM,MAAM,GAAG,YAAY,IAAI,SAAS,kBAAkB,EACvE,OAAO,WACT,CAAC;EACD,IAAI,CAAC,OAAO,IAAI,OAAO;EACvB,MAAM,OAAQ,MAAM,OAAO,KAAK;EAChC,IAAI,OAAO,KAAK,SAAS,YAAY,CAAC,KAAK,MAAM,OAAO;EACxD,OAAO;GACL;GACA,cAAc,KAAK;GACnB,WAAW,KAAK,SAAS;EAC3B;CACF,QAAQ;EACN,OAAO;CACT;AACF;;;ACzCA,SAAgB,mBAAmB;CACjC,MAAM,OAAO,QAAQ;CACrB,gBAAgB;EACd,IAAI,aAAgC;EACpC,IAAI,MAAM;GAER,MAAM,EAAE,YAAY,aAAa,GAAG,SAAS;GAC7C,aAAa;IAAE,IAAI,KAAK;IAAK,UAAU,KAAK,KAAK;IAAM,GAAG;GAAK;EACjE;EACA,QAAc,UAAU;CAC1B,GAAG,CAAC,IAAI,CAAC;AACX;;;ACHA,eAAsB,cAAc,cAAiC;CACnE,MAAM,qBAAqB;CAC3B,MAAM,QAAQ,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC,CAAC;CAClE,MAAM,gBAAgB,MAAM,kBAAkB;CAC9C,qBAAqB,aAAa;CAClC,MAAM,cAAc,YAAY;CAChC,OAAO,EACL,UAAU,EAAE,eAAyC;EACnD,UAAU;EAEV,iBAAiB;EAEjB,sBAAsB;EACtB,OAAO;CACT,EACF;AACF","debug_id":"629b8c84-cb6a-500f-8816-1cc9628789f3"}
1
+ {"version":3,"file":"load-DVPS_VqN.js","sources":["../src/hooks/useCheckLatestVersion.ts","../src/hooks/utils.ts","../src/store/user.ts","../src/components/load.tsx"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { getBuildHashStatus } from \"@powerhousedao/connect/hooks\";\nimport { logger } from \"document-model\";\nimport { useEffect } from \"react\";\n\n// Session-scoped guard: records the deployed hash this tab already reloaded\n// for, so a broken or rolling deploy (server hash keeps changing under us)\n// cannot turn the tab into a reload loop. Cleared implicitly with the tab.\nconst RELOADED_FOR_KEY = \"ph-reloaded-for-build-hash\";\n\n/**\n * Drop the service worker's stale caches (precache + the NetworkFirst shell\n * cache) before reloading onto a new deploy, so the post-reload navigation\n * is answered from the network / fresh build instead of leftovers of the\n * build we are leaving. Best-effort: if the Caches API is unavailable or a\n * delete fails, the reload still picks up the new shell (the navigation\n * route is NetworkFirst).\n */\nasync function clearStaleCaches(): Promise<void> {\n try {\n if (!(\"caches\" in window)) return;\n const keys = await window.caches.keys();\n await Promise.all(\n keys\n .filter((key) => key.includes(\"precache\") || key.includes(\"ph-shell\"))\n .map((key) => window.caches.delete(key)),\n );\n } catch (error) {\n logger.warn(\n \"Failed to clear stale caches before update reload @error\",\n error,\n );\n }\n}\n\n/**\n * Detects that the server is serving a different build than the one this\n * page was loaded from (a new deploy) and reloads onto it — once per session\n * per deployed hash. Checked on mount and whenever the tab returns to the\n * foreground, so a deploy that lands while the tab sits open is picked up on\n * the next focus without a manual reload. The in-tab \"new version available\"\n * service-worker prompt (ServiceWorkerUpdatePrompt) remains the opt-in path\n * for workers that are waiting but not yet controlling.\n */\nexport const useCheckLatestVersion = () => {\n useEffect(() => {\n if (\n import.meta.env.MODE === \"development\" ||\n connectConfig.studioMode ||\n !connectConfig.warnOutdatedApp\n ) {\n return;\n }\n\n const checkBuildHash = async () => {\n const status = await getBuildHashStatus();\n if (!status || status.isCurrent) return;\n\n const reloadedFor = window.sessionStorage.getItem(RELOADED_FOR_KEY);\n if (reloadedFor === status.deployedHash) return;\n window.sessionStorage.setItem(RELOADED_FOR_KEY, status.deployedHash);\n\n logger.info(\n \"New deploy detected — reloading from build @currentHash to @deployedHash\",\n status.currentHash,\n status.deployedHash,\n );\n await clearStaleCaches();\n window.location.reload();\n };\n\n void checkBuildHash();\n const onVisibilityChange = () => {\n if (document.visibilityState === \"visible\") void checkBuildHash();\n };\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n return () => {\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n };\n }, []);\n};\n","import { getBuildHash } from \"../utils/build-info.js\";\n\nexport const isMac = window.navigator.appVersion.includes(\"Mac\");\n\nexport interface BuildHashStatus {\n /** Hash baked into the running build. */\n currentHash: string;\n /** Hash the server is currently serving. */\n deployedHash: string;\n /** true when the running build matches what the server serves. */\n isCurrent: boolean;\n}\n\n/**\n * Same-origin build-identity probe. The build bakes a hash of the inputs that\n * determine the deployed content into the bundle (define\n * `PH_CONNECT_BUILD_HASH`, see builder-tools' connectBuildHashPlugin) and\n * emits `build-hash.json` next to the app (served no-cache). Comparing the\n * two tells us whether the server is serving a different build than the one\n * this page was loaded from — the reliable \"a new deploy went out\" signal.\n * Unlike the old GitHub-raw version check it works on localhost (it compares\n * against what the origin actually serves, not a remote branch head) and\n * needs no network beyond the app's own origin.\n *\n * Returns null when there is nothing to compare: dev/studio builds (no hash\n * baked), a server predating `build-hash.json`, an offline fetch, or a\n * malformed body.\n */\nexport const getBuildHashStatus = async (): Promise<BuildHashStatus | null> => {\n const currentHash = getBuildHash();\n if (!currentHash || currentHash === \"unknown\") return null;\n try {\n const result = await fetch(`${import.meta.env.BASE_URL}build-hash.json`, {\n cache: \"no-cache\",\n });\n if (!result.ok) return null;\n const data = (await result.json()) as { hash?: unknown };\n if (typeof data.hash !== \"string\" || !data.hash) return null;\n return {\n currentHash,\n deployedHash: data.hash,\n isCurrent: data.hash === currentHash,\n };\n } catch {\n return null;\n }\n};\n","import { useUser } from \"@powerhousedao/reactor-browser\";\nimport type { User as SentryUser } from \"@sentry/react\";\nimport { useEffect } from \"react\";\nimport { setUser as setSentryUser } from \"../services/sentry.js\";\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 detectMigrationMajor,\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\";\nimport { applyConnectBranding, loadRuntimeConfig } from \"../runtime-config.js\";\n\nexport async function loadComponent(localPackage?: DocumentModelLib) {\n await seedPendingPgVersion();\n await Promise.all([detectReactorPgMajor(), detectMigrationMajor()]);\n const runtimeConfig = await loadRuntimeConfig();\n applyConnectBranding(runtimeConfig);\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":[],"mappings":";;;;;;;;;;;;;;AAQA,MAAM,mBAAmB;;;;;;;;;AAUzB,eAAe,mBAAkC;CAC/C,IAAI;EACF,IAAI,EAAE,YAAY,SAAS;EAC3B,MAAM,OAAO,MAAM,OAAO,OAAO,KAAK;EACtC,MAAM,QAAQ,IACZ,KACG,QAAQ,QAAQ,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,UAAU,CAAC,CAAC,CACrE,KAAK,QAAQ,OAAO,OAAO,OAAO,GAAG,CAAC,CAC3C;CACF,SAAS,OAAO;EACd,OAAO,KACL,4DACA,KACF;CACF;AACF;;;;;;;;;;AAWA,MAAa,8BAA8B;CACzC,gBAAgB;EACd,IACE,YAAY,IAAI,SAAS,iBACzB,cAAc,cACd,CAAC,cAAc,iBAEf;EAGF,MAAM,iBAAiB,YAAY;GACjC,MAAM,SAAS,MAAM,mBAAmB;GACxC,IAAI,CAAC,UAAU,OAAO,WAAW;GAGjC,IADoB,OAAO,eAAe,QAAQ,gBACpC,MAAM,OAAO,cAAc;GACzC,OAAO,eAAe,QAAQ,kBAAkB,OAAO,YAAY;GAEnE,OAAO,KACL,4EACA,OAAO,aACP,OAAO,YACT;GACA,MAAM,iBAAiB;GACvB,OAAO,SAAS,OAAO;EACzB;EAEA,eAAoB;EACpB,MAAM,2BAA2B;GAC/B,IAAI,SAAS,oBAAoB,WAAW,eAAoB;EAClE;EACA,SAAS,iBAAiB,oBAAoB,kBAAkB;EAChE,aAAa;GACX,SAAS,oBAAoB,oBAAoB,kBAAkB;EACrE;CACF,GAAG,CAAC,CAAC;AACP;AC9EqB,OAAO,UAAU,WAAW,SAAS,KAAK;;;;;;;;;;;;;;;;AA0B/D,MAAa,qBAAqB,YAA6C;CAC7E,MAAM,cAAc,aAAa;CACjC,IAAI,CAAC,eAAe,gBAAgB,WAAW,OAAO;CACtD,IAAI;EACF,MAAM,SAAS,MAAM,MAAM,GAAG,YAAY,IAAI,SAAS,kBAAkB,EACvE,OAAO,WACT,CAAC;EACD,IAAI,CAAC,OAAO,IAAI,OAAO;EACvB,MAAM,OAAQ,MAAM,OAAO,KAAK;EAChC,IAAI,OAAO,KAAK,SAAS,YAAY,CAAC,KAAK,MAAM,OAAO;EACxD,OAAO;GACL;GACA,cAAc,KAAK;GACnB,WAAW,KAAK,SAAS;EAC3B;CACF,QAAQ;EACN,OAAO;CACT;AACF;;;ACzCA,SAAgB,mBAAmB;CACjC,MAAM,OAAO,QAAQ;CACrB,gBAAgB;EACd,IAAI,aAAgC;EACpC,IAAI,MAAM;GAER,MAAM,EAAE,YAAY,aAAa,GAAG,SAAS;GAC7C,aAAa;IAAE,IAAI,KAAK;IAAK,UAAU,KAAK,KAAK;IAAM,GAAG;GAAK;EACjE;EACA,QAAc,UAAU;CAC1B,GAAG,CAAC,IAAI,CAAC;AACX;;;ACHA,eAAsB,cAAc,cAAiC;CACnE,MAAM,qBAAqB;CAC3B,MAAM,QAAQ,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC,CAAC;CAClE,MAAM,gBAAgB,MAAM,kBAAkB;CAC9C,qBAAqB,aAAa;CAClC,MAAM,cAAc,YAAY;CAChC,OAAO,EACL,UAAU,EAAE,eAAyC;EACnD,UAAU;EAEV,iBAAiB;EAEjB,sBAAsB;EACtB,OAAO;CACT,EACF;AACF","debug_id":"f1fb63ce-3d47-5aaf-ae69-e6940c799447"}
package/dist/main.js CHANGED
@@ -5,7 +5,7 @@ import { jsx } from "react/jsx-runtime";
5
5
  //#region main.tsx
6
6
  const root = await bootConnect();
7
7
  if (root) {
8
- const { AppLoader } = await import("./app-loader-DDaPW-Ky.js");
8
+ const { AppLoader } = await import("./app-loader-DyM1CY4K.js");
9
9
  root.render(/* @__PURE__ */ jsx(AppLoader, {}));
10
10
  }
11
11
  //#endregion
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="94b066d2-0761-52cc-83b9-6bc6a9bea57d")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9177dffe-876f-5372-b971-22d253b5334e")}catch(e){}}();
3
3
  import { t as refreshPwaManifestLink } from "./pwa-manifest-link-DQRJpF0r.js";
4
4
  import { DYNAMIC_BASE_PLACEHOLDER, PWA_IDB_KEY, PWA_IDB_NAME, PWA_IDB_STORE, PWA_IDB_VERSION, checkSharedDeps, formatSharedDepWarnings, mergePwaConfig, withInferredCategory } from "@powerhousedao/shared/connect";
5
5
  import { BrowserLocalStorage } from "@powerhousedao/reactor-browser";
@@ -164,6 +164,15 @@ function sharedDepMismatchWarnings(pkgJson, hostVersions) {
164
164
  return formatSharedDepWarnings(checkSharedDeps(pkgJson, hostVersions));
165
165
  }
166
166
  const LOCAL_PACKAGE_NAME = "Local";
167
+ const LAYER_ORDER = "@layer theme, base, components, external-packages, utilities;";
168
+ const LAYER_ORDER_ATTR = "data-ph-layer-order";
169
+ function declareExternalPackagesLayer() {
170
+ if (document.head.querySelector(`style[${LAYER_ORDER_ATTR}]`)) return;
171
+ const order = document.createElement("style");
172
+ order.setAttribute(LAYER_ORDER_ATTR, "");
173
+ order.textContent = LAYER_ORDER;
174
+ document.head.prepend(order);
175
+ }
167
176
  var BrowserPackageManager = class {
168
177
  registryUrl;
169
178
  #storage;
@@ -402,6 +411,7 @@ var BrowserPackageManager = class {
402
411
  #mountStylesheet(name, href) {
403
412
  const existing = this.#stylesheets.get(name);
404
413
  if (existing) return existing;
414
+ declareExternalPackagesLayer();
405
415
  const style = document.createElement("style");
406
416
  style.textContent = `@import url("${href}") layer(external-packages);`;
407
417
  document.head.appendChild(style);
@@ -471,5 +481,5 @@ var BrowserPackageManager = class {
471
481
  //#endregion
472
482
  export { sharedDepMismatchWarnings as n, getSharedDeps as r, BrowserPackageManager as t };
473
483
 
474
- //# sourceMappingURL=package-manager-Bw4hKQ3s.js.map
475
- //# debugId=94b066d2-0761-52cc-83b9-6bc6a9bea57d
484
+ //# sourceMappingURL=package-manager-BbzIV9aN.js.map
485
+ //# debugId=9177dffe-876f-5372-b971-22d253b5334e
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager-BbzIV9aN.js","sources":["../src/shared-deps.ts","../src/utils/pwa-idb.ts","../src/package-manager.ts"],"sourcesContent":["import { DYNAMIC_BASE_PLACEHOLDER } from \"@powerhousedao/shared/connect\";\n\nexport type SharedDeps = {\n imports: Record<string, string>;\n versions: Record<string, string>;\n};\n\n/**\n * Resolve the vendor's import-map values to absolute URLs: the\n * dynamic-base placeholder (present in dynamic-base builds) is replaced\n * with the runtime base — which `import.meta.env.BASE_URL` already is,\n * since the dynamic-base plugin rewrites it to the resolved base — and\n * the result is made absolute against the page origin. Absolute URLs are\n * what the worker needs: its imports have no document context, so\n * relative or placeholder-based values would not resolve there.\n */\nexport function normalizeVendorImports(\n rawImports: Record<string, string>,\n runtimeBase: string,\n): Record<string, string> {\n // `location` is a browser global; the fallback keeps the helper usable\n // from node-based tests, where no origin exists.\n const origin =\n (globalThis as { location?: Location }).location?.origin ??\n \"http://localhost\";\n return Object.fromEntries(\n Object.entries(rawImports).map(([spec, value]) => [\n spec,\n new URL(value.replace(DYNAMIC_BASE_PLACEHOLDER, runtimeBase), origin)\n .href,\n ]),\n );\n}\n\nlet cached: Promise<SharedDeps | null> | null = null;\n\n/**\n * The production vendor's shared-deps table: import-map entries for the\n * shared dependency set plus the resolved version of every shared package\n * in this build. Fails soft (`null`) when the vendor is not present (dev,\n * or a `PH_CONNECT_VENDOR=0` build) — callers treat that as \"no sharing\".\n * The promise is cached: the vendor table is immutable per build.\n */\nexport function getSharedDeps(): Promise<SharedDeps | null> {\n cached ??= (async () => {\n try {\n const mod = (await import(\n /* @vite-ignore */ `${import.meta.env.BASE_URL}__vendor__/shared-deps.js`\n )) as {\n imports: Record<string, string>;\n versions: Record<string, string>;\n };\n return {\n imports: normalizeVendorImports(mod.imports, import.meta.env.BASE_URL),\n versions: mod.versions,\n };\n } catch {\n return null;\n }\n })();\n return cached;\n}\n","import {\n PWA_IDB_KEY,\n PWA_IDB_NAME,\n PWA_IDB_STORE,\n PWA_IDB_VERSION,\n type PHConnectPwa,\n type PHConnectPwaIcon,\n} from \"@powerhousedao/shared/connect\";\n\n// The page-owned mirror of the effective PWA fragment contributed by the\n// currently-installed packages. The service worker reads this (read-only) to\n// serve a live web-app manifest — a SW cannot reach localStorage (where the\n// package list lives), so BrowserPackageManager writes the merged fragment\n// here on every package change. The db/store/key/version constants are the\n// SHARED source of truth in @powerhousedao/shared/connect, imported by both\n// this writer and the SW reader so the two cannot desync.\n\nexport type PwaFragmentRecord = {\n version: 1;\n fragment: PHConnectPwa;\n updatedAt: number;\n};\n\n// Self-contained IDB open (not reusing pglite-idb) so this module — and its\n// pure `resolveFragmentAssetUrls` — carries no dependency on connect.config,\n// keeping it importable in isolation.\nfunction openPwaIdb(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(PWA_IDB_NAME, PWA_IDB_VERSION);\n req.onupgradeneeded = () => {\n if (!req.result.objectStoreNames.contains(PWA_IDB_STORE)) {\n req.result.createObjectStore(PWA_IDB_STORE);\n }\n };\n req.onerror = () => reject(req.error ?? new Error(\"ph-pwa open failed\"));\n req.onblocked = () => reject(new Error(\"ph-pwa open blocked\"));\n req.onsuccess = () => resolve(req.result);\n });\n}\n\n/** Write (replace) the single merged fragment record. Best-effort: a failure to\n * mirror the manifest must never break package installation, so callers ignore\n * rejections. No-op when IndexedDB is unavailable (SSR/tests). */\nexport async function writeMergedPwaFragment(\n fragment: PHConnectPwa,\n): Promise<void> {\n if (typeof indexedDB === \"undefined\") return;\n const db = await openPwaIdb();\n try {\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction(PWA_IDB_STORE, \"readwrite\");\n tx.oncomplete = () => resolve();\n tx.onerror = () =>\n reject(tx.error ?? new Error(\"PWA fragment write failed\"));\n tx.objectStore(PWA_IDB_STORE).put(\n {\n version: 1,\n fragment,\n updatedAt: Date.now(),\n } satisfies PwaFragmentRecord,\n PWA_IDB_KEY,\n );\n });\n } finally {\n db.close();\n }\n}\n\n/** Resolve `src` against the package `baseUrl`, absolute srcs passing through.\n * `baseUrl` may itself be relative (e.g. a same-origin-proxied registry, or the\n * dev `/node_modules/…` path), so it is first made absolute against the app\n * origin — `new URL(src, relativeBase)` would otherwise throw and silently\n * leave the src unresolved. A malformed src is left untouched. */\nfunction toAbsoluteAssetUrl(src: string, baseUrl: string): string {\n try {\n const origin =\n typeof location !== \"undefined\" ? location.href : \"http://localhost/\";\n return new URL(src, new URL(baseUrl, origin)).toString();\n } catch {\n return src;\n }\n}\n\nfunction resolveIconSrc(\n icon: PHConnectPwaIcon,\n baseUrl: string,\n): PHConnectPwaIcon {\n return { ...icon, src: toAbsoluteAssetUrl(icon.src, baseUrl) };\n}\n\n/**\n * Rewrite a package fragment's relative asset srcs (manifest icons and\n * file-handler icons) to absolute URLs against the package's base — a runtime\n * package's assets live on the registry CDN, not the app origin, so the served\n * manifest must point there. `baseUrl` null (a local/bundled package whose\n * assets are app-origin-relative) leaves srcs untouched.\n */\nexport function resolveFragmentAssetUrls(\n config: PHConnectPwa,\n baseUrl: string | null,\n): PHConnectPwa {\n if (!baseUrl || !config.manifest) return config;\n const m = config.manifest;\n const resolveIcons = (icons?: PHConnectPwaIcon[]) =>\n icons?.map((icon) => resolveIconSrc(icon, baseUrl));\n return {\n ...config,\n manifest: {\n ...m,\n icons: resolveIcons(m.icons),\n file_handlers: m.file_handlers?.map((handler) => ({\n ...handler,\n icons: resolveIcons(handler.icons),\n })),\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 checkSharedDeps,\n formatSharedDepWarnings,\n mergePwaConfig,\n type PHConnectPwa,\n type PwaContribution,\n withInferredCategory,\n} from \"@powerhousedao/shared/connect\";\nimport {\n type DocumentModelLib,\n type DocumentModelModule,\n PwaConfigSchema,\n} from \"@powerhousedao/shared/document-model\";\nimport { toCdnUrl } from \"@powerhousedao/shared/registry/urls\";\nimport { getSharedDeps } from \"./shared-deps.js\";\nimport {\n resolveFragmentAssetUrls,\n writeMergedPwaFragment,\n} from \"./utils/pwa-idb.js\";\nimport { refreshPwaManifestLink } from \"./utils/pwa-manifest-link.js\";\nimport vetraPkg from \"@powerhousedao/vetra/package.json\" with { type: \"json\" };\nimport workflowPkg from \"@powerhousedao/workflow/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\ntype FetchedPackageJson = {\n version?: string;\n dependencies?: Record<string, unknown>;\n peerDependencies?: Record<string, unknown>;\n};\n\nasync function fetchPackageJson(\n baseUrl: string,\n): Promise<FetchedPackageJson | null> {\n try {\n const res = await fetch(baseUrl);\n if (!res.ok) return null;\n const pkg = (await res.json()) as {\n version?: unknown;\n dependencies?: Record<string, unknown>;\n peerDependencies?: Record<string, unknown>;\n };\n return {\n version: typeof pkg.version === \"string\" ? pkg.version : undefined,\n dependencies: pkg.dependencies,\n peerDependencies: pkg.peerDependencies,\n };\n } catch {\n return null;\n }\n}\n\nasync function fetchPackageJsonVersion(\n baseUrl: string,\n): Promise<string | undefined> {\n return (await fetchPackageJson(baseUrl))?.version;\n}\n\n/**\n * Human-readable warnings for shared-dep mismatches between a package's npm\n * `package.json` (as served by the CDN) and the host's shared-deps version\n * table. Empty when either side is unavailable — a dev / vendor-off host has\n * no table to compare against, and a missing package.json means the check\n * can't run. Used by both the install flow and the package-manager UI.\n */\nexport function sharedDepMismatchWarnings(\n pkgJson: FetchedPackageJson | null,\n hostVersions: Record<string, string> | null | undefined,\n): string[] {\n if (!pkgJson || !hostVersions) return [];\n return formatSharedDepWarnings(checkSharedDeps(pkgJson, hostVersions));\n}\n\nconst LOCAL_PACKAGE_NAME = \"Local\" as const;\n\n// Package CSS goes in external-packages: above Connect's reset so it can style\n// its editors, below Connect's utilities so it can't override them.\nexport const LAYER_ORDER =\n \"@layer theme, base, components, external-packages, utilities;\";\nconst LAYER_ORDER_ATTR = \"data-ph-layer-order\";\n\n// Layer order is set by the first declaration in the document, and a project's\n// style.css declares Tailwind's layers first, so this goes first in <head>.\n\nexport function declareExternalPackagesLayer(): void {\n if (document.head.querySelector(`style[${LAYER_ORDER_ATTR}]`)) return;\n const order = document.createElement(\"style\");\n order.setAttribute(LAYER_ORDER_ATTR, \"\");\n order.textContent = LAYER_ORDER;\n document.head.prepend(order);\n}\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 #pwaSyncTimer: ReturnType<typeof setTimeout> | undefined;\n /** Serialized last-mirrored PWA fragment; lets a sync skip the IndexedDB\n * write + manifest re-attach when nothing PWA-relevant changed. */\n #lastSyncedFragmentJson: string | undefined;\n\n constructor(namespace: string, registryUrl: string | null) {\n this.#storage = new BrowserLocalStorage<PackageMeta>(\n namespace + \":PH_PACKAGES\",\n );\n this.registryUrl = registryUrl;\n this.#cdnUrl = registryUrl !== null ? toCdnUrl(registryUrl) : null;\n }\n\n async init(\n localPackage?: DocumentModelLib<any>,\n localPackageVersion?: string,\n studioMode?: boolean,\n workflowsEnabled?: boolean,\n ) {\n this.addLocalPackage(common.manifest.name, common, commonPkg.version);\n // Vetra is builder-only and not CDN-loadable; lazy-load it (code-split\n // chunk, never fetched in production) only in studio mode.\n if (studioMode) {\n const vetra = await import(\"@powerhousedao/vetra\");\n this.addLocalPackage(vetra.manifest.name, vetra, vetraPkg.version);\n }\n // Same shape for the workflow package, behind its own independent flag.\n // Only the package root: `./pieces` and `./reactor` are node-only.\n if (workflowsEnabled) {\n const workflow = await import(\"@powerhousedao/workflow\");\n this.addLocalPackage(\n workflow.manifest.name,\n workflow,\n workflowPkg.version,\n );\n }\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 /**\n * The spec the user requested when this package was installed (e.g.\n * `name@dev` or `name@6.2.1`). Undefined for bare-name installs, legacy\n * entries, and local packages — the Package Manager treats that as the\n * `latest` stream when picking update targets.\n */\n getPackageSpec(packageName: string): string | undefined {\n return this.#storage.get(packageName)?.spec;\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 const pkgJson = await fetchPackageJson(\n `${this.#cdnUrl}/${name}/package.json`,\n );\n packageWithMeta.version = pkgJson?.version;\n\n // Non-blocking warning: a package that pins a shared dep at a version\n // the host's vendor was built without still installs, but the host's\n // copy is what runs — surface the mismatch before it surprises the\n // user at runtime.\n const warnings = sharedDepMismatchWarnings(\n pkgJson,\n (await getSharedDeps())?.versions,\n );\n if (warnings.length > 0) {\n console.error(\n `[package-manager] shared-deps mismatch for ${name}:\\n` +\n warnings.join(\"\\n\"),\n );\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 declareExternalPackagesLayer();\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 this.#schedulePwaSync();\n }\n\n /**\n * Debounced mirror of every loaded package's PWA fragment into IndexedDB, so\n * the service worker can serve a web-app manifest that reflects packages\n * installed AT RUNTIME (a SW can't read localStorage, where the package list\n * lives). Debounced because `init()` rehydrates many packages in a burst;\n * coalescing collapses that into a single write.\n */\n #schedulePwaSync() {\n if (typeof indexedDB === \"undefined\") return;\n clearTimeout(this.#pwaSyncTimer);\n this.#pwaSyncTimer = setTimeout(() => {\n void this.#syncPwaFragments();\n }, 50);\n }\n\n async #syncPwaFragments() {\n const contributions: PwaContribution[] = [];\n for (const [name, loadedPackage] of this.#packages) {\n const manifest = loadedPackage.manifest;\n let config: PHConnectPwa = {};\n if (manifest.pwa) {\n // Third-party package code must not inject arbitrary manifest fields the\n // SW will serve — validate strictly and skip (with a warning) on failure.\n const parsed = PwaConfigSchema.safeParse(manifest.pwa);\n if (parsed.success) {\n // A package's assets live at its base (CDN for registry installs);\n // make relative icon srcs absolute so the served manifest resolves.\n const importUrl = this.#storage.get(name)?.importUrl ?? null;\n const baseUrl = importUrl\n ? importUrl.replace(/browser\\/index\\.js$/, \"\")\n : null;\n config = resolveFragmentAssetUrls(parsed.data, baseUrl);\n } else {\n console.warn(\n `[Connect][PWA] \"${name}\" ships an invalid pwa fragment; skipped.`,\n parsed.error,\n );\n }\n }\n // `categories` is derived from the manifest's `category` field (not\n // authored under `pwa`); it unions into the SW-served manifest so a\n // runtime-installed package's category shows up like a build-time one.\n config = withInferredCategory(config, manifest.category);\n if (Object.keys(config).length === 0) continue;\n contributions.push({ source: name, config });\n }\n // Fold in load order (base-first ordering is preserved so a package cannot\n // hijack the built-in .phd/.phdm handler at merge time either).\n const merged = mergePwaConfig(contributions);\n // Most package operations don't touch PWA config; skip the write + manifest\n // re-attach (which forces a redundant manifest re-fetch) when unchanged.\n const mergedJson = JSON.stringify(merged);\n if (mergedJson === this.#lastSyncedFragmentJson) return;\n try {\n await writeMergedPwaFragment(merged);\n } catch (error) {\n // Leave #lastSyncedFragmentJson unset so a later sync retries the write.\n console.debug(\n \"[Connect][PWA] fragment mirror to IndexedDB failed:\",\n error,\n );\n return;\n }\n this.#lastSyncedFragmentJson = mergedJson;\n // The SW serves the manifest fresh from IndexedDB, but the browser only\n // parsed <link rel=\"manifest\"> at page load — re-attach it so it\n // re-consumes the now-updated manifest without a manual reload. (Kept out\n // of the write's try/catch so a DOM error isn't mislabeled as an IDB\n // failure; refreshPwaManifestLink is itself non-throwing.)\n refreshPwaManifestLink();\n }\n}\n"],"names":[],"mappings":"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","debug_id":"9177dffe-876f-5372-b971-22d253b5334e"}
@@ -1,12 +1,12 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="ace87dd1-a69a-5f01-aba5-c133f645cc16")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="c2612b43-3fee-5d2a-ba13-76c6d00f8712")}catch(e){}}();
3
3
  import { n as getRuntimeConfig } from "./runtime-config-DtJIUgYw.js";
4
4
  import { t as createConnectSignerConfig } from "./renown-trust-DRgHpxlZ.js";
5
5
  import { a as resolvePgMajorForRuntime, r as loadPGliteModule } from "./pglite-major-BbmMK26m.js";
6
6
  import { n as buildPHGlobalConfig, o as phGlobalConfig, r as connectConfig } from "./connect.config-Dgs13R1s.js";
7
7
  import { r as toast } from "./toast-C6WW-_O-.js";
8
- import { r as getSharedDeps, t as BrowserPackageManager } from "./package-manager-Bw4hKQ3s.js";
9
- import { i as getVersion, n as getGitSha } from "./build-info-BW_vU5c0.js";
8
+ import { r as getSharedDeps, t as BrowserPackageManager } from "./package-manager-BbzIV9aN.js";
9
+ import { i as getVersion, n as getGitSha } from "./build-info-CRzCyE8K.js";
10
10
  import { a as detectReactorPgMajor, h as RELATIONAL_PGLITE_NAME, m as REACTOR_PGLITE_NAME, n as setWorkerConnectionStatus, o as detectRelationalPgMajor, p as REACTOR_INSTANCE_NAMESPACE } from "./connection-state-Cy8xRCm_.js";
11
11
  import { createRelationalDb } from "@powerhousedao/shared/processors";
12
12
  import { DocumentModelRegistry, DocumentModelResolver, ReactorEventTypes, createReactorHostModuleBase } from "@powerhousedao/reactor";
@@ -1081,5 +1081,5 @@ function getDriveUrl() {
1081
1081
  //#endregion
1082
1082
  export { createReactor as n, clearReactorStorage as t };
1083
1083
 
1084
- //# sourceMappingURL=reactor-B9xdtXLQ.js.map
1085
- //# debugId=ace87dd1-a69a-5f01-aba5-c133f645cc16
1084
+ //# sourceMappingURL=reactor-9ZEESTUg.js.map
1085
+ //# debugId=c2612b43-3fee-5d2a-ba13-76c6d00f8712