@calimero-network/mero-react 6.0.0 → 6.0.2

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["#style-inject:#style-inject","../src/components/styles.css","../src/types.ts","../src/auth/node-trust.ts","../src/auth/token-adoption.ts","../src/storage/index.ts","../src/context/MeroContext.tsx","../src/components/CalimeroLogo.tsx","../src/theme.ts","../src/components/LoginModal.tsx","../src/components/ConnectButton.tsx","../src/utils/base58.ts","../src/hooks/index.ts","../src/components/MigrationPendingBanner.tsx","../src/components/MigrationAdminPanel.tsx"],"names":["AppMode","ConnectionType","refreshToken","jsx","useState","useMemo","useEffect","useRef","useCallback","jsxs","createContext"],"mappings":"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","file":"index.js","sourcesContent":["\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\":root {\\n --mero-bg: #0d1117;\\n --mero-bg-secondary: #161b22;\\n --mero-bg-tertiary: #1c2128;\\n --mero-text: #e6edf3;\\n --mero-text-secondary: #8b949e;\\n --mero-accent: #a5ff11;\\n --mero-accent-hover: #8ed40d;\\n --mero-on-primary: #0d1117;\\n --mero-error: #ff6b6b;\\n --mero-border: #30363d;\\n --mero-disabled: #555555;\\n --mero-shadow: rgba(0, 0, 0, 0.5);\\n --mero-overlay: rgba(0, 0, 0, 0.75);\\n --mero-radius: 8px;\\n}\\n.mero-connect-button {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n gap: 8px;\\n padding: 10px 20px;\\n background-color: var(--mero-accent);\\n border: 1px solid var(--mero-accent);\\n border-radius: var(--mero-radius);\\n cursor: pointer;\\n font-size: 14px;\\n font-weight: 600;\\n letter-spacing: 0.01em;\\n color: var(--mero-on-primary);\\n transition:\\n background-color 0.15s ease,\\n border-color 0.15s ease,\\n box-shadow 0.15s ease,\\n transform 0.1s ease;\\n min-width: 140px;\\n box-sizing: border-box;\\n font-family:\\n \\\"Inter\\\",\\n -apple-system,\\n BlinkMacSystemFont,\\n \\\"Segoe UI\\\",\\n Roboto,\\n Oxygen,\\n Ubuntu,\\n sans-serif;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n line-height: 1;\\n}\\n.mero-connect-button:hover:not(.mero-connected):not(.mero-reconnecting) {\\n background-color: var(--mero-accent-hover);\\n border-color: var(--mero-accent-hover);\\n box-shadow: 0 0 0 4px rgba(165, 255, 17, 0.18);\\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mero-accent) 18%, transparent);\\n}\\n.mero-connect-button:active:not(.mero-connected):not(.mero-reconnecting) {\\n transform: translateY(1px);\\n}\\n.mero-connect-button:focus-visible {\\n outline: none;\\n box-shadow: 0 0 0 3px rgba(165, 255, 17, 0.45);\\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mero-accent) 45%, transparent);\\n}\\n.mero-connect-button.mero-logo-only {\\n min-width: 0;\\n width: 40px;\\n height: 40px;\\n padding: 0;\\n gap: 0;\\n}\\n.mero-connect-button.mero-connected {\\n background-color: var(--mero-accent);\\n color: var(--mero-on-primary);\\n border-color: var(--mero-accent);\\n}\\n.mero-connect-button.mero-connected:hover {\\n background-color: var(--mero-accent-hover);\\n border-color: var(--mero-accent-hover);\\n}\\n.mero-connect-button.mero-reconnecting {\\n background-color: var(--mero-bg-secondary);\\n color: var(--mero-text-secondary);\\n border-color: var(--mero-border);\\n cursor: not-allowed;\\n}\\n.mero-connect-container {\\n position: relative;\\n display: inline-block;\\n}\\n.mero-dropdown {\\n position: absolute;\\n top: 100%;\\n left: 0;\\n background-color: var(--mero-bg-secondary);\\n border: 1px solid var(--mero-border);\\n border-radius: var(--mero-radius);\\n margin-top: 6px;\\n padding: 0;\\n z-index: 1001;\\n width: 100%;\\n min-width: 180px;\\n overflow: hidden;\\n box-shadow: 0 8px 24px var(--mero-shadow);\\n}\\n.mero-dropdown-info {\\n padding: 10px 16px;\\n color: var(--mero-text-secondary);\\n font-size: 13px;\\n border-bottom: 1px solid var(--mero-border);\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n max-width: 220px;\\n}\\n.mero-dropdown-item {\\n display: block;\\n width: 100%;\\n padding: 10px 16px;\\n background: none;\\n border: none;\\n color: var(--mero-text);\\n text-align: left;\\n cursor: pointer;\\n font-size: 14px;\\n text-decoration: none;\\n font-family: inherit;\\n}\\n.mero-dropdown-item:hover {\\n background-color: var(--mero-accent);\\n color: var(--mero-on-primary);\\n}\\n.mero-logo {\\n width: 24px;\\n height: 24px;\\n color: currentColor;\\n}\\n@keyframes meroFadeIn {\\n from {\\n opacity: 0;\\n }\\n to {\\n opacity: 1;\\n }\\n}\\n@keyframes meroSlideIn {\\n from {\\n transform: translateY(-12px);\\n opacity: 0;\\n }\\n to {\\n transform: translateY(0);\\n opacity: 1;\\n }\\n}\\n@keyframes meroSpin {\\n to {\\n transform: rotate(360deg);\\n }\\n}\\n\")","/**\n * Types for mero-react\n */\n\nimport type { MeroJs, TokenStore } from '@calimero-network/mero-js';\n\n/**\n * Application mode determines the permission scope\n */\nexport enum AppMode {\n /**\n * @deprecated since 2.1.0 — SingleContext is no longer supported and will\n * be removed in 3.0.0. Auth-frontend no longer drives\n * context/namespace/group selection; the auth callback returns only\n * `access_token`, `refresh_token`, `application_id`, and `node_url`.\n * Switch to {@link AppMode.MultiContext} and have your app manage\n * context selection itself.\n *\n * Migration: see `example/app/src/pages/context/SelectContext.tsx` for a\n * reference implementation. It uses `useContexts` /\n * `useNamespacesForApplication` for listing, then calls\n * `mero.admin.createNamespace` / `createGroupInNamespace` /\n * `createContext` directly (rather than the `useCreate*` hooks) so the\n * underlying server error surfaces to the user instead of being\n * swallowed by `useAsyncMutation`.\n */\n SingleContext = 'single-context',\n /** Multi-context: user can manage multiple contexts */\n MultiContext = 'multi-context',\n /** Admin: full administrative access */\n Admin = 'admin',\n}\n\n/**\n * Connection type for the login modal\n */\nexport enum ConnectionType {\n /**\n * @deprecated The login modal no longer has Local/Remote tabs — it always\n * shows node discovery + manual URL entry. Behaves the same as `Remote`.\n */\n RemoteAndLocal = 'remote-and-local',\n /** Open the login modal (node discovery + manual URL entry) */\n Remote = 'remote',\n /**\n * @deprecated The hardcoded default-local-node view was removed. Behaves\n * the same as `Remote`.\n */\n Local = 'local',\n /** Custom URL (skip modal) */\n Custom = 'custom',\n}\n\n/**\n * Custom connection configuration\n */\nexport interface CustomConnectionConfig {\n type: ConnectionType.Custom;\n url: string;\n}\n\n/**\n * Context for an application\n */\nexport interface AppContext {\n contextId: string;\n executorId: string;\n applicationId: string;\n}\n\n/**\n * Result of an RPC execution\n */\nexport interface ExecutionResult<T = unknown> {\n success: boolean;\n result?: T;\n error?: string;\n}\n\nexport interface ApplicationContextRecord {\n contextId: string;\n applicationId: string;\n}\n\nexport interface ContextDiscoveryOptions {\n applicationId: string;\n knownContextIds?: string[];\n targetAlias?: string;\n pollIntervalMs?: number;\n timeoutMs?: number;\n}\n\nexport interface ContextDiscoveryState {\n context: ApplicationContextRecord | null;\n loading: boolean;\n error: Error | null;\n discover: () => Promise<ApplicationContextRecord | null>;\n reset: () => void;\n}\n\n/**\n * Mero context value exposed by useMero hook\n */\nexport interface MeroContextValue {\n /** The MeroJs instance (null if not connected) */\n mero: MeroJs | null;\n /** Whether the user is authenticated */\n isAuthenticated: boolean;\n /** Whether the connection is online */\n isOnline: boolean;\n /** The current node URL */\n nodeUrl: string | null;\n /** The application ID */\n applicationId: string | null;\n /** The context ID (from auth flow) */\n contextId: string | null;\n /** The context identity / executor public key (from auth flow) */\n contextIdentity: string | null;\n /** Connect to a node URL and start auth flow */\n connectToNode: (url: string) => void;\n /** Logout and clear tokens */\n logout: () => void;\n /** Loading state */\n isLoading: boolean;\n}\n\n/**\n * MeroProvider configuration\n */\nexport interface MeroProviderConfig {\n /** Application mode */\n mode: AppMode;\n /** Package name (for registry-based apps) */\n packageName?: string;\n /** Package version (optional, defaults to latest) */\n packageVersion?: string;\n /** Registry URL (optional) */\n registryUrl?: string;\n /** Request timeout in milliseconds */\n timeoutMs?: number;\n /**\n * Origins the OAuth callback is allowed to authenticate against. Defends\n * against a malicious `node_url` in the callback URL (token exfiltration):\n * the node login was initiated with is always trusted, and this allowlist\n * additionally permits direct-callback entry to known nodes. When neither is\n * available (no initiated node and no allowlist) a callback node_url is\n * rejected and a security error is logged.\n */\n allowedNodeUrls?: string[];\n /**\n * Token store for access/refresh tokens. Defaults to a localStorage-backed\n * store that persists across reloads.\n *\n * SECURITY: localStorage tokens — including the refresh token — are readable\n * by any script on the page, so an XSS bug can exfiltrate them. For sensitive\n * deployments pass a `MemoryTokenStore` (session-only) or a store backed by an\n * HttpOnly cookie set by your auth service.\n */\n tokenStore?: TokenStore;\n}\n","/**\n * Trust decision for the node URL an OAuth callback wants us to authenticate\n * against.\n *\n * The auth flow redirects the browser to a node's auth UI and back to the app\n * with `access_token` / `refresh_token` / `node_url` in the callback URL. That\n * URL is attacker-influenceable, so a malicious `node_url` would otherwise make\n * the SDK send the freshly-minted tokens to an attacker's node (exfiltration).\n *\n * Defense: only authenticate against a node we can independently trust — the\n * node login was *initiated* with (saved before the redirect), or an\n * app-configured allowlist.\n */\n\n/** True iff both URLs parse and share the same origin (scheme + host + port). */\nexport function sameOrigin(a: string, b: string): boolean {\n try {\n return new URL(a).origin === new URL(b).origin;\n } catch {\n return false;\n }\n}\n\nexport interface ResolveTrustedNodeParams {\n /** `node_url` from the OAuth callback (untrusted, attacker-influenceable). */\n candidate: string | null | undefined;\n /** Node URL login was initiated with, saved before the redirect (trusted). */\n initiated: string | null;\n /** Additional trusted origins, for direct-callback entry without an initiated node. */\n allowedNodeUrls?: string[];\n}\n\nexport interface TrustedNodeResult {\n /** The node URL that is safe to authenticate against, or null. */\n url: string | null;\n /** A candidate node_url was present but could not be trusted (likely an attack). */\n rejected: boolean;\n}\n\n/**\n * Decide which node URL, if any, is safe to authenticate against.\n *\n * - No candidate → fall back to the initiated node.\n * - Candidate + initiated node → must share the initiated node's origin, else reject.\n * - Candidate + no initiated node + allowlist → must be in the allowlist, else reject.\n * - Candidate + no trust anchor (no initiated node and no allowlist) → reject. There is\n * nothing to validate the attacker-influenceable callback against, so refusing is the\n * safe default. The normal flow always records the initiated node (via `connectToNode`)\n * before redirecting; configure `allowedNodeUrls` to permit direct-callback entry.\n */\nexport function resolveTrustedNodeUrl(params: ResolveTrustedNodeParams): TrustedNodeResult {\n const { candidate, initiated, allowedNodeUrls } = params;\n\n if (!candidate) {\n return { url: initiated ?? null, rejected: false };\n }\n\n if (initiated) {\n return sameOrigin(candidate, initiated)\n ? { url: candidate, rejected: false }\n : { url: null, rejected: true };\n }\n\n if (allowedNodeUrls && allowedNodeUrls.length > 0) {\n return allowedNodeUrls.some((u) => sameOrigin(candidate, u))\n ? { url: candidate, rejected: false }\n : { url: null, rejected: true };\n }\n\n return { url: null, rejected: true };\n}\n","/**\n * Decide whether the token bundle carried in an SSO callback hash may replace\n * the bundle already in the token store.\n *\n * Since core 0.11.0 (calimero-network/core#3083) refresh tokens are SINGLE-USE:\n * every `POST /auth/refresh` consumes the presented refresh token and returns a\n * new one. Re-presenting a consumed refresh token is treated as theft — the node\n * answers 401 `x-auth-error: token_reuse` and revokes the whole token family, so\n * *every* holder is hard-logged-out.\n *\n * That makes an unconditional `tokenStore.setTokens(callbackBundle)` on the SSO\n * callback path actively dangerous. A desktop host (or any SSO initiator) hands\n * the app a token bundle in the URL hash; if mero-js has already rotated the\n * stored refresh token, writing the hash bundle over it resurrects a *consumed*\n * refresh token. The next refresh presents it → `token_reuse` → family revoked.\n *\n * So the hash bundle is adopted only when it is safe:\n * - there is no stored bundle (a genuinely fresh login), or\n * - the node changed (the stored bundle belongs to a different node), or\n * - the hash tokens are genuinely NEWER than what is stored, or\n * - the stored bundle is missing a refresh token that the hash can supply.\n *\n * Anything else — a stale hash, or a hash replaying the access token we already\n * hold — is ignored, leaving the live (possibly rotated) bundle untouched.\n */\n\nimport type { TokenData } from '@calimero-network/mero-js';\nimport { sameOrigin } from './node-trust';\n\nconst HOUR_MS = 3_600_000;\n\ninterface JwtClaims {\n /** Issued-at (seconds). The authoritative rotation-order signal when present. */\n iat?: number;\n /** Expiry (seconds). */\n exp?: number;\n}\n\n/**\n * Decode a JWT's payload claims without verifying the signature.\n *\n * Verification is the node's job — we only need the ordering claims to decide\n * which of two bundles is newer, and both bundles are already node-trusted by\n * the time we get here (see `resolveTrustedNodeUrl`).\n *\n * Returns null for anything that is not a decodable three-part JWT (opaque\n * tokens, test fixtures, garbage).\n */\nexport function decodeJwtClaims(token: string): JwtClaims | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n let b64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n while (b64.length % 4) b64 += '=';\n const payload: unknown = JSON.parse(atob(b64));\n if (!payload || typeof payload !== 'object') return null;\n const { iat, exp } = payload as JwtClaims;\n return {\n iat: typeof iat === 'number' && iat > 0 ? iat : undefined,\n exp: typeof exp === 'number' && exp > 0 ? exp : undefined,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Absolute expiry (ms) of an access token, from its `exp` claim.\n *\n * Mirrors mero-js's internal `expiresAtFromJwt` (which it does not export —\n * checked against mero-js 6.1.0), including the \"assume one hour\" fallback for\n * tokens whose expiry we cannot read.\n */\nexport function expiresAtFromJwt(token: string, fallbackMs: number = Date.now() + HOUR_MS): number {\n const exp = decodeJwtClaims(token)?.exp;\n return exp ? exp * 1000 : fallbackMs;\n}\n\n/**\n * Is the callback's access token newer than the one we already hold?\n *\n * Prefers `iat` (issued-at) — the direct rotation-order signal — and falls back\n * to `exp`, then to the stored bundle's recorded `expires_at`. When the answer\n * cannot be established the token is NOT considered newer: refusing to adopt\n * costs a redundant login at worst, whereas adopting a stale bundle burns the\n * whole token family.\n */\nfunction isCallbackNewer(callbackAccessToken: string, stored: TokenData): boolean {\n const incoming = decodeJwtClaims(callbackAccessToken);\n if (!incoming) return false;\n\n const current = decodeJwtClaims(stored.access_token);\n if (current) {\n if (incoming.iat !== undefined && current.iat !== undefined && incoming.iat !== current.iat) {\n return incoming.iat > current.iat;\n }\n if (incoming.exp !== undefined && current.exp !== undefined && incoming.exp !== current.exp) {\n return incoming.exp > current.exp;\n }\n // Same claims (a replay of the token we already hold), or nothing to compare\n // on — either way the callback brings nothing new.\n return false;\n }\n\n // Stored access token is not a decodable JWT — compare against the expiry the\n // store recorded for it.\n return incoming.exp !== undefined && incoming.exp * 1000 > stored.expires_at;\n}\n\n/** Why the SSO hash bundle was (or was not) written to the token store. */\nexport type TokenAdoptionReason =\n /** No stored bundle — a genuinely fresh login. Seed from the hash. */\n | 'fresh-login'\n /** The stored bundle belongs to a different node. Re-seed from the hash. */\n | 'node-changed'\n /** The hash tokens are genuinely newer than the stored ones. */\n | 'newer'\n /** Same session, but the stored bundle has no refresh token and the hash does. */\n | 'fill-refresh'\n /** The hash tokens are stale, or replay the access token we already hold. */\n | 'stale';\n\nexport type TokenAdoptionDecision =\n | { adopt: true; tokens: TokenData; reason: Exclude<TokenAdoptionReason, 'stale'> }\n | { adopt: false; reason: 'stale' };\n\nexport interface ResolveTokenAdoptionParams {\n /** Access token from the callback hash. Always present (mero-js returns null otherwise). */\n callbackAccessToken: string;\n /**\n * Refresh token from the callback hash. `parseAuthCallback` yields `''` when the\n * hash carries no `refresh_token` — hosts are moving to access-only bundles\n * precisely so they cannot hand back a rotated-away refresh token.\n */\n callbackRefreshToken: string;\n /** Trusted node URL the callback resolved to (see `resolveTrustedNodeUrl`). */\n callbackNodeUrl: string;\n /** Bundle currently in the token store — mero-js may have rotated it already. */\n stored: TokenData | null;\n /** Node URL the stored bundle was issued by, i.e. the node URL before this callback. */\n storedNodeUrl: string | null;\n}\n\n/**\n * Decide what (if anything) to write to the token store for an SSO callback.\n *\n * Never returns a bundle with an empty `refresh_token` when a refresh token for\n * the same node is already stored: an access-only hash bundle is MERGED over the\n * stored one, so adopting a fresher access token cannot strip the session's\n * ability to refresh.\n */\nexport function resolveTokenAdoption(params: ResolveTokenAdoptionParams): TokenAdoptionDecision {\n const { callbackAccessToken, callbackRefreshToken, callbackNodeUrl, stored, storedNodeUrl } =\n params;\n\n const bundle = (refreshToken: string): TokenData => ({\n access_token: callbackAccessToken,\n refresh_token: refreshToken,\n expires_at: expiresAtFromJwt(callbackAccessToken),\n });\n\n // Fresh login — nothing to protect.\n if (!stored?.access_token) {\n return { adopt: true, tokens: bundle(callbackRefreshToken), reason: 'fresh-login' };\n }\n\n // Different node — the stored bundle is for someone else's token family, and\n // its refresh token is meaningless here, so it must NOT be carried over.\n const sameNode = !!storedNodeUrl && sameOrigin(callbackNodeUrl, storedNodeUrl);\n if (!sameNode) {\n return { adopt: true, tokens: bundle(callbackRefreshToken), reason: 'node-changed' };\n }\n\n // Same node, live bundle. Keep the stored refresh token unless the hash carries\n // one — the hash's refresh token may be a copy that mero-js has already rotated\n // away, but an *empty* one would strip refresh from the session entirely.\n const refreshToken = callbackRefreshToken || stored.refresh_token;\n\n if (isCallbackNewer(callbackAccessToken, stored)) {\n return { adopt: true, tokens: bundle(refreshToken), reason: 'newer' };\n }\n\n // The access token is not newer, but the stored bundle cannot refresh and the\n // hash can repair that. Keep the *stored* access token (it is at least as new).\n if (!stored.refresh_token && callbackRefreshToken) {\n return {\n adopt: true,\n tokens: { ...stored, refresh_token: callbackRefreshToken },\n reason: 'fill-refresh',\n };\n }\n\n // Stale (or a replay of the bundle we already hold). Writing it would resurrect\n // a consumed refresh token → `token_reuse` → the node revokes the whole family.\n return { adopt: false, reason: 'stale' };\n}\n","/**\n * Storage utilities for mero-react\n * \n * Provides localStorage-based token storage and other persistence utilities.\n */\n\nimport type { TokenData } from '@calimero-network/mero-js';\n\n// Storage keys\nconst STORAGE_KEYS = {\n ACCESS_TOKEN: 'mero:access_token',\n REFRESH_TOKEN: 'mero:refresh_token',\n EXPIRES_AT: 'mero:expires_at',\n NODE_URL: 'mero:node_url',\n // The node the token bundle currently in the TokenStore was issued by. Distinct\n // from NODE_URL, which `connectToNode` overwrites with the *target* node before\n // redirecting to login — so at callback time NODE_URL names where we are going,\n // not who minted the tokens we still hold. Telling those apart is what lets the\n // SSO callback re-seed on a node change without mistaking a different node's\n // bundle for a rotated one (see auth/token-adoption.ts).\n TOKEN_NODE_URL: 'mero:token_node_url',\n APPLICATION_ID: 'mero:application_id',\n CONTEXT_ID: 'mero:context_id',\n CONTEXT_IDENTITY: 'mero:context_identity',\n} as const;\n\nlet _storageAvailable: boolean | null = null;\n\nfunction isLocalStorageAvailable(): boolean {\n if (_storageAvailable !== null) return _storageAvailable;\n try {\n if (typeof window === 'undefined' || !window.localStorage) {\n _storageAvailable = false;\n return false;\n }\n const testKey = '__mero_test__';\n localStorage.setItem(testKey, 'test');\n localStorage.removeItem(testKey);\n _storageAvailable = true;\n } catch {\n _storageAvailable = false;\n }\n return _storageAvailable;\n}\n\nexport const localStorageTokenStorage = {\n async get(): Promise<TokenData | null> {\n if (!isLocalStorageAvailable()) {\n return null;\n }\n\n try {\n const accessToken = localStorage.getItem(STORAGE_KEYS.ACCESS_TOKEN);\n const refreshToken = localStorage.getItem(STORAGE_KEYS.REFRESH_TOKEN);\n const expiresAt = localStorage.getItem(STORAGE_KEYS.EXPIRES_AT);\n\n if (!accessToken || !refreshToken) {\n return null;\n }\n\n return {\n access_token: accessToken,\n refresh_token: refreshToken,\n expires_at: expiresAt ? parseInt(expiresAt, 10) : Date.now() + 3600000,\n };\n } catch (e) {\n console.error('[mero-react] Failed to get token from storage:', e);\n return null;\n }\n },\n\n async set(token: TokenData): Promise<void> {\n if (!isLocalStorageAvailable()) {\n return;\n }\n\n try {\n localStorage.setItem(STORAGE_KEYS.ACCESS_TOKEN, token.access_token);\n localStorage.setItem(STORAGE_KEYS.REFRESH_TOKEN, token.refresh_token);\n localStorage.setItem(STORAGE_KEYS.EXPIRES_AT, token.expires_at.toString());\n } catch (e) {\n console.error('[mero-react] Failed to save token to storage:', e);\n }\n },\n\n async clear(): Promise<void> {\n if (!isLocalStorageAvailable()) {\n return;\n }\n\n try {\n localStorage.removeItem(STORAGE_KEYS.ACCESS_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.REFRESH_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.EXPIRES_AT);\n } catch (e) {\n console.error('[mero-react] Failed to clear token from storage:', e);\n }\n },\n};\n\n/**\n * Get the stored node URL\n */\nexport function getNodeUrl(): string | null {\n if (!isLocalStorageAvailable()) return null;\n return localStorage.getItem(STORAGE_KEYS.NODE_URL);\n}\n\n/**\n * Set the node URL\n */\nexport function setNodeUrl(url: string): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.setItem(STORAGE_KEYS.NODE_URL, url);\n}\n\n/**\n * Clear the node URL\n */\nexport function clearNodeUrl(): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.removeItem(STORAGE_KEYS.NODE_URL);\n}\n\n/**\n * Get the node URL that minted the token bundle currently in the TokenStore.\n */\nexport function getTokenNodeUrl(): string | null {\n if (!isLocalStorageAvailable()) return null;\n return localStorage.getItem(STORAGE_KEYS.TOKEN_NODE_URL);\n}\n\n/**\n * Record the node URL that minted the token bundle now in the TokenStore.\n */\nexport function setTokenNodeUrl(url: string): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.setItem(STORAGE_KEYS.TOKEN_NODE_URL, url);\n}\n\n/**\n * Clear the token bundle's node URL\n */\nexport function clearTokenNodeUrl(): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.removeItem(STORAGE_KEYS.TOKEN_NODE_URL);\n}\n\n/**\n * Get the stored application ID\n */\nexport function getApplicationId(): string | null {\n if (!isLocalStorageAvailable()) return null;\n return localStorage.getItem(STORAGE_KEYS.APPLICATION_ID);\n}\n\n/**\n * Set the application ID\n */\nexport function setApplicationId(id: string): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.setItem(STORAGE_KEYS.APPLICATION_ID, id);\n}\n\n/**\n * Clear the application ID\n */\nexport function clearApplicationId(): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.removeItem(STORAGE_KEYS.APPLICATION_ID);\n}\n\n/**\n * Get the stored context ID\n */\nexport function getContextId(): string | null {\n if (!isLocalStorageAvailable()) return null;\n return localStorage.getItem(STORAGE_KEYS.CONTEXT_ID);\n}\n\n/**\n * Set the context ID\n */\nexport function setContextId(id: string): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.setItem(STORAGE_KEYS.CONTEXT_ID, id);\n}\n\n/**\n * Clear the context ID\n */\nexport function clearContextId(): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.removeItem(STORAGE_KEYS.CONTEXT_ID);\n}\n\n/**\n * Get the stored context identity\n */\nexport function getContextIdentity(): string | null {\n if (!isLocalStorageAvailable()) return null;\n return localStorage.getItem(STORAGE_KEYS.CONTEXT_IDENTITY);\n}\n\n/**\n * Set the context identity\n */\nexport function setContextIdentity(id: string): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.setItem(STORAGE_KEYS.CONTEXT_IDENTITY, id);\n}\n\n/**\n * Clear the context identity\n */\nexport function clearContextIdentity(): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.removeItem(STORAGE_KEYS.CONTEXT_IDENTITY);\n}\n\n/**\n * Clear all mero-react storage\n */\nexport function clearAllStorage(): void {\n if (!isLocalStorageAvailable()) return;\n Object.values(STORAGE_KEYS).forEach((key) => {\n localStorage.removeItem(key);\n });\n}\n","import React, {\n createContext,\n useContext,\n useState,\n useEffect,\n useCallback,\n useRef,\n useMemo,\n} from 'react';\nimport {\n MeroJs,\n LocalStorageTokenStore,\n parseAuthCallback,\n buildAuthLoginUrl,\n} from '@calimero-network/mero-js';\nimport { AppMode } from '../types';\nimport type { AuthCallbackResult, TokenStore } from '@calimero-network/mero-js';\nimport { resolveTrustedNodeUrl } from '../auth/node-trust';\nimport { resolveTokenAdoption } from '../auth/token-adoption';\nimport {\n getNodeUrl,\n setNodeUrl,\n getTokenNodeUrl,\n setTokenNodeUrl,\n getApplicationId,\n setApplicationId,\n getContextId,\n setContextId,\n getContextIdentity,\n setContextIdentity,\n clearAllStorage,\n} from '../storage';\nimport type { MeroContextValue, MeroProviderConfig } from '../types';\n\nconst MeroContext = createContext<MeroContextValue | null>(null);\n\nconst isBrowser = typeof window !== 'undefined';\n\n/**\n * Permission grants requested for the client token at login.\n *\n * Cores since 0.11.0-rc.9 default-deny admin-api routes the token holds no\n * scope for; cores >=0.11.0-rc.11 map the governance/blob/alias routes to the\n * client-grantable `namespace` / `group` / `blob` / `context:alias`\n * permissions, so app tokens must request them here or every workspace,\n * group, blob and context-alias call 403s.\n *\n * `context:list` is included even in single-context mode because every app\n * calls GET /admin-api/contexts/:id/identities-owned right after login, which\n * maps to a `context:list` requirement.\n *\n * Exported for tests.\n */\nexport function getPermissionsForMode(mode: AppMode): string[] {\n switch (mode) {\n case AppMode.SingleContext:\n return ['context:execute', 'context:list', 'application:list', 'blob', 'context:alias'];\n case AppMode.MultiContext:\n return [\n 'context:create',\n 'context:list',\n 'context:execute',\n 'application:list',\n 'namespace',\n 'group',\n 'blob',\n 'context:alias',\n ];\n case AppMode.Admin:\n return ['admin'];\n default:\n throw new Error(`Unsupported application mode: ${mode}`);\n }\n}\n\nexport interface MeroProviderProps extends MeroProviderConfig {\n children: React.ReactNode;\n}\n\nexport function MeroProvider({\n children,\n mode,\n packageName,\n packageVersion,\n registryUrl,\n timeoutMs = 30000,\n allowedNodeUrls,\n tokenStore: tokenStoreProp,\n}: MeroProviderProps) {\n const tokenStore = useMemo<TokenStore>(\n () => tokenStoreProp ?? new LocalStorageTokenStore(),\n [tokenStoreProp],\n );\n const [mero, setMero] = useState<MeroJs | null>(null);\n const [isAuthenticated, setIsAuthenticated] = useState(false);\n const [isOnline, setIsOnline] = useState(true);\n const [isLoading, setIsLoading] = useState(true);\n const [nodeUrl, setNodeUrlState] = useState<string | null>(() => getNodeUrl());\n const [applicationId, setApplicationIdState] = useState<string | null>(\n () => getApplicationId() || null,\n );\n const [contextId, setContextIdState] = useState<string | null>(() => getContextId());\n const [contextIdentity, setContextIdentityState] = useState<string | null>(() => getContextIdentity());\n\n const meroRef = useRef<MeroJs | null>(null);\n\n // Parse auth callback ONCE in a ref (StrictMode-safe: refs persist across unmount/remount)\n const callbackRef = useRef<AuthCallbackResult | null | undefined>(undefined);\n if (callbackRef.current === undefined && isBrowser) {\n callbackRef.current = parseAuthCallback(window.location.href);\n }\n\n const createMeroInstance = useCallback(\n (url: string): MeroJs => {\n if (meroRef.current) {\n meroRef.current.close();\n }\n const instance = new MeroJs({\n baseUrl: url,\n tokenStore,\n timeoutMs,\n });\n meroRef.current = instance;\n return instance;\n },\n [timeoutMs, tokenStore],\n );\n\n const checkAuth = useCallback(\n async (instance: MeroJs): Promise<boolean> => {\n // Validate the session via /auth/validate (signature, revocation, node\n // binding — no permission requirement) instead of probing\n // GET /admin-api/contexts. Since core 0.11.0-rc.9 the node enforces\n // token permission scopes, and /admin-api/contexts requires Global\n // `context:list` — which single-context tokens (execute-only) and\n // app-scoped tokens don't hold, so probing it 403'd valid sessions and\n // bounced every app straight back to the login page.\n const accessToken = tokenStore.getTokens()?.access_token;\n if (!accessToken) return false;\n try {\n const { valid } = await instance.auth.validateToken(accessToken);\n return valid;\n } catch {\n return false;\n }\n },\n [tokenStore],\n );\n\n const connectToNode = useCallback(\n (url: string) => {\n if (!isBrowser) return;\n setNodeUrl(url);\n setNodeUrlState(url);\n\n const callbackUrl = new URL(window.location.href);\n callbackUrl.hash = '';\n\n const loginUrl = buildAuthLoginUrl(url, {\n callbackUrl: callbackUrl.toString(),\n permissions: getPermissionsForMode(mode),\n mode,\n packageName,\n packageVersion,\n registryUrl,\n });\n\n window.location.href = loginUrl;\n },\n [mode, packageName, packageVersion, registryUrl],\n );\n\n const logout = useCallback(() => {\n if (meroRef.current) {\n meroRef.current.clearToken();\n meroRef.current.close();\n }\n // Always clear the token store, even when not connected (meroRef is null) —\n // otherwise the access/refresh tokens persist in storage after logout.\n tokenStore.clear();\n clearAllStorage();\n setMero(null);\n setIsAuthenticated(false);\n setNodeUrlState(null);\n setApplicationIdState(null);\n setContextIdState(null);\n setContextIdentityState(null);\n meroRef.current = null;\n }, [tokenStore]);\n\n // Initialization effect\n useEffect(() => {\n let active = true;\n\n const init = async () => {\n const callback = callbackRef.current;\n let nodeFromCallback: string | null = null;\n\n if (callback) {\n // Read BEFORE the callback overwrites either of them.\n // - initiatedNodeUrl: the node login was initiated with — the trust anchor.\n // - tokenNodeUrl: the node that minted the bundle currently in the store.\n // They differ exactly when the user is switching nodes: `connectToNode`\n // points NODE_URL at the *target* node before redirecting, while the store\n // still holds the *previous* node's bundle. Falling back to the initiated\n // node keeps sessions that predate TOKEN_NODE_URL working.\n const initiatedNodeUrl = getNodeUrl();\n const tokenNodeUrl = getTokenNodeUrl() ?? initiatedNodeUrl;\n\n // The callback URL is attacker-influenceable, so validate its node_url\n // BEFORE storing tokens or connecting — otherwise a malicious node_url\n // would receive the freshly-minted tokens (exfiltration).\n const { url, rejected } = resolveTrustedNodeUrl({\n candidate: callback.nodeUrl,\n initiated: initiatedNodeUrl,\n allowedNodeUrls,\n });\n\n // Always strip the callback params (tokens + node_url) from the address\n // bar and consume the parsed callback, whatever the trust outcome.\n if (isBrowser) {\n window.history.replaceState({}, '', window.location.pathname + window.location.search);\n }\n callbackRef.current = null;\n\n if (rejected) {\n // Untrusted node_url — likely a token-exfiltration attempt. Drop the\n // callback's tokens, but DON'T return: fall through to restore any\n // existing session from storage so a tampered callback can't log a\n // legitimately authenticated user out.\n console.error(\n '[MeroProvider] OAuth callback node_url is not trusted (it does not match the node ' +\n 'login was initiated with, nor `allowedNodeUrls`). Ignoring the callback; no tokens stored.',\n );\n } else if (url) {\n // Trusted node → the callback's tokens MAY be persisted. Whether they\n // SHOULD be is a separate question: refresh tokens are single-use since\n // core 0.11.0 (calimero-network/core#3083), so blindly writing the hash\n // bundle over a bundle mero-js has already rotated resurrects a consumed\n // refresh token — the node reads that as theft (`x-auth-error:\n // token_reuse`) and revokes the entire token family, hard-logging out\n // every holder. Adopt only a fresh, newer, or different-node bundle, and\n // merge rather than replace so an access-only hash (hosts are dropping\n // `refresh_token` from the hash) can never strip a live refresh token.\n const decision = resolveTokenAdoption({\n callbackAccessToken: callback.accessToken,\n callbackRefreshToken: callback.refreshToken,\n callbackNodeUrl: url,\n stored: tokenStore.getTokens(),\n storedNodeUrl: tokenNodeUrl,\n });\n\n if (decision.adopt) {\n tokenStore.setTokens(decision.tokens);\n setTokenNodeUrl(url);\n } else {\n console.warn(\n '[MeroProvider] Ignoring the SSO callback token bundle: it is stale (not newer than ' +\n 'the tokens already stored for this node). Adopting it would replay an already-rotated ' +\n 'refresh token, which the node revokes the whole token family for.',\n );\n }\n\n if (callback.applicationId) {\n setApplicationId(callback.applicationId);\n if (active) setApplicationIdState(callback.applicationId);\n }\n if (callback.contextId) {\n setContextId(callback.contextId);\n if (active) setContextIdState(callback.contextId);\n }\n if (callback.contextIdentity) {\n setContextIdentity(callback.contextIdentity);\n if (active) setContextIdentityState(callback.contextIdentity);\n }\n\n setNodeUrl(url);\n if (active) setNodeUrlState(url);\n nodeFromCallback = url;\n }\n // url === null && !rejected → callback had no node to bind to; ignore it.\n }\n\n const savedUrl = nodeFromCallback || getNodeUrl();\n if (!savedUrl) {\n if (active) setIsLoading(false);\n return;\n }\n\n const instance = createMeroInstance(savedUrl);\n const authed = await checkAuth(instance);\n\n if (!active) return;\n\n if (authed) {\n setMero(instance);\n setIsAuthenticated(true);\n setIsOnline(true);\n } else if (nodeFromCallback) {\n setMero(instance);\n }\n\n setIsLoading(false);\n };\n\n init().catch((err) => {\n console.error('[MeroProvider] Initialization failed:', err);\n if (active) setIsLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [createMeroInstance, checkAuth, allowedNodeUrls, tokenStore]);\n\n // SSE connection for online/offline detection — no polling.\n useEffect(() => {\n if (!isAuthenticated || !meroRef.current) return;\n\n let active = true;\n const sse = meroRef.current.events;\n\n const onConnect = () => { if (active) setIsOnline(true); };\n const onError = (err: Error) => {\n if (!active) return;\n setIsOnline(false);\n // TODO(mero-js#67): surface a revoked token family as an explicit forced\n // re-login rather than an opaque 401. Once a refresh token is replayed the\n // node revokes the family and answers 401 with `x-auth-error: token_reuse`\n // (or `token_revoked`) — a terminal state no retry can recover from, unlike\n // `token_expired`. mero-js#67 adds an `AuthRevokedError` for exactly this;\n // the mero-js pinned here (6.1.0) predates it — it neither exports that\n // error nor reads `x-auth-error` beyond `token_expired` — so there is\n // nothing to branch on yet. Bump mero-js past #67, then match on\n // `AuthRevokedError` here and expose a distinct `sessionRevoked` reason to\n // consumers instead of a silent logout.\n if (err.message.includes('401')) {\n logout();\n }\n };\n\n sse.on('connect', onConnect);\n sse.on('error', onError);\n sse.connect().catch(() => { if (active) setIsOnline(false); });\n\n return () => {\n active = false;\n sse.off('connect', onConnect);\n sse.off('error', onError);\n };\n }, [isAuthenticated, mero]);\n\n const contextValue = useMemo<MeroContextValue>(\n () => ({\n mero,\n isAuthenticated,\n isOnline,\n nodeUrl,\n applicationId,\n contextId,\n contextIdentity,\n connectToNode,\n logout,\n isLoading,\n }),\n [mero, isAuthenticated, isOnline, nodeUrl, applicationId, contextId, contextIdentity, connectToNode, logout, isLoading],\n );\n\n return (\n <MeroContext.Provider value={contextValue}>\n {children}\n </MeroContext.Provider>\n );\n}\n\nexport function useMero(): MeroContextValue {\n const context = useContext(MeroContext);\n if (!context) {\n throw new Error('useMero must be used within a MeroProvider');\n }\n return context;\n}\n\nexport { MeroContext };\n","/**\n * CalimeroLogo - the official Calimero emblem.\n *\n * Uses `currentColor` for fills so the consumer can theme it with `color`,\n * a `style.color` override, or by passing `color` directly.\n */\n\nimport React from 'react';\n\nexport interface CalimeroLogoProps extends React.SVGAttributes<SVGSVGElement> {\n /** Width / height shorthand (applied to both). Default: 24. */\n size?: number | string;\n}\n\nexport function CalimeroLogo({\n size = 24,\n color,\n style,\n ...rest\n}: CalimeroLogoProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 193 193\"\n fill={color ?? 'currentColor'}\n style={style}\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n {...rest}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M13.5969 23.2235C63.4924 -4.81833 123.53 2.55678 148.374 10.0273C153.006 11.4201 155.606 16.2198 154.181 20.7478C152.757 25.2758 147.846 27.8173 143.214 26.4245C120.866 19.7045 66.3988 13.3369 22.3442 38.0961C21.3748 38.6409 20.8298 39.6384 20.8808 40.6778C22.5544 74.7376 40.6646 139.735 103.059 173.709C107.293 176.015 108.813 181.238 106.455 185.377C104.096 189.516 98.7523 191.002 94.5186 188.696C24.7767 150.721 5.18199 78.7606 3.35124 41.5008C2.98177 33.9812 6.96683 26.9496 13.5969 23.2235Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M180.214 22.5271C185.054 22.2785 189.183 25.9121 189.437 30.6429C192.776 92.7591 159.782 138.316 138.517 157.587C133.185 162.419 125.221 164.303 117.934 161.241C102.817 154.887 88.1835 141.52 76.3001 128.189C64.2403 114.66 54.1712 100.2 48.3006 90.492C45.8345 86.4139 47.2173 81.1537 51.3891 78.743C55.561 76.3323 60.9421 77.684 63.4082 81.7621C68.803 90.6832 78.2588 104.272 89.5315 116.919C100.981 129.763 113.488 140.698 124.866 145.48C125.179 145.612 125.851 145.671 126.586 145.006C145.206 128.132 174.903 87.1988 171.912 31.5431C171.657 26.8122 175.374 22.7756 180.214 22.5271Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M85.9137 55.4487C70.263 57.0264 57.2007 60.7039 50.4014 63.4262C45.9168 65.2218 40.7922 63.1236 38.9553 58.7397C37.1184 54.3559 39.2649 49.3464 43.7495 47.5508C52.2083 44.164 66.9167 40.1173 84.1135 38.3837C101.323 36.649 121.62 37.1693 140.947 43.4423C149.244 46.1351 155.088 53.9217 154.482 62.8728C153.225 81.429 144.514 100.403 127.158 122.145C124.177 125.88 118.663 126.546 114.842 123.631C111.021 120.717 110.341 115.327 113.322 111.592C129.481 91.3484 136.032 75.6017 136.971 61.7394C137.02 61.0029 136.547 60.0904 135.417 59.7238C119.18 54.4537 101.552 53.8722 85.9137 55.4487Z\"\n />\n </svg>\n );\n}\n\nexport default CalimeroLogo;\n","/**\n * Theme tokens for mero-react components.\n *\n * Defaults match the green palette used across Calimero apps (admin-dashboard,\n * tauri-app, app-registry). Pass a partial `MeroTheme` to `ConnectButton` or\n * `LoginModal` to override any token.\n */\n\nimport type { CSSProperties } from 'react';\n\nexport interface MeroTheme {\n /** Primary accent / CTA color */\n primary?: string;\n /** Primary accent on hover */\n primaryHover?: string;\n /** Text color rendered on top of `primary` (e.g. inside the Connect button when connected) */\n primaryText?: string;\n /** Main surface color (modal background, button background) */\n background?: string;\n /** Secondary surface color (input fields, info chips) */\n backgroundSecondary?: string;\n /** Tertiary surface color (subtle elevation) */\n backgroundTertiary?: string;\n /** Border color */\n border?: string;\n /** Primary text color */\n text?: string;\n /** Muted / secondary text color */\n textSecondary?: string;\n /** Error / danger color */\n error?: string;\n /** Modal backdrop color */\n overlay?: string;\n /** Border radius (any CSS length) */\n radius?: string;\n}\n\nexport type ResolvedMeroTheme = Required<MeroTheme>;\n\nexport const defaultMeroTheme: Readonly<ResolvedMeroTheme> = Object.freeze({\n primary: '#a5ff11',\n primaryHover: '#8ed40d',\n primaryText: '#0d1117',\n background: '#0d1117',\n backgroundSecondary: '#161b22',\n backgroundTertiary: '#1c2128',\n border: '#30363d',\n text: '#e6edf3',\n textSecondary: '#8b949e',\n error: '#ff6b6b',\n overlay: 'rgba(0, 0, 0, 0.75)',\n radius: '8px',\n});\n\n/**\n * Merge a partial theme with the defaults.\n *\n * Filtering rules — values that fall back to the default:\n * - `undefined` (the prop key wasn't set, or was set to `undefined`)\n * - empty string `''`\n * - whitespace-only strings (e.g. `' '`)\n *\n * These are dropped because they're invalid CSS and would produce\n * invisible elements (transparent backgrounds, missing borders, etc.).\n * If you genuinely want the browser default for a token, omit the key\n * from the theme prop rather than passing an empty string.\n *\n * Any other non-empty string is forwarded as-is — CSS syntax itself\n * is NOT validated.\n */\nexport function resolveMeroTheme(theme?: MeroTheme): ResolvedMeroTheme {\n if (!theme) return { ...defaultMeroTheme };\n const filtered = Object.fromEntries(\n Object.entries(theme).filter(\n ([, v]) => v !== undefined && typeof v === 'string' && v.trim() !== '',\n ),\n ) as Partial<MeroTheme>;\n return { ...defaultMeroTheme, ...filtered };\n}\n\n/**\n * Single source of truth mapping each `MeroTheme` token name to the CSS\n * custom-property name it surfaces as. Used by `themeToCssVars` to emit the\n * inline-style map and by component code (e.g. `LoginModal`) to read the\n * variable in inline styles via `var(--mero-*, fallback)`.\n *\n * Adding a new token? Add it here, in `MeroTheme`, and in `defaultMeroTheme`,\n * and the rest of the system picks it up automatically.\n */\nexport const MERO_CSS_VARS: Record<keyof MeroTheme, string> = {\n background: '--mero-bg',\n backgroundSecondary: '--mero-bg-secondary',\n backgroundTertiary: '--mero-bg-tertiary',\n text: '--mero-text',\n textSecondary: '--mero-text-secondary',\n primary: '--mero-accent',\n primaryHover: '--mero-accent-hover',\n primaryText: '--mero-on-primary',\n border: '--mero-border',\n error: '--mero-error',\n overlay: '--mero-overlay',\n radius: '--mero-radius',\n};\n\n/**\n * Build a `style` object that exposes a resolved theme as CSS variables, so\n * descendant CSS rules (e.g. those in `styles.css`) pick up the overrides.\n */\nexport function themeToCssVars(theme: ResolvedMeroTheme): CSSProperties {\n const vars: Record<string, string> = {};\n for (const key of Object.keys(MERO_CSS_VARS) as Array<keyof MeroTheme>) {\n vars[MERO_CSS_VARS[key]] = theme[key];\n }\n return vars as CSSProperties;\n}\n\n/**\n * Returns a `var(--mero-*, fallback)` reference for a theme token, suitable\n * for inline styles in portal-rendered components where descendant CSS\n * variables also need to support global `:root` overrides.\n */\nexport function cssVar(theme: ResolvedMeroTheme, key: keyof MeroTheme): string {\n return `var(${MERO_CSS_VARS[key]}, ${theme[key]})`;\n}\n","/**\n * LoginModal - Modal for connecting to a Calimero node\n *\n * A single section: the modal auto-discovers nodes on the well-known local\n * ports (see `nodeDiscovery`) and offers whatever is running as radio choices,\n * plus an always-available \"enter URL manually\" option. With nothing found it\n * falls straight through to manual URL entry.\n *\n * The old Local/Remote tabs are gone — the \"Local\" tab pointed at a hardcoded\n * default node (`node1.127.0.0.1.nip.io`) that doesn't resolve in most setups;\n * discovery + manual entry covers both cases properly.\n */\n\nimport { useMemo, useState, useEffect, useCallback, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { CalimeroLogo } from './CalimeroLogo';\nimport type { ConnectionType, CustomConnectionConfig } from '../types';\nimport {\n discoverLocalNodes,\n nodeEndpoint,\n DEFAULT_LOCAL_NODE_PORTS,\n} from '@calimero-network/mero-js';\nimport {\n cssVar,\n resolveMeroTheme,\n themeToCssVars,\n type MeroTheme,\n type ResolvedMeroTheme,\n} from '../theme';\n\n/** Sentinel selection value for the manual \"enter a URL\" option. */\nconst CUSTOM_SELECTION = '__custom__';\n\nexport interface LoginModalProps {\n /** Callback when user connects */\n onConnect: (url: string) => void;\n /** Callback when modal is closed */\n onClose: () => void;\n /**\n * @deprecated Ignored. The modal always shows node discovery + manual URL\n * entry; the old hardcoded-default \"Local\" view was removed. Kept so\n * existing call sites keep compiling.\n */\n connectionType?: ConnectionType | CustomConnectionConfig;\n /** Whether the modal is open */\n isOpen: boolean;\n /** Theme overrides — accepts any subset of `MeroTheme` tokens */\n theme?: MeroTheme;\n /**\n * Ports probed when discovering local nodes. Defaults to the well-known\n * Calimero dev ports (2428, 2429, 2528, 2529). Mostly an escape hatch for\n * non-standard setups and tests.\n */\n localNodePorts?: readonly number[];\n}\n\n/**\n * Validate URL format\n */\nfunction isValidUrl(urlString: string): boolean {\n if (!urlString || urlString.trim() === '') {\n return false;\n }\n\n try {\n const urlToTest =\n urlString.startsWith('http://') || urlString.startsWith('https://')\n ? urlString\n : `https://${urlString}`;\n\n const url = new URL(urlToTest);\n\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n return false;\n }\n\n if (!url.hostname) {\n return false;\n }\n\n const hostname = url.hostname;\n\n // Allow localhost\n if (hostname === 'localhost') {\n return true;\n }\n\n // Check for valid IP address\n const ipv4Regex = /^(\\d{1,3}\\.){3}\\d{1,3}$/;\n if (ipv4Regex.test(hostname)) {\n const octets = hostname.split('.').map(Number);\n return octets.every((octet) => octet >= 0 && octet <= 255);\n }\n\n // Check for valid domain name\n const domainRegex =\n /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n return domainRegex.test(hostname);\n } catch {\n return false;\n }\n}\n\n/** Strip the scheme for a compact node label (e.g. `localhost:2428`). */\nfunction displayNodeUrl(url: string): string {\n return url.replace(/^https?:\\/\\//, '').replace(/\\/+$/, '');\n}\n\n/**\n * Mix a color with transparent using CSS `color-mix`. Works for any valid CSS\n * color value (hex of any length, rgb(), hsl(), named colors, var(...)) — not\n * just 6-digit hex.\n */\nfunction tint(color: string, percent: number): string {\n return `color-mix(in srgb, ${color} ${percent}%, transparent)`;\n}\n\n/**\n * Build the inline-style map from a resolved theme. Each value is emitted as\n * `var(--mero-*, fallback)` so a global `:root { --mero-* }` rule reaches the\n * portal-rendered modal; the fallback ensures the modal still renders correctly\n * if the consumer hasn't imported `styles.css`.\n */\nfunction buildStyles(t: ResolvedMeroTheme) {\n const bg = cssVar(t, 'background');\n const bgSecondary = cssVar(t, 'backgroundSecondary');\n const text = cssVar(t, 'text');\n const textSecondary = cssVar(t, 'textSecondary');\n const accent = cssVar(t, 'primary');\n const onPrimary = cssVar(t, 'primaryText');\n const border = cssVar(t, 'border');\n const error = cssVar(t, 'error');\n const overlay = cssVar(t, 'overlay');\n const radius = cssVar(t, 'radius');\n\n const errorBg = tint(error, 10);\n const errorBorder = tint(error, 30);\n const accentGlow = tint(accent, 15);\n\n return {\n overlay: {\n position: 'fixed' as const,\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: overlay,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10000,\n padding: '1rem',\n animation: 'meroFadeIn 0.2s ease-out',\n },\n content: {\n backgroundColor: bg,\n borderRadius: radius,\n padding: '2rem',\n maxWidth: '420px',\n width: '100%',\n position: 'relative' as const,\n border: `1px solid ${border}`,\n boxShadow: `0 25px 50px -12px rgba(0, 0, 0, 0.6), 0 0 0 1px ${accentGlow}`,\n animation: 'meroSlideIn 0.25s ease-out',\n color: text,\n },\n closeButton: {\n position: 'absolute' as const,\n top: '0.75rem',\n right: '0.75rem',\n background: 'none',\n border: 'none',\n fontSize: '1.5rem',\n color: textSecondary,\n cursor: 'pointer',\n padding: '0.25rem',\n lineHeight: 1,\n },\n header: {\n display: 'flex',\n flexDirection: 'column' as const,\n alignItems: 'center',\n gap: '0.75rem',\n marginBottom: '1.5rem',\n },\n title: {\n fontSize: '1.25rem',\n fontWeight: 600,\n color: text,\n margin: 0,\n },\n info: {\n color: textSecondary,\n textAlign: 'center' as const,\n marginBottom: '1.5rem',\n fontSize: '0.875rem',\n },\n error: {\n color: error,\n backgroundColor: errorBg,\n border: `1px solid ${errorBorder}`,\n borderRadius: radius,\n padding: '0.75rem',\n marginBottom: '1rem',\n fontSize: '0.875rem',\n textAlign: 'center' as const,\n },\n radioList: {\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '0.5rem',\n marginBottom: '1rem',\n },\n radioItem: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.625rem',\n color: text,\n cursor: 'pointer',\n padding: '0.75rem 1rem',\n borderRadius: radius,\n border: `1px solid ${border}`,\n backgroundColor: bgSecondary,\n transition: 'all 0.15s ease',\n fontSize: '0.875rem',\n },\n radioItemActive: {\n // Override the full `border` shorthand (not just borderColor) so React\n // never has to mix shorthand + longhand on the same element.\n border: `1px solid ${accent}`,\n backgroundColor: accentGlow,\n color: text,\n },\n radioIndicator: {\n flexShrink: 0,\n width: '1rem',\n height: '1rem',\n borderRadius: '50%',\n border: `2px solid ${border}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n radioIndicatorActive: {\n border: `2px solid ${accent}`,\n },\n radioDot: {\n width: '0.5rem',\n height: '0.5rem',\n borderRadius: '50%',\n backgroundColor: accent,\n },\n nodeMeta: {\n marginLeft: 'auto',\n fontSize: '0.75rem',\n color: textSecondary,\n },\n input: {\n width: '100%',\n padding: '0.75rem 1rem',\n borderRadius: radius,\n border: `1px solid ${border}`,\n backgroundColor: bgSecondary,\n color: text,\n fontSize: '0.875rem',\n outline: 'none',\n marginBottom: '1rem',\n boxSizing: 'border-box' as const,\n },\n toolbar: {\n display: 'flex',\n justifyContent: 'center',\n marginBottom: '1rem',\n },\n rescan: {\n background: 'none',\n border: 'none',\n color: accent,\n cursor: 'pointer',\n fontSize: '0.8125rem',\n padding: '0.25rem 0.5rem',\n },\n buttonGroup: {\n display: 'flex',\n justifyContent: 'center',\n },\n button: {\n padding: '0.75rem 2rem',\n borderRadius: radius,\n border: 'none',\n fontSize: '0.875rem',\n fontWeight: 600,\n cursor: 'pointer',\n backgroundColor: accent,\n color: onPrimary,\n transition: 'all 0.15s ease',\n },\n buttonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n },\n loading: {\n display: 'flex',\n flexDirection: 'column' as const,\n alignItems: 'center',\n gap: '1rem',\n padding: '2rem',\n color: textSecondary,\n },\n discovering: {\n display: 'flex',\n flexDirection: 'column' as const,\n alignItems: 'center',\n gap: '0.75rem',\n padding: '1rem',\n color: textSecondary,\n fontSize: '0.875rem',\n },\n spinner: {\n width: '2rem',\n height: '2rem',\n border: `3px solid ${border}`,\n borderTopColor: accent,\n borderRadius: '50%',\n animation: 'meroSpin 1s linear infinite',\n },\n spinnerSmall: {\n width: '1.5rem',\n height: '1.5rem',\n border: `3px solid ${border}`,\n borderTopColor: accent,\n borderRadius: '50%',\n animation: 'meroSpin 1s linear infinite',\n },\n };\n}\n\n/**\n * LoginModal - Connection modal component\n */\nexport function LoginModal({\n onConnect,\n onClose,\n isOpen,\n theme,\n localNodePorts = DEFAULT_LOCAL_NODE_PORTS,\n}: LoginModalProps) {\n // `selected` is a discovered node URL or CUSTOM.\n const [selected, setSelected] = useState<string>(CUSTOM_SELECTION);\n const [discovered, setDiscovered] = useState<string[]>([]);\n const [discovering, setDiscovering] = useState<boolean>(false);\n const [customUrl, setCustomUrl] = useState<string>('');\n\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const resolved = useMemo(() => resolveMeroTheme(theme), [theme]);\n const styles = useMemo(() => buildStyles(resolved), [resolved]);\n // Only emit inline `--mero-*` variables when a `theme` prop was actually\n // provided. Without a prop, we let global `:root { --mero-* }` rules cascade\n // through to the portal-rendered modal (with `var()` fallbacks in buildStyles\n // covering the case where no global rules are loaded).\n const themeVars = useMemo(\n () => (theme ? themeToCssVars(resolved) : undefined),\n [theme, resolved],\n );\n\n // Load saved URL into the manual field\n useEffect(() => {\n const savedUrl = localStorage.getItem('mero:node_url');\n if (savedUrl) {\n setCustomUrl(savedUrl);\n }\n }, []);\n\n // Probe local ports whenever the modal is open; a bumpable nonce lets the\n // user trigger a re-scan.\n const [scanNonce, setScanNonce] = useState(0);\n const portsKey = useMemo(() => localNodePorts.join(','), [localNodePorts]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const controller = new AbortController();\n let active = true;\n setDiscovering(true);\n // Clear any prior results so a re-scan never shows stale nodes.\n setDiscovered([]);\n setError(null);\n\n discoverLocalNodes({ ports: localNodePorts, signal: controller.signal })\n .then((nodes) => {\n if (!active) return;\n setDiscovered(nodes);\n // Default to the first discovered node, else fall through to manual.\n setSelected(nodes.length > 0 ? nodes[0] : CUSTOM_SELECTION);\n })\n // discoverLocalNodes is designed never to reject; the catch is purely\n // defensive so a future change can't surface an unhandled rejection.\n .catch(() => {\n if (active) setSelected(CUSTOM_SELECTION);\n })\n .finally(() => {\n if (active) setDiscovering(false);\n });\n\n return () => {\n active = false;\n controller.abort();\n };\n // portsKey captures localNodePorts content; scanNonce forces a re-scan.\n }, [isOpen, portsKey, scanNonce]);\n\n const isCustom = selected === CUSTOM_SELECTION;\n const hasDiscovered = discovered.length > 0;\n\n // Whether the connect button can fire in the current state.\n const canConnect =\n !loading && !discovering && (isCustom ? isValidUrl(customUrl) : true);\n\n // Keep a ref so the input's keydown handler always sees current validity.\n const canConnectRef = useRef(canConnect);\n canConnectRef.current = canConnect;\n\n const handleConnect = useCallback(async () => {\n const usingDiscovered = selected !== CUSTOM_SELECTION;\n const targetUrl = usingDiscovered ? selected : customUrl;\n\n // Manual URLs must look valid before we try them.\n if (!usingDiscovered && !isValidUrl(targetUrl)) {\n return;\n }\n\n const normalizedUrl = targetUrl.replace(/\\/+$/, '');\n\n // A discovered node already answered a health check — connect straight away.\n if (usingDiscovered) {\n onConnect(normalizedUrl);\n return;\n }\n\n // Manually entered URLs are verified via is-authed.\n setLoading(true);\n setError(null);\n\n try {\n const response = await fetch(\n nodeEndpoint(normalizedUrl, 'admin-api/is-authed'),\n );\n\n if (response.ok || response.status === 401) {\n setLoading(false);\n onConnect(normalizedUrl);\n } else {\n throw new Error(`Connection failed: ${response.statusText}`);\n }\n } catch (err) {\n console.error('Connection failed:', err);\n setError('Failed to connect. Please check the URL and try again.');\n setLoading(false);\n }\n }, [selected, customUrl, onConnect]);\n\n if (!isOpen) {\n return null;\n }\n\n const showManualInput = isCustom;\n const renderRadio = (value: string, label: string, meta?: string) => {\n const active = selected === value;\n return (\n // Selection is driven solely by the radio input's `onChange` — clicking\n // anywhere on the wrapping label forwards to the input, and keyboard\n // users can tab to / arrow through the (visually hidden but focusable)\n // input. A label `onClick` here would double-fire `setSelected`.\n <label\n key={value}\n data-testid={`node-option-${value === CUSTOM_SELECTION ? 'custom' : displayNodeUrl(value)}`}\n style={{\n ...styles.radioItem,\n ...(active ? styles.radioItemActive : {}),\n }}\n >\n <input\n type=\"radio\"\n name=\"mero-node\"\n value={value}\n checked={active}\n onChange={() => setSelected(value)}\n style={{ position: 'absolute', opacity: 0 }}\n />\n <span\n style={{\n ...styles.radioIndicator,\n ...(active ? styles.radioIndicatorActive : {}),\n }}\n >\n {active && <span style={styles.radioDot} />}\n </span>\n {label}\n {meta && <span style={styles.nodeMeta}>{meta}</span>}\n </label>\n );\n };\n\n const renderNodeSection = () => {\n if (discovering) {\n return (\n <div style={styles.discovering} data-testid=\"node-discovering\">\n <div style={styles.spinnerSmall} />\n <p>Searching for local nodes...</p>\n </div>\n );\n }\n\n return (\n <>\n <p style={styles.info}>\n {hasDiscovered\n ? 'Select your Calimero node to continue.'\n : 'No local node found. Enter a node URL to continue.'}\n </p>\n\n {hasDiscovered && (\n <div\n style={styles.radioList}\n role=\"radiogroup\"\n aria-label=\"Available nodes\"\n >\n {discovered.map((url) =>\n renderRadio(url, displayNodeUrl(url), 'local'),\n )}\n {/* Manual entry is always offered alongside discovered nodes. */}\n {renderRadio(CUSTOM_SELECTION, 'Enter node URL manually')}\n </div>\n )}\n\n {showManualInput && (\n <input\n type=\"text\"\n value={customUrl}\n onChange={(e) => setCustomUrl(e.target.value)}\n placeholder=\"https://your-node-url.calimero.network\"\n style={styles.input}\n data-testid=\"node-url-input\"\n autoFocus={!hasDiscovered}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && canConnectRef.current) {\n handleConnect();\n }\n }}\n />\n )}\n\n <div style={styles.toolbar}>\n <button\n type=\"button\"\n style={styles.rescan}\n onClick={() => setScanNonce((n) => n + 1)}\n data-testid=\"rescan-button\"\n >\n ↻ Rescan local nodes\n </button>\n </div>\n </>\n );\n };\n\n const modalContent = (\n <>\n <style>{`\n @keyframes meroSpin { to { transform: rotate(360deg); } }\n @keyframes meroFadeIn { from { opacity: 0; } to { opacity: 1; } }\n @keyframes meroSlideIn { from { transform: translateY(-12px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }\n `}</style>\n <div style={{ ...themeVars, ...styles.overlay }} onClick={onClose}>\n <div style={styles.content} onClick={(e) => e.stopPropagation()}>\n <button style={styles.closeButton} onClick={onClose} aria-label=\"Close\">\n &times;\n </button>\n\n <div style={styles.header}>\n <CalimeroLogo size={44} color={cssVar(resolved, 'primary')} />\n <h1 style={styles.title}>Connect to Calimero</h1>\n </div>\n\n {loading ? (\n <div style={styles.loading}>\n <p>Connecting to node...</p>\n <div style={styles.spinner} />\n </div>\n ) : (\n <>\n {error && <p style={styles.error}>{error}</p>}\n\n {renderNodeSection()}\n\n <div style={styles.buttonGroup}>\n <button\n onClick={handleConnect}\n disabled={!canConnect}\n style={{\n ...styles.button,\n ...(!canConnect ? styles.buttonDisabled : {}),\n }}\n data-testid=\"connect-button\"\n >\n Connect\n </button>\n </div>\n </>\n )}\n </div>\n </div>\n </>\n );\n\n return createPortal(modalContent, document.body);\n}\n\nexport default LoginModal;\n","/**\n * ConnectButton - A button component for connecting to Calimero\n *\n * Shows connection status and provides login/logout functionality.\n * Includes built-in LoginModal for node selection.\n */\n\nimport React, { useState, useEffect, useRef, useMemo } from 'react';\nimport { useMero } from '../context';\nimport { LoginModal } from './LoginModal';\nimport { CalimeroLogo } from './CalimeroLogo';\nimport type { ConnectionType, CustomConnectionConfig } from '../types';\nimport { ConnectionType as ConnectionTypeEnum } from '../types';\nimport { resolveMeroTheme, themeToCssVars, type MeroTheme } from '../theme';\n\nexport interface ConnectButtonProps {\n /**\n * Connection behaviour. `Custom` (object form) connects straight to the\n * given URL, skipping the modal; every other value opens the LoginModal,\n * which always shows node discovery + manual URL entry.\n */\n connectionType?: ConnectionType | CustomConnectionConfig;\n /** Custom class name */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n /** Theme overrides — accepts any subset of `MeroTheme` tokens */\n theme?: MeroTheme;\n /**\n * Render only the Calimero logo, no text. Produces a square 40×40 icon\n * button. The label is still announced to screen readers via `aria-label`.\n * Default: false.\n */\n logoOnly?: boolean;\n /**\n * Override the default labels per state. A bare string is shorthand for\n * `{ connect: '<string>' }`. The connected and reconnecting states keep\n * their defaults unless explicitly overridden.\n */\n label?:\n | string\n | { connect?: string; connected?: string; reconnecting?: string };\n}\n\n/**\n * ConnectButton - Displays connection status and handles login/logout\n */\nexport function ConnectButton({\n connectionType = ConnectionTypeEnum.Remote,\n className,\n style,\n theme,\n logoOnly = false,\n label,\n}: ConnectButtonProps) {\n const { isAuthenticated, connectToNode, logout, nodeUrl, isOnline } = useMero();\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [isModalOpen, setIsModalOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Resolve once. Inline CSS variables are only emitted when a theme prop is\n // provided — otherwise we leave the cascade alone so global `:root { --mero-* }`\n // overrides take effect.\n const resolvedTheme = useMemo(\n () => (theme ? resolveMeroTheme(theme) : null),\n [theme],\n );\n const themeVars = useMemo(\n () => (resolvedTheme ? themeToCssVars(resolvedTheme) : undefined),\n [resolvedTheme],\n );\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsDropdownOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const dashboardUrl = useMemo(() => {\n if (!isAuthenticated || !nodeUrl) return '#';\n return new URL('admin-dashboard/', nodeUrl).toString();\n }, [isAuthenticated, nodeUrl]);\n\n const labels = useMemo(() => {\n const overrides = typeof label === 'string' ? { connect: label } : label;\n return {\n connect: overrides?.connect ?? 'Connect',\n connected: overrides?.connected ?? 'Connected',\n reconnecting: overrides?.reconnecting ?? 'Reconnecting...',\n };\n }, [label]);\n\n const buttonClassName = logoOnly ? 'mero-logo-only' : '';\n\n const handleConnect = () => {\n // If Custom type with URL, connect directly\n if (\n typeof connectionType === 'object' &&\n connectionType.type === ConnectionTypeEnum.Custom\n ) {\n connectToNode(connectionType.url);\n return;\n }\n\n // Otherwise, open modal\n setIsModalOpen(true);\n };\n\n const handleModalConnect = (url: string) => {\n setIsModalOpen(false);\n connectToNode(url);\n };\n\n // Reconnecting state\n if (isAuthenticated && !isOnline) {\n return (\n <div\n className=\"mero-connect-container\"\n style={{ ...themeVars, display: 'inline-block' }}\n >\n <button\n className={['mero-connect-button', 'mero-reconnecting', buttonClassName, className].filter(Boolean).join(' ')}\n style={style}\n disabled\n aria-label={labels.reconnecting}\n title={logoOnly ? labels.reconnecting : undefined}\n >\n <CalimeroLogo size={18} className=\"mero-logo\" />\n {!logoOnly && labels.reconnecting}\n </button>\n </div>\n );\n }\n\n // Connected state\n if (isAuthenticated) {\n return (\n <div\n ref={dropdownRef}\n className=\"mero-connect-container\"\n style={{ ...themeVars, position: 'relative', display: 'inline-block' }}\n >\n <button\n className={['mero-connect-button', 'mero-connected', buttonClassName, className].filter(Boolean).join(' ')}\n style={style}\n onClick={() => setIsDropdownOpen((prev) => !prev)}\n aria-label={labels.connected}\n title={logoOnly ? labels.connected : undefined}\n >\n <CalimeroLogo size={18} className=\"mero-logo\" />\n {!logoOnly && labels.connected}\n </button>\n {isDropdownOpen && (\n <div className=\"mero-dropdown\">\n <div className=\"mero-dropdown-info\" title={nodeUrl || ''}>\n {nodeUrl}\n </div>\n <a\n href={dashboardUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mero-dropdown-item\"\n >\n Dashboard\n </a>\n <button\n className=\"mero-dropdown-item\"\n onClick={() => {\n setIsDropdownOpen(false);\n logout();\n }}\n >\n Log out\n </button>\n </div>\n )}\n </div>\n );\n }\n\n // Disconnected state\n return (\n <div\n className=\"mero-connect-container\"\n style={{ ...themeVars, display: 'inline-block' }}\n >\n <button\n className={['mero-connect-button', buttonClassName, className].filter(Boolean).join(' ')}\n style={style}\n onClick={handleConnect}\n aria-label={labels.connect}\n title={logoOnly ? labels.connect : undefined}\n >\n <CalimeroLogo size={18} className=\"mero-logo\" />\n {!logoOnly && labels.connect}\n </button>\n <LoginModal\n isOpen={isModalOpen}\n onConnect={handleModalConnect}\n onClose={() => setIsModalOpen(false)}\n theme={resolvedTheme ?? theme}\n />\n </div>\n );\n}\n\nexport default ConnectButton;\n","/**\n * Minimal Base58 (Bitcoin alphabet) decoder.\n *\n * Blob ids come back from the admin API Base58-encoded, while a namespace's\n * `appKey` is a hex string, so comparing \"what's installed\" to \"what the group\n * targets\" needs one side converted. Decoding Base58 to canonical lowercase hex\n * is the smaller, encoding-agnostic conversion.\n */\n\nconst ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\n/**\n * Decode a Base58 string to a lowercase hex string (no `0x` prefix). Leading\n * `1` characters map to leading zero bytes, so the byte width is preserved.\n * Throws on any character outside the Base58 alphabet.\n */\nexport function base58ToHex(input: string): string {\n const bytes: number[] = [];\n for (const char of input) {\n let carry = ALPHABET.indexOf(char);\n if (carry === -1) throw new Error(`invalid base58 character: ${char}`);\n for (let i = 0; i < bytes.length; i++) {\n carry += bytes[i] * 58;\n bytes[i] = carry & 0xff;\n carry >>= 8;\n }\n while (carry > 0) {\n bytes.push(carry & 0xff);\n carry >>= 8;\n }\n }\n for (let k = 0; k < input.length && input[k] === '1'; k++) bytes.push(0);\n return bytes\n .reverse()\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n","import { useState, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { compareSemver } from '@calimero-network/mero-js';\nimport { useMero } from '../context';\nimport { base58ToHex } from '../utils/base58';\nimport type {\n Codec,\n EphemeralClient,\n Context,\n CreateContextRequest,\n CreateGroupInvitationRequest,\n CreateGroupInNamespaceRequest,\n CreateNamespaceInvitationRequest,\n CreateNamespaceInvitationResponseData,\n CreateNamespaceRequest,\n CreateRecursiveInvitationResponseData,\n DeleteGroupRequest,\n DeleteNamespaceRequest,\n DetachContextFromGroupRequest,\n GroupContextEntry,\n GroupInfo,\n GroupUpgradeStatusResponseData,\n MetadataRecord,\n JoinGroupRequest,\n JoinNamespaceRequest,\n ListGroupMembersResponseData,\n Namespace,\n NamespaceIdentity,\n NodeIdentity,\n ReparentGroupRequest,\n AddGroupMembersRequest,\n RemoveGroupMembersRequest,\n RetryGroupUpgradeRequest,\n SetDefaultCapabilitiesRequest,\n SetMetadataRequest,\n SetSubgroupVisibilityRequest,\n SetTeeAdmissionPolicyRequest,\n SubgroupEntry,\n SyncGroupRequest,\n SseEventData,\n UpdateMemberRoleRequest,\n UpgradeGroupRequest,\n ResyncContextRequest,\n MigrationStatus,\n MemberMigrationStatusEntry,\n MigrationStatusRollup,\n MigrateMyEntriesSummary,\n AppVersionChangedEvent,\n GroupMembershipEventData,\n GroupMigrationEventData,\n} from '@calimero-network/mero-js';\nimport type {\n ApplicationContextRecord,\n ContextDiscoveryOptions,\n ContextDiscoveryState,\n} from '../types';\n\nexport { useMero } from '../context';\n\n/**\n * The presence types come straight from `mero-js` now — `Codec` and\n * `EphemeralEntry` are its own declarations, and `EphemeralClient` is the type\n * of the class behind `mero.ephemeral`, so a drift between what this hook\n * assumes and what the SDK does is a compile error rather than a runtime\n * surprise.\n *\n * Re-exported under the same names this package has always exported, so\n * consumers importing `Codec` / `EphemeralEntry` / `EphemeralClient` from\n * `@calimero-network/mero-react` keep compiling — they now simply get the\n * nominal `mero-js` types instead of structural copies of them.\n *\n * On `EphemeralEntry.ageMs`: it is ABSENT on a live delta and PRESENT on a\n * replayed seed entry, reporting how stale that entry already was (bounded by\n * the node's presence TTL). Absent and `0` are different — a `0` means \"the\n * node replayed this and it is brand new\", not \"no age information\". Read it\n * with `?? 0`, never with a truthiness check.\n */\nexport type { Codec, EphemeralEntry, EphemeralClient } from '@calimero-network/mero-js';\n\nexport interface UseEphemeralOptions<T> {\n /** Encoding for the presence slice. Defaults to JSON. */\n codec?: Codec<T>;\n /** Base value for the first `setPresence` merge. */\n initial?: T;\n /** Minimum ms between publishes. Trailing edge — the latest value wins. */\n throttleMs?: number;\n /** Include your own echoed presence in `peers`. Default false. */\n includeSelf?: boolean;\n}\n\n/** Shape returned by {@link useEphemeral}. */\nexport interface UseEphemeralResult<T> {\n peers: Map<string, T>;\n setPresence: (partial: Partial<T>) => void;\n ageOf: (author: string) => number | undefined;\n error: Error | null;\n}\n\n/**\n * Which asynchronous producer currently owns the latched error slot.\n *\n * Only genuinely ASYNCHRONOUS failures are latched — an event happened once,\n * in the past, and nothing about the current render can re-derive it. Anything\n * that is a standing property of the current props/client (notably \"this\n * client has no `mero.ephemeral` surface\") is NOT latched: it is recomputed\n * every render, so it can neither go stale nor be accidentally cleared.\n *\n * The slot is shared, so each producer only clears what it itself raised.\n */\ntype ErrorSource = 'identity' | 'publish';\n\n/**\n * The latched async error, tagged with its producer AND with the context it\n * belongs to.\n *\n * `contextKey` is what makes cross-context leaks structurally impossible\n * rather than a matter of remembering to clear: a write whose key is no longer\n * the current context is dropped on the way in (a publish that was in flight\n * across a context switch), and a latch whose key no longer matches is not\n * read on the way out. Neither path depends on some other effect having run a\n * clear first.\n */\ninterface LatchedEphemeralError {\n contextKey: string | null;\n source: ErrorSource;\n error: Error;\n}\n\nconst NO_EPHEMERAL_SURFACE_MESSAGE =\n 'useEphemeral: this client has no `mero.ephemeral` surface. Ephemeral ' +\n 'presence requires @calimero-network/mero-js >= 9.1.0; upgrade the ' +\n 'installed @calimero-network/mero-js (and any lockfile pin) to use it.';\n\nconst COULD_NOT_RESOLVE_IDENTITY_MESSAGE =\n 'useEphemeral: could not resolve a local context identity, so your own ' +\n 'presence cannot be filtered out. Pass includeSelf: true to accept this.';\n\n/**\n * How long after the last replayed entry (one carrying `ageMs`) the replay\n * window stays open before `peers` is reconciled down to what the replay\n * contained. Long enough to absorb a replay burst split across several SSE\n * frames/ticks, short enough that a swept peer does not linger.\n */\nconst REPLAY_RECONCILE_MS = 50;\n\n/**\n * Observe and publish ephemeral presence (cursors, typing, online) for a\n * context.\n *\n * ONE read path: the subscription. When a client subscribes, the node replays\n * that context's current presence to that connection as ordinary entries\n * before the live deltas start, so seeding and updating share a single shape\n * ({@link EphemeralEntry}) and a reconnect — `SseClient` auto-reconnects and\n * re-subscribes — re-seeds itself. There is no snapshot fetch and no\n * client-side reconciliation pass.\n *\n * Freshness is computed entirely from local clock deltas: a replayed entry is\n * current as of `Date.now() - ageMs`, a live delta as of `Date.now()`. No\n * cross-machine clock comparison is ever performed.\n *\n * No client-side TTL or heartbeat: the node sweeps at 7s and emits removals,\n * and re-publishes on your behalf every 2.5s. A replay is treated as\n * AUTHORITATIVE — see the replay-reconcile pass in the read effect — so a peer\n * swept while the SSE connection was down does not survive the reconnect.\n *\n * `error` is derived, not accumulated: standing conditions (no `ephemeral`\n * surface) are recomputed every render, one-shot async failures are latched\n * keyed by the context they happened in, and whether a latched failure is even\n * relevant (an unresolved identity when `includeSelf` is true) is decided at\n * read time. Nothing survives a context switch.\n */\nexport function useEphemeral<T>(\n contextId: string | null,\n options: UseEphemeralOptions<T> = {},\n): UseEphemeralResult<T> {\n const { includeSelf = false } = options;\n const { mero } = useMero();\n // Cast: the installed mero-js's `MeroJs` type predates `ephemeral` (see\n // `EphemeralClient` above), though it exists at runtime.\n const ephemeral = mero\n ? ((mero as unknown as { ephemeral?: EphemeralClient }).ephemeral ?? null)\n : null;\n\n const [peers, setPeers] = useState<Map<string, T>>(new Map());\n // The one latched async error (see `LatchedEphemeralError`). Not read\n // directly — `error` below derives what is actually reported from it.\n const [latchedError, setLatchedError] = useState<LatchedEphemeralError | null>(null);\n // The context the CURRENT render targets. Read by `setSourceError` so a\n // callback that resolves after a context switch can tell that its result is\n // no longer wanted without closing over anything but its own captured key.\n const contextKeyRef = useRef<string | null>(contextId);\n contextKeyRef.current = contextId;\n // `key` is the contextId captured when the failing operation was STARTED,\n // not when it settled. A late write from a context we have already left is\n // dropped here rather than being written and then hopefully cleared.\n const setSourceError = useCallback(\n (source: ErrorSource, err: Error, key: string | null) => {\n if (key !== contextKeyRef.current) return;\n setLatchedError({ contextKey: key, source, error: err });\n },\n [],\n );\n const clearSourceError = useCallback((source: ErrorSource, key: string | null) => {\n setLatchedError(prev =>\n prev && prev.source === source && prev.contextKey === key ? null : prev,\n );\n }, []);\n\n // DERIVED, never latched: \"this client has no `mero.ephemeral` surface\" is a\n // standing property of the current client, not an event. Recomputing it every\n // render is what makes it impossible to (a) leave it set after an upgraded\n // client arrives or (b) lose it to some other effect's clear — a context\n // switch, for instance, cannot hide a client that still has no surface.\n // Memoised only so the Error identity is stable while the condition holds.\n const surfaceError = useMemo(\n () => (mero && !ephemeral ? new Error(NO_EPHEMERAL_SURFACE_MESSAGE) : null),\n [mero, ephemeral],\n );\n\n // A latch is reported only if it belongs to the context being rendered, and\n // only if it is still MEANINGFUL: an unresolved local identity is an error\n // solely because self-filtering needs it, so opting into `includeSelf` makes\n // it a non-event — decided here, at read time, rather than by racing an\n // effect to clear it.\n const error =\n surfaceError ??\n (latchedError &&\n latchedError.contextKey === contextId &&\n !(latchedError.source === 'identity' && includeSelf)\n ? latchedError.error\n : null);\n // author -> local ms timestamp the entry is considered current as of.\n const receivedAtRef = useRef<Map<string, number>>(new Map());\n // `codec` and `initial` are held in refs, never in a dependency array:\n // `jsonCodec()` is a FACTORY, so `{ codec: jsonCodec() }` at the call site is\n // a fresh identity every render. As a dep it would tear down and re-create\n // the subscription on every render — and since every applied entry sets a\n // new Map (a new render), that is an unbounded resubscribe storm, each\n // resubscribe pulling a fresh presence replay. A codec swapped mid-flight is\n // not a real use case.\n const codecRef = useRef<Codec<T> | undefined>(options.codec);\n codecRef.current = options.codec;\n const initialRef = useRef<T | undefined>(options.initial);\n initialRef.current = options.initial;\n // This node's own context member key (device-level), resolved async. Never\n // compare this against an account id — that comparison silently never\n // matches, which is the classic self-echo bug.\n const selfRef = useRef<string | null>(null);\n const lastLocalRef = useRef<T | undefined>(options.initial);\n const pendingRef = useRef<T | undefined>(undefined);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n // Seeded to the mount time (not 0) so an isolated call shortly after mount\n // is correctly treated as part of the initial \"burst\" and trailing-edge\n // throttled, rather than bypassing the throttle because it looks like it's\n // arriving long after a (nonexistent) previous publish.\n const lastSentAtRef = useRef<number>(Date.now());\n // Open replay window: the authors seen since a replayed entry (one carrying\n // `ageMs`) last arrived. Null when no replay is in progress.\n const replaySeenRef = useRef<Set<string> | null>(null);\n const replayTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const ageOf = useCallback((author: string): number | undefined => {\n const at = receivedAtRef.current.get(author);\n return at === undefined ? undefined : Date.now() - at;\n }, []);\n\n // Clear ALL per-context state synchronously the instant the target context\n // changes. Read state, so a previous context's peers don't keep rendering\n // until the new context's replay arrives — and write state, because a\n // queued publish would otherwise fire into the PREVIOUS context (its\n // `setTimeout` closure captured the old `publish`), and `lastLocalRef` would\n // shallow-merge the old context's fields into the first slice published in\n // the new one. Presence is app-defined data (cursor position, typing target),\n // so both are genuine cross-context writes, not cosmetic leaks.\n //\n // The latched error is dropped here as well, but purely as housekeeping (it\n // is what makes A -> B -> A not resurrect A's old failure). Correctness does\n // not rest on it: the latch carries its own `contextKey`, so an error from a\n // context we have left is neither written nor read regardless of whether this\n // effect ran. The standing surface condition is untouched — it is derived, so\n // it re-reports itself on the very next render if it is still true.\n useEffect(() => {\n setPeers(new Map());\n receivedAtRef.current = new Map();\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n if (replayTimerRef.current) {\n clearTimeout(replayTimerRef.current);\n replayTimerRef.current = null;\n }\n replaySeenRef.current = null;\n pendingRef.current = undefined;\n lastLocalRef.current = initialRef.current;\n selfRef.current = null;\n setLatchedError(null);\n }, [contextId]);\n\n // Resolve THIS node's context member key — the same value the node stamps\n // as `author` on ephemeral entries.\n useEffect(() => {\n if (!mero || !contextId) return;\n // Captured at START. Everything this effect reports is tagged with it, so\n // a slow lookup that lands after a context switch cannot write into the\n // context we switched to.\n const key = contextId;\n let cancelled = false;\n mero.admin\n .getContextIdentitiesOwned(contextId)\n .then(res => {\n if (cancelled) return;\n const self = res.identities?.[0] ?? null;\n selfRef.current = self;\n if (!self) {\n // Latched unconditionally — `includeSelf` is NOT consulted here.\n // Whether an unresolved identity matters is a question about the\n // CURRENT props, so it is answered where `error` is derived; asking\n // it here is what previously left the error stranded when\n // `includeSelf` flipped to true while resolution still failed.\n setSourceError('identity', new Error(COULD_NOT_RESOLVE_IDENTITY_MESSAGE), key);\n return;\n }\n // A later run of this effect (contextId change, includeSelf toggle)\n // resolved a self identity where an earlier run didn't — clear the\n // \"could not resolve\" error this effect itself raised.\n clearSourceError('identity', key);\n // Ordering race: the identity lookup and the subscription's presence\n // replay land independently, so a self entry can already be seeded in\n // `peers`. Retroactively drop it now that we know who \"self\" is.\n if (!includeSelf) {\n receivedAtRef.current.delete(self);\n setPeers(prev => {\n if (!prev.has(self)) return prev;\n const next = new Map(prev);\n next.delete(self);\n return next;\n });\n }\n })\n .catch((err: unknown) => {\n if (!cancelled) {\n setSourceError('identity', toError(err), key);\n }\n });\n return () => { cancelled = true; };\n // `mero` itself is a dep on purpose: a real MeroProvider memoizes its\n // context value, so `mero` only changes identity when the underlying\n // client is actually replaced (e.g. `allowedNodeUrls` changes) — and\n // that replacement is exactly when this effect must re-resolve the\n // local identity against the new client. Keying on presence alone\n // (`Boolean(mero)`) would silently keep resolving against a closed,\n // stale client instance.\n }, [mero, contextId, includeSelf, setSourceError, clearSourceError]);\n\n // The single read path. Subscribing makes the node replay this context's\n // current presence to this connection as ordinary entries, then stream live\n // deltas — so this one handler both seeds and updates, and an SSE reconnect\n // (which re-subscribes) re-seeds without any extra machinery.\n //\n // A REPLAY IS AUTHORITATIVE. The node replays exactly who is present right\n // now; anything we still hold that the replay does not mention is gone.\n // Without reconciling against it, a peer swept while the connection was down\n // is a permanent ghost: its removal event was delivered to nobody, and the\n // replay — which lists only survivors — will never mention it again. That\n // sweep happens inside `SseClient`'s auto-reconnect, so it does NOT re-run\n // this effect; reconciliation has to be driven by the entries themselves,\n // which is why it keys off `ageMs` (present only on replayed entries) rather\n // than off subscribe/unsubscribe. Clearing `peers` eagerly on subscribe would\n // also miss the reconnect case entirely — and would blank the UI on every\n // `includeSelf` toggle.\n //\n // The window closes `REPLAY_RECONCILE_MS` after the last replayed entry, and\n // live entries arriving while it is open count as present too, so a peer that\n // publishes mid-replay is never swept. A replayed entry that somehow arrives\n // after the window closed re-adds its author immediately — the failure mode\n // is a flicker, never a resurrected ghost or a permanent loss.\n useEffect(() => {\n if (!ephemeral || !contextId) return;\n\n const closeReplayWindow = () => {\n replayTimerRef.current = null;\n const seen = replaySeenRef.current;\n replaySeenRef.current = null;\n if (!seen) return;\n setPeers(prev => {\n let next: Map<string, T> | null = null;\n for (const author of prev.keys()) {\n if (seen.has(author)) continue;\n if (!next) next = new Map(prev);\n next.delete(author);\n receivedAtRef.current.delete(author);\n }\n return next ?? prev;\n });\n };\n\n const unsubscribe = ephemeral.subscribe<T>(\n contextId,\n entry => {\n const { author, state } = entry;\n if (entry.ageMs !== undefined) {\n // A replayed entry: (re)open the reconcile window and debounce its\n // close, so a replay burst split across frames counts as one replay.\n if (!replaySeenRef.current) replaySeenRef.current = new Set();\n if (replayTimerRef.current) clearTimeout(replayTimerRef.current);\n replayTimerRef.current = setTimeout(closeReplayWindow, REPLAY_RECONCILE_MS);\n }\n if (entry.removed || state === undefined) {\n replaySeenRef.current?.delete(author);\n receivedAtRef.current.delete(author);\n setPeers(prev => {\n if (!prev.has(author)) return prev;\n const next = new Map(prev);\n next.delete(author);\n return next;\n });\n return;\n }\n if (!includeSelf && author === selfRef.current) return;\n replaySeenRef.current?.add(author);\n // `ageMs` is absent on a live delta (current as of now) and present on\n // a replayed entry (current as of `now - ageMs`). `?? 0` — never a\n // truthiness test: an `ageMs` of 0 is a real, meaningful value.\n receivedAtRef.current.set(author, Date.now() - (entry.ageMs ?? 0));\n setPeers(prev => new Map(prev).set(author, state));\n },\n codecRef.current,\n );\n\n return () => {\n if (replayTimerRef.current) {\n clearTimeout(replayTimerRef.current);\n replayTimerRef.current = null;\n }\n replaySeenRef.current = null;\n unsubscribe();\n };\n // `ephemeral` itself is a dep on purpose — see the identity-resolution\n // effect above. A replaced client must re-subscribe against the new\n // client, not keep reading/writing through the old (possibly closed)\n // one. `codec` is deliberately NOT a dep — see `codecRef`.\n }, [ephemeral, contextId, includeSelf]);\n\n const publish = useCallback((value: T) => {\n if (!ephemeral || !contextId) return;\n // Captured at START, like the identity lookup's `key`: `ephemeral.set` is\n // not cancellable, so a rejection can land long after a context switch.\n // Tagging the write with the context it was issued for is what keeps that\n // failure out of the new context's error slot.\n const key = contextId;\n lastSentAtRef.current = Date.now();\n void ephemeral.set<T>(key, value, codecRef.current).then(\n () => clearSourceError('publish', key),\n (err: unknown) => setSourceError('publish', toError(err), key),\n );\n }, [ephemeral, contextId, setSourceError, clearSourceError]);\n\n /**\n * Publish your own presence.\n *\n * SHALLOW merge over the last locally-set value (starting from `initial`):\n * presence is one slot per author, so fields are not independent channels\n * and a bare replace would silently drop whatever you did not mention.\n * Nested objects are replaced wholesale, not deep-merged —\n * `setPresence({ cursor: { x: 1 } })` DROPS `cursor.y` if it was set\n * separately.\n *\n * Throttled on the trailing edge: rapid calls collapse into one publish\n * carrying the newest value, never the oldest queued one.\n */\n const setPresence = useCallback((partial: Partial<T>) => {\n const next = { ...(lastLocalRef.current ?? ({} as T)), ...partial } as T;\n lastLocalRef.current = next;\n\n const throttleMs = options.throttleMs ?? 30;\n if (throttleMs <= 0) {\n publish(next);\n return;\n }\n\n pendingRef.current = next;\n if (timerRef.current) return;\n const elapsed = Date.now() - lastSentAtRef.current;\n const delay = Math.max(throttleMs - elapsed, 0);\n timerRef.current = setTimeout(() => {\n timerRef.current = null;\n const queued = pendingRef.current;\n pendingRef.current = undefined;\n if (queued !== undefined) publish(queued);\n }, delay);\n }, [publish, options.throttleMs]);\n\n // Cancel a queued publish on unmount.\n useEffect(() => () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n }, []);\n\n return { peers, setPresence, ageOf, error };\n}\n\n/**\n * Shape accepted by the metadata-setter hooks — re-exported from mero-js so\n * callers have one canonical type. A `set*Metadata` call **replaces the whole\n * record**: `data` defaults to `{}` and wholly replaces the stored map; omit\n * `name` to keep the current name.\n */\nexport type SetMetadataInput = SetMetadataRequest;\n\nfunction toError(err: unknown): Error {\n return err instanceof Error ? err : new Error(String(err));\n}\n\nfunction mapApplicationContexts(contexts: Context[]): ApplicationContextRecord[] {\n return contexts.map((context) => ({\n contextId: context.id,\n applicationId: context.applicationId,\n }));\n}\n\nfunction useMountedRef() {\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n return mountedRef;\n}\n\nfunction useAsyncMutation() {\n const mountedRef = useMountedRef();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const run = useCallback(\n async <T,>(action: () => Promise<T>): Promise<T | null> => {\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n return await action();\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current) {\n setError(errorValue);\n }\n return null;\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n },\n [mountedRef],\n );\n\n return { loading, error, run, setError };\n}\n\n/**\n * Generic read resource: fetch + loading/error/data with a latest-request-wins\n * guard. `fetcher` is null when the read is disabled (missing args) — the\n * resource resets to `initialValue` and nothing is fetched. `deps` drive both\n * the refetch and a synchronous reset when they change, so a slow earlier\n * request can never overwrite a newer one. This is the staleness guard the read\n * hooks used to hand-roll (and mostly lacked), now in one place.\n */\nfunction useAsyncResource<T>(\n fetcher: (() => Promise<T>) | null,\n initialValue: T,\n deps: readonly unknown[],\n): { data: T; loading: boolean; error: Error | null; refetch: () => Promise<void> } {\n const mountedRef = useMountedRef();\n const [data, setData] = useState<T>(initialValue);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const reqRef = useRef(0);\n\n // fetcherRef is refreshed every render so refetch() always calls the latest\n // closure; initialRef captures the (per-hook constant) initial value once.\n // Neither is a dependency — adding them would break latest-request-wins.\n const fetcherRef = useRef(fetcher);\n fetcherRef.current = fetcher;\n const initialRef = useRef(initialValue);\n\n const refetch = useCallback(async () => {\n const seq = ++reqRef.current;\n const fn = fetcherRef.current;\n if (!fn) {\n if (mountedRef.current && seq === reqRef.current) {\n setData(initialRef.current);\n setError(null);\n setLoading(false);\n }\n return;\n }\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n try {\n const result = await fn();\n if (mountedRef.current && seq === reqRef.current) setData(result);\n } catch (err) {\n if (mountedRef.current && seq === reqRef.current) setError(toError(err));\n } finally {\n if (mountedRef.current && seq === reqRef.current) setLoading(false);\n }\n }, deps);\n\n // Invalidate any in-flight request and clear stale data synchronously when\n // the inputs change, so a pending response for old deps can't land later.\n useEffect(() => {\n reqRef.current += 1;\n setData(initialRef.current);\n setError(null);\n }, deps);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n return { data, loading, error, refetch };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction extractAliasContextId(value: unknown): string | null {\n if (typeof value === 'string') {\n return value;\n }\n\n if (!value || typeof value !== 'object') {\n return null;\n }\n\n if ('value' in value && typeof value.value === 'string') {\n return value.value;\n }\n\n if ('contextId' in value && typeof value.contextId === 'string') {\n return value.contextId;\n }\n\n return null;\n}\n\n/**\n * Execute RPC methods against a context.\n * Tracks loading/error state. Unmount-safe.\n */\nexport function useExecute(contextId: string | null, executorId: string | null) {\n const { mero } = useMero();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => { mountedRef.current = false; };\n }, []);\n\n const execute = useCallback(\n async <T = unknown>(method: string, params?: Record<string, unknown>): Promise<T | null> => {\n if (!mero || !contextId || !executorId) {\n if (mountedRef.current) setError(new Error('Not connected'));\n return null;\n }\n\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n try {\n const result = await mero.rpc.execute<T>({\n contextId,\n method,\n argsJson: params,\n executorPublicKey: executorId,\n });\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n if (mountedRef.current) setError(e);\n return null;\n } finally {\n if (mountedRef.current) setLoading(false);\n }\n },\n [mero, contextId, executorId],\n );\n\n return { execute, loading, error };\n}\n\n/** Event payload delivered to a `useSubscription` callback. */\nexport type SubscriptionEventData =\n | SseEventData\n | GroupMembershipEventData\n | GroupMigrationEventData;\n\n/** Ids to subscribe to. Either can be omitted, but not both. */\nexport interface SubscriptionInput {\n contextIds?: string[];\n groupIds?: string[];\n}\n\n/**\n * Subscribe to SSE events for context and/or group IDs.\n * StrictMode-safe: tracks the SseClient instance in a ref to avoid\n * double-connect on mount/unmount/remount cycles.\n */\nexport function useSubscription(\n contextIds: string[],\n callback: (event: SubscriptionEventData) => void,\n): void;\nexport function useSubscription(\n input: SubscriptionInput,\n callback: (event: SubscriptionEventData) => void,\n): void;\nexport function useSubscription(\n input: string[] | SubscriptionInput,\n callback: (event: SubscriptionEventData) => void,\n) {\n const { mero } = useMero();\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n const { contextIds = [], groupIds = [] } = Array.isArray(input)\n ? { contextIds: input, groupIds: [] as string[] }\n : input;\n\n const contextIdsKey = JSON.stringify(contextIds);\n const groupIdsKey = JSON.stringify(groupIds);\n\n useEffect(() => {\n if (!mero || (contextIds.length === 0 && groupIds.length === 0)) return;\n\n const sse = mero.events;\n\n const handler = (event: SubscriptionEventData) => {\n callbackRef.current(event);\n };\n\n sse.on('event', handler);\n sse.connect().catch(() => {});\n sse.subscribe({ contextIds, groupIds }).catch(() => {});\n\n return () => {\n sse.off('event', handler);\n };\n }, [mero, contextIdsKey, groupIdsKey]);\n}\n\n/**\n * Fetch contexts for the current node, optionally filtered by application ID.\n */\nexport function useContexts(applicationId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<ApplicationContextRecord[]>(\n mero\n ? async () => {\n const response = applicationId\n ? await mero.admin.getContextsForApplication(applicationId)\n : await mero.admin.getContexts();\n return mapApplicationContexts(response.contexts ?? []);\n }\n : null,\n [],\n [mero, applicationId],\n );\n return { contexts: data, loading, error, refetch };\n}\n\nexport function useApplicationContexts(applicationId?: string | null) {\n return useContexts(applicationId);\n}\n\nexport function useGroupMembers(groupId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<ListGroupMembersResponseData | null>(\n mero && groupId ? () => mero.admin.listGroupMembers(groupId) : null,\n null,\n [mero, groupId],\n );\n // `members` is a guaranteed array on the wire; `?? []` guards mocks / drift.\n return {\n members: data?.members ?? [],\n loading,\n error,\n refetch,\n };\n}\n\nexport function useGroupContexts(groupId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<GroupContextEntry[]>(\n mero && groupId ? () => mero.admin.listGroupContexts(groupId) : null,\n [],\n [mero, groupId],\n );\n return { contexts: data, loading, error, refetch };\n}\n\nexport function useGroupInvitations() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const createInvitation = useCallback(\n async (groupId: string, request?: CreateGroupInvitationRequest) => {\n if (!mero) {\n return null;\n }\n return run(() => mero.admin.createGroupInvitation(groupId, request));\n },\n [mero, run],\n );\n\n return { createInvitation, loading, error };\n}\n\nexport function useJoinGroup() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const joinGroup = useCallback(\n async (request: JoinGroupRequest) => {\n if (!mero) {\n return null;\n }\n return run(() => mero.admin.joinGroup(request));\n },\n [mero, run],\n );\n\n return { joinGroup, loading, error };\n}\n\n/**\n * Takes the member's ACCOUNT (64 hex), as `useGroupMembers` rows are keyed by\n * and `useNodeIdentity().identity?.accountId` returns - NOT a signing key.\n * Both are 32-byte strings, so passing a key names nobody and raises nothing.\n */\nexport function useGroupCapabilities(groupId?: string | null, memberId?: string | null) {\n const { mero } = useMero();\n const [capabilities, setCapabilitiesState] = useState<number | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useMountedRef();\n // Read+write hybrid (setCapabilities shares this state), so it keeps the\n // inline latest-request-wins guard rather than useAsyncResource.\n const reqRef = useRef(0);\n\n const refetch = useCallback(async () => {\n const seq = ++reqRef.current;\n if (!mero || !groupId || !memberId) {\n if (mountedRef.current && seq === reqRef.current) {\n setCapabilitiesState(null);\n setError(null);\n setLoading(false);\n }\n return null;\n }\n\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n const response = await mero.admin.getMemberCapabilities(groupId, memberId);\n if (mountedRef.current && seq === reqRef.current) {\n setCapabilitiesState(response.capabilities);\n }\n return response.capabilities;\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current && seq === reqRef.current) {\n setError(errorValue);\n }\n return null;\n } finally {\n if (mountedRef.current && seq === reqRef.current) {\n setLoading(false);\n }\n }\n }, [groupId, memberId, mero, mountedRef]);\n\n useEffect(() => {\n reqRef.current += 1;\n setCapabilitiesState(null);\n setError(null);\n }, [groupId, memberId]);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n const setCapabilities = useCallback(\n async (nextCapabilities: number) => {\n if (!mero || !groupId || !memberId) {\n return null;\n }\n\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n await mero.admin.setMemberCapabilities(groupId, memberId, { capabilities: nextCapabilities });\n if (mountedRef.current) {\n setCapabilitiesState(nextCapabilities);\n }\n return nextCapabilities;\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current) {\n setError(errorValue);\n }\n return null;\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n },\n [groupId, memberId, mero, mountedRef],\n );\n\n return { capabilities, loading, error, refetch, setCapabilities };\n}\n\nexport function useContextDiscovery(options: ContextDiscoveryOptions): ContextDiscoveryState {\n const { mero } = useMero();\n const [context, setContext] = useState<ApplicationContextRecord | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useMountedRef();\n\n const knownContextIdsKey = JSON.stringify(options.knownContextIds ?? []);\n\n const discover = useCallback(async () => {\n if (!mero) {\n const notConnectedError = new Error('Not connected');\n if (mountedRef.current) {\n setError(notConnectedError);\n }\n return null;\n }\n const knownContextIds = new Set(options.knownContextIds ?? []);\n const pollIntervalMs = options.pollIntervalMs ?? 1000;\n const timeoutMs = options.timeoutMs ?? 30000;\n const deadline = Date.now() + timeoutMs;\n\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n while (Date.now() <= deadline) {\n if (options.targetAlias) {\n const aliasMatch = extractAliasContextId(\n await mero.admin.lookupContextAlias(options.targetAlias),\n );\n\n if (aliasMatch && !knownContextIds.has(aliasMatch)) {\n const discoveredFromAlias = {\n contextId: aliasMatch,\n applicationId: options.applicationId,\n };\n\n if (mountedRef.current) {\n setContext(discoveredFromAlias);\n }\n\n return discoveredFromAlias;\n }\n }\n\n const response = await mero.admin.getContextsForApplication(options.applicationId);\n const contexts = mapApplicationContexts(response.contexts ?? []);\n const discovered = contexts.find(\n (applicationContext) => !knownContextIds.has(applicationContext.contextId),\n );\n\n if (discovered) {\n if (mountedRef.current) {\n setContext(discovered);\n }\n return discovered;\n }\n\n if (Date.now() + pollIntervalMs > deadline) {\n break;\n }\n\n await sleep(pollIntervalMs);\n }\n\n const timeoutError = new Error(\n `Timed out discovering a context for application ${options.applicationId}`,\n );\n\n if (mountedRef.current) {\n setContext(null);\n setError(timeoutError);\n }\n\n return null;\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current) {\n setContext(null);\n setError(errorValue);\n }\n return null;\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [\n knownContextIdsKey,\n mero,\n mountedRef,\n options.applicationId,\n options.knownContextIds,\n options.pollIntervalMs,\n options.targetAlias,\n options.timeoutMs,\n ]);\n\n const reset = useCallback(() => {\n if (mountedRef.current) {\n setContext(null);\n setError(null);\n setLoading(false);\n }\n }, [mountedRef]);\n\n return { context, loading, error, discover, reset };\n}\n\n// ---- Context CRUD Hooks ----\n\nexport function useCreateContext() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const createContext = useCallback(\n async (request: CreateContextRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.createContext(request));\n },\n [mero, run],\n );\n\n return { createContext, loading, error };\n}\n\nexport function useDeleteContext() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const deleteContext = useCallback(\n async (contextId: string) => {\n if (!mero) return null;\n return run(() => mero.admin.deleteContext(contextId));\n },\n [mero, run],\n );\n\n return { deleteContext, loading, error };\n}\n\nexport function useJoinContext() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const joinContext = useCallback(\n async (contextId: string) => {\n if (!mero) return null;\n return run(() => mero.admin.joinContext(contextId));\n },\n [mero, run],\n );\n\n return { joinContext, loading, error };\n}\n\nexport function useJoinSubgroupInheritance() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const joinSubgroupInheritance = useCallback(\n async (groupId: string) => {\n if (!mero) return null;\n return run(() => mero.admin.joinSubgroupInheritance(groupId));\n },\n [mero, run],\n );\n\n return { joinSubgroupInheritance, loading, error };\n}\n\nexport function useContextGroup(contextId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<string | null>(\n mero && contextId ? () => mero.admin.getContextGroup(contextId) : null,\n null,\n [mero, contextId],\n );\n return { groupId: data, loading, error, refetch };\n}\n\n// ---- Group Info / Management Hooks ----\n\nexport function useGroupInfo(groupId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<GroupInfo | null>(\n mero && groupId ? () => mero.admin.getGroupInfo(groupId) : null,\n null,\n [mero, groupId],\n );\n return { groupInfo: data, loading, error, refetch };\n}\n\nexport function useDeleteGroup() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const deleteGroup = useCallback(\n async (groupId: string, request?: DeleteGroupRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.deleteGroup(groupId, request));\n },\n [mero, run],\n );\n\n return { deleteGroup, loading, error };\n}\n\nexport function useSyncGroup() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const syncGroup = useCallback(\n async (groupId: string, request?: SyncGroupRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.syncGroup(groupId, request));\n },\n [mero, run],\n );\n\n return { syncGroup, loading, error };\n}\n\n/**\n * Takes the invitee's signing KEY (bs58) - the one call on this resource that\n * does, because someone being added may have no account here yet. Every other\n * member call, including `useRemoveGroupMembers`, takes the ACCOUNT, so a value\n * round-tripped from an add is the wrong one to remove with.\n */\nexport function useAddGroupMembers() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const addGroupMembers = useCallback(\n async (groupId: string, request: AddGroupMembersRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.addGroupMembers(groupId, request));\n },\n [mero, run],\n );\n\n return { addGroupMembers, loading, error };\n}\n\n/**\n * Takes the member's ACCOUNT (64 hex), as `useGroupMembers` rows are keyed by\n * and `useNodeIdentity().identity?.accountId` returns - NOT a signing key.\n * Both are 32-byte strings, so passing a key names nobody and raises nothing.\n */\nexport function useRemoveGroupMembers() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const removeGroupMembers = useCallback(\n async (groupId: string, request: RemoveGroupMembersRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.removeGroupMembers(groupId, request));\n },\n [mero, run],\n );\n\n return { removeGroupMembers, loading, error };\n}\n\n// ---- Namespace Hooks ----\n\nexport function useNamespaces() {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<Namespace[]>(\n mero ? () => mero.admin.listNamespaces() : null,\n [],\n [mero],\n );\n return { namespaces: data, loading, error, refetch };\n}\n\nexport function useNamespace(namespaceId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<Namespace | null>(\n mero && namespaceId ? () => mero.admin.getNamespace(namespaceId) : null,\n null,\n [mero, namespaceId],\n );\n return { namespace: data, loading, error, refetch };\n}\n\n/**\n * Who this node is: `accountId` is what member-addressing takes and what\n * `useGroupMembers` rows are keyed by — `publicKey` is the signing key and\n * addresses nobody. Both are 32-byte strings, so a swap fails silently.\n */\nexport function useNodeIdentity() {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<NodeIdentity | null>(\n mero ? () => mero.admin.getNodeIdentity() : null,\n null,\n [mero],\n );\n return { identity: data, loading, error, refetch };\n}\n\n/**\n * @deprecated Use {@link useNodeIdentity}. Identity is per-node, not\n * per-namespace, and this no longer gates on participation: it answers for a\n * namespace this node never joined, so `identity != null` is not \"am I a\n * member?\" — ask `useNamespaces` for that. Its `publicKey` is the signing key,\n * NOT the account member-addressing wants.\n */\nexport function useNamespaceIdentity(namespaceId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<NamespaceIdentity | null>(\n mero && namespaceId ? () => mero.admin.getNamespaceIdentity(namespaceId) : null,\n null,\n [mero, namespaceId],\n );\n return { identity: data, loading, error, refetch };\n}\n\nexport function useNamespacesForApplication(applicationId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<Namespace[]>(\n mero && applicationId ? () => mero.admin.listNamespacesForApplication(applicationId) : null,\n [],\n [mero, applicationId],\n );\n return { namespaces: data, loading, error, refetch };\n}\n\nexport function useCreateNamespace() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const createNamespace = useCallback(\n async (request: CreateNamespaceRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.createNamespace(request));\n },\n [mero, run],\n );\n\n return { createNamespace, loading, error };\n}\n\nexport function useDeleteNamespace() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const deleteNamespace = useCallback(\n async (namespaceId: string, request?: DeleteNamespaceRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.deleteNamespace(namespaceId, request));\n },\n [mero, run],\n );\n\n return { deleteNamespace, loading, error };\n}\n\nexport function useCreateNamespaceInvitation() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const createNamespaceInvitation = useCallback(\n async (\n namespaceId: string,\n request?: CreateNamespaceInvitationRequest,\n ): Promise<CreateNamespaceInvitationResponseData | CreateRecursiveInvitationResponseData | null> => {\n if (!mero) return null;\n return run(() => mero.admin.createNamespaceInvitation(namespaceId, request));\n },\n [mero, run],\n );\n\n return { createNamespaceInvitation, loading, error };\n}\n\nexport function useJoinNamespace() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const joinNamespace = useCallback(\n async (namespaceId: string, request: JoinNamespaceRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.joinNamespace(namespaceId, request));\n },\n [mero, run],\n );\n\n return { joinNamespace, loading, error };\n}\n\nexport function useCreateGroupInNamespace() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const createGroupInNamespace = useCallback(\n async (namespaceId: string, request?: CreateGroupInNamespaceRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.createGroupInNamespace(namespaceId, request));\n },\n [mero, run],\n );\n\n return { createGroupInNamespace, loading, error };\n}\n\nexport function useNamespaceGroups(namespaceId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<SubgroupEntry[]>(\n mero && namespaceId ? () => mero.admin.listNamespaceGroups(namespaceId) : null,\n [],\n [mero, namespaceId],\n );\n return { groups: data, loading, error, refetch };\n}\n\n// ---- Group Settings & Role Management ----\n\n/**\n * Takes the member's ACCOUNT (64 hex), as `useGroupMembers` rows are keyed by\n * and `useNodeIdentity().identity?.accountId` returns - NOT a signing key.\n * Both are 32-byte strings, so passing a key names nobody and raises nothing.\n */\nexport function useUpdateMemberRole() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const updateMemberRole = useCallback(\n async (groupId: string, identity: string, request: UpdateMemberRoleRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.updateMemberRole(groupId, identity, request));\n },\n [mero, run],\n );\n\n return { updateMemberRole, loading, error };\n}\n\nexport function useSetDefaultCapabilities() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const setDefaultCapabilities = useCallback(\n async (groupId: string, request: SetDefaultCapabilitiesRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.setDefaultCapabilities(groupId, request));\n },\n [mero, run],\n );\n\n return { setDefaultCapabilities, loading, error };\n}\n\nexport function useSetSubgroupVisibility() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const setSubgroupVisibility = useCallback(\n async (groupId: string, request: SetSubgroupVisibilityRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.setSubgroupVisibility(groupId, request));\n },\n [mero, run],\n );\n\n return { setSubgroupVisibility, loading, error };\n}\n\nexport function useDefaultCapabilities(groupId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<number | null>(\n mero && groupId ? () => mero.admin.getDefaultCapabilities(groupId) : null,\n null,\n [mero, groupId],\n );\n return { defaultCapabilities: data, loading, error, refetch };\n}\n\nexport function useSubgroupVisibility(groupId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<string | null>(\n mero && groupId ? () => mero.admin.getSubgroupVisibility(groupId) : null,\n null,\n [mero, groupId],\n );\n return { subgroupVisibility: data, loading, error, refetch };\n}\n\nexport function useSetTeeAdmissionPolicy() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const setTeeAdmissionPolicy = useCallback(\n async (groupId: string, request: SetTeeAdmissionPolicyRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.setTeeAdmissionPolicy(groupId, request));\n },\n [mero, run],\n );\n\n return { setTeeAdmissionPolicy, loading, error };\n}\n\n// ---- Metadata Hooks ----\n\nexport function useSetGroupMetadata() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const setGroupMetadata = useCallback(\n async (groupId: string, request: SetMetadataInput) => {\n if (!mero) return null;\n return run(() => mero.admin.setGroupMetadata(groupId, request));\n },\n [mero, run],\n );\n\n return { setGroupMetadata, loading, error };\n}\n\n/**\n * Takes the member's ACCOUNT (64 hex), as `useGroupMembers` rows are keyed by\n * and `useNodeIdentity().identity?.accountId` returns - NOT a signing key.\n * Both are 32-byte strings, so passing a key names nobody and raises nothing.\n */\nexport function useSetMemberMetadata() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const setMemberMetadata = useCallback(\n async (groupId: string, identity: string, request: SetMetadataInput) => {\n if (!mero) return null;\n return run(() => mero.admin.setMemberMetadata(groupId, identity, request));\n },\n [mero, run],\n );\n\n return { setMemberMetadata, loading, error };\n}\n\nexport function useSetContextMetadata() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const setContextMetadata = useCallback(\n async (groupId: string, contextId: string, request: SetMetadataInput) => {\n if (!mero) return null;\n return run(() => mero.admin.setContextMetadata(groupId, contextId, request));\n },\n [mero, run],\n );\n\n return { setContextMetadata, loading, error };\n}\n\nexport function useGroupMetadata(groupId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<MetadataRecord | null>(\n mero && groupId ? () => mero.admin.getGroupMetadata(groupId) : null,\n null,\n [mero, groupId],\n );\n return { metadata: data, loading, error, refetch };\n}\n\nexport function useMemberMetadata(groupId?: string | null, identity?: string | null) {\n const { mero } = useMero();\n const [metadata, setMetadata] = useState<MetadataRecord | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Shared fetch logic for the auto-mount effect and the explicit\n // refetch callable. The per-invocation `signal.aborted` flag covers\n // the response-during-unmount race cleanly without the global\n // mountedRef gate that — under StrictMode-like fast unmount/remount\n // cycles — could leave the hook stuck on `metadata = null` when an\n // in-flight response landed during cleanup and the followup mount's\n // useCallback referential identity hadn't changed enough to re-fire\n // the effect.\n const run = useCallback(\n async (signal: { aborted: boolean }) => {\n if (!mero || !groupId || !identity) {\n if (!signal.aborted) {\n setMetadata(null);\n setError(null);\n setLoading(false);\n }\n return;\n }\n if (!signal.aborted) {\n setLoading(true);\n setError(null);\n }\n try {\n const result = await mero.admin.getMemberMetadata(groupId, identity);\n if (!signal.aborted) setMetadata(result);\n } catch (err) {\n if (!signal.aborted) setError(toError(err));\n } finally {\n if (!signal.aborted) setLoading(false);\n }\n },\n [mero, groupId, identity],\n );\n\n useEffect(() => {\n const signal = { aborted: false };\n void run(signal);\n return () => {\n signal.aborted = true;\n };\n }, [run]);\n\n // Explicit refetch — the caller's `await refetch()` resolves only\n // after state has been written (preserves the prior API contract;\n // call sites like `useMemberDisplayName.setName` rely on the new\n // value being readable from state after the await).\n const refetch = useCallback(async () => {\n const signal = { aborted: false };\n await run(signal);\n }, [run]);\n\n return { metadata, loading, error, refetch };\n}\n\n// ---- Group Signing Key, Upgrades & Hierarchy ----\n\nexport function useUpgradeGroup() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const upgradeGroup = useCallback(\n async (groupId: string, request: UpgradeGroupRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.upgradeGroup(groupId, request));\n },\n [mero, run],\n );\n\n return { upgradeGroup, loading, error };\n}\n\n/**\n * Install a registry package version onto the node — the discrete \"Download\"\n * step an Updates flow runs before an `upgradeGroup`. Resolves the installed\n * application id (`InstallApplicationResponseData`). Downloading does not by\n * itself change what any group runs; pair it with a subsequent upgrade.\n */\nexport function useInstallFromRegistry() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const installFromRegistry = useCallback(\n async (registryUrl: string, packageName: string, version: string) => {\n if (!mero) return null;\n return run(() => mero.admin.installFromRegistry(registryUrl, packageName, version));\n },\n [mero, run],\n );\n\n return { installFromRegistry, loading, error };\n}\n\n/**\n * Kick off a full state re-pull for a context — operator recovery for a\n * context stranded mid-sync. `force` re-pulls even when the node does not\n * flag the context as stranded.\n */\nexport function useResyncContext() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const resyncContext = useCallback(\n async (contextId: string, request: ResyncContextRequest = {}) => {\n if (!mero) return null;\n return run(() => mero.admin.resyncContext(contextId, request));\n },\n [mero, run],\n );\n\n return { resyncContext, loading, error };\n}\n\nexport function useGroupUpgradeStatus(groupId?: string | null) {\n const { mero } = useMero();\n const [upgradeStatus, setUpgradeStatus] = useState<GroupUpgradeStatusResponseData>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useMountedRef();\n // Latest-request-wins token (see useMigrationStatus) so overlapping refetches\n // can't land out of order and overwrite fresher data.\n const reqRef = useRef(0);\n\n const refetch = useCallback(async () => {\n const seq = ++reqRef.current;\n if (!mero || !groupId) {\n if (mountedRef.current) {\n setUpgradeStatus(null);\n setError(null);\n setLoading(false);\n }\n return;\n }\n\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n const result = await mero.admin.getGroupUpgradeStatus(groupId);\n if (mountedRef.current && seq === reqRef.current) {\n setUpgradeStatus(result);\n }\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current && seq === reqRef.current) {\n setError(errorValue);\n }\n } finally {\n if (mountedRef.current && seq === reqRef.current) {\n setLoading(false);\n }\n }\n }, [groupId, mero, mountedRef]);\n\n // Clear stale status synchronously when the target group changes (and\n // invalidate any in-flight refetch), mirroring useMigrationStatus.\n useEffect(() => {\n reqRef.current += 1;\n setUpgradeStatus(null);\n setError(null);\n }, [groupId]);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n return { upgradeStatus, loading, error, refetch };\n}\n\nexport function useRetryGroupUpgrade() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const retryGroupUpgrade = useCallback(\n async (groupId: string, request?: RetryGroupUpgradeRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.retryGroupUpgrade(groupId, request));\n },\n [mero, run],\n );\n\n return { retryGroupUpgrade, loading, error };\n}\n\n/** Move `childGroupId` under a new parent. */\nexport function useReparentGroup() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const reparentGroup = useCallback(\n async (childGroupId: string, request: ReparentGroupRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.reparentGroup(childGroupId, request));\n },\n [mero, run],\n );\n\n return { reparentGroup, loading, error };\n}\n\nexport function useSubgroups(groupId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<SubgroupEntry[]>(\n mero && groupId ? () => mero.admin.listSubgroups(groupId) : null,\n [],\n [mero, groupId],\n );\n return { subgroups: data, loading, error, refetch };\n}\n\n// ---- Context-Group Relationship ----\n\nexport function useDetachContextFromGroup() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const detachContextFromGroup = useCallback(\n async (groupId: string, contextId: string, request?: DetachContextFromGroupRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.detachContextFromGroup(groupId, contextId, request));\n },\n [mero, run],\n );\n\n return { detachContextFromGroup, loading, error };\n}\n\n/**\n * Subscribe to a namespace's `GroupMigration` events, invoking `onEvent` per\n * frame and unsubscribing on unmount.\n *\n * A non-admin subscriber never sees `CascadeProgress`; core delivers that to\n * namespace admins only, so a UI must not wait on it to decide progress.\n */\n/**\n * Fallback poll cadence for `useMigrationStatus` when the SSE stream is\n * unavailable (no token, a proxy that buffers, an older node) and the caller\n * named no interval of its own. Chosen to match the heartbeat cadence that\n * migration facts actually arrive on; an explicit `pollIntervalMs` overrides it.\n */\nexport const DEFAULT_MIGRATION_POLL_INTERVAL_MS = 5000;\n\nexport function useMigrationEvents(\n namespaceId: string | null | undefined,\n onEvent: (event: GroupMigrationEventData) => void,\n): boolean {\n const { mero } = useMero();\n const mountedRef = useMountedRef();\n // Whether the stream is actually carrying frames. Callers use it to decide\n // whether they still need a fallback poll, so it must reflect the subscribe\n // ACTUALLY succeeding - not merely that we asked.\n const [live, setLive] = useState(false);\n // Held in a ref so a caller passing an inline arrow does not resubscribe on\n // every render - the subscription's lifetime is the namespace's, not the\n // callback identity's.\n const handlerRef = useRef(onEvent);\n handlerRef.current = onEvent;\n\n useEffect(() => {\n if (!mero || !namespaceId) return;\n const sse = mero.events;\n const unsubscribe = sse.onMigrationEvent((event) => handlerRef.current(event));\n // Sequential, and the result is recorded: connecting but failing to\n // subscribe is still a dead stream, and both used to be swallowed, which\n // left a caller unable to tell a live stream from a silent one.\n let cancelled = false;\n void (async () => {\n try {\n await sse.connect();\n await sse.subscribe({ groupIds: [namespaceId] });\n if (!cancelled && mountedRef.current) setLive(true);\n } catch {\n if (!cancelled && mountedRef.current) setLive(false);\n }\n })();\n return () => {\n cancelled = true;\n if (mountedRef.current) setLive(false);\n unsubscribe();\n };\n }, [mero, namespaceId, mountedRef]);\n\n return live;\n}\n\n/**\n * Migration-status rollup for a namespace (skew #3).\n *\n * Live: subscribes to the `GroupMigration` event family and re-reads on each\n * frame. It re-READS rather than folding the event's counters in, because the\n * rollup is recomputed from raw member rows and is the authoritative answer.\n * `pollIntervalMs` stays as the fallback when SSE is unavailable, and when the\n * caller names none it defaults to `DEFAULT_MIGRATION_POLL_INTERVAL_MS` for\n * exactly as long as the stream is down - so the panel can never sit silently\n * frozen with neither transport.\n * Derived counters are null-safe before the first load.\n */\nexport function useMigrationStatus(\n namespaceId?: string | null,\n options?: { pollIntervalMs?: number },\n) {\n const { mero } = useMero();\n const [status, setStatus] = useState<MigrationStatus | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useMountedRef();\n // Monotonic request token: only the latest in-flight request applies its\n // result, so an overlapping poll or a fast namespace change can't let a\n // stale response overwrite fresher data.\n const reqRef = useRef(0);\n\n const refetch = useCallback(async () => {\n if (!mero || !namespaceId) {\n if (mountedRef.current) {\n setStatus(null);\n setError(null);\n setLoading(false);\n }\n return;\n }\n\n const seq = ++reqRef.current;\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n const result = await mero.admin.getMigrationStatus(namespaceId);\n if (mountedRef.current && seq === reqRef.current) {\n setStatus(result);\n }\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current && seq === reqRef.current) {\n setError(errorValue);\n }\n } finally {\n if (mountedRef.current && seq === reqRef.current) {\n setLoading(false);\n }\n }\n }, [namespaceId, mero, mountedRef]);\n\n // Clear stale state the instant the namespace changes, so the panel shows a\n // loading state rather than the previous namespace's data during the refetch.\n useEffect(() => {\n setStatus(null);\n setError(null);\n }, [namespaceId]);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n // Live updates. The frame is a signal, not the answer: it says something\n // moved, and the re-read is what stays authoritative. This runs BEFORE the\n // poll below because whether the stream is genuinely live is what decides\n // if a caller who named no interval needs a fallback poll at all.\n const sseLive = useMigrationEvents(namespaceId, () => void refetch());\n\n // An explicit interval always wins - a caller that asked to poll keeps\n // polling. When none was named, poll only while the stream is NOT live:\n // migration facts arrive by heartbeat gossip with no push transport of their\n // own, so with neither SSE nor an interval the panel loads once and then\n // silently never updates again, with no error to show for it.\n const pollIntervalMs =\n options?.pollIntervalMs ??\n (sseLive ? undefined : DEFAULT_MIGRATION_POLL_INTERVAL_MS);\n useEffect(() => {\n if (!pollIntervalMs || !mero || !namespaceId) return;\n const handle = setInterval(() => void refetch(), pollIntervalMs);\n return () => clearInterval(handle);\n }, [pollIntervalMs, mero, namespaceId, refetch]);\n\n const rollup: MigrationStatusRollup | null = status?.rollup ?? null;\n const members: MemberMigrationStatusEntry[] = status?.members ?? [];\n\n return {\n status,\n rollup,\n members,\n allMigrated: rollup?.allMigrated ?? false,\n /**\n * When this node watched the fleet converge, or `null`. Durable, unlike\n * `allMigrated`, which is recomputed from in-TTL heartbeats and lapses back\n * to false when a member simply goes quiet.\n */\n fleetCompletedAt: status?.fleetCompletedAt ?? null,\n membersPendingSignature: rollup?.membersPendingSignature ?? 0,\n /** Members whose migrate aborted (migration-check failed or apply errored). */\n failed: rollup?.failed ?? 0,\n loading,\n error,\n refetch,\n };\n}\n\n/**\n * Bundle-version skew (#2): reads the context's installed `applicationVersion`\n * (semver) and compares it to the app-declared `expected` build constant. Any\n * mismatch (either direction) is `isStale` → \"reload to update\". Subscribes to\n * `AppVersionChanged` so a live flip updates `appVersion` without a refetch.\n */\nexport function useAppVersion(contextId?: string | null, expected?: string) {\n const { mero } = useMero();\n const [appVersion, setAppVersion] = useState<string | undefined>(undefined);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useMountedRef();\n // Latest-request-wins token (see useMigrationStatus).\n const reqRef = useRef(0);\n\n const refetch = useCallback(async () => {\n if (!mero || !contextId) {\n if (mountedRef.current) {\n setAppVersion(undefined);\n setError(null);\n setLoading(false);\n }\n return;\n }\n\n const seq = ++reqRef.current;\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n const context = await mero.admin.getContext(contextId);\n if (mountedRef.current && seq === reqRef.current) {\n setAppVersion(context.applicationVersion);\n }\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current && seq === reqRef.current) {\n setError(errorValue);\n }\n } finally {\n if (mountedRef.current && seq === reqRef.current) {\n setLoading(false);\n }\n }\n }, [contextId, mero, mountedRef]);\n\n // Reset on context change so a stale version isn't shown during the refetch.\n useEffect(() => {\n setAppVersion(undefined);\n setError(null);\n }, [contextId]);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n useEffect(() => {\n if (!mero?.events || !contextId) return;\n const off = mero.events.onAppVersionChanged((event: AppVersionChangedEvent) => {\n if (event.contextId !== contextId) return;\n if (mountedRef.current && event.toVersion) {\n // Invalidate any in-flight refetch so its (older) result can't clobber\n // this live update.\n reqRef.current += 1;\n setAppVersion(event.toVersion);\n }\n });\n return off;\n }, [mero, contextId, mountedRef]);\n\n const isStale = appVersion != null && expected != null && appVersion !== expected;\n\n return { appVersion, expected, isStale, loading, error, refetch };\n}\n\n/**\n * \"Is a newer version available?\" for an Updates view. Reads a package's\n * published versions from the registry and compares the newest to the running\n * `currentVersion` (e.g. a context's `applicationVersion`). `updateAvailable`\n * is true only when the registry's newest is strictly greater. This is the\n * registry-side check the admin acts on; gate rendering on admin status at the\n * call site. Pure read — fetching nothing until both `registryUrl` and\n * `packageName` are provided.\n */\nexport function useLatestVersion(\n registryUrl?: string | null,\n packageName?: string | null,\n currentVersion?: string | null,\n) {\n const { mero } = useMero();\n const [versions, setVersions] = useState<string[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useMountedRef();\n // Latest-request-wins token (see useMigrationStatus).\n const reqRef = useRef(0);\n\n const refetch = useCallback(async () => {\n if (!mero || !registryUrl || !packageName) {\n // Invalidate any in-flight request so a late response can't repopulate\n // stale versions for the previous package after the inputs were cleared.\n reqRef.current += 1;\n if (mountedRef.current) {\n setVersions([]);\n setError(null);\n setLoading(false);\n }\n return;\n }\n\n const seq = ++reqRef.current;\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n const result = await mero.admin.getRegistryVersions(registryUrl, packageName);\n if (mountedRef.current && seq === reqRef.current) {\n setVersions(result);\n }\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current && seq === reqRef.current) {\n setError(errorValue);\n }\n } finally {\n if (mountedRef.current && seq === reqRef.current) {\n setLoading(false);\n }\n }\n }, [mero, registryUrl, packageName, mountedRef]);\n\n // Clear stale versions the instant the package/registry changes.\n useEffect(() => {\n setVersions([]);\n setError(null);\n }, [registryUrl, packageName]);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n // getRegistryVersions returns newest-first, so [0] is the latest published.\n const latestVersion = versions[0] ?? null;\n const updateAvailable =\n latestVersion != null &&\n currentVersion != null &&\n compareSemver(latestVersion, currentVersion) > 0;\n\n return { versions, latestVersion, currentVersion, updateAvailable, loading, error, refetch };\n}\n\ninterface GroupAppVersion {\n /** Semver of the application the group currently targets (`null` until loaded). */\n version: string | null;\n /** The group's `targetApplicationId`. */\n applicationId: string | null;\n /** The installed blob differs from the one the group targets (see hook doc). */\n pendingApply: boolean;\n /** Only populated via the group-info path; `null` in the namespace path. */\n activeUpgrade: GroupUpgradeStatusResponseData;\n}\n\nconst EMPTY_GROUP_APP_VERSION: GroupAppVersion = {\n version: null,\n applicationId: null,\n pendingApply: false,\n activeUpgrade: null,\n};\n\n/** An appKey carries no \"pending\" signal when it is absent or all-zero. */\nfunction isZeroAppKey(appKey?: string): boolean {\n return !appKey || /^0+$/.test(appKey);\n}\n\n/**\n * What app version does this group run, and is there a downloaded-but-not-yet-\n * applied update? Replaces the appKey-vs-installed-blob comparison apps\n * otherwise hand-roll: `pendingApply` is true when the group's `appKey` (the\n * blob it targets) is present, non-zero, and differs from the blob actually\n * installed for its `targetApplicationId`. Deciding whether to render or gate on\n * that status (admin-only actions, etc.) is the call site's job.\n *\n * Resolution stays cheap: the group's record comes from `listNamespaces()` when\n * the id is a namespace, else from `getGroupInfo()`; `getApplication()` then\n * reads the installed version and blob. `activeUpgrade` is returned only when it\n * arrives for free on the group-info path (it is not fetched separately).\n * Subscribes to `AppVersionChanged` and refetches, since any version flip in the\n * workspace can make the rollup stale.\n */\nexport function useGroupAppVersion(groupId?: string) {\n const { mero } = useMero();\n const [data, setData] = useState<GroupAppVersion>(EMPTY_GROUP_APP_VERSION);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useMountedRef();\n // Latest-request-wins token (see useMigrationStatus).\n const reqRef = useRef(0);\n\n const refetch = useCallback(async () => {\n const seq = ++reqRef.current;\n if (!mero || !groupId) {\n if (mountedRef.current) {\n setData(EMPTY_GROUP_APP_VERSION);\n setError(null);\n setLoading(false);\n }\n return;\n }\n\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n // Namespace-first resolution: a top-level group is a namespace; only\n // subgroups need the getGroupInfo fallback (which also carries\n // activeUpgrade, so we surface it without a third call).\n const namespaces = await mero.admin.listNamespaces();\n const namespace = namespaces.find((entry) => entry.namespaceId === groupId);\n\n let appKey: string | undefined;\n let applicationId: string | null;\n let activeUpgrade: GroupUpgradeStatusResponseData = null;\n\n if (namespace) {\n appKey = namespace.appKey;\n applicationId = namespace.targetApplicationId;\n } else {\n const info = await mero.admin.getGroupInfo(groupId);\n appKey = info.appKey;\n applicationId = info.targetApplicationId;\n activeUpgrade = info.activeUpgrade ?? null;\n }\n\n let version: string | null = null;\n let pendingApply = false;\n if (applicationId) {\n const { application } = await mero.admin.getApplication(applicationId);\n version = application?.version ?? null;\n if (application && !isZeroAppKey(appKey)) {\n const installedHex = base58ToHex(application.blob.bytecode).toLowerCase();\n pendingApply = appKey!.toLowerCase() !== installedHex;\n }\n }\n\n if (mountedRef.current && seq === reqRef.current) {\n setData({ version, applicationId, pendingApply, activeUpgrade });\n }\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current && seq === reqRef.current) {\n setError(errorValue);\n }\n } finally {\n if (mountedRef.current && seq === reqRef.current) {\n setLoading(false);\n }\n }\n }, [groupId, mero, mountedRef]);\n\n // Clear stale state synchronously when the target group changes (and\n // invalidate any in-flight refetch). Mirrors useGroupUpgradeStatus.\n useEffect(() => {\n reqRef.current += 1;\n setData(EMPTY_GROUP_APP_VERSION);\n setError(null);\n }, [groupId]);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n useEffect(() => {\n if (!mero?.events || !groupId) return;\n const off = mero.events.onAppVersionChanged(() => {\n if (mountedRef.current) void refetch();\n });\n return off;\n }, [mero, groupId, refetch, mountedRef]);\n\n return { ...data, loading, error, refetch };\n}\n\n/**\n * The caller's own identity-gated entries pending re-signature (skew #1).\n * `pending` is `pendingCount > 0` (from `count_my_pending`); `authorize()` runs\n * the one-tap `migrate_my_entries` convert and folds the resulting `remaining`\n * back into the count.\n */\nexport function useMyAuthoredMigration(contextId?: string | null) {\n const { mero } = useMero();\n const [summary, setSummary] = useState<MigrateMyEntriesSummary | null>(null);\n const [pendingCount, setPendingCount] = useState(0);\n const mountedRef = useMountedRef();\n const { loading, error, run } = useAsyncMutation();\n // Latest-request-wins token (see useMigrationStatus).\n const reqRef = useRef(0);\n\n const refresh = useCallback(async () => {\n if (!mero || !contextId) {\n if (mountedRef.current) setPendingCount(0);\n return;\n }\n const seq = ++reqRef.current;\n try {\n const count = await mero.rpc.countMyPending(contextId);\n if (mountedRef.current && seq === reqRef.current) setPendingCount(count);\n } catch {\n // best-effort count; leave the previous value on a transient failure\n }\n }, [mero, contextId, mountedRef]);\n\n // Clear stale per-context state synchronously when the target changes (and\n // invalidate any in-flight refresh), so the banner doesn't flash the previous\n // context's count until the new count resolves. Mirrors useMigrationStatus.\n useEffect(() => {\n reqRef.current += 1;\n setPendingCount(0);\n setSummary(null);\n }, [contextId]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const authorize = useCallback(async () => {\n if (!mero || !contextId) return null;\n const result = await run(() => mero.rpc.migrateMyEntries(contextId));\n if (result && mountedRef.current) {\n // Invalidate any in-flight refresh so a stale count can't overwrite the\n // authoritative post-convert remaining.\n reqRef.current += 1;\n setSummary(result);\n setPendingCount(result.remaining);\n }\n return result;\n }, [mero, contextId, run, mountedRef]);\n\n return {\n summary,\n pendingCount,\n pending: pendingCount > 0,\n authorize,\n loading,\n error,\n refresh,\n };\n}\n","import type { ReactNode } from 'react';\nimport { useMyAuthoredMigration } from '../hooks';\n\nexport interface MigrationPendingBannerProps {\n /** Context whose authored entries to check / convert. */\n contextId: string;\n className?: string;\n /** Override the default prompt text. */\n children?: ReactNode;\n /** Fired once a convert leaves nothing pending (`remaining === 0`). */\n onMigrated?: () => void;\n}\n\n/**\n * Shows only when the current identity has entries below the target schema\n * (skew #1). A single button runs the one-tap `migrate_my_entries` convert and\n * the banner clears itself once nothing is pending.\n */\nexport function MigrationPendingBanner({\n contextId,\n className,\n children,\n onMigrated,\n}: MigrationPendingBannerProps) {\n const { pending, pendingCount, authorize, loading } = useMyAuthoredMigration(contextId);\n\n if (!pending) return null;\n\n const handleClick = async () => {\n const result = await authorize();\n if (result && result.remaining === 0) {\n onMigrated?.();\n }\n };\n\n const message =\n children ??\n `You have ${pendingCount} ${pendingCount === 1 ? 'entry' : 'entries'} to re-sign after a recent upgrade.`;\n\n return (\n <div className={className} data-testid=\"migration-pending-banner\" role=\"status\">\n <span>{message}</span>\n <button type=\"button\" onClick={handleClick} disabled={loading}>\n {loading ? 'Migrating…' : 'Migrate my data'}\n </button>\n </div>\n );\n}\n","import { useMigrationStatus } from '../hooks';\n\nexport interface MigrationAdminPanelProps {\n /** Namespace whose migration rollup to display. */\n namespaceId: string;\n /** Re-fetch interval; migration facts arrive via heartbeat gossip. */\n pollIntervalMs?: number;\n className?: string;\n}\n\n/**\n * Operator view of a namespace's migration rollup (skew #3): the cohort\n * counters, `membersPendingSignature`, and a per-member table. Read-only —\n * pair with the upgrade-trigger hooks to drive a migration.\n */\nexport function MigrationAdminPanel({ namespaceId, pollIntervalMs, className }: MigrationAdminPanelProps) {\n const { status, rollup, members, membersPendingSignature, failed, error } = useMigrationStatus(\n namespaceId,\n { pollIntervalMs },\n );\n\n // Surface a real failure rather than the misleading \"no status\" message.\n if (error && !status) {\n return (\n <div className={className} data-testid=\"migration-admin-panel\">\n Failed to load migration status: {error.message}\n </div>\n );\n }\n\n // Before the first successful fetch (initial paint or in-flight), show\n // loading — a successful read always yields a rollup, so a null status here\n // means \"not loaded yet\", never \"empty\".\n if (!status || !rollup) {\n return <div className={className} data-testid=\"migration-admin-panel\">Loading migration status…</div>;\n }\n\n return (\n <div className={className} data-testid=\"migration-admin-panel\">\n {error && (\n // A poll failed after data was already loaded — keep showing the last\n // good rollup but flag that it may be stale.\n <div data-testid=\"migration-status-error\" role=\"alert\">\n Could not refresh migration status: {error.message}\n </div>\n )}\n <dl>\n <div><dt>Target version</dt><dd>{status.targetVersion}</dd></div>\n <div><dt>Migrated</dt><dd>{rollup.migrated}</dd></div>\n <div><dt>In progress</dt><dd>{rollup.inProgress}</dd></div>\n <div><dt>Unknown</dt><dd>{rollup.unknown}</dd></div>\n <div><dt>Failed</dt><dd data-testid=\"migration-failed-count\">{failed}</dd></div>\n <div><dt>Total</dt><dd>{rollup.total}</dd></div>\n <div><dt>All migrated</dt><dd>{rollup.allMigrated ? 'yes' : 'no'}</dd></div>\n <div>\n <dt>Members pending signature</dt>\n <dd data-testid=\"members-pending-signature\">{membersPendingSignature}</dd>\n </div>\n </dl>\n <table>\n <thead>\n <tr><th>Peer</th><th>State</th><th>Schema</th><th>Pending</th><th>Reason</th></tr>\n </thead>\n <tbody>\n {members.map((m) => (\n <tr key={m.peer} data-testid=\"migration-member-row\">\n <td>{m.peer}</td>\n <td>{m.state}</td>\n <td>{m.report?.schemaVersion ?? '—'}</td>\n <td>{m.report?.authoredRemaining ?? '—'}</td>\n <td>{m.report?.migrationFailed ?? '—'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["#style-inject:#style-inject","../src/components/styles.css","../src/types.ts","../src/auth/node-trust.ts","../src/auth/token-adoption.ts","../src/storage/index.ts","../src/context/MeroContext.tsx","../src/components/CalimeroLogo.tsx","../src/theme.ts","../src/components/LoginModal.tsx","../src/components/ConnectButton.tsx","../src/utils/base58.ts","../src/hooks/index.ts","../src/components/MigrationPendingBanner.tsx","../src/components/MigrationAdminPanel.tsx"],"names":["AppMode","ConnectionType","refreshToken","jsx","useState","useMemo","useEffect","useRef","useCallback","jsxs","createContext"],"mappings":"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","file":"index.js","sourcesContent":["\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\":root {\\n --mero-bg: #0d1117;\\n --mero-bg-secondary: #161b22;\\n --mero-bg-tertiary: #1c2128;\\n --mero-text: #e6edf3;\\n --mero-text-secondary: #8b949e;\\n --mero-accent: #a5ff11;\\n --mero-accent-hover: #8ed40d;\\n --mero-on-primary: #0d1117;\\n --mero-error: #ff6b6b;\\n --mero-border: #30363d;\\n --mero-disabled: #555555;\\n --mero-shadow: rgba(0, 0, 0, 0.5);\\n --mero-overlay: rgba(0, 0, 0, 0.75);\\n --mero-radius: 8px;\\n}\\n.mero-connect-button {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n gap: 8px;\\n padding: 10px 20px;\\n background-color: var(--mero-accent);\\n border: 1px solid var(--mero-accent);\\n border-radius: var(--mero-radius);\\n cursor: pointer;\\n font-size: 14px;\\n font-weight: 600;\\n letter-spacing: 0.01em;\\n color: var(--mero-on-primary);\\n transition:\\n background-color 0.15s ease,\\n border-color 0.15s ease,\\n box-shadow 0.15s ease,\\n transform 0.1s ease;\\n min-width: 140px;\\n box-sizing: border-box;\\n font-family:\\n \\\"Inter\\\",\\n -apple-system,\\n BlinkMacSystemFont,\\n \\\"Segoe UI\\\",\\n Roboto,\\n Oxygen,\\n Ubuntu,\\n sans-serif;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n line-height: 1;\\n}\\n.mero-connect-button:hover:not(.mero-connected):not(.mero-reconnecting) {\\n background-color: var(--mero-accent-hover);\\n border-color: var(--mero-accent-hover);\\n box-shadow: 0 0 0 4px rgba(165, 255, 17, 0.18);\\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mero-accent) 18%, transparent);\\n}\\n.mero-connect-button:active:not(.mero-connected):not(.mero-reconnecting) {\\n transform: translateY(1px);\\n}\\n.mero-connect-button:focus-visible {\\n outline: none;\\n box-shadow: 0 0 0 3px rgba(165, 255, 17, 0.45);\\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mero-accent) 45%, transparent);\\n}\\n.mero-connect-button.mero-logo-only {\\n min-width: 0;\\n width: 40px;\\n height: 40px;\\n padding: 0;\\n gap: 0;\\n}\\n.mero-connect-button.mero-connected {\\n background-color: var(--mero-accent);\\n color: var(--mero-on-primary);\\n border-color: var(--mero-accent);\\n}\\n.mero-connect-button.mero-connected:hover {\\n background-color: var(--mero-accent-hover);\\n border-color: var(--mero-accent-hover);\\n}\\n.mero-connect-button.mero-reconnecting {\\n background-color: var(--mero-bg-secondary);\\n color: var(--mero-text-secondary);\\n border-color: var(--mero-border);\\n cursor: not-allowed;\\n}\\n.mero-connect-container {\\n position: relative;\\n display: inline-block;\\n}\\n.mero-dropdown {\\n position: absolute;\\n top: 100%;\\n left: 0;\\n background-color: var(--mero-bg-secondary);\\n border: 1px solid var(--mero-border);\\n border-radius: var(--mero-radius);\\n margin-top: 6px;\\n padding: 0;\\n z-index: 1001;\\n width: 100%;\\n min-width: 180px;\\n overflow: hidden;\\n box-shadow: 0 8px 24px var(--mero-shadow);\\n}\\n.mero-dropdown-info {\\n padding: 10px 16px;\\n color: var(--mero-text-secondary);\\n font-size: 13px;\\n border-bottom: 1px solid var(--mero-border);\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n max-width: 220px;\\n}\\n.mero-dropdown-item {\\n display: block;\\n width: 100%;\\n padding: 10px 16px;\\n background: none;\\n border: none;\\n color: var(--mero-text);\\n text-align: left;\\n cursor: pointer;\\n font-size: 14px;\\n text-decoration: none;\\n font-family: inherit;\\n}\\n.mero-dropdown-item:hover {\\n background-color: var(--mero-accent);\\n color: var(--mero-on-primary);\\n}\\n.mero-logo {\\n width: 24px;\\n height: 24px;\\n color: currentColor;\\n}\\n@keyframes meroFadeIn {\\n from {\\n opacity: 0;\\n }\\n to {\\n opacity: 1;\\n }\\n}\\n@keyframes meroSlideIn {\\n from {\\n transform: translateY(-12px);\\n opacity: 0;\\n }\\n to {\\n transform: translateY(0);\\n opacity: 1;\\n }\\n}\\n@keyframes meroSpin {\\n to {\\n transform: rotate(360deg);\\n }\\n}\\n\")","/**\n * Types for mero-react\n */\n\nimport type { MeroJs, TokenStore } from '@calimero-network/mero-js';\n\n/**\n * Application mode determines the permission scope\n */\nexport enum AppMode {\n /**\n * @deprecated since 2.1.0 — SingleContext is no longer supported and will\n * be removed in 3.0.0. Auth-frontend no longer drives\n * context/namespace/group selection; the auth callback returns only\n * `access_token`, `refresh_token`, `application_id`, and `node_url`.\n * Switch to {@link AppMode.MultiContext} and have your app manage\n * context selection itself.\n *\n * Migration: see `example/app/src/pages/context/SelectContext.tsx` for a\n * reference implementation. It uses `useContexts` /\n * `useNamespacesForApplication` for listing, then calls\n * `mero.admin.createNamespace` / `createGroupInNamespace` /\n * `createContext` directly (rather than the `useCreate*` hooks) so the\n * underlying server error surfaces to the user instead of being\n * swallowed by `useAsyncMutation`.\n */\n SingleContext = 'single-context',\n /** Multi-context: user can manage multiple contexts */\n MultiContext = 'multi-context',\n /** Admin: full administrative access */\n Admin = 'admin',\n}\n\n/**\n * Connection type for the login modal\n */\nexport enum ConnectionType {\n /**\n * @deprecated The login modal no longer has Local/Remote tabs — it always\n * shows node discovery + manual URL entry. Behaves the same as `Remote`.\n */\n RemoteAndLocal = 'remote-and-local',\n /** Open the login modal (node discovery + manual URL entry) */\n Remote = 'remote',\n /**\n * @deprecated The hardcoded default-local-node view was removed. Behaves\n * the same as `Remote`.\n */\n Local = 'local',\n /** Custom URL (skip modal) */\n Custom = 'custom',\n}\n\n/**\n * Custom connection configuration\n */\nexport interface CustomConnectionConfig {\n type: ConnectionType.Custom;\n url: string;\n}\n\n/**\n * Context for an application\n */\nexport interface AppContext {\n contextId: string;\n executorId: string;\n applicationId: string;\n}\n\n/**\n * Result of an RPC execution\n */\nexport interface ExecutionResult<T = unknown> {\n success: boolean;\n result?: T;\n error?: string;\n}\n\nexport interface ApplicationContextRecord {\n contextId: string;\n applicationId: string;\n}\n\nexport interface ContextDiscoveryOptions {\n applicationId: string;\n knownContextIds?: string[];\n targetAlias?: string;\n pollIntervalMs?: number;\n timeoutMs?: number;\n}\n\nexport interface ContextDiscoveryState {\n context: ApplicationContextRecord | null;\n loading: boolean;\n error: Error | null;\n discover: () => Promise<ApplicationContextRecord | null>;\n reset: () => void;\n}\n\n/**\n * Mero context value exposed by useMero hook\n */\nexport interface MeroContextValue {\n /** The MeroJs instance (null if not connected) */\n mero: MeroJs | null;\n /** Whether the user is authenticated */\n isAuthenticated: boolean;\n /** Whether the connection is online */\n isOnline: boolean;\n /** The current node URL */\n nodeUrl: string | null;\n /** The application ID */\n applicationId: string | null;\n /** The context ID (from auth flow) */\n contextId: string | null;\n /** The context identity / executor public key (from auth flow) */\n contextIdentity: string | null;\n /** Connect to a node URL and start auth flow */\n connectToNode: (url: string) => void;\n /** Logout and clear tokens */\n logout: () => void;\n /** Loading state */\n isLoading: boolean;\n}\n\n/**\n * MeroProvider configuration\n */\nexport interface MeroProviderConfig {\n /** Application mode */\n mode: AppMode;\n /** Package name (for registry-based apps) */\n packageName?: string;\n /** Package version (optional, defaults to latest) */\n packageVersion?: string;\n /** Registry URL (optional) */\n registryUrl?: string;\n /** Request timeout in milliseconds */\n timeoutMs?: number;\n /**\n * Origins the OAuth callback is allowed to authenticate against. Defends\n * against a malicious `node_url` in the callback URL (token exfiltration):\n * the node login was initiated with is always trusted, and this allowlist\n * additionally permits direct-callback entry to known nodes. When neither is\n * available (no initiated node and no allowlist) a callback node_url is\n * rejected and a security error is logged.\n */\n allowedNodeUrls?: string[];\n /**\n * Token store for access/refresh tokens. Defaults to a localStorage-backed\n * store that persists across reloads.\n *\n * SECURITY: localStorage tokens — including the refresh token — are readable\n * by any script on the page, so an XSS bug can exfiltrate them. For sensitive\n * deployments pass a `MemoryTokenStore` (session-only) or a store backed by an\n * HttpOnly cookie set by your auth service.\n */\n tokenStore?: TokenStore;\n}\n","/**\n * Trust decision for the node URL an OAuth callback wants us to authenticate\n * against.\n *\n * The auth flow redirects the browser to a node's auth UI and back to the app\n * with `access_token` / `refresh_token` / `node_url` in the callback URL. That\n * URL is attacker-influenceable, so a malicious `node_url` would otherwise make\n * the SDK send the freshly-minted tokens to an attacker's node (exfiltration).\n *\n * Defense: only authenticate against a node we can independently trust — the\n * node login was *initiated* with (saved before the redirect), or an\n * app-configured allowlist.\n */\n\n/** True iff both URLs parse and share the same origin (scheme + host + port). */\nexport function sameOrigin(a: string, b: string): boolean {\n try {\n return new URL(a).origin === new URL(b).origin;\n } catch {\n return false;\n }\n}\n\nexport interface ResolveTrustedNodeParams {\n /** `node_url` from the OAuth callback (untrusted, attacker-influenceable). */\n candidate: string | null | undefined;\n /** Node URL login was initiated with, saved before the redirect (trusted). */\n initiated: string | null;\n /** Additional trusted origins, for direct-callback entry without an initiated node. */\n allowedNodeUrls?: string[];\n}\n\nexport interface TrustedNodeResult {\n /** The node URL that is safe to authenticate against, or null. */\n url: string | null;\n /** A candidate node_url was present but could not be trusted (likely an attack). */\n rejected: boolean;\n}\n\n/**\n * Decide which node URL, if any, is safe to authenticate against.\n *\n * - No candidate → fall back to the initiated node.\n * - Candidate + initiated node → must share the initiated node's origin, else reject.\n * - Candidate + no initiated node + allowlist → must be in the allowlist, else reject.\n * - Candidate + no trust anchor (no initiated node and no allowlist) → reject. There is\n * nothing to validate the attacker-influenceable callback against, so refusing is the\n * safe default. The normal flow always records the initiated node (via `connectToNode`)\n * before redirecting; configure `allowedNodeUrls` to permit direct-callback entry.\n */\nexport function resolveTrustedNodeUrl(params: ResolveTrustedNodeParams): TrustedNodeResult {\n const { candidate, initiated, allowedNodeUrls } = params;\n\n if (!candidate) {\n return { url: initiated ?? null, rejected: false };\n }\n\n if (initiated) {\n return sameOrigin(candidate, initiated)\n ? { url: candidate, rejected: false }\n : { url: null, rejected: true };\n }\n\n if (allowedNodeUrls && allowedNodeUrls.length > 0) {\n return allowedNodeUrls.some((u) => sameOrigin(candidate, u))\n ? { url: candidate, rejected: false }\n : { url: null, rejected: true };\n }\n\n return { url: null, rejected: true };\n}\n","/**\n * Decide whether the token bundle carried in an SSO callback hash may replace\n * the bundle already in the token store.\n *\n * Since core 0.11.0 (calimero-network/core#3083) refresh tokens are SINGLE-USE:\n * every `POST /auth/refresh` consumes the presented refresh token and returns a\n * new one. Re-presenting a consumed refresh token is treated as theft — the node\n * answers 401 `x-auth-error: token_reuse` and revokes the whole token family, so\n * *every* holder is hard-logged-out.\n *\n * That makes an unconditional `tokenStore.setTokens(callbackBundle)` on the SSO\n * callback path actively dangerous. A desktop host (or any SSO initiator) hands\n * the app a token bundle in the URL hash; if mero-js has already rotated the\n * stored refresh token, writing the hash bundle over it resurrects a *consumed*\n * refresh token. The next refresh presents it → `token_reuse` → family revoked.\n *\n * So the hash bundle is adopted only when it is safe:\n * - there is no stored bundle (a genuinely fresh login), or\n * - the node changed (the stored bundle belongs to a different node), or\n * - the hash tokens are genuinely NEWER than what is stored, or\n * - the stored bundle is missing a refresh token that the hash can supply.\n *\n * Anything else — a stale hash, or a hash replaying the access token we already\n * hold — is ignored, leaving the live (possibly rotated) bundle untouched.\n */\n\nimport type { TokenData } from '@calimero-network/mero-js';\nimport { sameOrigin } from './node-trust';\n\nconst HOUR_MS = 3_600_000;\n\ninterface JwtClaims {\n /** Issued-at (seconds). The authoritative rotation-order signal when present. */\n iat?: number;\n /** Expiry (seconds). */\n exp?: number;\n}\n\n/**\n * Decode a JWT's payload claims without verifying the signature.\n *\n * Verification is the node's job — we only need the ordering claims to decide\n * which of two bundles is newer, and both bundles are already node-trusted by\n * the time we get here (see `resolveTrustedNodeUrl`).\n *\n * Returns null for anything that is not a decodable three-part JWT (opaque\n * tokens, test fixtures, garbage).\n */\nexport function decodeJwtClaims(token: string): JwtClaims | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n let b64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n while (b64.length % 4) b64 += '=';\n const payload: unknown = JSON.parse(atob(b64));\n if (!payload || typeof payload !== 'object') return null;\n const { iat, exp } = payload as JwtClaims;\n return {\n iat: typeof iat === 'number' && iat > 0 ? iat : undefined,\n exp: typeof exp === 'number' && exp > 0 ? exp : undefined,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Absolute expiry (ms) of an access token, from its `exp` claim.\n *\n * Mirrors mero-js's internal `expiresAtFromJwt` (which it does not export —\n * checked against mero-js 6.1.0), including the \"assume one hour\" fallback for\n * tokens whose expiry we cannot read.\n */\nexport function expiresAtFromJwt(token: string, fallbackMs: number = Date.now() + HOUR_MS): number {\n const exp = decodeJwtClaims(token)?.exp;\n return exp ? exp * 1000 : fallbackMs;\n}\n\n/**\n * Is the callback's access token newer than the one we already hold?\n *\n * Prefers `iat` (issued-at) — the direct rotation-order signal — and falls back\n * to `exp`, then to the stored bundle's recorded `expires_at`. When the answer\n * cannot be established the token is NOT considered newer: refusing to adopt\n * costs a redundant login at worst, whereas adopting a stale bundle burns the\n * whole token family.\n */\nfunction isCallbackNewer(callbackAccessToken: string, stored: TokenData): boolean {\n const incoming = decodeJwtClaims(callbackAccessToken);\n if (!incoming) return false;\n\n const current = decodeJwtClaims(stored.access_token);\n if (current) {\n if (incoming.iat !== undefined && current.iat !== undefined && incoming.iat !== current.iat) {\n return incoming.iat > current.iat;\n }\n if (incoming.exp !== undefined && current.exp !== undefined && incoming.exp !== current.exp) {\n return incoming.exp > current.exp;\n }\n // Same claims (a replay of the token we already hold), or nothing to compare\n // on — either way the callback brings nothing new.\n return false;\n }\n\n // Stored access token is not a decodable JWT — compare against the expiry the\n // store recorded for it.\n return incoming.exp !== undefined && incoming.exp * 1000 > stored.expires_at;\n}\n\n/** Why the SSO hash bundle was (or was not) written to the token store. */\nexport type TokenAdoptionReason =\n /** No stored bundle — a genuinely fresh login. Seed from the hash. */\n | 'fresh-login'\n /** The stored bundle belongs to a different node. Re-seed from the hash. */\n | 'node-changed'\n /** The hash tokens are genuinely newer than the stored ones. */\n | 'newer'\n /** Same session, but the stored bundle has no refresh token and the hash does. */\n | 'fill-refresh'\n /** The hash tokens are stale, or replay the access token we already hold. */\n | 'stale';\n\nexport type TokenAdoptionDecision =\n | { adopt: true; tokens: TokenData; reason: Exclude<TokenAdoptionReason, 'stale'> }\n | { adopt: false; reason: 'stale' };\n\nexport interface ResolveTokenAdoptionParams {\n /** Access token from the callback hash. Always present (mero-js returns null otherwise). */\n callbackAccessToken: string;\n /**\n * Refresh token from the callback hash. `parseAuthCallback` yields `''` when the\n * hash carries no `refresh_token` — hosts are moving to access-only bundles\n * precisely so they cannot hand back a rotated-away refresh token.\n */\n callbackRefreshToken: string;\n /** Trusted node URL the callback resolved to (see `resolveTrustedNodeUrl`). */\n callbackNodeUrl: string;\n /** Bundle currently in the token store — mero-js may have rotated it already. */\n stored: TokenData | null;\n /** Node URL the stored bundle was issued by, i.e. the node URL before this callback. */\n storedNodeUrl: string | null;\n}\n\n/**\n * Decide what (if anything) to write to the token store for an SSO callback.\n *\n * Never returns a bundle with an empty `refresh_token` when a refresh token for\n * the same node is already stored: an access-only hash bundle is MERGED over the\n * stored one, so adopting a fresher access token cannot strip the session's\n * ability to refresh.\n */\nexport function resolveTokenAdoption(params: ResolveTokenAdoptionParams): TokenAdoptionDecision {\n const { callbackAccessToken, callbackRefreshToken, callbackNodeUrl, stored, storedNodeUrl } =\n params;\n\n const bundle = (refreshToken: string): TokenData => ({\n access_token: callbackAccessToken,\n refresh_token: refreshToken,\n expires_at: expiresAtFromJwt(callbackAccessToken),\n });\n\n // Fresh login — nothing to protect.\n if (!stored?.access_token) {\n return { adopt: true, tokens: bundle(callbackRefreshToken), reason: 'fresh-login' };\n }\n\n // Different node — the stored bundle is for someone else's token family, and\n // its refresh token is meaningless here, so it must NOT be carried over.\n const sameNode = !!storedNodeUrl && sameOrigin(callbackNodeUrl, storedNodeUrl);\n if (!sameNode) {\n return { adopt: true, tokens: bundle(callbackRefreshToken), reason: 'node-changed' };\n }\n\n // Same node, live bundle. Keep the stored refresh token unless the hash carries\n // one — the hash's refresh token may be a copy that mero-js has already rotated\n // away, but an *empty* one would strip refresh from the session entirely.\n const refreshToken = callbackRefreshToken || stored.refresh_token;\n\n if (isCallbackNewer(callbackAccessToken, stored)) {\n return { adopt: true, tokens: bundle(refreshToken), reason: 'newer' };\n }\n\n // The access token is not newer, but the stored bundle cannot refresh and the\n // hash can repair that. Keep the *stored* access token (it is at least as new).\n if (!stored.refresh_token && callbackRefreshToken) {\n return {\n adopt: true,\n tokens: { ...stored, refresh_token: callbackRefreshToken },\n reason: 'fill-refresh',\n };\n }\n\n // Stale (or a replay of the bundle we already hold). Writing it would resurrect\n // a consumed refresh token → `token_reuse` → the node revokes the whole family.\n return { adopt: false, reason: 'stale' };\n}\n","/**\n * Storage utilities for mero-react\n * \n * Provides localStorage-based token storage and other persistence utilities.\n */\n\nimport type { TokenData } from '@calimero-network/mero-js';\n\n// Storage keys\nconst STORAGE_KEYS = {\n ACCESS_TOKEN: 'mero:access_token',\n REFRESH_TOKEN: 'mero:refresh_token',\n EXPIRES_AT: 'mero:expires_at',\n NODE_URL: 'mero:node_url',\n // The node the token bundle currently in the TokenStore was issued by. Distinct\n // from NODE_URL, which `connectToNode` overwrites with the *target* node before\n // redirecting to login — so at callback time NODE_URL names where we are going,\n // not who minted the tokens we still hold. Telling those apart is what lets the\n // SSO callback re-seed on a node change without mistaking a different node's\n // bundle for a rotated one (see auth/token-adoption.ts).\n TOKEN_NODE_URL: 'mero:token_node_url',\n APPLICATION_ID: 'mero:application_id',\n CONTEXT_ID: 'mero:context_id',\n CONTEXT_IDENTITY: 'mero:context_identity',\n} as const;\n\nlet _storageAvailable: boolean | null = null;\n\nfunction isLocalStorageAvailable(): boolean {\n if (_storageAvailable !== null) return _storageAvailable;\n try {\n if (typeof window === 'undefined' || !window.localStorage) {\n _storageAvailable = false;\n return false;\n }\n const testKey = '__mero_test__';\n localStorage.setItem(testKey, 'test');\n localStorage.removeItem(testKey);\n _storageAvailable = true;\n } catch {\n _storageAvailable = false;\n }\n return _storageAvailable;\n}\n\nexport const localStorageTokenStorage = {\n async get(): Promise<TokenData | null> {\n if (!isLocalStorageAvailable()) {\n return null;\n }\n\n try {\n const accessToken = localStorage.getItem(STORAGE_KEYS.ACCESS_TOKEN);\n const refreshToken = localStorage.getItem(STORAGE_KEYS.REFRESH_TOKEN);\n const expiresAt = localStorage.getItem(STORAGE_KEYS.EXPIRES_AT);\n\n if (!accessToken || !refreshToken) {\n return null;\n }\n\n return {\n access_token: accessToken,\n refresh_token: refreshToken,\n expires_at: expiresAt ? parseInt(expiresAt, 10) : Date.now() + 3600000,\n };\n } catch (e) {\n console.error('[mero-react] Failed to get token from storage:', e);\n return null;\n }\n },\n\n async set(token: TokenData): Promise<void> {\n if (!isLocalStorageAvailable()) {\n return;\n }\n\n try {\n localStorage.setItem(STORAGE_KEYS.ACCESS_TOKEN, token.access_token);\n localStorage.setItem(STORAGE_KEYS.REFRESH_TOKEN, token.refresh_token);\n localStorage.setItem(STORAGE_KEYS.EXPIRES_AT, token.expires_at.toString());\n } catch (e) {\n console.error('[mero-react] Failed to save token to storage:', e);\n }\n },\n\n async clear(): Promise<void> {\n if (!isLocalStorageAvailable()) {\n return;\n }\n\n try {\n localStorage.removeItem(STORAGE_KEYS.ACCESS_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.REFRESH_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.EXPIRES_AT);\n } catch (e) {\n console.error('[mero-react] Failed to clear token from storage:', e);\n }\n },\n};\n\n/**\n * Get the stored node URL\n */\nexport function getNodeUrl(): string | null {\n if (!isLocalStorageAvailable()) return null;\n return localStorage.getItem(STORAGE_KEYS.NODE_URL);\n}\n\n/**\n * Set the node URL\n */\nexport function setNodeUrl(url: string): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.setItem(STORAGE_KEYS.NODE_URL, url);\n}\n\n/**\n * Clear the node URL\n */\nexport function clearNodeUrl(): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.removeItem(STORAGE_KEYS.NODE_URL);\n}\n\n/**\n * Get the node URL that minted the token bundle currently in the TokenStore.\n */\nexport function getTokenNodeUrl(): string | null {\n if (!isLocalStorageAvailable()) return null;\n return localStorage.getItem(STORAGE_KEYS.TOKEN_NODE_URL);\n}\n\n/**\n * Record the node URL that minted the token bundle now in the TokenStore.\n */\nexport function setTokenNodeUrl(url: string): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.setItem(STORAGE_KEYS.TOKEN_NODE_URL, url);\n}\n\n/**\n * Clear the token bundle's node URL\n */\nexport function clearTokenNodeUrl(): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.removeItem(STORAGE_KEYS.TOKEN_NODE_URL);\n}\n\n/**\n * Get the stored application ID\n */\nexport function getApplicationId(): string | null {\n if (!isLocalStorageAvailable()) return null;\n return localStorage.getItem(STORAGE_KEYS.APPLICATION_ID);\n}\n\n/**\n * Set the application ID\n */\nexport function setApplicationId(id: string): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.setItem(STORAGE_KEYS.APPLICATION_ID, id);\n}\n\n/**\n * Clear the application ID\n */\nexport function clearApplicationId(): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.removeItem(STORAGE_KEYS.APPLICATION_ID);\n}\n\n/**\n * Get the stored context ID\n */\nexport function getContextId(): string | null {\n if (!isLocalStorageAvailable()) return null;\n return localStorage.getItem(STORAGE_KEYS.CONTEXT_ID);\n}\n\n/**\n * Set the context ID\n */\nexport function setContextId(id: string): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.setItem(STORAGE_KEYS.CONTEXT_ID, id);\n}\n\n/**\n * Clear the context ID\n */\nexport function clearContextId(): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.removeItem(STORAGE_KEYS.CONTEXT_ID);\n}\n\n/**\n * Get the stored context identity\n */\nexport function getContextIdentity(): string | null {\n if (!isLocalStorageAvailable()) return null;\n return localStorage.getItem(STORAGE_KEYS.CONTEXT_IDENTITY);\n}\n\n/**\n * Set the context identity\n */\nexport function setContextIdentity(id: string): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.setItem(STORAGE_KEYS.CONTEXT_IDENTITY, id);\n}\n\n/**\n * Clear the context identity\n */\nexport function clearContextIdentity(): void {\n if (!isLocalStorageAvailable()) return;\n localStorage.removeItem(STORAGE_KEYS.CONTEXT_IDENTITY);\n}\n\n/**\n * Clear all mero-react storage\n */\nexport function clearAllStorage(): void {\n if (!isLocalStorageAvailable()) return;\n Object.values(STORAGE_KEYS).forEach((key) => {\n localStorage.removeItem(key);\n });\n}\n","import React, {\n createContext,\n useContext,\n useState,\n useEffect,\n useCallback,\n useRef,\n useMemo,\n} from 'react';\nimport {\n MeroJs,\n LocalStorageTokenStore,\n parseAuthCallback,\n buildAuthLoginUrl,\n} from '@calimero-network/mero-js';\nimport { AppMode } from '../types';\nimport type { AuthCallbackResult, TokenStore } from '@calimero-network/mero-js';\nimport { resolveTrustedNodeUrl } from '../auth/node-trust';\nimport { resolveTokenAdoption } from '../auth/token-adoption';\nimport {\n getNodeUrl,\n setNodeUrl,\n getTokenNodeUrl,\n setTokenNodeUrl,\n getApplicationId,\n setApplicationId,\n getContextId,\n setContextId,\n getContextIdentity,\n setContextIdentity,\n clearAllStorage,\n} from '../storage';\nimport type { MeroContextValue, MeroProviderConfig } from '../types';\n\nconst MeroContext = createContext<MeroContextValue | null>(null);\n\nconst isBrowser = typeof window !== 'undefined';\n\n/**\n * Permission grants requested for the client token at login.\n *\n * Cores since 0.11.0-rc.9 default-deny admin-api routes the token holds no\n * scope for; cores >=0.11.0-rc.11 map the governance/blob/alias routes to the\n * client-grantable `namespace` / `group` / `blob` / `context:alias`\n * permissions, so app tokens must request them here or every workspace,\n * group, blob and context-alias call 403s.\n *\n * `context:list` is included even in single-context mode because every app\n * calls GET /admin-api/contexts/:id/identities-owned right after login, which\n * maps to a `context:list` requirement.\n *\n * Exported for tests.\n */\nexport function getPermissionsForMode(mode: AppMode): string[] {\n switch (mode) {\n case AppMode.SingleContext:\n return ['context:execute', 'context:list', 'application:list', 'blob', 'context:alias'];\n case AppMode.MultiContext:\n return [\n 'context:create',\n 'context:list',\n 'context:execute',\n 'application:list',\n 'namespace',\n 'group',\n 'blob',\n 'context:alias',\n ];\n case AppMode.Admin:\n return ['admin'];\n default:\n throw new Error(`Unsupported application mode: ${mode}`);\n }\n}\n\nexport interface MeroProviderProps extends MeroProviderConfig {\n children: React.ReactNode;\n}\n\nexport function MeroProvider({\n children,\n mode,\n packageName,\n packageVersion,\n registryUrl,\n timeoutMs = 30000,\n allowedNodeUrls,\n tokenStore: tokenStoreProp,\n}: MeroProviderProps) {\n const tokenStore = useMemo<TokenStore>(\n () => tokenStoreProp ?? new LocalStorageTokenStore(),\n [tokenStoreProp],\n );\n const [mero, setMero] = useState<MeroJs | null>(null);\n const [isAuthenticated, setIsAuthenticated] = useState(false);\n const [isOnline, setIsOnline] = useState(true);\n const [isLoading, setIsLoading] = useState(true);\n const [nodeUrl, setNodeUrlState] = useState<string | null>(() => getNodeUrl());\n const [applicationId, setApplicationIdState] = useState<string | null>(\n () => getApplicationId() || null,\n );\n const [contextId, setContextIdState] = useState<string | null>(() => getContextId());\n const [contextIdentity, setContextIdentityState] = useState<string | null>(() => getContextIdentity());\n\n const meroRef = useRef<MeroJs | null>(null);\n // Guards the SSE 401 recovery below, so a burst of reconnect failures can't\n // stack concurrent validate/refresh attempts over one single-use refresh token.\n const recoveringRef = useRef(false);\n\n // Parse auth callback ONCE in a ref (StrictMode-safe: refs persist across unmount/remount)\n const callbackRef = useRef<AuthCallbackResult | null | undefined>(undefined);\n if (callbackRef.current === undefined && isBrowser) {\n callbackRef.current = parseAuthCallback(window.location.href);\n }\n\n const createMeroInstance = useCallback(\n (url: string): MeroJs => {\n if (meroRef.current) {\n meroRef.current.close();\n }\n const instance = new MeroJs({\n baseUrl: url,\n tokenStore,\n timeoutMs,\n });\n meroRef.current = instance;\n return instance;\n },\n [timeoutMs, tokenStore],\n );\n\n const checkAuth = useCallback(\n async (instance: MeroJs): Promise<boolean> => {\n // Validate the session via /auth/validate (signature, revocation, node\n // binding — no permission requirement) instead of probing\n // GET /admin-api/contexts. Since core 0.11.0-rc.9 the node enforces\n // token permission scopes, and /admin-api/contexts requires Global\n // `context:list` — which single-context tokens (execute-only) and\n // app-scoped tokens don't hold, so probing it 403'd valid sessions and\n // bounced every app straight back to the login page.\n const accessToken = tokenStore.getTokens()?.access_token;\n if (!accessToken) return false;\n\n const validate = async (token: string): Promise<boolean> => {\n try {\n const { valid } = await instance.auth.validateToken(token);\n return valid;\n } catch {\n return false;\n }\n };\n\n if (await validate(accessToken)) return true;\n\n // An expired access token does NOT mean the session is over: refresh\n // tokens last 30 days against core's 1-hour access TTL, so on any reload\n // more than an hour after login we land here holding a perfectly good\n // refresh token.\n //\n // `validateToken` has in fact already spent it. It pins the token under\n // test into an explicit `Authorization` header, and mero-js's init\n // headers override the transport's own token (mero-js\n // http-client/web-client.js `buildHeaders`). So the 401 + `x-auth-error:\n // token_expired` trips the transport's refresh hook — rotating the stored\n // bundle — and then the retry re-sends the SAME stale header, 401s again,\n // and reports `valid: false`. The session was silently renewed and thrown\n // away, and the app bounced to login; a second reload would then \"fix\"\n // itself, which is exactly how this reads as a random logout.\n //\n // So: re-read the store, and if the transport rotated it underneath us,\n // judge the session on the token we ACTUALLY hold now. We never call\n // /auth/refresh ourselves — doing so would race mero-js's single-flight\n // lock over a single-use refresh token and get the whole family revoked\n // (calimero-network/core#3083).\n const rotated = tokenStore.getTokens()?.access_token;\n if (!rotated || rotated === accessToken) return false;\n return validate(rotated);\n },\n [tokenStore],\n );\n\n const connectToNode = useCallback(\n (url: string) => {\n if (!isBrowser) return;\n setNodeUrl(url);\n setNodeUrlState(url);\n\n const callbackUrl = new URL(window.location.href);\n callbackUrl.hash = '';\n\n const loginUrl = buildAuthLoginUrl(url, {\n callbackUrl: callbackUrl.toString(),\n permissions: getPermissionsForMode(mode),\n mode,\n packageName,\n packageVersion,\n registryUrl,\n });\n\n window.location.href = loginUrl;\n },\n [mode, packageName, packageVersion, registryUrl],\n );\n\n const logout = useCallback(() => {\n if (meroRef.current) {\n meroRef.current.clearToken();\n meroRef.current.close();\n }\n // Always clear the token store, even when not connected (meroRef is null) —\n // otherwise the access/refresh tokens persist in storage after logout.\n tokenStore.clear();\n clearAllStorage();\n setMero(null);\n setIsAuthenticated(false);\n setNodeUrlState(null);\n setApplicationIdState(null);\n setContextIdState(null);\n setContextIdentityState(null);\n meroRef.current = null;\n }, [tokenStore]);\n\n // Initialization effect\n useEffect(() => {\n let active = true;\n\n const init = async () => {\n const callback = callbackRef.current;\n let nodeFromCallback: string | null = null;\n\n if (callback) {\n // Read BEFORE the callback overwrites either of them.\n // - initiatedNodeUrl: the node login was initiated with — the trust anchor.\n // - tokenNodeUrl: the node that minted the bundle currently in the store.\n // They differ exactly when the user is switching nodes: `connectToNode`\n // points NODE_URL at the *target* node before redirecting, while the store\n // still holds the *previous* node's bundle. Falling back to the initiated\n // node keeps sessions that predate TOKEN_NODE_URL working.\n const initiatedNodeUrl = getNodeUrl();\n const tokenNodeUrl = getTokenNodeUrl() ?? initiatedNodeUrl;\n\n // The callback URL is attacker-influenceable, so validate its node_url\n // BEFORE storing tokens or connecting — otherwise a malicious node_url\n // would receive the freshly-minted tokens (exfiltration).\n const { url, rejected } = resolveTrustedNodeUrl({\n candidate: callback.nodeUrl,\n initiated: initiatedNodeUrl,\n allowedNodeUrls,\n });\n\n // Always strip the callback params (tokens + node_url) from the address\n // bar and consume the parsed callback, whatever the trust outcome.\n if (isBrowser) {\n window.history.replaceState({}, '', window.location.pathname + window.location.search);\n }\n callbackRef.current = null;\n\n if (rejected) {\n // Untrusted node_url — likely a token-exfiltration attempt. Drop the\n // callback's tokens, but DON'T return: fall through to restore any\n // existing session from storage so a tampered callback can't log a\n // legitimately authenticated user out.\n console.error(\n '[MeroProvider] OAuth callback node_url is not trusted (it does not match the node ' +\n 'login was initiated with, nor `allowedNodeUrls`). Ignoring the callback; no tokens stored.',\n );\n } else if (url) {\n // Trusted node → the callback's tokens MAY be persisted. Whether they\n // SHOULD be is a separate question: refresh tokens are single-use since\n // core 0.11.0 (calimero-network/core#3083), so blindly writing the hash\n // bundle over a bundle mero-js has already rotated resurrects a consumed\n // refresh token — the node reads that as theft (`x-auth-error:\n // token_reuse`) and revokes the entire token family, hard-logging out\n // every holder. Adopt only a fresh, newer, or different-node bundle, and\n // merge rather than replace so an access-only hash (hosts are dropping\n // `refresh_token` from the hash) can never strip a live refresh token.\n const decision = resolveTokenAdoption({\n callbackAccessToken: callback.accessToken,\n callbackRefreshToken: callback.refreshToken,\n callbackNodeUrl: url,\n stored: tokenStore.getTokens(),\n storedNodeUrl: tokenNodeUrl,\n });\n\n if (decision.adopt) {\n tokenStore.setTokens(decision.tokens);\n setTokenNodeUrl(url);\n } else {\n console.warn(\n '[MeroProvider] Ignoring the SSO callback token bundle: it is stale (not newer than ' +\n 'the tokens already stored for this node). Adopting it would replay an already-rotated ' +\n 'refresh token, which the node revokes the whole token family for.',\n );\n }\n\n if (callback.applicationId) {\n setApplicationId(callback.applicationId);\n if (active) setApplicationIdState(callback.applicationId);\n }\n if (callback.contextId) {\n setContextId(callback.contextId);\n if (active) setContextIdState(callback.contextId);\n }\n if (callback.contextIdentity) {\n setContextIdentity(callback.contextIdentity);\n if (active) setContextIdentityState(callback.contextIdentity);\n }\n\n setNodeUrl(url);\n if (active) setNodeUrlState(url);\n nodeFromCallback = url;\n }\n // url === null && !rejected → callback had no node to bind to; ignore it.\n }\n\n const savedUrl = nodeFromCallback || getNodeUrl();\n if (!savedUrl) {\n if (active) setIsLoading(false);\n return;\n }\n\n const instance = createMeroInstance(savedUrl);\n const authed = await checkAuth(instance);\n\n if (!active) return;\n\n if (authed) {\n setMero(instance);\n setIsAuthenticated(true);\n setIsOnline(true);\n } else if (nodeFromCallback) {\n setMero(instance);\n }\n\n setIsLoading(false);\n };\n\n init().catch((err) => {\n console.error('[MeroProvider] Initialization failed:', err);\n if (active) setIsLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [createMeroInstance, checkAuth, allowedNodeUrls, tokenStore]);\n\n // SSE connection for online/offline detection — no polling.\n useEffect(() => {\n if (!isAuthenticated || !meroRef.current) return;\n\n let active = true;\n const sse = meroRef.current.events;\n\n const onConnect = () => { if (active) setIsOnline(true); };\n const onError = (err: Error) => {\n if (!active) return;\n setIsOnline(false);\n if (!err.message.includes('401')) return;\n\n // A 401 from the event stream is NOT proof the session is over, and it\n // used to be treated as such: `logout()` wipes the token store, so an\n // expired access token cost the user their still-valid 30-day refresh\n // token and forced a real re-login.\n //\n // The stream authenticates only at connect time (an open stream survives\n // expiry), so this fires on the first reconnect after the access token\n // ages out — a sleep/wake, a network blip, a PWA resume, a node restart.\n // Routine events, all of them.\n //\n // We cannot tell `token_expired` from a revoked family here: mero-js's\n // SseClient connects with a raw fetch and throws a bare\n // `SSE connection failed: <status>`, so no `x-auth-error` and no\n // `AuthRevokedError` reaches us. Instead of guessing, ask `checkAuth`,\n // which recovers a merely-expired token via the transport's refresh and\n // returns false only when the session is genuinely dead.\n if (recoveringRef.current) return;\n recoveringRef.current = true;\n void (async () => {\n try {\n const instance = meroRef.current;\n if (!instance) return;\n if (await checkAuth(instance)) {\n // Renewed. mero-js's `onTokenRefresh` hook has already updated the\n // instance's in-memory token, so the SseClient's `getAuthToken`\n // hands the reconnect the new one.\n if (active) await instance.events.connect().catch(() => {});\n return;\n }\n if (active) logout();\n } finally {\n recoveringRef.current = false;\n }\n })();\n };\n\n sse.on('connect', onConnect);\n sse.on('error', onError);\n sse.connect().catch(() => { if (active) setIsOnline(false); });\n\n return () => {\n active = false;\n sse.off('connect', onConnect);\n sse.off('error', onError);\n };\n // `checkAuth` and `logout` are both useCallback-stable (they close over the\n // memoized `tokenStore`), so listing them does not re-subscribe the stream.\n }, [isAuthenticated, mero, checkAuth, logout]);\n\n const contextValue = useMemo<MeroContextValue>(\n () => ({\n mero,\n isAuthenticated,\n isOnline,\n nodeUrl,\n applicationId,\n contextId,\n contextIdentity,\n connectToNode,\n logout,\n isLoading,\n }),\n [mero, isAuthenticated, isOnline, nodeUrl, applicationId, contextId, contextIdentity, connectToNode, logout, isLoading],\n );\n\n return (\n <MeroContext.Provider value={contextValue}>\n {children}\n </MeroContext.Provider>\n );\n}\n\nexport function useMero(): MeroContextValue {\n const context = useContext(MeroContext);\n if (!context) {\n throw new Error('useMero must be used within a MeroProvider');\n }\n return context;\n}\n\nexport { MeroContext };\n","/**\n * CalimeroLogo - the official Calimero emblem.\n *\n * Uses `currentColor` for fills so the consumer can theme it with `color`,\n * a `style.color` override, or by passing `color` directly.\n */\n\nimport React from 'react';\n\nexport interface CalimeroLogoProps extends React.SVGAttributes<SVGSVGElement> {\n /** Width / height shorthand (applied to both). Default: 24. */\n size?: number | string;\n}\n\nexport function CalimeroLogo({\n size = 24,\n color,\n style,\n ...rest\n}: CalimeroLogoProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 193 193\"\n fill={color ?? 'currentColor'}\n style={style}\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n {...rest}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M13.5969 23.2235C63.4924 -4.81833 123.53 2.55678 148.374 10.0273C153.006 11.4201 155.606 16.2198 154.181 20.7478C152.757 25.2758 147.846 27.8173 143.214 26.4245C120.866 19.7045 66.3988 13.3369 22.3442 38.0961C21.3748 38.6409 20.8298 39.6384 20.8808 40.6778C22.5544 74.7376 40.6646 139.735 103.059 173.709C107.293 176.015 108.813 181.238 106.455 185.377C104.096 189.516 98.7523 191.002 94.5186 188.696C24.7767 150.721 5.18199 78.7606 3.35124 41.5008C2.98177 33.9812 6.96683 26.9496 13.5969 23.2235Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M180.214 22.5271C185.054 22.2785 189.183 25.9121 189.437 30.6429C192.776 92.7591 159.782 138.316 138.517 157.587C133.185 162.419 125.221 164.303 117.934 161.241C102.817 154.887 88.1835 141.52 76.3001 128.189C64.2403 114.66 54.1712 100.2 48.3006 90.492C45.8345 86.4139 47.2173 81.1537 51.3891 78.743C55.561 76.3323 60.9421 77.684 63.4082 81.7621C68.803 90.6832 78.2588 104.272 89.5315 116.919C100.981 129.763 113.488 140.698 124.866 145.48C125.179 145.612 125.851 145.671 126.586 145.006C145.206 128.132 174.903 87.1988 171.912 31.5431C171.657 26.8122 175.374 22.7756 180.214 22.5271Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M85.9137 55.4487C70.263 57.0264 57.2007 60.7039 50.4014 63.4262C45.9168 65.2218 40.7922 63.1236 38.9553 58.7397C37.1184 54.3559 39.2649 49.3464 43.7495 47.5508C52.2083 44.164 66.9167 40.1173 84.1135 38.3837C101.323 36.649 121.62 37.1693 140.947 43.4423C149.244 46.1351 155.088 53.9217 154.482 62.8728C153.225 81.429 144.514 100.403 127.158 122.145C124.177 125.88 118.663 126.546 114.842 123.631C111.021 120.717 110.341 115.327 113.322 111.592C129.481 91.3484 136.032 75.6017 136.971 61.7394C137.02 61.0029 136.547 60.0904 135.417 59.7238C119.18 54.4537 101.552 53.8722 85.9137 55.4487Z\"\n />\n </svg>\n );\n}\n\nexport default CalimeroLogo;\n","/**\n * Theme tokens for mero-react components.\n *\n * Defaults match the green palette used across Calimero apps (admin-dashboard,\n * tauri-app, app-registry). Pass a partial `MeroTheme` to `ConnectButton` or\n * `LoginModal` to override any token.\n */\n\nimport type { CSSProperties } from 'react';\n\nexport interface MeroTheme {\n /** Primary accent / CTA color */\n primary?: string;\n /** Primary accent on hover */\n primaryHover?: string;\n /** Text color rendered on top of `primary` (e.g. inside the Connect button when connected) */\n primaryText?: string;\n /** Main surface color (modal background, button background) */\n background?: string;\n /** Secondary surface color (input fields, info chips) */\n backgroundSecondary?: string;\n /** Tertiary surface color (subtle elevation) */\n backgroundTertiary?: string;\n /** Border color */\n border?: string;\n /** Primary text color */\n text?: string;\n /** Muted / secondary text color */\n textSecondary?: string;\n /** Error / danger color */\n error?: string;\n /** Modal backdrop color */\n overlay?: string;\n /** Border radius (any CSS length) */\n radius?: string;\n}\n\nexport type ResolvedMeroTheme = Required<MeroTheme>;\n\nexport const defaultMeroTheme: Readonly<ResolvedMeroTheme> = Object.freeze({\n primary: '#a5ff11',\n primaryHover: '#8ed40d',\n primaryText: '#0d1117',\n background: '#0d1117',\n backgroundSecondary: '#161b22',\n backgroundTertiary: '#1c2128',\n border: '#30363d',\n text: '#e6edf3',\n textSecondary: '#8b949e',\n error: '#ff6b6b',\n overlay: 'rgba(0, 0, 0, 0.75)',\n radius: '8px',\n});\n\n/**\n * Merge a partial theme with the defaults.\n *\n * Filtering rules — values that fall back to the default:\n * - `undefined` (the prop key wasn't set, or was set to `undefined`)\n * - empty string `''`\n * - whitespace-only strings (e.g. `' '`)\n *\n * These are dropped because they're invalid CSS and would produce\n * invisible elements (transparent backgrounds, missing borders, etc.).\n * If you genuinely want the browser default for a token, omit the key\n * from the theme prop rather than passing an empty string.\n *\n * Any other non-empty string is forwarded as-is — CSS syntax itself\n * is NOT validated.\n */\nexport function resolveMeroTheme(theme?: MeroTheme): ResolvedMeroTheme {\n if (!theme) return { ...defaultMeroTheme };\n const filtered = Object.fromEntries(\n Object.entries(theme).filter(\n ([, v]) => v !== undefined && typeof v === 'string' && v.trim() !== '',\n ),\n ) as Partial<MeroTheme>;\n return { ...defaultMeroTheme, ...filtered };\n}\n\n/**\n * Single source of truth mapping each `MeroTheme` token name to the CSS\n * custom-property name it surfaces as. Used by `themeToCssVars` to emit the\n * inline-style map and by component code (e.g. `LoginModal`) to read the\n * variable in inline styles via `var(--mero-*, fallback)`.\n *\n * Adding a new token? Add it here, in `MeroTheme`, and in `defaultMeroTheme`,\n * and the rest of the system picks it up automatically.\n */\nexport const MERO_CSS_VARS: Record<keyof MeroTheme, string> = {\n background: '--mero-bg',\n backgroundSecondary: '--mero-bg-secondary',\n backgroundTertiary: '--mero-bg-tertiary',\n text: '--mero-text',\n textSecondary: '--mero-text-secondary',\n primary: '--mero-accent',\n primaryHover: '--mero-accent-hover',\n primaryText: '--mero-on-primary',\n border: '--mero-border',\n error: '--mero-error',\n overlay: '--mero-overlay',\n radius: '--mero-radius',\n};\n\n/**\n * Build a `style` object that exposes a resolved theme as CSS variables, so\n * descendant CSS rules (e.g. those in `styles.css`) pick up the overrides.\n */\nexport function themeToCssVars(theme: ResolvedMeroTheme): CSSProperties {\n const vars: Record<string, string> = {};\n for (const key of Object.keys(MERO_CSS_VARS) as Array<keyof MeroTheme>) {\n vars[MERO_CSS_VARS[key]] = theme[key];\n }\n return vars as CSSProperties;\n}\n\n/**\n * Returns a `var(--mero-*, fallback)` reference for a theme token, suitable\n * for inline styles in portal-rendered components where descendant CSS\n * variables also need to support global `:root` overrides.\n */\nexport function cssVar(theme: ResolvedMeroTheme, key: keyof MeroTheme): string {\n return `var(${MERO_CSS_VARS[key]}, ${theme[key]})`;\n}\n","/**\n * LoginModal - Modal for connecting to a Calimero node\n *\n * A single section: the modal auto-discovers nodes on the well-known local\n * ports (see `nodeDiscovery`) and offers whatever is running as radio choices,\n * plus an always-available \"enter URL manually\" option. With nothing found it\n * falls straight through to manual URL entry.\n *\n * The old Local/Remote tabs are gone — the \"Local\" tab pointed at a hardcoded\n * default node (`node1.127.0.0.1.nip.io`) that doesn't resolve in most setups;\n * discovery + manual entry covers both cases properly.\n */\n\nimport { useMemo, useState, useEffect, useCallback, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { CalimeroLogo } from './CalimeroLogo';\nimport type { ConnectionType, CustomConnectionConfig } from '../types';\nimport {\n discoverLocalNodes,\n nodeEndpoint,\n DEFAULT_LOCAL_NODE_PORTS,\n} from '@calimero-network/mero-js';\nimport {\n cssVar,\n resolveMeroTheme,\n themeToCssVars,\n type MeroTheme,\n type ResolvedMeroTheme,\n} from '../theme';\n\n/** Sentinel selection value for the manual \"enter a URL\" option. */\nconst CUSTOM_SELECTION = '__custom__';\n\nexport interface LoginModalProps {\n /** Callback when user connects */\n onConnect: (url: string) => void;\n /** Callback when modal is closed */\n onClose: () => void;\n /**\n * @deprecated Ignored. The modal always shows node discovery + manual URL\n * entry; the old hardcoded-default \"Local\" view was removed. Kept so\n * existing call sites keep compiling.\n */\n connectionType?: ConnectionType | CustomConnectionConfig;\n /** Whether the modal is open */\n isOpen: boolean;\n /** Theme overrides — accepts any subset of `MeroTheme` tokens */\n theme?: MeroTheme;\n /**\n * Ports probed when discovering local nodes. Defaults to the well-known\n * Calimero dev ports (2428, 2429, 2528, 2529). Mostly an escape hatch for\n * non-standard setups and tests.\n */\n localNodePorts?: readonly number[];\n}\n\n/**\n * Validate URL format\n */\nfunction isValidUrl(urlString: string): boolean {\n if (!urlString || urlString.trim() === '') {\n return false;\n }\n\n try {\n const urlToTest =\n urlString.startsWith('http://') || urlString.startsWith('https://')\n ? urlString\n : `https://${urlString}`;\n\n const url = new URL(urlToTest);\n\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n return false;\n }\n\n if (!url.hostname) {\n return false;\n }\n\n const hostname = url.hostname;\n\n // Allow localhost\n if (hostname === 'localhost') {\n return true;\n }\n\n // Check for valid IP address\n const ipv4Regex = /^(\\d{1,3}\\.){3}\\d{1,3}$/;\n if (ipv4Regex.test(hostname)) {\n const octets = hostname.split('.').map(Number);\n return octets.every((octet) => octet >= 0 && octet <= 255);\n }\n\n // Check for valid domain name\n const domainRegex =\n /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n return domainRegex.test(hostname);\n } catch {\n return false;\n }\n}\n\n/** Strip the scheme for a compact node label (e.g. `localhost:2428`). */\nfunction displayNodeUrl(url: string): string {\n return url.replace(/^https?:\\/\\//, '').replace(/\\/+$/, '');\n}\n\n/**\n * Mix a color with transparent using CSS `color-mix`. Works for any valid CSS\n * color value (hex of any length, rgb(), hsl(), named colors, var(...)) — not\n * just 6-digit hex.\n */\nfunction tint(color: string, percent: number): string {\n return `color-mix(in srgb, ${color} ${percent}%, transparent)`;\n}\n\n/**\n * Build the inline-style map from a resolved theme. Each value is emitted as\n * `var(--mero-*, fallback)` so a global `:root { --mero-* }` rule reaches the\n * portal-rendered modal; the fallback ensures the modal still renders correctly\n * if the consumer hasn't imported `styles.css`.\n */\nfunction buildStyles(t: ResolvedMeroTheme) {\n const bg = cssVar(t, 'background');\n const bgSecondary = cssVar(t, 'backgroundSecondary');\n const text = cssVar(t, 'text');\n const textSecondary = cssVar(t, 'textSecondary');\n const accent = cssVar(t, 'primary');\n const onPrimary = cssVar(t, 'primaryText');\n const border = cssVar(t, 'border');\n const error = cssVar(t, 'error');\n const overlay = cssVar(t, 'overlay');\n const radius = cssVar(t, 'radius');\n\n const errorBg = tint(error, 10);\n const errorBorder = tint(error, 30);\n const accentGlow = tint(accent, 15);\n\n return {\n overlay: {\n position: 'fixed' as const,\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: overlay,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10000,\n padding: '1rem',\n animation: 'meroFadeIn 0.2s ease-out',\n },\n content: {\n backgroundColor: bg,\n borderRadius: radius,\n padding: '2rem',\n maxWidth: '420px',\n width: '100%',\n position: 'relative' as const,\n border: `1px solid ${border}`,\n boxShadow: `0 25px 50px -12px rgba(0, 0, 0, 0.6), 0 0 0 1px ${accentGlow}`,\n animation: 'meroSlideIn 0.25s ease-out',\n color: text,\n },\n closeButton: {\n position: 'absolute' as const,\n top: '0.75rem',\n right: '0.75rem',\n background: 'none',\n border: 'none',\n fontSize: '1.5rem',\n color: textSecondary,\n cursor: 'pointer',\n padding: '0.25rem',\n lineHeight: 1,\n },\n header: {\n display: 'flex',\n flexDirection: 'column' as const,\n alignItems: 'center',\n gap: '0.75rem',\n marginBottom: '1.5rem',\n },\n title: {\n fontSize: '1.25rem',\n fontWeight: 600,\n color: text,\n margin: 0,\n },\n info: {\n color: textSecondary,\n textAlign: 'center' as const,\n marginBottom: '1.5rem',\n fontSize: '0.875rem',\n },\n error: {\n color: error,\n backgroundColor: errorBg,\n border: `1px solid ${errorBorder}`,\n borderRadius: radius,\n padding: '0.75rem',\n marginBottom: '1rem',\n fontSize: '0.875rem',\n textAlign: 'center' as const,\n },\n radioList: {\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '0.5rem',\n marginBottom: '1rem',\n },\n radioItem: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.625rem',\n color: text,\n cursor: 'pointer',\n padding: '0.75rem 1rem',\n borderRadius: radius,\n border: `1px solid ${border}`,\n backgroundColor: bgSecondary,\n transition: 'all 0.15s ease',\n fontSize: '0.875rem',\n },\n radioItemActive: {\n // Override the full `border` shorthand (not just borderColor) so React\n // never has to mix shorthand + longhand on the same element.\n border: `1px solid ${accent}`,\n backgroundColor: accentGlow,\n color: text,\n },\n radioIndicator: {\n flexShrink: 0,\n width: '1rem',\n height: '1rem',\n borderRadius: '50%',\n border: `2px solid ${border}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n radioIndicatorActive: {\n border: `2px solid ${accent}`,\n },\n radioDot: {\n width: '0.5rem',\n height: '0.5rem',\n borderRadius: '50%',\n backgroundColor: accent,\n },\n nodeMeta: {\n marginLeft: 'auto',\n fontSize: '0.75rem',\n color: textSecondary,\n },\n input: {\n width: '100%',\n padding: '0.75rem 1rem',\n borderRadius: radius,\n border: `1px solid ${border}`,\n backgroundColor: bgSecondary,\n color: text,\n fontSize: '0.875rem',\n outline: 'none',\n marginBottom: '1rem',\n boxSizing: 'border-box' as const,\n },\n toolbar: {\n display: 'flex',\n justifyContent: 'center',\n marginBottom: '1rem',\n },\n rescan: {\n background: 'none',\n border: 'none',\n color: accent,\n cursor: 'pointer',\n fontSize: '0.8125rem',\n padding: '0.25rem 0.5rem',\n },\n buttonGroup: {\n display: 'flex',\n justifyContent: 'center',\n },\n button: {\n padding: '0.75rem 2rem',\n borderRadius: radius,\n border: 'none',\n fontSize: '0.875rem',\n fontWeight: 600,\n cursor: 'pointer',\n backgroundColor: accent,\n color: onPrimary,\n transition: 'all 0.15s ease',\n },\n buttonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n },\n loading: {\n display: 'flex',\n flexDirection: 'column' as const,\n alignItems: 'center',\n gap: '1rem',\n padding: '2rem',\n color: textSecondary,\n },\n discovering: {\n display: 'flex',\n flexDirection: 'column' as const,\n alignItems: 'center',\n gap: '0.75rem',\n padding: '1rem',\n color: textSecondary,\n fontSize: '0.875rem',\n },\n spinner: {\n width: '2rem',\n height: '2rem',\n border: `3px solid ${border}`,\n borderTopColor: accent,\n borderRadius: '50%',\n animation: 'meroSpin 1s linear infinite',\n },\n spinnerSmall: {\n width: '1.5rem',\n height: '1.5rem',\n border: `3px solid ${border}`,\n borderTopColor: accent,\n borderRadius: '50%',\n animation: 'meroSpin 1s linear infinite',\n },\n };\n}\n\n/**\n * LoginModal - Connection modal component\n */\nexport function LoginModal({\n onConnect,\n onClose,\n isOpen,\n theme,\n localNodePorts = DEFAULT_LOCAL_NODE_PORTS,\n}: LoginModalProps) {\n // `selected` is a discovered node URL or CUSTOM.\n const [selected, setSelected] = useState<string>(CUSTOM_SELECTION);\n const [discovered, setDiscovered] = useState<string[]>([]);\n const [discovering, setDiscovering] = useState<boolean>(false);\n const [customUrl, setCustomUrl] = useState<string>('');\n\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const resolved = useMemo(() => resolveMeroTheme(theme), [theme]);\n const styles = useMemo(() => buildStyles(resolved), [resolved]);\n // Only emit inline `--mero-*` variables when a `theme` prop was actually\n // provided. Without a prop, we let global `:root { --mero-* }` rules cascade\n // through to the portal-rendered modal (with `var()` fallbacks in buildStyles\n // covering the case where no global rules are loaded).\n const themeVars = useMemo(\n () => (theme ? themeToCssVars(resolved) : undefined),\n [theme, resolved],\n );\n\n // Load saved URL into the manual field\n useEffect(() => {\n const savedUrl = localStorage.getItem('mero:node_url');\n if (savedUrl) {\n setCustomUrl(savedUrl);\n }\n }, []);\n\n // Probe local ports whenever the modal is open; a bumpable nonce lets the\n // user trigger a re-scan.\n const [scanNonce, setScanNonce] = useState(0);\n const portsKey = useMemo(() => localNodePorts.join(','), [localNodePorts]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const controller = new AbortController();\n let active = true;\n setDiscovering(true);\n // Clear any prior results so a re-scan never shows stale nodes.\n setDiscovered([]);\n setError(null);\n\n discoverLocalNodes({ ports: localNodePorts, signal: controller.signal })\n .then((nodes) => {\n if (!active) return;\n setDiscovered(nodes);\n // Default to the first discovered node, else fall through to manual.\n setSelected(nodes.length > 0 ? nodes[0] : CUSTOM_SELECTION);\n })\n // discoverLocalNodes is designed never to reject; the catch is purely\n // defensive so a future change can't surface an unhandled rejection.\n .catch(() => {\n if (active) setSelected(CUSTOM_SELECTION);\n })\n .finally(() => {\n if (active) setDiscovering(false);\n });\n\n return () => {\n active = false;\n controller.abort();\n };\n // portsKey captures localNodePorts content; scanNonce forces a re-scan.\n }, [isOpen, portsKey, scanNonce]);\n\n const isCustom = selected === CUSTOM_SELECTION;\n const hasDiscovered = discovered.length > 0;\n\n // Whether the connect button can fire in the current state.\n const canConnect =\n !loading && !discovering && (isCustom ? isValidUrl(customUrl) : true);\n\n // Keep a ref so the input's keydown handler always sees current validity.\n const canConnectRef = useRef(canConnect);\n canConnectRef.current = canConnect;\n\n const handleConnect = useCallback(async () => {\n const usingDiscovered = selected !== CUSTOM_SELECTION;\n const targetUrl = usingDiscovered ? selected : customUrl;\n\n // Manual URLs must look valid before we try them.\n if (!usingDiscovered && !isValidUrl(targetUrl)) {\n return;\n }\n\n const normalizedUrl = targetUrl.replace(/\\/+$/, '');\n\n // A discovered node already answered a health check — connect straight away.\n if (usingDiscovered) {\n onConnect(normalizedUrl);\n return;\n }\n\n // Manually entered URLs are verified via is-authed.\n setLoading(true);\n setError(null);\n\n try {\n const response = await fetch(\n nodeEndpoint(normalizedUrl, 'admin-api/is-authed'),\n );\n\n if (response.ok || response.status === 401) {\n setLoading(false);\n onConnect(normalizedUrl);\n } else {\n throw new Error(`Connection failed: ${response.statusText}`);\n }\n } catch (err) {\n console.error('Connection failed:', err);\n setError('Failed to connect. Please check the URL and try again.');\n setLoading(false);\n }\n }, [selected, customUrl, onConnect]);\n\n if (!isOpen) {\n return null;\n }\n\n const showManualInput = isCustom;\n const renderRadio = (value: string, label: string, meta?: string) => {\n const active = selected === value;\n return (\n // Selection is driven solely by the radio input's `onChange` — clicking\n // anywhere on the wrapping label forwards to the input, and keyboard\n // users can tab to / arrow through the (visually hidden but focusable)\n // input. A label `onClick` here would double-fire `setSelected`.\n <label\n key={value}\n data-testid={`node-option-${value === CUSTOM_SELECTION ? 'custom' : displayNodeUrl(value)}`}\n style={{\n ...styles.radioItem,\n ...(active ? styles.radioItemActive : {}),\n }}\n >\n <input\n type=\"radio\"\n name=\"mero-node\"\n value={value}\n checked={active}\n onChange={() => setSelected(value)}\n style={{ position: 'absolute', opacity: 0 }}\n />\n <span\n style={{\n ...styles.radioIndicator,\n ...(active ? styles.radioIndicatorActive : {}),\n }}\n >\n {active && <span style={styles.radioDot} />}\n </span>\n {label}\n {meta && <span style={styles.nodeMeta}>{meta}</span>}\n </label>\n );\n };\n\n const renderNodeSection = () => {\n if (discovering) {\n return (\n <div style={styles.discovering} data-testid=\"node-discovering\">\n <div style={styles.spinnerSmall} />\n <p>Searching for local nodes...</p>\n </div>\n );\n }\n\n return (\n <>\n <p style={styles.info}>\n {hasDiscovered\n ? 'Select your Calimero node to continue.'\n : 'No local node found. Enter a node URL to continue.'}\n </p>\n\n {hasDiscovered && (\n <div\n style={styles.radioList}\n role=\"radiogroup\"\n aria-label=\"Available nodes\"\n >\n {discovered.map((url) =>\n renderRadio(url, displayNodeUrl(url), 'local'),\n )}\n {/* Manual entry is always offered alongside discovered nodes. */}\n {renderRadio(CUSTOM_SELECTION, 'Enter node URL manually')}\n </div>\n )}\n\n {showManualInput && (\n <input\n type=\"text\"\n value={customUrl}\n onChange={(e) => setCustomUrl(e.target.value)}\n placeholder=\"https://your-node-url.calimero.network\"\n style={styles.input}\n data-testid=\"node-url-input\"\n autoFocus={!hasDiscovered}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && canConnectRef.current) {\n handleConnect();\n }\n }}\n />\n )}\n\n <div style={styles.toolbar}>\n <button\n type=\"button\"\n style={styles.rescan}\n onClick={() => setScanNonce((n) => n + 1)}\n data-testid=\"rescan-button\"\n >\n ↻ Rescan local nodes\n </button>\n </div>\n </>\n );\n };\n\n const modalContent = (\n <>\n <style>{`\n @keyframes meroSpin { to { transform: rotate(360deg); } }\n @keyframes meroFadeIn { from { opacity: 0; } to { opacity: 1; } }\n @keyframes meroSlideIn { from { transform: translateY(-12px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }\n `}</style>\n <div style={{ ...themeVars, ...styles.overlay }} onClick={onClose}>\n <div style={styles.content} onClick={(e) => e.stopPropagation()}>\n <button style={styles.closeButton} onClick={onClose} aria-label=\"Close\">\n &times;\n </button>\n\n <div style={styles.header}>\n <CalimeroLogo size={44} color={cssVar(resolved, 'primary')} />\n <h1 style={styles.title}>Connect to Calimero</h1>\n </div>\n\n {loading ? (\n <div style={styles.loading}>\n <p>Connecting to node...</p>\n <div style={styles.spinner} />\n </div>\n ) : (\n <>\n {error && <p style={styles.error}>{error}</p>}\n\n {renderNodeSection()}\n\n <div style={styles.buttonGroup}>\n <button\n onClick={handleConnect}\n disabled={!canConnect}\n style={{\n ...styles.button,\n ...(!canConnect ? styles.buttonDisabled : {}),\n }}\n data-testid=\"connect-button\"\n >\n Connect\n </button>\n </div>\n </>\n )}\n </div>\n </div>\n </>\n );\n\n return createPortal(modalContent, document.body);\n}\n\nexport default LoginModal;\n","/**\n * ConnectButton - A button component for connecting to Calimero\n *\n * Shows connection status and provides login/logout functionality.\n * Includes built-in LoginModal for node selection.\n */\n\nimport React, { useState, useEffect, useRef, useMemo } from 'react';\nimport { useMero } from '../context';\nimport { LoginModal } from './LoginModal';\nimport { CalimeroLogo } from './CalimeroLogo';\nimport type { ConnectionType, CustomConnectionConfig } from '../types';\nimport { ConnectionType as ConnectionTypeEnum } from '../types';\nimport { resolveMeroTheme, themeToCssVars, type MeroTheme } from '../theme';\n\nexport interface ConnectButtonProps {\n /**\n * Connection behaviour. `Custom` (object form) connects straight to the\n * given URL, skipping the modal; every other value opens the LoginModal,\n * which always shows node discovery + manual URL entry.\n */\n connectionType?: ConnectionType | CustomConnectionConfig;\n /** Custom class name */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n /** Theme overrides — accepts any subset of `MeroTheme` tokens */\n theme?: MeroTheme;\n /**\n * Render only the Calimero logo, no text. Produces a square 40×40 icon\n * button. The label is still announced to screen readers via `aria-label`.\n * Default: false.\n */\n logoOnly?: boolean;\n /**\n * Override the default labels per state. A bare string is shorthand for\n * `{ connect: '<string>' }`. The connected and reconnecting states keep\n * their defaults unless explicitly overridden.\n */\n label?:\n | string\n | { connect?: string; connected?: string; reconnecting?: string };\n}\n\n/**\n * ConnectButton - Displays connection status and handles login/logout\n */\nexport function ConnectButton({\n connectionType = ConnectionTypeEnum.Remote,\n className,\n style,\n theme,\n logoOnly = false,\n label,\n}: ConnectButtonProps) {\n const { isAuthenticated, connectToNode, logout, nodeUrl, isOnline } = useMero();\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [isModalOpen, setIsModalOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Resolve once. Inline CSS variables are only emitted when a theme prop is\n // provided — otherwise we leave the cascade alone so global `:root { --mero-* }`\n // overrides take effect.\n const resolvedTheme = useMemo(\n () => (theme ? resolveMeroTheme(theme) : null),\n [theme],\n );\n const themeVars = useMemo(\n () => (resolvedTheme ? themeToCssVars(resolvedTheme) : undefined),\n [resolvedTheme],\n );\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsDropdownOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const dashboardUrl = useMemo(() => {\n if (!isAuthenticated || !nodeUrl) return '#';\n return new URL('admin-dashboard/', nodeUrl).toString();\n }, [isAuthenticated, nodeUrl]);\n\n const labels = useMemo(() => {\n const overrides = typeof label === 'string' ? { connect: label } : label;\n return {\n connect: overrides?.connect ?? 'Connect',\n connected: overrides?.connected ?? 'Connected',\n reconnecting: overrides?.reconnecting ?? 'Reconnecting...',\n };\n }, [label]);\n\n const buttonClassName = logoOnly ? 'mero-logo-only' : '';\n\n const handleConnect = () => {\n // If Custom type with URL, connect directly\n if (\n typeof connectionType === 'object' &&\n connectionType.type === ConnectionTypeEnum.Custom\n ) {\n connectToNode(connectionType.url);\n return;\n }\n\n // Otherwise, open modal\n setIsModalOpen(true);\n };\n\n const handleModalConnect = (url: string) => {\n setIsModalOpen(false);\n connectToNode(url);\n };\n\n // Reconnecting state\n if (isAuthenticated && !isOnline) {\n return (\n <div\n className=\"mero-connect-container\"\n style={{ ...themeVars, display: 'inline-block' }}\n >\n <button\n className={['mero-connect-button', 'mero-reconnecting', buttonClassName, className].filter(Boolean).join(' ')}\n style={style}\n disabled\n aria-label={labels.reconnecting}\n title={logoOnly ? labels.reconnecting : undefined}\n >\n <CalimeroLogo size={18} className=\"mero-logo\" />\n {!logoOnly && labels.reconnecting}\n </button>\n </div>\n );\n }\n\n // Connected state\n if (isAuthenticated) {\n return (\n <div\n ref={dropdownRef}\n className=\"mero-connect-container\"\n style={{ ...themeVars, position: 'relative', display: 'inline-block' }}\n >\n <button\n className={['mero-connect-button', 'mero-connected', buttonClassName, className].filter(Boolean).join(' ')}\n style={style}\n onClick={() => setIsDropdownOpen((prev) => !prev)}\n aria-label={labels.connected}\n title={logoOnly ? labels.connected : undefined}\n >\n <CalimeroLogo size={18} className=\"mero-logo\" />\n {!logoOnly && labels.connected}\n </button>\n {isDropdownOpen && (\n <div className=\"mero-dropdown\">\n <div className=\"mero-dropdown-info\" title={nodeUrl || ''}>\n {nodeUrl}\n </div>\n <a\n href={dashboardUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mero-dropdown-item\"\n >\n Dashboard\n </a>\n <button\n className=\"mero-dropdown-item\"\n onClick={() => {\n setIsDropdownOpen(false);\n logout();\n }}\n >\n Log out\n </button>\n </div>\n )}\n </div>\n );\n }\n\n // Disconnected state\n return (\n <div\n className=\"mero-connect-container\"\n style={{ ...themeVars, display: 'inline-block' }}\n >\n <button\n className={['mero-connect-button', buttonClassName, className].filter(Boolean).join(' ')}\n style={style}\n onClick={handleConnect}\n aria-label={labels.connect}\n title={logoOnly ? labels.connect : undefined}\n >\n <CalimeroLogo size={18} className=\"mero-logo\" />\n {!logoOnly && labels.connect}\n </button>\n <LoginModal\n isOpen={isModalOpen}\n onConnect={handleModalConnect}\n onClose={() => setIsModalOpen(false)}\n theme={resolvedTheme ?? theme}\n />\n </div>\n );\n}\n\nexport default ConnectButton;\n","/**\n * Minimal Base58 (Bitcoin alphabet) decoder.\n *\n * Blob ids come back from the admin API Base58-encoded, while a namespace's\n * `appKey` is a hex string, so comparing \"what's installed\" to \"what the group\n * targets\" needs one side converted. Decoding Base58 to canonical lowercase hex\n * is the smaller, encoding-agnostic conversion.\n */\n\nconst ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\n/**\n * Decode a Base58 string to a lowercase hex string (no `0x` prefix). Leading\n * `1` characters map to leading zero bytes, so the byte width is preserved.\n * Throws on any character outside the Base58 alphabet.\n */\nexport function base58ToHex(input: string): string {\n const bytes: number[] = [];\n for (const char of input) {\n let carry = ALPHABET.indexOf(char);\n if (carry === -1) throw new Error(`invalid base58 character: ${char}`);\n for (let i = 0; i < bytes.length; i++) {\n carry += bytes[i] * 58;\n bytes[i] = carry & 0xff;\n carry >>= 8;\n }\n while (carry > 0) {\n bytes.push(carry & 0xff);\n carry >>= 8;\n }\n }\n for (let k = 0; k < input.length && input[k] === '1'; k++) bytes.push(0);\n return bytes\n .reverse()\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n","import { useState, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { compareSemver } from '@calimero-network/mero-js';\nimport { useMero } from '../context';\nimport { base58ToHex } from '../utils/base58';\nimport type {\n Codec,\n EphemeralClient,\n Context,\n CreateContextRequest,\n CreateGroupInvitationRequest,\n CreateGroupInNamespaceRequest,\n CreateNamespaceInvitationRequest,\n CreateNamespaceInvitationResponseData,\n CreateNamespaceRequest,\n CreateRecursiveInvitationResponseData,\n DeleteGroupRequest,\n DeleteNamespaceRequest,\n DetachContextFromGroupRequest,\n GroupContextEntry,\n GroupInfo,\n GroupUpgradeStatusResponseData,\n MetadataRecord,\n JoinGroupRequest,\n JoinNamespaceRequest,\n ListGroupMembersResponseData,\n Namespace,\n NamespaceIdentity,\n NodeIdentity,\n ReparentGroupRequest,\n AddGroupMembersRequest,\n RemoveGroupMembersRequest,\n RetryGroupUpgradeRequest,\n SetDefaultCapabilitiesRequest,\n SetMetadataRequest,\n SetSubgroupVisibilityRequest,\n SetTeeAdmissionPolicyRequest,\n SubgroupEntry,\n SyncGroupRequest,\n SseEventData,\n UpdateMemberRoleRequest,\n UpgradeGroupRequest,\n ResyncContextRequest,\n MigrationStatus,\n MemberMigrationStatusEntry,\n MigrationStatusRollup,\n MigrateMyEntriesSummary,\n AppVersionChangedEvent,\n GroupMembershipEventData,\n GroupMigrationEventData,\n} from '@calimero-network/mero-js';\nimport type {\n ApplicationContextRecord,\n ContextDiscoveryOptions,\n ContextDiscoveryState,\n} from '../types';\n\nexport { useMero } from '../context';\n\n/**\n * The presence types come straight from `mero-js` now — `Codec` and\n * `EphemeralEntry` are its own declarations, and `EphemeralClient` is the type\n * of the class behind `mero.ephemeral`, so a drift between what this hook\n * assumes and what the SDK does is a compile error rather than a runtime\n * surprise.\n *\n * Re-exported under the same names this package has always exported, so\n * consumers importing `Codec` / `EphemeralEntry` / `EphemeralClient` from\n * `@calimero-network/mero-react` keep compiling — they now simply get the\n * nominal `mero-js` types instead of structural copies of them.\n *\n * On `EphemeralEntry.ageMs`: it is ABSENT on a live delta and PRESENT on a\n * replayed seed entry, reporting how stale that entry already was (bounded by\n * the node's presence TTL). Absent and `0` are different — a `0` means \"the\n * node replayed this and it is brand new\", not \"no age information\". Read it\n * with `?? 0`, never with a truthiness check.\n */\nexport type { Codec, EphemeralEntry, EphemeralClient } from '@calimero-network/mero-js';\n\nexport interface UseEphemeralOptions<T> {\n /** Encoding for the presence slice. Defaults to JSON. */\n codec?: Codec<T>;\n /** Base value for the first `setPresence` merge. */\n initial?: T;\n /** Minimum ms between publishes. Trailing edge — the latest value wins. */\n throttleMs?: number;\n /** Include your own echoed presence in `peers`. Default false. */\n includeSelf?: boolean;\n}\n\n/** Shape returned by {@link useEphemeral}. */\nexport interface UseEphemeralResult<T> {\n peers: Map<string, T>;\n setPresence: (partial: Partial<T>) => void;\n ageOf: (author: string) => number | undefined;\n error: Error | null;\n}\n\n/**\n * Which asynchronous producer currently owns the latched error slot.\n *\n * Only genuinely ASYNCHRONOUS failures are latched — an event happened once,\n * in the past, and nothing about the current render can re-derive it. Anything\n * that is a standing property of the current props/client (notably \"this\n * client has no `mero.ephemeral` surface\") is NOT latched: it is recomputed\n * every render, so it can neither go stale nor be accidentally cleared.\n *\n * The slot is shared, so each producer only clears what it itself raised.\n */\ntype ErrorSource = 'identity' | 'publish';\n\n/**\n * The latched async error, tagged with its producer AND with the context it\n * belongs to.\n *\n * `contextKey` is what makes cross-context leaks structurally impossible\n * rather than a matter of remembering to clear: a write whose key is no longer\n * the current context is dropped on the way in (a publish that was in flight\n * across a context switch), and a latch whose key no longer matches is not\n * read on the way out. Neither path depends on some other effect having run a\n * clear first.\n */\ninterface LatchedEphemeralError {\n contextKey: string | null;\n source: ErrorSource;\n error: Error;\n}\n\nconst NO_EPHEMERAL_SURFACE_MESSAGE =\n 'useEphemeral: this client has no `mero.ephemeral` surface. Ephemeral ' +\n 'presence requires @calimero-network/mero-js >= 9.1.0; upgrade the ' +\n 'installed @calimero-network/mero-js (and any lockfile pin) to use it.';\n\nconst COULD_NOT_RESOLVE_IDENTITY_MESSAGE =\n 'useEphemeral: could not resolve a local context identity, so your own ' +\n 'presence cannot be filtered out. Pass includeSelf: true to accept this.';\n\n/**\n * How long after the last replayed entry (one carrying `ageMs`) the replay\n * window stays open before `peers` is reconciled down to what the replay\n * contained. Long enough to absorb a replay burst split across several SSE\n * frames/ticks, short enough that a swept peer does not linger.\n */\nconst REPLAY_RECONCILE_MS = 50;\n\n/**\n * Observe and publish ephemeral presence (cursors, typing, online) for a\n * context.\n *\n * ONE read path: the subscription. When a client subscribes, the node replays\n * that context's current presence to that connection as ordinary entries\n * before the live deltas start, so seeding and updating share a single shape\n * ({@link EphemeralEntry}) and a reconnect — `SseClient` auto-reconnects and\n * re-subscribes — re-seeds itself. There is no snapshot fetch and no\n * client-side reconciliation pass.\n *\n * Freshness is computed entirely from local clock deltas: a replayed entry is\n * current as of `Date.now() - ageMs`, a live delta as of `Date.now()`. No\n * cross-machine clock comparison is ever performed.\n *\n * No client-side TTL or heartbeat: the node sweeps at 7s and emits removals,\n * and re-publishes on your behalf every 2.5s. A replay is treated as\n * AUTHORITATIVE — see the replay-reconcile pass in the read effect — so a peer\n * swept while the SSE connection was down does not survive the reconnect.\n *\n * `error` is derived, not accumulated: standing conditions (no `ephemeral`\n * surface) are recomputed every render, one-shot async failures are latched\n * keyed by the context they happened in, and whether a latched failure is even\n * relevant (an unresolved identity when `includeSelf` is true) is decided at\n * read time. Nothing survives a context switch.\n */\nexport function useEphemeral<T>(\n contextId: string | null,\n options: UseEphemeralOptions<T> = {},\n): UseEphemeralResult<T> {\n const { includeSelf = false } = options;\n const { mero } = useMero();\n // Cast: the installed mero-js's `MeroJs` type predates `ephemeral` (see\n // `EphemeralClient` above), though it exists at runtime.\n const ephemeral = mero\n ? ((mero as unknown as { ephemeral?: EphemeralClient }).ephemeral ?? null)\n : null;\n\n const [peers, setPeers] = useState<Map<string, T>>(new Map());\n // The one latched async error (see `LatchedEphemeralError`). Not read\n // directly — `error` below derives what is actually reported from it.\n const [latchedError, setLatchedError] = useState<LatchedEphemeralError | null>(null);\n // The context the CURRENT render targets. Read by `setSourceError` so a\n // callback that resolves after a context switch can tell that its result is\n // no longer wanted without closing over anything but its own captured key.\n const contextKeyRef = useRef<string | null>(contextId);\n contextKeyRef.current = contextId;\n // `key` is the contextId captured when the failing operation was STARTED,\n // not when it settled. A late write from a context we have already left is\n // dropped here rather than being written and then hopefully cleared.\n const setSourceError = useCallback(\n (source: ErrorSource, err: Error, key: string | null) => {\n if (key !== contextKeyRef.current) return;\n setLatchedError({ contextKey: key, source, error: err });\n },\n [],\n );\n const clearSourceError = useCallback((source: ErrorSource, key: string | null) => {\n setLatchedError(prev =>\n prev && prev.source === source && prev.contextKey === key ? null : prev,\n );\n }, []);\n\n // DERIVED, never latched: \"this client has no `mero.ephemeral` surface\" is a\n // standing property of the current client, not an event. Recomputing it every\n // render is what makes it impossible to (a) leave it set after an upgraded\n // client arrives or (b) lose it to some other effect's clear — a context\n // switch, for instance, cannot hide a client that still has no surface.\n // Memoised only so the Error identity is stable while the condition holds.\n const surfaceError = useMemo(\n () => (mero && !ephemeral ? new Error(NO_EPHEMERAL_SURFACE_MESSAGE) : null),\n [mero, ephemeral],\n );\n\n // A latch is reported only if it belongs to the context being rendered, and\n // only if it is still MEANINGFUL: an unresolved local identity is an error\n // solely because self-filtering needs it, so opting into `includeSelf` makes\n // it a non-event — decided here, at read time, rather than by racing an\n // effect to clear it.\n const error =\n surfaceError ??\n (latchedError &&\n latchedError.contextKey === contextId &&\n !(latchedError.source === 'identity' && includeSelf)\n ? latchedError.error\n : null);\n // author -> local ms timestamp the entry is considered current as of.\n const receivedAtRef = useRef<Map<string, number>>(new Map());\n // `codec` and `initial` are held in refs, never in a dependency array:\n // `jsonCodec()` is a FACTORY, so `{ codec: jsonCodec() }` at the call site is\n // a fresh identity every render. As a dep it would tear down and re-create\n // the subscription on every render — and since every applied entry sets a\n // new Map (a new render), that is an unbounded resubscribe storm, each\n // resubscribe pulling a fresh presence replay. A codec swapped mid-flight is\n // not a real use case.\n const codecRef = useRef<Codec<T> | undefined>(options.codec);\n codecRef.current = options.codec;\n const initialRef = useRef<T | undefined>(options.initial);\n initialRef.current = options.initial;\n // This node's own context member key (device-level), resolved async. Never\n // compare this against an account id — that comparison silently never\n // matches, which is the classic self-echo bug.\n const selfRef = useRef<string | null>(null);\n const lastLocalRef = useRef<T | undefined>(options.initial);\n const pendingRef = useRef<T | undefined>(undefined);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n // Seeded to the mount time (not 0) so an isolated call shortly after mount\n // is correctly treated as part of the initial \"burst\" and trailing-edge\n // throttled, rather than bypassing the throttle because it looks like it's\n // arriving long after a (nonexistent) previous publish.\n const lastSentAtRef = useRef<number>(Date.now());\n // Open replay window: the authors seen since a replayed entry (one carrying\n // `ageMs`) last arrived. Null when no replay is in progress.\n const replaySeenRef = useRef<Set<string> | null>(null);\n const replayTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const ageOf = useCallback((author: string): number | undefined => {\n const at = receivedAtRef.current.get(author);\n return at === undefined ? undefined : Date.now() - at;\n }, []);\n\n // Clear ALL per-context state synchronously the instant the target context\n // changes. Read state, so a previous context's peers don't keep rendering\n // until the new context's replay arrives — and write state, because a\n // queued publish would otherwise fire into the PREVIOUS context (its\n // `setTimeout` closure captured the old `publish`), and `lastLocalRef` would\n // shallow-merge the old context's fields into the first slice published in\n // the new one. Presence is app-defined data (cursor position, typing target),\n // so both are genuine cross-context writes, not cosmetic leaks.\n //\n // The latched error is dropped here as well, but purely as housekeeping (it\n // is what makes A -> B -> A not resurrect A's old failure). Correctness does\n // not rest on it: the latch carries its own `contextKey`, so an error from a\n // context we have left is neither written nor read regardless of whether this\n // effect ran. The standing surface condition is untouched — it is derived, so\n // it re-reports itself on the very next render if it is still true.\n useEffect(() => {\n setPeers(new Map());\n receivedAtRef.current = new Map();\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n if (replayTimerRef.current) {\n clearTimeout(replayTimerRef.current);\n replayTimerRef.current = null;\n }\n replaySeenRef.current = null;\n pendingRef.current = undefined;\n lastLocalRef.current = initialRef.current;\n selfRef.current = null;\n setLatchedError(null);\n }, [contextId]);\n\n // Resolve THIS node's context member key — the same value the node stamps\n // as `author` on ephemeral entries.\n useEffect(() => {\n if (!mero || !contextId) return;\n // Captured at START. Everything this effect reports is tagged with it, so\n // a slow lookup that lands after a context switch cannot write into the\n // context we switched to.\n const key = contextId;\n let cancelled = false;\n mero.admin\n .getContextIdentitiesOwned(contextId)\n .then(res => {\n if (cancelled) return;\n const self = res.identities?.[0] ?? null;\n selfRef.current = self;\n if (!self) {\n // Latched unconditionally — `includeSelf` is NOT consulted here.\n // Whether an unresolved identity matters is a question about the\n // CURRENT props, so it is answered where `error` is derived; asking\n // it here is what previously left the error stranded when\n // `includeSelf` flipped to true while resolution still failed.\n setSourceError('identity', new Error(COULD_NOT_RESOLVE_IDENTITY_MESSAGE), key);\n return;\n }\n // A later run of this effect (contextId change, includeSelf toggle)\n // resolved a self identity where an earlier run didn't — clear the\n // \"could not resolve\" error this effect itself raised.\n clearSourceError('identity', key);\n // Ordering race: the identity lookup and the subscription's presence\n // replay land independently, so a self entry can already be seeded in\n // `peers`. Retroactively drop it now that we know who \"self\" is.\n if (!includeSelf) {\n receivedAtRef.current.delete(self);\n setPeers(prev => {\n if (!prev.has(self)) return prev;\n const next = new Map(prev);\n next.delete(self);\n return next;\n });\n }\n })\n .catch((err: unknown) => {\n if (!cancelled) {\n setSourceError('identity', toError(err), key);\n }\n });\n return () => { cancelled = true; };\n // `mero` itself is a dep on purpose: a real MeroProvider memoizes its\n // context value, so `mero` only changes identity when the underlying\n // client is actually replaced (e.g. `allowedNodeUrls` changes) — and\n // that replacement is exactly when this effect must re-resolve the\n // local identity against the new client. Keying on presence alone\n // (`Boolean(mero)`) would silently keep resolving against a closed,\n // stale client instance.\n }, [mero, contextId, includeSelf, setSourceError, clearSourceError]);\n\n // The single read path. Subscribing makes the node replay this context's\n // current presence to this connection as ordinary entries, then stream live\n // deltas — so this one handler both seeds and updates, and an SSE reconnect\n // (which re-subscribes) re-seeds without any extra machinery.\n //\n // A REPLAY IS AUTHORITATIVE. The node replays exactly who is present right\n // now; anything we still hold that the replay does not mention is gone.\n // Without reconciling against it, a peer swept while the connection was down\n // is a permanent ghost: its removal event was delivered to nobody, and the\n // replay — which lists only survivors — will never mention it again. That\n // sweep happens inside `SseClient`'s auto-reconnect, so it does NOT re-run\n // this effect; reconciliation has to be driven by the entries themselves,\n // which is why it keys off `ageMs` (present only on replayed entries) rather\n // than off subscribe/unsubscribe. Clearing `peers` eagerly on subscribe would\n // also miss the reconnect case entirely — and would blank the UI on every\n // `includeSelf` toggle.\n //\n // The window closes `REPLAY_RECONCILE_MS` after the last replayed entry, and\n // live entries arriving while it is open count as present too, so a peer that\n // publishes mid-replay is never swept. A replayed entry that somehow arrives\n // after the window closed re-adds its author immediately — the failure mode\n // is a flicker, never a resurrected ghost or a permanent loss.\n useEffect(() => {\n if (!ephemeral || !contextId) return;\n\n const closeReplayWindow = () => {\n replayTimerRef.current = null;\n const seen = replaySeenRef.current;\n replaySeenRef.current = null;\n if (!seen) return;\n setPeers(prev => {\n let next: Map<string, T> | null = null;\n for (const author of prev.keys()) {\n if (seen.has(author)) continue;\n if (!next) next = new Map(prev);\n next.delete(author);\n receivedAtRef.current.delete(author);\n }\n return next ?? prev;\n });\n };\n\n const unsubscribe = ephemeral.subscribe<T>(\n contextId,\n entry => {\n const { author, state } = entry;\n if (entry.ageMs !== undefined) {\n // A replayed entry: (re)open the reconcile window and debounce its\n // close, so a replay burst split across frames counts as one replay.\n if (!replaySeenRef.current) replaySeenRef.current = new Set();\n if (replayTimerRef.current) clearTimeout(replayTimerRef.current);\n replayTimerRef.current = setTimeout(closeReplayWindow, REPLAY_RECONCILE_MS);\n }\n if (entry.removed || state === undefined) {\n replaySeenRef.current?.delete(author);\n receivedAtRef.current.delete(author);\n setPeers(prev => {\n if (!prev.has(author)) return prev;\n const next = new Map(prev);\n next.delete(author);\n return next;\n });\n return;\n }\n if (!includeSelf && author === selfRef.current) return;\n replaySeenRef.current?.add(author);\n // `ageMs` is absent on a live delta (current as of now) and present on\n // a replayed entry (current as of `now - ageMs`). `?? 0` — never a\n // truthiness test: an `ageMs` of 0 is a real, meaningful value.\n receivedAtRef.current.set(author, Date.now() - (entry.ageMs ?? 0));\n setPeers(prev => new Map(prev).set(author, state));\n },\n codecRef.current,\n );\n\n return () => {\n if (replayTimerRef.current) {\n clearTimeout(replayTimerRef.current);\n replayTimerRef.current = null;\n }\n replaySeenRef.current = null;\n unsubscribe();\n };\n // `ephemeral` itself is a dep on purpose — see the identity-resolution\n // effect above. A replaced client must re-subscribe against the new\n // client, not keep reading/writing through the old (possibly closed)\n // one. `codec` is deliberately NOT a dep — see `codecRef`.\n }, [ephemeral, contextId, includeSelf]);\n\n const publish = useCallback((value: T) => {\n if (!ephemeral || !contextId) return;\n // Captured at START, like the identity lookup's `key`: `ephemeral.set` is\n // not cancellable, so a rejection can land long after a context switch.\n // Tagging the write with the context it was issued for is what keeps that\n // failure out of the new context's error slot.\n const key = contextId;\n lastSentAtRef.current = Date.now();\n void ephemeral.set<T>(key, value, codecRef.current).then(\n () => clearSourceError('publish', key),\n (err: unknown) => setSourceError('publish', toError(err), key),\n );\n }, [ephemeral, contextId, setSourceError, clearSourceError]);\n\n /**\n * Publish your own presence.\n *\n * SHALLOW merge over the last locally-set value (starting from `initial`):\n * presence is one slot per author, so fields are not independent channels\n * and a bare replace would silently drop whatever you did not mention.\n * Nested objects are replaced wholesale, not deep-merged —\n * `setPresence({ cursor: { x: 1 } })` DROPS `cursor.y` if it was set\n * separately.\n *\n * Throttled on the trailing edge: rapid calls collapse into one publish\n * carrying the newest value, never the oldest queued one.\n */\n const setPresence = useCallback((partial: Partial<T>) => {\n const next = { ...(lastLocalRef.current ?? ({} as T)), ...partial } as T;\n lastLocalRef.current = next;\n\n const throttleMs = options.throttleMs ?? 30;\n if (throttleMs <= 0) {\n publish(next);\n return;\n }\n\n pendingRef.current = next;\n if (timerRef.current) return;\n const elapsed = Date.now() - lastSentAtRef.current;\n const delay = Math.max(throttleMs - elapsed, 0);\n timerRef.current = setTimeout(() => {\n timerRef.current = null;\n const queued = pendingRef.current;\n pendingRef.current = undefined;\n if (queued !== undefined) publish(queued);\n }, delay);\n }, [publish, options.throttleMs]);\n\n // Cancel a queued publish on unmount.\n useEffect(() => () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n }, []);\n\n return { peers, setPresence, ageOf, error };\n}\n\n/**\n * Shape accepted by the metadata-setter hooks — re-exported from mero-js so\n * callers have one canonical type. A `set*Metadata` call **replaces the whole\n * record**: `data` defaults to `{}` and wholly replaces the stored map; omit\n * `name` to keep the current name.\n */\nexport type SetMetadataInput = SetMetadataRequest;\n\nfunction toError(err: unknown): Error {\n return err instanceof Error ? err : new Error(String(err));\n}\n\nfunction mapApplicationContexts(contexts: Context[]): ApplicationContextRecord[] {\n return contexts.map((context) => ({\n contextId: context.id,\n applicationId: context.applicationId,\n }));\n}\n\nfunction useMountedRef() {\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n return mountedRef;\n}\n\nfunction useAsyncMutation() {\n const mountedRef = useMountedRef();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const run = useCallback(\n async <T,>(action: () => Promise<T>): Promise<T | null> => {\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n return await action();\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current) {\n setError(errorValue);\n }\n return null;\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n },\n [mountedRef],\n );\n\n return { loading, error, run, setError };\n}\n\n/**\n * Generic read resource: fetch + loading/error/data with a latest-request-wins\n * guard. `fetcher` is null when the read is disabled (missing args) — the\n * resource resets to `initialValue` and nothing is fetched. `deps` drive both\n * the refetch and a synchronous reset when they change, so a slow earlier\n * request can never overwrite a newer one. This is the staleness guard the read\n * hooks used to hand-roll (and mostly lacked), now in one place.\n */\nfunction useAsyncResource<T>(\n fetcher: (() => Promise<T>) | null,\n initialValue: T,\n deps: readonly unknown[],\n): { data: T; loading: boolean; error: Error | null; refetch: () => Promise<void> } {\n const mountedRef = useMountedRef();\n const [data, setData] = useState<T>(initialValue);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const reqRef = useRef(0);\n\n // fetcherRef is refreshed every render so refetch() always calls the latest\n // closure; initialRef captures the (per-hook constant) initial value once.\n // Neither is a dependency — adding them would break latest-request-wins.\n const fetcherRef = useRef(fetcher);\n fetcherRef.current = fetcher;\n const initialRef = useRef(initialValue);\n\n const refetch = useCallback(async () => {\n const seq = ++reqRef.current;\n const fn = fetcherRef.current;\n if (!fn) {\n if (mountedRef.current && seq === reqRef.current) {\n setData(initialRef.current);\n setError(null);\n setLoading(false);\n }\n return;\n }\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n try {\n const result = await fn();\n if (mountedRef.current && seq === reqRef.current) setData(result);\n } catch (err) {\n if (mountedRef.current && seq === reqRef.current) setError(toError(err));\n } finally {\n if (mountedRef.current && seq === reqRef.current) setLoading(false);\n }\n }, deps);\n\n // Invalidate any in-flight request and clear stale data synchronously when\n // the inputs change, so a pending response for old deps can't land later.\n useEffect(() => {\n reqRef.current += 1;\n setData(initialRef.current);\n setError(null);\n }, deps);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n return { data, loading, error, refetch };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction extractAliasContextId(value: unknown): string | null {\n if (typeof value === 'string') {\n return value;\n }\n\n if (!value || typeof value !== 'object') {\n return null;\n }\n\n if ('value' in value && typeof value.value === 'string') {\n return value.value;\n }\n\n if ('contextId' in value && typeof value.contextId === 'string') {\n return value.contextId;\n }\n\n return null;\n}\n\n/**\n * Execute RPC methods against a context.\n * Tracks loading/error state. Unmount-safe.\n */\nexport function useExecute(contextId: string | null, executorId: string | null) {\n const { mero } = useMero();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => { mountedRef.current = false; };\n }, []);\n\n const execute = useCallback(\n async <T = unknown>(method: string, params?: Record<string, unknown>): Promise<T | null> => {\n if (!mero || !contextId || !executorId) {\n if (mountedRef.current) setError(new Error('Not connected'));\n return null;\n }\n\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n try {\n const result = await mero.rpc.execute<T>({\n contextId,\n method,\n argsJson: params,\n executorPublicKey: executorId,\n });\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n if (mountedRef.current) setError(e);\n return null;\n } finally {\n if (mountedRef.current) setLoading(false);\n }\n },\n [mero, contextId, executorId],\n );\n\n return { execute, loading, error };\n}\n\n/** Event payload delivered to a `useSubscription` callback. */\nexport type SubscriptionEventData =\n | SseEventData\n | GroupMembershipEventData\n | GroupMigrationEventData;\n\n/** Ids to subscribe to. Either can be omitted, but not both. */\nexport interface SubscriptionInput {\n contextIds?: string[];\n groupIds?: string[];\n}\n\n/**\n * Subscribe to SSE events for context and/or group IDs.\n * StrictMode-safe: tracks the SseClient instance in a ref to avoid\n * double-connect on mount/unmount/remount cycles.\n */\nexport function useSubscription(\n contextIds: string[],\n callback: (event: SubscriptionEventData) => void,\n): void;\nexport function useSubscription(\n input: SubscriptionInput,\n callback: (event: SubscriptionEventData) => void,\n): void;\nexport function useSubscription(\n input: string[] | SubscriptionInput,\n callback: (event: SubscriptionEventData) => void,\n) {\n const { mero } = useMero();\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n const { contextIds = [], groupIds = [] } = Array.isArray(input)\n ? { contextIds: input, groupIds: [] as string[] }\n : input;\n\n const contextIdsKey = JSON.stringify(contextIds);\n const groupIdsKey = JSON.stringify(groupIds);\n\n useEffect(() => {\n if (!mero || (contextIds.length === 0 && groupIds.length === 0)) return;\n\n const sse = mero.events;\n\n const handler = (event: SubscriptionEventData) => {\n callbackRef.current(event);\n };\n\n sse.on('event', handler);\n sse.connect().catch(() => {});\n sse.subscribe({ contextIds, groupIds }).catch(() => {});\n\n return () => {\n sse.off('event', handler);\n };\n }, [mero, contextIdsKey, groupIdsKey]);\n}\n\n/**\n * Fetch contexts for the current node, optionally filtered by application ID.\n */\nexport function useContexts(applicationId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<ApplicationContextRecord[]>(\n mero\n ? async () => {\n const response = applicationId\n ? await mero.admin.getContextsForApplication(applicationId)\n : await mero.admin.getContexts();\n return mapApplicationContexts(response.contexts ?? []);\n }\n : null,\n [],\n [mero, applicationId],\n );\n return { contexts: data, loading, error, refetch };\n}\n\nexport function useApplicationContexts(applicationId?: string | null) {\n return useContexts(applicationId);\n}\n\nexport function useGroupMembers(groupId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<ListGroupMembersResponseData | null>(\n mero && groupId ? () => mero.admin.listGroupMembers(groupId) : null,\n null,\n [mero, groupId],\n );\n // `members` is a guaranteed array on the wire; `?? []` guards mocks / drift.\n return {\n members: data?.members ?? [],\n loading,\n error,\n refetch,\n };\n}\n\nexport function useGroupContexts(groupId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<GroupContextEntry[]>(\n mero && groupId ? () => mero.admin.listGroupContexts(groupId) : null,\n [],\n [mero, groupId],\n );\n return { contexts: data, loading, error, refetch };\n}\n\nexport function useGroupInvitations() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const createInvitation = useCallback(\n async (groupId: string, request?: CreateGroupInvitationRequest) => {\n if (!mero) {\n return null;\n }\n return run(() => mero.admin.createGroupInvitation(groupId, request));\n },\n [mero, run],\n );\n\n return { createInvitation, loading, error };\n}\n\nexport function useJoinGroup() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const joinGroup = useCallback(\n async (request: JoinGroupRequest) => {\n if (!mero) {\n return null;\n }\n return run(() => mero.admin.joinGroup(request));\n },\n [mero, run],\n );\n\n return { joinGroup, loading, error };\n}\n\n/**\n * Takes the member's ACCOUNT (64 hex), as `useGroupMembers` rows are keyed by\n * and `useNodeIdentity().identity?.accountId` returns - NOT a signing key.\n * Both are 32-byte strings, so passing a key names nobody and raises nothing.\n */\nexport function useGroupCapabilities(groupId?: string | null, memberId?: string | null) {\n const { mero } = useMero();\n const [capabilities, setCapabilitiesState] = useState<number | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useMountedRef();\n // Read+write hybrid (setCapabilities shares this state), so it keeps the\n // inline latest-request-wins guard rather than useAsyncResource.\n const reqRef = useRef(0);\n\n const refetch = useCallback(async () => {\n const seq = ++reqRef.current;\n if (!mero || !groupId || !memberId) {\n if (mountedRef.current && seq === reqRef.current) {\n setCapabilitiesState(null);\n setError(null);\n setLoading(false);\n }\n return null;\n }\n\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n const response = await mero.admin.getMemberCapabilities(groupId, memberId);\n if (mountedRef.current && seq === reqRef.current) {\n setCapabilitiesState(response.capabilities);\n }\n return response.capabilities;\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current && seq === reqRef.current) {\n setError(errorValue);\n }\n return null;\n } finally {\n if (mountedRef.current && seq === reqRef.current) {\n setLoading(false);\n }\n }\n }, [groupId, memberId, mero, mountedRef]);\n\n useEffect(() => {\n reqRef.current += 1;\n setCapabilitiesState(null);\n setError(null);\n }, [groupId, memberId]);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n const setCapabilities = useCallback(\n async (nextCapabilities: number) => {\n if (!mero || !groupId || !memberId) {\n return null;\n }\n\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n await mero.admin.setMemberCapabilities(groupId, memberId, { capabilities: nextCapabilities });\n if (mountedRef.current) {\n setCapabilitiesState(nextCapabilities);\n }\n return nextCapabilities;\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current) {\n setError(errorValue);\n }\n return null;\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n },\n [groupId, memberId, mero, mountedRef],\n );\n\n return { capabilities, loading, error, refetch, setCapabilities };\n}\n\nexport function useContextDiscovery(options: ContextDiscoveryOptions): ContextDiscoveryState {\n const { mero } = useMero();\n const [context, setContext] = useState<ApplicationContextRecord | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useMountedRef();\n\n const knownContextIdsKey = JSON.stringify(options.knownContextIds ?? []);\n\n const discover = useCallback(async () => {\n if (!mero) {\n const notConnectedError = new Error('Not connected');\n if (mountedRef.current) {\n setError(notConnectedError);\n }\n return null;\n }\n const knownContextIds = new Set(options.knownContextIds ?? []);\n const pollIntervalMs = options.pollIntervalMs ?? 1000;\n const timeoutMs = options.timeoutMs ?? 30000;\n const deadline = Date.now() + timeoutMs;\n\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n while (Date.now() <= deadline) {\n if (options.targetAlias) {\n const aliasMatch = extractAliasContextId(\n await mero.admin.lookupContextAlias(options.targetAlias),\n );\n\n if (aliasMatch && !knownContextIds.has(aliasMatch)) {\n const discoveredFromAlias = {\n contextId: aliasMatch,\n applicationId: options.applicationId,\n };\n\n if (mountedRef.current) {\n setContext(discoveredFromAlias);\n }\n\n return discoveredFromAlias;\n }\n }\n\n const response = await mero.admin.getContextsForApplication(options.applicationId);\n const contexts = mapApplicationContexts(response.contexts ?? []);\n const discovered = contexts.find(\n (applicationContext) => !knownContextIds.has(applicationContext.contextId),\n );\n\n if (discovered) {\n if (mountedRef.current) {\n setContext(discovered);\n }\n return discovered;\n }\n\n if (Date.now() + pollIntervalMs > deadline) {\n break;\n }\n\n await sleep(pollIntervalMs);\n }\n\n const timeoutError = new Error(\n `Timed out discovering a context for application ${options.applicationId}`,\n );\n\n if (mountedRef.current) {\n setContext(null);\n setError(timeoutError);\n }\n\n return null;\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current) {\n setContext(null);\n setError(errorValue);\n }\n return null;\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [\n knownContextIdsKey,\n mero,\n mountedRef,\n options.applicationId,\n options.knownContextIds,\n options.pollIntervalMs,\n options.targetAlias,\n options.timeoutMs,\n ]);\n\n const reset = useCallback(() => {\n if (mountedRef.current) {\n setContext(null);\n setError(null);\n setLoading(false);\n }\n }, [mountedRef]);\n\n return { context, loading, error, discover, reset };\n}\n\n// ---- Context CRUD Hooks ----\n\nexport function useCreateContext() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const createContext = useCallback(\n async (request: CreateContextRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.createContext(request));\n },\n [mero, run],\n );\n\n return { createContext, loading, error };\n}\n\nexport function useDeleteContext() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const deleteContext = useCallback(\n async (contextId: string) => {\n if (!mero) return null;\n return run(() => mero.admin.deleteContext(contextId));\n },\n [mero, run],\n );\n\n return { deleteContext, loading, error };\n}\n\nexport function useJoinContext() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const joinContext = useCallback(\n async (contextId: string) => {\n if (!mero) return null;\n return run(() => mero.admin.joinContext(contextId));\n },\n [mero, run],\n );\n\n return { joinContext, loading, error };\n}\n\nexport function useJoinSubgroupInheritance() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const joinSubgroupInheritance = useCallback(\n async (groupId: string) => {\n if (!mero) return null;\n return run(() => mero.admin.joinSubgroupInheritance(groupId));\n },\n [mero, run],\n );\n\n return { joinSubgroupInheritance, loading, error };\n}\n\nexport function useContextGroup(contextId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<string | null>(\n mero && contextId ? () => mero.admin.getContextGroup(contextId) : null,\n null,\n [mero, contextId],\n );\n return { groupId: data, loading, error, refetch };\n}\n\n// ---- Group Info / Management Hooks ----\n\nexport function useGroupInfo(groupId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<GroupInfo | null>(\n mero && groupId ? () => mero.admin.getGroupInfo(groupId) : null,\n null,\n [mero, groupId],\n );\n return { groupInfo: data, loading, error, refetch };\n}\n\nexport function useDeleteGroup() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const deleteGroup = useCallback(\n async (groupId: string, request?: DeleteGroupRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.deleteGroup(groupId, request));\n },\n [mero, run],\n );\n\n return { deleteGroup, loading, error };\n}\n\nexport function useSyncGroup() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const syncGroup = useCallback(\n async (groupId: string, request?: SyncGroupRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.syncGroup(groupId, request));\n },\n [mero, run],\n );\n\n return { syncGroup, loading, error };\n}\n\n/**\n * Takes the invitee's signing KEY (bs58) - the one call on this resource that\n * does, because someone being added may have no account here yet. Every other\n * member call, including `useRemoveGroupMembers`, takes the ACCOUNT, so a value\n * round-tripped from an add is the wrong one to remove with.\n */\nexport function useAddGroupMembers() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const addGroupMembers = useCallback(\n async (groupId: string, request: AddGroupMembersRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.addGroupMembers(groupId, request));\n },\n [mero, run],\n );\n\n return { addGroupMembers, loading, error };\n}\n\n/**\n * Takes the member's ACCOUNT (64 hex), as `useGroupMembers` rows are keyed by\n * and `useNodeIdentity().identity?.accountId` returns - NOT a signing key.\n * Both are 32-byte strings, so passing a key names nobody and raises nothing.\n */\nexport function useRemoveGroupMembers() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const removeGroupMembers = useCallback(\n async (groupId: string, request: RemoveGroupMembersRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.removeGroupMembers(groupId, request));\n },\n [mero, run],\n );\n\n return { removeGroupMembers, loading, error };\n}\n\n// ---- Namespace Hooks ----\n\nexport function useNamespaces() {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<Namespace[]>(\n mero ? () => mero.admin.listNamespaces() : null,\n [],\n [mero],\n );\n return { namespaces: data, loading, error, refetch };\n}\n\nexport function useNamespace(namespaceId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<Namespace | null>(\n mero && namespaceId ? () => mero.admin.getNamespace(namespaceId) : null,\n null,\n [mero, namespaceId],\n );\n return { namespace: data, loading, error, refetch };\n}\n\n/**\n * Who this node is: `accountId` is what member-addressing takes and what\n * `useGroupMembers` rows are keyed by — `publicKey` is the signing key and\n * addresses nobody. Both are 32-byte strings, so a swap fails silently.\n */\nexport function useNodeIdentity() {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<NodeIdentity | null>(\n mero ? () => mero.admin.getNodeIdentity() : null,\n null,\n [mero],\n );\n return { identity: data, loading, error, refetch };\n}\n\n/**\n * @deprecated Use {@link useNodeIdentity}. Identity is per-node, not\n * per-namespace, and this no longer gates on participation: it answers for a\n * namespace this node never joined, so `identity != null` is not \"am I a\n * member?\" — ask `useNamespaces` for that. Its `publicKey` is the signing key,\n * NOT the account member-addressing wants.\n */\nexport function useNamespaceIdentity(namespaceId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<NamespaceIdentity | null>(\n mero && namespaceId ? () => mero.admin.getNamespaceIdentity(namespaceId) : null,\n null,\n [mero, namespaceId],\n );\n return { identity: data, loading, error, refetch };\n}\n\nexport function useNamespacesForApplication(applicationId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<Namespace[]>(\n mero && applicationId ? () => mero.admin.listNamespacesForApplication(applicationId) : null,\n [],\n [mero, applicationId],\n );\n return { namespaces: data, loading, error, refetch };\n}\n\nexport function useCreateNamespace() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const createNamespace = useCallback(\n async (request: CreateNamespaceRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.createNamespace(request));\n },\n [mero, run],\n );\n\n return { createNamespace, loading, error };\n}\n\nexport function useDeleteNamespace() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const deleteNamespace = useCallback(\n async (namespaceId: string, request?: DeleteNamespaceRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.deleteNamespace(namespaceId, request));\n },\n [mero, run],\n );\n\n return { deleteNamespace, loading, error };\n}\n\nexport function useCreateNamespaceInvitation() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const createNamespaceInvitation = useCallback(\n async (\n namespaceId: string,\n request?: CreateNamespaceInvitationRequest,\n ): Promise<CreateNamespaceInvitationResponseData | CreateRecursiveInvitationResponseData | null> => {\n if (!mero) return null;\n return run(() => mero.admin.createNamespaceInvitation(namespaceId, request));\n },\n [mero, run],\n );\n\n return { createNamespaceInvitation, loading, error };\n}\n\nexport function useJoinNamespace() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const joinNamespace = useCallback(\n async (namespaceId: string, request: JoinNamespaceRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.joinNamespace(namespaceId, request));\n },\n [mero, run],\n );\n\n return { joinNamespace, loading, error };\n}\n\nexport function useCreateGroupInNamespace() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const createGroupInNamespace = useCallback(\n async (namespaceId: string, request?: CreateGroupInNamespaceRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.createGroupInNamespace(namespaceId, request));\n },\n [mero, run],\n );\n\n return { createGroupInNamespace, loading, error };\n}\n\nexport function useNamespaceGroups(namespaceId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<SubgroupEntry[]>(\n mero && namespaceId ? () => mero.admin.listNamespaceGroups(namespaceId) : null,\n [],\n [mero, namespaceId],\n );\n return { groups: data, loading, error, refetch };\n}\n\n// ---- Group Settings & Role Management ----\n\n/**\n * Takes the member's ACCOUNT (64 hex), as `useGroupMembers` rows are keyed by\n * and `useNodeIdentity().identity?.accountId` returns - NOT a signing key.\n * Both are 32-byte strings, so passing a key names nobody and raises nothing.\n */\nexport function useUpdateMemberRole() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const updateMemberRole = useCallback(\n async (groupId: string, identity: string, request: UpdateMemberRoleRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.updateMemberRole(groupId, identity, request));\n },\n [mero, run],\n );\n\n return { updateMemberRole, loading, error };\n}\n\nexport function useSetDefaultCapabilities() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const setDefaultCapabilities = useCallback(\n async (groupId: string, request: SetDefaultCapabilitiesRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.setDefaultCapabilities(groupId, request));\n },\n [mero, run],\n );\n\n return { setDefaultCapabilities, loading, error };\n}\n\nexport function useSetSubgroupVisibility() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const setSubgroupVisibility = useCallback(\n async (groupId: string, request: SetSubgroupVisibilityRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.setSubgroupVisibility(groupId, request));\n },\n [mero, run],\n );\n\n return { setSubgroupVisibility, loading, error };\n}\n\nexport function useDefaultCapabilities(groupId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<number | null>(\n mero && groupId ? () => mero.admin.getDefaultCapabilities(groupId) : null,\n null,\n [mero, groupId],\n );\n return { defaultCapabilities: data, loading, error, refetch };\n}\n\nexport function useSubgroupVisibility(groupId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<string | null>(\n mero && groupId ? () => mero.admin.getSubgroupVisibility(groupId) : null,\n null,\n [mero, groupId],\n );\n return { subgroupVisibility: data, loading, error, refetch };\n}\n\nexport function useSetTeeAdmissionPolicy() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const setTeeAdmissionPolicy = useCallback(\n async (groupId: string, request: SetTeeAdmissionPolicyRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.setTeeAdmissionPolicy(groupId, request));\n },\n [mero, run],\n );\n\n return { setTeeAdmissionPolicy, loading, error };\n}\n\n// ---- Metadata Hooks ----\n\nexport function useSetGroupMetadata() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const setGroupMetadata = useCallback(\n async (groupId: string, request: SetMetadataInput) => {\n if (!mero) return null;\n return run(() => mero.admin.setGroupMetadata(groupId, request));\n },\n [mero, run],\n );\n\n return { setGroupMetadata, loading, error };\n}\n\n/**\n * Takes the member's ACCOUNT (64 hex), as `useGroupMembers` rows are keyed by\n * and `useNodeIdentity().identity?.accountId` returns - NOT a signing key.\n * Both are 32-byte strings, so passing a key names nobody and raises nothing.\n */\nexport function useSetMemberMetadata() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const setMemberMetadata = useCallback(\n async (groupId: string, identity: string, request: SetMetadataInput) => {\n if (!mero) return null;\n return run(() => mero.admin.setMemberMetadata(groupId, identity, request));\n },\n [mero, run],\n );\n\n return { setMemberMetadata, loading, error };\n}\n\nexport function useSetContextMetadata() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const setContextMetadata = useCallback(\n async (groupId: string, contextId: string, request: SetMetadataInput) => {\n if (!mero) return null;\n return run(() => mero.admin.setContextMetadata(groupId, contextId, request));\n },\n [mero, run],\n );\n\n return { setContextMetadata, loading, error };\n}\n\nexport function useGroupMetadata(groupId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<MetadataRecord | null>(\n mero && groupId ? () => mero.admin.getGroupMetadata(groupId) : null,\n null,\n [mero, groupId],\n );\n return { metadata: data, loading, error, refetch };\n}\n\nexport function useMemberMetadata(groupId?: string | null, identity?: string | null) {\n const { mero } = useMero();\n const [metadata, setMetadata] = useState<MetadataRecord | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Shared fetch logic for the auto-mount effect and the explicit\n // refetch callable. The per-invocation `signal.aborted` flag covers\n // the response-during-unmount race cleanly without the global\n // mountedRef gate that — under StrictMode-like fast unmount/remount\n // cycles — could leave the hook stuck on `metadata = null` when an\n // in-flight response landed during cleanup and the followup mount's\n // useCallback referential identity hadn't changed enough to re-fire\n // the effect.\n const run = useCallback(\n async (signal: { aborted: boolean }) => {\n if (!mero || !groupId || !identity) {\n if (!signal.aborted) {\n setMetadata(null);\n setError(null);\n setLoading(false);\n }\n return;\n }\n if (!signal.aborted) {\n setLoading(true);\n setError(null);\n }\n try {\n const result = await mero.admin.getMemberMetadata(groupId, identity);\n if (!signal.aborted) setMetadata(result);\n } catch (err) {\n if (!signal.aborted) setError(toError(err));\n } finally {\n if (!signal.aborted) setLoading(false);\n }\n },\n [mero, groupId, identity],\n );\n\n useEffect(() => {\n const signal = { aborted: false };\n void run(signal);\n return () => {\n signal.aborted = true;\n };\n }, [run]);\n\n // Explicit refetch — the caller's `await refetch()` resolves only\n // after state has been written (preserves the prior API contract;\n // call sites like `useMemberDisplayName.setName` rely on the new\n // value being readable from state after the await).\n const refetch = useCallback(async () => {\n const signal = { aborted: false };\n await run(signal);\n }, [run]);\n\n return { metadata, loading, error, refetch };\n}\n\n// ---- Group Signing Key, Upgrades & Hierarchy ----\n\nexport function useUpgradeGroup() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const upgradeGroup = useCallback(\n async (groupId: string, request: UpgradeGroupRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.upgradeGroup(groupId, request));\n },\n [mero, run],\n );\n\n return { upgradeGroup, loading, error };\n}\n\n/**\n * Install a registry package version onto the node — the discrete \"Download\"\n * step an Updates flow runs before an `upgradeGroup`. Resolves the installed\n * application id (`InstallApplicationResponseData`). Downloading does not by\n * itself change what any group runs; pair it with a subsequent upgrade.\n */\nexport function useInstallFromRegistry() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const installFromRegistry = useCallback(\n async (registryUrl: string, packageName: string, version: string) => {\n if (!mero) return null;\n return run(() => mero.admin.installFromRegistry(registryUrl, packageName, version));\n },\n [mero, run],\n );\n\n return { installFromRegistry, loading, error };\n}\n\n/**\n * Kick off a full state re-pull for a context — operator recovery for a\n * context stranded mid-sync. `force` re-pulls even when the node does not\n * flag the context as stranded.\n */\nexport function useResyncContext() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const resyncContext = useCallback(\n async (contextId: string, request: ResyncContextRequest = {}) => {\n if (!mero) return null;\n return run(() => mero.admin.resyncContext(contextId, request));\n },\n [mero, run],\n );\n\n return { resyncContext, loading, error };\n}\n\nexport function useGroupUpgradeStatus(groupId?: string | null) {\n const { mero } = useMero();\n const [upgradeStatus, setUpgradeStatus] = useState<GroupUpgradeStatusResponseData>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useMountedRef();\n // Latest-request-wins token (see useMigrationStatus) so overlapping refetches\n // can't land out of order and overwrite fresher data.\n const reqRef = useRef(0);\n\n const refetch = useCallback(async () => {\n const seq = ++reqRef.current;\n if (!mero || !groupId) {\n if (mountedRef.current) {\n setUpgradeStatus(null);\n setError(null);\n setLoading(false);\n }\n return;\n }\n\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n const result = await mero.admin.getGroupUpgradeStatus(groupId);\n if (mountedRef.current && seq === reqRef.current) {\n setUpgradeStatus(result);\n }\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current && seq === reqRef.current) {\n setError(errorValue);\n }\n } finally {\n if (mountedRef.current && seq === reqRef.current) {\n setLoading(false);\n }\n }\n }, [groupId, mero, mountedRef]);\n\n // Clear stale status synchronously when the target group changes (and\n // invalidate any in-flight refetch), mirroring useMigrationStatus.\n useEffect(() => {\n reqRef.current += 1;\n setUpgradeStatus(null);\n setError(null);\n }, [groupId]);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n return { upgradeStatus, loading, error, refetch };\n}\n\nexport function useRetryGroupUpgrade() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const retryGroupUpgrade = useCallback(\n async (groupId: string, request?: RetryGroupUpgradeRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.retryGroupUpgrade(groupId, request));\n },\n [mero, run],\n );\n\n return { retryGroupUpgrade, loading, error };\n}\n\n/** Move `childGroupId` under a new parent. */\nexport function useReparentGroup() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const reparentGroup = useCallback(\n async (childGroupId: string, request: ReparentGroupRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.reparentGroup(childGroupId, request));\n },\n [mero, run],\n );\n\n return { reparentGroup, loading, error };\n}\n\nexport function useSubgroups(groupId?: string | null) {\n const { mero } = useMero();\n const { data, loading, error, refetch } = useAsyncResource<SubgroupEntry[]>(\n mero && groupId ? () => mero.admin.listSubgroups(groupId) : null,\n [],\n [mero, groupId],\n );\n return { subgroups: data, loading, error, refetch };\n}\n\n// ---- Context-Group Relationship ----\n\nexport function useDetachContextFromGroup() {\n const { mero } = useMero();\n const { loading, error, run } = useAsyncMutation();\n\n const detachContextFromGroup = useCallback(\n async (groupId: string, contextId: string, request?: DetachContextFromGroupRequest) => {\n if (!mero) return null;\n return run(() => mero.admin.detachContextFromGroup(groupId, contextId, request));\n },\n [mero, run],\n );\n\n return { detachContextFromGroup, loading, error };\n}\n\n/**\n * Subscribe to a namespace's `GroupMigration` events, invoking `onEvent` per\n * frame and unsubscribing on unmount.\n *\n * A non-admin subscriber never sees `CascadeProgress`; core delivers that to\n * namespace admins only, so a UI must not wait on it to decide progress.\n */\n/**\n * Fallback poll cadence for `useMigrationStatus` when the SSE stream is\n * unavailable (no token, a proxy that buffers, an older node) and the caller\n * named no interval of its own. Chosen to match the heartbeat cadence that\n * migration facts actually arrive on; an explicit `pollIntervalMs` overrides it.\n */\nexport const DEFAULT_MIGRATION_POLL_INTERVAL_MS = 5000;\n\nexport function useMigrationEvents(\n namespaceId: string | null | undefined,\n onEvent: (event: GroupMigrationEventData) => void,\n): boolean {\n const { mero } = useMero();\n const mountedRef = useMountedRef();\n // Whether the stream is actually carrying frames. Callers use it to decide\n // whether they still need a fallback poll, so it must reflect the subscribe\n // ACTUALLY succeeding - not merely that we asked.\n const [live, setLive] = useState(false);\n // Held in a ref so a caller passing an inline arrow does not resubscribe on\n // every render - the subscription's lifetime is the namespace's, not the\n // callback identity's.\n const handlerRef = useRef(onEvent);\n handlerRef.current = onEvent;\n\n useEffect(() => {\n if (!mero || !namespaceId) return;\n const sse = mero.events;\n const unsubscribe = sse.onMigrationEvent((event) => handlerRef.current(event));\n // Sequential, and the result is recorded: connecting but failing to\n // subscribe is still a dead stream, and both used to be swallowed, which\n // left a caller unable to tell a live stream from a silent one.\n let cancelled = false;\n void (async () => {\n try {\n await sse.connect();\n await sse.subscribe({ groupIds: [namespaceId] });\n if (!cancelled && mountedRef.current) setLive(true);\n } catch {\n if (!cancelled && mountedRef.current) setLive(false);\n }\n })();\n return () => {\n cancelled = true;\n if (mountedRef.current) setLive(false);\n unsubscribe();\n };\n }, [mero, namespaceId, mountedRef]);\n\n return live;\n}\n\n/**\n * Migration-status rollup for a namespace (skew #3).\n *\n * Live: subscribes to the `GroupMigration` event family and re-reads on each\n * frame. It re-READS rather than folding the event's counters in, because the\n * rollup is recomputed from raw member rows and is the authoritative answer.\n * `pollIntervalMs` stays as the fallback when SSE is unavailable, and when the\n * caller names none it defaults to `DEFAULT_MIGRATION_POLL_INTERVAL_MS` for\n * exactly as long as the stream is down - so the panel can never sit silently\n * frozen with neither transport.\n * Derived counters are null-safe before the first load.\n */\nexport function useMigrationStatus(\n namespaceId?: string | null,\n options?: { pollIntervalMs?: number },\n) {\n const { mero } = useMero();\n const [status, setStatus] = useState<MigrationStatus | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useMountedRef();\n // Monotonic request token: only the latest in-flight request applies its\n // result, so an overlapping poll or a fast namespace change can't let a\n // stale response overwrite fresher data.\n const reqRef = useRef(0);\n\n const refetch = useCallback(async () => {\n if (!mero || !namespaceId) {\n if (mountedRef.current) {\n setStatus(null);\n setError(null);\n setLoading(false);\n }\n return;\n }\n\n const seq = ++reqRef.current;\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n const result = await mero.admin.getMigrationStatus(namespaceId);\n if (mountedRef.current && seq === reqRef.current) {\n setStatus(result);\n }\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current && seq === reqRef.current) {\n setError(errorValue);\n }\n } finally {\n if (mountedRef.current && seq === reqRef.current) {\n setLoading(false);\n }\n }\n }, [namespaceId, mero, mountedRef]);\n\n // Clear stale state the instant the namespace changes, so the panel shows a\n // loading state rather than the previous namespace's data during the refetch.\n useEffect(() => {\n setStatus(null);\n setError(null);\n }, [namespaceId]);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n // Live updates. The frame is a signal, not the answer: it says something\n // moved, and the re-read is what stays authoritative. This runs BEFORE the\n // poll below because whether the stream is genuinely live is what decides\n // if a caller who named no interval needs a fallback poll at all.\n const sseLive = useMigrationEvents(namespaceId, () => void refetch());\n\n // An explicit interval always wins - a caller that asked to poll keeps\n // polling. When none was named, poll only while the stream is NOT live:\n // migration facts arrive by heartbeat gossip with no push transport of their\n // own, so with neither SSE nor an interval the panel loads once and then\n // silently never updates again, with no error to show for it.\n const pollIntervalMs =\n options?.pollIntervalMs ??\n (sseLive ? undefined : DEFAULT_MIGRATION_POLL_INTERVAL_MS);\n useEffect(() => {\n if (!pollIntervalMs || !mero || !namespaceId) return;\n const handle = setInterval(() => void refetch(), pollIntervalMs);\n return () => clearInterval(handle);\n }, [pollIntervalMs, mero, namespaceId, refetch]);\n\n const rollup: MigrationStatusRollup | null = status?.rollup ?? null;\n const members: MemberMigrationStatusEntry[] = status?.members ?? [];\n\n return {\n status,\n rollup,\n members,\n allMigrated: rollup?.allMigrated ?? false,\n /**\n * When this node watched the fleet converge, or `null`. Durable, unlike\n * `allMigrated`, which is recomputed from in-TTL heartbeats and lapses back\n * to false when a member simply goes quiet.\n */\n fleetCompletedAt: status?.fleetCompletedAt ?? null,\n membersPendingSignature: rollup?.membersPendingSignature ?? 0,\n /** Members whose migrate aborted (migration-check failed or apply errored). */\n failed: rollup?.failed ?? 0,\n loading,\n error,\n refetch,\n };\n}\n\n/**\n * Bundle-version skew (#2): reads the context's installed `applicationVersion`\n * (semver) and compares it to the app-declared `expected` build constant. Any\n * mismatch (either direction) is `isStale` → \"reload to update\". Subscribes to\n * `AppVersionChanged` so a live flip updates `appVersion` without a refetch.\n */\nexport function useAppVersion(contextId?: string | null, expected?: string) {\n const { mero } = useMero();\n const [appVersion, setAppVersion] = useState<string | undefined>(undefined);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useMountedRef();\n // Latest-request-wins token (see useMigrationStatus).\n const reqRef = useRef(0);\n\n const refetch = useCallback(async () => {\n if (!mero || !contextId) {\n if (mountedRef.current) {\n setAppVersion(undefined);\n setError(null);\n setLoading(false);\n }\n return;\n }\n\n const seq = ++reqRef.current;\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n const context = await mero.admin.getContext(contextId);\n if (mountedRef.current && seq === reqRef.current) {\n setAppVersion(context.applicationVersion);\n }\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current && seq === reqRef.current) {\n setError(errorValue);\n }\n } finally {\n if (mountedRef.current && seq === reqRef.current) {\n setLoading(false);\n }\n }\n }, [contextId, mero, mountedRef]);\n\n // Reset on context change so a stale version isn't shown during the refetch.\n useEffect(() => {\n setAppVersion(undefined);\n setError(null);\n }, [contextId]);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n useEffect(() => {\n if (!mero?.events || !contextId) return;\n const off = mero.events.onAppVersionChanged((event: AppVersionChangedEvent) => {\n if (event.contextId !== contextId) return;\n if (mountedRef.current && event.toVersion) {\n // Invalidate any in-flight refetch so its (older) result can't clobber\n // this live update.\n reqRef.current += 1;\n setAppVersion(event.toVersion);\n }\n });\n return off;\n }, [mero, contextId, mountedRef]);\n\n const isStale = appVersion != null && expected != null && appVersion !== expected;\n\n return { appVersion, expected, isStale, loading, error, refetch };\n}\n\n/**\n * \"Is a newer version available?\" for an Updates view. Reads a package's\n * published versions from the registry and compares the newest to the running\n * `currentVersion` (e.g. a context's `applicationVersion`). `updateAvailable`\n * is true only when the registry's newest is strictly greater. This is the\n * registry-side check the admin acts on; gate rendering on admin status at the\n * call site. Pure read — fetching nothing until both `registryUrl` and\n * `packageName` are provided.\n */\nexport function useLatestVersion(\n registryUrl?: string | null,\n packageName?: string | null,\n currentVersion?: string | null,\n) {\n const { mero } = useMero();\n const [versions, setVersions] = useState<string[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useMountedRef();\n // Latest-request-wins token (see useMigrationStatus).\n const reqRef = useRef(0);\n\n const refetch = useCallback(async () => {\n if (!mero || !registryUrl || !packageName) {\n // Invalidate any in-flight request so a late response can't repopulate\n // stale versions for the previous package after the inputs were cleared.\n reqRef.current += 1;\n if (mountedRef.current) {\n setVersions([]);\n setError(null);\n setLoading(false);\n }\n return;\n }\n\n const seq = ++reqRef.current;\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n const result = await mero.admin.getRegistryVersions(registryUrl, packageName);\n if (mountedRef.current && seq === reqRef.current) {\n setVersions(result);\n }\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current && seq === reqRef.current) {\n setError(errorValue);\n }\n } finally {\n if (mountedRef.current && seq === reqRef.current) {\n setLoading(false);\n }\n }\n }, [mero, registryUrl, packageName, mountedRef]);\n\n // Clear stale versions the instant the package/registry changes.\n useEffect(() => {\n setVersions([]);\n setError(null);\n }, [registryUrl, packageName]);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n // getRegistryVersions returns newest-first, so [0] is the latest published.\n const latestVersion = versions[0] ?? null;\n const updateAvailable =\n latestVersion != null &&\n currentVersion != null &&\n compareSemver(latestVersion, currentVersion) > 0;\n\n return { versions, latestVersion, currentVersion, updateAvailable, loading, error, refetch };\n}\n\ninterface GroupAppVersion {\n /** Semver of the application the group currently targets (`null` until loaded). */\n version: string | null;\n /** The group's `targetApplicationId`. */\n applicationId: string | null;\n /** The installed blob differs from the one the group targets (see hook doc). */\n pendingApply: boolean;\n /** Only populated via the group-info path; `null` in the namespace path. */\n activeUpgrade: GroupUpgradeStatusResponseData;\n}\n\nconst EMPTY_GROUP_APP_VERSION: GroupAppVersion = {\n version: null,\n applicationId: null,\n pendingApply: false,\n activeUpgrade: null,\n};\n\n/** An appKey carries no \"pending\" signal when it is absent or all-zero. */\nfunction isZeroAppKey(appKey?: string): boolean {\n return !appKey || /^0+$/.test(appKey);\n}\n\n/**\n * What app version does this group run, and is there a downloaded-but-not-yet-\n * applied update? Replaces the appKey-vs-installed-blob comparison apps\n * otherwise hand-roll: `pendingApply` is true when the group's `appKey` (the\n * blob it targets) is present, non-zero, and differs from the blob actually\n * installed for its `targetApplicationId`. Deciding whether to render or gate on\n * that status (admin-only actions, etc.) is the call site's job.\n *\n * Resolution stays cheap: the group's record comes from `listNamespaces()` when\n * the id is a namespace, else from `getGroupInfo()`; `getApplication()` then\n * reads the installed version and blob. `activeUpgrade` is returned only when it\n * arrives for free on the group-info path (it is not fetched separately).\n * Subscribes to `AppVersionChanged` and refetches, since any version flip in the\n * workspace can make the rollup stale.\n */\nexport function useGroupAppVersion(groupId?: string) {\n const { mero } = useMero();\n const [data, setData] = useState<GroupAppVersion>(EMPTY_GROUP_APP_VERSION);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useMountedRef();\n // Latest-request-wins token (see useMigrationStatus).\n const reqRef = useRef(0);\n\n const refetch = useCallback(async () => {\n const seq = ++reqRef.current;\n if (!mero || !groupId) {\n if (mountedRef.current) {\n setData(EMPTY_GROUP_APP_VERSION);\n setError(null);\n setLoading(false);\n }\n return;\n }\n\n if (mountedRef.current) {\n setLoading(true);\n setError(null);\n }\n\n try {\n // Namespace-first resolution: a top-level group is a namespace; only\n // subgroups need the getGroupInfo fallback (which also carries\n // activeUpgrade, so we surface it without a third call).\n const namespaces = await mero.admin.listNamespaces();\n const namespace = namespaces.find((entry) => entry.namespaceId === groupId);\n\n let appKey: string | undefined;\n let applicationId: string | null;\n let activeUpgrade: GroupUpgradeStatusResponseData = null;\n\n if (namespace) {\n appKey = namespace.appKey;\n applicationId = namespace.targetApplicationId;\n } else {\n const info = await mero.admin.getGroupInfo(groupId);\n appKey = info.appKey;\n applicationId = info.targetApplicationId;\n activeUpgrade = info.activeUpgrade ?? null;\n }\n\n let version: string | null = null;\n let pendingApply = false;\n if (applicationId) {\n const { application } = await mero.admin.getApplication(applicationId);\n version = application?.version ?? null;\n if (application && !isZeroAppKey(appKey)) {\n const installedHex = base58ToHex(application.blob.bytecode).toLowerCase();\n pendingApply = appKey!.toLowerCase() !== installedHex;\n }\n }\n\n if (mountedRef.current && seq === reqRef.current) {\n setData({ version, applicationId, pendingApply, activeUpgrade });\n }\n } catch (err) {\n const errorValue = toError(err);\n if (mountedRef.current && seq === reqRef.current) {\n setError(errorValue);\n }\n } finally {\n if (mountedRef.current && seq === reqRef.current) {\n setLoading(false);\n }\n }\n }, [groupId, mero, mountedRef]);\n\n // Clear stale state synchronously when the target group changes (and\n // invalidate any in-flight refetch). Mirrors useGroupUpgradeStatus.\n useEffect(() => {\n reqRef.current += 1;\n setData(EMPTY_GROUP_APP_VERSION);\n setError(null);\n }, [groupId]);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n useEffect(() => {\n if (!mero?.events || !groupId) return;\n const off = mero.events.onAppVersionChanged(() => {\n if (mountedRef.current) void refetch();\n });\n return off;\n }, [mero, groupId, refetch, mountedRef]);\n\n return { ...data, loading, error, refetch };\n}\n\n/**\n * The caller's own identity-gated entries pending re-signature (skew #1).\n * `pending` is `pendingCount > 0` (from `count_my_pending`); `authorize()` runs\n * the one-tap `migrate_my_entries` convert and folds the resulting `remaining`\n * back into the count.\n */\nexport function useMyAuthoredMigration(contextId?: string | null) {\n const { mero } = useMero();\n const [summary, setSummary] = useState<MigrateMyEntriesSummary | null>(null);\n const [pendingCount, setPendingCount] = useState(0);\n const mountedRef = useMountedRef();\n const { loading, error, run } = useAsyncMutation();\n // Latest-request-wins token (see useMigrationStatus).\n const reqRef = useRef(0);\n\n const refresh = useCallback(async () => {\n if (!mero || !contextId) {\n if (mountedRef.current) setPendingCount(0);\n return;\n }\n const seq = ++reqRef.current;\n try {\n const count = await mero.rpc.countMyPending(contextId);\n if (mountedRef.current && seq === reqRef.current) setPendingCount(count);\n } catch {\n // best-effort count; leave the previous value on a transient failure\n }\n }, [mero, contextId, mountedRef]);\n\n // Clear stale per-context state synchronously when the target changes (and\n // invalidate any in-flight refresh), so the banner doesn't flash the previous\n // context's count until the new count resolves. Mirrors useMigrationStatus.\n useEffect(() => {\n reqRef.current += 1;\n setPendingCount(0);\n setSummary(null);\n }, [contextId]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const authorize = useCallback(async () => {\n if (!mero || !contextId) return null;\n const result = await run(() => mero.rpc.migrateMyEntries(contextId));\n if (result && mountedRef.current) {\n // Invalidate any in-flight refresh so a stale count can't overwrite the\n // authoritative post-convert remaining.\n reqRef.current += 1;\n setSummary(result);\n setPendingCount(result.remaining);\n }\n return result;\n }, [mero, contextId, run, mountedRef]);\n\n return {\n summary,\n pendingCount,\n pending: pendingCount > 0,\n authorize,\n loading,\n error,\n refresh,\n };\n}\n","import type { ReactNode } from 'react';\nimport { useMyAuthoredMigration } from '../hooks';\n\nexport interface MigrationPendingBannerProps {\n /** Context whose authored entries to check / convert. */\n contextId: string;\n className?: string;\n /** Override the default prompt text. */\n children?: ReactNode;\n /** Fired once a convert leaves nothing pending (`remaining === 0`). */\n onMigrated?: () => void;\n}\n\n/**\n * Shows only when the current identity has entries below the target schema\n * (skew #1). A single button runs the one-tap `migrate_my_entries` convert and\n * the banner clears itself once nothing is pending.\n */\nexport function MigrationPendingBanner({\n contextId,\n className,\n children,\n onMigrated,\n}: MigrationPendingBannerProps) {\n const { pending, pendingCount, authorize, loading } = useMyAuthoredMigration(contextId);\n\n if (!pending) return null;\n\n const handleClick = async () => {\n const result = await authorize();\n if (result && result.remaining === 0) {\n onMigrated?.();\n }\n };\n\n const message =\n children ??\n `You have ${pendingCount} ${pendingCount === 1 ? 'entry' : 'entries'} to re-sign after a recent upgrade.`;\n\n return (\n <div className={className} data-testid=\"migration-pending-banner\" role=\"status\">\n <span>{message}</span>\n <button type=\"button\" onClick={handleClick} disabled={loading}>\n {loading ? 'Migrating…' : 'Migrate my data'}\n </button>\n </div>\n );\n}\n","import { useMigrationStatus } from '../hooks';\n\nexport interface MigrationAdminPanelProps {\n /** Namespace whose migration rollup to display. */\n namespaceId: string;\n /** Re-fetch interval; migration facts arrive via heartbeat gossip. */\n pollIntervalMs?: number;\n className?: string;\n}\n\n/**\n * Operator view of a namespace's migration rollup (skew #3): the cohort\n * counters, `membersPendingSignature`, and a per-member table. Read-only —\n * pair with the upgrade-trigger hooks to drive a migration.\n */\nexport function MigrationAdminPanel({ namespaceId, pollIntervalMs, className }: MigrationAdminPanelProps) {\n const { status, rollup, members, membersPendingSignature, failed, error } = useMigrationStatus(\n namespaceId,\n { pollIntervalMs },\n );\n\n // Surface a real failure rather than the misleading \"no status\" message.\n if (error && !status) {\n return (\n <div className={className} data-testid=\"migration-admin-panel\">\n Failed to load migration status: {error.message}\n </div>\n );\n }\n\n // Before the first successful fetch (initial paint or in-flight), show\n // loading — a successful read always yields a rollup, so a null status here\n // means \"not loaded yet\", never \"empty\".\n if (!status || !rollup) {\n return <div className={className} data-testid=\"migration-admin-panel\">Loading migration status…</div>;\n }\n\n return (\n <div className={className} data-testid=\"migration-admin-panel\">\n {error && (\n // A poll failed after data was already loaded — keep showing the last\n // good rollup but flag that it may be stale.\n <div data-testid=\"migration-status-error\" role=\"alert\">\n Could not refresh migration status: {error.message}\n </div>\n )}\n <dl>\n <div><dt>Target version</dt><dd>{status.targetVersion}</dd></div>\n <div><dt>Migrated</dt><dd>{rollup.migrated}</dd></div>\n <div><dt>In progress</dt><dd>{rollup.inProgress}</dd></div>\n <div><dt>Unknown</dt><dd>{rollup.unknown}</dd></div>\n <div><dt>Failed</dt><dd data-testid=\"migration-failed-count\">{failed}</dd></div>\n <div><dt>Total</dt><dd>{rollup.total}</dd></div>\n <div><dt>All migrated</dt><dd>{rollup.allMigrated ? 'yes' : 'no'}</dd></div>\n <div>\n <dt>Members pending signature</dt>\n <dd data-testid=\"members-pending-signature\">{membersPendingSignature}</dd>\n </div>\n </dl>\n <table>\n <thead>\n <tr><th>Peer</th><th>State</th><th>Schema</th><th>Pending</th><th>Reason</th></tr>\n </thead>\n <tbody>\n {members.map((m) => (\n <tr key={m.peer} data-testid=\"migration-member-row\">\n <td>{m.peer}</td>\n <td>{m.state}</td>\n <td>{m.report?.schemaVersion ?? '—'}</td>\n <td>{m.report?.authoredRemaining ?? '—'}</td>\n <td>{m.report?.migrationFailed ?? '—'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n"]}