@powerhousedao/connect 6.0.0-dev.84 → 6.0.0-dev.89

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.
@@ -4499,7 +4499,7 @@ var init_package = __esm(() => {
4499
4499
  package_default = {
4500
4500
  name: "@powerhousedao/connect",
4501
4501
  productName: "Powerhouse-Connect",
4502
- version: "6.0.0-dev.83",
4502
+ version: "6.0.0-dev.88",
4503
4503
  description: "Powerhouse Connect",
4504
4504
  main: "dist/index.html",
4505
4505
  type: "module",
@@ -4638,6 +4638,7 @@ import { isUndoRedo } from "document-model/core";
4638
4638
  import { deriveOperationId as deriveOperationId2 } from "document-model/core";
4639
4639
  import { ConsoleLogger } from "document-model/core";
4640
4640
  import { AbortError } from "document-drive/utils/errors";
4641
+ import { hashDocumentStateForScope } from "document-model/core";
4641
4642
  function createDocumentAction(input) {
4642
4643
  return {
4643
4644
  id: generateId(),
@@ -11192,6 +11193,11 @@ class CollectionMembershipCache {
11192
11193
  constructor(operationIndex) {
11193
11194
  this.operationIndex = operationIndex;
11194
11195
  }
11196
+ withScopedIndex(operationIndex) {
11197
+ const scoped = new CollectionMembershipCache(operationIndex);
11198
+ scoped.cache = this.cache;
11199
+ return scoped;
11200
+ }
11195
11201
  async getCollectionsForDocuments(documentIds) {
11196
11202
  const result = {};
11197
11203
  const missing = [];
@@ -11479,6 +11485,12 @@ class DocumentMetaCache {
11479
11485
  this.cache = new Map;
11480
11486
  this.lruTracker = new LRUTracker;
11481
11487
  }
11488
+ withScopedStore(operationStore) {
11489
+ const scoped = new DocumentMetaCache(operationStore, this.config);
11490
+ scoped.cache = this.cache;
11491
+ scoped.lruTracker = this.lruTracker;
11492
+ return scoped;
11493
+ }
11482
11494
  async startup() {
11483
11495
  return Promise.resolve();
11484
11496
  }
@@ -11628,9 +11640,18 @@ class KyselyOperationIndexTxn {
11628
11640
 
11629
11641
  class KyselyOperationIndex {
11630
11642
  db;
11643
+ trx;
11631
11644
  constructor(db) {
11632
11645
  this.db = db;
11633
11646
  }
11647
+ get queryExecutor() {
11648
+ return this.trx ?? this.db;
11649
+ }
11650
+ withTransaction(trx) {
11651
+ const instance = new KyselyOperationIndex(this.db);
11652
+ instance.trx = trx;
11653
+ return instance;
11654
+ }
11634
11655
  start() {
11635
11656
  return new KyselyOperationIndexTxn;
11636
11657
  }
@@ -11639,70 +11660,76 @@ class KyselyOperationIndex {
11639
11660
  throw new Error("Operation aborted");
11640
11661
  }
11641
11662
  const kyselyTxn = txn;
11663
+ if (this.trx) {
11664
+ return this.executeCommit(this.trx, kyselyTxn);
11665
+ }
11666
+ let resultOrdinals = [];
11667
+ await this.db.transaction().execute(async (trx) => {
11668
+ resultOrdinals = await this.executeCommit(trx, kyselyTxn);
11669
+ });
11670
+ return resultOrdinals;
11671
+ }
11672
+ async executeCommit(trx, kyselyTxn) {
11642
11673
  const collections = kyselyTxn.getCollections();
11643
11674
  const memberships = kyselyTxn.getCollectionMembershipRecords();
11644
11675
  const removals = kyselyTxn.getCollectionRemovals();
11645
11676
  const operations = kyselyTxn.getOperations();
11646
- let resultOrdinals = [];
11647
- await this.db.transaction().execute(async (trx) => {
11648
- if (collections.length > 0) {
11649
- const collectionRows = collections.map((collectionId) => ({
11650
- documentId: collectionId,
11651
- collectionId,
11652
- joinedOrdinal: BigInt(0),
11677
+ if (collections.length > 0) {
11678
+ const collectionRows = collections.map((collectionId) => ({
11679
+ documentId: collectionId,
11680
+ collectionId,
11681
+ joinedOrdinal: BigInt(0),
11682
+ leftOrdinal: null
11683
+ }));
11684
+ await trx.insertInto("document_collections").values(collectionRows).onConflict((oc) => oc.doNothing()).execute();
11685
+ }
11686
+ let operationOrdinals = [];
11687
+ if (operations.length > 0) {
11688
+ const operationRows = operations.map((op) => ({
11689
+ opId: op.id || "",
11690
+ documentId: op.documentId,
11691
+ documentType: op.documentType,
11692
+ scope: op.scope,
11693
+ branch: op.branch,
11694
+ timestampUtcMs: op.timestampUtcMs,
11695
+ index: op.index,
11696
+ skip: op.skip,
11697
+ hash: op.hash,
11698
+ action: op.action,
11699
+ sourceRemote: op.sourceRemote
11700
+ }));
11701
+ const insertedOps = await trx.insertInto("operation_index_operations").values(operationRows).returning("ordinal").execute();
11702
+ operationOrdinals = insertedOps.map((row) => row.ordinal);
11703
+ }
11704
+ if (memberships.length > 0) {
11705
+ for (const m of memberships) {
11706
+ const ordinal = operationOrdinals[m.operationIndex];
11707
+ await trx.insertInto("document_collections").values({
11708
+ documentId: m.documentId,
11709
+ collectionId: m.collectionId,
11710
+ joinedOrdinal: BigInt(ordinal),
11653
11711
  leftOrdinal: null
11654
- }));
11655
- await trx.insertInto("document_collections").values(collectionRows).onConflict((oc) => oc.doNothing()).execute();
11656
- }
11657
- let operationOrdinals = [];
11658
- if (operations.length > 0) {
11659
- const operationRows = operations.map((op) => ({
11660
- opId: op.id || "",
11661
- documentId: op.documentId,
11662
- documentType: op.documentType,
11663
- scope: op.scope,
11664
- branch: op.branch,
11665
- timestampUtcMs: op.timestampUtcMs,
11666
- index: op.index,
11667
- skip: op.skip,
11668
- hash: op.hash,
11669
- action: op.action,
11670
- sourceRemote: op.sourceRemote
11671
- }));
11672
- const insertedOps = await trx.insertInto("operation_index_operations").values(operationRows).returning("ordinal").execute();
11673
- operationOrdinals = insertedOps.map((row) => row.ordinal);
11674
- resultOrdinals = operationOrdinals;
11675
- }
11676
- if (memberships.length > 0) {
11677
- for (const m of memberships) {
11678
- const ordinal = operationOrdinals[m.operationIndex];
11679
- await trx.insertInto("document_collections").values({
11680
- documentId: m.documentId,
11681
- collectionId: m.collectionId,
11682
- joinedOrdinal: BigInt(ordinal),
11683
- leftOrdinal: null
11684
- }).onConflict((oc) => oc.columns(["documentId", "collectionId"]).doUpdateSet({
11685
- joinedOrdinal: BigInt(ordinal),
11686
- leftOrdinal: null
11687
- })).execute();
11688
- }
11712
+ }).onConflict((oc) => oc.columns(["documentId", "collectionId"]).doUpdateSet({
11713
+ joinedOrdinal: BigInt(ordinal),
11714
+ leftOrdinal: null
11715
+ })).execute();
11689
11716
  }
11690
- if (removals.length > 0) {
11691
- for (const r of removals) {
11692
- const ordinal = operationOrdinals[r.operationIndex];
11693
- await trx.updateTable("document_collections").set({
11694
- leftOrdinal: BigInt(ordinal)
11695
- }).where("collectionId", "=", r.collectionId).where("documentId", "=", r.documentId).where("leftOrdinal", "is", null).execute();
11696
- }
11717
+ }
11718
+ if (removals.length > 0) {
11719
+ for (const r of removals) {
11720
+ const ordinal = operationOrdinals[r.operationIndex];
11721
+ await trx.updateTable("document_collections").set({
11722
+ leftOrdinal: BigInt(ordinal)
11723
+ }).where("collectionId", "=", r.collectionId).where("documentId", "=", r.documentId).where("leftOrdinal", "is", null).execute();
11697
11724
  }
11698
- });
11699
- return resultOrdinals;
11725
+ }
11726
+ return operationOrdinals;
11700
11727
  }
11701
11728
  async find(collectionId, cursor, view, paging, signal) {
11702
11729
  if (signal?.aborted) {
11703
11730
  throw new Error("Operation aborted");
11704
11731
  }
11705
- let query = this.db.selectFrom("operation_index_operations as oi").innerJoin("document_collections as dc", "oi.documentId", "dc.documentId").selectAll("oi").select(["dc.documentId", "dc.collectionId"]).where("dc.collectionId", "=", collectionId).where(sql`(dc."leftOrdinal" IS NULL OR oi.ordinal < dc."leftOrdinal")`).orderBy("oi.ordinal", "asc");
11732
+ let query = this.queryExecutor.selectFrom("operation_index_operations as oi").innerJoin("document_collections as dc", "oi.documentId", "dc.documentId").selectAll("oi").select(["dc.documentId", "dc.collectionId"]).where("dc.collectionId", "=", collectionId).where(sql`(dc."leftOrdinal" IS NULL OR oi.ordinal < dc."leftOrdinal")`).orderBy("oi.ordinal", "asc");
11706
11733
  if (cursor !== undefined) {
11707
11734
  query = query.where("oi.ordinal", ">", cursor);
11708
11735
  }
@@ -11744,7 +11771,7 @@ class KyselyOperationIndex {
11744
11771
  if (signal?.aborted) {
11745
11772
  throw new Error("Operation aborted");
11746
11773
  }
11747
- let query = this.db.selectFrom("operation_index_operations").selectAll().where("documentId", "=", documentId).orderBy("ordinal", "asc");
11774
+ let query = this.queryExecutor.selectFrom("operation_index_operations").selectAll().where("documentId", "=", documentId).orderBy("ordinal", "asc");
11748
11775
  if (view?.branch) {
11749
11776
  query = query.where("branch", "=", view.branch);
11750
11777
  }
@@ -11780,7 +11807,7 @@ class KyselyOperationIndex {
11780
11807
  if (signal?.aborted) {
11781
11808
  throw new Error("Operation aborted");
11782
11809
  }
11783
- let query = this.db.selectFrom("operation_index_operations").selectAll().where("ordinal", ">", ordinal).orderBy("ordinal", "asc");
11810
+ let query = this.queryExecutor.selectFrom("operation_index_operations").selectAll().where("ordinal", ">", ordinal).orderBy("ordinal", "asc");
11784
11811
  if (paging?.cursor) {
11785
11812
  const cursorOrdinal = Number.parseInt(paging.cursor, 10);
11786
11813
  query = query.where("ordinal", ">", cursorOrdinal);
@@ -11845,14 +11872,14 @@ class KyselyOperationIndex {
11845
11872
  if (signal?.aborted) {
11846
11873
  throw new Error("Operation aborted");
11847
11874
  }
11848
- const result = await this.db.selectFrom("operation_index_operations as oi").innerJoin("document_collections as dc", "oi.documentId", "dc.documentId").select("oi.timestampUtcMs").where("dc.collectionId", "=", collectionId).where(sql`(dc."leftOrdinal" IS NULL OR oi.ordinal < dc."leftOrdinal")`).orderBy("oi.ordinal", "desc").limit(1).executeTakeFirst();
11875
+ const result = await this.queryExecutor.selectFrom("operation_index_operations as oi").innerJoin("document_collections as dc", "oi.documentId", "dc.documentId").select("oi.timestampUtcMs").where("dc.collectionId", "=", collectionId).where(sql`(dc."leftOrdinal" IS NULL OR oi.ordinal < dc."leftOrdinal")`).orderBy("oi.ordinal", "desc").limit(1).executeTakeFirst();
11849
11876
  return result?.timestampUtcMs ?? null;
11850
11877
  }
11851
11878
  async getCollectionsForDocuments(documentIds) {
11852
11879
  if (documentIds.length === 0) {
11853
11880
  return {};
11854
11881
  }
11855
- const rows = await this.db.selectFrom("document_collections").select(["documentId", "collectionId"]).where("documentId", "in", documentIds).where("leftOrdinal", "is", null).execute();
11882
+ const rows = await this.queryExecutor.selectFrom("document_collections").select(["documentId", "collectionId"]).where("documentId", "in", documentIds).where("leftOrdinal", "is", null).execute();
11856
11883
  const result = {};
11857
11884
  for (const row of rows) {
11858
11885
  if (!(row.documentId in result)) {
@@ -11906,6 +11933,10 @@ class RingBuffer {
11906
11933
  return this.size;
11907
11934
  }
11908
11935
  }
11936
+ function extractModuleVersion(doc) {
11937
+ const v = doc.state.document.version;
11938
+ return v === 0 ? undefined : v;
11939
+ }
11909
11940
 
11910
11941
  class KyselyWriteCache {
11911
11942
  streams;
@@ -11926,6 +11957,12 @@ class KyselyWriteCache {
11926
11957
  this.streams = new Map;
11927
11958
  this.lruTracker = new LRUTracker;
11928
11959
  }
11960
+ withScopedStores(operationStore, keyframeStore) {
11961
+ const scoped = new KyselyWriteCache(keyframeStore, operationStore, this.registry, this.config);
11962
+ scoped.streams = this.streams;
11963
+ scoped.lruTracker = this.lruTracker;
11964
+ return scoped;
11965
+ }
11929
11966
  async startup() {
11930
11967
  return Promise.resolve();
11931
11968
  }
@@ -12064,7 +12101,7 @@ class KyselyWriteCache {
12064
12101
  throw new Error(`Failed to rebuild document ${documentId}: CREATE_DOCUMENT action missing model in input`);
12065
12102
  }
12066
12103
  document2 = createDocumentFromAction(documentCreateAction);
12067
- const docModule = this.registry.getModule(documentType);
12104
+ let docModule = this.registry.getModule(documentType, extractModuleVersion(document2));
12068
12105
  const docScopeOps = await this.operationStore.getSince(documentId, "document", branch, 0, undefined, undefined, signal);
12069
12106
  for (const operation of docScopeOps.results) {
12070
12107
  if (operation.index === 0) {
@@ -12073,6 +12110,7 @@ class KyselyWriteCache {
12073
12110
  if (operation.action.type === "UPGRADE_DOCUMENT") {
12074
12111
  const upgradeAction = operation.action;
12075
12112
  document2 = applyUpgradeDocumentAction(document2, upgradeAction);
12113
+ docModule = this.registry.getModule(documentType, extractModuleVersion(document2));
12076
12114
  } else if (operation.action.type === "DELETE_DOCUMENT") {
12077
12115
  applyDeleteDocumentAction(document2, operation.action);
12078
12116
  } else {
@@ -12084,7 +12122,7 @@ class KyselyWriteCache {
12084
12122
  }
12085
12123
  }
12086
12124
  }
12087
- const module = this.registry.getModule(documentType);
12125
+ const module = this.registry.getModule(documentType, extractModuleVersion(document2));
12088
12126
  let cursor = undefined;
12089
12127
  const pageSize = 100;
12090
12128
  let hasMorePages;
@@ -12234,6 +12272,63 @@ class EventBus {
12234
12272
  }
12235
12273
  }
12236
12274
 
12275
+ class DefaultExecutionScope {
12276
+ operationStore;
12277
+ operationIndex;
12278
+ writeCache;
12279
+ documentMetaCache;
12280
+ collectionMembershipCache;
12281
+ constructor(operationStore, operationIndex, writeCache, documentMetaCache, collectionMembershipCache) {
12282
+ this.operationStore = operationStore;
12283
+ this.operationIndex = operationIndex;
12284
+ this.writeCache = writeCache;
12285
+ this.documentMetaCache = documentMetaCache;
12286
+ this.collectionMembershipCache = collectionMembershipCache;
12287
+ }
12288
+ async run(fn) {
12289
+ return fn({
12290
+ operationStore: this.operationStore,
12291
+ operationIndex: this.operationIndex,
12292
+ writeCache: this.writeCache,
12293
+ documentMetaCache: this.documentMetaCache,
12294
+ collectionMembershipCache: this.collectionMembershipCache
12295
+ });
12296
+ }
12297
+ }
12298
+
12299
+ class KyselyExecutionScope {
12300
+ db;
12301
+ operationStore;
12302
+ operationIndex;
12303
+ keyframeStore;
12304
+ writeCache;
12305
+ documentMetaCache;
12306
+ collectionMembershipCache;
12307
+ constructor(db, operationStore, operationIndex, keyframeStore, writeCache, documentMetaCache, collectionMembershipCache) {
12308
+ this.db = db;
12309
+ this.operationStore = operationStore;
12310
+ this.operationIndex = operationIndex;
12311
+ this.keyframeStore = keyframeStore;
12312
+ this.writeCache = writeCache;
12313
+ this.documentMetaCache = documentMetaCache;
12314
+ this.collectionMembershipCache = collectionMembershipCache;
12315
+ }
12316
+ async run(fn) {
12317
+ return this.db.transaction().execute(async (trx) => {
12318
+ const scopedOperationStore = this.operationStore.withTransaction(trx);
12319
+ const scopedOperationIndex = this.operationIndex.withTransaction(trx);
12320
+ const scopedKeyframeStore = this.keyframeStore.withTransaction(trx);
12321
+ return fn({
12322
+ operationStore: scopedOperationStore,
12323
+ operationIndex: scopedOperationIndex,
12324
+ writeCache: this.writeCache.withScopedStores(scopedOperationStore, scopedKeyframeStore),
12325
+ documentMetaCache: this.documentMetaCache.withScopedStore(scopedOperationStore),
12326
+ collectionMembershipCache: this.collectionMembershipCache.withScopedIndex(scopedOperationIndex)
12327
+ });
12328
+ });
12329
+ }
12330
+ }
12331
+
12237
12332
  class DocumentModelRegistry {
12238
12333
  modules = [];
12239
12334
  manifests = [];
@@ -12693,37 +12788,29 @@ function driveCollectionId(branch, driveId) {
12693
12788
  }
12694
12789
 
12695
12790
  class DocumentActionHandler {
12696
- writeCache;
12697
- operationStore;
12698
- documentMetaCache;
12699
- collectionMembershipCache;
12700
12791
  registry;
12701
12792
  logger;
12702
- constructor(writeCache, operationStore, documentMetaCache, collectionMembershipCache, registry, logger2) {
12703
- this.writeCache = writeCache;
12704
- this.operationStore = operationStore;
12705
- this.documentMetaCache = documentMetaCache;
12706
- this.collectionMembershipCache = collectionMembershipCache;
12793
+ constructor(registry, logger2) {
12707
12794
  this.registry = registry;
12708
12795
  this.logger = logger2;
12709
12796
  }
12710
- async execute(job, action, startTime, indexTxn, skip = 0, sourceRemote = "") {
12797
+ async execute(job, action, startTime, indexTxn, stores, skip = 0, sourceRemote = "") {
12711
12798
  switch (action.type) {
12712
12799
  case "CREATE_DOCUMENT":
12713
- return this.executeCreate(job, action, startTime, indexTxn, skip, sourceRemote);
12800
+ return this.executeCreate(job, action, startTime, indexTxn, stores, skip, sourceRemote);
12714
12801
  case "DELETE_DOCUMENT":
12715
- return this.executeDelete(job, action, startTime, indexTxn, sourceRemote);
12802
+ return this.executeDelete(job, action, startTime, indexTxn, stores, sourceRemote);
12716
12803
  case "UPGRADE_DOCUMENT":
12717
- return this.executeUpgrade(job, action, startTime, indexTxn, skip, sourceRemote);
12804
+ return this.executeUpgrade(job, action, startTime, indexTxn, stores, skip, sourceRemote);
12718
12805
  case "ADD_RELATIONSHIP":
12719
- return this.executeAddRelationship(job, action, startTime, indexTxn, sourceRemote);
12806
+ return this.executeAddRelationship(job, action, startTime, indexTxn, stores, sourceRemote);
12720
12807
  case "REMOVE_RELATIONSHIP":
12721
- return this.executeRemoveRelationship(job, action, startTime, indexTxn, sourceRemote);
12808
+ return this.executeRemoveRelationship(job, action, startTime, indexTxn, stores, sourceRemote);
12722
12809
  default:
12723
12810
  return buildErrorResult(job, new Error(`Unknown document action type: ${action.type}`), startTime);
12724
12811
  }
12725
12812
  }
12726
- async executeCreate(job, action, startTime, indexTxn, skip = 0, sourceRemote = "") {
12813
+ async executeCreate(job, action, startTime, indexTxn, stores, skip = 0, sourceRemote = "") {
12727
12814
  if (job.scope !== "document") {
12728
12815
  return {
12729
12816
  job,
@@ -12743,12 +12830,12 @@ class DocumentActionHandler {
12743
12830
  ...document2.state
12744
12831
  };
12745
12832
  const resultingState = JSON.stringify(resultingStateObj);
12746
- const writeError = await this.writeOperationToStore(document2.header.id, document2.header.documentType, job.scope, job.branch, operation, job, startTime);
12833
+ const writeError = await this.writeOperationToStore(document2.header.id, document2.header.documentType, job.scope, job.branch, operation, job, startTime, stores);
12747
12834
  if (writeError !== null) {
12748
12835
  return writeError;
12749
12836
  }
12750
12837
  updateDocumentRevision(document2, job.scope, operation.index);
12751
- this.writeCache.putState(document2.header.id, job.scope, job.branch, operation.index, document2);
12838
+ stores.writeCache.putState(document2.header.id, job.scope, job.branch, operation.index, document2);
12752
12839
  indexTxn.write([
12753
12840
  {
12754
12841
  ...operation,
@@ -12764,14 +12851,14 @@ class DocumentActionHandler {
12764
12851
  indexTxn.createCollection(collectionId);
12765
12852
  indexTxn.addToCollection(collectionId, document2.header.id);
12766
12853
  }
12767
- this.documentMetaCache.putDocumentMeta(document2.header.id, job.branch, {
12854
+ stores.documentMetaCache.putDocumentMeta(document2.header.id, job.branch, {
12768
12855
  state: document2.state.document,
12769
12856
  documentType: document2.header.documentType,
12770
12857
  documentScopeRevision: 1
12771
12858
  });
12772
12859
  return buildSuccessResult(job, operation, document2.header.id, document2.header.documentType, resultingState, startTime);
12773
12860
  }
12774
- async executeDelete(job, action, startTime, indexTxn, sourceRemote = "") {
12861
+ async executeDelete(job, action, startTime, indexTxn, stores, sourceRemote = "") {
12775
12862
  const input = action.input;
12776
12863
  if (!input.documentId) {
12777
12864
  return buildErrorResult(job, new Error("DELETE_DOCUMENT action requires a documentId in input"), startTime);
@@ -12779,7 +12866,7 @@ class DocumentActionHandler {
12779
12866
  const documentId = input.documentId;
12780
12867
  let document2;
12781
12868
  try {
12782
- document2 = await this.writeCache.getState(documentId, job.scope, job.branch);
12869
+ document2 = await stores.writeCache.getState(documentId, job.scope, job.branch);
12783
12870
  } catch (error) {
12784
12871
  return buildErrorResult(job, new Error(`Failed to fetch document before deletion: ${error instanceof Error ? error.message : String(error)}`), startTime);
12785
12872
  }
@@ -12799,12 +12886,12 @@ class DocumentActionHandler {
12799
12886
  document: document2.state.document
12800
12887
  };
12801
12888
  const resultingState = JSON.stringify(resultingStateObj);
12802
- const writeError = await this.writeOperationToStore(documentId, document2.header.documentType, job.scope, job.branch, operation, job, startTime);
12889
+ const writeError = await this.writeOperationToStore(documentId, document2.header.documentType, job.scope, job.branch, operation, job, startTime, stores);
12803
12890
  if (writeError !== null) {
12804
12891
  return writeError;
12805
12892
  }
12806
12893
  updateDocumentRevision(document2, job.scope, operation.index);
12807
- this.writeCache.putState(documentId, job.scope, job.branch, operation.index, document2);
12894
+ stores.writeCache.putState(documentId, job.scope, job.branch, operation.index, document2);
12808
12895
  indexTxn.write([
12809
12896
  {
12810
12897
  ...operation,
@@ -12815,14 +12902,14 @@ class DocumentActionHandler {
12815
12902
  sourceRemote
12816
12903
  }
12817
12904
  ]);
12818
- this.documentMetaCache.putDocumentMeta(documentId, job.branch, {
12905
+ stores.documentMetaCache.putDocumentMeta(documentId, job.branch, {
12819
12906
  state: document2.state.document,
12820
12907
  documentType: document2.header.documentType,
12821
12908
  documentScopeRevision: operation.index + 1
12822
12909
  });
12823
12910
  return buildSuccessResult(job, operation, documentId, document2.header.documentType, resultingState, startTime);
12824
12911
  }
12825
- async executeUpgrade(job, action, startTime, indexTxn, skip = 0, sourceRemote = "") {
12912
+ async executeUpgrade(job, action, startTime, indexTxn, stores, skip = 0, sourceRemote = "") {
12826
12913
  const input = action.input;
12827
12914
  if (!input.documentId) {
12828
12915
  return buildErrorResult(job, new Error("UPGRADE_DOCUMENT action requires a documentId in input"), startTime);
@@ -12832,7 +12919,7 @@ class DocumentActionHandler {
12832
12919
  const toVersion = input.toVersion;
12833
12920
  let document2;
12834
12921
  try {
12835
- document2 = await this.writeCache.getState(documentId, job.scope, job.branch);
12922
+ document2 = await stores.writeCache.getState(documentId, job.scope, job.branch);
12836
12923
  } catch (error) {
12837
12924
  return buildErrorResult(job, new Error(`Failed to fetch document for upgrade: ${error instanceof Error ? error.message : String(error)}`), startTime);
12838
12925
  }
@@ -12873,12 +12960,12 @@ class DocumentActionHandler {
12873
12960
  ...document2.state
12874
12961
  };
12875
12962
  const resultingState = JSON.stringify(resultingStateObj);
12876
- const writeError = await this.writeOperationToStore(documentId, document2.header.documentType, job.scope, job.branch, operation, job, startTime);
12963
+ const writeError = await this.writeOperationToStore(documentId, document2.header.documentType, job.scope, job.branch, operation, job, startTime, stores);
12877
12964
  if (writeError !== null) {
12878
12965
  return writeError;
12879
12966
  }
12880
12967
  updateDocumentRevision(document2, job.scope, operation.index);
12881
- this.writeCache.putState(documentId, job.scope, job.branch, operation.index, document2);
12968
+ stores.writeCache.putState(documentId, job.scope, job.branch, operation.index, document2);
12882
12969
  indexTxn.write([
12883
12970
  {
12884
12971
  ...operation,
@@ -12889,14 +12976,14 @@ class DocumentActionHandler {
12889
12976
  sourceRemote
12890
12977
  }
12891
12978
  ]);
12892
- this.documentMetaCache.putDocumentMeta(documentId, job.branch, {
12979
+ stores.documentMetaCache.putDocumentMeta(documentId, job.branch, {
12893
12980
  state: document2.state.document,
12894
12981
  documentType: document2.header.documentType,
12895
12982
  documentScopeRevision: operation.index + 1
12896
12983
  });
12897
12984
  return buildSuccessResult(job, operation, documentId, document2.header.documentType, resultingState, startTime);
12898
12985
  }
12899
- async executeAddRelationship(job, action, startTime, indexTxn, sourceRemote = "") {
12986
+ async executeAddRelationship(job, action, startTime, indexTxn, stores, sourceRemote = "") {
12900
12987
  if (job.scope !== "document") {
12901
12988
  return buildErrorResult(job, new Error(`ADD_RELATIONSHIP must be in "document" scope, got "${job.scope}"`), startTime);
12902
12989
  }
@@ -12909,7 +12996,7 @@ class DocumentActionHandler {
12909
12996
  }
12910
12997
  let sourceDoc;
12911
12998
  try {
12912
- sourceDoc = await this.writeCache.getState(input.sourceId, "document", job.branch);
12999
+ sourceDoc = await stores.writeCache.getState(input.sourceId, "document", job.branch);
12913
13000
  } catch (error) {
12914
13001
  return buildErrorResult(job, new Error(`ADD_RELATIONSHIP: source document ${input.sourceId} not found: ${error instanceof Error ? error.message : String(error)}`), startTime);
12915
13002
  }
@@ -12919,7 +13006,7 @@ class DocumentActionHandler {
12919
13006
  scope: job.scope,
12920
13007
  branch: job.branch
12921
13008
  });
12922
- const writeError = await this.writeOperationToStore(input.sourceId, sourceDoc.header.documentType, job.scope, job.branch, operation, job, startTime);
13009
+ const writeError = await this.writeOperationToStore(input.sourceId, sourceDoc.header.documentType, job.scope, job.branch, operation, job, startTime, stores);
12923
13010
  if (writeError !== null) {
12924
13011
  return writeError;
12925
13012
  }
@@ -12935,7 +13022,7 @@ class DocumentActionHandler {
12935
13022
  [job.scope]: scopeState === undefined ? {} : structuredClone(scopeState)
12936
13023
  };
12937
13024
  const resultingState = JSON.stringify(resultingStateObj);
12938
- this.writeCache.putState(input.sourceId, job.scope, job.branch, operation.index, sourceDoc);
13025
+ stores.writeCache.putState(input.sourceId, job.scope, job.branch, operation.index, sourceDoc);
12939
13026
  indexTxn.write([
12940
13027
  {
12941
13028
  ...operation,
@@ -12949,16 +13036,16 @@ class DocumentActionHandler {
12949
13036
  if (sourceDoc.header.documentType === "powerhouse/document-drive") {
12950
13037
  const collectionId = driveCollectionId(job.branch, input.sourceId);
12951
13038
  indexTxn.addToCollection(collectionId, input.targetId);
12952
- this.collectionMembershipCache.invalidate(input.targetId);
13039
+ stores.collectionMembershipCache.invalidate(input.targetId);
12953
13040
  }
12954
- this.documentMetaCache.putDocumentMeta(input.sourceId, job.branch, {
13041
+ stores.documentMetaCache.putDocumentMeta(input.sourceId, job.branch, {
12955
13042
  state: sourceDoc.state.document,
12956
13043
  documentType: sourceDoc.header.documentType,
12957
13044
  documentScopeRevision: operation.index + 1
12958
13045
  });
12959
13046
  return buildSuccessResult(job, operation, input.sourceId, sourceDoc.header.documentType, resultingState, startTime);
12960
13047
  }
12961
- async executeRemoveRelationship(job, action, startTime, indexTxn, sourceRemote = "") {
13048
+ async executeRemoveRelationship(job, action, startTime, indexTxn, stores, sourceRemote = "") {
12962
13049
  if (job.scope !== "document") {
12963
13050
  return buildErrorResult(job, new Error(`REMOVE_RELATIONSHIP must be in "document" scope, got "${job.scope}"`), startTime);
12964
13051
  }
@@ -12968,7 +13055,7 @@ class DocumentActionHandler {
12968
13055
  }
12969
13056
  let sourceDoc;
12970
13057
  try {
12971
- sourceDoc = await this.writeCache.getState(input.sourceId, "document", job.branch);
13058
+ sourceDoc = await stores.writeCache.getState(input.sourceId, "document", job.branch);
12972
13059
  } catch (error) {
12973
13060
  return buildErrorResult(job, new Error(`REMOVE_RELATIONSHIP: source document ${input.sourceId} not found: ${error instanceof Error ? error.message : String(error)}`), startTime);
12974
13061
  }
@@ -12978,7 +13065,7 @@ class DocumentActionHandler {
12978
13065
  scope: job.scope,
12979
13066
  branch: job.branch
12980
13067
  });
12981
- const writeError = await this.writeOperationToStore(input.sourceId, sourceDoc.header.documentType, job.scope, job.branch, operation, job, startTime);
13068
+ const writeError = await this.writeOperationToStore(input.sourceId, sourceDoc.header.documentType, job.scope, job.branch, operation, job, startTime, stores);
12982
13069
  if (writeError !== null) {
12983
13070
  return writeError;
12984
13071
  }
@@ -12994,7 +13081,7 @@ class DocumentActionHandler {
12994
13081
  [job.scope]: scopeState === undefined ? {} : structuredClone(scopeState)
12995
13082
  };
12996
13083
  const resultingState = JSON.stringify(resultingStateObj);
12997
- this.writeCache.putState(input.sourceId, job.scope, job.branch, operation.index, sourceDoc);
13084
+ stores.writeCache.putState(input.sourceId, job.scope, job.branch, operation.index, sourceDoc);
12998
13085
  indexTxn.write([
12999
13086
  {
13000
13087
  ...operation,
@@ -13008,24 +13095,24 @@ class DocumentActionHandler {
13008
13095
  if (sourceDoc.header.documentType === "powerhouse/document-drive") {
13009
13096
  const collectionId = driveCollectionId(job.branch, input.sourceId);
13010
13097
  indexTxn.removeFromCollection(collectionId, input.targetId);
13011
- this.collectionMembershipCache.invalidate(input.targetId);
13098
+ stores.collectionMembershipCache.invalidate(input.targetId);
13012
13099
  }
13013
- this.documentMetaCache.putDocumentMeta(input.sourceId, job.branch, {
13100
+ stores.documentMetaCache.putDocumentMeta(input.sourceId, job.branch, {
13014
13101
  state: sourceDoc.state.document,
13015
13102
  documentType: sourceDoc.header.documentType,
13016
13103
  documentScopeRevision: operation.index + 1
13017
13104
  });
13018
13105
  return buildSuccessResult(job, operation, input.sourceId, sourceDoc.header.documentType, resultingState, startTime);
13019
13106
  }
13020
- async writeOperationToStore(documentId, documentType, scope, branch, operation, job, startTime) {
13107
+ async writeOperationToStore(documentId, documentType, scope, branch, operation, job, startTime, stores) {
13021
13108
  try {
13022
- await this.operationStore.apply(documentId, documentType, scope, branch, operation.index, (txn) => {
13109
+ await stores.operationStore.apply(documentId, documentType, scope, branch, operation.index, (txn) => {
13023
13110
  txn.addOperations(operation);
13024
13111
  });
13025
13112
  return null;
13026
13113
  } catch (error) {
13027
13114
  this.logger.error("Error writing @Operation to IOperationStore: @Error", operation, error);
13028
- this.writeCache.invalidate(documentId, scope, branch);
13115
+ stores.writeCache.invalidate(documentId, scope, branch);
13029
13116
  return {
13030
13117
  job,
13031
13118
  success: false,
@@ -13114,7 +13201,8 @@ class SimpleJobExecutor {
13114
13201
  config;
13115
13202
  signatureVerifierModule;
13116
13203
  documentActionHandler;
13117
- constructor(logger2, registry, operationStore, eventBus, writeCache, operationIndex, documentMetaCache, collectionMembershipCache, config, signatureVerifier) {
13204
+ executionScope;
13205
+ constructor(logger2, registry, operationStore, eventBus, writeCache, operationIndex, documentMetaCache, collectionMembershipCache, config, signatureVerifier, executionScope) {
13118
13206
  this.logger = logger2;
13119
13207
  this.registry = registry;
13120
13208
  this.operationStore = operationStore;
@@ -13131,71 +13219,101 @@ class SimpleJobExecutor {
13131
13219
  retryMaxDelayMs: config.retryMaxDelayMs ?? 5000
13132
13220
  };
13133
13221
  this.signatureVerifierModule = new SignatureVerifier(signatureVerifier);
13134
- this.documentActionHandler = new DocumentActionHandler(writeCache, operationStore, documentMetaCache, collectionMembershipCache, registry, logger2);
13222
+ this.documentActionHandler = new DocumentActionHandler(registry, logger2);
13223
+ this.executionScope = executionScope ?? new DefaultExecutionScope(operationStore, operationIndex, writeCache, documentMetaCache, collectionMembershipCache);
13135
13224
  }
13136
13225
  async executeJob(job) {
13137
13226
  const startTime = Date.now();
13138
- const indexTxn = this.operationIndex.start();
13139
- if (job.kind === "load") {
13140
- const result2 = await this.executeLoadJob(job, startTime, indexTxn);
13141
- if (result2.success && result2.operationsWithContext) {
13142
- const ordinals2 = await this.operationIndex.commit(indexTxn);
13143
- for (let i = 0;i < result2.operationsWithContext.length; i++) {
13144
- result2.operationsWithContext[i].context.ordinal = ordinals2[i];
13227
+ const touchedCacheEntries = [];
13228
+ let pendingEvent;
13229
+ let result;
13230
+ try {
13231
+ result = await this.executionScope.run(async (stores) => {
13232
+ const indexTxn = stores.operationIndex.start();
13233
+ if (job.kind === "load") {
13234
+ const loadResult = await this.executeLoadJob(job, startTime, indexTxn, stores);
13235
+ if (loadResult.success && loadResult.operationsWithContext) {
13236
+ for (const owc of loadResult.operationsWithContext) {
13237
+ touchedCacheEntries.push({
13238
+ documentId: owc.context.documentId,
13239
+ scope: owc.context.scope,
13240
+ branch: owc.context.branch
13241
+ });
13242
+ }
13243
+ const ordinals2 = await stores.operationIndex.commit(indexTxn);
13244
+ for (let i = 0;i < loadResult.operationsWithContext.length; i++) {
13245
+ loadResult.operationsWithContext[i].context.ordinal = ordinals2[i];
13246
+ }
13247
+ const collectionMemberships = loadResult.operationsWithContext.length > 0 ? await this.getCollectionMembershipsForOperations(loadResult.operationsWithContext, stores) : {};
13248
+ pendingEvent = {
13249
+ jobId: job.id,
13250
+ operations: loadResult.operationsWithContext,
13251
+ jobMeta: job.meta,
13252
+ collectionMemberships
13253
+ };
13254
+ }
13255
+ return loadResult;
13145
13256
  }
13146
- const collectionMemberships = result2.operationsWithContext.length > 0 ? await this.getCollectionMembershipsForOperations(result2.operationsWithContext) : {};
13147
- const event = {
13148
- jobId: job.id,
13149
- operations: result2.operationsWithContext,
13150
- jobMeta: job.meta,
13151
- collectionMemberships
13257
+ const actionResult = await this.processActions(job, job.actions, startTime, indexTxn, stores);
13258
+ if (!actionResult.success) {
13259
+ return {
13260
+ job,
13261
+ success: false,
13262
+ error: actionResult.error,
13263
+ duration: Date.now() - startTime
13264
+ };
13265
+ }
13266
+ if (actionResult.operationsWithContext.length > 0) {
13267
+ for (const owc of actionResult.operationsWithContext) {
13268
+ touchedCacheEntries.push({
13269
+ documentId: owc.context.documentId,
13270
+ scope: owc.context.scope,
13271
+ branch: owc.context.branch
13272
+ });
13273
+ }
13274
+ }
13275
+ const ordinals = await stores.operationIndex.commit(indexTxn);
13276
+ if (actionResult.operationsWithContext.length > 0) {
13277
+ for (let i = 0;i < actionResult.operationsWithContext.length; i++) {
13278
+ actionResult.operationsWithContext[i].context.ordinal = ordinals[i];
13279
+ }
13280
+ const collectionMemberships = await this.getCollectionMembershipsForOperations(actionResult.operationsWithContext, stores);
13281
+ pendingEvent = {
13282
+ jobId: job.id,
13283
+ operations: actionResult.operationsWithContext,
13284
+ jobMeta: job.meta,
13285
+ collectionMemberships
13286
+ };
13287
+ }
13288
+ return {
13289
+ job,
13290
+ success: true,
13291
+ operations: actionResult.generatedOperations,
13292
+ operationsWithContext: actionResult.operationsWithContext,
13293
+ duration: Date.now() - startTime
13152
13294
  };
13153
- this.eventBus.emit(ReactorEventTypes.JOB_WRITE_READY, event).catch((error) => {
13154
- this.logger.error("Failed to emit JOB_WRITE_READY event: @Event : @Error", event, error);
13155
- });
13295
+ });
13296
+ } catch (error) {
13297
+ for (const entry of touchedCacheEntries) {
13298
+ this.writeCache.invalidate(entry.documentId, entry.scope, entry.branch);
13299
+ this.documentMetaCache.invalidate(entry.documentId, entry.branch);
13156
13300
  }
13157
- return result2;
13158
- }
13159
- const result = await this.processActions(job, job.actions, startTime, indexTxn);
13160
- if (!result.success) {
13161
- return {
13162
- job,
13163
- success: false,
13164
- error: result.error,
13165
- duration: Date.now() - startTime
13166
- };
13301
+ throw error;
13167
13302
  }
13168
- const ordinals = await this.operationIndex.commit(indexTxn);
13169
- if (result.operationsWithContext.length > 0) {
13170
- for (let i = 0;i < result.operationsWithContext.length; i++) {
13171
- result.operationsWithContext[i].context.ordinal = ordinals[i];
13172
- }
13173
- const collectionMemberships = await this.getCollectionMembershipsForOperations(result.operationsWithContext);
13174
- const event = {
13175
- jobId: job.id,
13176
- operations: result.operationsWithContext,
13177
- jobMeta: job.meta,
13178
- collectionMemberships
13179
- };
13180
- this.eventBus.emit(ReactorEventTypes.JOB_WRITE_READY, event).catch((error) => {
13181
- this.logger.error("Failed to emit JOB_WRITE_READY event: @Event : @Error", event, error);
13303
+ if (pendingEvent) {
13304
+ this.eventBus.emit(ReactorEventTypes.JOB_WRITE_READY, pendingEvent).catch((error) => {
13305
+ this.logger.error("Failed to emit JOB_WRITE_READY event: @Event : @Error", pendingEvent, error);
13182
13306
  });
13183
13307
  }
13184
- return {
13185
- job,
13186
- success: true,
13187
- operations: result.generatedOperations,
13188
- operationsWithContext: result.operationsWithContext,
13189
- duration: Date.now() - startTime
13190
- };
13308
+ return result;
13191
13309
  }
13192
- async getCollectionMembershipsForOperations(operations) {
13310
+ async getCollectionMembershipsForOperations(operations, stores) {
13193
13311
  const documentIds = [
13194
13312
  ...new Set(operations.map((op) => op.context.documentId))
13195
13313
  ];
13196
- return this.collectionMembershipCache.getCollectionsForDocuments(documentIds);
13314
+ return stores.collectionMembershipCache.getCollectionsForDocuments(documentIds);
13197
13315
  }
13198
- async processActions(job, actions2, startTime, indexTxn, skipValues, sourceOperations, sourceRemote = "") {
13316
+ async processActions(job, actions2, startTime, indexTxn, stores, skipValues, sourceOperations, sourceRemote = "") {
13199
13317
  const generatedOperations = [];
13200
13318
  const operationsWithContext = [];
13201
13319
  try {
@@ -13213,7 +13331,7 @@ class SimpleJobExecutor {
13213
13331
  const skip = skipValues?.[actionIndex] ?? 0;
13214
13332
  const sourceOperation = sourceOperations?.[actionIndex];
13215
13333
  const isDocumentAction = documentScopeActions.includes(action.type);
13216
- const result = isDocumentAction ? await this.documentActionHandler.execute(job, action, startTime, indexTxn, skip, sourceRemote) : await this.executeRegularAction(job, action, startTime, indexTxn, skip, sourceOperation, sourceRemote);
13334
+ const result = isDocumentAction ? await this.documentActionHandler.execute(job, action, startTime, indexTxn, stores, skip, sourceRemote) : await this.executeRegularAction(job, action, startTime, indexTxn, stores, skip, sourceOperation, sourceRemote);
13217
13335
  const error = this.accumulateResultOrReturnError(result, generatedOperations, operationsWithContext);
13218
13336
  if (error !== null) {
13219
13337
  return {
@@ -13230,10 +13348,10 @@ class SimpleJobExecutor {
13230
13348
  operationsWithContext
13231
13349
  };
13232
13350
  }
13233
- async executeRegularAction(job, action, startTime, indexTxn, skip = 0, sourceOperation, sourceRemote = "") {
13351
+ async executeRegularAction(job, action, startTime, indexTxn, stores, skip = 0, sourceOperation, sourceRemote = "") {
13234
13352
  let docMeta;
13235
13353
  try {
13236
- docMeta = await this.documentMetaCache.getDocumentMeta(job.documentId, job.branch);
13354
+ docMeta = await stores.documentMetaCache.getDocumentMeta(job.documentId, job.branch);
13237
13355
  } catch (error) {
13238
13356
  return buildErrorResult(job, error instanceof Error ? error : new Error(String(error)), startTime);
13239
13357
  }
@@ -13241,11 +13359,11 @@ class SimpleJobExecutor {
13241
13359
  return buildErrorResult(job, new DocumentDeletedError(job.documentId, docMeta.state.deletedAtUtcIso), startTime);
13242
13360
  }
13243
13361
  if (isUndoRedo(action) || action.type === "PRUNE" || action.type === "NOOP" && skip > 0) {
13244
- this.writeCache.invalidate(job.documentId, job.scope, job.branch);
13362
+ stores.writeCache.invalidate(job.documentId, job.scope, job.branch);
13245
13363
  }
13246
13364
  let document2;
13247
13365
  try {
13248
- document2 = await this.writeCache.getState(job.documentId, job.scope, job.branch);
13366
+ document2 = await stores.writeCache.getState(job.documentId, job.scope, job.branch);
13249
13367
  } catch (error) {
13250
13368
  return buildErrorResult(job, error instanceof Error ? error : new Error(String(error)), startTime);
13251
13369
  }
@@ -13296,12 +13414,12 @@ ${error.stack}`;
13296
13414
  header: updatedDocument.header
13297
13415
  });
13298
13416
  try {
13299
- await this.operationStore.apply(job.documentId, document2.header.documentType, scope, job.branch, newOperation.index, (txn) => {
13417
+ await stores.operationStore.apply(job.documentId, document2.header.documentType, scope, job.branch, newOperation.index, (txn) => {
13300
13418
  txn.addOperations(newOperation);
13301
13419
  });
13302
13420
  } catch (error) {
13303
13421
  this.logger.error("Error writing @Operation to IOperationStore: @Error", newOperation, error);
13304
- this.writeCache.invalidate(job.documentId, scope, job.branch);
13422
+ stores.writeCache.invalidate(job.documentId, scope, job.branch);
13305
13423
  return {
13306
13424
  job,
13307
13425
  success: false,
@@ -13313,7 +13431,7 @@ ${error.stack}`;
13313
13431
  ...updatedDocument.header.revision,
13314
13432
  [scope]: newOperation.index + 1
13315
13433
  };
13316
- this.writeCache.putState(job.documentId, scope, job.branch, newOperation.index, updatedDocument);
13434
+ stores.writeCache.putState(job.documentId, scope, job.branch, newOperation.index, updatedDocument);
13317
13435
  indexTxn.write([
13318
13436
  {
13319
13437
  ...newOperation,
@@ -13344,13 +13462,13 @@ ${error.stack}`;
13344
13462
  duration: Date.now() - startTime
13345
13463
  };
13346
13464
  }
13347
- async executeLoadJob(job, startTime, indexTxn) {
13465
+ async executeLoadJob(job, startTime, indexTxn, stores) {
13348
13466
  if (job.operations.length === 0) {
13349
13467
  return buildErrorResult(job, new Error("Load job must include at least one operation"), startTime);
13350
13468
  }
13351
13469
  let docMeta;
13352
13470
  try {
13353
- docMeta = await this.documentMetaCache.getDocumentMeta(job.documentId, job.branch);
13471
+ docMeta = await stores.documentMetaCache.getDocumentMeta(job.documentId, job.branch);
13354
13472
  } catch {}
13355
13473
  if (docMeta?.state.isDeleted) {
13356
13474
  return buildErrorResult(job, new DocumentDeletedError(job.documentId, docMeta.state.deletedAtUtcIso), startTime);
@@ -13358,7 +13476,7 @@ ${error.stack}`;
13358
13476
  const scope = job.scope;
13359
13477
  let latestRevision = 0;
13360
13478
  try {
13361
- const revisions = await this.operationStore.getRevisions(job.documentId, job.branch);
13479
+ const revisions = await stores.operationStore.getRevisions(job.documentId, job.branch);
13362
13480
  latestRevision = revisions.revision[scope] ?? 0;
13363
13481
  } catch {
13364
13482
  latestRevision = 0;
@@ -13374,7 +13492,7 @@ ${error.stack}`;
13374
13492
  }
13375
13493
  let conflictingOps = [];
13376
13494
  try {
13377
- const conflictingResult = await this.operationStore.getConflicting(job.documentId, scope, job.branch, minIncomingTimestamp);
13495
+ const conflictingResult = await stores.operationStore.getConflicting(job.documentId, scope, job.branch, minIncomingTimestamp);
13378
13496
  conflictingOps = conflictingResult.results;
13379
13497
  } catch {
13380
13498
  conflictingOps = [];
@@ -13383,7 +13501,7 @@ ${error.stack}`;
13383
13501
  if (conflictingOps.length > 0) {
13384
13502
  const minConflictingIndex = Math.min(...conflictingOps.map((op) => op.index));
13385
13503
  try {
13386
- const allOpsResult = await this.operationStore.getSince(job.documentId, scope, job.branch, minConflictingIndex - 1);
13504
+ const allOpsResult = await stores.operationStore.getSince(job.documentId, scope, job.branch, minConflictingIndex - 1);
13387
13505
  allOpsFromMinConflictingIndex = allOpsResult.results;
13388
13506
  } catch {
13389
13507
  allOpsFromMinConflictingIndex = conflictingOps;
@@ -13444,7 +13562,7 @@ ${error.stack}`;
13444
13562
  const actions2 = reshuffledOperations.map((operation) => operation.action);
13445
13563
  const skipValues = reshuffledOperations.map((operation) => operation.skip);
13446
13564
  const effectiveSourceRemote = skipCount > 0 ? "" : job.meta.sourceRemote || "";
13447
- const result = await this.processActions(job, actions2, startTime, indexTxn, skipValues, reshuffledOperations, effectiveSourceRemote);
13565
+ const result = await this.processActions(job, actions2, startTime, indexTxn, stores, skipValues, reshuffledOperations, effectiveSourceRemote);
13448
13566
  if (!result.success) {
13449
13567
  return {
13450
13568
  job,
@@ -13453,9 +13571,9 @@ ${error.stack}`;
13453
13571
  duration: Date.now() - startTime
13454
13572
  };
13455
13573
  }
13456
- this.writeCache.invalidate(job.documentId, scope, job.branch);
13574
+ stores.writeCache.invalidate(job.documentId, scope, job.branch);
13457
13575
  if (scope === "document") {
13458
- this.documentMetaCache.invalidate(job.documentId, job.branch);
13576
+ stores.documentMetaCache.invalidate(job.documentId, job.branch);
13459
13577
  }
13460
13578
  return {
13461
13579
  job,
@@ -14404,14 +14522,23 @@ async function collectAllPages(firstPage, signal) {
14404
14522
 
14405
14523
  class KyselyKeyframeStore {
14406
14524
  db;
14525
+ trx;
14407
14526
  constructor(db) {
14408
14527
  this.db = db;
14409
14528
  }
14529
+ get queryExecutor() {
14530
+ return this.trx ?? this.db;
14531
+ }
14532
+ withTransaction(trx) {
14533
+ const instance = new KyselyKeyframeStore(this.db);
14534
+ instance.trx = trx;
14535
+ return instance;
14536
+ }
14410
14537
  async putKeyframe(documentId, scope, branch, revision, document2, signal) {
14411
14538
  if (signal?.aborted) {
14412
14539
  throw new Error("Operation aborted");
14413
14540
  }
14414
- await this.db.insertInto("Keyframe").values({
14541
+ await this.queryExecutor.insertInto("Keyframe").values({
14415
14542
  documentId,
14416
14543
  documentType: document2.header.documentType,
14417
14544
  scope,
@@ -14424,7 +14551,7 @@ class KyselyKeyframeStore {
14424
14551
  if (signal?.aborted) {
14425
14552
  throw new Error("Operation aborted");
14426
14553
  }
14427
- const row = await this.db.selectFrom("Keyframe").selectAll().where("documentId", "=", documentId).where("scope", "=", scope).where("branch", "=", branch).where("revision", "<=", targetRevision).orderBy("revision", "desc").limit(1).executeTakeFirst();
14554
+ const row = await this.queryExecutor.selectFrom("Keyframe").selectAll().where("documentId", "=", documentId).where("scope", "=", scope).where("branch", "=", branch).where("revision", "<=", targetRevision).orderBy("revision", "desc").limit(1).executeTakeFirst();
14428
14555
  if (!row) {
14429
14556
  return;
14430
14557
  }
@@ -14433,11 +14560,30 @@ class KyselyKeyframeStore {
14433
14560
  document: row.document
14434
14561
  };
14435
14562
  }
14563
+ async listKeyframes(documentId, scope, branch, signal) {
14564
+ if (signal?.aborted) {
14565
+ throw new Error("Operation aborted");
14566
+ }
14567
+ let query = this.queryExecutor.selectFrom("Keyframe").selectAll().where("documentId", "=", documentId).orderBy("revision", "asc");
14568
+ if (scope !== undefined) {
14569
+ query = query.where("scope", "=", scope);
14570
+ }
14571
+ if (branch !== undefined) {
14572
+ query = query.where("branch", "=", branch);
14573
+ }
14574
+ const rows = await query.execute();
14575
+ return rows.map((row) => ({
14576
+ scope: row.scope,
14577
+ branch: row.branch,
14578
+ revision: row.revision,
14579
+ document: row.document
14580
+ }));
14581
+ }
14436
14582
  async deleteKeyframes(documentId, scope, branch, signal) {
14437
14583
  if (signal?.aborted) {
14438
14584
  throw new Error("Operation aborted");
14439
14585
  }
14440
- let query = this.db.deleteFrom("Keyframe").where("documentId", "=", documentId);
14586
+ let query = this.queryExecutor.deleteFrom("Keyframe").where("documentId", "=", documentId);
14441
14587
  if (scope !== undefined && branch !== undefined) {
14442
14588
  query = query.where("scope", "=", scope).where("branch", "=", branch);
14443
14589
  } else if (scope !== undefined) {
@@ -14488,48 +14634,64 @@ class AtomicTransaction {
14488
14634
 
14489
14635
  class KyselyOperationStore {
14490
14636
  db;
14637
+ trx;
14491
14638
  constructor(db) {
14492
14639
  this.db = db;
14493
14640
  }
14641
+ get queryExecutor() {
14642
+ return this.trx ?? this.db;
14643
+ }
14644
+ withTransaction(trx) {
14645
+ const instance = new KyselyOperationStore(this.db);
14646
+ instance.trx = trx;
14647
+ return instance;
14648
+ }
14494
14649
  async apply(documentId, documentType, scope, branch, revision, fn, signal) {
14495
- await this.db.transaction().execute(async (trx) => {
14496
- if (signal?.aborted) {
14497
- throw new Error("Operation aborted");
14650
+ if (this.trx) {
14651
+ await this.executeApply(this.trx, documentId, documentType, scope, branch, revision, fn, signal);
14652
+ } else {
14653
+ await this.db.transaction().execute(async (trx) => {
14654
+ await this.executeApply(trx, documentId, documentType, scope, branch, revision, fn, signal);
14655
+ });
14656
+ }
14657
+ }
14658
+ async executeApply(trx, documentId, documentType, scope, branch, revision, fn, signal) {
14659
+ if (signal?.aborted) {
14660
+ throw new Error("Operation aborted");
14661
+ }
14662
+ const latestOp = await trx.selectFrom("Operation").selectAll().where("documentId", "=", documentId).where("scope", "=", scope).where("branch", "=", branch).orderBy("index", "desc").limit(1).executeTakeFirst();
14663
+ const currentRevision = latestOp ? latestOp.index : -1;
14664
+ if (currentRevision !== revision - 1) {
14665
+ throw new RevisionMismatchError(currentRevision + 1, revision);
14666
+ }
14667
+ const atomicTxn = new AtomicTransaction(documentId, documentType, scope, branch, revision);
14668
+ await fn(atomicTxn);
14669
+ const operations = atomicTxn.getOperations();
14670
+ if (operations.length > 0) {
14671
+ let prevOpId = latestOp?.opId || "";
14672
+ for (const op of operations) {
14673
+ op.prevOpId = prevOpId;
14674
+ prevOpId = op.opId;
14498
14675
  }
14499
- const latestOp = await trx.selectFrom("Operation").selectAll().where("documentId", "=", documentId).where("scope", "=", scope).where("branch", "=", branch).orderBy("index", "desc").limit(1).executeTakeFirst();
14500
- const currentRevision = latestOp ? latestOp.index : -1;
14501
- if (currentRevision !== revision - 1) {
14502
- throw new RevisionMismatchError(currentRevision + 1, revision);
14503
- }
14504
- const atomicTxn = new AtomicTransaction(documentId, documentType, scope, branch, revision);
14505
- await fn(atomicTxn);
14506
- const operations = atomicTxn.getOperations();
14507
- if (operations.length > 0) {
14508
- let prevOpId = latestOp?.opId || "";
14509
- for (const op of operations) {
14510
- op.prevOpId = prevOpId;
14511
- prevOpId = op.opId;
14512
- }
14513
- try {
14514
- await trx.insertInto("Operation").values(operations).execute();
14515
- } catch (error) {
14516
- if (error instanceof Error) {
14517
- if (error.message.includes("unique constraint")) {
14518
- const op = operations[0];
14519
- throw new DuplicateOperationError(`${op.opId} at index ${op.index} with skip ${op.skip}`);
14520
- }
14521
- throw error;
14676
+ try {
14677
+ await trx.insertInto("Operation").values(operations).execute();
14678
+ } catch (error) {
14679
+ if (error instanceof Error) {
14680
+ if (error.message.includes("unique constraint")) {
14681
+ const op = operations[0];
14682
+ throw new DuplicateOperationError(`${op.opId} at index ${op.index} with skip ${op.skip}`);
14522
14683
  }
14523
14684
  throw error;
14524
14685
  }
14686
+ throw error;
14525
14687
  }
14526
- });
14688
+ }
14527
14689
  }
14528
14690
  async getSince(documentId, scope, branch, revision, filter, paging, signal) {
14529
14691
  if (signal?.aborted) {
14530
14692
  throw new Error("Operation aborted");
14531
14693
  }
14532
- let query = this.db.selectFrom("Operation").selectAll().where("documentId", "=", documentId).where("scope", "=", scope).where("branch", "=", branch).where("index", ">", revision).orderBy("index", "asc");
14694
+ let query = this.queryExecutor.selectFrom("Operation").selectAll().where("documentId", "=", documentId).where("scope", "=", scope).where("branch", "=", branch).where("index", ">", revision).orderBy("index", "asc");
14533
14695
  if (filter) {
14534
14696
  if (filter.actionTypes && filter.actionTypes.length > 0) {
14535
14697
  const actionTypesArray = filter.actionTypes.map((t) => `'${t.replace(/'/g, "''")}'`).join(",");
@@ -14576,7 +14738,7 @@ class KyselyOperationStore {
14576
14738
  if (signal?.aborted) {
14577
14739
  throw new Error("Operation aborted");
14578
14740
  }
14579
- let query = this.db.selectFrom("Operation").selectAll().where("id", ">", id).orderBy("id", "asc");
14741
+ let query = this.queryExecutor.selectFrom("Operation").selectAll().where("id", ">", id).orderBy("id", "asc");
14580
14742
  if (paging) {
14581
14743
  const cursorValue = Number.parseInt(paging.cursor, 10);
14582
14744
  if (cursorValue > 0) {
@@ -14608,7 +14770,7 @@ class KyselyOperationStore {
14608
14770
  if (signal?.aborted) {
14609
14771
  throw new Error("Operation aborted");
14610
14772
  }
14611
- let query = this.db.selectFrom("Operation").selectAll().where("documentId", "=", documentId).where("scope", "=", scope).where("branch", "=", branch).where("timestampUtcMs", ">=", new Date(minTimestamp)).orderBy("index", "asc");
14773
+ let query = this.queryExecutor.selectFrom("Operation").selectAll().where("documentId", "=", documentId).where("scope", "=", scope).where("branch", "=", branch).where("timestampUtcMs", ">=", new Date(minTimestamp)).orderBy("index", "asc");
14612
14774
  if (paging) {
14613
14775
  const cursorValue = Number.parseInt(paging.cursor, 10);
14614
14776
  if (cursorValue > 0) {
@@ -14640,7 +14802,7 @@ class KyselyOperationStore {
14640
14802
  if (signal?.aborted) {
14641
14803
  throw new Error("Operation aborted");
14642
14804
  }
14643
- const scopeRevisions = await this.db.selectFrom("Operation as o1").select(["o1.scope", "o1.index", "o1.timestampUtcMs"]).where("o1.documentId", "=", documentId).where("o1.branch", "=", branch).where((eb) => eb("o1.index", "=", eb.selectFrom("Operation as o2").select((eb2) => eb2.fn.max("o2.index").as("maxIndex")).where("o2.documentId", "=", eb.ref("o1.documentId")).where("o2.branch", "=", eb.ref("o1.branch")).where("o2.scope", "=", eb.ref("o1.scope")))).execute();
14805
+ const scopeRevisions = await this.queryExecutor.selectFrom("Operation as o1").select(["o1.scope", "o1.index", "o1.timestampUtcMs"]).where("o1.documentId", "=", documentId).where("o1.branch", "=", branch).where((eb) => eb("o1.index", "=", eb.selectFrom("Operation as o2").select((eb2) => eb2.fn.max("o2.index").as("maxIndex")).where("o2.documentId", "=", eb.ref("o1.documentId")).where("o2.branch", "=", eb.ref("o1.branch")).where("o2.scope", "=", eb.ref("o1.scope")))).execute();
14644
14806
  const revision = {};
14645
14807
  let latestTimestamp = new Date(0).toISOString();
14646
14808
  for (const row of scopeRevisions) {
@@ -18434,9 +18596,10 @@ class ReactorBuilder {
18434
18596
  });
18435
18597
  await documentMetaCache.startup();
18436
18598
  const collectionMembershipCache = new CollectionMembershipCache(operationIndex);
18599
+ const executionScope = new KyselyExecutionScope(database, operationStore, operationIndex, keyframeStore, writeCache, documentMetaCache, collectionMembershipCache);
18437
18600
  let executorManager = this.executorManager;
18438
18601
  if (!executorManager) {
18439
- executorManager = new SimpleJobExecutorManager(() => new SimpleJobExecutor(this.logger, documentModelRegistry, operationStore, eventBus, writeCache, operationIndex, documentMetaCache, collectionMembershipCache, this.executorConfig, this.signatureVerifier), eventBus, queue, jobTracker, this.logger, resolver);
18602
+ executorManager = new SimpleJobExecutorManager(() => new SimpleJobExecutor(this.logger, documentModelRegistry, operationStore, eventBus, writeCache, operationIndex, documentMetaCache, collectionMembershipCache, this.executorConfig, this.signatureVerifier, executionScope), eventBus, queue, jobTracker, this.logger, resolver);
18440
18603
  }
18441
18604
  await executorManager.start(this.executorConfig.maxConcurrency ?? 1);
18442
18605
  const readModelInstances = Array.from(new Set([...this.readModels]));
@@ -18567,6 +18730,7 @@ class ReactorClientBuilder {
18567
18730
  signatureVerifier;
18568
18731
  subscriptionManager;
18569
18732
  jobAwaiter;
18733
+ documentModelLoader;
18570
18734
  withLogger(logger2) {
18571
18735
  this.logger = logger2;
18572
18736
  return this;
@@ -18605,6 +18769,10 @@ class ReactorClientBuilder {
18605
18769
  this.jobAwaiter = jobAwaiter;
18606
18770
  return this;
18607
18771
  }
18772
+ withDocumentModelLoader(loader) {
18773
+ this.documentModelLoader = loader;
18774
+ return this;
18775
+ }
18608
18776
  async build() {
18609
18777
  const module = await this.buildModule();
18610
18778
  return module.client;
@@ -18622,6 +18790,9 @@ class ReactorClientBuilder {
18622
18790
  if (this.signatureVerifier) {
18623
18791
  this.reactorBuilder.withSignatureVerifier(this.signatureVerifier);
18624
18792
  }
18793
+ if (this.documentModelLoader) {
18794
+ this.reactorBuilder.withDocumentModelLoader(this.documentModelLoader);
18795
+ }
18625
18796
  reactorModule = await this.reactorBuilder.buildModule();
18626
18797
  reactor = reactorModule.reactor;
18627
18798
  eventBus = reactorModule.eventBus;
@@ -18671,6 +18842,118 @@ function relationalDbToQueryBuilder(query) {
18671
18842
  withSchema: (schema) => relationalDbToQueryBuilder(query.withSchema(schema))
18672
18843
  };
18673
18844
  }
18845
+
18846
+ class DocumentIntegrityService {
18847
+ keyframeStore;
18848
+ operationStore;
18849
+ writeCache;
18850
+ documentView;
18851
+ documentModelRegistry;
18852
+ constructor(keyframeStore, operationStore, writeCache, documentView, documentModelRegistry) {
18853
+ this.keyframeStore = keyframeStore;
18854
+ this.operationStore = operationStore;
18855
+ this.writeCache = writeCache;
18856
+ this.documentView = documentView;
18857
+ this.documentModelRegistry = documentModelRegistry;
18858
+ }
18859
+ async validateDocument(documentId, branch = "main", signal) {
18860
+ const keyframeIssues = [];
18861
+ const snapshotIssues = [];
18862
+ const replayCache = new KyselyWriteCache(nullKeyframeStore, this.operationStore, this.documentModelRegistry, {
18863
+ maxDocuments: 1,
18864
+ ringBufferSize: 1,
18865
+ keyframeInterval: Number.MAX_SAFE_INTEGER
18866
+ });
18867
+ const keyframes = await this.keyframeStore.listKeyframes(documentId, undefined, branch, signal);
18868
+ for (const keyframe of keyframes) {
18869
+ if (signal?.aborted) {
18870
+ throw new Error("Operation aborted");
18871
+ }
18872
+ replayCache.invalidate(documentId, keyframe.scope, branch);
18873
+ const replayedDoc = await replayCache.getState(documentId, keyframe.scope, branch, keyframe.revision, signal);
18874
+ const kfHash = hashDocumentStateForScope(keyframe.document, keyframe.scope);
18875
+ const replayHash = hashDocumentStateForScope(replayedDoc, keyframe.scope);
18876
+ if (kfHash !== replayHash) {
18877
+ keyframeIssues.push({
18878
+ scope: keyframe.scope,
18879
+ branch,
18880
+ revision: keyframe.revision,
18881
+ keyframeHash: kfHash,
18882
+ replayedHash: replayHash
18883
+ });
18884
+ }
18885
+ }
18886
+ let currentDoc;
18887
+ try {
18888
+ currentDoc = await this.documentView.get(documentId);
18889
+ } catch {
18890
+ return {
18891
+ documentId,
18892
+ isConsistent: keyframeIssues.length === 0,
18893
+ keyframeIssues,
18894
+ snapshotIssues
18895
+ };
18896
+ }
18897
+ const revisions = await this.operationStore.getRevisions(documentId, branch, signal);
18898
+ const allScopes = Object.keys(revisions.revision);
18899
+ for (const scope of allScopes) {
18900
+ if (scope === "document")
18901
+ continue;
18902
+ replayCache.invalidate(documentId, scope, branch);
18903
+ let replayedDoc;
18904
+ try {
18905
+ replayedDoc = await replayCache.getState(documentId, scope, branch, undefined, signal);
18906
+ } catch {
18907
+ if (signal?.aborted) {
18908
+ throw new Error("Operation aborted");
18909
+ }
18910
+ continue;
18911
+ }
18912
+ const snapshotHash = hashDocumentStateForScope(currentDoc, scope);
18913
+ const replayHash = hashDocumentStateForScope(replayedDoc, scope);
18914
+ if (snapshotHash !== replayHash) {
18915
+ snapshotIssues.push({
18916
+ scope,
18917
+ branch,
18918
+ snapshotHash,
18919
+ replayedHash: replayHash
18920
+ });
18921
+ }
18922
+ }
18923
+ return {
18924
+ documentId,
18925
+ isConsistent: keyframeIssues.length === 0 && snapshotIssues.length === 0,
18926
+ keyframeIssues,
18927
+ snapshotIssues
18928
+ };
18929
+ }
18930
+ async rebuildKeyframes(documentId, branch = "main", signal) {
18931
+ const deleted = await this.keyframeStore.deleteKeyframes(documentId, undefined, branch, signal);
18932
+ return {
18933
+ documentId,
18934
+ keyframesDeleted: deleted,
18935
+ scopesInvalidated: 0
18936
+ };
18937
+ }
18938
+ async rebuildSnapshots(documentId, branch = "main", signal) {
18939
+ const scopes = await this.discoverScopes(documentId, branch, signal);
18940
+ for (const scope of scopes) {
18941
+ if (signal?.aborted) {
18942
+ throw new Error("Operation aborted");
18943
+ }
18944
+ this.writeCache.invalidate(documentId, scope, branch);
18945
+ }
18946
+ return {
18947
+ documentId,
18948
+ keyframesDeleted: 0,
18949
+ scopesInvalidated: scopes.length
18950
+ };
18951
+ }
18952
+ async discoverScopes(documentId, branch, signal) {
18953
+ const revisions = await this.operationStore.getRevisions(documentId, branch, signal);
18954
+ return Object.keys(revisions.revision);
18955
+ }
18956
+ }
18674
18957
  var __defProp2, __export2 = (target, all) => {
18675
18958
  for (var name in all)
18676
18959
  __defProp2(target, name, {
@@ -18813,7 +19096,7 @@ var __defProp2, __export2 = (target, all) => {
18813
19096
  }
18814
19097
  }
18815
19098
  return maxOrdinal;
18816
- }, SyncStatus, cachedEncoder, LOG2_26, IS_RELATIONAL_DB_PROCESSOR, RelationalDbProcessor;
19099
+ }, SyncStatus, cachedEncoder, LOG2_26, IS_RELATIONAL_DB_PROCESSOR, RelationalDbProcessor, nullKeyframeStore;
18817
19100
  var init_src = __esm(() => {
18818
19101
  __defProp2 = Object.defineProperty;
18819
19102
  byteToHex = [];
@@ -24073,6 +24356,12 @@ var init_src = __esm(() => {
24073
24356
  return relationalDbToQueryBuilder(this.relationalDb);
24074
24357
  }
24075
24358
  };
24359
+ nullKeyframeStore = {
24360
+ putKeyframe: () => Promise.resolve(),
24361
+ findNearestKeyframe: () => Promise.resolve(undefined),
24362
+ listKeyframes: () => Promise.resolve([]),
24363
+ deleteKeyframes: () => Promise.resolve(0)
24364
+ };
24076
24365
  });
24077
24366
 
24078
24367
  // ../../packages/reactor-browser/dist/src/index.js
@@ -24082,6 +24371,7 @@ __export(exports_src, {
24082
24371
  useVetraPackages: () => useVetraPackages,
24083
24372
  useVetraPackageManager: () => useVetraPackageManager,
24084
24373
  useUserPermissions: () => useUserPermissions,
24374
+ useUser: () => useUser,
24085
24375
  useSupportedDocumentTypesInReactor: () => useSupportedDocumentTypesInReactor,
24086
24376
  useSubgraphModules: () => useSubgraphModules,
24087
24377
  useSetPHDriveEditorConfig: () => useSetPHDriveEditorConfig,
@@ -24100,8 +24390,12 @@ __export(exports_src, {
24100
24390
  useSelectedDocumentId: () => useSelectedDocumentId,
24101
24391
  useSelectedDocument: () => useSelectedDocument,
24102
24392
  useRevisionHistoryVisible: () => useRevisionHistoryVisible,
24393
+ useRenownInit: () => useRenownInit,
24394
+ useRenownAuth: () => useRenownAuth,
24395
+ useRenown: () => useRenown,
24103
24396
  useRelationalQuery: () => useRelationalQuery,
24104
24397
  useRelationalDb: () => useRelationalDb,
24398
+ usePendingInstallations: () => usePendingInstallations,
24105
24399
  useParentFolderForSelectedNode: () => useParentFolderForSelectedNode,
24106
24400
  usePHToast: () => usePHToast,
24107
24401
  usePHModal: () => usePHModal,
@@ -24117,6 +24411,8 @@ __export(exports_src, {
24117
24411
  useNodeParentFolderById: () => useNodeParentFolderById,
24118
24412
  useNodeById: () => useNodeById,
24119
24413
  useNodeActions: () => useNodeActions,
24414
+ useLoginStatus: () => useLoginStatus,
24415
+ useLoading: () => useLoading,
24120
24416
  useIsExternalControlsEnabled: () => useIsExternalControlsEnabled,
24121
24417
  useIsDragAndDropEnabled: () => useIsDragAndDropEnabled,
24122
24418
  useInspectorEnabled: () => useInspectorEnabled,
@@ -24152,6 +24448,8 @@ __export(exports_src, {
24152
24448
  useDocumentCache: () => useDocumentCache,
24153
24449
  useDocumentById: () => useDocumentById,
24154
24450
  useDocument: () => useDocument,
24451
+ useDismissedPackages: () => useDismissedPackages,
24452
+ useDid: () => useDid,
24155
24453
  useDefaultDriveEditorModule: () => useDefaultDriveEditorModule,
24156
24454
  useConnectionStates: () => useConnectionStates,
24157
24455
  useConnectionState: () => useConnectionState,
@@ -24176,6 +24474,7 @@ __export(exports_src, {
24176
24474
  setPHDriveEditorConfig: () => setPHDriveEditorConfig,
24177
24475
  setPHDocumentEditorConfigByKey: () => setPHDocumentEditorConfigByKey,
24178
24476
  setPHDocumentEditorConfig: () => setPHDocumentEditorConfig,
24477
+ setLoading: () => setLoading,
24179
24478
  setGlobal: () => setGlobal,
24180
24479
  setFeatures: () => setFeatures,
24181
24480
  setDriveSharingType: () => setDriveSharingType,
@@ -24195,6 +24494,7 @@ __export(exports_src, {
24195
24494
  makeDriveUrlComponent: () => makeDriveUrlComponent,
24196
24495
  logout: () => logout,
24197
24496
  login: () => login,
24497
+ loading: () => loading,
24198
24498
  isInspectorEnabledSync: () => isInspectorEnabledSync,
24199
24499
  isFolderNodeKind: () => isFolderNodeKind,
24200
24500
  isFileNodeKind: () => isFileNodeKind,
@@ -24243,6 +24543,7 @@ __export(exports_src, {
24243
24543
  baseDocumentModelsMap: () => baseDocumentModelsMap,
24244
24544
  baseDocumentModels: () => baseDocumentModels,
24245
24545
  addTrigger: () => addTrigger,
24546
+ addRenownEventHandler: () => addRenownEventHandler,
24246
24547
  addRemoteDrive: () => addRemoteDrive,
24247
24548
  addPromiseState: () => addPromiseState,
24248
24549
  addFolder: () => addFolder,
@@ -24254,10 +24555,10 @@ __export(exports_src, {
24254
24555
  SyncOperationStatus: () => SyncOperationStatus,
24255
24556
  SpinnerIcon: () => SpinnerIcon,
24256
24557
  RenownUserButton: () => RenownUserButton,
24257
- RenownProvider: () => RenownProvider,
24258
24558
  RenownLogo: () => RenownLogo,
24259
24559
  RenownLoginButton: () => RenownLoginButton,
24260
24560
  RenownAuthButton: () => RenownAuthButton,
24561
+ Renown: () => Renown2,
24261
24562
  RemoteDocumentController: () => RemoteDocumentController,
24262
24563
  RemoteClient: () => RemoteClient,
24263
24564
  RelationalDbProcessor: () => RelationalDbProcessor,
@@ -24275,7 +24576,7 @@ __export(exports_src, {
24275
24576
  InMemoryQueue: () => InMemoryQueue,
24276
24577
  ISSUER_TYPE: () => ISSUER_TYPE,
24277
24578
  GqlRequestChannel: () => GqlRequestChannel,
24278
- ExternalLinkIcon: () => ExternalLinkIcon,
24579
+ DocumentIntegrityService: () => DocumentIntegrityService,
24279
24580
  DocumentChangeType: () => DocumentChangeType,
24280
24581
  DocumentCache: () => DocumentCache,
24281
24582
  DisconnectIcon: () => DisconnectIcon,
@@ -24284,6 +24585,7 @@ __export(exports_src, {
24284
24585
  CopyIcon: () => CopyIcon,
24285
24586
  ConsoleLogger: () => ConsoleLogger,
24286
24587
  ConflictError: () => ConflictError,
24588
+ ChevronDownIcon: () => ChevronDownIcon,
24287
24589
  ChannelScheme: () => ChannelScheme,
24288
24590
  CREDENTIAL_TYPES: () => CREDENTIAL_TYPES,
24289
24591
  CREDENTIAL_SUBJECT_TYPE: () => CREDENTIAL_SUBJECT_TYPE,
@@ -24323,17 +24625,20 @@ import {
24323
24625
  setSharingType
24324
24626
  } from "document-drive";
24325
24627
  import { documentModelDocumentModelModule } from "document-model";
24628
+ import { useCallback } from "react";
24629
+ import { useEffect, useState, useSyncExternalStore as useSyncExternalStore2 } from "react";
24326
24630
  import { useSyncExternalStore } from "react";
24327
- import { useSyncExternalStore as useSyncExternalStore2 } from "react";
24328
- import { useEffect, useRef, useState } from "react";
24329
24631
  import { logger as logger5 } from "document-drive";
24330
- import { use, useCallback as useCallback2, useSyncExternalStore as useSyncExternalStore3 } from "react";
24632
+ import { useSyncExternalStore as useSyncExternalStore3 } from "react";
24633
+ import { logger as logger6 } from "document-drive";
24634
+ import { use, useCallback as useCallback2, useSyncExternalStore as useSyncExternalStore4 } from "react";
24331
24635
  import { useEffect as useEffect2, useState as useState2 } from "react";
24636
+ import { useEffect as useEffect3, useRef, useState as useState3 } from "react";
24332
24637
  import {
24333
24638
  DocumentModelNotFoundError,
24334
24639
  DocumentNotFoundError as DocumentNotFoundError2
24335
24640
  } from "document-drive";
24336
- import { useCallback as useCallback3, useEffect as useEffect3, useRef as useRef2, useState as useState3 } from "react";
24641
+ import { useCallback as useCallback4, useEffect as useEffect4, useRef as useRef2, useState as useState4 } from "react";
24337
24642
  import { isFileNode as isFileNode2 } from "document-drive";
24338
24643
  import { useMemo } from "react";
24339
24644
  import {
@@ -24343,20 +24648,24 @@ import {
24343
24648
  } from "document-model";
24344
24649
  import { createState } from "document-model";
24345
24650
  import { defaultBaseState as defaultBaseState2, generateId as generateId22 } from "document-model/core";
24346
- import { logger as logger6 } from "document-drive";
24347
- import { useEffect as useEffect4, useState as useState4 } from "react";
24348
24651
  import { useEffect as useEffect5, useState as useState5 } from "react";
24349
24652
  import { createRelationalDbLegacy } from "document-drive";
24350
24653
  import { useMemo as useMemo2 } from "react";
24351
24654
  import { useEffect as useEffect6, useRef as useRef3, useState as useState6 } from "react";
24352
- import { useCallback as useCallback4, useMemo as useMemo3, useRef as useRef4 } from "react";
24353
- import { useCallback as useCallback5, useEffect as useEffect7, useRef as useRef5, useState as useState7 } from "react";
24655
+ import { useCallback as useCallback5, useMemo as useMemo3, useRef as useRef4 } from "react";
24656
+ import { useCallback as useCallback6, useState as useState7 } from "react";
24354
24657
  import { jsxDEV } from "react/jsx-dev-runtime";
24658
+ import {
24659
+ Children,
24660
+ cloneElement,
24661
+ forwardRef,
24662
+ isValidElement
24663
+ } from "react";
24355
24664
  import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
24356
- import { useCallback as useCallback6, useEffect as useEffect8, useRef as useRef6, useState as useState8 } from "react";
24665
+ import { useCallback as useCallback7, useEffect as useEffect7, useRef as useRef5, useState as useState8 } from "react";
24357
24666
  import { jsxDEV as jsxDEV3 } from "react/jsx-dev-runtime";
24358
- import { jsxDEV as jsxDEV4 } from "react/jsx-dev-runtime";
24359
- import { useEffect as useEffect9, useRef as useRef7 } from "react";
24667
+ import { jsxDEV as jsxDEV4, Fragment } from "react/jsx-dev-runtime";
24668
+ import { useRef as useRef6 } from "react";
24360
24669
  function asUint8Array(buf) {
24361
24670
  if (globalThis.Buffer != null) {
24362
24671
  return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
@@ -27707,38 +28016,61 @@ function makePHEventFunctions(key) {
27707
28016
  const setEventName = `ph:set${capitalCase(key)}`;
27708
28017
  const updateEventName = `ph:${key}Updated`;
27709
28018
  function setValue(value) {
28019
+ if (isServer) {
28020
+ return;
28021
+ }
27710
28022
  const event = new CustomEvent(setEventName, {
27711
28023
  detail: { [key]: value }
27712
28024
  });
27713
28025
  window.dispatchEvent(event);
27714
28026
  }
27715
28027
  function dispatchUpdatedEvent() {
28028
+ if (isServer) {
28029
+ return;
28030
+ }
27716
28031
  const event = new CustomEvent(updateEventName);
27717
28032
  window.dispatchEvent(event);
27718
28033
  }
27719
28034
  function handleSetValueEvent(event) {
28035
+ if (isServer) {
28036
+ return;
28037
+ }
27720
28038
  const value = event.detail[key];
27721
- if (!window.ph)
27722
- throw new Error("ph global store is not defined");
28039
+ if (!window.ph) {
28040
+ window.ph = {};
28041
+ }
27723
28042
  window.ph[key] = value;
27724
28043
  dispatchUpdatedEvent();
27725
28044
  }
27726
28045
  function addEventHandler() {
28046
+ if (isServer) {
28047
+ return;
28048
+ }
27727
28049
  window.addEventListener(setEventName, handleSetValueEvent);
27728
28050
  }
27729
28051
  function subscribeToValue(onStoreChange) {
28052
+ if (isServer)
28053
+ return () => {};
27730
28054
  window.addEventListener(updateEventName, onStoreChange);
27731
28055
  return () => {
27732
28056
  window.removeEventListener(updateEventName, onStoreChange);
27733
28057
  };
27734
28058
  }
27735
28059
  function getSnapshot() {
27736
- if (!window.ph)
27737
- throw new Error("ph global store is not defined");
28060
+ if (isServer) {
28061
+ return;
28062
+ }
28063
+ if (!window.ph) {
28064
+ console.warn(`ph global store is not initialized. Did you call set${capitalCase(key)}?`);
28065
+ return;
28066
+ }
27738
28067
  return window.ph[key];
27739
28068
  }
28069
+ function getServerSnapshot() {
28070
+ return;
28071
+ }
27740
28072
  function useValue() {
27741
- return useSyncExternalStore(subscribeToValue, getSnapshot);
28073
+ return useSyncExternalStore(subscribeToValue, getSnapshot, getServerSnapshot);
27742
28074
  }
27743
28075
  return {
27744
28076
  useValue,
@@ -27746,6 +28078,138 @@ function makePHEventFunctions(key) {
27746
28078
  addEventHandler
27747
28079
  };
27748
28080
  }
28081
+ function useDid() {
28082
+ const renown = useRenown();
28083
+ return renown?.did;
28084
+ }
28085
+ function useUser() {
28086
+ const renown = useRenown();
28087
+ const [user, setUser] = useState(renown?.user);
28088
+ useEffect(() => {
28089
+ setUser(renown?.user);
28090
+ if (!renown)
28091
+ return;
28092
+ return renown.on("user", setUser);
28093
+ }, [renown]);
28094
+ return user;
28095
+ }
28096
+ function useLoginStatus() {
28097
+ const renown = useRenown();
28098
+ return useSyncExternalStore2((cb) => {
28099
+ if (!renown) {
28100
+ return () => {};
28101
+ }
28102
+ return renown.on("status", cb);
28103
+ }, () => renown === loading ? "loading" : renown?.status, () => {
28104
+ return;
28105
+ });
28106
+ }
28107
+ function openRenown(documentId) {
28108
+ const renown = window.ph?.renown;
28109
+ let renownUrl = renown?.baseUrl;
28110
+ if (!renownUrl) {
28111
+ logger5.warn("Renown instance not found, falling back to: ", RENOWN_URL);
28112
+ renownUrl = RENOWN_URL;
28113
+ }
28114
+ if (documentId) {
28115
+ window.open(`${renownUrl}/profile/${documentId}`, "_blank")?.focus();
28116
+ return;
28117
+ }
28118
+ const url = new URL(renownUrl);
28119
+ url.searchParams.set("app", renown?.did ?? "");
28120
+ url.searchParams.set("connect", renown?.did ?? "");
28121
+ url.searchParams.set("network", RENOWN_NETWORK_ID);
28122
+ url.searchParams.set("chain", RENOWN_CHAIN_ID);
28123
+ const returnUrl = new URL(window.location.pathname, window.location.origin);
28124
+ url.searchParams.set("returnUrl", returnUrl.toJSON());
28125
+ window.open(url, "_self")?.focus();
28126
+ }
28127
+ function consumeDidFromUrl() {
28128
+ if (typeof window === "undefined")
28129
+ return;
28130
+ const urlParams = new URLSearchParams(window.location.search);
28131
+ const userParam = urlParams.get("user");
28132
+ if (!userParam)
28133
+ return;
28134
+ const userDid = decodeURIComponent(userParam);
28135
+ const cleanUrl = new URL(window.location.href);
28136
+ cleanUrl.searchParams.delete("user");
28137
+ window.history.replaceState({}, "", cleanUrl.toString());
28138
+ return userDid;
28139
+ }
28140
+ async function login(userDid, renown) {
28141
+ if (!renown) {
28142
+ return;
28143
+ }
28144
+ const did = userDid ?? consumeDidFromUrl();
28145
+ try {
28146
+ const user = renown.user;
28147
+ if (user?.did && (user.did === did || !did)) {
28148
+ return user;
28149
+ }
28150
+ if (!did) {
28151
+ return;
28152
+ }
28153
+ return await renown.login(did);
28154
+ } catch (error) {
28155
+ logger5.error(error instanceof Error ? error.message : JSON.stringify(error));
28156
+ }
28157
+ }
28158
+ async function logout() {
28159
+ const renown = window.ph?.renown;
28160
+ await renown?.logout();
28161
+ const url = new URL(window.location.href);
28162
+ if (url.searchParams.has("user")) {
28163
+ url.searchParams.delete("user");
28164
+ window.history.replaceState(null, "", url.toString());
28165
+ }
28166
+ }
28167
+ function truncateAddress(address) {
28168
+ if (address.length <= 13)
28169
+ return address;
28170
+ return `${address.slice(0, 7)}...${address.slice(-5)}`;
28171
+ }
28172
+ function toRenownAuthStatus(loginStatus, user) {
28173
+ if (loginStatus === "authorized") {
28174
+ return user ? "authorized" : "checking";
28175
+ }
28176
+ return loginStatus;
28177
+ }
28178
+ function useRenownAuth() {
28179
+ const user = useUser();
28180
+ const loginStatus = useLoginStatus();
28181
+ const status = toRenownAuthStatus(loginStatus, user);
28182
+ const address = user?.address;
28183
+ const ensName = user?.ens?.name;
28184
+ const avatarUrl = user?.profile?.userImage ?? user?.ens?.avatarUrl;
28185
+ const profileId = user?.profile?.documentId;
28186
+ const displayName = ensName ?? user?.profile?.username ?? undefined;
28187
+ const displayAddress = address ? truncateAddress(address) : undefined;
28188
+ const login2 = useCallback(() => {
28189
+ openRenown();
28190
+ }, []);
28191
+ const logout2 = useCallback(async () => {
28192
+ await logout();
28193
+ }, []);
28194
+ const openProfile = useCallback(() => {
28195
+ if (profileId) {
28196
+ openRenown(profileId);
28197
+ }
28198
+ }, [profileId]);
28199
+ return {
28200
+ status,
28201
+ user,
28202
+ address,
28203
+ ensName,
28204
+ avatarUrl,
28205
+ profileId,
28206
+ displayName,
28207
+ displayAddress,
28208
+ login: login2,
28209
+ logout: logout2,
28210
+ openProfile
28211
+ };
28212
+ }
27749
28213
  function useAllowedDocumentTypes() {
27750
28214
  const definedAllowedDocumentTypes = allowedDocumentTypesEventFunctions.useValue();
27751
28215
  return definedAllowedDocumentTypes;
@@ -27757,6 +28221,14 @@ function setVetraPackageManager(packageManager) {
27757
28221
  updateReactorClientDocumentModels(packages);
27758
28222
  });
27759
28223
  }
28224
+ function usePendingInstallations() {
28225
+ const pm = useVetraPackageManager();
28226
+ return useSyncExternalStore3((cb) => pm ? pm.subscribePendingChanges(cb) : NOOP_UNSUBSCRIBE, () => pm?.getPendingInstallations() ?? EMPTY_PENDING);
28227
+ }
28228
+ function useDismissedPackages() {
28229
+ const pm = useVetraPackageManager();
28230
+ return useSyncExternalStore3((cb) => pm ? pm.subscribePendingChanges(cb) : NOOP_UNSUBSCRIBE, () => pm?.getDismissedPackages() ?? EMPTY_DISMISSED);
28231
+ }
27760
28232
  function updateReactorClientDocumentModels(packages) {
27761
28233
  const documentModelModules = packages.flatMap((pkg) => pkg.modules.documentModelModules).filter((module) => module !== undefined);
27762
28234
  const registry = window.ph?.reactorClientModule?.reactorModule?.documentModelRegistry;
@@ -27788,52 +28260,6 @@ function useAllowedDocumentModelModules() {
27788
28260
  return documentModelModules;
27789
28261
  return documentModelModules?.filter((module) => allowedDocumentTypes.includes(module.documentModel.global.id));
27790
28262
  }
27791
- function useConnectionStates() {
27792
- const syncManager = useSync();
27793
- const [states, setStates] = useState(() => buildSnapshot(syncManager));
27794
- const unsubscribesRef = useRef([]);
27795
- useEffect(() => {
27796
- if (!syncManager)
27797
- return;
27798
- function subscribe() {
27799
- for (const unsub of unsubscribesRef.current) {
27800
- unsub();
27801
- }
27802
- unsubscribesRef.current = [];
27803
- const remotes = syncManager.list();
27804
- for (const remote of remotes) {
27805
- const unsub = remote.channel.onConnectionStateChange(() => {
27806
- setStates(buildSnapshot(syncManager));
27807
- });
27808
- unsubscribesRef.current.push(unsub);
27809
- }
27810
- setStates(buildSnapshot(syncManager));
27811
- }
27812
- subscribe();
27813
- const interval = setInterval(subscribe, 5000);
27814
- return () => {
27815
- clearInterval(interval);
27816
- for (const unsub of unsubscribesRef.current) {
27817
- unsub();
27818
- }
27819
- unsubscribesRef.current = [];
27820
- };
27821
- }, [syncManager]);
27822
- return states;
27823
- }
27824
- function useConnectionState(remoteName) {
27825
- const states = useConnectionStates();
27826
- return states.get(remoteName);
27827
- }
27828
- function buildSnapshot(syncManager) {
27829
- const map = new Map;
27830
- if (!syncManager)
27831
- return map;
27832
- for (const remote of syncManager.list()) {
27833
- map.set(remote.name, remote.channel.getConnectionState());
27834
- }
27835
- return map;
27836
- }
27837
28263
  function sortNodesByName(nodes) {
27838
28264
  return nodes.toSorted((a, b) => a.name.localeCompare(b.name));
27839
28265
  }
@@ -27849,7 +28275,7 @@ function isFolderNodeKind(node) {
27849
28275
  }
27850
28276
  function useDispatch(document2) {
27851
28277
  function dispatch(actionOrActions, onErrors, onSuccess) {
27852
- dispatchActions(actionOrActions, document2, onErrors, onSuccess).catch(logger5.error);
28278
+ dispatchActions(actionOrActions, document2, onErrors, onSuccess).catch(logger6.error);
27853
28279
  }
27854
28280
  return [document2, dispatch];
27855
28281
  }
@@ -27881,12 +28307,12 @@ function getDocumentQueryState(promise) {
27881
28307
  }
27882
28308
  function useDocument(id) {
27883
28309
  const documentCache = useDocumentCache();
27884
- const document2 = useSyncExternalStore3((cb) => id && documentCache ? documentCache.subscribe(id, cb) : () => {}, () => id ? documentCache?.get(id) : undefined);
28310
+ const document2 = useSyncExternalStore4((cb) => id && documentCache ? documentCache.subscribe(id, cb) : () => {}, () => id ? documentCache?.get(id) : undefined);
27885
28311
  return document2 ? use(document2) : undefined;
27886
28312
  }
27887
28313
  function useDocuments(ids) {
27888
28314
  const documentCache = useDocumentCache();
27889
- const documents = useSyncExternalStore3((cb) => ids?.length && documentCache ? documentCache.subscribe(ids, cb) : () => {}, () => ids?.length && documentCache ? documentCache.getBatch(ids) : undefined);
28315
+ const documents = useSyncExternalStore4((cb) => ids?.length && documentCache ? documentCache.subscribe(ids, cb) : () => {}, () => ids?.length && documentCache ? documentCache.getBatch(ids) : undefined);
27890
28316
  return documents ? use(documents) : [];
27891
28317
  }
27892
28318
  function useGetDocument() {
@@ -28227,6 +28653,52 @@ function usePHDocumentEditorConfigByKey(key) {
28227
28653
  const useValueHook = phDocumentEditorConfigHooks[key];
28228
28654
  return useValueHook();
28229
28655
  }
28656
+ function useConnectionStates() {
28657
+ const syncManager = useSync();
28658
+ const [states, setStates] = useState3(() => buildSnapshot(syncManager));
28659
+ const unsubscribesRef = useRef([]);
28660
+ useEffect3(() => {
28661
+ if (!syncManager)
28662
+ return;
28663
+ function subscribe() {
28664
+ for (const unsub of unsubscribesRef.current) {
28665
+ unsub();
28666
+ }
28667
+ unsubscribesRef.current = [];
28668
+ const remotes = syncManager.list();
28669
+ for (const remote of remotes) {
28670
+ const unsub = remote.channel.onConnectionStateChange(() => {
28671
+ setStates(buildSnapshot(syncManager));
28672
+ });
28673
+ unsubscribesRef.current.push(unsub);
28674
+ }
28675
+ setStates(buildSnapshot(syncManager));
28676
+ }
28677
+ subscribe();
28678
+ const interval = setInterval(subscribe, 5000);
28679
+ return () => {
28680
+ clearInterval(interval);
28681
+ for (const unsub of unsubscribesRef.current) {
28682
+ unsub();
28683
+ }
28684
+ unsubscribesRef.current = [];
28685
+ };
28686
+ }, [syncManager]);
28687
+ return states;
28688
+ }
28689
+ function useConnectionState(remoteName) {
28690
+ const states = useConnectionStates();
28691
+ return states.get(remoteName);
28692
+ }
28693
+ function buildSnapshot(syncManager) {
28694
+ const map = new Map;
28695
+ if (!syncManager)
28696
+ return map;
28697
+ for (const remote of syncManager.list()) {
28698
+ map.set(remote.name, remote.channel.getConnectionState());
28699
+ }
28700
+ return map;
28701
+ }
28230
28702
  function useDocumentOfType(documentId, documentType) {
28231
28703
  const [document2, dispatch] = useDocumentById(documentId);
28232
28704
  const documentModelModule = useDocumentModelModuleById(documentType);
@@ -28246,13 +28718,13 @@ function useDocumentOfType(documentId, documentType) {
28246
28718
  function useDocumentOperations(documentId) {
28247
28719
  const reactorClient = useReactorClient();
28248
28720
  const hasFetchedRef = useRef2(false);
28249
- const [state, setState] = useState3(() => ({
28721
+ const [state, setState] = useState4(() => ({
28250
28722
  globalOperations: [],
28251
28723
  localOperations: [],
28252
28724
  isLoading: !!documentId,
28253
28725
  error: undefined
28254
28726
  }));
28255
- const fetchOperations = useCallback3(async (retryCount = 0) => {
28727
+ const fetchOperations = useCallback4(async (retryCount = 0) => {
28256
28728
  const MAX_RETRIES = 5;
28257
28729
  const RETRY_DELAY_MS = 500;
28258
28730
  if (!documentId || !reactorClient) {
@@ -28298,7 +28770,7 @@ function useDocumentOperations(documentId) {
28298
28770
  });
28299
28771
  hasFetchedRef.current = true;
28300
28772
  }, [documentId, reactorClient]);
28301
- useEffect3(() => {
28773
+ useEffect4(() => {
28302
28774
  if (documentId && reactorClient) {
28303
28775
  fetchOperations();
28304
28776
  } else if (!documentId) {
@@ -28311,7 +28783,7 @@ function useDocumentOperations(documentId) {
28311
28783
  hasFetchedRef.current = false;
28312
28784
  }
28313
28785
  }, [documentId, reactorClient, fetchOperations]);
28314
- const refetch = useCallback3(() => {
28786
+ const refetch = useCallback4(() => {
28315
28787
  fetchOperations(0);
28316
28788
  }, [fetchOperations]);
28317
28789
  return { ...state, refetch };
@@ -28758,81 +29230,6 @@ function makeVetraPackageManifestModulesEntry(modules) {
28758
29230
  return acc;
28759
29231
  }, {});
28760
29232
  }
28761
- function openRenown(documentId) {
28762
- if (documentId) {
28763
- window.open(`${RENOWN_URL}/profile/${documentId}`, "_blank")?.focus();
28764
- return;
28765
- }
28766
- const url = new URL(RENOWN_URL);
28767
- url.searchParams.set("connect", window.ph?.renown?.did ?? "");
28768
- url.searchParams.set("network", RENOWN_NETWORK_ID);
28769
- url.searchParams.set("chain", RENOWN_CHAIN_ID);
28770
- const returnUrl = new URL(window.location.pathname, window.location.origin);
28771
- url.searchParams.set("returnUrl", returnUrl.toJSON());
28772
- window.open(url, "_self")?.focus();
28773
- }
28774
- function consumeDidFromUrl() {
28775
- if (typeof window === "undefined")
28776
- return;
28777
- const urlParams = new URLSearchParams(window.location.search);
28778
- const userParam = urlParams.get("user");
28779
- if (!userParam)
28780
- return;
28781
- const userDid = decodeURIComponent(userParam);
28782
- const cleanUrl = new URL(window.location.href);
28783
- cleanUrl.searchParams.delete("user");
28784
- window.history.replaceState({}, "", cleanUrl.toString());
28785
- return userDid;
28786
- }
28787
- async function login(userDid, renown) {
28788
- if (!renown) {
28789
- return;
28790
- }
28791
- const did = userDid ?? consumeDidFromUrl();
28792
- try {
28793
- const user = renown.user;
28794
- if (user?.did && (user.did === did || !did)) {
28795
- return user;
28796
- }
28797
- if (!did) {
28798
- return;
28799
- }
28800
- return await renown.login(did);
28801
- } catch (error) {
28802
- logger6.error("@error", error);
28803
- }
28804
- }
28805
- async function logout() {
28806
- const renown = window.ph?.renown;
28807
- await renown?.logout();
28808
- const url = new URL(window.location.href);
28809
- if (url.searchParams.has("user")) {
28810
- url.searchParams.delete("user");
28811
- window.history.replaceState(null, "", url.toString());
28812
- }
28813
- }
28814
- function useUser() {
28815
- const renown = useRenown();
28816
- const [user, setUser] = useState4(() => renown?.user);
28817
- useEffect4(() => {
28818
- setUser(renown?.user);
28819
- if (!renown)
28820
- return;
28821
- return renown.on("user", setUser);
28822
- }, [renown]);
28823
- return user;
28824
- }
28825
- function useLoginStatus() {
28826
- const renown = useRenown();
28827
- const [status, setStatus] = useState4(() => renown ? renown.status : "initializing");
28828
- useEffect4(() => {
28829
- setStatus(renown ? renown.status : "initializing");
28830
- if (!renown)
28831
- return;
28832
- return renown.on("status", setStatus);
28833
- }, [renown]);
28834
- return status;
28835
- }
28836
29233
  function useGetSwitchboardLink(document2) {
28837
29234
  const [drive] = useSelectedDrive();
28838
29235
  const remotes = useSyncList();
@@ -28875,6 +29272,47 @@ function useUserPermissions() {
28875
29272
  isAllowedToEditDocuments: allowList.includes(user?.address ?? "")
28876
29273
  };
28877
29274
  }
29275
+ function cdnUrlToApiUrl(cdnUrl) {
29276
+ return cdnUrl.replace(/\/-\/cdn\/?$/, "");
29277
+ }
29278
+ function mapPackageInfo(pkg) {
29279
+ return {
29280
+ name: pkg.name,
29281
+ description: pkg.manifest?.description,
29282
+ version: pkg.manifest?.version,
29283
+ category: pkg.manifest?.category,
29284
+ publisher: pkg.manifest?.publisher?.name,
29285
+ publisherUrl: pkg.manifest?.publisher?.url
29286
+ };
29287
+ }
29288
+
29289
+ class RegistryClient {
29290
+ apiUrl;
29291
+ constructor(cdnUrl) {
29292
+ this.apiUrl = cdnUrlToApiUrl(cdnUrl);
29293
+ }
29294
+ async getPackages() {
29295
+ const res = await fetch(`${this.apiUrl}/packages`);
29296
+ if (!res.ok)
29297
+ throw new Error(`Registry error: HTTP ${res.status}`);
29298
+ const data = await res.json();
29299
+ return data.map(mapPackageInfo);
29300
+ }
29301
+ async getPackagesByDocumentType(documentType) {
29302
+ const encodedType = encodeURIComponent(documentType);
29303
+ const res = await fetch(`${this.apiUrl}/packages/by-document-type?type=${encodedType}`);
29304
+ if (!res.ok)
29305
+ throw new Error(`Registry error: HTTP ${res.status}`);
29306
+ return await res.json();
29307
+ }
29308
+ async searchPackages(query) {
29309
+ const packages = await this.getPackages();
29310
+ if (!query)
29311
+ return packages;
29312
+ const lowerQuery = query.toLowerCase();
29313
+ return packages.filter((pkg) => pkg.name.toLowerCase().includes(lowerQuery) || pkg.description?.toLowerCase().includes(lowerQuery));
29314
+ }
29315
+ }
28878
29316
 
28879
29317
  class BaseStorage {
28880
29318
  #store;
@@ -28896,6 +29334,19 @@ class BaseStorage {
28896
29334
  return this.#store.delete(this.#buildKey(key));
28897
29335
  }
28898
29336
  }
29337
+ function loadDismissedPackages() {
29338
+ try {
29339
+ const raw = localStorage.getItem(DISMISSED_STORAGE_KEY);
29340
+ if (raw)
29341
+ return JSON.parse(raw);
29342
+ } catch {}
29343
+ return [];
29344
+ }
29345
+ function persistDismissedPackages(dismissed) {
29346
+ try {
29347
+ localStorage.setItem(DISMISSED_STORAGE_KEY, JSON.stringify(dismissed));
29348
+ } catch {}
29349
+ }
28899
29350
  function loadCSS(pkg, registryUrl) {
28900
29351
  const head = document.getElementsByTagName("head")[0];
28901
29352
  const existingStyle = head.querySelector(`link[data-package='${pkg}']`);
@@ -28916,10 +29367,13 @@ function removeCSS(pkg) {
28916
29367
  style.remove();
28917
29368
  }
28918
29369
  }
29370
+ async function runtimeImport(url) {
29371
+ return new Function("u", "return import(u)")(url);
29372
+ }
28919
29373
  async function loadExternalPackage(name4, registryUrl) {
28920
29374
  registryUrl = registryUrl.endsWith("/") ? registryUrl : `${registryUrl}/`;
28921
29375
  const url = `${registryUrl}${name4}/index.js`;
28922
- const module = await import(url);
29376
+ const module = await runtimeImport(url);
28923
29377
  loadCSS(name4, registryUrl);
28924
29378
  return convertLegacyLibToVetraPackage(module);
28925
29379
  }
@@ -28930,12 +29384,23 @@ class BrowserPackageManager {
28930
29384
  #localPackageIds = new Set;
28931
29385
  #subscribers = new Set;
28932
29386
  #packagesMemo = [];
28933
- constructor(namespace) {
29387
+ #registryCdnUrl;
29388
+ #registryClient;
29389
+ #documentModelRegistry;
29390
+ #pending = [];
29391
+ #dismissed = loadDismissedPackages();
29392
+ #deferredActions = new Map;
29393
+ #pendingListeners = new Set;
29394
+ constructor(namespace, registryCdnUrl) {
28934
29395
  this.#storage = new BrowserLocalStorage(namespace + ":PH_PACKAGES");
28935
29396
  const packages = this.#storage.get("packages");
28936
29397
  if (!packages) {
28937
29398
  this.#storage.set("packages", []);
28938
29399
  }
29400
+ if (registryCdnUrl) {
29401
+ this.#registryCdnUrl = registryCdnUrl;
29402
+ this.#registryClient = new RegistryClient(registryCdnUrl);
29403
+ }
28939
29404
  }
28940
29405
  async init() {
28941
29406
  const packages = this.#storage.get("packages");
@@ -28991,6 +29456,99 @@ class BrowserPackageManager {
28991
29456
  handler({ packages });
28992
29457
  });
28993
29458
  }
29459
+ setDocumentModelRegistry(registry) {
29460
+ this.#documentModelRegistry = registry;
29461
+ }
29462
+ async load(documentType) {
29463
+ if (!this.#registryClient || !this.#registryCdnUrl) {
29464
+ throw new Error("Registry CDN URL not configured — cannot discover packages");
29465
+ }
29466
+ const packageNames = await this.#registryClient.getPackagesByDocumentType(documentType);
29467
+ if (packageNames.length === 0) {
29468
+ throw new Error(`No package found containing document type: ${documentType}`);
29469
+ }
29470
+ const packageName = packageNames.sort((a, b) => a.localeCompare(b))[0];
29471
+ this.#pending = [...this.#pending, { documentType, packageName }];
29472
+ this.#notifyPendingListeners();
29473
+ return new Promise((resolve, reject) => {
29474
+ this.#deferredActions.set(packageName, { resolve, reject });
29475
+ });
29476
+ }
29477
+ async approveInstallation(packageName) {
29478
+ const deferred = this.#deferredActions.get(packageName);
29479
+ if (!deferred)
29480
+ return;
29481
+ try {
29482
+ await this.addPackage(packageName, this.#registryCdnUrl);
29483
+ } catch (error) {
29484
+ this.#removePending(packageName);
29485
+ this.#deferredActions.delete(packageName);
29486
+ deferred.reject(error instanceof Error ? error : new Error(`Failed to install package: ${packageName}`));
29487
+ return;
29488
+ }
29489
+ const pendingEntries = this.#pending.filter((p) => p.packageName === packageName);
29490
+ this.#removePending(packageName);
29491
+ this.#deferredActions.delete(packageName);
29492
+ if (!this.#documentModelRegistry) {
29493
+ deferred.reject(new Error("Document model registry not available"));
29494
+ return;
29495
+ }
29496
+ for (const entry of pendingEntries) {
29497
+ try {
29498
+ const module = this.#documentModelRegistry.getModule(entry.documentType);
29499
+ deferred.resolve(module);
29500
+ return;
29501
+ } catch {}
29502
+ }
29503
+ deferred.reject(new Error(`Module not found after installing package: ${packageName}`));
29504
+ }
29505
+ rejectInstallation(packageName) {
29506
+ const deferred = this.#deferredActions.get(packageName);
29507
+ if (!deferred)
29508
+ return;
29509
+ const rejectedEntries = this.#pending.filter((p) => p.packageName === packageName);
29510
+ const documentTypes = rejectedEntries.map((e) => e.documentType);
29511
+ this.#addDismissed(packageName, documentTypes);
29512
+ this.#removePending(packageName);
29513
+ this.#deferredActions.delete(packageName);
29514
+ deferred.reject(new Error(`Installation rejected for package: ${packageName}`));
29515
+ }
29516
+ subscribePendingChanges(listener) {
29517
+ this.#pendingListeners.add(listener);
29518
+ return () => {
29519
+ this.#pendingListeners.delete(listener);
29520
+ };
29521
+ }
29522
+ getPendingInstallations() {
29523
+ return this.#pending;
29524
+ }
29525
+ getDismissedPackages() {
29526
+ return this.#dismissed;
29527
+ }
29528
+ removeDismissed(packageName) {
29529
+ this.#dismissed = this.#dismissed.filter((d) => d.packageName !== packageName);
29530
+ persistDismissedPackages(this.#dismissed);
29531
+ this.#notifyPendingListeners();
29532
+ }
29533
+ #addDismissed(packageName, documentTypes) {
29534
+ const existing = this.#dismissed.find((d) => d.packageName === packageName);
29535
+ if (existing) {
29536
+ const merged = new Set([...existing.documentTypes, ...documentTypes]);
29537
+ existing.documentTypes = [...merged];
29538
+ } else {
29539
+ this.#dismissed = [...this.#dismissed, { packageName, documentTypes }];
29540
+ }
29541
+ persistDismissedPackages(this.#dismissed);
29542
+ }
29543
+ #removePending(packageName) {
29544
+ this.#pending = this.#pending.filter((p) => p.packageName !== packageName);
29545
+ this.#notifyPendingListeners();
29546
+ }
29547
+ #notifyPendingListeners() {
29548
+ for (const listener of this.#pendingListeners) {
29549
+ listener();
29550
+ }
29551
+ }
28994
29552
  }
28995
29553
  async function dropTablesInSchema(pg, schema) {
28996
29554
  await pg.exec(`
@@ -29016,40 +29574,6 @@ async function dropAllReactorStorage(pg) {
29016
29574
  await dropTablesInSchema(pg, REACTOR_SCHEMA);
29017
29575
  await dropTablesInSchema(pg, "public");
29018
29576
  }
29019
- function cdnUrlToApiUrl(cdnUrl) {
29020
- return cdnUrl.replace(/\/-\/cdn\/?$/, "");
29021
- }
29022
- function mapPackageInfo(pkg) {
29023
- return {
29024
- name: pkg.name,
29025
- description: pkg.manifest?.description,
29026
- version: pkg.manifest?.version,
29027
- category: pkg.manifest?.category,
29028
- publisher: pkg.manifest?.publisher?.name,
29029
- publisherUrl: pkg.manifest?.publisher?.url
29030
- };
29031
- }
29032
-
29033
- class RegistryClient {
29034
- apiUrl;
29035
- constructor(cdnUrl) {
29036
- this.apiUrl = cdnUrlToApiUrl(cdnUrl);
29037
- }
29038
- async getPackages() {
29039
- const res = await fetch(`${this.apiUrl}/packages`);
29040
- if (!res.ok)
29041
- throw new Error(`Registry error: HTTP ${res.status}`);
29042
- const data = await res.json();
29043
- return data.map(mapPackageInfo);
29044
- }
29045
- async searchPackages(query) {
29046
- const packages = await this.getPackages();
29047
- if (!query)
29048
- return packages;
29049
- const lowerQuery = query.toLowerCase();
29050
- return packages.filter((pkg) => pkg.name.toLowerCase().includes(lowerQuery) || pkg.description?.toLowerCase().includes(lowerQuery));
29051
- }
29052
- }
29053
29577
 
29054
29578
  class ReactorClientDocumentCache {
29055
29579
  client;
@@ -29355,7 +29879,7 @@ function split2(lst, le = false) {
29355
29879
  }
29356
29880
  function add(Ah, Al, Bh, Bl) {
29357
29881
  const l = (Al >>> 0) + (Bl >>> 0);
29358
- return { h: Ah + Bh + (l / 4294967296 | 0) | 0, l: l | 0 };
29882
+ return { h: Ah + Bh + (l / 2 ** 32 | 0) | 0, l: l | 0 };
29359
29883
  }
29360
29884
  function _abool2(value, title = "") {
29361
29885
  if (typeof value !== "boolean") {
@@ -30166,7 +30690,7 @@ function edwards(params, extraOpts = {}) {
30166
30690
  _abool2(zip215, "zip215");
30167
30691
  const normed = copyBytes(bytes);
30168
30692
  const lastByte = bytes[len - 1];
30169
- normed[len - 1] = lastByte & -129;
30693
+ normed[len - 1] = lastByte & ~128;
30170
30694
  const y = bytesToNumberLE(normed);
30171
30695
  const max = zip215 ? MASK : Fp.ORDER;
30172
30696
  aInRange("point.y", y, _0n4, max);
@@ -31552,7 +32076,7 @@ function ripemd_f(group, x, y, z) {
31552
32076
  return x ^ (y | ~z);
31553
32077
  }
31554
32078
  function keccakP(s, rounds = 24) {
31555
- const B = new Uint32Array(10);
32079
+ const B = new Uint32Array(5 * 2);
31556
32080
  for (let round = 24 - rounds;round < 24; round++) {
31557
32081
  for (let x = 0;x < 10; x++)
31558
32082
  B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];
@@ -31941,7 +32465,7 @@ function convertRadix2(data, from3, to, padding2) {
31941
32465
  }
31942
32466
  function radix(num) {
31943
32467
  anumber2(num);
31944
- const _256 = 256;
32468
+ const _256 = 2 ** 8;
31945
32469
  return {
31946
32470
  encode: (bytes) => {
31947
32471
  if (!isBytes2(bytes))
@@ -40558,7 +41082,7 @@ function useStableParams(params) {
40558
41082
  function createProcessorQuery(ProcessorClass) {
40559
41083
  function useQuery(driveId, queryCallback, parameters, options) {
40560
41084
  const stableParams = useStableParams(parameters);
40561
- const memoizedCallback = useCallback4(queryCallback, [stableParams]);
41085
+ const memoizedCallback = useCallback5(queryCallback, [stableParams]);
40562
41086
  return useRelationalQuery(ProcessorClass, driveId, memoizedCallback, stableParams, options);
40563
41087
  }
40564
41088
  return useQuery;
@@ -41092,41 +41616,6 @@ function CopyIcon({ size = 14, color = "#9EA0A1" }) {
41092
41616
  ]
41093
41617
  }, undefined, true, undefined, this);
41094
41618
  }
41095
- function ExternalLinkIcon({
41096
- size = 14,
41097
- color = "currentColor"
41098
- }) {
41099
- return /* @__PURE__ */ jsxDEV("svg", {
41100
- width: size,
41101
- height: size,
41102
- viewBox: "0 0 16 16",
41103
- fill: "none",
41104
- xmlns: "http://www.w3.org/2000/svg",
41105
- children: [
41106
- /* @__PURE__ */ jsxDEV("path", {
41107
- d: "M12 8.66667V12.6667C12 13.0203 11.8595 13.3594 11.6095 13.6095C11.3594 13.8595 11.0203 14 10.6667 14H3.33333C2.97971 14 2.64057 13.8595 2.39052 13.6095C2.14048 13.3594 2 13.0203 2 12.6667V5.33333C2 4.97971 2.14048 4.64057 2.39052 4.39052C2.64057 4.14048 2.97971 4 3.33333 4H7.33333",
41108
- stroke: color,
41109
- strokeWidth: "1.5",
41110
- strokeLinecap: "round",
41111
- strokeLinejoin: "round"
41112
- }, undefined, false, undefined, this),
41113
- /* @__PURE__ */ jsxDEV("path", {
41114
- d: "M10 2H14V6",
41115
- stroke: color,
41116
- strokeWidth: "1.5",
41117
- strokeLinecap: "round",
41118
- strokeLinejoin: "round"
41119
- }, undefined, false, undefined, this),
41120
- /* @__PURE__ */ jsxDEV("path", {
41121
- d: "M6.66669 9.33333L14 2",
41122
- stroke: color,
41123
- strokeWidth: "1.5",
41124
- strokeLinecap: "round",
41125
- strokeLinejoin: "round"
41126
- }, undefined, false, undefined, this)
41127
- ]
41128
- }, undefined, true, undefined, this);
41129
- }
41130
41619
  function DisconnectIcon({ size = 14, color = "#EA4335" }) {
41131
41620
  return /* @__PURE__ */ jsxDEV("svg", {
41132
41621
  width: size,
@@ -41229,6 +41718,27 @@ function SpinnerIcon({ size = 14, color = "currentColor" }) {
41229
41718
  ]
41230
41719
  }, undefined, true, undefined, this);
41231
41720
  }
41721
+ function ChevronDownIcon({
41722
+ size = 14,
41723
+ color = "currentColor",
41724
+ style
41725
+ }) {
41726
+ return /* @__PURE__ */ jsxDEV("svg", {
41727
+ width: size,
41728
+ height: size,
41729
+ viewBox: "0 0 16 16",
41730
+ fill: "none",
41731
+ xmlns: "http://www.w3.org/2000/svg",
41732
+ style,
41733
+ children: /* @__PURE__ */ jsxDEV("path", {
41734
+ d: "M4 6L8 10L12 6",
41735
+ stroke: color,
41736
+ strokeWidth: "1.5",
41737
+ strokeLinecap: "round",
41738
+ strokeLinejoin: "round"
41739
+ }, undefined, false, undefined, this)
41740
+ }, undefined, false, undefined, this);
41741
+ }
41232
41742
  function UserIcon({ size = 24, color = "#6366f1" }) {
41233
41743
  return /* @__PURE__ */ jsxDEV("svg", {
41234
41744
  width: size,
@@ -41253,134 +41763,80 @@ function UserIcon({ size = 24, color = "#6366f1" }) {
41253
41763
  ]
41254
41764
  }, undefined, true, undefined, this);
41255
41765
  }
41766
+ function mergeProps(parentProps, childProps) {
41767
+ const merged = { ...parentProps };
41768
+ for (const key of Object.keys(childProps)) {
41769
+ const parentValue = parentProps[key];
41770
+ const childValue = childProps[key];
41771
+ if (key === "style") {
41772
+ merged[key] = { ...parentValue, ...childValue };
41773
+ } else if (key === "className") {
41774
+ merged[key] = [parentValue, childValue].filter(Boolean).join(" ");
41775
+ } else if (typeof parentValue === "function" && typeof childValue === "function") {
41776
+ merged[key] = (...args) => {
41777
+ childValue(...args);
41778
+ parentValue(...args);
41779
+ };
41780
+ } else if (childValue !== undefined) {
41781
+ merged[key] = childValue;
41782
+ }
41783
+ }
41784
+ return merged;
41785
+ }
41256
41786
  function RenownLoginButton({
41257
41787
  onLogin: onLoginProp,
41258
41788
  darkMode = false,
41259
41789
  style,
41260
41790
  className,
41261
- renderTrigger,
41262
- showPopover = false
41791
+ asChild = false,
41792
+ children
41263
41793
  }) {
41264
41794
  const onLogin = onLoginProp ?? (() => openRenown());
41265
- const [isOpen, setIsOpen] = useState7(false);
41266
41795
  const [isLoading, setIsLoading] = useState7(false);
41267
41796
  const [isHovered, setIsHovered] = useState7(false);
41268
- const [showAbove, setShowAbove] = useState7(true);
41269
- const wrapperRef = useRef5(null);
41270
- const closeTimeoutRef = useRef5(null);
41271
- const calculatePosition = useCallback5(() => {
41272
- if (!wrapperRef.current)
41273
- return;
41274
- const rect = wrapperRef.current.getBoundingClientRect();
41275
- const spaceAbove = rect.top;
41276
- setShowAbove(spaceAbove >= POPOVER_HEIGHT + POPOVER_GAP);
41277
- }, []);
41278
- const handleMouseEnter = useCallback5(() => {
41279
- setIsHovered(true);
41280
- if (!showPopover)
41281
- return;
41282
- if (closeTimeoutRef.current) {
41283
- clearTimeout(closeTimeoutRef.current);
41284
- closeTimeoutRef.current = null;
41285
- }
41286
- calculatePosition();
41287
- setIsOpen(true);
41288
- }, [calculatePosition, showPopover]);
41289
- const handleMouseLeave = useCallback5(() => {
41290
- closeTimeoutRef.current = setTimeout(() => {
41291
- setIsOpen(false);
41292
- setIsHovered(false);
41293
- }, 150);
41294
- }, []);
41295
- useEffect7(() => {
41296
- return () => {
41297
- if (closeTimeoutRef.current) {
41298
- clearTimeout(closeTimeoutRef.current);
41299
- }
41300
- };
41301
- }, []);
41302
- const handleConnect = () => {
41303
- setIsLoading(true);
41304
- onLogin();
41305
- };
41306
- const handleDirectClick = () => {
41307
- if (!showPopover && !isLoading) {
41797
+ const handleMouseEnter = useCallback6(() => setIsHovered(true), []);
41798
+ const handleMouseLeave = useCallback6(() => setIsHovered(false), []);
41799
+ const handleClick = () => {
41800
+ if (!isLoading) {
41308
41801
  setIsLoading(true);
41309
41802
  onLogin();
41310
41803
  }
41311
41804
  };
41805
+ const themeStyles = darkMode ? darkStyles : lightStyles;
41312
41806
  const triggerStyle = {
41313
41807
  ...styles.trigger,
41314
- cursor: !isLoading ? "pointer" : "wait",
41808
+ ...themeStyles.trigger,
41809
+ ...isHovered && !isLoading ? themeStyles.triggerHover : {},
41810
+ cursor: isLoading ? "wait" : "pointer",
41315
41811
  ...style
41316
41812
  };
41317
- const allowLogin = !isLoading && !!onLogin;
41318
- const connectButtonStyle = {
41319
- ...styles.connectButtonBase,
41320
- ...darkMode ? styles.connectButtonDark : styles.connectButtonLight,
41321
- cursor: allowLogin ? "pointer" : "wait"
41322
- };
41323
- const popoverStyle = {
41324
- ...styles.popoverBase,
41325
- ...darkMode ? styles.popoverDark : styles.popoverLight,
41326
- ...showAbove ? { bottom: `calc(100% + ${POPOVER_GAP}px)` } : { top: `calc(100% + ${POPOVER_GAP}px)` }
41327
- };
41328
- const triggerImageStyle = darkMode ? styles.triggerImageDark : styles.triggerImageLight;
41329
- const logoColor = darkMode ? "#f9fafb" : "#374151";
41813
+ const triggerElement = asChild ? /* @__PURE__ */ jsxDEV2(Slot, {
41814
+ onClick: handleClick,
41815
+ "data-renown-state": "login",
41816
+ ...isLoading ? { "data-loading": "" } : {},
41817
+ children
41818
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV2("button", {
41819
+ type: "button",
41820
+ style: triggerStyle,
41821
+ "aria-label": "Log in with Renown",
41822
+ onClick: handleClick,
41823
+ "data-renown-state": "login",
41824
+ ...isLoading ? { "data-loading": "" } : {},
41825
+ children: isLoading ? /* @__PURE__ */ jsxDEV2(SpinnerIcon, {
41826
+ size: 16
41827
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV2("span", {
41828
+ children: "Log in"
41829
+ }, undefined, false, undefined, this)
41830
+ }, undefined, false, undefined, this);
41330
41831
  return /* @__PURE__ */ jsxDEV2("div", {
41331
- ref: wrapperRef,
41332
41832
  style: styles.wrapper,
41333
41833
  className,
41334
41834
  onMouseEnter: handleMouseEnter,
41335
41835
  onMouseLeave: handleMouseLeave,
41336
- children: [
41337
- renderTrigger ? renderTrigger({
41338
- onMouseEnter: handleMouseEnter,
41339
- onMouseLeave: handleMouseLeave,
41340
- isLoading
41341
- }) : /* @__PURE__ */ jsxDEV2("button", {
41342
- type: "button",
41343
- style: triggerStyle,
41344
- "aria-label": showPopover ? "Open Renown Login" : "Login with Renown",
41345
- onClick: showPopover ? undefined : handleDirectClick,
41346
- children: isLoading ? /* @__PURE__ */ jsxDEV2(SpinnerIcon, {
41347
- size: 42
41348
- }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV2("img", {
41349
- width: 42,
41350
- height: 42,
41351
- src: isHovered ? renownShortHoverDataUrl : renownShortDataUrl,
41352
- alt: "Renown Login",
41353
- style: triggerImageStyle
41354
- }, undefined, false, undefined, this)
41355
- }, undefined, false, undefined, this),
41356
- isOpen && showPopover && /* @__PURE__ */ jsxDEV2("div", {
41357
- style: popoverStyle,
41358
- children: /* @__PURE__ */ jsxDEV2("div", {
41359
- style: styles.popoverContent,
41360
- children: [
41361
- /* @__PURE__ */ jsxDEV2("div", {
41362
- style: styles.logoContainer,
41363
- children: /* @__PURE__ */ jsxDEV2(RenownLogo, {
41364
- width: 83,
41365
- height: 22,
41366
- color: logoColor
41367
- }, undefined, false, undefined, this)
41368
- }, undefined, false, undefined, this),
41369
- /* @__PURE__ */ jsxDEV2("button", {
41370
- type: "button",
41371
- onClick: allowLogin ? handleConnect : undefined,
41372
- style: connectButtonStyle,
41373
- children: isLoading ? /* @__PURE__ */ jsxDEV2(SpinnerIcon, {
41374
- size: 14
41375
- }, undefined, false, undefined, this) : "Connect"
41376
- }, undefined, false, undefined, this)
41377
- ]
41378
- }, undefined, true, undefined, this)
41379
- }, undefined, false, undefined, this)
41380
- ]
41381
- }, undefined, true, undefined, this);
41836
+ children: triggerElement
41837
+ }, undefined, false, undefined, this);
41382
41838
  }
41383
- function truncateAddress(address) {
41839
+ function truncateAddress2(address) {
41384
41840
  if (address.length <= 13)
41385
41841
  return address;
41386
41842
  return `${address.slice(0, 7)}...${address.slice(-5)}`;
@@ -41393,27 +41849,34 @@ function RenownUserButton({
41393
41849
  onDisconnect: onDisconnectProp,
41394
41850
  style,
41395
41851
  className,
41396
- renderTrigger
41852
+ asChild = false,
41853
+ children,
41854
+ menuItems
41397
41855
  }) {
41398
41856
  const user = useUser();
41399
41857
  const address = addressProp ?? user?.address ?? "";
41400
- const username = usernameProp ?? user?.ens?.name;
41401
- const avatarUrl = avatarUrlProp ?? user?.ens?.avatarUrl;
41858
+ const username = usernameProp ?? user?.profile?.username ?? user?.ens?.name;
41859
+ const avatarUrl = avatarUrlProp ?? user?.profile?.userImage ?? user?.ens?.avatarUrl;
41402
41860
  const userId = userIdProp ?? user?.profile?.documentId;
41403
41861
  const onDisconnect = onDisconnectProp ?? (() => void logout());
41862
+ const displayName = username ?? (address ? truncateAddress2(address) : "Account");
41863
+ const profileId = userId ?? address;
41404
41864
  const [isOpen, setIsOpen] = useState8(false);
41865
+ const [isHovered, setIsHovered] = useState8(false);
41405
41866
  const [isCopied, setIsCopied] = useState8(false);
41406
41867
  const [showAbove, setShowAbove] = useState8(true);
41407
- const wrapperRef = useRef6(null);
41408
- const closeTimeoutRef = useRef6(null);
41409
- const calculatePosition = useCallback6(() => {
41868
+ const [hoveredItem, setHoveredItem] = useState8(null);
41869
+ const wrapperRef = useRef5(null);
41870
+ const closeTimeoutRef = useRef5(null);
41871
+ const calculatePosition = useCallback7(() => {
41410
41872
  if (!wrapperRef.current)
41411
41873
  return;
41412
41874
  const rect = wrapperRef.current.getBoundingClientRect();
41413
41875
  const spaceAbove = rect.top;
41414
- setShowAbove(spaceAbove >= POPOVER_HEIGHT2 + POPOVER_GAP2);
41876
+ setShowAbove(spaceAbove >= POPOVER_HEIGHT + POPOVER_GAP);
41415
41877
  }, []);
41416
- const handleMouseEnter = useCallback6(() => {
41878
+ const handleMouseEnter = useCallback7(() => {
41879
+ setIsHovered(true);
41417
41880
  if (closeTimeoutRef.current) {
41418
41881
  clearTimeout(closeTimeoutRef.current);
41419
41882
  closeTimeoutRef.current = null;
@@ -41421,19 +41884,21 @@ function RenownUserButton({
41421
41884
  calculatePosition();
41422
41885
  setIsOpen(true);
41423
41886
  }, [calculatePosition]);
41424
- const handleMouseLeave = useCallback6(() => {
41887
+ const handleMouseLeave = useCallback7(() => {
41425
41888
  closeTimeoutRef.current = setTimeout(() => {
41426
41889
  setIsOpen(false);
41890
+ setIsHovered(false);
41891
+ setHoveredItem(null);
41427
41892
  }, 150);
41428
41893
  }, []);
41429
- useEffect8(() => {
41894
+ useEffect7(() => {
41430
41895
  return () => {
41431
41896
  if (closeTimeoutRef.current) {
41432
41897
  clearTimeout(closeTimeoutRef.current);
41433
41898
  }
41434
41899
  };
41435
41900
  }, []);
41436
- const copyToClipboard = useCallback6(async () => {
41901
+ const copyToClipboard = useCallback7(async () => {
41437
41902
  try {
41438
41903
  await navigator.clipboard.writeText(address);
41439
41904
  setIsCopied(true);
@@ -41442,6 +41907,43 @@ function RenownUserButton({
41442
41907
  console.error("Failed to copy address:", err);
41443
41908
  }
41444
41909
  }, [address]);
41910
+ const triggerElement = asChild ? /* @__PURE__ */ jsxDEV3(Slot, {
41911
+ "data-renown-state": "authenticated",
41912
+ children
41913
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV3("button", {
41914
+ type: "button",
41915
+ style: {
41916
+ ...styles2.trigger,
41917
+ ...isHovered ? styles2.triggerHover : {},
41918
+ ...style
41919
+ },
41920
+ "aria-label": "Open account menu",
41921
+ "data-renown-state": "authenticated",
41922
+ children: [
41923
+ avatarUrl ? /* @__PURE__ */ jsxDEV3("img", {
41924
+ src: avatarUrl,
41925
+ alt: "Avatar",
41926
+ style: styles2.avatar
41927
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV3("div", {
41928
+ style: styles2.avatarPlaceholder,
41929
+ children: /* @__PURE__ */ jsxDEV3("span", {
41930
+ style: styles2.avatarInitial,
41931
+ children: (displayName || "U")[0].toUpperCase()
41932
+ }, undefined, false, undefined, this)
41933
+ }, undefined, false, undefined, this),
41934
+ /* @__PURE__ */ jsxDEV3("span", {
41935
+ style: styles2.displayName,
41936
+ children: displayName
41937
+ }, undefined, false, undefined, this),
41938
+ /* @__PURE__ */ jsxDEV3(ChevronDownIcon, {
41939
+ size: 14,
41940
+ style: {
41941
+ ...styles2.chevron,
41942
+ ...isOpen ? styles2.chevronOpen : {}
41943
+ }
41944
+ }, undefined, false, undefined, this)
41945
+ ]
41946
+ }, undefined, true, undefined, this);
41445
41947
  return /* @__PURE__ */ jsxDEV3("div", {
41446
41948
  ref: wrapperRef,
41447
41949
  style: styles2.wrapper,
@@ -41449,46 +41951,25 @@ function RenownUserButton({
41449
41951
  onMouseEnter: handleMouseEnter,
41450
41952
  onMouseLeave: handleMouseLeave,
41451
41953
  children: [
41452
- renderTrigger ? renderTrigger({
41453
- onMouseEnter: handleMouseEnter,
41454
- onMouseLeave: handleMouseLeave,
41455
- address,
41456
- username,
41457
- avatarUrl
41458
- }) : /* @__PURE__ */ jsxDEV3("button", {
41459
- type: "button",
41460
- style: { ...styles2.trigger, ...style },
41461
- "aria-label": "Open account menu",
41462
- children: avatarUrl ? /* @__PURE__ */ jsxDEV3("img", {
41463
- src: avatarUrl,
41464
- alt: "Avatar",
41465
- style: styles2.avatar
41466
- }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV3("div", {
41467
- style: styles2.avatarPlaceholder,
41468
- children: /* @__PURE__ */ jsxDEV3(UserIcon, {
41469
- size: 24,
41470
- color: "#9ca3af"
41471
- }, undefined, false, undefined, this)
41472
- }, undefined, false, undefined, this)
41473
- }, undefined, false, undefined, this),
41954
+ triggerElement,
41474
41955
  isOpen && /* @__PURE__ */ jsxDEV3("div", {
41475
41956
  style: {
41476
41957
  ...styles2.popoverBase,
41477
- ...showAbove ? { bottom: `calc(100% + ${POPOVER_GAP2}px)` } : { top: `calc(100% + ${POPOVER_GAP2}px)` }
41958
+ ...showAbove ? { bottom: `calc(100% + ${POPOVER_GAP}px)` } : { top: `calc(100% + ${POPOVER_GAP}px)` }
41478
41959
  },
41479
41960
  children: [
41480
41961
  /* @__PURE__ */ jsxDEV3("div", {
41481
- style: styles2.section,
41962
+ style: styles2.header,
41482
41963
  children: [
41483
41964
  username && /* @__PURE__ */ jsxDEV3("div", {
41484
- style: styles2.username,
41965
+ style: styles2.headerUsername,
41485
41966
  children: username
41486
41967
  }, undefined, false, undefined, this),
41487
- /* @__PURE__ */ jsxDEV3("div", {
41968
+ address && /* @__PURE__ */ jsxDEV3("div", {
41488
41969
  style: styles2.addressRow,
41489
41970
  children: /* @__PURE__ */ jsxDEV3("button", {
41490
41971
  type: "button",
41491
- onClick: copyToClipboard,
41972
+ onClick: () => void copyToClipboard(),
41492
41973
  style: styles2.addressButton,
41493
41974
  children: /* @__PURE__ */ jsxDEV3("div", {
41494
41975
  style: {
@@ -41500,20 +41981,26 @@ function RenownUserButton({
41500
41981
  },
41501
41982
  children: [
41502
41983
  /* @__PURE__ */ jsxDEV3("div", {
41503
- style: { ...styles2.addressText, opacity: isCopied ? 0 : 1 },
41984
+ style: {
41985
+ ...styles2.addressText,
41986
+ opacity: isCopied ? 0 : 1
41987
+ },
41504
41988
  children: [
41505
41989
  /* @__PURE__ */ jsxDEV3("span", {
41506
- children: truncateAddress(address)
41990
+ children: truncateAddress2(address)
41507
41991
  }, undefined, false, undefined, this),
41508
41992
  /* @__PURE__ */ jsxDEV3(CopyIcon, {
41509
- size: 14,
41510
- color: "#9EA0A1"
41993
+ size: 12,
41994
+ color: "#9ca3af"
41511
41995
  }, undefined, false, undefined, this)
41512
41996
  ]
41513
41997
  }, undefined, true, undefined, this),
41514
41998
  /* @__PURE__ */ jsxDEV3("div", {
41515
- style: { ...styles2.copiedText, opacity: isCopied ? 1 : 0 },
41516
- children: "Copied to clipboard!"
41999
+ style: {
42000
+ ...styles2.copiedText,
42001
+ opacity: isCopied ? 1 : 0
42002
+ },
42003
+ children: "Copied!"
41517
42004
  }, undefined, false, undefined, this)
41518
42005
  ]
41519
42006
  }, undefined, true, undefined, this)
@@ -41521,35 +42008,64 @@ function RenownUserButton({
41521
42008
  }, undefined, false, undefined, this)
41522
42009
  ]
41523
42010
  }, undefined, true, undefined, this),
41524
- userId && /* @__PURE__ */ jsxDEV3("div", {
41525
- style: styles2.section,
41526
- children: /* @__PURE__ */ jsxDEV3("button", {
41527
- type: "button",
41528
- onClick: () => openRenown(userId),
41529
- style: styles2.menuItem,
41530
- children: [
41531
- /* @__PURE__ */ jsxDEV3(ExternalLinkIcon, {
41532
- size: 14
41533
- }, undefined, false, undefined, this),
41534
- "View on Renown"
41535
- ]
41536
- }, undefined, true, undefined, this)
42011
+ /* @__PURE__ */ jsxDEV3("div", {
42012
+ style: styles2.menuSection,
42013
+ children: [
42014
+ profileId && /* @__PURE__ */ jsxDEV3("button", {
42015
+ type: "button",
42016
+ onClick: () => openRenown(profileId),
42017
+ onMouseEnter: () => setHoveredItem("profile"),
42018
+ onMouseLeave: () => setHoveredItem(null),
42019
+ style: {
42020
+ ...styles2.menuItem,
42021
+ ...hoveredItem === "profile" ? styles2.menuItemHover : {}
42022
+ },
42023
+ children: [
42024
+ /* @__PURE__ */ jsxDEV3(UserIcon, {
42025
+ size: 14,
42026
+ color: "#6b7280"
42027
+ }, undefined, false, undefined, this),
42028
+ "View Profile"
42029
+ ]
42030
+ }, undefined, true, undefined, this),
42031
+ menuItems?.map((item) => /* @__PURE__ */ jsxDEV3("button", {
42032
+ type: "button",
42033
+ onClick: item.onClick,
42034
+ onMouseEnter: () => setHoveredItem(item.label),
42035
+ onMouseLeave: () => setHoveredItem(null),
42036
+ style: {
42037
+ ...styles2.menuItem,
42038
+ ...hoveredItem === item.label ? styles2.menuItemHover : {},
42039
+ ...item.style
42040
+ },
42041
+ children: [
42042
+ item.icon,
42043
+ item.label
42044
+ ]
42045
+ }, item.label, true, undefined, this))
42046
+ ]
42047
+ }, undefined, true, undefined, this),
42048
+ /* @__PURE__ */ jsxDEV3("hr", {
42049
+ style: styles2.separator
41537
42050
  }, undefined, false, undefined, this),
41538
42051
  /* @__PURE__ */ jsxDEV3("div", {
41539
- style: styles2.sectionLast,
42052
+ style: styles2.menuSection,
41540
42053
  children: /* @__PURE__ */ jsxDEV3("button", {
41541
42054
  type: "button",
41542
42055
  onClick: onDisconnect,
42056
+ onMouseEnter: () => setHoveredItem("disconnect"),
42057
+ onMouseLeave: () => setHoveredItem(null),
41543
42058
  style: {
41544
42059
  ...styles2.menuItem,
41545
- ...styles2.disconnectItem
42060
+ ...styles2.disconnectItem,
42061
+ ...hoveredItem === "disconnect" ? styles2.menuItemHover : {}
41546
42062
  },
41547
42063
  children: [
41548
42064
  /* @__PURE__ */ jsxDEV3(DisconnectIcon, {
41549
42065
  size: 14,
41550
- color: "#EA4335"
42066
+ color: "#dc2626"
41551
42067
  }, undefined, false, undefined, this),
41552
- "Disconnect"
42068
+ "Log out"
41553
42069
  ]
41554
42070
  }, undefined, true, undefined, this)
41555
42071
  }, undefined, false, undefined, this)
@@ -41560,23 +42076,23 @@ function RenownUserButton({
41560
42076
  }
41561
42077
  function RenownAuthButton({
41562
42078
  className = "",
41563
- renderAuthenticated,
41564
- renderUnauthenticated,
41565
- renderLoading
42079
+ darkMode,
42080
+ loginContent,
42081
+ userContent,
42082
+ loadingContent,
42083
+ children
41566
42084
  }) {
41567
- const user = useUser();
41568
- const loginStatus = useLoginStatus();
41569
- const isLoading = loginStatus === "checking";
41570
- const openProfile = () => {
41571
- if (!user)
41572
- return;
41573
- openRenown(user.profile?.documentId);
41574
- };
41575
- if (isLoading) {
41576
- if (renderLoading) {
42085
+ const auth = useRenownAuth();
42086
+ if (children) {
42087
+ return /* @__PURE__ */ jsxDEV4(Fragment, {
42088
+ children: children(auth)
42089
+ }, undefined, false, undefined, this);
42090
+ }
42091
+ if (auth.status === "loading" || auth.status === "checking") {
42092
+ if (loadingContent) {
41577
42093
  return /* @__PURE__ */ jsxDEV4("div", {
41578
42094
  className,
41579
- children: renderLoading()
42095
+ children: loadingContent
41580
42096
  }, undefined, false, undefined, this);
41581
42097
  }
41582
42098
  return /* @__PURE__ */ jsxDEV4("div", {
@@ -41584,24 +42100,44 @@ function RenownAuthButton({
41584
42100
  children: [
41585
42101
  /* @__PURE__ */ jsxDEV4("div", {
41586
42102
  style: {
41587
- width: "40px",
41588
- height: "40px",
41589
- borderRadius: "50%",
41590
- backgroundColor: "#e5e7eb",
42103
+ display: "flex",
42104
+ alignItems: "center",
42105
+ gap: "8px",
42106
+ padding: "6px 12px",
42107
+ borderRadius: "8px",
42108
+ border: "1px solid #e5e7eb",
41591
42109
  animation: "pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite"
41592
- }
41593
- }, undefined, false, undefined, this),
42110
+ },
42111
+ children: [
42112
+ /* @__PURE__ */ jsxDEV4("div", {
42113
+ style: {
42114
+ width: "28px",
42115
+ height: "28px",
42116
+ borderRadius: "50%",
42117
+ backgroundColor: "#e5e7eb"
42118
+ }
42119
+ }, undefined, false, undefined, this),
42120
+ /* @__PURE__ */ jsxDEV4("div", {
42121
+ style: {
42122
+ width: "80px",
42123
+ height: "14px",
42124
+ borderRadius: "4px",
42125
+ backgroundColor: "#e5e7eb"
42126
+ }
42127
+ }, undefined, false, undefined, this)
42128
+ ]
42129
+ }, undefined, true, undefined, this),
41594
42130
  /* @__PURE__ */ jsxDEV4("style", {
41595
42131
  children: `@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }`
41596
42132
  }, undefined, false, undefined, this)
41597
42133
  ]
41598
42134
  }, undefined, true, undefined, this);
41599
42135
  }
41600
- if (loginStatus === "authorized" && user) {
41601
- if (renderAuthenticated) {
42136
+ if (auth.status === "authorized") {
42137
+ if (userContent) {
41602
42138
  return /* @__PURE__ */ jsxDEV4("div", {
41603
42139
  className,
41604
- children: renderAuthenticated({ user, logout, openProfile })
42140
+ children: userContent
41605
42141
  }, undefined, false, undefined, this);
41606
42142
  }
41607
42143
  return /* @__PURE__ */ jsxDEV4("div", {
@@ -41609,54 +42145,52 @@ function RenownAuthButton({
41609
42145
  children: /* @__PURE__ */ jsxDEV4(RenownUserButton, {}, undefined, false, undefined, this)
41610
42146
  }, undefined, false, undefined, this);
41611
42147
  }
41612
- if (renderUnauthenticated) {
42148
+ if (loginContent) {
41613
42149
  return /* @__PURE__ */ jsxDEV4("div", {
41614
42150
  className,
41615
- children: renderUnauthenticated({ openRenown: () => openRenown(), isLoading })
42151
+ children: loginContent
41616
42152
  }, undefined, false, undefined, this);
41617
42153
  }
41618
42154
  return /* @__PURE__ */ jsxDEV4("div", {
41619
42155
  className,
41620
- children: /* @__PURE__ */ jsxDEV4(RenownLoginButton, {}, undefined, false, undefined, this)
42156
+ children: /* @__PURE__ */ jsxDEV4(RenownLoginButton, {
42157
+ darkMode
42158
+ }, undefined, false, undefined, this)
41621
42159
  }, undefined, false, undefined, this);
41622
42160
  }
41623
- function RenownProvider({
42161
+ async function initRenown(appName, namespace, url) {
42162
+ addRenownEventHandler();
42163
+ setRenown(loading);
42164
+ const builder = new RenownBuilder(appName, {
42165
+ basename: namespace,
42166
+ baseUrl: url
42167
+ });
42168
+ const renown = await builder.build();
42169
+ setRenown(renown);
42170
+ await login(undefined, renown);
42171
+ return renown;
42172
+ }
42173
+ function useRenownInit({
41624
42174
  appName,
41625
- basename,
41626
- baseUrl,
41627
- children
42175
+ namespace,
42176
+ url
41628
42177
  }) {
41629
- const initRef = useRef7(false);
41630
- const initialPropsRef = useRef7({ appName, basename, baseUrl });
42178
+ const promiseRef = useRef6(Promise.withResolvers());
42179
+ const initRef = useRef6(false);
42180
+ if (typeof window === "undefined") {
42181
+ promiseRef.current.reject(new Error("window is undefined"));
42182
+ return promiseRef.current.promise;
42183
+ }
41631
42184
  if (initRef.current) {
41632
- const initial = initialPropsRef.current;
41633
- if (appName !== initial.appName) {
41634
- console.warn("RenownProvider: 'appName' changed after mount. This prop is only read once during initialization.");
41635
- }
41636
- if (basename !== initial.basename) {
41637
- console.warn("RenownProvider: 'basename' changed after mount. This prop is only read once during initialization.");
41638
- }
41639
- if (baseUrl !== initial.baseUrl) {
41640
- console.warn("RenownProvider: 'baseUrl' changed after mount. This prop is only read once during initialization.");
41641
- }
42185
+ return promiseRef.current.promise;
41642
42186
  }
41643
- useEffect9(() => {
41644
- if (initRef.current)
41645
- return;
41646
- initRef.current = true;
41647
- if (!window.ph) {
41648
- window.ph = {};
41649
- }
41650
- addRenownEventHandler();
41651
- const init = async () => {
41652
- const builder = new RenownBuilder(appName, { basename, baseUrl });
41653
- const instance = await builder.build();
41654
- setRenown(instance);
41655
- await login(undefined, instance);
41656
- };
41657
- init().catch(console.error);
41658
- }, []);
41659
- return children;
42187
+ initRef.current = true;
42188
+ initRenown(appName, namespace, url).then(promiseRef.current.resolve).catch(promiseRef.current.reject);
42189
+ return promiseRef.current.promise;
42190
+ }
42191
+ function Renown2({ onError, ...initOptions }) {
42192
+ useRenownInit(initOptions).catch(onError ?? console.error);
42193
+ return null;
41660
42194
  }
41661
42195
  var __create2, __getProtoOf2, __defProp3, __getOwnPropNames2, __getOwnPropDesc2, __hasOwnProp2, __toESM2 = (mod, isNodeMode, target) => {
41662
42196
  target = mod != null ? __create2(__getProtoOf2(mod)) : {};
@@ -42222,13 +42756,13 @@ ${String(result)}`);
42222
42756
  return t;
42223
42757
  };
42224
42758
  return __assign.apply(this, arguments);
42225
- }, docCache, fragmentSourceMap, printFragmentWarnings = true, experimentalFragmentVariables = false, extras, PropagationMode2, PhDocumentFieldsFragmentDoc, GetDocumentModelsDocument, GetDocumentDocument, GetDocumentChildrenDocument, GetDocumentParentsDocument, FindDocumentsDocument, GetDocumentOperationsDocument, GetJobStatusDocument, CreateDocumentDocument, CreateEmptyDocumentDocument, MutateDocumentDocument, MutateDocumentAsyncDocument, RenameDocumentDocument, AddChildrenDocument, RemoveChildrenDocument, MoveChildrenDocument, DeleteDocumentDocument, DeleteDocumentsDocument, DocumentChangesDocument, JobChangesDocument, PollSyncEnvelopesDocument, TouchChannelDocument, PushSyncEnvelopesDocument, defaultWrapper = (action, _operationName, _operationType, _variables) => action(), SPLIT_LOWER_UPPER_RE, SPLIT_UPPER_UPPER_RE, SPLIT_SEPARATE_NUMBER_RE, DEFAULT_STRIP_REGEXP, SPLIT_REPLACE_VALUE = "$1\x00$2", DEFAULT_PREFIX_SUFFIX_CHARACTERS = "", isExternalControlsEnabledEventFunctions, setIsExternalControlsEnabled, useIsExternalControlsEnabled, addIsExternalControlsEnabledEventHandler, isDragAndDropEnabledEventFunctions, setIsDragAndDropEnabled, useIsDragAndDropEnabled, addIsDragAndDropEnabledEventHandler, allowedDocumentTypesEventFunctions, setAllowedDocumentTypes, addAllowedDocumentTypesEventHandler, phDriveEditorConfigSetters, phDocumentEditorConfigSetters, phDriveEditorConfigHooks, phDocumentEditorConfigHooks, vetraPackageManagerFunctions, useVetraPackageManager, useVetraPackages = () => {
42759
+ }, docCache, fragmentSourceMap, printFragmentWarnings = true, experimentalFragmentVariables = false, extras, PropagationMode2, PhDocumentFieldsFragmentDoc, GetDocumentModelsDocument, GetDocumentDocument, GetDocumentChildrenDocument, GetDocumentParentsDocument, FindDocumentsDocument, GetDocumentOperationsDocument, GetJobStatusDocument, CreateDocumentDocument, CreateEmptyDocumentDocument, MutateDocumentDocument, MutateDocumentAsyncDocument, RenameDocumentDocument, AddChildrenDocument, RemoveChildrenDocument, MoveChildrenDocument, DeleteDocumentDocument, DeleteDocumentsDocument, DocumentChangesDocument, JobChangesDocument, PollSyncEnvelopesDocument, TouchChannelDocument, PushSyncEnvelopesDocument, defaultWrapper = (action, _operationName, _operationType, _variables) => action(), SPLIT_LOWER_UPPER_RE, SPLIT_UPPER_UPPER_RE, SPLIT_SEPARATE_NUMBER_RE, DEFAULT_STRIP_REGEXP, SPLIT_REPLACE_VALUE = "$1\x00$2", DEFAULT_PREFIX_SUFFIX_CHARACTERS = "", isServer, useLoading, setLoading, addLoadingEventHandler, loading = null, renownEventFunctions, addRenownEventHandler, useRenown, setRenown, RENOWN_URL = "https://www.renown.id", RENOWN_NETWORK_ID = "eip155", RENOWN_CHAIN_ID = "1", DOMAIN_TYPE, VERIFIABLE_CREDENTIAL_EIP712_TYPE, CREDENTIAL_SCHEMA_EIP712_TYPE, CREDENTIAL_SUBJECT_TYPE, ISSUER_TYPE, CREDENTIAL_TYPES, isExternalControlsEnabledEventFunctions, setIsExternalControlsEnabled, useIsExternalControlsEnabled, addIsExternalControlsEnabledEventHandler, isDragAndDropEnabledEventFunctions, setIsDragAndDropEnabled, useIsDragAndDropEnabled, addIsDragAndDropEnabledEventHandler, allowedDocumentTypesEventFunctions, setAllowedDocumentTypes, addAllowedDocumentTypesEventHandler, phDriveEditorConfigSetters, phDocumentEditorConfigSetters, phDriveEditorConfigHooks, phDocumentEditorConfigHooks, vetraPackageManagerFunctions, useVetraPackageManager, useVetraPackages = () => {
42226
42760
  const packageManager = useVetraPackageManager();
42227
- return useSyncExternalStore2((cb) => packageManager ? packageManager.subscribe(cb) : () => {}, () => packageManager?.packages ?? []);
42228
- }, addVetraPackageManagerEventHandler, reactorClientModuleEventFunctions, reactorClientEventFunctions, useReactorClientModule, setReactorClientModule, addReactorClientModuleEventHandler, useReactorClient, setReactorClient, addReactorClientEventHandler, useSync = () => useReactorClientModule()?.reactorModule?.syncModule?.syncManager, useSyncList = () => {
42761
+ return useSyncExternalStore3((cb) => packageManager ? packageManager.subscribe(cb) : () => {}, () => packageManager?.packages ?? []);
42762
+ }, addVetraPackageManagerEventHandler, EMPTY_PENDING, EMPTY_DISMISSED, NOOP_UNSUBSCRIBE = () => {}, documentEventFunctions, useDocumentCache, setDocumentCache, addDocumentCacheEventHandler, base64, locales, defaultLocale, initialMulticharmap, initialCharmap, slug_default, drivesEventFunctions, useDrives, setDrives, addDrivesEventHandler, selectedDriveIdEventFunctions, useSelectedDriveId, setSelectedDriveId, addSelectedDriveIdEventHandler, selectedNodeIdEventFunctions, useSelectedNodeId, setSelectedNodeId, addSelectedNodeIdEventHandler, useRouterBasename, setRouterBasename, addRouterBasenameEventHandler, useVersion, setVersion, addVersionEventHandler, useRequiresHardRefresh, setRequiresHardRefresh, addRequiresHardRefreshEventHandler, useWarnOutdatedApp, setWarnOutdatedApp, addWarnOutdatedAppEventHandler, useStudioMode, setStudioMode, addStudioModeEventHandler, useBasePath, setBasePath, addBasePathEventHandler, useVersionCheckInterval, setVersionCheckInterval, addVersionCheckIntervalEventHandler, useCliVersion, setCliVersion, addCliVersionEventHandler, useFileUploadOperationsChunkSize, setFileUploadOperationsChunkSize, addFileUploadOperationsChunkSizeEventHandler, useIsDocumentModelSelectionSettingsEnabled, setIsDocumentModelSelectionSettingsEnabled, addIsDocumentModelSelectionSettingsEnabledEventHandler, useGaTrackingId, setGaTrackingId, addGaTrackingIdEventHandler, useDefaultDrivesUrl, setDefaultDrivesUrl, addDefaultDrivesUrlEventHandler, useDrivesPreserveStrategy, setDrivesPreserveStrategy, addDrivesPreserveStrategyEventHandler, useIsLocalDrivesEnabled, setIsLocalDrivesEnabled, addIsLocalDrivesEnabledEventHandler, useIsAddDriveEnabled, setIsAddDriveEnabled, addIsAddDriveEnabledEventHandler, useIsPublicDrivesEnabled, setIsPublicDrivesEnabled, addIsPublicDrivesEnabledEventHandler, useIsAddPublicDrivesEnabled, setIsAddPublicDrivesEnabled, addIsAddPublicDrivesEnabledEventHandler, useIsDeletePublicDrivesEnabled, setIsDeletePublicDrivesEnabled, addIsDeletePublicDrivesEnabledEventHandler, useIsCloudDrivesEnabled, setIsCloudDrivesEnabled, addIsCloudDrivesEnabledEventHandler, useIsAddCloudDrivesEnabled, setIsAddCloudDrivesEnabled, addIsAddCloudDrivesEnabledEventHandler, useIsDeleteCloudDrivesEnabled, setIsDeleteCloudDrivesEnabled, addIsDeleteCloudDrivesEnabledEventHandler, useLocalDrivesEnabled, setLocalDrivesEnabled, addLocalDrivesEnabledEventHandler, useIsAddLocalDrivesEnabled, setIsAddLocalDrivesEnabled, addIsAddLocalDrivesEnabledEventHandler, useIsDeleteLocalDrivesEnabled, setIsDeleteLocalDrivesEnabled, addIsDeleteLocalDrivesEnabledEventHandler, useIsEditorDebugModeEnabled, setIsEditorDebugModeEnabled, addIsEditorDebugModeEnabledEventHandler, useIsEditorReadModeEnabled, setIsEditorReadModeEnabled, addIsEditorReadModeEnabledEventHandler, useIsAnalyticsDatabaseWorkerEnabled, setIsAnalyticsDatabaseWorkerEnabled, addIsAnalyticsDatabaseWorkerEnabledEventHandler, useIsDiffAnalyticsEnabled, setIsDiffAnalyticsEnabled, addIsDiffAnalyticsEnabledEventHandler, useIsDriveAnalyticsEnabled, setIsDriveAnalyticsEnabled, addIsDriveAnalyticsEnabledEventHandler, useRenownUrl, setRenownUrl, addRenownUrlEventHandler, useRenownNetworkId, setRenownNetworkId, addRenownNetworkIdEventHandler, useRenownChainId, setRenownChainId, addRenownChainIdEventHandler, useSentryRelease, setSentryRelease, addSentryReleaseEventHandler, useSentryDsn, setSentryDsn, addSentryDsnEventHandler, useSentryEnv, setSentryEnv, addSentryEnvEventHandler, useIsSentryTracingEnabled, setIsSentryTracingEnabled, addIsSentryTracingEnabledEventHandler, useIsExternalProcessorsEnabled, setIsExternalProcessorsEnabled, addIsExternalProcessorsEnabledEventHandler, useIsExternalPackagesEnabled, setIsExternalPackagesEnabled, addIsExternalPackagesEnabledEventHandler, enabledEditorsEventFunctions, setEnabledEditors, useEnabledEditors, addEnabledEditorsEventHandler, disabledEditorsEventFunctions, setDisabledEditors, useDisabledEditors, addDisabledEditorsEventHandler, isRelationalProcessorsEnabled, setIsRelationalProcessorsEnabled, useIsRelationalProcessorsEnabled, addIsRelationalProcessorsEnabledEventHandler, isExternalRelationalProcessorsEnabled, setIsExternalRelationalProcessorsEnabled, useIsExternalRelationalProcessorsEnabled, addIsExternalRelationalProcessorsEnabledEventHandler, isAnalyticsEnabledEventFunctions, setIsAnalyticsEnabled, useIsAnalyticsEnabled, addIsAnalyticsEnabledEventHandler, isAnalyticsExternalProcessorsEnabled, setIsAnalyticsExternalProcessorsEnabled, useIsAnalyticsExternalProcessorsEnabled, addIsAnalyticsExternalProcessorsEnabledEventHandler, analyticsDatabaseNameEventFunctions, setAnalyticsDatabaseName, useAnalyticsDatabaseName, addAnalyticsDatabaseNameEventHandler, logLevelEventFunctions, setLogLevel2, useLogLevel, addLogLevelEventHandler, allowListEventFunctions, setAllowList, useAllowList, addAllowListEventHandler, nonUserConfigSetters, phGlobalConfigSetters, nonUserConfigHooks, phGlobalConfigHooks, reactorClientModuleEventFunctions, reactorClientEventFunctions, useReactorClientModule, setReactorClientModule, addReactorClientModuleEventHandler, useReactorClient, setReactorClient, addReactorClientEventHandler, useSync = () => useReactorClientModule()?.reactorModule?.syncModule?.syncManager, useSyncList = () => {
42229
42763
  const sync = useSync();
42230
42764
  return sync?.list() ?? [];
42231
- }, documentEventFunctions, useDocumentCache, setDocumentCache, addDocumentCacheEventHandler, base64, locales, defaultLocale, initialMulticharmap, initialCharmap, slug_default, drivesEventFunctions, useDrives, setDrives, addDrivesEventHandler, selectedDriveIdEventFunctions, useSelectedDriveId, setSelectedDriveId, addSelectedDriveIdEventHandler, selectedNodeIdEventFunctions, useSelectedNodeId, setSelectedNodeId, addSelectedNodeIdEventHandler, useRouterBasename, setRouterBasename, addRouterBasenameEventHandler, useVersion, setVersion, addVersionEventHandler, useRequiresHardRefresh, setRequiresHardRefresh, addRequiresHardRefreshEventHandler, useWarnOutdatedApp, setWarnOutdatedApp, addWarnOutdatedAppEventHandler, useStudioMode, setStudioMode, addStudioModeEventHandler, useBasePath, setBasePath, addBasePathEventHandler, useVersionCheckInterval, setVersionCheckInterval, addVersionCheckIntervalEventHandler, useCliVersion, setCliVersion, addCliVersionEventHandler, useFileUploadOperationsChunkSize, setFileUploadOperationsChunkSize, addFileUploadOperationsChunkSizeEventHandler, useIsDocumentModelSelectionSettingsEnabled, setIsDocumentModelSelectionSettingsEnabled, addIsDocumentModelSelectionSettingsEnabledEventHandler, useGaTrackingId, setGaTrackingId, addGaTrackingIdEventHandler, useDefaultDrivesUrl, setDefaultDrivesUrl, addDefaultDrivesUrlEventHandler, useDrivesPreserveStrategy, setDrivesPreserveStrategy, addDrivesPreserveStrategyEventHandler, useIsLocalDrivesEnabled, setIsLocalDrivesEnabled, addIsLocalDrivesEnabledEventHandler, useIsAddDriveEnabled, setIsAddDriveEnabled, addIsAddDriveEnabledEventHandler, useIsPublicDrivesEnabled, setIsPublicDrivesEnabled, addIsPublicDrivesEnabledEventHandler, useIsAddPublicDrivesEnabled, setIsAddPublicDrivesEnabled, addIsAddPublicDrivesEnabledEventHandler, useIsDeletePublicDrivesEnabled, setIsDeletePublicDrivesEnabled, addIsDeletePublicDrivesEnabledEventHandler, useIsCloudDrivesEnabled, setIsCloudDrivesEnabled, addIsCloudDrivesEnabledEventHandler, useIsAddCloudDrivesEnabled, setIsAddCloudDrivesEnabled, addIsAddCloudDrivesEnabledEventHandler, useIsDeleteCloudDrivesEnabled, setIsDeleteCloudDrivesEnabled, addIsDeleteCloudDrivesEnabledEventHandler, useLocalDrivesEnabled, setLocalDrivesEnabled, addLocalDrivesEnabledEventHandler, useIsAddLocalDrivesEnabled, setIsAddLocalDrivesEnabled, addIsAddLocalDrivesEnabledEventHandler, useIsDeleteLocalDrivesEnabled, setIsDeleteLocalDrivesEnabled, addIsDeleteLocalDrivesEnabledEventHandler, useIsEditorDebugModeEnabled, setIsEditorDebugModeEnabled, addIsEditorDebugModeEnabledEventHandler, useIsEditorReadModeEnabled, setIsEditorReadModeEnabled, addIsEditorReadModeEnabledEventHandler, useIsAnalyticsDatabaseWorkerEnabled, setIsAnalyticsDatabaseWorkerEnabled, addIsAnalyticsDatabaseWorkerEnabledEventHandler, useIsDiffAnalyticsEnabled, setIsDiffAnalyticsEnabled, addIsDiffAnalyticsEnabledEventHandler, useIsDriveAnalyticsEnabled, setIsDriveAnalyticsEnabled, addIsDriveAnalyticsEnabledEventHandler, useRenownUrl, setRenownUrl, addRenownUrlEventHandler, useRenownNetworkId, setRenownNetworkId, addRenownNetworkIdEventHandler, useRenownChainId, setRenownChainId, addRenownChainIdEventHandler, useSentryRelease, setSentryRelease, addSentryReleaseEventHandler, useSentryDsn, setSentryDsn, addSentryDsnEventHandler, useSentryEnv, setSentryEnv, addSentryEnvEventHandler, useIsSentryTracingEnabled, setIsSentryTracingEnabled, addIsSentryTracingEnabledEventHandler, useIsExternalProcessorsEnabled, setIsExternalProcessorsEnabled, addIsExternalProcessorsEnabledEventHandler, useIsExternalPackagesEnabled, setIsExternalPackagesEnabled, addIsExternalPackagesEnabledEventHandler, enabledEditorsEventFunctions, setEnabledEditors, useEnabledEditors, addEnabledEditorsEventHandler, disabledEditorsEventFunctions, setDisabledEditors, useDisabledEditors, addDisabledEditorsEventHandler, isRelationalProcessorsEnabled, setIsRelationalProcessorsEnabled, useIsRelationalProcessorsEnabled, addIsRelationalProcessorsEnabledEventHandler, isExternalRelationalProcessorsEnabled, setIsExternalRelationalProcessorsEnabled, useIsExternalRelationalProcessorsEnabled, addIsExternalRelationalProcessorsEnabledEventHandler, isAnalyticsEnabledEventFunctions, setIsAnalyticsEnabled, useIsAnalyticsEnabled, addIsAnalyticsEnabledEventHandler, isAnalyticsExternalProcessorsEnabled, setIsAnalyticsExternalProcessorsEnabled, useIsAnalyticsExternalProcessorsEnabled, addIsAnalyticsExternalProcessorsEnabledEventHandler, analyticsDatabaseNameEventFunctions, setAnalyticsDatabaseName, useAnalyticsDatabaseName, addAnalyticsDatabaseNameEventHandler, logLevelEventFunctions, setLogLevel2, useLogLevel, addLogLevelEventHandler, allowListEventFunctions, setAllowList, useAllowList, addAllowListEventHandler, nonUserConfigSetters, phGlobalConfigSetters, nonUserConfigHooks, phGlobalConfigHooks, featuresEventFunctions, useFeatures, setFeatures, addFeaturesEventHandler, modalEventFunctions, usePHModal, setPHModal, addModalEventHandler, revisionHistoryEventFunctions, useRevisionHistoryVisible, setRevisionHistoryVisible, addRevisionHistoryVisibleEventHandler, selectedTimelineItemEventFunctions, useSelectedTimelineItem, setSelectedTimelineItem, addSelectedTimelineItemEventHandler, selectedTimelineRevisionEventFunctions, useSelectedTimelineRevision, setSelectedTimelineRevision, addSelectedTimelineRevisionEventHandler, toastEventFunctions, usePHToast, setPHToast, addToastEventHandler, FEATURE_INSPECTOR_ENABLED = "FEATURE_INSPECTOR_ENABLED", FEATURE_INSPECTOR_ENABLED_DEFAULT = false, syncStatusToUI, validateDocument = (document2) => {
42765
+ }, featuresEventFunctions, useFeatures, setFeatures, addFeaturesEventHandler, modalEventFunctions, usePHModal, setPHModal, addModalEventHandler, revisionHistoryEventFunctions, useRevisionHistoryVisible, setRevisionHistoryVisible, addRevisionHistoryVisibleEventHandler, selectedTimelineItemEventFunctions, useSelectedTimelineItem, setSelectedTimelineItem, addSelectedTimelineItemEventHandler, selectedTimelineRevisionEventFunctions, useSelectedTimelineRevision, setSelectedTimelineRevision, addSelectedTimelineRevisionEventHandler, toastEventFunctions, usePHToast, setPHToast, addToastEventHandler, FEATURE_INSPECTOR_ENABLED = "FEATURE_INSPECTOR_ENABLED", FEATURE_INSPECTOR_ENABLED_DEFAULT = false, syncStatusToUI, validateDocument = (document2) => {
42232
42766
  const errors2 = [];
42233
42767
  if (document2.header.documentType !== "powerhouse/document-model") {
42234
42768
  return errors2;
@@ -42280,7 +42814,7 @@ ${String(result)}`);
42280
42814
  return operationDate >= startDate && operationDate <= endDate;
42281
42815
  });
42282
42816
  return operation ? operation.index : 0;
42283
- }, lzString, RENOWN_URL = "https://www.renown.id", RENOWN_NETWORK_ID = "eip155", RENOWN_CHAIN_ID = "1", DOMAIN_TYPE, VERIFIABLE_CREDENTIAL_EIP712_TYPE, CREDENTIAL_SCHEMA_EIP712_TYPE, CREDENTIAL_SUBJECT_TYPE, ISSUER_TYPE, CREDENTIAL_TYPES, useLoading, setLoading, addLoadingEventHandler, renownEventFunctions, useRenown, setRenown, addRenownEventHandler, useOnDropFile = (documentTypesOverride) => {
42817
+ }, lzString, useOnDropFile = (documentTypesOverride) => {
42284
42818
  const selectedDriveId = useSelectedDriveId();
42285
42819
  const selectedFolder = useSelectedFolder();
42286
42820
  const documentTypes = useDocumentTypes();
@@ -42294,7 +42828,7 @@ ${String(result)}`);
42294
42828
  return await addFileWithProgress(file, selectedDriveId, fileName, targetNodeId, onProgress, documentTypesOverride ?? documentTypes, resolveConflict);
42295
42829
  };
42296
42830
  return onDropFile;
42297
- }, store, BrowserLocalStorage, PGLITE_UPDATE_EVENT = "ph:pglite-update", defaultPGliteState, usePGliteDB = () => {
42831
+ }, store, BrowserLocalStorage, DISMISSED_STORAGE_KEY = "ph-connect-dismissed-packages", PGLITE_UPDATE_EVENT = "ph:pglite-update", defaultPGliteState, usePGliteDB = () => {
42298
42832
  const [state, setState] = useState5(() => window.powerhouse?.pglite ?? defaultPGliteState);
42299
42833
  useEffect5(() => {
42300
42834
  const handlePgliteUpdate = () => setState(window.powerhouse?.pglite ?? defaultPGliteState);
@@ -42320,7 +42854,7 @@ ${String(result)}`);
42320
42854
  const pglite = usePGliteDB();
42321
42855
  const setPGlite = useSetPGliteDB();
42322
42856
  return [pglite, setPGlite];
42323
- }, DEFAULT_RENOWN_URL = "https://www.renown.id", crypto2, isLE, swap32IfBE, hasHexBuiltin, hexes, asciis, HashMD, SHA256_IV, SHA384_IV, SHA512_IV, U32_MASK64, _32n, shrSH = (h, _l, s) => h >>> s, shrSL = (h, l, s) => h << 32 - s | l >>> s, rotrSH = (h, l, s) => h >>> s | l << 32 - s, rotrSL = (h, l, s) => h << 32 - s | l >>> s, rotrBH = (h, l, s) => h << 64 - s | l >>> s - 32, rotrBL = (h, l, s) => h >>> s - 32 | l << 64 - s, rotlSH = (h, l, s) => h << s | l >>> 32 - s, rotlSL = (h, l, s) => l << s | h >>> 32 - s, rotlBH = (h, l, s) => l << s - 32 | h >>> 64 - s, rotlBL = (h, l, s) => h << s - 32 | l >>> 64 - s, add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0), add3H = (low, Ah, Bh, Ch) => Ah + Bh + Ch + (low / 4294967296 | 0) | 0, add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0), add4H = (low, Ah, Bh, Ch, Dh) => Ah + Bh + Ch + Dh + (low / 4294967296 | 0) | 0, add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0), add5H = (low, Ah, Bh, Ch, Dh, Eh) => Ah + Bh + Ch + Dh + Eh + (low / 4294967296 | 0) | 0, SHA256_K, SHA256_W, SHA256, K512, SHA512_Kh, SHA512_Kl, SHA512_W_H, SHA512_W_L, SHA512, SHA384, sha2562, sha5122, sha384, _0n, _1n, isPosBig = (n) => typeof n === "bigint" && _0n <= n, bitMask = (n) => (_1n << BigInt(n)) - _1n, notImplemented = () => {
42857
+ }, DEFAULT_RENOWN_URL = "https://www.renown.id", crypto2, isLE, swap32IfBE, hasHexBuiltin, hexes, asciis, HashMD, SHA256_IV, SHA384_IV, SHA512_IV, U32_MASK64, _32n, shrSH = (h, _l, s) => h >>> s, shrSL = (h, l, s) => h << 32 - s | l >>> s, rotrSH = (h, l, s) => h >>> s | l << 32 - s, rotrSL = (h, l, s) => h << 32 - s | l >>> s, rotrBH = (h, l, s) => h << 64 - s | l >>> s - 32, rotrBL = (h, l, s) => h >>> s - 32 | l << 64 - s, rotlSH = (h, l, s) => h << s | l >>> 32 - s, rotlSL = (h, l, s) => l << s | h >>> 32 - s, rotlBH = (h, l, s) => l << s - 32 | h >>> 64 - s, rotlBL = (h, l, s) => h << s - 32 | l >>> 64 - s, add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0), add3H = (low, Ah, Bh, Ch) => Ah + Bh + Ch + (low / 2 ** 32 | 0) | 0, add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0), add4H = (low, Ah, Bh, Ch, Dh) => Ah + Bh + Ch + Dh + (low / 2 ** 32 | 0) | 0, add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0), add5H = (low, Ah, Bh, Ch, Dh, Eh) => Ah + Bh + Ch + Dh + Eh + (low / 2 ** 32 | 0) | 0, SHA256_K, SHA256_W, SHA256, K512, SHA512_Kh, SHA512_Kl, SHA512_W_H, SHA512_W_L, SHA512, SHA384, sha2562, sha5122, sha384, _0n, _1n, isPosBig = (n) => typeof n === "bigint" && _0n <= n, bitMask = (n) => (_1n << BigInt(n)) - _1n, notImplemented = () => {
42324
42858
  throw new Error("not implemented");
42325
42859
  }, _0n2, _1n2, _2n, _3n, _4n, _5n, _7n, _8n, _9n, _16n, isNegativeLE = (num, modulo) => (mod(num, modulo) & _1n2) === _1n2, FIELD_FIELDS, _0n3, _1n3, pointPrecomputes, pointWindowSizes, _0n4, _1n4, _2n2, _8n2, _0n5, _1n5, _2n3, _3n2, _5n2, _8n3, ed25519_CURVE_p, ed25519_CURVE, ED25519_SQRT_M1, Fp, Fn, ed25519Defaults, ed25519, SQRT_M1, SQRT_AD_MINUS_ONE, INVSQRT_A_MINUS_D, ONE_MINUS_D_SQ, D_MINUS_ONE_SQ, invertSqrt = (number) => uvRatio(_1n5, number), MAX_255B, bytes255ToNumberLE = (bytes) => ed25519.Point.Fp.create(bytesToNumberLE(bytes) & MAX_255B), _RistrettoPoint, import_multibase, HMAC, hmac = (hash, key, message) => new HMAC(hash, key).update(message).digest(), divNearest = (num, den) => (num + (num >= 0 ? den : -den) / _2n4) / den, DERErr, DER, _0n6, _1n6, _2n4, _3n3, _4n2, secp256k1_CURVE, secp256k1_ENDO, _2n5, Fpk1, secp256k1, p256_CURVE, p384_CURVE, p521_CURVE, Fp256, Fp384, Fp521, p256, p384, p521, p2562, sha2563, Rho160, Id160, Pi160, idxLR, idxL, idxR, shifts160, shiftsL160, shiftsR160, Kl160, Kr160, BUF_160, RIPEMD160, ripemd160, ripemd1602, _0n7, _1n7, _2n6, _7n2, _256n, _0x71n, SHA3_PI, SHA3_ROTL, _SHA3_IOTA, IOTAS, SHA3_IOTA_H, SHA3_IOTA_L, rotlH = (h, l, s) => s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s), rotlL = (h, l, s) => s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s), Keccak, gen = (suffix, blockLen, outputLen) => createHasher(() => new Keccak(blockLen, suffix, outputLen)), keccak_256, import_canonicalize, PCT_ENCODED = "(?:%[0-9a-fA-F]{2})", ID_CHAR, METHOD = "([a-z0-9]+)", METHOD_ID, PARAM_CHAR = "[a-zA-Z0-9_.:%-]", PARAM, PARAMS, PATH = `(/[^#?]*)?`, QUERY = `([?][^#]*)?`, FRAGMENT = `(#.*)?`, DID_MATCHER, EMPTY_RESULT, gcd = (a, b) => b === 0 ? a : gcd(b, a % b), radix2carry = (from3, to) => from3 + (to - gcd(from3, to)), powers, base162, base322, base32nopad, base32hex2, base32hexnopad, base32crockford, hasBase64Builtin, decodeBase64Builtin = (s, isUrl) => {
42326
42860
  astr("base64", s);
@@ -43095,7 +43629,7 @@ ${String(result)}`);
43095
43629
  }, MAX_RETRIES = 5, RETRY_DELAY = 200, isRelationNotExistError = (error) => {
43096
43630
  const errorMessage = error instanceof Error ? error.message : typeof error === "string" ? error : String(error);
43097
43631
  return errorMessage.toLowerCase().includes("relation") && errorMessage.toLowerCase().includes("does not exist");
43098
- }, import_lodash, ConflictError, renownShortDataUrl = "data:image/png;base64,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", renownShortHoverDataUrl = "data:image/png;base64,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", POPOVER_GAP = 8, POPOVER_HEIGHT = 120, styles, POPOVER_GAP2 = 8, POPOVER_HEIGHT2 = 150, styles2;
43632
+ }, import_lodash, ConflictError, Slot, lightStyles, darkStyles, styles, POPOVER_GAP = 4, POPOVER_HEIGHT = 150, styles2;
43099
43633
  var init_src2 = __esm(() => {
43100
43634
  init_src();
43101
43635
  init_src();
@@ -47452,6 +47986,52 @@ spurious results.`);
47452
47986
  SPLIT_UPPER_UPPER_RE = /(\p{Lu})([\p{Lu}][\p{Ll}])/gu;
47453
47987
  SPLIT_SEPARATE_NUMBER_RE = /(\d)\p{Ll}|(\p{L})\d/u;
47454
47988
  DEFAULT_STRIP_REGEXP = /[^\p{L}\d]+/giu;
47989
+ isServer = typeof window === "undefined";
47990
+ ({
47991
+ useValue: useLoading,
47992
+ setValue: setLoading,
47993
+ addEventHandler: addLoadingEventHandler
47994
+ } = makePHEventFunctions("loading"));
47995
+ renownEventFunctions = makePHEventFunctions("renown");
47996
+ addRenownEventHandler = renownEventFunctions.addEventHandler;
47997
+ useRenown = renownEventFunctions.useValue;
47998
+ setRenown = renownEventFunctions.setValue;
47999
+ DOMAIN_TYPE = [
48000
+ { name: "name", type: "string" },
48001
+ { name: "version", type: "string" },
48002
+ { name: "chainId", type: "uint256" },
48003
+ { name: "verifyingContract", type: "address" }
48004
+ ];
48005
+ VERIFIABLE_CREDENTIAL_EIP712_TYPE = [
48006
+ { name: "@context", type: "string[]" },
48007
+ { name: "type", type: "string[]" },
48008
+ { name: "id", type: "string" },
48009
+ { name: "issuer", type: "Issuer" },
48010
+ { name: "credentialSubject", type: "CredentialSubject" },
48011
+ { name: "credentialSchema", type: "CredentialSchema" },
48012
+ { name: "issuanceDate", type: "string" },
48013
+ { name: "expirationDate", type: "string" }
48014
+ ];
48015
+ CREDENTIAL_SCHEMA_EIP712_TYPE = [
48016
+ { name: "id", type: "string" },
48017
+ { name: "type", type: "string" }
48018
+ ];
48019
+ CREDENTIAL_SUBJECT_TYPE = [
48020
+ { name: "app", type: "string" },
48021
+ { name: "id", type: "string" },
48022
+ { name: "name", type: "string" }
48023
+ ];
48024
+ ISSUER_TYPE = [
48025
+ { name: "id", type: "string" },
48026
+ { name: "ethereumAddress", type: "string" }
48027
+ ];
48028
+ CREDENTIAL_TYPES = {
48029
+ EIP712Domain: DOMAIN_TYPE,
48030
+ VerifiableCredential: VERIFIABLE_CREDENTIAL_EIP712_TYPE,
48031
+ CredentialSchema: CREDENTIAL_SCHEMA_EIP712_TYPE,
48032
+ CredentialSubject: CREDENTIAL_SUBJECT_TYPE,
48033
+ Issuer: ISSUER_TYPE
48034
+ };
47455
48035
  isExternalControlsEnabledEventFunctions = makePHEventFunctions("isExternalControlsEnabled");
47456
48036
  setIsExternalControlsEnabled = isExternalControlsEnabledEventFunctions.setValue;
47457
48037
  useIsExternalControlsEnabled = isExternalControlsEnabledEventFunctions.useValue;
@@ -47480,14 +48060,8 @@ spurious results.`);
47480
48060
  vetraPackageManagerFunctions = makePHEventFunctions("vetraPackageManager");
47481
48061
  useVetraPackageManager = vetraPackageManagerFunctions.useValue;
47482
48062
  addVetraPackageManagerEventHandler = vetraPackageManagerFunctions.addEventHandler;
47483
- reactorClientModuleEventFunctions = makePHEventFunctions("reactorClientModule");
47484
- reactorClientEventFunctions = makePHEventFunctions("reactorClient");
47485
- useReactorClientModule = reactorClientModuleEventFunctions.useValue;
47486
- setReactorClientModule = reactorClientModuleEventFunctions.setValue;
47487
- addReactorClientModuleEventHandler = reactorClientModuleEventFunctions.addEventHandler;
47488
- useReactorClient = reactorClientEventFunctions.useValue;
47489
- setReactorClient = reactorClientEventFunctions.setValue;
47490
- addReactorClientEventHandler = reactorClientEventFunctions.addEventHandler;
48063
+ EMPTY_PENDING = [];
48064
+ EMPTY_DISMISSED = [];
47491
48065
  documentEventFunctions = makePHEventFunctions("documentCache");
47492
48066
  useDocumentCache = documentEventFunctions.useValue;
47493
48067
  setDocumentCache = documentEventFunctions.setValue;
@@ -48535,6 +49109,14 @@ spurious results.`);
48535
49109
  ...phDocumentEditorConfigHooks,
48536
49110
  ...nonUserConfigHooks
48537
49111
  };
49112
+ reactorClientModuleEventFunctions = makePHEventFunctions("reactorClientModule");
49113
+ reactorClientEventFunctions = makePHEventFunctions("reactorClient");
49114
+ useReactorClientModule = reactorClientModuleEventFunctions.useValue;
49115
+ setReactorClientModule = reactorClientModuleEventFunctions.setValue;
49116
+ addReactorClientModuleEventHandler = reactorClientModuleEventFunctions.addEventHandler;
49117
+ useReactorClient = reactorClientEventFunctions.useValue;
49118
+ setReactorClient = reactorClientEventFunctions.setValue;
49119
+ addReactorClientEventHandler = reactorClientEventFunctions.addEventHandler;
48538
49120
  featuresEventFunctions = makePHEventFunctions("features");
48539
49121
  useFeatures = featuresEventFunctions.useValue;
48540
49122
  setFeatures = featuresEventFunctions.setValue;
@@ -48567,51 +49149,6 @@ spurious results.`);
48567
49149
  [SyncStatus.Error]: "ERROR"
48568
49150
  };
48569
49151
  lzString = __toESM2(require_lz_string(), 1);
48570
- DOMAIN_TYPE = [
48571
- { name: "name", type: "string" },
48572
- { name: "version", type: "string" },
48573
- { name: "chainId", type: "uint256" },
48574
- { name: "verifyingContract", type: "address" }
48575
- ];
48576
- VERIFIABLE_CREDENTIAL_EIP712_TYPE = [
48577
- { name: "@context", type: "string[]" },
48578
- { name: "type", type: "string[]" },
48579
- { name: "id", type: "string" },
48580
- { name: "issuer", type: "Issuer" },
48581
- { name: "credentialSubject", type: "CredentialSubject" },
48582
- { name: "credentialSchema", type: "CredentialSchema" },
48583
- { name: "issuanceDate", type: "string" },
48584
- { name: "expirationDate", type: "string" }
48585
- ];
48586
- CREDENTIAL_SCHEMA_EIP712_TYPE = [
48587
- { name: "id", type: "string" },
48588
- { name: "type", type: "string" }
48589
- ];
48590
- CREDENTIAL_SUBJECT_TYPE = [
48591
- { name: "app", type: "string" },
48592
- { name: "id", type: "string" },
48593
- { name: "name", type: "string" }
48594
- ];
48595
- ISSUER_TYPE = [
48596
- { name: "id", type: "string" },
48597
- { name: "ethereumAddress", type: "string" }
48598
- ];
48599
- CREDENTIAL_TYPES = {
48600
- EIP712Domain: DOMAIN_TYPE,
48601
- VerifiableCredential: VERIFIABLE_CREDENTIAL_EIP712_TYPE,
48602
- CredentialSchema: CREDENTIAL_SCHEMA_EIP712_TYPE,
48603
- CredentialSubject: CREDENTIAL_SUBJECT_TYPE,
48604
- Issuer: ISSUER_TYPE
48605
- };
48606
- ({
48607
- useValue: useLoading,
48608
- setValue: setLoading,
48609
- addEventHandler: addLoadingEventHandler
48610
- } = makePHEventFunctions("loading"));
48611
- renownEventFunctions = makePHEventFunctions("renown");
48612
- useRenown = renownEventFunctions.useValue;
48613
- setRenown = renownEventFunctions.setValue;
48614
- addRenownEventHandler = renownEventFunctions.addEventHandler;
48615
49152
  store = {
48616
49153
  get: function(key) {
48617
49154
  const value = localStorage.getItem(key);
@@ -48784,7 +49321,7 @@ spurious results.`);
48784
49321
  1541459225,
48785
49322
  327033209
48786
49323
  ]);
48787
- U32_MASK64 = /* @__PURE__ */ BigInt(4294967295);
49324
+ U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);
48788
49325
  _32n = /* @__PURE__ */ BigInt(32);
48789
49326
  SHA256_K = /* @__PURE__ */ Uint32Array.from([
48790
49327
  1116352408,
@@ -49334,7 +49871,7 @@ spurious results.`);
49334
49871
  this.iHash.update(pad);
49335
49872
  this.oHash = hash.create();
49336
49873
  for (let i = 0;i < pad.length; i++)
49337
- pad[i] ^= 106;
49874
+ pad[i] ^= 54 ^ 92;
49338
49875
  this.oHash.update(pad);
49339
49876
  clean(pad);
49340
49877
  }
@@ -49599,11 +50136,11 @@ spurious results.`);
49599
50136
  RIPEMD160 = class RIPEMD160 extends HashMD {
49600
50137
  constructor() {
49601
50138
  super(64, 20, 8, true);
49602
- this.h0 = 1732584193;
49603
- this.h1 = -271733879;
49604
- this.h2 = -1732584194;
49605
- this.h3 = 271733878;
49606
- this.h4 = -1009589776;
50139
+ this.h0 = 1732584193 | 0;
50140
+ this.h1 = 4023233417 | 0;
50141
+ this.h2 = 2562383102 | 0;
50142
+ this.h3 = 271733878 | 0;
50143
+ this.h4 = 3285377520 | 0;
49607
50144
  }
49608
50145
  get() {
49609
50146
  const { h0, h1, h2, h3, h4 } = this;
@@ -49781,7 +50318,7 @@ spurious results.`);
49781
50318
  return to;
49782
50319
  }
49783
50320
  };
49784
- keccak_256 = /* @__PURE__ */ (() => gen(1, 136, 32))();
50321
+ keccak_256 = /* @__PURE__ */ (() => gen(1, 136, 256 / 8))();
49785
50322
  import_canonicalize = __toESM2(require_canonicalize(), 1);
49786
50323
  ID_CHAR = `(?:[a-zA-Z0-9._-]|${PCT_ENCODED})`;
49787
50324
  METHOD_ID = `((?:${ID_CHAR}*:)*(${ID_CHAR}+))`;
@@ -54632,72 +55169,63 @@ spurious results.`);
54632
55169
  this.name = "ConflictError";
54633
55170
  }
54634
55171
  };
54635
- styles = {
55172
+ Slot = forwardRef(({ children, ...props }, ref) => {
55173
+ const child = Children.only(children);
55174
+ if (!isValidElement(child)) {
55175
+ return null;
55176
+ }
55177
+ const childElement = child;
55178
+ const mergedProps = mergeProps(props, childElement.props);
55179
+ if (ref) {
55180
+ mergedProps.ref = ref;
55181
+ }
55182
+ return cloneElement(childElement, mergedProps);
55183
+ });
55184
+ Slot.displayName = "Slot";
55185
+ lightStyles = {
54636
55186
  trigger: {
54637
- display: "flex",
54638
- alignItems: "center",
54639
- justifyContent: "center",
54640
- padding: 0,
54641
- border: "none",
54642
- background: "transparent",
54643
- cursor: "pointer"
54644
- },
54645
- popoverBase: {
54646
- position: "absolute",
54647
- left: 0,
54648
- borderRadius: "8px",
54649
- width: "208px",
54650
- zIndex: 1000
54651
- },
54652
- popoverLight: {
54653
- backgroundColor: "white",
54654
- boxShadow: "0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)"
55187
+ backgroundColor: "#ffffff",
55188
+ borderWidth: "1px",
55189
+ borderStyle: "solid",
55190
+ borderColor: "#d1d5db",
55191
+ color: "#111827"
54655
55192
  },
54656
- popoverDark: {
55193
+ triggerHover: {
55194
+ backgroundColor: "#ecf3f8",
55195
+ borderColor: "#9ca3af"
55196
+ }
55197
+ };
55198
+ darkStyles = {
55199
+ trigger: {
54657
55200
  backgroundColor: "#1f2937",
54658
- boxShadow: "0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.2)"
54659
- },
54660
- popoverContent: {
54661
- padding: "16px"
55201
+ borderWidth: "1px",
55202
+ borderStyle: "solid",
55203
+ borderColor: "#4b5563",
55204
+ color: "#ecf3f8"
54662
55205
  },
54663
- logoContainer: {
54664
- display: "flex",
54665
- justifyContent: "center",
54666
- height: "22px",
54667
- width: "83px",
54668
- margin: "0 auto 16px",
54669
- overflow: "hidden"
55206
+ triggerHover: {
55207
+ backgroundColor: "#374151",
55208
+ borderColor: "#6b7280"
55209
+ }
55210
+ };
55211
+ styles = {
55212
+ wrapper: {
55213
+ position: "relative",
55214
+ display: "inline-block"
54670
55215
  },
54671
- connectButtonBase: {
55216
+ trigger: {
54672
55217
  display: "flex",
54673
55218
  alignItems: "center",
54674
55219
  justifyContent: "center",
54675
- width: "100%",
54676
- height: "28px",
55220
+ gap: "8px",
55221
+ padding: "8px 32px",
54677
55222
  borderRadius: "8px",
54678
- backgroundColor: "transparent",
54679
- fontSize: "14px",
54680
55223
  cursor: "pointer",
54681
- marginTop: "16px"
54682
- },
54683
- connectButtonLight: {
54684
- border: "1px solid #d1d5db",
54685
- color: "#111827"
54686
- },
54687
- connectButtonDark: {
54688
- border: "1px solid #4b5563",
54689
- color: "#f9fafb"
54690
- },
54691
- wrapper: {
54692
- position: "relative",
54693
- display: "inline-block"
54694
- },
54695
- triggerImageLight: {
54696
- display: "block"
54697
- },
54698
- triggerImageDark: {
54699
- display: "block",
54700
- filter: "invert(1)"
55224
+ fontSize: "14px",
55225
+ fontWeight: 500,
55226
+ fontFamily: "inherit",
55227
+ lineHeight: "20px",
55228
+ transition: "background-color 150ms, border-color 150ms"
54701
55229
  }
54702
55230
  };
54703
55231
  styles2 = {
@@ -54708,56 +55236,89 @@ spurious results.`);
54708
55236
  trigger: {
54709
55237
  display: "flex",
54710
55238
  alignItems: "center",
54711
- justifyContent: "center",
54712
- padding: 0,
54713
- border: "none",
54714
- background: "transparent",
55239
+ gap: "8px",
55240
+ padding: "6px 12px",
55241
+ borderWidth: "1px",
55242
+ borderStyle: "solid",
55243
+ borderColor: "#e5e7eb",
55244
+ backgroundColor: "#ffffff",
54715
55245
  cursor: "pointer",
54716
- borderRadius: "50%",
54717
- overflow: "hidden"
55246
+ borderRadius: "8px",
55247
+ fontSize: "12px",
55248
+ fontWeight: 500,
55249
+ fontFamily: "inherit",
55250
+ color: "#111827",
55251
+ transition: "background-color 150ms, border-color 150ms"
55252
+ },
55253
+ triggerHover: {
55254
+ backgroundColor: "#f9fafb",
55255
+ borderColor: "#9ca3af"
54718
55256
  },
54719
55257
  avatar: {
54720
- width: "40px",
54721
- height: "40px",
55258
+ width: "28px",
55259
+ height: "28px",
54722
55260
  borderRadius: "50%",
54723
- objectFit: "cover"
55261
+ objectFit: "cover",
55262
+ flexShrink: 0
54724
55263
  },
54725
55264
  avatarPlaceholder: {
54726
- width: "40px",
54727
- height: "40px",
55265
+ width: "28px",
55266
+ height: "28px",
54728
55267
  borderRadius: "50%",
54729
- backgroundColor: "#e5e7eb",
55268
+ background: "linear-gradient(135deg, #8b5cf6, #3b82f6)",
54730
55269
  display: "flex",
54731
55270
  alignItems: "center",
54732
- justifyContent: "center"
55271
+ justifyContent: "center",
55272
+ flexShrink: 0
55273
+ },
55274
+ avatarInitial: {
55275
+ fontSize: "12px",
55276
+ fontWeight: 700,
55277
+ color: "#ffffff",
55278
+ lineHeight: 1
55279
+ },
55280
+ displayName: {
55281
+ maxWidth: "120px",
55282
+ overflow: "hidden",
55283
+ textOverflow: "ellipsis",
55284
+ whiteSpace: "nowrap"
55285
+ },
55286
+ chevron: {
55287
+ flexShrink: 0,
55288
+ transition: "transform 150ms",
55289
+ color: "#6b7280"
55290
+ },
55291
+ chevronOpen: {
55292
+ transform: "rotate(180deg)"
54733
55293
  },
54734
55294
  popoverBase: {
54735
55295
  position: "absolute",
54736
- left: 0,
54737
- backgroundColor: "white",
55296
+ right: 0,
55297
+ backgroundColor: "#ffffff",
54738
55298
  borderRadius: "8px",
54739
- boxShadow: "0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)",
54740
- width: "208px",
55299
+ boxShadow: "0 4px 12px rgba(0, 0, 0, 0.12), 0 1px 3px rgba(0, 0, 0, 0.08)",
55300
+ width: "100%",
54741
55301
  zIndex: 1000,
54742
- color: "#111827"
55302
+ color: "#111827",
55303
+ borderWidth: "1px",
55304
+ borderStyle: "solid",
55305
+ borderColor: "#e5e7eb",
55306
+ overflow: "hidden"
54743
55307
  },
54744
- section: {
54745
- padding: "8px 12px",
55308
+ header: {
55309
+ padding: "12px 16px",
54746
55310
  borderBottom: "1px solid #e5e7eb"
54747
55311
  },
54748
- sectionLast: {
54749
- padding: "8px 12px",
54750
- borderBottom: "none"
54751
- },
54752
- username: {
55312
+ headerUsername: {
54753
55313
  fontSize: "14px",
54754
- fontWeight: 500,
54755
- color: "#111827"
55314
+ fontWeight: 600,
55315
+ color: "#111827",
55316
+ margin: 0
54756
55317
  },
54757
55318
  addressRow: {
54758
55319
  display: "flex",
54759
55320
  alignItems: "center",
54760
- gap: "8px",
55321
+ gap: "4px",
54761
55322
  marginTop: "4px"
54762
55323
  },
54763
55324
  addressButton: {
@@ -54766,19 +55327,21 @@ spurious results.`);
54766
55327
  gap: "4px",
54767
55328
  padding: 0,
54768
55329
  border: "none",
54769
- background: "transparent",
55330
+ backgroundColor: "transparent",
54770
55331
  cursor: "pointer",
54771
55332
  fontSize: "12px",
54772
- color: "#111827",
55333
+ color: "#6b7280",
55334
+ fontFamily: "inherit",
54773
55335
  position: "relative",
54774
55336
  width: "100%"
54775
55337
  },
54776
55338
  copiedText: {
54777
55339
  fontSize: "12px",
54778
- color: "#111827",
55340
+ color: "#059669",
54779
55341
  position: "absolute",
54780
55342
  left: 0,
54781
- transition: "opacity 150ms"
55343
+ transition: "opacity 150ms",
55344
+ fontWeight: 500
54782
55345
  },
54783
55346
  addressText: {
54784
55347
  display: "flex",
@@ -54786,21 +55349,35 @@ spurious results.`);
54786
55349
  gap: "4px",
54787
55350
  transition: "opacity 150ms"
54788
55351
  },
55352
+ menuSection: {
55353
+ padding: "4px 0"
55354
+ },
54789
55355
  menuItem: {
54790
55356
  display: "flex",
54791
55357
  alignItems: "center",
54792
55358
  gap: "8px",
54793
55359
  width: "100%",
54794
- padding: 0,
55360
+ padding: "8px 16px",
54795
55361
  border: "none",
54796
- background: "transparent",
55362
+ backgroundColor: "transparent",
54797
55363
  cursor: "pointer",
54798
55364
  fontSize: "14px",
54799
- color: "#111827",
54800
- textDecoration: "none"
55365
+ color: "#374151",
55366
+ textDecoration: "none",
55367
+ fontFamily: "inherit",
55368
+ transition: "background-color 150ms"
55369
+ },
55370
+ menuItemHover: {
55371
+ backgroundColor: "#f3f4f6"
54801
55372
  },
54802
55373
  disconnectItem: {
54803
- color: "#7f1d1d"
55374
+ color: "#dc2626"
55375
+ },
55376
+ separator: {
55377
+ height: "1px",
55378
+ backgroundColor: "#e5e7eb",
55379
+ margin: 0,
55380
+ border: "none"
54804
55381
  }
54805
55382
  };
54806
55383
  });
@@ -65726,7 +66303,7 @@ var init_common2 = __esm(() => {
65726
66303
  });
65727
66304
 
65728
66305
  // ../../packages/renown/dist/src/common.js
65729
- class Renown2 {
66306
+ class Renown3 {
65730
66307
  #baseUrl;
65731
66308
  #store;
65732
66309
  #eventEmitter;
@@ -65976,7 +66553,7 @@ class BaseRenownBuilder2 {
65976
66553
  const storage = this.#storage ?? new RenownMemoryStorage2;
65977
66554
  const eventEmitter = this.#eventEmitter ?? new MemoryEventEmitter2;
65978
66555
  const baseUrl = this.#baseUrl ?? DEFAULT_RENOWN_URL2;
65979
- const renown = new Renown2(storage, eventEmitter, crypto4, this.#appName, baseUrl, this.#profileFetcher ?? fetchRenownProfile2);
66556
+ const renown = new Renown3(storage, eventEmitter, crypto4, this.#appName, baseUrl, this.#profileFetcher ?? fetchRenownProfile2);
65980
66557
  if (renown.user) {
65981
66558
  try {
65982
66559
  await renown.login(renown.user.did);
@@ -79602,7 +80179,7 @@ var init_dist2 = __esm(() => {
79602
80179
 
79603
80180
  // src/utils/reactor.ts
79604
80181
  import { PGlite as PGlite2 } from "@electric-sql/pglite";
79605
- async function createBrowserReactor(documentModelModules, upgradeManifests, renown) {
80182
+ async function createBrowserReactor(documentModelModules, upgradeManifests, renown, documentModelLoader) {
79606
80183
  const signerConfig = {
79607
80184
  signer: renown.signer,
79608
80185
  verifier: createSignatureVerifier()
@@ -79620,6 +80197,9 @@ async function createBrowserReactor(documentModelModules, upgradeManifests, reno
79620
80197
  const builder = new ReactorClientBuilder().withLogger(logger7).withSigner(signerConfig).withReactorBuilder(new ReactorBuilder().withDocumentModels(documentModelModules).withUpgradeManifests(upgradeManifests).withChannelScheme(ChannelScheme.CONNECT).withJwtHandler(jwtHandler).withKysely(new Kysely3({
79621
80198
  dialect: new PGliteDialect3(pg)
79622
80199
  })));
80200
+ if (documentModelLoader) {
80201
+ builder.withDocumentModelLoader(documentModelLoader);
80202
+ }
79623
80203
  const module = await builder.buildModule();
79624
80204
  return {
79625
80205
  ...module,
@@ -79649,6 +80229,41 @@ var init_reactor = __esm(() => {
79649
80229
  init_dist2();
79650
80230
  });
79651
80231
 
80232
+ // src/utils/registry-url.ts
80233
+ function loadPersistedState() {
80234
+ try {
80235
+ const raw = localStorage.getItem(STORAGE_KEY);
80236
+ if (raw)
80237
+ return JSON.parse(raw);
80238
+ } catch {}
80239
+ return null;
80240
+ }
80241
+ function getConfiguredRegistryUrls() {
80242
+ const registry = connectConfig.packagesRegistry;
80243
+ if (!registry)
80244
+ return [];
80245
+ return registry.split(",").map((u) => u.trim()).filter(Boolean);
80246
+ }
80247
+ function getDefaultRegistryCdnUrl() {
80248
+ const persisted = loadPersistedState();
80249
+ const urls = getConfiguredRegistryUrls();
80250
+ if (persisted) {
80251
+ if (persisted.selectedRegistryId === "custom") {
80252
+ if (persisted.customRegistryUrl)
80253
+ return persisted.customRegistryUrl;
80254
+ } else {
80255
+ const index = parseInt(persisted.selectedRegistryId.replace("registry-", ""), 10);
80256
+ if (!isNaN(index) && urls[index])
80257
+ return urls[index];
80258
+ }
80259
+ }
80260
+ return urls[0];
80261
+ }
80262
+ var STORAGE_KEY = "ph-connect-registry-selection";
80263
+ var init_registry_url = __esm(() => {
80264
+ init_connect_config();
80265
+ });
80266
+
79652
80267
  // src/utils/registerServiceWorker.ts
79653
80268
  class ServiceWorkerManager {
79654
80269
  ready = false;
@@ -79751,6 +80366,7 @@ var init_utils6 = __esm(() => {
79751
80366
  init_openUrl();
79752
80367
  init_package_json();
79753
80368
  init_reactor();
80369
+ init_registry_url();
79754
80370
  init_registerServiceWorker();
79755
80371
  });
79756
80372
  init_utils6();
@@ -79768,6 +80384,7 @@ export {
79768
80384
  getFileNodeOptions,
79769
80385
  getDrivePreservationStrategy,
79770
80386
  getDriveNodeOptions,
80387
+ getDefaultRegistryCdnUrl,
79771
80388
  getDefaultDrivesFromEnv,
79772
80389
  getBasePath,
79773
80390
  driveSections,