@calimero-network/mero-react 4.4.1 → 4.5.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, 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, SseEventData, 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
 
@@ -633,6 +633,17 @@ declare function useUpgradeGroup(): {
633
633
  loading: boolean;
634
634
  error: Error | null;
635
635
  };
636
+ /**
637
+ * Install a registry package version onto the node — the discrete "Download"
638
+ * step an Updates flow runs before an `upgradeGroup`. Resolves the installed
639
+ * application id (`InstallApplicationResponseData`). Downloading does not by
640
+ * itself change what any group runs; pair it with a subsequent upgrade.
641
+ */
642
+ declare function useInstallFromRegistry(): {
643
+ installFromRegistry: (registryUrl: string, packageName: string, version: string) => Promise<_calimero_network_mero_js.InstallApplicationResponseData | null>;
644
+ loading: boolean;
645
+ error: Error | null;
646
+ };
636
647
  /**
637
648
  * Kick off a full state re-pull for a context — operator recovery for a
638
649
  * context stranded mid-sync. `force` re-pulls even when the node does not
@@ -722,6 +733,35 @@ declare function useLatestVersion(registryUrl?: string | null, packageName?: str
722
733
  error: Error | null;
723
734
  refetch: () => Promise<void>;
724
735
  };
736
+ /**
737
+ * What app version does this group run, and is there a downloaded-but-not-yet-
738
+ * applied update? Replaces the appKey-vs-installed-blob comparison apps
739
+ * otherwise hand-roll: `pendingApply` is true when the group's `appKey` (the
740
+ * blob it targets) is present, non-zero, and differs from the blob actually
741
+ * installed for its `targetApplicationId`. Deciding whether to render or gate on
742
+ * that status (admin-only actions, etc.) is the call site's job.
743
+ *
744
+ * Resolution stays cheap: the group's record comes from `listNamespaces()` when
745
+ * the id is a namespace, else from `getGroupInfo()`; `getApplication()` then
746
+ * reads the installed version and blob. `activeUpgrade` is returned only when it
747
+ * arrives for free on the group-info path (it is not fetched separately).
748
+ * Subscribes to `AppVersionChanged` and refetches, since any version flip in the
749
+ * workspace can make the rollup stale.
750
+ */
751
+ declare function useGroupAppVersion(groupId?: string): {
752
+ loading: boolean;
753
+ error: Error | null;
754
+ refetch: () => Promise<void>;
755
+ /** Semver of the application the group currently targets (`null` until loaded). */
756
+ version: string | null;
757
+ /** The group's `targetApplicationId`. */
758
+ applicationId: string | null;
759
+ /** The installed blob differs from the one the group targets (see hook doc). */
760
+ pendingApply: boolean;
761
+ upgradePolicy: string | null;
762
+ /** Only populated via the group-info path; `null` in the namespace path. */
763
+ activeUpgrade: GroupUpgradeStatusResponseData;
764
+ };
725
765
  /**
726
766
  * The caller's own identity-gated entries pending re-signature (skew #1).
727
767
  * `pending` is `pendingCount > 0` (from `count_my_pending`); `authorize()` runs
@@ -814,4 +854,4 @@ declare function clearContextIdentity(): void;
814
854
  */
815
855
  declare function clearAllStorage(): void;
816
856
 
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 };
857
+ 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, 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, 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, SseEventData, 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
 
@@ -633,6 +633,17 @@ declare function useUpgradeGroup(): {
633
633
  loading: boolean;
634
634
  error: Error | null;
635
635
  };
636
+ /**
637
+ * Install a registry package version onto the node — the discrete "Download"
638
+ * step an Updates flow runs before an `upgradeGroup`. Resolves the installed
639
+ * application id (`InstallApplicationResponseData`). Downloading does not by
640
+ * itself change what any group runs; pair it with a subsequent upgrade.
641
+ */
642
+ declare function useInstallFromRegistry(): {
643
+ installFromRegistry: (registryUrl: string, packageName: string, version: string) => Promise<_calimero_network_mero_js.InstallApplicationResponseData | null>;
644
+ loading: boolean;
645
+ error: Error | null;
646
+ };
636
647
  /**
637
648
  * Kick off a full state re-pull for a context — operator recovery for a
638
649
  * context stranded mid-sync. `force` re-pulls even when the node does not
@@ -722,6 +733,35 @@ declare function useLatestVersion(registryUrl?: string | null, packageName?: str
722
733
  error: Error | null;
723
734
  refetch: () => Promise<void>;
724
735
  };
736
+ /**
737
+ * What app version does this group run, and is there a downloaded-but-not-yet-
738
+ * applied update? Replaces the appKey-vs-installed-blob comparison apps
739
+ * otherwise hand-roll: `pendingApply` is true when the group's `appKey` (the
740
+ * blob it targets) is present, non-zero, and differs from the blob actually
741
+ * installed for its `targetApplicationId`. Deciding whether to render or gate on
742
+ * that status (admin-only actions, etc.) is the call site's job.
743
+ *
744
+ * Resolution stays cheap: the group's record comes from `listNamespaces()` when
745
+ * the id is a namespace, else from `getGroupInfo()`; `getApplication()` then
746
+ * reads the installed version and blob. `activeUpgrade` is returned only when it
747
+ * arrives for free on the group-info path (it is not fetched separately).
748
+ * Subscribes to `AppVersionChanged` and refetches, since any version flip in the
749
+ * workspace can make the rollup stale.
750
+ */
751
+ declare function useGroupAppVersion(groupId?: string): {
752
+ loading: boolean;
753
+ error: Error | null;
754
+ refetch: () => Promise<void>;
755
+ /** Semver of the application the group currently targets (`null` until loaded). */
756
+ version: string | null;
757
+ /** The group's `targetApplicationId`. */
758
+ applicationId: string | null;
759
+ /** The installed blob differs from the one the group targets (see hook doc). */
760
+ pendingApply: boolean;
761
+ upgradePolicy: string | null;
762
+ /** Only populated via the group-info path; `null` in the namespace path. */
763
+ activeUpgrade: GroupUpgradeStatusResponseData;
764
+ };
725
765
  /**
726
766
  * The caller's own identity-gated entries pending re-signature (skew #1).
727
767
  * `pending` is `pendingCount > 0` (from `count_my_pending`); `authorize()` runs
@@ -814,4 +854,4 @@ declare function clearContextIdentity(): void;
814
854
  */
815
855
  declare function clearAllStorage(): void;
816
856
 
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 };
857
+ 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, 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
  }
@@ -2117,6 +2140,18 @@ function useUpgradeGroup() {
2117
2140
  );
2118
2141
  return { upgradeGroup, loading, error };
2119
2142
  }
2143
+ function useInstallFromRegistry() {
2144
+ const { mero } = useMero();
2145
+ const { loading, error, run } = useAsyncMutation();
2146
+ const installFromRegistry = useCallback(
2147
+ async (registryUrl, packageName, version) => {
2148
+ if (!mero) return null;
2149
+ return run(() => mero.admin.installFromRegistry(registryUrl, packageName, version));
2150
+ },
2151
+ [mero, run]
2152
+ );
2153
+ return { installFromRegistry, loading, error };
2154
+ }
2120
2155
  function useResyncContext() {
2121
2156
  const { mero } = useMero();
2122
2157
  const { loading, error, run } = useAsyncMutation();
@@ -2393,6 +2428,96 @@ function useLatestVersion(registryUrl, packageName, currentVersion) {
2393
2428
  const updateAvailable = latestVersion != null && currentVersion != null && compareSemver(latestVersion, currentVersion) > 0;
2394
2429
  return { versions, latestVersion, currentVersion, updateAvailable, loading, error, refetch };
2395
2430
  }
2431
+ var EMPTY_GROUP_APP_VERSION = {
2432
+ version: null,
2433
+ applicationId: null,
2434
+ pendingApply: false,
2435
+ upgradePolicy: null,
2436
+ activeUpgrade: null
2437
+ };
2438
+ function isZeroAppKey(appKey) {
2439
+ return !appKey || /^0+$/.test(appKey);
2440
+ }
2441
+ function useGroupAppVersion(groupId) {
2442
+ const { mero } = useMero();
2443
+ const [data, setData] = useState(EMPTY_GROUP_APP_VERSION);
2444
+ const [loading, setLoading] = useState(false);
2445
+ const [error, setError] = useState(null);
2446
+ const mountedRef = useMountedRef();
2447
+ const reqRef = useRef(0);
2448
+ const refetch = useCallback(async () => {
2449
+ const seq = ++reqRef.current;
2450
+ if (!mero || !groupId) {
2451
+ if (mountedRef.current) {
2452
+ setData(EMPTY_GROUP_APP_VERSION);
2453
+ setError(null);
2454
+ setLoading(false);
2455
+ }
2456
+ return;
2457
+ }
2458
+ if (mountedRef.current) {
2459
+ setLoading(true);
2460
+ setError(null);
2461
+ }
2462
+ try {
2463
+ const namespaces = await mero.admin.listNamespaces();
2464
+ const namespace = namespaces.find((entry) => entry.namespaceId === groupId);
2465
+ let appKey;
2466
+ let applicationId;
2467
+ let upgradePolicy;
2468
+ let activeUpgrade = null;
2469
+ if (namespace) {
2470
+ appKey = namespace.appKey;
2471
+ applicationId = namespace.targetApplicationId;
2472
+ upgradePolicy = namespace.upgradePolicy;
2473
+ } else {
2474
+ const info = await mero.admin.getGroupInfo(groupId);
2475
+ appKey = info.appKey;
2476
+ applicationId = info.targetApplicationId;
2477
+ upgradePolicy = info.upgradePolicy;
2478
+ activeUpgrade = info.activeUpgrade ?? null;
2479
+ }
2480
+ let version = null;
2481
+ let pendingApply = false;
2482
+ if (applicationId) {
2483
+ const { application } = await mero.admin.getApplication(applicationId);
2484
+ version = application?.version ?? null;
2485
+ if (application && !isZeroAppKey(appKey)) {
2486
+ const installedHex = base58ToHex(application.blob.bytecode).toLowerCase();
2487
+ pendingApply = appKey.toLowerCase() !== installedHex;
2488
+ }
2489
+ }
2490
+ if (mountedRef.current && seq === reqRef.current) {
2491
+ setData({ version, applicationId, pendingApply, upgradePolicy, activeUpgrade });
2492
+ }
2493
+ } catch (err) {
2494
+ const errorValue = toError(err);
2495
+ if (mountedRef.current && seq === reqRef.current) {
2496
+ setError(errorValue);
2497
+ }
2498
+ } finally {
2499
+ if (mountedRef.current && seq === reqRef.current) {
2500
+ setLoading(false);
2501
+ }
2502
+ }
2503
+ }, [groupId, mero, mountedRef]);
2504
+ useEffect(() => {
2505
+ reqRef.current += 1;
2506
+ setData(EMPTY_GROUP_APP_VERSION);
2507
+ setError(null);
2508
+ }, [groupId]);
2509
+ useEffect(() => {
2510
+ void refetch();
2511
+ }, [refetch]);
2512
+ useEffect(() => {
2513
+ if (!mero?.events || !groupId) return;
2514
+ const off = mero.events.onAppVersionChanged(() => {
2515
+ if (mountedRef.current) void refetch();
2516
+ });
2517
+ return off;
2518
+ }, [mero, groupId, refetch, mountedRef]);
2519
+ return { ...data, loading, error, refetch };
2520
+ }
2396
2521
  function useMyAuthoredMigration(contextId) {
2397
2522
  const { mero } = useMero();
2398
2523
  const [summary, setSummary] = useState(null);
@@ -2534,6 +2659,6 @@ function MigrationAdminPanel({ namespaceId, pollIntervalMs, className }) {
2534
2659
  ] });
2535
2660
  }
2536
2661
 
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 };
2662
+ 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
2663
  //# sourceMappingURL=index.js.map
2539
2664
  //# sourceMappingURL=index.js.map