@calimero-network/mero-react 4.4.1 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -2,7 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
  import React__default, { CSSProperties, ReactNode } from 'react';
4
4
  import * as _calimero_network_mero_js from '@calimero-network/mero-js';
5
- import { MeroJs, TokenStore, SetMetadataRequest, AddGroupMembersRequest, CreateContextRequest, CreateGroupInNamespaceRequest, CreateNamespaceRequest, CreateNamespaceInvitationRequest, CreateNamespaceInvitationResponseData, CreateRecursiveInvitationResponseData, DeleteGroupRequest, DeleteNamespaceRequest, DetachContextFromGroupRequest, GroupContextEntry, GroupInfo, CreateGroupInvitationRequest, MetadataRecord, GroupUpgradeStatusResponseData, JoinGroupRequest, JoinNamespaceRequest, MigrationStatus, MigrationStatusRollup, MemberMigrationStatusEntry, MigrateMyEntriesSummary, Namespace, SubgroupEntry, NamespaceIdentity, RegisterGroupSigningKeyRequest, RemoveGroupMembersRequest, ReparentGroupRequest, ResyncContextRequest, RetryGroupUpgradeRequest, SetDefaultCapabilitiesRequest, SetSubgroupVisibilityRequest, SetTeeAdmissionPolicyRequest, SseEventData, SyncGroupRequest, UpdateGroupSettingsRequest, UpdateMemberRoleRequest, UpgradeGroupRequest, TokenData } from '@calimero-network/mero-js';
5
+ import { MeroJs, TokenStore, SetMetadataRequest, SseEventData, GroupMembershipEventData, AddGroupMembersRequest, CreateContextRequest, CreateGroupInNamespaceRequest, CreateNamespaceRequest, CreateNamespaceInvitationRequest, CreateNamespaceInvitationResponseData, CreateRecursiveInvitationResponseData, DeleteGroupRequest, DeleteNamespaceRequest, DetachContextFromGroupRequest, GroupUpgradeStatusResponseData, GroupContextEntry, GroupInfo, CreateGroupInvitationRequest, MetadataRecord, JoinGroupRequest, JoinNamespaceRequest, MigrationStatus, MigrationStatusRollup, MemberMigrationStatusEntry, MigrateMyEntriesSummary, Namespace, SubgroupEntry, NamespaceIdentity, RegisterGroupSigningKeyRequest, RemoveGroupMembersRequest, ReparentGroupRequest, ResyncContextRequest, RetryGroupUpgradeRequest, SetDefaultCapabilitiesRequest, SetSubgroupVisibilityRequest, SetTeeAdmissionPolicyRequest, SyncGroupRequest, UpdateGroupSettingsRequest, UpdateMemberRoleRequest, UpgradeGroupRequest, TokenData } from '@calimero-network/mero-js';
6
6
  export * from '@calimero-network/mero-js';
7
7
  export { CAPABILITIES, MetadataRecord, hasCap, withCap, withoutCap } from '@calimero-network/mero-js';
8
8
 
@@ -400,12 +400,20 @@ declare function useExecute(contextId: string | null, executorId: string | null)
400
400
  loading: boolean;
401
401
  error: Error | null;
402
402
  };
403
+ /** Event payload delivered to a `useSubscription` callback. */
404
+ type SubscriptionEventData = SseEventData | GroupMembershipEventData;
405
+ /** Ids to subscribe to. Either can be omitted, but not both. */
406
+ interface SubscriptionInput {
407
+ contextIds?: string[];
408
+ groupIds?: string[];
409
+ }
403
410
  /**
404
- * Subscribe to SSE events for context IDs.
411
+ * Subscribe to SSE events for context and/or group IDs.
405
412
  * StrictMode-safe: tracks the SseClient instance in a ref to avoid
406
413
  * double-connect on mount/unmount/remount cycles.
407
414
  */
408
- declare function useSubscription(contextIds: string[], callback: (event: SseEventData) => void): void;
415
+ declare function useSubscription(contextIds: string[], callback: (event: SubscriptionEventData) => void): void;
416
+ declare function useSubscription(input: SubscriptionInput, callback: (event: SubscriptionEventData) => void): void;
409
417
  /**
410
418
  * Fetch contexts for the current node, optionally filtered by application ID.
411
419
  */
@@ -633,6 +641,17 @@ declare function useUpgradeGroup(): {
633
641
  loading: boolean;
634
642
  error: Error | null;
635
643
  };
644
+ /**
645
+ * Install a registry package version onto the node — the discrete "Download"
646
+ * step an Updates flow runs before an `upgradeGroup`. Resolves the installed
647
+ * application id (`InstallApplicationResponseData`). Downloading does not by
648
+ * itself change what any group runs; pair it with a subsequent upgrade.
649
+ */
650
+ declare function useInstallFromRegistry(): {
651
+ installFromRegistry: (registryUrl: string, packageName: string, version: string) => Promise<_calimero_network_mero_js.InstallApplicationResponseData | null>;
652
+ loading: boolean;
653
+ error: Error | null;
654
+ };
636
655
  /**
637
656
  * Kick off a full state re-pull for a context — operator recovery for a
638
657
  * context stranded mid-sync. `force` re-pulls even when the node does not
@@ -722,6 +741,35 @@ declare function useLatestVersion(registryUrl?: string | null, packageName?: str
722
741
  error: Error | null;
723
742
  refetch: () => Promise<void>;
724
743
  };
744
+ /**
745
+ * What app version does this group run, and is there a downloaded-but-not-yet-
746
+ * applied update? Replaces the appKey-vs-installed-blob comparison apps
747
+ * otherwise hand-roll: `pendingApply` is true when the group's `appKey` (the
748
+ * blob it targets) is present, non-zero, and differs from the blob actually
749
+ * installed for its `targetApplicationId`. Deciding whether to render or gate on
750
+ * that status (admin-only actions, etc.) is the call site's job.
751
+ *
752
+ * Resolution stays cheap: the group's record comes from `listNamespaces()` when
753
+ * the id is a namespace, else from `getGroupInfo()`; `getApplication()` then
754
+ * reads the installed version and blob. `activeUpgrade` is returned only when it
755
+ * arrives for free on the group-info path (it is not fetched separately).
756
+ * Subscribes to `AppVersionChanged` and refetches, since any version flip in the
757
+ * workspace can make the rollup stale.
758
+ */
759
+ declare function useGroupAppVersion(groupId?: string): {
760
+ loading: boolean;
761
+ error: Error | null;
762
+ refetch: () => Promise<void>;
763
+ /** Semver of the application the group currently targets (`null` until loaded). */
764
+ version: string | null;
765
+ /** The group's `targetApplicationId`. */
766
+ applicationId: string | null;
767
+ /** The installed blob differs from the one the group targets (see hook doc). */
768
+ pendingApply: boolean;
769
+ upgradePolicy: string | null;
770
+ /** Only populated via the group-info path; `null` in the namespace path. */
771
+ activeUpgrade: GroupUpgradeStatusResponseData;
772
+ };
725
773
  /**
726
774
  * The caller's own identity-gated entries pending re-signature (skew #1).
727
775
  * `pending` is `pendingCount > 0` (from `count_my_pending`); `authorize()` runs
@@ -814,4 +862,4 @@ declare function clearContextIdentity(): void;
814
862
  */
815
863
  declare function clearAllStorage(): void;
816
864
 
817
- export { type AppContext, AppMode, type ApplicationContextRecord, CalimeroLogo, type CalimeroLogoProps, ConnectButton, type ConnectButtonProps, ConnectionType, type ContextDiscoveryOptions, type ContextDiscoveryState, type CustomConnectionConfig, DEFAULT_LOCAL_NODE_PORTS, type DiscoverLocalNodesOptions, type ExecutionResult, LoginModal, type LoginModalProps, MERO_CSS_VARS, MeroContext, type MeroContextValue, MeroProvider, type MeroProviderConfig, type MeroProviderProps, type MeroTheme, MigrationAdminPanel, type MigrationAdminPanelProps, MigrationPendingBanner, type MigrationPendingBannerProps, type ResolvedMeroTheme, type SetMetadataInput, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, clearTokenNodeUrl, cssVar, defaultMeroTheme, discoverLocalNodes, getApplicationId, getContextId, getContextIdentity, getNodeUrl, getTokenNodeUrl, localNodeUrl, localStorageTokenStorage, nodeEndpoint, probeNodeHealth, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, setTokenNodeUrl, themeToCssVars, useAddGroupMembers, useAppVersion, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useExecute, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useLatestVersion, useMemberMetadata, useMero, useMigrationStatus, useMyAuthoredMigration, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useRegisterGroupSigningKey, useRemoveGroupMembers, useReparentGroup, useResyncContext, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUpdateGroupSettings, useUpdateMemberRole, useUpgradeGroup };
865
+ export { type AppContext, AppMode, type ApplicationContextRecord, CalimeroLogo, type CalimeroLogoProps, ConnectButton, type ConnectButtonProps, ConnectionType, type ContextDiscoveryOptions, type ContextDiscoveryState, type CustomConnectionConfig, DEFAULT_LOCAL_NODE_PORTS, type DiscoverLocalNodesOptions, type ExecutionResult, LoginModal, type LoginModalProps, MERO_CSS_VARS, MeroContext, type MeroContextValue, MeroProvider, type MeroProviderConfig, type MeroProviderProps, type MeroTheme, MigrationAdminPanel, type MigrationAdminPanelProps, MigrationPendingBanner, type MigrationPendingBannerProps, type ResolvedMeroTheme, type SetMetadataInput, type SubscriptionEventData, type SubscriptionInput, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, clearTokenNodeUrl, cssVar, defaultMeroTheme, discoverLocalNodes, getApplicationId, getContextId, getContextIdentity, getNodeUrl, getTokenNodeUrl, localNodeUrl, localStorageTokenStorage, nodeEndpoint, probeNodeHealth, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, setTokenNodeUrl, themeToCssVars, useAddGroupMembers, useAppVersion, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useExecute, useGroupAppVersion, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useInstallFromRegistry, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useLatestVersion, useMemberMetadata, useMero, useMigrationStatus, useMyAuthoredMigration, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useRegisterGroupSigningKey, useRemoveGroupMembers, useReparentGroup, useResyncContext, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUpdateGroupSettings, useUpdateMemberRole, useUpgradeGroup };
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
  import React__default, { CSSProperties, ReactNode } from 'react';
4
4
  import * as _calimero_network_mero_js from '@calimero-network/mero-js';
5
- import { MeroJs, TokenStore, SetMetadataRequest, AddGroupMembersRequest, CreateContextRequest, CreateGroupInNamespaceRequest, CreateNamespaceRequest, CreateNamespaceInvitationRequest, CreateNamespaceInvitationResponseData, CreateRecursiveInvitationResponseData, DeleteGroupRequest, DeleteNamespaceRequest, DetachContextFromGroupRequest, GroupContextEntry, GroupInfo, CreateGroupInvitationRequest, MetadataRecord, GroupUpgradeStatusResponseData, JoinGroupRequest, JoinNamespaceRequest, MigrationStatus, MigrationStatusRollup, MemberMigrationStatusEntry, MigrateMyEntriesSummary, Namespace, SubgroupEntry, NamespaceIdentity, RegisterGroupSigningKeyRequest, RemoveGroupMembersRequest, ReparentGroupRequest, ResyncContextRequest, RetryGroupUpgradeRequest, SetDefaultCapabilitiesRequest, SetSubgroupVisibilityRequest, SetTeeAdmissionPolicyRequest, SseEventData, SyncGroupRequest, UpdateGroupSettingsRequest, UpdateMemberRoleRequest, UpgradeGroupRequest, TokenData } from '@calimero-network/mero-js';
5
+ import { MeroJs, TokenStore, SetMetadataRequest, SseEventData, GroupMembershipEventData, AddGroupMembersRequest, CreateContextRequest, CreateGroupInNamespaceRequest, CreateNamespaceRequest, CreateNamespaceInvitationRequest, CreateNamespaceInvitationResponseData, CreateRecursiveInvitationResponseData, DeleteGroupRequest, DeleteNamespaceRequest, DetachContextFromGroupRequest, GroupUpgradeStatusResponseData, GroupContextEntry, GroupInfo, CreateGroupInvitationRequest, MetadataRecord, JoinGroupRequest, JoinNamespaceRequest, MigrationStatus, MigrationStatusRollup, MemberMigrationStatusEntry, MigrateMyEntriesSummary, Namespace, SubgroupEntry, NamespaceIdentity, RegisterGroupSigningKeyRequest, RemoveGroupMembersRequest, ReparentGroupRequest, ResyncContextRequest, RetryGroupUpgradeRequest, SetDefaultCapabilitiesRequest, SetSubgroupVisibilityRequest, SetTeeAdmissionPolicyRequest, SyncGroupRequest, UpdateGroupSettingsRequest, UpdateMemberRoleRequest, UpgradeGroupRequest, TokenData } from '@calimero-network/mero-js';
6
6
  export * from '@calimero-network/mero-js';
7
7
  export { CAPABILITIES, MetadataRecord, hasCap, withCap, withoutCap } from '@calimero-network/mero-js';
8
8
 
@@ -400,12 +400,20 @@ declare function useExecute(contextId: string | null, executorId: string | null)
400
400
  loading: boolean;
401
401
  error: Error | null;
402
402
  };
403
+ /** Event payload delivered to a `useSubscription` callback. */
404
+ type SubscriptionEventData = SseEventData | GroupMembershipEventData;
405
+ /** Ids to subscribe to. Either can be omitted, but not both. */
406
+ interface SubscriptionInput {
407
+ contextIds?: string[];
408
+ groupIds?: string[];
409
+ }
403
410
  /**
404
- * Subscribe to SSE events for context IDs.
411
+ * Subscribe to SSE events for context and/or group IDs.
405
412
  * StrictMode-safe: tracks the SseClient instance in a ref to avoid
406
413
  * double-connect on mount/unmount/remount cycles.
407
414
  */
408
- declare function useSubscription(contextIds: string[], callback: (event: SseEventData) => void): void;
415
+ declare function useSubscription(contextIds: string[], callback: (event: SubscriptionEventData) => void): void;
416
+ declare function useSubscription(input: SubscriptionInput, callback: (event: SubscriptionEventData) => void): void;
409
417
  /**
410
418
  * Fetch contexts for the current node, optionally filtered by application ID.
411
419
  */
@@ -633,6 +641,17 @@ declare function useUpgradeGroup(): {
633
641
  loading: boolean;
634
642
  error: Error | null;
635
643
  };
644
+ /**
645
+ * Install a registry package version onto the node — the discrete "Download"
646
+ * step an Updates flow runs before an `upgradeGroup`. Resolves the installed
647
+ * application id (`InstallApplicationResponseData`). Downloading does not by
648
+ * itself change what any group runs; pair it with a subsequent upgrade.
649
+ */
650
+ declare function useInstallFromRegistry(): {
651
+ installFromRegistry: (registryUrl: string, packageName: string, version: string) => Promise<_calimero_network_mero_js.InstallApplicationResponseData | null>;
652
+ loading: boolean;
653
+ error: Error | null;
654
+ };
636
655
  /**
637
656
  * Kick off a full state re-pull for a context — operator recovery for a
638
657
  * context stranded mid-sync. `force` re-pulls even when the node does not
@@ -722,6 +741,35 @@ declare function useLatestVersion(registryUrl?: string | null, packageName?: str
722
741
  error: Error | null;
723
742
  refetch: () => Promise<void>;
724
743
  };
744
+ /**
745
+ * What app version does this group run, and is there a downloaded-but-not-yet-
746
+ * applied update? Replaces the appKey-vs-installed-blob comparison apps
747
+ * otherwise hand-roll: `pendingApply` is true when the group's `appKey` (the
748
+ * blob it targets) is present, non-zero, and differs from the blob actually
749
+ * installed for its `targetApplicationId`. Deciding whether to render or gate on
750
+ * that status (admin-only actions, etc.) is the call site's job.
751
+ *
752
+ * Resolution stays cheap: the group's record comes from `listNamespaces()` when
753
+ * the id is a namespace, else from `getGroupInfo()`; `getApplication()` then
754
+ * reads the installed version and blob. `activeUpgrade` is returned only when it
755
+ * arrives for free on the group-info path (it is not fetched separately).
756
+ * Subscribes to `AppVersionChanged` and refetches, since any version flip in the
757
+ * workspace can make the rollup stale.
758
+ */
759
+ declare function useGroupAppVersion(groupId?: string): {
760
+ loading: boolean;
761
+ error: Error | null;
762
+ refetch: () => Promise<void>;
763
+ /** Semver of the application the group currently targets (`null` until loaded). */
764
+ version: string | null;
765
+ /** The group's `targetApplicationId`. */
766
+ applicationId: string | null;
767
+ /** The installed blob differs from the one the group targets (see hook doc). */
768
+ pendingApply: boolean;
769
+ upgradePolicy: string | null;
770
+ /** Only populated via the group-info path; `null` in the namespace path. */
771
+ activeUpgrade: GroupUpgradeStatusResponseData;
772
+ };
725
773
  /**
726
774
  * The caller's own identity-gated entries pending re-signature (skew #1).
727
775
  * `pending` is `pendingCount > 0` (from `count_my_pending`); `authorize()` runs
@@ -814,4 +862,4 @@ declare function clearContextIdentity(): void;
814
862
  */
815
863
  declare function clearAllStorage(): void;
816
864
 
817
- export { type AppContext, AppMode, type ApplicationContextRecord, CalimeroLogo, type CalimeroLogoProps, ConnectButton, type ConnectButtonProps, ConnectionType, type ContextDiscoveryOptions, type ContextDiscoveryState, type CustomConnectionConfig, DEFAULT_LOCAL_NODE_PORTS, type DiscoverLocalNodesOptions, type ExecutionResult, LoginModal, type LoginModalProps, MERO_CSS_VARS, MeroContext, type MeroContextValue, MeroProvider, type MeroProviderConfig, type MeroProviderProps, type MeroTheme, MigrationAdminPanel, type MigrationAdminPanelProps, MigrationPendingBanner, type MigrationPendingBannerProps, type ResolvedMeroTheme, type SetMetadataInput, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, clearTokenNodeUrl, cssVar, defaultMeroTheme, discoverLocalNodes, getApplicationId, getContextId, getContextIdentity, getNodeUrl, getTokenNodeUrl, localNodeUrl, localStorageTokenStorage, nodeEndpoint, probeNodeHealth, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, setTokenNodeUrl, themeToCssVars, useAddGroupMembers, useAppVersion, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useExecute, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useLatestVersion, useMemberMetadata, useMero, useMigrationStatus, useMyAuthoredMigration, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useRegisterGroupSigningKey, useRemoveGroupMembers, useReparentGroup, useResyncContext, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUpdateGroupSettings, useUpdateMemberRole, useUpgradeGroup };
865
+ export { type AppContext, AppMode, type ApplicationContextRecord, CalimeroLogo, type CalimeroLogoProps, ConnectButton, type ConnectButtonProps, ConnectionType, type ContextDiscoveryOptions, type ContextDiscoveryState, type CustomConnectionConfig, DEFAULT_LOCAL_NODE_PORTS, type DiscoverLocalNodesOptions, type ExecutionResult, LoginModal, type LoginModalProps, MERO_CSS_VARS, MeroContext, type MeroContextValue, MeroProvider, type MeroProviderConfig, type MeroProviderProps, type MeroTheme, MigrationAdminPanel, type MigrationAdminPanelProps, MigrationPendingBanner, type MigrationPendingBannerProps, type ResolvedMeroTheme, type SetMetadataInput, type SubscriptionEventData, type SubscriptionInput, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, clearTokenNodeUrl, cssVar, defaultMeroTheme, discoverLocalNodes, getApplicationId, getContextId, getContextIdentity, getNodeUrl, getTokenNodeUrl, localNodeUrl, localStorageTokenStorage, nodeEndpoint, probeNodeHealth, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, setTokenNodeUrl, themeToCssVars, useAddGroupMembers, useAppVersion, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useExecute, useGroupAppVersion, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useInstallFromRegistry, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useLatestVersion, useMemberMetadata, useMero, useMigrationStatus, useMyAuthoredMigration, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useRegisterGroupSigningKey, useRemoveGroupMembers, useReparentGroup, useResyncContext, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUpdateGroupSettings, useUpdateMemberRole, useUpgradeGroup };
package/dist/index.js CHANGED
@@ -1296,6 +1296,29 @@ function ConnectButton({
1296
1296
  }
1297
1297
  );
1298
1298
  }
1299
+
1300
+ // src/utils/base58.ts
1301
+ var ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
1302
+ function base58ToHex(input) {
1303
+ const bytes = [];
1304
+ for (const char of input) {
1305
+ let carry = ALPHABET.indexOf(char);
1306
+ if (carry === -1) throw new Error(`invalid base58 character: ${char}`);
1307
+ for (let i = 0; i < bytes.length; i++) {
1308
+ carry += bytes[i] * 58;
1309
+ bytes[i] = carry & 255;
1310
+ carry >>= 8;
1311
+ }
1312
+ while (carry > 0) {
1313
+ bytes.push(carry & 255);
1314
+ carry >>= 8;
1315
+ }
1316
+ }
1317
+ for (let k = 0; k < input.length && input[k] === "1"; k++) bytes.push(0);
1318
+ return bytes.reverse().map((b) => b.toString(16).padStart(2, "0")).join("");
1319
+ }
1320
+
1321
+ // src/hooks/index.ts
1299
1322
  function toError(err) {
1300
1323
  return err instanceof Error ? err : new Error(String(err));
1301
1324
  }
@@ -1447,13 +1470,15 @@ function useExecute(contextId, executorId) {
1447
1470
  );
1448
1471
  return { execute, loading, error };
1449
1472
  }
1450
- function useSubscription(contextIds, callback) {
1473
+ function useSubscription(input, callback) {
1451
1474
  const { mero } = useMero();
1452
1475
  const callbackRef = useRef(callback);
1453
1476
  callbackRef.current = callback;
1477
+ const { contextIds = [], groupIds = [] } = Array.isArray(input) ? { contextIds: input, groupIds: [] } : input;
1454
1478
  const contextIdsKey = JSON.stringify(contextIds);
1479
+ const groupIdsKey = JSON.stringify(groupIds);
1455
1480
  useEffect(() => {
1456
- if (!mero || contextIds.length === 0) return;
1481
+ if (!mero || contextIds.length === 0 && groupIds.length === 0) return;
1457
1482
  const sse = mero.events;
1458
1483
  const handler = (event) => {
1459
1484
  callbackRef.current(event);
@@ -1461,12 +1486,12 @@ function useSubscription(contextIds, callback) {
1461
1486
  sse.on("event", handler);
1462
1487
  sse.connect().catch(() => {
1463
1488
  });
1464
- sse.subscribe(contextIds).catch(() => {
1489
+ sse.subscribe({ contextIds, groupIds }).catch(() => {
1465
1490
  });
1466
1491
  return () => {
1467
1492
  sse.off("event", handler);
1468
1493
  };
1469
- }, [mero, contextIdsKey]);
1494
+ }, [mero, contextIdsKey, groupIdsKey]);
1470
1495
  }
1471
1496
  function useContexts(applicationId) {
1472
1497
  const { mero } = useMero();
@@ -2117,6 +2142,18 @@ function useUpgradeGroup() {
2117
2142
  );
2118
2143
  return { upgradeGroup, loading, error };
2119
2144
  }
2145
+ function useInstallFromRegistry() {
2146
+ const { mero } = useMero();
2147
+ const { loading, error, run } = useAsyncMutation();
2148
+ const installFromRegistry = useCallback(
2149
+ async (registryUrl, packageName, version) => {
2150
+ if (!mero) return null;
2151
+ return run(() => mero.admin.installFromRegistry(registryUrl, packageName, version));
2152
+ },
2153
+ [mero, run]
2154
+ );
2155
+ return { installFromRegistry, loading, error };
2156
+ }
2120
2157
  function useResyncContext() {
2121
2158
  const { mero } = useMero();
2122
2159
  const { loading, error, run } = useAsyncMutation();
@@ -2393,6 +2430,96 @@ function useLatestVersion(registryUrl, packageName, currentVersion) {
2393
2430
  const updateAvailable = latestVersion != null && currentVersion != null && compareSemver(latestVersion, currentVersion) > 0;
2394
2431
  return { versions, latestVersion, currentVersion, updateAvailable, loading, error, refetch };
2395
2432
  }
2433
+ var EMPTY_GROUP_APP_VERSION = {
2434
+ version: null,
2435
+ applicationId: null,
2436
+ pendingApply: false,
2437
+ upgradePolicy: null,
2438
+ activeUpgrade: null
2439
+ };
2440
+ function isZeroAppKey(appKey) {
2441
+ return !appKey || /^0+$/.test(appKey);
2442
+ }
2443
+ function useGroupAppVersion(groupId) {
2444
+ const { mero } = useMero();
2445
+ const [data, setData] = useState(EMPTY_GROUP_APP_VERSION);
2446
+ const [loading, setLoading] = useState(false);
2447
+ const [error, setError] = useState(null);
2448
+ const mountedRef = useMountedRef();
2449
+ const reqRef = useRef(0);
2450
+ const refetch = useCallback(async () => {
2451
+ const seq = ++reqRef.current;
2452
+ if (!mero || !groupId) {
2453
+ if (mountedRef.current) {
2454
+ setData(EMPTY_GROUP_APP_VERSION);
2455
+ setError(null);
2456
+ setLoading(false);
2457
+ }
2458
+ return;
2459
+ }
2460
+ if (mountedRef.current) {
2461
+ setLoading(true);
2462
+ setError(null);
2463
+ }
2464
+ try {
2465
+ const namespaces = await mero.admin.listNamespaces();
2466
+ const namespace = namespaces.find((entry) => entry.namespaceId === groupId);
2467
+ let appKey;
2468
+ let applicationId;
2469
+ let upgradePolicy;
2470
+ let activeUpgrade = null;
2471
+ if (namespace) {
2472
+ appKey = namespace.appKey;
2473
+ applicationId = namespace.targetApplicationId;
2474
+ upgradePolicy = namespace.upgradePolicy;
2475
+ } else {
2476
+ const info = await mero.admin.getGroupInfo(groupId);
2477
+ appKey = info.appKey;
2478
+ applicationId = info.targetApplicationId;
2479
+ upgradePolicy = info.upgradePolicy;
2480
+ activeUpgrade = info.activeUpgrade ?? null;
2481
+ }
2482
+ let version = null;
2483
+ let pendingApply = false;
2484
+ if (applicationId) {
2485
+ const { application } = await mero.admin.getApplication(applicationId);
2486
+ version = application?.version ?? null;
2487
+ if (application && !isZeroAppKey(appKey)) {
2488
+ const installedHex = base58ToHex(application.blob.bytecode).toLowerCase();
2489
+ pendingApply = appKey.toLowerCase() !== installedHex;
2490
+ }
2491
+ }
2492
+ if (mountedRef.current && seq === reqRef.current) {
2493
+ setData({ version, applicationId, pendingApply, upgradePolicy, activeUpgrade });
2494
+ }
2495
+ } catch (err) {
2496
+ const errorValue = toError(err);
2497
+ if (mountedRef.current && seq === reqRef.current) {
2498
+ setError(errorValue);
2499
+ }
2500
+ } finally {
2501
+ if (mountedRef.current && seq === reqRef.current) {
2502
+ setLoading(false);
2503
+ }
2504
+ }
2505
+ }, [groupId, mero, mountedRef]);
2506
+ useEffect(() => {
2507
+ reqRef.current += 1;
2508
+ setData(EMPTY_GROUP_APP_VERSION);
2509
+ setError(null);
2510
+ }, [groupId]);
2511
+ useEffect(() => {
2512
+ void refetch();
2513
+ }, [refetch]);
2514
+ useEffect(() => {
2515
+ if (!mero?.events || !groupId) return;
2516
+ const off = mero.events.onAppVersionChanged(() => {
2517
+ if (mountedRef.current) void refetch();
2518
+ });
2519
+ return off;
2520
+ }, [mero, groupId, refetch, mountedRef]);
2521
+ return { ...data, loading, error, refetch };
2522
+ }
2396
2523
  function useMyAuthoredMigration(contextId) {
2397
2524
  const { mero } = useMero();
2398
2525
  const [summary, setSummary] = useState(null);
@@ -2534,6 +2661,6 @@ function MigrationAdminPanel({ namespaceId, pollIntervalMs, className }) {
2534
2661
  ] });
2535
2662
  }
2536
2663
 
2537
- export { AppMode, CalimeroLogo, ConnectButton, ConnectionType, DEFAULT_LOCAL_NODE_PORTS, LoginModal, MERO_CSS_VARS, MeroContext, MeroProvider, MigrationAdminPanel, MigrationPendingBanner, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, clearTokenNodeUrl, cssVar, defaultMeroTheme, discoverLocalNodes, getApplicationId, getContextId, getContextIdentity, getNodeUrl, getTokenNodeUrl, localNodeUrl, localStorageTokenStorage, nodeEndpoint, probeNodeHealth, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, setTokenNodeUrl, themeToCssVars, useAddGroupMembers, useAppVersion, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useExecute, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useLatestVersion, useMemberMetadata, useMero, useMigrationStatus, useMyAuthoredMigration, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useRegisterGroupSigningKey, useRemoveGroupMembers, useReparentGroup, useResyncContext, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUpdateGroupSettings, useUpdateMemberRole, useUpgradeGroup };
2664
+ export { AppMode, CalimeroLogo, ConnectButton, ConnectionType, DEFAULT_LOCAL_NODE_PORTS, LoginModal, MERO_CSS_VARS, MeroContext, MeroProvider, MigrationAdminPanel, MigrationPendingBanner, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, clearTokenNodeUrl, cssVar, defaultMeroTheme, discoverLocalNodes, getApplicationId, getContextId, getContextIdentity, getNodeUrl, getTokenNodeUrl, localNodeUrl, localStorageTokenStorage, nodeEndpoint, probeNodeHealth, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, setTokenNodeUrl, themeToCssVars, useAddGroupMembers, useAppVersion, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useExecute, useGroupAppVersion, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useInstallFromRegistry, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useLatestVersion, useMemberMetadata, useMero, useMigrationStatus, useMyAuthoredMigration, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useRegisterGroupSigningKey, useRemoveGroupMembers, useReparentGroup, useResyncContext, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUpdateGroupSettings, useUpdateMemberRole, useUpgradeGroup };
2538
2665
  //# sourceMappingURL=index.js.map
2539
2666
  //# sourceMappingURL=index.js.map