@powerhousedao/connect 6.0.0-dev.192 → 6.0.0-dev.194

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 (26) hide show
  1. package/dist/{ClearStorageModal-D5GnV_KP.js → ClearStorageModal-ChOg2R2R.js} +2 -2
  2. package/dist/{ClearStorageModal-D5GnV_KP.js.map → ClearStorageModal-ChOg2R2R.js.map} +1 -1
  3. package/dist/{InspectorModal-DmKsFb2H.js → InspectorModal-jZNPdfP4.js} +2 -2
  4. package/dist/{InspectorModal-DmKsFb2H.js.map → InspectorModal-jZNPdfP4.js.map} +1 -1
  5. package/dist/{MissingPackageModal-tfIQRHj0.js → MissingPackageModal-Df154H9n.js} +2 -2
  6. package/dist/{MissingPackageModal-tfIQRHj0.js.map → MissingPackageModal-Df154H9n.js.map} +1 -1
  7. package/dist/{SettingsModal-Bs2kY0xi.js → SettingsModal-UHPtLX1I.js} +8 -6
  8. package/dist/SettingsModal-UHPtLX1I.js.map +1 -0
  9. package/dist/{load-a9fL9VL8.js → load-H4R4OlSd.js} +3 -3
  10. package/dist/{load-a9fL9VL8.js.map → load-H4R4OlSd.js.map} +1 -1
  11. package/dist/main.js +1 -1
  12. package/dist/{package-BHlEN933.js → package-BSQuMYdG.js} +2 -2
  13. package/dist/package-BSQuMYdG.js.map +1 -0
  14. package/dist/{reactor-CPD8Z_UP.js → reactor-C0_wHi3h.js} +39 -14
  15. package/dist/reactor-C0_wHi3h.js.map +1 -0
  16. package/dist/{sidebar-CjBVvx_0.js → sidebar-CEFmpCYo.js} +6 -6
  17. package/dist/{sidebar-CjBVvx_0.js.map → sidebar-CEFmpCYo.js.map} +1 -1
  18. package/dist/start-connect.js +1 -1
  19. package/dist/style.css +49 -0
  20. package/dist/{useRegistryPackages-Ddtm9eH7.js → useRegistryPackages-BOX4NMAb.js} +36 -11
  21. package/dist/useRegistryPackages-BOX4NMAb.js.map +1 -0
  22. package/package.json +9 -9
  23. package/dist/SettingsModal-Bs2kY0xi.js.map +0 -1
  24. package/dist/package-BHlEN933.js.map +0 -1
  25. package/dist/reactor-CPD8Z_UP.js.map +0 -1
  26. package/dist/useRegistryPackages-Ddtm9eH7.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { t as clearReactorStorage } from "./reactor-CPD8Z_UP.js";
1
+ import { t as clearReactorStorage } from "./reactor-C0_wHi3h.js";
2
2
  import { closePHModal, setSelectedDrive, setSelectedNode, showPHModal, usePHModal } from "@powerhousedao/reactor-browser";
3
3
  import { childLogger } from "document-model";
4
4
  import { useState } from "react";
@@ -41,4 +41,4 @@ function ClearStorageModal() {
41
41
  //#endregion
42
42
  export { ClearStorageModal };
43
43
 
44
- //# sourceMappingURL=ClearStorageModal-D5GnV_KP.js.map
44
+ //# sourceMappingURL=ClearStorageModal-ChOg2R2R.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClearStorageModal-D5GnV_KP.js","names":["logger"],"sources":["../src/components/modal/modals/ClearStorageModal.tsx"],"sourcesContent":["import { clearReactorStorage } from \"@powerhousedao/connect/store\";\nimport { ConnectConfirmationModal } from \"@powerhousedao/design-system/connect\";\nimport {\n closePHModal,\n setSelectedDrive,\n setSelectedNode,\n showPHModal,\n usePHModal,\n} from \"@powerhousedao/reactor-browser\";\nimport { childLogger } from \"document-model\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nconst logger = childLogger([\"ClearStorage\"]);\n\nexport function ClearStorageModal() {\n const phModal = usePHModal();\n const open = phModal?.type === \"clearStorage\";\n const { t } = useTranslation();\n const [loading, setLoading] = useState(false);\n\n function clearStorage() {\n setLoading(true);\n clearReactorStorage()\n .then(() => {\n logger.info(\"Storage cleared\");\n setSelectedDrive(undefined);\n setSelectedNode(undefined);\n window.location.reload();\n })\n .catch((error) => {\n logger.error(\"Error clearing storage: @error\", error);\n setLoading(false);\n });\n }\n\n return (\n <ConnectConfirmationModal\n open={open}\n header={t(\"modals.connectSettings.clearStorage.confirmation.title\")}\n title={t(\"modals.connectSettings.clearStorage.confirmation.title\")}\n body={t(\"modals.connectSettings.clearStorage.confirmation.body\")}\n cancelLabel={t(\"common.cancel\")}\n continueLabel={t(\n \"modals.connectSettings.clearStorage.confirmation.clearButton\",\n )}\n onCancel={() => showPHModal({ type: \"settings\" })}\n onContinue={clearStorage}\n onOpenChange={(status: boolean) => {\n if (!status) return closePHModal();\n }}\n continueButtonProps={{\n disabled: loading,\n }}\n />\n );\n}\n"],"mappings":";;;;;;;;AAaA,MAAMA,WAAS,YAAY,CAAC,eAAe,CAAC;AAE5C,SAAgB,oBAAoB;CAElC,MAAM,OADU,YAAY,EACN,SAAS;CAC/B,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAE7C,SAAS,eAAe;AACtB,aAAW,KAAK;AAChB,uBAAqB,CAClB,WAAW;AACV,YAAO,KAAK,kBAAkB;AAC9B,oBAAiB,KAAA,EAAU;AAC3B,mBAAgB,KAAA,EAAU;AAC1B,UAAO,SAAS,QAAQ;IACxB,CACD,OAAO,UAAU;AAChB,YAAO,MAAM,kCAAkC,MAAM;AACrD,cAAW,MAAM;IACjB;;AAGN,QACE,oBAAC,0BAAD;EACQ;EACN,QAAQ,EAAE,yDAAyD;EACnE,OAAO,EAAE,yDAAyD;EAClE,MAAM,EAAE,wDAAwD;EAChE,aAAa,EAAE,gBAAgB;EAC/B,eAAe,EACb,+DACD;EACD,gBAAgB,YAAY,EAAE,MAAM,YAAY,CAAC;EACjD,YAAY;EACZ,eAAe,WAAoB;AACjC,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,qBAAqB,EACnB,UAAU,SACX;EACD,CAAA"}
1
+ {"version":3,"file":"ClearStorageModal-ChOg2R2R.js","names":["logger"],"sources":["../src/components/modal/modals/ClearStorageModal.tsx"],"sourcesContent":["import { clearReactorStorage } from \"@powerhousedao/connect/store\";\nimport { ConnectConfirmationModal } from \"@powerhousedao/design-system/connect\";\nimport {\n closePHModal,\n setSelectedDrive,\n setSelectedNode,\n showPHModal,\n usePHModal,\n} from \"@powerhousedao/reactor-browser\";\nimport { childLogger } from \"document-model\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nconst logger = childLogger([\"ClearStorage\"]);\n\nexport function ClearStorageModal() {\n const phModal = usePHModal();\n const open = phModal?.type === \"clearStorage\";\n const { t } = useTranslation();\n const [loading, setLoading] = useState(false);\n\n function clearStorage() {\n setLoading(true);\n clearReactorStorage()\n .then(() => {\n logger.info(\"Storage cleared\");\n setSelectedDrive(undefined);\n setSelectedNode(undefined);\n window.location.reload();\n })\n .catch((error) => {\n logger.error(\"Error clearing storage: @error\", error);\n setLoading(false);\n });\n }\n\n return (\n <ConnectConfirmationModal\n open={open}\n header={t(\"modals.connectSettings.clearStorage.confirmation.title\")}\n title={t(\"modals.connectSettings.clearStorage.confirmation.title\")}\n body={t(\"modals.connectSettings.clearStorage.confirmation.body\")}\n cancelLabel={t(\"common.cancel\")}\n continueLabel={t(\n \"modals.connectSettings.clearStorage.confirmation.clearButton\",\n )}\n onCancel={() => showPHModal({ type: \"settings\" })}\n onContinue={clearStorage}\n onOpenChange={(status: boolean) => {\n if (!status) return closePHModal();\n }}\n continueButtonProps={{\n disabled: loading,\n }}\n />\n );\n}\n"],"mappings":";;;;;;;;AAaA,MAAMA,WAAS,YAAY,CAAC,eAAe,CAAC;AAE5C,SAAgB,oBAAoB;CAElC,MAAM,OADU,YAAY,EACN,SAAS;CAC/B,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAE7C,SAAS,eAAe;AACtB,aAAW,KAAK;AAChB,uBAAqB,CAClB,WAAW;AACV,YAAO,KAAK,kBAAkB;AAC9B,oBAAiB,KAAA,EAAU;AAC3B,mBAAgB,KAAA,EAAU;AAC1B,UAAO,SAAS,QAAQ;IACxB,CACD,OAAO,UAAU;AAChB,YAAO,MAAM,kCAAkC,MAAM;AACrD,cAAW,MAAM;IACjB;;AAGN,QACE,oBAAC,0BAAD;EACQ;EACN,QAAQ,EAAE,yDAAyD;EACnE,OAAO,EAAE,yDAAyD;EAClE,MAAM,EAAE,wDAAwD;EAChE,aAAa,EAAE,gBAAgB;EAC/B,eAAe,EACb,+DACD;EACD,gBAAgB,YAAY,EAAE,MAAM,YAAY,CAAC;EACjD,YAAY;EACZ,eAAe,WAAoB;AACjC,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,qBAAqB,EACnB,UAAU,SACX;EACD,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { c as subscribeReactorPgMajor, o as loadPgDump, r as getCachedReactorPgMajor, s as resolvePgMajorForRuntime } from "./pglite-runtime-BS9wpAs9.js";
2
2
  import { t as PENDING_PG_SEED_KEY } from "./pglite-seed-VlhY0n-A.js";
3
- import { t as clearReactorStorage } from "./reactor-CPD8Z_UP.js";
3
+ import { t as clearReactorStorage } from "./reactor-C0_wHi3h.js";
4
4
  import { DocumentIntegrityService, InMemoryQueue, REACTOR_SCHEMA, closePHModal, useConnectionStates, useDatabase, usePGlite, usePHModal, useReactorClientModule, useSync } from "@powerhousedao/reactor-browser";
5
5
  import { useCallback, useMemo, useSyncExternalStore } from "react";
6
6
  import { InspectorModal as InspectorModal$1 } from "@powerhousedao/design-system/connect";
@@ -363,4 +363,4 @@ const InspectorModal = () => {
363
363
  //#endregion
364
364
  export { InspectorModal };
365
365
 
366
- //# sourceMappingURL=InspectorModal-DmKsFb2H.js.map
366
+ //# sourceMappingURL=InspectorModal-jZNPdfP4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InspectorModal-DmKsFb2H.js","names":["ConnectInspectorModal"],"sources":["../src/components/modal/modals/InspectorModal/useDbExplorer.ts","../src/components/modal/modals/InspectorModal/useDebugInspector.ts","../src/components/modal/modals/InspectorModal/useIntegrityInspector.ts","../src/components/modal/modals/InspectorModal/useProcessorsInspector.ts","../src/components/modal/modals/InspectorModal/useQueueInspector.ts","../src/components/modal/modals/InspectorModal/useRemotesInspector.ts","../src/components/modal/modals/InspectorModal/InspectorModal.tsx"],"sourcesContent":["import {\n getCachedReactorPgMajor,\n loadPgDump,\n resolvePgMajorForRuntime,\n} from \"@powerhousedao/connect/utils\";\nimport type {\n FilterGroup,\n SortOptions,\n} from \"@powerhousedao/design-system/connect\";\nimport {\n REACTOR_SCHEMA,\n useDatabase,\n usePGlite,\n useReactorClientModule,\n type IQueue,\n} from \"@powerhousedao/reactor-browser\";\nimport { sql } from \"kysely\";\nimport { useCallback } from \"react\";\n\nasync function quiesceQueue(queue: IQueue): Promise<void> {\n await new Promise<void>((resolve) => queue.block(() => resolve()));\n}\n\n// The reactor runs with `relaxedDurability: true`, which makes PGlite's\n// `syncToFs()` fire the IDBFS→IndexedDB write and return without awaiting\n// Emscripten's syncfs callback. `close()` also doesn't flush. Calling\n// `FS.syncfs(false, cb)` directly gives us a callback that fires from the\n// IDBFS transaction's `oncomplete` — i.e. after IDB has actually committed.\nasync function syncPgliteToIdb(pglite: {\n readonly Module: {\n readonly FS: {\n syncfs(populate: boolean, cb: (err: Error | null) => void): void;\n };\n };\n}): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n pglite.Module.FS.syncfs(false, (err) => (err ? reject(err) : resolve()));\n });\n}\n\ntype ColumnInfo = {\n readonly name: string;\n readonly dataType: string;\n readonly isNullable: boolean;\n};\n\ntype TableInfo = {\n readonly name: string;\n readonly columns: ColumnInfo[];\n};\n\ntype ColumnRow = {\n table_name: string;\n column_name: string;\n data_type: string;\n is_nullable: string;\n};\n\ntype GetTableRowsOptions = {\n readonly schema?: string;\n readonly limit: number;\n readonly offset: number;\n readonly sort?: SortOptions;\n readonly filters?: FilterGroup;\n};\n\ntype TablePage = {\n readonly columns: string[];\n readonly rows: Record<string, unknown>[];\n readonly total: number | null;\n};\n\nconst PRIORITY_COLUMNS = [\n \"documentType\",\n \"documentId\",\n \"scope\",\n \"branch\",\n \"index\",\n \"skip\",\n] as const;\n\nexport function useDbExplorer() {\n const database = useDatabase();\n const pglite = usePGlite();\n const reactorClientModule = useReactorClientModule();\n const reactor = reactorClientModule?.reactorModule?.reactor;\n const queue = reactorClientModule?.reactorModule?.queue;\n\n const getTables = useCallback(async (): Promise<TableInfo[]> => {\n if (!database) return [];\n\n const result = await sql<ColumnRow>`\n SELECT\n c.table_name,\n c.column_name,\n c.data_type,\n c.is_nullable\n FROM information_schema.columns c\n INNER JOIN information_schema.tables t\n ON c.table_name = t.table_name\n AND c.table_schema = t.table_schema\n WHERE c.table_schema = ${REACTOR_SCHEMA}\n AND t.table_type = 'BASE TABLE'\n ORDER BY c.table_name, c.ordinal_position\n `.execute(database);\n\n const tableMap = new Map<string, ColumnInfo[]>();\n for (const row of result.rows) {\n if (!tableMap.has(row.table_name)) {\n tableMap.set(row.table_name, []);\n }\n tableMap.get(row.table_name)!.push({\n name: row.column_name,\n dataType: row.data_type,\n isNullable: row.is_nullable === \"YES\",\n });\n }\n\n return Array.from(tableMap).map(([name, columns]) => {\n const columnNames = columns.map((col) => col.name);\n const orderedColumns = [\n ...PRIORITY_COLUMNS.filter((col) => columnNames.includes(col)).map(\n (col) => columns.find((c) => c.name === col)!,\n ),\n ...columns.filter(\n (col) =>\n !PRIORITY_COLUMNS.includes(\n col.name as (typeof PRIORITY_COLUMNS)[number],\n ),\n ),\n ];\n return {\n name,\n columns: orderedColumns,\n };\n });\n }, [database]);\n\n const getTableRows = useCallback(\n async (table: string, options: GetTableRowsOptions): Promise<TablePage> => {\n if (!database) {\n return { columns: [], rows: [], total: null };\n }\n\n const limit = options.limit;\n const offset = options.offset;\n const sort = options.sort;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const filters = options.filters;\n const tableRef = sql.raw(`${REACTOR_SCHEMA}.\"${table}\"`);\n\n // Build WHERE clause from filters\n let whereClause = sql``;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (filters?.clauses && filters.clauses.length > 0) {\n const conditions: ReturnType<typeof sql>[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n for (let i = 0; i < filters.clauses.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const clause = filters.clauses[i];\n if (!clause) continue;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const columnRef = sql.raw(`\"${clause.column}\"`);\n\n let condition: ReturnType<typeof sql>;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (clause.operator === \"IS NULL\") {\n condition = sql`${columnRef} IS NULL`;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n } else if (clause.operator === \"IS NOT NULL\") {\n condition = sql`${columnRef} IS NOT NULL`;\n } else if (\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n clause.operator === \"LIKE\" ||\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n clause.operator === \"ILIKE\"\n ) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const value = clause.value;\n const operator =\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n clause.operator === \"LIKE\" ? sql`LIKE` : sql`ILIKE`;\n condition = sql`${columnRef} ${operator} ${value}`;\n } else {\n // For =, !=, >, <, >=, <=\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument\n const operator = sql.raw(clause.operator);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const value = clause.value;\n\n // Try to parse as number if it looks like a number\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n let parsedValue: string | number = value;\n if (\n value !== \"\" &&\n !isNaN(Number(value)) &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n value.trim() !== \"\"\n ) {\n parsedValue = Number(value);\n }\n\n condition = sql`${columnRef} ${operator} ${parsedValue}`;\n }\n\n conditions.push(condition);\n\n // Add connector if not the last clause\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (i < filters.clauses.length - 1) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const connector = filters.connectors?.[i] ?? \"AND\";\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n conditions.push(sql.raw(connector));\n }\n }\n\n // Combine all conditions\n if (conditions.length > 0) {\n whereClause = sql`WHERE ${sql.join(conditions, sql` `)}`;\n }\n }\n\n // Build main query\n let query;\n if (sort) {\n const columnRef = sql.raw(`\"${sort.column}\"`);\n const direction = sort.direction === \"desc\" ? sql`DESC` : sql`ASC`;\n query = sql<Record<string, unknown>>`\n SELECT * FROM ${tableRef}\n ${whereClause}\n ORDER BY ${columnRef} ${direction}\n LIMIT ${limit} OFFSET ${offset}\n `;\n } else {\n query = sql<Record<string, unknown>>`\n SELECT * FROM ${tableRef}\n ${whereClause}\n LIMIT ${limit} OFFSET ${offset}\n `;\n }\n\n const result = await query.execute(database);\n\n // Build count query with same filters\n const countQuery = sql<{ count: string }>`\n SELECT COUNT(*) as count FROM ${tableRef}\n ${whereClause}\n `;\n const countResult = await countQuery.execute(database);\n const total = countResult.rows[0]\n ? parseInt(countResult.rows[0].count, 10)\n : null;\n\n const rawColumns =\n result.rows.length > 0 ? Object.keys(result.rows[0]) : [];\n const columns = [\n ...PRIORITY_COLUMNS.filter((col) => rawColumns.includes(col)),\n ...rawColumns.filter(\n (col) =>\n !PRIORITY_COLUMNS.includes(\n col as (typeof PRIORITY_COLUMNS)[number],\n ),\n ),\n ];\n\n return {\n columns,\n rows: result.rows,\n total,\n };\n },\n [database],\n );\n\n const onExportDb = useCallback(async () => {\n if (!pglite) return;\n\n if (queue) await quiesceQueue(queue);\n\n try {\n const major = resolvePgMajorForRuntime(getCachedReactorPgMajor() ?? null);\n const pgDump = await loadPgDump(major);\n const dump = await pgDump({ pg: pglite });\n const sqlContent = await dump.text();\n\n const blob = new Blob([sqlContent], { type: \"text/sql\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `database-export-${Date.now()}.sql`;\n a.click();\n URL.revokeObjectURL(url);\n } finally {\n queue?.unblock();\n }\n }, [pglite, queue]);\n\n const onImportDb = useCallback(\n async (sqlContent: string) => {\n if (!pglite) return;\n\n if (queue) await quiesceQueue(queue);\n\n if (reactor) {\n const status = reactor.kill();\n await status.completed;\n }\n\n // Drop every user-created schema before restoring. Processors may own\n // schemas beyond `reactor`, so dropping only that one leaves orphans\n // whose tables collide with whatever the dump recreates. The dump\n // itself emits `CREATE SCHEMA ...;` statements, so we don't pre-create.\n // `standard_conforming_strings=off` matches pg_dump's escape-string\n // literals so doubled backslashes in JSONB collapse correctly.\n await pglite.transaction(async (tx) => {\n const schemas = await tx.query<{ nspname: string }>(\n `SELECT nspname FROM pg_namespace\n WHERE nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema', 'public')\n AND nspname NOT LIKE 'pg_temp_%'\n AND nspname NOT LIKE 'pg_toast_temp_%'`,\n );\n for (const { nspname } of schemas.rows) {\n await tx.exec(`DROP SCHEMA IF EXISTS \"${nspname}\" CASCADE`);\n }\n try {\n await tx.exec(\"SET standard_conforming_strings = off;\");\n } catch {\n // PG17 still accepts this but log if it ever fails.\n }\n await tx.exec(sqlContent);\n await tx.exec(`SET search_path TO ${REACTOR_SCHEMA}`);\n });\n\n // Flush IDBFS → IndexedDB synchronously. PGlite's own syncToFs is\n // fire-and-forget under relaxedDurability, and close() doesn't run\n // a final sync, so we drive Emscripten's syncfs directly — its\n // callback fires from the IDB transaction's oncomplete, guaranteeing\n // the writes have committed before we reload.\n await syncPgliteToIdb(pglite);\n\n window.location.reload();\n // reload() is asynchronous; without blocking here the DBExplorer caller\n // would continue and call loadTables() against an in-flight shutdown.\n await new Promise(() => {});\n },\n [pglite, queue, reactor],\n );\n\n const getDefaultSort = useCallback(\n (table: string): SortOptions | undefined => {\n if (table === \"Operation\") {\n return { column: \"timestampUtcMs\", direction: \"desc\" };\n }\n return undefined;\n },\n [],\n );\n\n return {\n getTables,\n getTableRows,\n getDefaultSort,\n onExportDb,\n onImportDb,\n };\n}\n","import { clearReactorStorage } from \"@powerhousedao/connect/store\";\nimport {\n getCachedReactorPgMajor,\n PENDING_PG_SEED_KEY,\n subscribeReactorPgMajor,\n} from \"@powerhousedao/connect/utils\";\nimport { useCallback, useSyncExternalStore } from \"react\";\n\nconst SUPPORTED_PG_VERSIONS = [16, 17] as const;\n\nexport function useDebugInspector() {\n const currentPgVersion = useSyncExternalStore(\n subscribeReactorPgMajor,\n getCachedReactorPgMajor,\n () => undefined,\n );\n\n const onResetToPgVersion = useCallback(async (major: number) => {\n console.info(`[debug-inspector] Reset requested: PG${major}`);\n try {\n localStorage.setItem(PENDING_PG_SEED_KEY, String(major));\n console.info(`[debug-inspector] Clearing reactor storage...`);\n await clearReactorStorage();\n console.info(`[debug-inspector] Storage cleared. Reloading...`);\n window.location.reload();\n } catch (err) {\n console.error(\"[debug-inspector] Reset failed:\", err);\n localStorage.removeItem(PENDING_PG_SEED_KEY);\n throw err;\n }\n }, []);\n\n return {\n supportedPgVersions: SUPPORTED_PG_VERSIONS,\n currentPgVersion: currentPgVersion ?? null,\n onResetToPgVersion,\n };\n}\n","import type { IntegrityInspectorProps } from \"@powerhousedao/design-system/connect\";\nimport {\n DocumentIntegrityService,\n useReactorClientModule,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\nexport function useIntegrityInspector(): IntegrityInspectorProps | undefined {\n const reactorClientModule = useReactorClientModule();\n const reactorModule = reactorClientModule?.reactorModule;\n\n const service = useMemo(() => {\n if (!reactorModule) return undefined;\n\n return new DocumentIntegrityService(\n reactorModule.keyframeStore,\n reactorModule.operationStore,\n reactorModule.writeCache,\n reactorModule.documentView,\n reactorModule.documentModelRegistry,\n );\n }, [reactorModule]);\n\n const onValidate = useCallback(\n async (documentId: string, branch?: string) => {\n if (!service) {\n throw new Error(\"Reactor module not available\");\n }\n return service.validateDocument(documentId, branch);\n },\n [service],\n );\n\n const onRebuildKeyframes = useCallback(\n async (documentId: string, branch?: string) => {\n if (!service) {\n throw new Error(\"Reactor module not available\");\n }\n return service.rebuildKeyframes(documentId, branch);\n },\n [service],\n );\n\n const onRebuildSnapshots = useCallback(\n async (documentId: string, branch?: string) => {\n if (!service) {\n throw new Error(\"Reactor module not available\");\n }\n return service.rebuildSnapshots(documentId, branch);\n },\n [service],\n );\n\n if (!service) {\n return undefined;\n }\n\n return {\n onValidate,\n onRebuildKeyframes,\n onRebuildSnapshots,\n };\n}\n","import type { ProcessorsInspectorProps } from \"@powerhousedao/design-system/connect\";\nimport { useReactorClientModule } from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\nexport function useProcessorsInspector(): ProcessorsInspectorProps | undefined {\n const reactorClientModule = useReactorClientModule();\n const processorManager = reactorClientModule?.reactorModule?.processorManager;\n\n const hasProcessorManager = useMemo(\n () => processorManager != null,\n [processorManager],\n );\n\n const getProcessors = useCallback(async () => {\n if (!processorManager) {\n return [];\n }\n\n return processorManager.getAll().map((tracked) => ({\n processorId: tracked.processorId,\n factoryId: tracked.factoryId,\n driveId: tracked.driveId,\n processorIndex: tracked.processorIndex,\n lastOrdinal: tracked.lastOrdinal,\n status: tracked.status,\n lastError: tracked.lastError,\n lastErrorTimestamp: tracked.lastErrorTimestamp,\n }));\n }, [processorManager]);\n\n const onRetry = useCallback(\n async (processorId: string) => {\n if (!processorManager) return;\n const tracked = processorManager.get(processorId);\n if (tracked) {\n await tracked.retry();\n }\n },\n [processorManager],\n );\n\n if (!hasProcessorManager) {\n return undefined;\n }\n\n return {\n getProcessors,\n onRetry,\n };\n}\n","import type {\n QueueInspectorProps,\n QueueState,\n} from \"@powerhousedao/design-system/connect\";\nimport {\n InMemoryQueue,\n useReactorClientModule,\n type Job,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\nexport function useQueueInspector(): QueueInspectorProps | undefined {\n const reactorClientModule = useReactorClientModule();\n const queue = reactorClientModule?.reactorModule?.queue;\n\n const inMemoryQueue = useMemo(() => {\n if (queue instanceof InMemoryQueue) {\n return queue;\n }\n return undefined;\n }, [queue]);\n\n const getQueueState = useCallback(async (): Promise<QueueState> => {\n if (!inMemoryQueue) {\n return {\n isPaused: false,\n pendingJobs: [],\n executingJobs: [],\n totalPending: 0,\n totalExecuting: 0,\n };\n }\n\n const pendingJobs = inMemoryQueue.getPendingJobs();\n const executingJobIds = inMemoryQueue.getExecutingJobIds();\n\n const executingJobs: Job[] = [];\n for (const jobIdSet of executingJobIds.values()) {\n for (const jobId of jobIdSet) {\n const job = inMemoryQueue.getJob(jobId);\n if (job) {\n executingJobs.push(job);\n }\n }\n }\n\n return {\n isPaused: inMemoryQueue.paused,\n pendingJobs,\n executingJobs,\n totalPending: pendingJobs.length,\n totalExecuting: executingJobs.length,\n };\n }, [inMemoryQueue]);\n\n const onPause = useCallback(async (): Promise<void> => {\n if (inMemoryQueue) {\n inMemoryQueue.pause();\n }\n }, [inMemoryQueue]);\n\n const onResume = useCallback(async (): Promise<void> => {\n if (inMemoryQueue) {\n await inMemoryQueue.resume();\n }\n }, [inMemoryQueue]);\n\n if (!inMemoryQueue) {\n return undefined;\n }\n\n return {\n getQueueState,\n onPause,\n onResume,\n };\n}\n","import type {\n ConnectionStateSnapshot,\n Remote,\n} from \"@powerhousedao/reactor-browser\";\nimport { useConnectionStates, useSync } from \"@powerhousedao/reactor-browser\";\nimport { useCallback } from \"react\";\n\nexport function useRemotesInspector(): {\n getRemotes: () => Promise<Remote[]>;\n removeRemote: (name: string) => Promise<void>;\n connectionStates: ReadonlyMap<string, ConnectionStateSnapshot>;\n} {\n const syncManager = useSync();\n if (!syncManager) {\n throw new Error(\"Sync manager not found\");\n }\n\n const connectionStates = useConnectionStates();\n\n const getRemotes = useCallback(() => {\n return Promise.resolve(syncManager.list());\n }, [syncManager]);\n\n const removeRemote = useCallback(\n (name: string) => syncManager.remove(name),\n [syncManager],\n );\n\n return {\n getRemotes,\n removeRemote,\n connectionStates,\n };\n}\n","import { InspectorModal as ConnectInspectorModal } from \"@powerhousedao/design-system/connect\";\nimport { REACTOR_SCHEMA } from \"@powerhousedao/reactor-browser\";\nimport { closePHModal, usePHModal } from \"@powerhousedao/reactor-browser\";\nimport { useDbExplorer } from \"./useDbExplorer.js\";\nimport { useDebugInspector } from \"./useDebugInspector.js\";\nimport { useIntegrityInspector } from \"./useIntegrityInspector.js\";\nimport { useProcessorsInspector } from \"./useProcessorsInspector.js\";\nimport { useQueueInspector } from \"./useQueueInspector.js\";\nimport { useRemotesInspector } from \"./useRemotesInspector.js\";\n\nconst DEFAULT_PAGE_SIZE = 25;\n\nexport const InspectorModal: React.FC = () => {\n const phModal = usePHModal();\n const open = phModal?.type === \"inspector\";\n\n const { getTables, getTableRows, getDefaultSort, onExportDb, onImportDb } =\n useDbExplorer();\n const { getRemotes, removeRemote, connectionStates } = useRemotesInspector();\n const queueInspectorProps = useQueueInspector();\n const processorsInspectorProps = useProcessorsInspector();\n const integrityInspectorProps = useIntegrityInspector();\n const { currentPgVersion, supportedPgVersions, onResetToPgVersion } =\n useDebugInspector();\n\n return (\n <ConnectInspectorModal\n open={open}\n onOpenChange={(status) => {\n if (!status) closePHModal();\n }}\n dbExplorerProps={{\n schema: REACTOR_SCHEMA,\n getTables,\n getTableRows,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n getDefaultSort,\n pageSize: DEFAULT_PAGE_SIZE,\n onExportDb,\n onImportDb,\n pgVersionControl: {\n currentPgVersion,\n supportedPgVersions,\n onResetToPgVersion,\n },\n }}\n remotesInspectorProps={{\n getRemotes,\n removeRemote,\n connectionStates,\n }}\n queueInspectorProps={queueInspectorProps}\n processorsInspectorProps={processorsInspectorProps}\n integrityInspectorProps={integrityInspectorProps}\n />\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"InspectorModal-jZNPdfP4.js","names":["ConnectInspectorModal"],"sources":["../src/components/modal/modals/InspectorModal/useDbExplorer.ts","../src/components/modal/modals/InspectorModal/useDebugInspector.ts","../src/components/modal/modals/InspectorModal/useIntegrityInspector.ts","../src/components/modal/modals/InspectorModal/useProcessorsInspector.ts","../src/components/modal/modals/InspectorModal/useQueueInspector.ts","../src/components/modal/modals/InspectorModal/useRemotesInspector.ts","../src/components/modal/modals/InspectorModal/InspectorModal.tsx"],"sourcesContent":["import {\n getCachedReactorPgMajor,\n loadPgDump,\n resolvePgMajorForRuntime,\n} from \"@powerhousedao/connect/utils\";\nimport type {\n FilterGroup,\n SortOptions,\n} from \"@powerhousedao/design-system/connect\";\nimport {\n REACTOR_SCHEMA,\n useDatabase,\n usePGlite,\n useReactorClientModule,\n type IQueue,\n} from \"@powerhousedao/reactor-browser\";\nimport { sql } from \"kysely\";\nimport { useCallback } from \"react\";\n\nasync function quiesceQueue(queue: IQueue): Promise<void> {\n await new Promise<void>((resolve) => queue.block(() => resolve()));\n}\n\n// The reactor runs with `relaxedDurability: true`, which makes PGlite's\n// `syncToFs()` fire the IDBFS→IndexedDB write and return without awaiting\n// Emscripten's syncfs callback. `close()` also doesn't flush. Calling\n// `FS.syncfs(false, cb)` directly gives us a callback that fires from the\n// IDBFS transaction's `oncomplete` — i.e. after IDB has actually committed.\nasync function syncPgliteToIdb(pglite: {\n readonly Module: {\n readonly FS: {\n syncfs(populate: boolean, cb: (err: Error | null) => void): void;\n };\n };\n}): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n pglite.Module.FS.syncfs(false, (err) => (err ? reject(err) : resolve()));\n });\n}\n\ntype ColumnInfo = {\n readonly name: string;\n readonly dataType: string;\n readonly isNullable: boolean;\n};\n\ntype TableInfo = {\n readonly name: string;\n readonly columns: ColumnInfo[];\n};\n\ntype ColumnRow = {\n table_name: string;\n column_name: string;\n data_type: string;\n is_nullable: string;\n};\n\ntype GetTableRowsOptions = {\n readonly schema?: string;\n readonly limit: number;\n readonly offset: number;\n readonly sort?: SortOptions;\n readonly filters?: FilterGroup;\n};\n\ntype TablePage = {\n readonly columns: string[];\n readonly rows: Record<string, unknown>[];\n readonly total: number | null;\n};\n\nconst PRIORITY_COLUMNS = [\n \"documentType\",\n \"documentId\",\n \"scope\",\n \"branch\",\n \"index\",\n \"skip\",\n] as const;\n\nexport function useDbExplorer() {\n const database = useDatabase();\n const pglite = usePGlite();\n const reactorClientModule = useReactorClientModule();\n const reactor = reactorClientModule?.reactorModule?.reactor;\n const queue = reactorClientModule?.reactorModule?.queue;\n\n const getTables = useCallback(async (): Promise<TableInfo[]> => {\n if (!database) return [];\n\n const result = await sql<ColumnRow>`\n SELECT\n c.table_name,\n c.column_name,\n c.data_type,\n c.is_nullable\n FROM information_schema.columns c\n INNER JOIN information_schema.tables t\n ON c.table_name = t.table_name\n AND c.table_schema = t.table_schema\n WHERE c.table_schema = ${REACTOR_SCHEMA}\n AND t.table_type = 'BASE TABLE'\n ORDER BY c.table_name, c.ordinal_position\n `.execute(database);\n\n const tableMap = new Map<string, ColumnInfo[]>();\n for (const row of result.rows) {\n if (!tableMap.has(row.table_name)) {\n tableMap.set(row.table_name, []);\n }\n tableMap.get(row.table_name)!.push({\n name: row.column_name,\n dataType: row.data_type,\n isNullable: row.is_nullable === \"YES\",\n });\n }\n\n return Array.from(tableMap).map(([name, columns]) => {\n const columnNames = columns.map((col) => col.name);\n const orderedColumns = [\n ...PRIORITY_COLUMNS.filter((col) => columnNames.includes(col)).map(\n (col) => columns.find((c) => c.name === col)!,\n ),\n ...columns.filter(\n (col) =>\n !PRIORITY_COLUMNS.includes(\n col.name as (typeof PRIORITY_COLUMNS)[number],\n ),\n ),\n ];\n return {\n name,\n columns: orderedColumns,\n };\n });\n }, [database]);\n\n const getTableRows = useCallback(\n async (table: string, options: GetTableRowsOptions): Promise<TablePage> => {\n if (!database) {\n return { columns: [], rows: [], total: null };\n }\n\n const limit = options.limit;\n const offset = options.offset;\n const sort = options.sort;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const filters = options.filters;\n const tableRef = sql.raw(`${REACTOR_SCHEMA}.\"${table}\"`);\n\n // Build WHERE clause from filters\n let whereClause = sql``;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (filters?.clauses && filters.clauses.length > 0) {\n const conditions: ReturnType<typeof sql>[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n for (let i = 0; i < filters.clauses.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const clause = filters.clauses[i];\n if (!clause) continue;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const columnRef = sql.raw(`\"${clause.column}\"`);\n\n let condition: ReturnType<typeof sql>;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (clause.operator === \"IS NULL\") {\n condition = sql`${columnRef} IS NULL`;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n } else if (clause.operator === \"IS NOT NULL\") {\n condition = sql`${columnRef} IS NOT NULL`;\n } else if (\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n clause.operator === \"LIKE\" ||\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n clause.operator === \"ILIKE\"\n ) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const value = clause.value;\n const operator =\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n clause.operator === \"LIKE\" ? sql`LIKE` : sql`ILIKE`;\n condition = sql`${columnRef} ${operator} ${value}`;\n } else {\n // For =, !=, >, <, >=, <=\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument\n const operator = sql.raw(clause.operator);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const value = clause.value;\n\n // Try to parse as number if it looks like a number\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n let parsedValue: string | number = value;\n if (\n value !== \"\" &&\n !isNaN(Number(value)) &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n value.trim() !== \"\"\n ) {\n parsedValue = Number(value);\n }\n\n condition = sql`${columnRef} ${operator} ${parsedValue}`;\n }\n\n conditions.push(condition);\n\n // Add connector if not the last clause\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (i < filters.clauses.length - 1) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const connector = filters.connectors?.[i] ?? \"AND\";\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n conditions.push(sql.raw(connector));\n }\n }\n\n // Combine all conditions\n if (conditions.length > 0) {\n whereClause = sql`WHERE ${sql.join(conditions, sql` `)}`;\n }\n }\n\n // Build main query\n let query;\n if (sort) {\n const columnRef = sql.raw(`\"${sort.column}\"`);\n const direction = sort.direction === \"desc\" ? sql`DESC` : sql`ASC`;\n query = sql<Record<string, unknown>>`\n SELECT * FROM ${tableRef}\n ${whereClause}\n ORDER BY ${columnRef} ${direction}\n LIMIT ${limit} OFFSET ${offset}\n `;\n } else {\n query = sql<Record<string, unknown>>`\n SELECT * FROM ${tableRef}\n ${whereClause}\n LIMIT ${limit} OFFSET ${offset}\n `;\n }\n\n const result = await query.execute(database);\n\n // Build count query with same filters\n const countQuery = sql<{ count: string }>`\n SELECT COUNT(*) as count FROM ${tableRef}\n ${whereClause}\n `;\n const countResult = await countQuery.execute(database);\n const total = countResult.rows[0]\n ? parseInt(countResult.rows[0].count, 10)\n : null;\n\n const rawColumns =\n result.rows.length > 0 ? Object.keys(result.rows[0]) : [];\n const columns = [\n ...PRIORITY_COLUMNS.filter((col) => rawColumns.includes(col)),\n ...rawColumns.filter(\n (col) =>\n !PRIORITY_COLUMNS.includes(\n col as (typeof PRIORITY_COLUMNS)[number],\n ),\n ),\n ];\n\n return {\n columns,\n rows: result.rows,\n total,\n };\n },\n [database],\n );\n\n const onExportDb = useCallback(async () => {\n if (!pglite) return;\n\n if (queue) await quiesceQueue(queue);\n\n try {\n const major = resolvePgMajorForRuntime(getCachedReactorPgMajor() ?? null);\n const pgDump = await loadPgDump(major);\n const dump = await pgDump({ pg: pglite });\n const sqlContent = await dump.text();\n\n const blob = new Blob([sqlContent], { type: \"text/sql\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `database-export-${Date.now()}.sql`;\n a.click();\n URL.revokeObjectURL(url);\n } finally {\n queue?.unblock();\n }\n }, [pglite, queue]);\n\n const onImportDb = useCallback(\n async (sqlContent: string) => {\n if (!pglite) return;\n\n if (queue) await quiesceQueue(queue);\n\n if (reactor) {\n const status = reactor.kill();\n await status.completed;\n }\n\n // Drop every user-created schema before restoring. Processors may own\n // schemas beyond `reactor`, so dropping only that one leaves orphans\n // whose tables collide with whatever the dump recreates. The dump\n // itself emits `CREATE SCHEMA ...;` statements, so we don't pre-create.\n // `standard_conforming_strings=off` matches pg_dump's escape-string\n // literals so doubled backslashes in JSONB collapse correctly.\n await pglite.transaction(async (tx) => {\n const schemas = await tx.query<{ nspname: string }>(\n `SELECT nspname FROM pg_namespace\n WHERE nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema', 'public')\n AND nspname NOT LIKE 'pg_temp_%'\n AND nspname NOT LIKE 'pg_toast_temp_%'`,\n );\n for (const { nspname } of schemas.rows) {\n await tx.exec(`DROP SCHEMA IF EXISTS \"${nspname}\" CASCADE`);\n }\n try {\n await tx.exec(\"SET standard_conforming_strings = off;\");\n } catch {\n // PG17 still accepts this but log if it ever fails.\n }\n await tx.exec(sqlContent);\n await tx.exec(`SET search_path TO ${REACTOR_SCHEMA}`);\n });\n\n // Flush IDBFS → IndexedDB synchronously. PGlite's own syncToFs is\n // fire-and-forget under relaxedDurability, and close() doesn't run\n // a final sync, so we drive Emscripten's syncfs directly — its\n // callback fires from the IDB transaction's oncomplete, guaranteeing\n // the writes have committed before we reload.\n await syncPgliteToIdb(pglite);\n\n window.location.reload();\n // reload() is asynchronous; without blocking here the DBExplorer caller\n // would continue and call loadTables() against an in-flight shutdown.\n await new Promise(() => {});\n },\n [pglite, queue, reactor],\n );\n\n const getDefaultSort = useCallback(\n (table: string): SortOptions | undefined => {\n if (table === \"Operation\") {\n return { column: \"timestampUtcMs\", direction: \"desc\" };\n }\n return undefined;\n },\n [],\n );\n\n return {\n getTables,\n getTableRows,\n getDefaultSort,\n onExportDb,\n onImportDb,\n };\n}\n","import { clearReactorStorage } from \"@powerhousedao/connect/store\";\nimport {\n getCachedReactorPgMajor,\n PENDING_PG_SEED_KEY,\n subscribeReactorPgMajor,\n} from \"@powerhousedao/connect/utils\";\nimport { useCallback, useSyncExternalStore } from \"react\";\n\nconst SUPPORTED_PG_VERSIONS = [16, 17] as const;\n\nexport function useDebugInspector() {\n const currentPgVersion = useSyncExternalStore(\n subscribeReactorPgMajor,\n getCachedReactorPgMajor,\n () => undefined,\n );\n\n const onResetToPgVersion = useCallback(async (major: number) => {\n console.info(`[debug-inspector] Reset requested: PG${major}`);\n try {\n localStorage.setItem(PENDING_PG_SEED_KEY, String(major));\n console.info(`[debug-inspector] Clearing reactor storage...`);\n await clearReactorStorage();\n console.info(`[debug-inspector] Storage cleared. Reloading...`);\n window.location.reload();\n } catch (err) {\n console.error(\"[debug-inspector] Reset failed:\", err);\n localStorage.removeItem(PENDING_PG_SEED_KEY);\n throw err;\n }\n }, []);\n\n return {\n supportedPgVersions: SUPPORTED_PG_VERSIONS,\n currentPgVersion: currentPgVersion ?? null,\n onResetToPgVersion,\n };\n}\n","import type { IntegrityInspectorProps } from \"@powerhousedao/design-system/connect\";\nimport {\n DocumentIntegrityService,\n useReactorClientModule,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\nexport function useIntegrityInspector(): IntegrityInspectorProps | undefined {\n const reactorClientModule = useReactorClientModule();\n const reactorModule = reactorClientModule?.reactorModule;\n\n const service = useMemo(() => {\n if (!reactorModule) return undefined;\n\n return new DocumentIntegrityService(\n reactorModule.keyframeStore,\n reactorModule.operationStore,\n reactorModule.writeCache,\n reactorModule.documentView,\n reactorModule.documentModelRegistry,\n );\n }, [reactorModule]);\n\n const onValidate = useCallback(\n async (documentId: string, branch?: string) => {\n if (!service) {\n throw new Error(\"Reactor module not available\");\n }\n return service.validateDocument(documentId, branch);\n },\n [service],\n );\n\n const onRebuildKeyframes = useCallback(\n async (documentId: string, branch?: string) => {\n if (!service) {\n throw new Error(\"Reactor module not available\");\n }\n return service.rebuildKeyframes(documentId, branch);\n },\n [service],\n );\n\n const onRebuildSnapshots = useCallback(\n async (documentId: string, branch?: string) => {\n if (!service) {\n throw new Error(\"Reactor module not available\");\n }\n return service.rebuildSnapshots(documentId, branch);\n },\n [service],\n );\n\n if (!service) {\n return undefined;\n }\n\n return {\n onValidate,\n onRebuildKeyframes,\n onRebuildSnapshots,\n };\n}\n","import type { ProcessorsInspectorProps } from \"@powerhousedao/design-system/connect\";\nimport { useReactorClientModule } from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\nexport function useProcessorsInspector(): ProcessorsInspectorProps | undefined {\n const reactorClientModule = useReactorClientModule();\n const processorManager = reactorClientModule?.reactorModule?.processorManager;\n\n const hasProcessorManager = useMemo(\n () => processorManager != null,\n [processorManager],\n );\n\n const getProcessors = useCallback(async () => {\n if (!processorManager) {\n return [];\n }\n\n return processorManager.getAll().map((tracked) => ({\n processorId: tracked.processorId,\n factoryId: tracked.factoryId,\n driveId: tracked.driveId,\n processorIndex: tracked.processorIndex,\n lastOrdinal: tracked.lastOrdinal,\n status: tracked.status,\n lastError: tracked.lastError,\n lastErrorTimestamp: tracked.lastErrorTimestamp,\n }));\n }, [processorManager]);\n\n const onRetry = useCallback(\n async (processorId: string) => {\n if (!processorManager) return;\n const tracked = processorManager.get(processorId);\n if (tracked) {\n await tracked.retry();\n }\n },\n [processorManager],\n );\n\n if (!hasProcessorManager) {\n return undefined;\n }\n\n return {\n getProcessors,\n onRetry,\n };\n}\n","import type {\n QueueInspectorProps,\n QueueState,\n} from \"@powerhousedao/design-system/connect\";\nimport {\n InMemoryQueue,\n useReactorClientModule,\n type Job,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\nexport function useQueueInspector(): QueueInspectorProps | undefined {\n const reactorClientModule = useReactorClientModule();\n const queue = reactorClientModule?.reactorModule?.queue;\n\n const inMemoryQueue = useMemo(() => {\n if (queue instanceof InMemoryQueue) {\n return queue;\n }\n return undefined;\n }, [queue]);\n\n const getQueueState = useCallback(async (): Promise<QueueState> => {\n if (!inMemoryQueue) {\n return {\n isPaused: false,\n pendingJobs: [],\n executingJobs: [],\n totalPending: 0,\n totalExecuting: 0,\n };\n }\n\n const pendingJobs = inMemoryQueue.getPendingJobs();\n const executingJobIds = inMemoryQueue.getExecutingJobIds();\n\n const executingJobs: Job[] = [];\n for (const jobIdSet of executingJobIds.values()) {\n for (const jobId of jobIdSet) {\n const job = inMemoryQueue.getJob(jobId);\n if (job) {\n executingJobs.push(job);\n }\n }\n }\n\n return {\n isPaused: inMemoryQueue.paused,\n pendingJobs,\n executingJobs,\n totalPending: pendingJobs.length,\n totalExecuting: executingJobs.length,\n };\n }, [inMemoryQueue]);\n\n const onPause = useCallback(async (): Promise<void> => {\n if (inMemoryQueue) {\n inMemoryQueue.pause();\n }\n }, [inMemoryQueue]);\n\n const onResume = useCallback(async (): Promise<void> => {\n if (inMemoryQueue) {\n await inMemoryQueue.resume();\n }\n }, [inMemoryQueue]);\n\n if (!inMemoryQueue) {\n return undefined;\n }\n\n return {\n getQueueState,\n onPause,\n onResume,\n };\n}\n","import type {\n ConnectionStateSnapshot,\n Remote,\n} from \"@powerhousedao/reactor-browser\";\nimport { useConnectionStates, useSync } from \"@powerhousedao/reactor-browser\";\nimport { useCallback } from \"react\";\n\nexport function useRemotesInspector(): {\n getRemotes: () => Promise<Remote[]>;\n removeRemote: (name: string) => Promise<void>;\n connectionStates: ReadonlyMap<string, ConnectionStateSnapshot>;\n} {\n const syncManager = useSync();\n if (!syncManager) {\n throw new Error(\"Sync manager not found\");\n }\n\n const connectionStates = useConnectionStates();\n\n const getRemotes = useCallback(() => {\n return Promise.resolve(syncManager.list());\n }, [syncManager]);\n\n const removeRemote = useCallback(\n (name: string) => syncManager.remove(name),\n [syncManager],\n );\n\n return {\n getRemotes,\n removeRemote,\n connectionStates,\n };\n}\n","import { InspectorModal as ConnectInspectorModal } from \"@powerhousedao/design-system/connect\";\nimport { REACTOR_SCHEMA } from \"@powerhousedao/reactor-browser\";\nimport { closePHModal, usePHModal } from \"@powerhousedao/reactor-browser\";\nimport { useDbExplorer } from \"./useDbExplorer.js\";\nimport { useDebugInspector } from \"./useDebugInspector.js\";\nimport { useIntegrityInspector } from \"./useIntegrityInspector.js\";\nimport { useProcessorsInspector } from \"./useProcessorsInspector.js\";\nimport { useQueueInspector } from \"./useQueueInspector.js\";\nimport { useRemotesInspector } from \"./useRemotesInspector.js\";\n\nconst DEFAULT_PAGE_SIZE = 25;\n\nexport const InspectorModal: React.FC = () => {\n const phModal = usePHModal();\n const open = phModal?.type === \"inspector\";\n\n const { getTables, getTableRows, getDefaultSort, onExportDb, onImportDb } =\n useDbExplorer();\n const { getRemotes, removeRemote, connectionStates } = useRemotesInspector();\n const queueInspectorProps = useQueueInspector();\n const processorsInspectorProps = useProcessorsInspector();\n const integrityInspectorProps = useIntegrityInspector();\n const { currentPgVersion, supportedPgVersions, onResetToPgVersion } =\n useDebugInspector();\n\n return (\n <ConnectInspectorModal\n open={open}\n onOpenChange={(status) => {\n if (!status) closePHModal();\n }}\n dbExplorerProps={{\n schema: REACTOR_SCHEMA,\n getTables,\n getTableRows,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n getDefaultSort,\n pageSize: DEFAULT_PAGE_SIZE,\n onExportDb,\n onImportDb,\n pgVersionControl: {\n currentPgVersion,\n supportedPgVersions,\n onResetToPgVersion,\n },\n }}\n remotesInspectorProps={{\n getRemotes,\n removeRemote,\n connectionStates,\n }}\n queueInspectorProps={queueInspectorProps}\n processorsInspectorProps={processorsInspectorProps}\n integrityInspectorProps={integrityInspectorProps}\n />\n );\n};\n"],"mappings":";;;;;;;;;AAmBA,eAAe,aAAa,OAA8B;AACxD,OAAM,IAAI,SAAe,YAAY,MAAM,YAAY,SAAS,CAAC,CAAC;;AAQpE,eAAe,gBAAgB,QAMb;AAChB,OAAM,IAAI,SAAe,SAAS,WAAW;AAC3C,SAAO,OAAO,GAAG,OAAO,QAAQ,QAAS,MAAM,OAAO,IAAI,GAAG,SAAS,CAAE;GACxE;;AAmCJ,MAAM,mBAAmB;CACvB;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,gBAAgB;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,SAAS,WAAW;CAC1B,MAAM,sBAAsB,wBAAwB;CACpD,MAAM,UAAU,qBAAqB,eAAe;CACpD,MAAM,QAAQ,qBAAqB,eAAe;CAElD,MAAM,YAAY,YAAY,YAAkC;AAC9D,MAAI,CAAC,SAAU,QAAO,EAAE;EAExB,MAAM,SAAS,MAAM,GAAc;;;;;;;;;;+BAUR,eAAe;;;MAGxC,QAAQ,SAAS;EAEnB,MAAM,2BAAW,IAAI,KAA2B;AAChD,OAAK,MAAM,OAAO,OAAO,MAAM;AAC7B,OAAI,CAAC,SAAS,IAAI,IAAI,WAAW,CAC/B,UAAS,IAAI,IAAI,YAAY,EAAE,CAAC;AAElC,YAAS,IAAI,IAAI,WAAW,CAAE,KAAK;IACjC,MAAM,IAAI;IACV,UAAU,IAAI;IACd,YAAY,IAAI,gBAAgB;IACjC,CAAC;;AAGJ,SAAO,MAAM,KAAK,SAAS,CAAC,KAAK,CAAC,MAAM,aAAa;GACnD,MAAM,cAAc,QAAQ,KAAK,QAAQ,IAAI,KAAK;AAYlD,UAAO;IACL;IACA,SAbqB,CACrB,GAAG,iBAAiB,QAAQ,QAAQ,YAAY,SAAS,IAAI,CAAC,CAAC,KAC5D,QAAQ,QAAQ,MAAM,MAAM,EAAE,SAAS,IAAI,CAC7C,EACD,GAAG,QAAQ,QACR,QACC,CAAC,iBAAiB,SAChB,IAAI,KACL,CACJ,CACF;IAIA;IACD;IACD,CAAC,SAAS,CAAC;CAEd,MAAM,eAAe,YACnB,OAAO,OAAe,YAAqD;AACzE,MAAI,CAAC,SACH,QAAO;GAAE,SAAS,EAAE;GAAE,MAAM,EAAE;GAAE,OAAO;GAAM;EAG/C,MAAM,QAAQ,QAAQ;EACtB,MAAM,SAAS,QAAQ;EACvB,MAAM,OAAO,QAAQ;EAErB,MAAM,UAAU,QAAQ;EACxB,MAAM,WAAW,IAAI,IAAI,GAAG,eAAe,IAAI,MAAM,GAAG;EAGxD,IAAI,cAAc,GAAG;AAErB,MAAI,SAAS,WAAW,QAAQ,QAAQ,SAAS,GAAG;GAClD,MAAM,aAAuC,EAAE;AAG/C,QAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,QAAQ,KAAK;IAE/C,MAAM,SAAS,QAAQ,QAAQ;AAC/B,QAAI,CAAC,OAAQ;IAGb,MAAM,YAAY,IAAI,IAAI,IAAI,OAAO,OAAO,GAAG;IAE/C,IAAI;AAGJ,QAAI,OAAO,aAAa,UACtB,aAAY,GAAG,GAAG,UAAU;aAEnB,OAAO,aAAa,cAC7B,aAAY,GAAG,GAAG,UAAU;aAG5B,OAAO,aAAa,UAEpB,OAAO,aAAa,SACpB;KAEA,MAAM,QAAQ,OAAO;AAIrB,iBAAY,GAAG,GAAG,UAAU,GAD1B,OAAO,aAAa,SAAS,GAAG,SAAS,GAAG,QACN,GAAG;WACtC;KAGL,MAAM,WAAW,IAAI,IAAI,OAAO,SAAS;KAEzC,MAAM,QAAQ,OAAO;KAIrB,IAAI,cAA+B;AACnC,SACE,UAAU,MACV,CAAC,MAAM,OAAO,MAAM,CAAC,IAErB,MAAM,MAAM,KAAK,GAEjB,eAAc,OAAO,MAAM;AAG7B,iBAAY,GAAG,GAAG,UAAU,GAAG,SAAS,GAAG;;AAG7C,eAAW,KAAK,UAAU;AAI1B,QAAI,IAAI,QAAQ,QAAQ,SAAS,GAAG;KAElC,MAAM,YAAY,QAAQ,aAAa,MAAM;AAE7C,gBAAW,KAAK,IAAI,IAAI,UAAU,CAAC;;;AAKvC,OAAI,WAAW,SAAS,EACtB,eAAc,GAAG,SAAS,IAAI,KAAK,YAAY,GAAG,IAAI;;EAK1D,IAAI;AACJ,MAAI,MAAM;GACR,MAAM,YAAY,IAAI,IAAI,IAAI,KAAK,OAAO,GAAG;GAC7C,MAAM,YAAY,KAAK,cAAc,SAAS,GAAG,SAAS,GAAG;AAC7D,WAAQ,GAA4B;0BAClB,SAAS;YACvB,YAAY;qBACH,UAAU,GAAG,UAAU;kBAC1B,MAAM,UAAU,OAAO;;QAGjC,SAAQ,GAA4B;0BAClB,SAAS;YACvB,YAAY;kBACN,MAAM,UAAU,OAAO;;EAInC,MAAM,SAAS,MAAM,MAAM,QAAQ,SAAS;EAO5C,MAAM,cAAc,MAJD,GAAsB;wCACP,SAAS;UACvC,YAAY;QAEqB,QAAQ,SAAS;EACtD,MAAM,QAAQ,YAAY,KAAK,KAC3B,SAAS,YAAY,KAAK,GAAG,OAAO,GAAG,GACvC;EAEJ,MAAM,aACJ,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,OAAO,KAAK,GAAG,GAAG,EAAE;AAW3D,SAAO;GACL,SAXc,CACd,GAAG,iBAAiB,QAAQ,QAAQ,WAAW,SAAS,IAAI,CAAC,EAC7D,GAAG,WAAW,QACX,QACC,CAAC,iBAAiB,SAChB,IACD,CACJ,CACF;GAIC,MAAM,OAAO;GACb;GACD;IAEH,CAAC,SAAS,CACX;CAED,MAAM,aAAa,YAAY,YAAY;AACzC,MAAI,CAAC,OAAQ;AAEb,MAAI,MAAO,OAAM,aAAa,MAAM;AAEpC,MAAI;GAIF,MAAM,aAAa,OADN,OADE,MAAM,WADP,yBAAyB,yBAAyB,IAAI,KAAK,CACnC,EACZ,EAAE,IAAI,QAAQ,CAAC,EACX,MAAM;GAEpC,MAAM,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,MAAM,YAAY,CAAC;GACzD,MAAM,MAAM,IAAI,gBAAgB,KAAK;GACrC,MAAM,IAAI,SAAS,cAAc,IAAI;AACrC,KAAE,OAAO;AACT,KAAE,WAAW,mBAAmB,KAAK,KAAK,CAAC;AAC3C,KAAE,OAAO;AACT,OAAI,gBAAgB,IAAI;YAChB;AACR,UAAO,SAAS;;IAEjB,CAAC,QAAQ,MAAM,CAAC;CAEnB,MAAM,aAAa,YACjB,OAAO,eAAuB;AAC5B,MAAI,CAAC,OAAQ;AAEb,MAAI,MAAO,OAAM,aAAa,MAAM;AAEpC,MAAI,QAEF,OADe,QAAQ,MAAM,CAChB;AASf,QAAM,OAAO,YAAY,OAAO,OAAO;GACrC,MAAM,UAAU,MAAM,GAAG,MACvB;;;qDAID;AACD,QAAK,MAAM,EAAE,aAAa,QAAQ,KAChC,OAAM,GAAG,KAAK,0BAA0B,QAAQ,WAAW;AAE7D,OAAI;AACF,UAAM,GAAG,KAAK,yCAAyC;WACjD;AAGR,SAAM,GAAG,KAAK,WAAW;AACzB,SAAM,GAAG,KAAK,sBAAsB,iBAAiB;IACrD;AAOF,QAAM,gBAAgB,OAAO;AAE7B,SAAO,SAAS,QAAQ;AAGxB,QAAM,IAAI,cAAc,GAAG;IAE7B;EAAC;EAAQ;EAAO;EAAQ,CACzB;AAYD,QAAO;EACL;EACA;EACA,gBAbqB,aACpB,UAA2C;AAC1C,OAAI,UAAU,YACZ,QAAO;IAAE,QAAQ;IAAkB,WAAW;IAAQ;KAI1D,EAAE,CACH;EAMC;EACA;EACD;;;;ACxWH,MAAM,wBAAwB,CAAC,IAAI,GAAG;AAEtC,SAAgB,oBAAoB;CAClC,MAAM,mBAAmB,qBACvB,yBACA,+BACM,KAAA,EACP;CAED,MAAM,qBAAqB,YAAY,OAAO,UAAkB;AAC9D,UAAQ,KAAK,wCAAwC,QAAQ;AAC7D,MAAI;AACF,gBAAa,QAAQ,qBAAqB,OAAO,MAAM,CAAC;AACxD,WAAQ,KAAK,gDAAgD;AAC7D,SAAM,qBAAqB;AAC3B,WAAQ,KAAK,kDAAkD;AAC/D,UAAO,SAAS,QAAQ;WACjB,KAAK;AACZ,WAAQ,MAAM,mCAAmC,IAAI;AACrD,gBAAa,WAAW,oBAAoB;AAC5C,SAAM;;IAEP,EAAE,CAAC;AAEN,QAAO;EACL,qBAAqB;EACrB,kBAAkB,oBAAoB;EACtC;EACD;;;;AC7BH,SAAgB,wBAA6D;CAE3E,MAAM,gBADsB,wBAAwB,EACT;CAE3C,MAAM,UAAU,cAAc;AAC5B,MAAI,CAAC,cAAe,QAAO,KAAA;AAE3B,SAAO,IAAI,yBACT,cAAc,eACd,cAAc,gBACd,cAAc,YACd,cAAc,cACd,cAAc,sBACf;IACA,CAAC,cAAc,CAAC;CAEnB,MAAM,aAAa,YACjB,OAAO,YAAoB,WAAoB;AAC7C,MAAI,CAAC,QACH,OAAM,IAAI,MAAM,+BAA+B;AAEjD,SAAO,QAAQ,iBAAiB,YAAY,OAAO;IAErD,CAAC,QAAQ,CACV;CAED,MAAM,qBAAqB,YACzB,OAAO,YAAoB,WAAoB;AAC7C,MAAI,CAAC,QACH,OAAM,IAAI,MAAM,+BAA+B;AAEjD,SAAO,QAAQ,iBAAiB,YAAY,OAAO;IAErD,CAAC,QAAQ,CACV;CAED,MAAM,qBAAqB,YACzB,OAAO,YAAoB,WAAoB;AAC7C,MAAI,CAAC,QACH,OAAM,IAAI,MAAM,+BAA+B;AAEjD,SAAO,QAAQ,iBAAiB,YAAY,OAAO;IAErD,CAAC,QAAQ,CACV;AAED,KAAI,CAAC,QACH;AAGF,QAAO;EACL;EACA;EACA;EACD;;;;ACzDH,SAAgB,yBAA+D;CAE7E,MAAM,mBADsB,wBAAwB,EACN,eAAe;CAE7D,MAAM,sBAAsB,cACpB,oBAAoB,MAC1B,CAAC,iBAAiB,CACnB;CAED,MAAM,gBAAgB,YAAY,YAAY;AAC5C,MAAI,CAAC,iBACH,QAAO,EAAE;AAGX,SAAO,iBAAiB,QAAQ,CAAC,KAAK,aAAa;GACjD,aAAa,QAAQ;GACrB,WAAW,QAAQ;GACnB,SAAS,QAAQ;GACjB,gBAAgB,QAAQ;GACxB,aAAa,QAAQ;GACrB,QAAQ,QAAQ;GAChB,WAAW,QAAQ;GACnB,oBAAoB,QAAQ;GAC7B,EAAE;IACF,CAAC,iBAAiB,CAAC;CAEtB,MAAM,UAAU,YACd,OAAO,gBAAwB;AAC7B,MAAI,CAAC,iBAAkB;EACvB,MAAM,UAAU,iBAAiB,IAAI,YAAY;AACjD,MAAI,QACF,OAAM,QAAQ,OAAO;IAGzB,CAAC,iBAAiB,CACnB;AAED,KAAI,CAAC,oBACH;AAGF,QAAO;EACL;EACA;EACD;;;;ACrCH,SAAgB,oBAAqD;CAEnE,MAAM,QADsB,wBAAwB,EACjB,eAAe;CAElD,MAAM,gBAAgB,cAAc;AAClC,MAAI,iBAAiB,cACnB,QAAO;IAGR,CAAC,MAAM,CAAC;CAEX,MAAM,gBAAgB,YAAY,YAAiC;AACjE,MAAI,CAAC,cACH,QAAO;GACL,UAAU;GACV,aAAa,EAAE;GACf,eAAe,EAAE;GACjB,cAAc;GACd,gBAAgB;GACjB;EAGH,MAAM,cAAc,cAAc,gBAAgB;EAClD,MAAM,kBAAkB,cAAc,oBAAoB;EAE1D,MAAM,gBAAuB,EAAE;AAC/B,OAAK,MAAM,YAAY,gBAAgB,QAAQ,CAC7C,MAAK,MAAM,SAAS,UAAU;GAC5B,MAAM,MAAM,cAAc,OAAO,MAAM;AACvC,OAAI,IACF,eAAc,KAAK,IAAI;;AAK7B,SAAO;GACL,UAAU,cAAc;GACxB;GACA;GACA,cAAc,YAAY;GAC1B,gBAAgB,cAAc;GAC/B;IACA,CAAC,cAAc,CAAC;CAEnB,MAAM,UAAU,YAAY,YAA2B;AACrD,MAAI,cACF,eAAc,OAAO;IAEtB,CAAC,cAAc,CAAC;CAEnB,MAAM,WAAW,YAAY,YAA2B;AACtD,MAAI,cACF,OAAM,cAAc,QAAQ;IAE7B,CAAC,cAAc,CAAC;AAEnB,KAAI,CAAC,cACH;AAGF,QAAO;EACL;EACA;EACA;EACD;;;;ACpEH,SAAgB,sBAId;CACA,MAAM,cAAc,SAAS;AAC7B,KAAI,CAAC,YACH,OAAM,IAAI,MAAM,yBAAyB;CAG3C,MAAM,mBAAmB,qBAAqB;AAW9C,QAAO;EACL,YAViB,kBAAkB;AACnC,UAAO,QAAQ,QAAQ,YAAY,MAAM,CAAC;KACzC,CAAC,YAAY,CAAC;EASf,cAPmB,aAClB,SAAiB,YAAY,OAAO,KAAK,EAC1C,CAAC,YAAY,CACd;EAKC;EACD;;;;ACtBH,MAAM,oBAAoB;AAE1B,MAAa,uBAAiC;CAE5C,MAAM,OADU,YAAY,EACN,SAAS;CAE/B,MAAM,EAAE,WAAW,cAAc,gBAAgB,YAAY,eAC3D,eAAe;CACjB,MAAM,EAAE,YAAY,cAAc,qBAAqB,qBAAqB;CAC5E,MAAM,sBAAsB,mBAAmB;CAC/C,MAAM,2BAA2B,wBAAwB;CACzD,MAAM,0BAA0B,uBAAuB;CACvD,MAAM,EAAE,kBAAkB,qBAAqB,uBAC7C,mBAAmB;AAErB,QACE,oBAACA,kBAAD;EACQ;EACN,eAAe,WAAW;AACxB,OAAI,CAAC,OAAQ,eAAc;;EAE7B,iBAAiB;GACf,QAAQ;GACR;GACA;GAEA;GACA,UAAU;GACV;GACA;GACA,kBAAkB;IAChB;IACA;IACA;IACD;GACF;EACD,uBAAuB;GACrB;GACA;GACA;GACD;EACoB;EACK;EACD;EACzB,CAAA"}
@@ -1,4 +1,4 @@
1
- import { t as useRegistryPackages } from "./useRegistryPackages-Ddtm9eH7.js";
1
+ import { t as useRegistryPackages } from "./useRegistryPackages-BOX4NMAb.js";
2
2
  import { closePHModal, usePHModal, useVetraPackageManager } from "@powerhousedao/reactor-browser";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { PackageInstallModal } from "@powerhousedao/design-system/connect/index";
@@ -31,4 +31,4 @@ function ConnectMissingPackageModal() {
31
31
  //#endregion
32
32
  export { ConnectMissingPackageModal };
33
33
 
34
- //# sourceMappingURL=MissingPackageModal-tfIQRHj0.js.map
34
+ //# sourceMappingURL=MissingPackageModal-Df154H9n.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MissingPackageModal-tfIQRHj0.js","names":[],"sources":["../src/components/modal/modals/MissingPackageModal.tsx"],"sourcesContent":["import { useRegistryPackages } from \"@powerhousedao/connect/hooks\";\nimport {\n PackageInstallModal,\n type PendingPackageInstallation,\n} from \"@powerhousedao/design-system/connect/index\";\nimport {\n closePHModal,\n usePHModal,\n useVetraPackageManager,\n} from \"@powerhousedao/reactor-browser\";\n\nexport function ConnectMissingPackageModal() {\n const phModal = usePHModal();\n const { registryPackageList, updateRegistryPackageStatus } =\n useRegistryPackages();\n const packageManager = useVetraPackageManager();\n const open = phModal?.type === \"missingPackage\";\n\n const documentType = open ? phModal.documentType : undefined;\n\n if (!packageManager || !documentType) return null;\n\n const pendingInstallations: PendingPackageInstallation[] = registryPackageList\n .filter((rp) => rp.documentTypes.includes(documentType))\n .map((rp) => ({\n documentType,\n packageName: rp.name,\n }));\n\n async function onInstall(packageName: string) {\n const result = await packageManager?.addPackage(packageName);\n if (result?.type === \"success\") {\n updateRegistryPackageStatus(packageName, \"registry-install\");\n }\n }\n\n function onDismiss(packageName: string) {\n updateRegistryPackageStatus(packageName, \"dismissed\");\n }\n\n return (\n <PackageInstallModal\n pendingInstallations={pendingInstallations}\n onInstall={onInstall}\n onDismiss={onDismiss}\n onOpenChange={(status: boolean) => {\n if (!status) return closePHModal();\n }}\n />\n );\n}\n"],"mappings":";;;;;AAWA,SAAgB,6BAA6B;CAC3C,MAAM,UAAU,YAAY;CAC5B,MAAM,EAAE,qBAAqB,gCAC3B,qBAAqB;CACvB,MAAM,iBAAiB,wBAAwB;CAG/C,MAAM,eAFO,SAAS,SAAS,mBAEH,QAAQ,eAAe,KAAA;AAEnD,KAAI,CAAC,kBAAkB,CAAC,aAAc,QAAO;CAE7C,MAAM,uBAAqD,oBACxD,QAAQ,OAAO,GAAG,cAAc,SAAS,aAAa,CAAC,CACvD,KAAK,QAAQ;EACZ;EACA,aAAa,GAAG;EACjB,EAAE;CAEL,eAAe,UAAU,aAAqB;AAE5C,OADe,MAAM,gBAAgB,WAAW,YAAY,GAChD,SAAS,UACnB,6BAA4B,aAAa,mBAAmB;;CAIhE,SAAS,UAAU,aAAqB;AACtC,8BAA4B,aAAa,YAAY;;AAGvD,QACE,oBAAC,qBAAD;EACwB;EACX;EACA;EACX,eAAe,WAAoB;AACjC,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,CAAA"}
1
+ {"version":3,"file":"MissingPackageModal-Df154H9n.js","names":[],"sources":["../src/components/modal/modals/MissingPackageModal.tsx"],"sourcesContent":["import { useRegistryPackages } from \"@powerhousedao/connect/hooks\";\nimport {\n PackageInstallModal,\n type PendingPackageInstallation,\n} from \"@powerhousedao/design-system/connect/index\";\nimport {\n closePHModal,\n usePHModal,\n useVetraPackageManager,\n} from \"@powerhousedao/reactor-browser\";\n\nexport function ConnectMissingPackageModal() {\n const phModal = usePHModal();\n const { registryPackageList, updateRegistryPackageStatus } =\n useRegistryPackages();\n const packageManager = useVetraPackageManager();\n const open = phModal?.type === \"missingPackage\";\n\n const documentType = open ? phModal.documentType : undefined;\n\n if (!packageManager || !documentType) return null;\n\n const pendingInstallations: PendingPackageInstallation[] = registryPackageList\n .filter((rp) => rp.documentTypes.includes(documentType))\n .map((rp) => ({\n documentType,\n packageName: rp.name,\n }));\n\n async function onInstall(packageName: string) {\n const result = await packageManager?.addPackage(packageName);\n if (result?.type === \"success\") {\n updateRegistryPackageStatus(packageName, \"registry-install\");\n }\n }\n\n function onDismiss(packageName: string) {\n updateRegistryPackageStatus(packageName, \"dismissed\");\n }\n\n return (\n <PackageInstallModal\n pendingInstallations={pendingInstallations}\n onInstall={onInstall}\n onDismiss={onDismiss}\n onOpenChange={(status: boolean) => {\n if (!status) return closePHModal();\n }}\n />\n );\n}\n"],"mappings":";;;;;AAWA,SAAgB,6BAA6B;CAC3C,MAAM,UAAU,YAAY;CAC5B,MAAM,EAAE,qBAAqB,gCAC3B,qBAAqB;CACvB,MAAM,iBAAiB,wBAAwB;CAG/C,MAAM,eAFO,SAAS,SAAS,mBAEH,QAAQ,eAAe,KAAA;AAEnD,KAAI,CAAC,kBAAkB,CAAC,aAAc,QAAO;CAE7C,MAAM,uBAAqD,oBACxD,QAAQ,OAAO,GAAG,cAAc,SAAS,aAAa,CAAC,CACvD,KAAK,QAAQ;EACZ;EACA,aAAa,GAAG;EACjB,EAAE;CAEL,eAAe,UAAU,aAAqB;AAE5C,OADe,MAAM,gBAAgB,WAAW,YAAY,GAChD,SAAS,UACnB,6BAA4B,aAAa,mBAAmB;;CAIhE,SAAS,UAAU,aAAqB;AACtC,8BAA4B,aAAa,YAAY;;AAGvD,QACE,oBAAC,qBAAD;EACwB;EACX;EACA;EACX,eAAe,WAAoB;AACjC,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { t as connectConfig } from "./connect.config-Cuh0hj_Q.js";
2
2
  import { t as toast$1 } from "./toast-iD-70hL8.js";
3
- import { t as useRegistryPackages } from "./useRegistryPackages-Ddtm9eH7.js";
4
- import { t as package_default } from "./package-BHlEN933.js";
3
+ import { t as useRegistryPackages } from "./useRegistryPackages-BOX4NMAb.js";
4
+ import { t as package_default } from "./package-BSQuMYdG.js";
5
5
  import { closePHModal, deleteDrive, setSelectedDrive, showPHModal, useDrives, usePHModal, useVetraPackageManager } from "@powerhousedao/reactor-browser";
6
6
  import { useCallback, useMemo, useState } from "react";
7
7
  import { About, DangerZone, DefaultEditor, PackageManager, SettingsModal as SettingsModal$1 } from "@powerhousedao/design-system/connect";
@@ -92,13 +92,15 @@ function parseBareName(spec) {
92
92
  }
93
93
  const ConnectPackageManager = () => {
94
94
  const packageManager = useVetraPackageManager();
95
- const { registryPackageList, updateRegistryPackageStatus } = useRegistryPackages();
95
+ const { registryPackageList, updateRegistryPackageStatus, registerFallbackRegistryPackage } = useRegistryPackages();
96
96
  async function handleInstall(packageSpec) {
97
97
  if (!packageManager) return;
98
- const result = await packageManager.addPackage(packageSpec);
99
98
  const bareName = parseBareName(packageSpec);
99
+ const wasKnownToRegistry = registryPackageList.some((p) => p.name === bareName);
100
+ const result = await packageManager.addPackage(packageSpec);
100
101
  if (result.type === "success") {
101
- updateRegistryPackageStatus(bareName, "registry-install");
102
+ if (wasKnownToRegistry) updateRegistryPackageStatus(bareName, "registry-install");
103
+ else registerFallbackRegistryPackage(bareName, result.package, packageManager.getPackageVersion(bareName) ?? packageManager.getPackageVersion(packageSpec), "registry-install");
102
104
  toast$1(`Package "${packageSpec}" installed successfully`, { type: "connect-success" });
103
105
  } else {
104
106
  const message = result.error.message;
@@ -186,4 +188,4 @@ const SettingsModal = () => {
186
188
  //#endregion
187
189
  export { SettingsModal };
188
190
 
189
- //# sourceMappingURL=SettingsModal-Bs2kY0xi.js.map
191
+ //# sourceMappingURL=SettingsModal-UHPtLX1I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsModal-UHPtLX1I.js","names":["About","BaseAbout","packageJson","DangerZone","BaseDangerZone","DefaultEditor","BaseDefaultEditor","DefaultEditor","DangerZone","About","SettingsModalV2"],"sources":["../src/components/modal/modals/settings/about.tsx","../src/components/modal/modals/settings/danger-zone.tsx","../src/components/modal/modals/settings/default-editor.tsx","../src/components/modal/modals/settings/package-manager.tsx","../src/components/modal/modals/SettingsModal.tsx"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { packageJson } from \"@powerhousedao/connect/utils\";\nimport { Icon } from \"@powerhousedao/design-system\";\nimport { About as BaseAbout } from \"@powerhousedao/design-system/connect\";\nimport { closePHModal, showPHModal } from \"@powerhousedao/reactor-browser\";\n\nexport const About: React.FC = () => {\n const onOpenInspector = () => {\n closePHModal();\n showPHModal({ type: \"inspector\" });\n };\n\n return (\n <div>\n <BaseAbout\n packageJson={packageJson}\n phCliVersion={\n typeof connectConfig.phCliVersion === \"string\"\n ? connectConfig.phCliVersion\n : undefined\n }\n />\n <div className=\"bg-white p-3\">\n <h2 className=\"mb-2 font-semibold\">Inspector</h2>\n <p className=\"mb-3 text-sm font-normal text-gray-600\">\n Explore the local database and sync state for debugging.\n </p>\n <button\n className=\"flex items-center gap-x-2 rounded-md border border-gray-300 bg-transparent px-3 py-1 text-sm font-medium text-gray-900 transition-colors hover:bg-gray-100\"\n onClick={onOpenInspector}\n type=\"button\"\n >\n Open Inspector <Icon name=\"CircleInfo\" size={16} />\n </button>\n </div>\n </div>\n );\n};\n","import { DangerZone as BaseDangerZone } from \"@powerhousedao/design-system/connect\";\nimport {\n deleteDrive,\n setSelectedDrive,\n showPHModal,\n useDrives,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\n\nexport const DangerZone: React.FC = () => {\n const drives = useDrives();\n\n const handleDeleteDrive = async (drive: DocumentDriveDocument) => {\n await deleteDrive(drive.header.id);\n setSelectedDrive(undefined);\n };\n\n const handleClearStorage = () => {\n showPHModal({ type: \"clearStorage\" });\n };\n\n return (\n <BaseDangerZone\n drives={drives ?? []}\n onDeleteDrive={handleDeleteDrive}\n onClearStorage={handleClearStorage}\n />\n );\n};\n","import { DefaultEditor as BaseDefaultEditor } from \"@powerhousedao/design-system/connect\";\nimport { useCallback, useState } from \"react\";\n\nconst documentModelEditorOptions = [\n { label: \"V1\", value: \"document-model-editor\" },\n { label: \"V2\", value: \"document-model-editor-v2\" },\n] as const;\n\nexport const DefaultEditor: React.FC = () => {\n const [documentModelEditor, setDocumentModelEditor] = useState<\n (typeof documentModelEditorOptions)[number]\n >(documentModelEditorOptions[1]);\n\n const handleSetDocumentEditor = useCallback((value: string) => {\n const option = documentModelEditorOptions.find((dm) => dm.value == value);\n if (option) {\n setDocumentModelEditor(option);\n }\n }, []);\n\n return (\n <BaseDefaultEditor\n documentModelEditor={documentModelEditor.value}\n setDocumentModelEditor={handleSetDocumentEditor}\n documentModelEditorOptions={\n documentModelEditorOptions as unknown as {\n value: string;\n label: string;\n }[]\n }\n />\n );\n};\n","import { useRegistryPackages } from \"@powerhousedao/connect/hooks\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport { PackageManager } from \"@powerhousedao/design-system/connect\";\nimport { useVetraPackageManager } from \"@powerhousedao/reactor-browser\";\nimport React from \"react\";\n\n/**\n * Split a `name@tag` spec into its bare package name. Mirrors the design-system's\n * `parsePackageSpec` — duplicated here to avoid reaching into a deep subpath\n * export. Scoped names split on the LAST `@`, unscoped on the first.\n */\nfunction parseBareName(spec: string): string {\n const trimmed = spec.trim();\n const at = trimmed.startsWith(\"@\")\n ? trimmed.lastIndexOf(\"@\")\n : trimmed.indexOf(\"@\");\n return at > 0 ? trimmed.slice(0, at) : trimmed;\n}\n\nexport const ConnectPackageManager: React.FC = () => {\n const packageManager = useVetraPackageManager();\n const {\n registryPackageList,\n updateRegistryPackageStatus,\n registerFallbackRegistryPackage,\n } = useRegistryPackages();\n\n async function handleInstall(packageSpec: string) {\n if (!packageManager) return;\n\n // The spec may include an explicit `@tag` / `@version` suffix from the\n // search input. Pass it through to the package manager as-is (the CDN\n // route already handles `name@tag` specs), but track status under the\n // bare name so the Settings list doesn't fragment.\n const bareName = parseBareName(packageSpec);\n // Packages that were in `/packages` when the user clicked Install go\n // through `updateRegistryPackageStatus` and hit an existing entry.\n // Packages that landed via the npm-uplink fallback weren't in the list,\n // so we register them explicitly rather than silently upserting a\n // placeholder — keeping the \"does not exist\" error as a signal for any\n // other code path that reaches update without a matching entry.\n const wasKnownToRegistry = registryPackageList.some(\n (p) => p.name === bareName,\n );\n const result = await packageManager.addPackage(packageSpec);\n if (result.type === \"success\") {\n if (wasKnownToRegistry) {\n updateRegistryPackageStatus(bareName, \"registry-install\");\n } else {\n registerFallbackRegistryPackage(\n bareName,\n result.package,\n packageManager.getPackageVersion(bareName) ??\n packageManager.getPackageVersion(packageSpec),\n \"registry-install\",\n );\n }\n toast(`Package \"${packageSpec}\" installed successfully`, {\n type: \"connect-success\",\n });\n } else {\n const message = result.error.message;\n // `BrowserPackageManager` raises a generic \"Failed to fetch dynamically\n // imported module\" when the registry CDN returns an error. That covers\n // both \"the name exists nowhere (not on this registry AND not on the\n // npmjs uplink)\" and \"the tarball is there but doesn't look like a\n // Powerhouse package\". Tell the user in plain terms before dumping the\n // raw error so the \"install from npm\" fallback case is self-explanatory.\n const isLikelyNotFound = /failed to fetch|404|not found/i.test(message);\n const userMessage = isLikelyNotFound\n ? `Could not install \"${packageSpec}\". The package isn't available on this registry, and the npmjs.org fallback could not resolve it either.`\n : `Failed to install \"${packageSpec}\": ${message}`;\n toast(userMessage, { type: \"error\" });\n }\n }\n\n function handleUninstall(packageName: string) {\n if (!packageManager) return;\n try {\n packageManager.removePackage(packageName);\n updateRegistryPackageStatus(packageName, \"available\");\n\n toast(`Package \"${packageName}\" uninstalled successfully`, {\n type: \"connect-success\",\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n toast(`Failed to uninstall \"${packageName}\": ${message}`, {\n type: \"error\",\n });\n }\n }\n\n return (\n <div className=\"flex h-full flex-1 flex-col\">\n <PackageManager\n mutable={true}\n registryPackageList={registryPackageList}\n onInstall={handleInstall}\n onUninstall={handleUninstall}\n />\n </div>\n );\n};\n","import { Icon } from \"@powerhousedao/design-system\";\nimport { SettingsModal as SettingsModalV2 } from \"@powerhousedao/design-system/connect\";\nimport { closePHModal, usePHModal } from \"@powerhousedao/reactor-browser\";\nimport { t } from \"i18next\";\nimport React, { useMemo } from \"react\";\nimport { About } from \"./settings/about.js\";\nimport { DangerZone } from \"./settings/danger-zone.js\";\nimport { DefaultEditor } from \"./settings/default-editor.js\";\nimport { ConnectPackageManager } from \"./settings/package-manager.js\";\n\nexport const SettingsModal: React.FC = () => {\n const phModal = usePHModal();\n const open = phModal?.type === \"settings\";\n function onRefresh() {\n window.location.reload();\n }\n\n const tabs = useMemo(\n () => [\n {\n id: \"package-manager\",\n icon: <Icon name=\"PackageManager\" size={12} />,\n label: \"Package Manager\",\n content: ConnectPackageManager,\n },\n {\n id: \"default-editors\",\n icon: <Icon name=\"Edit\" size={12} />,\n label: \"Default Editors\",\n content: DefaultEditor,\n },\n {\n id: \"danger-zone\",\n icon: <Icon name=\"Danger\" size={12} className=\"text-red-900\" />,\n label: <span className=\"text-red-900\">Danger Zone</span>,\n content: () => <DangerZone />,\n },\n {\n id: \"about\",\n icon: <Icon name=\"QuestionSquare\" size={12} />,\n label: \"About\",\n content: About,\n },\n ],\n [onRefresh],\n );\n\n return (\n <SettingsModalV2\n open={open}\n title={t(\"modals.connectSettings.title\")}\n onOpenChange={(status: boolean) => {\n if (!status) return closePHModal();\n }}\n tabs={tabs}\n />\n );\n};\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { t as connectConfig } from "./connect.config-Cuh0hj_Q.js";
2
2
  import { t as toast } from "./toast-iD-70hL8.js";
3
- import { t as package_default } from "./package-BHlEN933.js";
3
+ import { t as package_default } from "./package-BSQuMYdG.js";
4
4
  import { t as detectReactorPgMajor } from "./pglite-runtime-BS9wpAs9.js";
5
5
  import { n as seedPendingPgVersion } from "./pglite-seed-VlhY0n-A.js";
6
- import { n as createReactor } from "./reactor-CPD8Z_UP.js";
6
+ import { n as createReactor } from "./reactor-C0_wHi3h.js";
7
7
  import { useUser } from "@powerhousedao/reactor-browser";
8
8
  import { logger } from "document-model";
9
9
  import { createElement, useEffect } from "react";
@@ -106,4 +106,4 @@ async function loadComponent(localPackage) {
106
106
  //#endregion
107
107
  export { loadComponent };
108
108
 
109
- //# sourceMappingURL=load-a9fL9VL8.js.map
109
+ //# sourceMappingURL=load-H4R4OlSd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"load-a9fL9VL8.js","names":["packageJson"],"sources":["../src/components/reload-connect-toast.tsx","../src/hooks/useCheckLatestVersion.ts","../src/hooks/utils.ts","../src/store/user.ts","../src/components/load.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\n\nexport const ReloadConnectToast = () => {\n const { t } = useTranslation();\n\n return (\n <div>\n <p className=\"font-medium\">{t(\"notifications.reloadApp\")}</p>\n <button\n onClick={() => location.reload()}\n className=\"underline decoration-solid underline-offset-2\"\n >\n {t(\"common.reloadConnect\")} 🔄\n </button>\n </div>\n );\n};\n","import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { isLatestVersion } from \"@powerhousedao/connect/hooks\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport { logger } from \"document-model\";\nimport { createElement, useEffect } from \"react\";\nimport { ReloadConnectToast } from \"../components/reload-connect-toast.js\";\n\nexport const useCheckLatestVersion = () => {\n async function checkLatestVersion() {\n const result = await isLatestVersion();\n if (result === null) return;\n // ignore dev/staging versions\n if (result.isLatest || result.currentVersion.includes(\"-\")) {\n return true;\n }\n\n if (\n import.meta.env.MODE === \"development\" ||\n connectConfig.studioMode ||\n !connectConfig.warnOutdatedApp\n ) {\n logger.warn(\n \"Connect is outdated: \\nCurrent: @currentVersion\\nLatest: @latestVersion\",\n result.currentVersion,\n result.latestVersion,\n );\n } else {\n toast(createElement(ReloadConnectToast), {\n type: \"connect-warning\",\n toastId: \"outdated-app\",\n autoClose: false,\n });\n }\n }\n\n useEffect(() => {\n checkLatestVersion().catch(console.error);\n }, []);\n};\n","import { packageJson } from \"../utils/package-json.js\";\n\nexport const isMac = window.navigator.appVersion.includes(\"Mac\");\n\nconst urlBranchMap: Record<string, string> = {\n \"staging/makerdao\": \"deployments/staging/makerdao\",\n \"staging/arbitrum\": \"arb-ltip\",\n \"staging/powerhouse\": \"staging\",\n makerdao: \"deployments/makerdao\",\n arbitrum: \"deployments/arbitrum\",\n arbgrants: \"deployments/arbitrum\",\n localhost: \"develop\",\n};\n\nconst getGithubLinkFromUrl = () => {\n const githubLink = \"https://raw.githubusercontent.com/powerhouse-inc/connect\";\n const url = window.location.href;\n\n const env = Object.keys(urlBranchMap).find((env) => url.includes(env));\n const value = env ? urlBranchMap[env] : undefined;\n if (!value) {\n return undefined;\n } else {\n return `${githubLink}/${value}/package.json`;\n }\n};\n\nconst fetchLatestVersion = async () => {\n const link = getGithubLinkFromUrl();\n if (!link) {\n return undefined;\n }\n const result = await fetch(link);\n const data = (await result.json()) as { version: string };\n const { version } = data;\n return version;\n};\n\nexport const isLatestVersion = async () => {\n const currentVersion = packageJson.version;\n const deployed = await fetchLatestVersion();\n\n if (deployed) {\n return {\n isLatest: deployed === currentVersion,\n currentVersion,\n latestVersion: deployed,\n };\n }\n\n return null;\n};\n","import { useUser } from \"@powerhousedao/reactor-browser\";\nimport type { User as SentryUser } from \"@sentry/react\";\nimport { setUser as setSentryUser } from \"@sentry/react\";\nimport { useEffect } from \"react\";\n\nexport function useSetSentryUser() {\n const user = useUser();\n useEffect(() => {\n let sentryUser: SentryUser | null = null;\n if (user) {\n // saves the user info except the credential\n const { credential, ...rest } = user;\n sentryUser = { id: rest.did, username: rest.ens?.name, ...rest };\n }\n setSentryUser(sentryUser);\n }, [user]);\n}\n","import { useCheckLatestVersion } from \"@powerhousedao/connect/hooks\";\nimport \"@powerhousedao/connect/i18n\";\nimport { createReactor, useSetSentryUser } from \"@powerhousedao/connect/store\";\nimport {\n detectReactorPgMajor,\n seedPendingPgVersion,\n} from \"@powerhousedao/connect/utils\";\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 useSetSentryUser();\n useCheckLatestVersion();\n return children;\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;AAEA,MAAa,2BAA2B;CACtC,MAAM,EAAE,MAAM,gBAAgB;AAE9B,QACE,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,KAAD;EAAG,WAAU;YAAe,EAAE,0BAA0B;EAAK,CAAA,EAC7D,qBAAC,UAAD;EACE,eAAe,SAAS,QAAQ;EAChC,WAAU;YAFZ,CAIG,EAAE,uBAAuB,EAAC,MACpB;IACL,EAAA,CAAA;;;;ACPV,MAAa,8BAA8B;CACzC,eAAe,qBAAqB;EAClC,MAAM,SAAS,MAAM,iBAAiB;AACtC,MAAI,WAAW,KAAM;AAErB,MAAI,OAAO,YAAY,OAAO,eAAe,SAAS,IAAI,CACxD,QAAO;AAGT,MACE,OAAO,KAAK,IAAI,SAAS,iBACzB,cAAc,cACd,CAAC,cAAc,gBAEf,QAAO,KACL,2EACA,OAAO,gBACP,OAAO,cACR;MAED,OAAM,cAAc,mBAAmB,EAAE;GACvC,MAAM;GACN,SAAS;GACT,WAAW;GACZ,CAAC;;AAIN,iBAAgB;AACd,sBAAoB,CAAC,MAAM,QAAQ,MAAM;IACxC,EAAE,CAAC;;ACnCa,OAAO,UAAU,WAAW,SAAS,MAAM;AAEhE,MAAM,eAAuC;CAC3C,oBAAoB;CACpB,oBAAoB;CACpB,sBAAsB;CACtB,UAAU;CACV,UAAU;CACV,WAAW;CACX,WAAW;CACZ;AAED,MAAM,6BAA6B;CACjC,MAAM,aAAa;CACnB,MAAM,MAAM,OAAO,SAAS;CAE5B,MAAM,MAAM,OAAO,KAAK,aAAa,CAAC,MAAM,QAAQ,IAAI,SAAS,IAAI,CAAC;CACtE,MAAM,QAAQ,MAAM,aAAa,OAAO,KAAA;AACxC,KAAI,CAAC,MACH;KAEA,QAAO,GAAG,WAAW,GAAG,MAAM;;AAIlC,MAAM,qBAAqB,YAAY;CACrC,MAAM,OAAO,sBAAsB;AACnC,KAAI,CAAC,KACH;CAIF,MAAM,EAAE,YADM,OADC,MAAM,MAAM,KAAK,EACL,MAAM;AAEjC,QAAO;;AAGT,MAAa,kBAAkB,YAAY;CACzC,MAAM,iBAAiBA,gBAAY;CACnC,MAAM,WAAW,MAAM,oBAAoB;AAE3C,KAAI,SACF,QAAO;EACL,UAAU,aAAa;EACvB;EACA,eAAe;EAChB;AAGH,QAAO;;;;AC7CT,SAAgB,mBAAmB;CACjC,MAAM,OAAO,SAAS;AACtB,iBAAgB;EACd,IAAI,aAAgC;AACpC,MAAI,MAAM;GAER,MAAM,EAAE,YAAY,GAAG,SAAS;AAChC,gBAAa;IAAE,IAAI,KAAK;IAAK,UAAU,KAAK,KAAK;IAAM,GAAG;IAAM;;AAElE,UAAc,WAAW;IACxB,CAAC,KAAK,CAAC;;;;ACLZ,eAAsB,cAAc,cAAiC;AACnE,OAAM,sBAAsB;AAC5B,OAAM,sBAAsB;AAC5B,OAAM,cAAc,aAAa;AACjC,QAAO,EACL,UAAU,EAAE,eAAyC;AACnD,oBAAkB;AAClB,yBAAuB;AACvB,SAAO;IAEV"}
1
+ {"version":3,"file":"load-H4R4OlSd.js","names":["packageJson"],"sources":["../src/components/reload-connect-toast.tsx","../src/hooks/useCheckLatestVersion.ts","../src/hooks/utils.ts","../src/store/user.ts","../src/components/load.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\n\nexport const ReloadConnectToast = () => {\n const { t } = useTranslation();\n\n return (\n <div>\n <p className=\"font-medium\">{t(\"notifications.reloadApp\")}</p>\n <button\n onClick={() => location.reload()}\n className=\"underline decoration-solid underline-offset-2\"\n >\n {t(\"common.reloadConnect\")} 🔄\n </button>\n </div>\n );\n};\n","import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { isLatestVersion } from \"@powerhousedao/connect/hooks\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport { logger } from \"document-model\";\nimport { createElement, useEffect } from \"react\";\nimport { ReloadConnectToast } from \"../components/reload-connect-toast.js\";\n\nexport const useCheckLatestVersion = () => {\n async function checkLatestVersion() {\n const result = await isLatestVersion();\n if (result === null) return;\n // ignore dev/staging versions\n if (result.isLatest || result.currentVersion.includes(\"-\")) {\n return true;\n }\n\n if (\n import.meta.env.MODE === \"development\" ||\n connectConfig.studioMode ||\n !connectConfig.warnOutdatedApp\n ) {\n logger.warn(\n \"Connect is outdated: \\nCurrent: @currentVersion\\nLatest: @latestVersion\",\n result.currentVersion,\n result.latestVersion,\n );\n } else {\n toast(createElement(ReloadConnectToast), {\n type: \"connect-warning\",\n toastId: \"outdated-app\",\n autoClose: false,\n });\n }\n }\n\n useEffect(() => {\n checkLatestVersion().catch(console.error);\n }, []);\n};\n","import { packageJson } from \"../utils/package-json.js\";\n\nexport const isMac = window.navigator.appVersion.includes(\"Mac\");\n\nconst urlBranchMap: Record<string, string> = {\n \"staging/makerdao\": \"deployments/staging/makerdao\",\n \"staging/arbitrum\": \"arb-ltip\",\n \"staging/powerhouse\": \"staging\",\n makerdao: \"deployments/makerdao\",\n arbitrum: \"deployments/arbitrum\",\n arbgrants: \"deployments/arbitrum\",\n localhost: \"develop\",\n};\n\nconst getGithubLinkFromUrl = () => {\n const githubLink = \"https://raw.githubusercontent.com/powerhouse-inc/connect\";\n const url = window.location.href;\n\n const env = Object.keys(urlBranchMap).find((env) => url.includes(env));\n const value = env ? urlBranchMap[env] : undefined;\n if (!value) {\n return undefined;\n } else {\n return `${githubLink}/${value}/package.json`;\n }\n};\n\nconst fetchLatestVersion = async () => {\n const link = getGithubLinkFromUrl();\n if (!link) {\n return undefined;\n }\n const result = await fetch(link);\n const data = (await result.json()) as { version: string };\n const { version } = data;\n return version;\n};\n\nexport const isLatestVersion = async () => {\n const currentVersion = packageJson.version;\n const deployed = await fetchLatestVersion();\n\n if (deployed) {\n return {\n isLatest: deployed === currentVersion,\n currentVersion,\n latestVersion: deployed,\n };\n }\n\n return null;\n};\n","import { useUser } from \"@powerhousedao/reactor-browser\";\nimport type { User as SentryUser } from \"@sentry/react\";\nimport { setUser as setSentryUser } from \"@sentry/react\";\nimport { useEffect } from \"react\";\n\nexport function useSetSentryUser() {\n const user = useUser();\n useEffect(() => {\n let sentryUser: SentryUser | null = null;\n if (user) {\n // saves the user info except the credential\n const { credential, ...rest } = user;\n sentryUser = { id: rest.did, username: rest.ens?.name, ...rest };\n }\n setSentryUser(sentryUser);\n }, [user]);\n}\n","import { useCheckLatestVersion } from \"@powerhousedao/connect/hooks\";\nimport \"@powerhousedao/connect/i18n\";\nimport { createReactor, useSetSentryUser } from \"@powerhousedao/connect/store\";\nimport {\n detectReactorPgMajor,\n seedPendingPgVersion,\n} from \"@powerhousedao/connect/utils\";\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 useSetSentryUser();\n useCheckLatestVersion();\n return children;\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;AAEA,MAAa,2BAA2B;CACtC,MAAM,EAAE,MAAM,gBAAgB;AAE9B,QACE,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,KAAD;EAAG,WAAU;YAAe,EAAE,0BAA0B;EAAK,CAAA,EAC7D,qBAAC,UAAD;EACE,eAAe,SAAS,QAAQ;EAChC,WAAU;YAFZ,CAIG,EAAE,uBAAuB,EAAC,MACpB;IACL,EAAA,CAAA;;;;ACPV,MAAa,8BAA8B;CACzC,eAAe,qBAAqB;EAClC,MAAM,SAAS,MAAM,iBAAiB;AACtC,MAAI,WAAW,KAAM;AAErB,MAAI,OAAO,YAAY,OAAO,eAAe,SAAS,IAAI,CACxD,QAAO;AAGT,MACE,OAAO,KAAK,IAAI,SAAS,iBACzB,cAAc,cACd,CAAC,cAAc,gBAEf,QAAO,KACL,2EACA,OAAO,gBACP,OAAO,cACR;MAED,OAAM,cAAc,mBAAmB,EAAE;GACvC,MAAM;GACN,SAAS;GACT,WAAW;GACZ,CAAC;;AAIN,iBAAgB;AACd,sBAAoB,CAAC,MAAM,QAAQ,MAAM;IACxC,EAAE,CAAC;;ACnCa,OAAO,UAAU,WAAW,SAAS,MAAM;AAEhE,MAAM,eAAuC;CAC3C,oBAAoB;CACpB,oBAAoB;CACpB,sBAAsB;CACtB,UAAU;CACV,UAAU;CACV,WAAW;CACX,WAAW;CACZ;AAED,MAAM,6BAA6B;CACjC,MAAM,aAAa;CACnB,MAAM,MAAM,OAAO,SAAS;CAE5B,MAAM,MAAM,OAAO,KAAK,aAAa,CAAC,MAAM,QAAQ,IAAI,SAAS,IAAI,CAAC;CACtE,MAAM,QAAQ,MAAM,aAAa,OAAO,KAAA;AACxC,KAAI,CAAC,MACH;KAEA,QAAO,GAAG,WAAW,GAAG,MAAM;;AAIlC,MAAM,qBAAqB,YAAY;CACrC,MAAM,OAAO,sBAAsB;AACnC,KAAI,CAAC,KACH;CAIF,MAAM,EAAE,YADM,OADC,MAAM,MAAM,KAAK,EACL,MAAM;AAEjC,QAAO;;AAGT,MAAa,kBAAkB,YAAY;CACzC,MAAM,iBAAiBA,gBAAY;CACnC,MAAM,WAAW,MAAM,oBAAoB;AAE3C,KAAI,SACF,QAAO;EACL,UAAU,aAAa;EACvB;EACA,eAAe;EAChB;AAGH,QAAO;;;;AC7CT,SAAgB,mBAAmB;CACjC,MAAM,OAAO,SAAS;AACtB,iBAAgB;EACd,IAAI,aAAgC;AACpC,MAAI,MAAM;GAER,MAAM,EAAE,YAAY,GAAG,SAAS;AAChC,gBAAa;IAAE,IAAI,KAAK;IAAK,UAAU,KAAK,KAAK;IAAM,GAAG;IAAM;;AAElE,UAAc,WAAW;IACxB,CAAC,KAAK,CAAC;;;;ACLZ,eAAsB,cAAc,cAAiC;AACnE,OAAM,sBAAsB;AAC5B,OAAM,sBAAsB;AAC5B,OAAM,cAAc,aAAa;AACjC,QAAO,EACL,UAAU,EAAE,eAAyC;AACnD,oBAAkB;AAClB,yBAAuB;AACvB,SAAO;IAEV"}
package/dist/main.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as AppLoader } from "./sidebar-CjBVvx_0.js";
1
+ import { t as AppLoader } from "./sidebar-CEFmpCYo.js";
2
2
  import { createRoot } from "react-dom/client";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  //#region main.tsx
@@ -2,7 +2,7 @@
2
2
  var package_default = {
3
3
  name: "@powerhousedao/connect",
4
4
  productName: "Powerhouse-Connect",
5
- version: "6.0.0-dev.192",
5
+ version: "6.0.0-dev.194",
6
6
  description: "Powerhouse Connect",
7
7
  main: "dist/index.html",
8
8
  type: "module",
@@ -111,4 +111,4 @@ var package_default = {
111
111
  //#endregion
112
112
  export { package_default as t };
113
113
 
114
- //# sourceMappingURL=package-BHlEN933.js.map
114
+ //# sourceMappingURL=package-BSQuMYdG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-BSQuMYdG.js","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
@@ -358,6 +358,15 @@ var PackageDiscoveryService = class {
358
358
  };
359
359
  //#endregion
360
360
  //#region src/package-manager.ts
361
+ /**
362
+ * Strip any `@tag` / `@version` suffix from a package spec, returning the bare
363
+ * package name. Mirrors `parsePackageSpec` on the UI side.
364
+ */
365
+ function parseBareName(spec) {
366
+ const trimmed = spec.trim();
367
+ const at = trimmed.startsWith("@") ? trimmed.lastIndexOf("@") : trimmed.indexOf("@");
368
+ return at > 0 ? trimmed.slice(0, at) : trimmed;
369
+ }
361
370
  async function fetchPackageJsonVersion(baseUrl) {
362
371
  try {
363
372
  const res = await fetch(baseUrl);
@@ -393,7 +402,11 @@ var BrowserPackageManager = class {
393
402
  this.addLocalPackage(common.manifest.name, common, commonPkg.version);
394
403
  this.addLocalPackage(vetra.manifest.name, vetra, vetraPkg.version);
395
404
  if (localPackage) this.updateLocalPackage(localPackage, localPackageVersion);
396
- for (const packageName of this.#storage.keys()) await this.addPackage(packageName);
405
+ for (const packageName of this.#storage.keys()) {
406
+ const specForReload = this.#storage.get(packageName)?.spec ?? packageName;
407
+ console.debug(`[Connect][PackageManager] Rehydrating "${packageName}" via spec "${specForReload}"`);
408
+ if ((await this.addPackage(specForReload)).type === "error") this.#storage.delete(packageName);
409
+ }
397
410
  }
398
411
  addLocalPackage(name, loadedPackage, version) {
399
412
  this.#localPackageNames.add(name);
@@ -442,14 +455,22 @@ var BrowserPackageManager = class {
442
455
  if (packageName === this.#localPackage?.manifest.name) return this.#localPackageVersion;
443
456
  return this.#storage.get(packageName)?.version;
444
457
  }
445
- async addPackage(packageName) {
446
- const existingPackage = this.#packages.get(packageName);
447
- if (existingPackage) return {
448
- type: "success",
449
- package: existingPackage
450
- };
458
+ async addPackage(packageSpec) {
459
+ const bareName = parseBareName(packageSpec);
460
+ const hasTagOrVersion = bareName !== packageSpec;
461
+ console.debug(`[Connect][PackageManager] addPackage spec="${packageSpec}" bareName="${bareName}"`);
462
+ const existingPackage = this.#packages.get(bareName);
463
+ if (existingPackage) {
464
+ console.debug(`[Connect][PackageManager] "${bareName}" already loaded; skipping re-fetch`);
465
+ return {
466
+ type: "success",
467
+ package: existingPackage
468
+ };
469
+ }
451
470
  try {
452
- const packageWithMeta = await this.#loadPackage(packageName);
471
+ const packageWithMeta = await this.#loadPackage(packageSpec);
472
+ packageWithMeta.name = bareName;
473
+ if (hasTagOrVersion) packageWithMeta.spec = packageSpec;
453
474
  this.#registerPackage(packageWithMeta);
454
475
  return {
455
476
  type: "success",
@@ -457,7 +478,7 @@ var BrowserPackageManager = class {
457
478
  };
458
479
  } catch (error) {
459
480
  const normalized = error instanceof Error ? error : new Error(String(error));
460
- console.error(`[Connect][PackageManager] Failed to install package "${packageName}": ${normalized.message}`, normalized);
481
+ console.error(`[Connect][PackageManager] Failed to install package "${packageSpec}": ${normalized.message}`, normalized);
461
482
  return {
462
483
  type: "error",
463
484
  error: normalized
@@ -535,15 +556,17 @@ var BrowserPackageManager = class {
535
556
  return await this.#loadPackageFromRegistry(packageName);
536
557
  }
537
558
  #registerPackage(packageWithMeta) {
538
- const { name, loadedPackage, importUrl, stylesheetUrl, version } = packageWithMeta;
559
+ const { name, loadedPackage, importUrl, stylesheetUrl, version, spec } = packageWithMeta;
539
560
  if (stylesheetUrl !== null) this.#mountStylesheet(name, stylesheetUrl);
540
561
  this.#packages.set(name, loadedPackage);
541
562
  this.#storage.set(name, {
542
563
  name,
543
564
  importUrl,
544
565
  stylesheetUrl,
545
- version
566
+ version,
567
+ ...spec ? { spec } : {}
546
568
  });
569
+ console.debug(`[Connect][PackageManager] Registered "${name}" (version=${version ?? "?"}, spec=${spec ?? "—"})`);
547
570
  this.#notifyPackagesChanged();
548
571
  }
549
572
  #mountStylesheet(name, href) {
@@ -731,13 +754,15 @@ async function createReactor(localPackage) {
731
754
  const { manifest, processorFactory } = pkg;
732
755
  const name = manifest.name;
733
756
  const id = manifest.name;
734
- logger.info("Loading processor factory: @name", name);
757
+ const version = packageManager.getPackageVersion(name);
758
+ const label = version ? `${name}@${version}` : name;
759
+ logger.info("Loading processor factory: @label", label);
735
760
  try {
736
761
  const factory = await processorFactory?.(processorHostModule);
737
762
  if (!factory) return;
738
763
  await reactorClientModule.reactorModule?.processorManager.registerFactory(id, factory);
739
764
  } catch (error) {
740
- logger.error(`Error registering processor: @name`, name);
765
+ logger.error(`Error registering processor: @label`, label);
741
766
  logger.error("@error", error);
742
767
  }
743
768
  }));
@@ -755,4 +780,4 @@ function getDriveUrl() {
755
780
  //#endregion
756
781
  export { createReactor as n, clearReactorStorage as t };
757
782
 
758
- //# sourceMappingURL=reactor-CPD8Z_UP.js.map
783
+ //# sourceMappingURL=reactor-C0_wHi3h.js.map