@xyo-network/xl1-react-client-sdk 2.1.0 → 2.1.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/client/components/connected/account/Connected.tsx", "../../../src/client/components/connected/ApprovedLakeSelector.tsx", "../../../src/client/hooks/client/helpers/findCaveat.ts", "../../../src/client/hooks/client/useClientFromWallet.ts", "../../../src/client/hooks/helpers/getXyoClient.ts", "../../../src/client/hooks/client/permissions/usePermissions.ts", "../../../src/client/hooks/client/permissions/usePermissionsAccounts.ts", "../../../src/client/hooks/client/useGatewayFromWallet.ts", "../../../src/client/components/connected/ConnectAccountsStack.tsx", "../../../src/client/components/connected/hooks/useConnectAccount.ts", "../../../src/client/components/connected/DataLakeAddToChainPanel.tsx", "../../../src/client/components/connected/RequestPermissionsButton.tsx", "../../../src/client/components/connected/PermissionsReviewDialog.tsx", "../../../src/client/components/connected/DataLakeGetButton.tsx", "../../../src/client/components/connected/DataLakeGetPanel.tsx", "../../../src/client/components/connected/DataLakeInsertButton.tsx", "../../../src/client/components/connected/DataLakeInsertPanel.tsx", "../../../src/client/components/connected/DataLakeListButton.tsx", "../../../src/client/components/connected/DataLakeOperationsPanel.tsx", "../../../src/client/components/connected/DataLakeRequestAccessPanel.tsx", "../../../src/client/components/connected/DataLakeRequestAccessButton.tsx", "../../../src/client/components/connected/SignTransactionButton.tsx", "../../../src/client/context/GatewayContext.ts", "../../../src/client/context/in-page/InPageGatewaysContext.ts", "../../../src/client/context/in-page/Provider.tsx", "../../../src/client/context/in-page/lib/buildGateway.ts", "../../../src/client/context/in-page/useProvidedInPageGateways.ts", "../../../src/client/context/providers/GatewayProvider.tsx", "../../../src/client/context/providers/WalletGatewayProvider.tsx", "../../../src/client/context/useProvidedGateway.ts"],
4
- "sourcesContent": ["import {\n Stack, Tooltip, Typography,\n} from '@mui/material'\nimport { EthAddressWrapper } from '@xylabs/eth-address'\nimport { BlockiesAvatarAddress } from '@xyo-network/xl1-blockies'\nimport React from 'react'\n\nexport const ConnectedAccount: React.FC<{ address: string }> = ({ address }) => {\n const shortenedAddress = `${EthAddressWrapper.fromString(address)?.toShortString(4)}`\n\n return (\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ alignItems: 'center' }}\n >\n <BlockiesAvatarAddress address={address} size={21} />\n <Tooltip title={address}>\n <Typography\n variant=\"caption\"\n sx={{\n color: 'text.secondary',\n fontFamily: 'monospace',\n }}\n >\n {shortenedAddress}\n </Typography>\n </Tooltip>\n </Stack>\n )\n}\n", "import {\n Alert, FormControl, InputLabel, MenuItem, Select, Stack, Typography,\n} from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { ErrorRender } from '@xylabs/react-error'\nimport { isDefined, isDefinedNotNull } from '@xylabs/sdk-js'\nimport type { ApprovedDataLake } from '@xyo-network/xl1-protocol-lib'\nimport React, {\n useCallback, useEffect, useState,\n} from 'react'\n\nimport { useClientFromWallet } from '../../hooks/index.ts'\n\nexport interface ApprovedLakeSelectorProps {\n /** Filter to lakes with this capability \u2014 `viewer` for read flows, `runner` for write flows. */\n capability: 'viewer' | 'runner'\n /** Label shown above the dropdown. */\n label?: string\n /** Called with the new selection when the user picks a lake. */\n onChange: (id: string) => void\n /** Currently selected per-origin lake id, or empty string for no selection. */\n selectedId: string\n timeout?: number\n}\n\n/**\n * Fetches `client.dataLakes.list()` from the wallet and renders a dropdown of\n * approved lakes filtered by the requested capability. Used by the Get and\n * Insert panels to let the user pick which lake to operate against without\n * needing to paste a per-origin id by hand.\n *\n * The dropdown labels each lake by its opaque per-origin id (the only handle\n * the page ever sees) plus its capability set as a small caption \u2014 names and\n * endpoints are redacted server-side.\n */\nexport const ApprovedLakeSelector: React.FC<ApprovedLakeSelectorProps> = ({\n selectedId, onChange, capability, timeout, label = 'Approved data lake',\n}) => {\n const {\n client, error: clientError, isLoading, timedout,\n } = useClientFromWallet(timeout)\n\n const [lakes, setLakes] = useState<ApprovedDataLake[]>()\n const [fetchError, setFetchError] = useState<Error>()\n const [refreshing, setRefreshing] = useState(false)\n\n const dataLakes = client?.dataLakes\n const supported = isDefinedNotNull(dataLakes)\n\n const refresh = useCallback(async () => {\n if (!isDefinedNotNull(dataLakes)) return\n setFetchError(undefined)\n setRefreshing(true)\n try {\n const result = await dataLakes.list()\n setLakes(result)\n } catch (e) {\n setFetchError(e as Error)\n } finally {\n setRefreshing(false)\n }\n }, [dataLakes])\n\n // Auto-fetch on first mount once the wallet client is available. The\n // setState calls happen inside the async `refresh()` callback, not\n // synchronously in the effect body, so the React 19 hooks rule's concern\n // about cascading renders doesn't apply here.\n useEffect(() => {\n if (supported && lakes === undefined && !refreshing) {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n void refresh()\n }\n }, [supported, lakes, refreshing, refresh])\n\n const filtered = (lakes ?? []).filter(lake => lake.capabilities.includes(capability))\n\n return (\n <Stack sx={{ gap: 1, width: '100%' }}>\n {timedout ? <Alert severity=\"warning\">Wallet not detected.</Alert> : null}\n {isDefinedNotNull(client) && !supported\n ? <Alert severity=\"warning\">This wallet does not expose `xyo.client.dataLakes`.</Alert>\n : null}\n {isDefined(lakes) && filtered.length === 0\n ? (\n <Alert severity=\"info\">\n No approved lakes with\n {' '}\n <strong>{capability}</strong>\n {' '}\n access. Run RequestAccess first.\n </Alert>\n )\n : null}\n <FormControl size=\"small\" fullWidth disabled={!supported || filtered.length === 0}>\n <InputLabel>{label}</InputLabel>\n <Select\n value={selectedId}\n label={label}\n onChange={event => onChange(event.target.value)}\n >\n {filtered.map(lake => (\n <MenuItem key={lake.id} value={lake.id}>\n <Stack sx={{ gap: 0.25, py: 0.5 }}>\n <Typography variant=\"body2\" sx={{ fontFamily: 'monospace', wordBreak: 'break-all' }}>\n {lake.id}\n </Typography>\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n {lake.capabilities.join(' + ')}\n </Typography>\n </Stack>\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n <Stack direction=\"row\" sx={{ gap: 1 }}>\n <ButtonEx\n variant=\"outlined\"\n size=\"small\"\n disabled={!supported || refreshing}\n busy={isLoading || refreshing}\n onClick={() => void refresh()}\n >\n Refresh\n </ButtonEx>\n {isDefined(lakes)\n ? (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary', alignSelf: 'center' }}>\n {lakes.length}\n {' '}\n approved\n {' '}\n \u00B7\n {' '}\n {filtered.length}\n {' '}\n with\n {' '}\n {capability}\n {' '}\n access\n </Typography>\n )\n : null}\n </Stack>\n <ErrorRender error={clientError ?? fetchError} scope=\"ApprovedLakeSelector\" />\n </Stack>\n )\n}\n", "import { isDefined } from '@xylabs/sdk-js'\nimport type {\n CaveatTypes, ParentCapability, XyoPermissions,\n} from '@xyo-network/xl1-sdk'\n\nexport const findCaveat = async (\n permissions: XyoPermissions,\n targetCapability: ParentCapability,\n targetCaveatType: CaveatTypes,\n) => {\n const existingPermissions = await permissions.getPermissions()\n if (isDefined(existingPermissions) && existingPermissions.length > 0) {\n const foundPermissions = existingPermissions\n .find(p => p.parentCapability === targetCapability)\n if (isDefined(foundPermissions)) {\n return foundPermissions.caveats?.find(caveat => caveat.type === targetCaveatType)?.value ?? []\n }\n }\n return existingPermissions\n}\n", "import { isUndefined } from '@xylabs/sdk-js'\nimport type { XyoClient } from '@xyo-network/xl1-sdk'\nimport { useEffect, useState } from 'react'\n\nimport { getXyoClient } from '../helpers/index.ts'\n\ninterface ClientState {\n client?: XyoClient | null\n error: Error | null\n isLoading: boolean\n timedout: boolean\n}\n\nconst initialState: ClientState = {\n client: undefined,\n error: null,\n isLoading: false,\n timedout: false,\n}\n\nexport const useClientFromWallet = (timeout?: number): ClientState => {\n const [state, setState] = useState<ClientState>(initialState)\n\n useEffect(() => {\n let cancelled = false\n\n const initialize = async () => {\n setState((prev) => {\n if (prev.isLoading) return prev\n return {\n ...prev, isLoading: true, error: null,\n }\n })\n\n try {\n const client = await getXyoClient(timeout)\n if (cancelled) return\n if (client === null) {\n setState({\n client: null, timedout: true, isLoading: false, error: null,\n })\n } else {\n setState({\n client, isLoading: false, error: null, timedout: false,\n })\n }\n } catch (error) {\n if (cancelled) return\n setState({\n client: undefined, isLoading: false, error: error as Error, timedout: false,\n })\n }\n }\n\n void initialize()\n\n // Late recovery: if wallet loads after timeout, update state\n const onPluginReady = () => {\n if (cancelled) return\n const client = isUndefined(globalThis.xyo) ? null : globalThis.xyo?.client ?? null\n setState({\n client, isLoading: false, timedout: false, error: null,\n })\n }\n globalThis.addEventListener('xyo:plugin-ready', onPluginReady)\n\n return () => {\n cancelled = true\n globalThis.removeEventListener('xyo:plugin-ready', onPluginReady)\n }\n }, [timeout])\n\n return state\n}\n\n/** @deprecated - use useClientFromWallet instead */\nexport const useClient = useClientFromWallet\n", "import { isUndefined } from '@xylabs/sdk-js'\nimport type { XyoClient } from '@xyo-network/xl1-sdk'\n\nconst CLIENT_LISTENER_TIMEOUT = 2000\n\nconst hasXyoClient = () => {\n return 'client' in globalThis.xyo\n}\n\nexport const listenForClientInjection = (onClientReady: () => void, timeout: number, onTimeout: () => void) => {\n let resolved = false\n const listener: EventListener = () => {\n onClientReady()\n resolved = true\n }\n globalThis.addEventListener('xyo:plugin-ready', listener)\n setTimeout(() => {\n if (!resolved) {\n globalThis.removeEventListener('xyo:plugin-ready', listener)\n onTimeout()\n }\n }, timeout)\n}\n\ntype ReturnType = XyoClient | undefined | null\n\nexport async function getXyoClient(timeout = CLIENT_LISTENER_TIMEOUT): Promise<ReturnType> {\n // if no xyo object, we can bail early\n if (isUndefined(globalThis.xyo)) {\n return null\n }\n return hasXyoClient()\n ? globalThis.xyo.client\n // listen for the XyoWallet to be injected\n : await new Promise<ReturnType>((resolve) => {\n listenForClientInjection(\n () => {\n resolve(globalThis.xyo.client)\n },\n timeout,\n () => {\n resolve(null)\n },\n )\n })\n}\n", "import { useClientFromWallet } from '../useClientFromWallet.ts'\n\nexport const usePermissions = () => {\n const {\n client, isLoading, error, timedout,\n } = useClientFromWallet()\n const permissions = client?.permissions\n return {\n permissions,\n isLoading,\n error,\n timedout,\n }\n}\n", "import { usePromise } from '@xylabs/react-promise'\nimport type { JsonValue } from '@xylabs/sdk-js'\nimport {\n isArray, isDefined, isDefinedNotNull, isString,\n} from '@xylabs/sdk-js'\n\nimport { findCaveat } from '../helpers/index.ts'\nimport { usePermissions } from './usePermissions.ts'\n\nconst validateRestrictedAccounts = (restrictedAccounts: JsonValue): readonly string [] => {\n if (isDefined(restrictedAccounts)) {\n if (isArray(restrictedAccounts) && restrictedAccounts.every(isString)) {\n return restrictedAccounts\n }\n throw new Error(\n `Unrecognized format for restrictReturnedAccounts caveat found on permissions. \\n\n Should be an array of strings: ${JSON.stringify(restrictedAccounts)}`,\n )\n }\n return []\n}\n\nexport const useAccountPermissions = () => {\n const { permissions, error } = usePermissions()\n\n return usePromise(async () => {\n if (isDefinedNotNull(error)) throw error\n if (isDefined(permissions)) {\n const restrictedAccounts = await findCaveat(\n permissions,\n // TODO - extract to constant in protocol package\n 'xyoWallet_getAccounts',\n 'restrictReturnedAccounts',\n )\n return validateRestrictedAccounts(restrictedAccounts)\n }\n }, [permissions])\n}\n", "import { isNull } from '@xylabs/sdk-js'\nimport type { GatewayName } from '@xyo-network/xl1-sdk'\n\nimport type { GatewayFromWallet } from '../../types/index.ts'\nimport { useClientFromWallet } from './useClientFromWallet.ts'\n\n/**\n * Resolves a gateway from the injected XL1 Wallet extension.\n *\n * The returned `gateway` uses a three-state contract:\n * - `undefined` \u2014 wallet detection is still in progress (isLoading=true),\n * or no gatewayName was provided. Consumers should treat this as \"not yet known\"\n * and avoid committing to either a present or absent UI state.\n * - `null` \u2014 wallet is definitively absent. Either globalThis.xyo was never set,\n * or detection timed out. Safe to show fallback UI (e.g. \"Get XL1 Wallet\").\n * A late-recovery listener may still transition this to a real gateway if\n * the extension loads after the timeout.\n * - `XyoGatewayRunner` \u2014 wallet is present and exposes this gateway for the\n * requested network. Ready to use for transactions and queries.\n */\nexport const useGatewayFromWallet = (gatewayName?: GatewayName, timeout?: number): GatewayFromWallet => {\n const {\n client, isLoading, error, timedout,\n } = useClientFromWallet(timeout)\n\n const resolveGateway = () => {\n // null client = wallet confirmed absent (no globalThis.xyo or timed out)\n if (isNull(client)) return null\n // client is undefined (still loading) or defined (wallet present) \u2014\n // optional chain returns undefined while loading, or the gateway if available\n return client?.gateways?.[gatewayName!]\n }\n\n return {\n // no gatewayName requested = undefined (opt-out, not \"absent\")\n gateway: gatewayName ? resolveGateway() : undefined,\n isLoading,\n error,\n timedout,\n }\n}\n\n/** @deprecated - useGatewayFromWallet */\nexport const useGateway = useGatewayFromWallet\n", "import type { StackProps } from '@mui/material'\nimport {\n Alert, AlertTitle, Button, Stack,\n Typography,\n} from '@mui/material'\nimport type { ButtonExProps } from '@xylabs/react-button'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { ErrorRender } from '@xylabs/react-error'\nimport { isDefined, isUndefined } from '@xylabs/sdk-js'\nimport type { XyoAddress } from '@xyo-network/address'\nimport type { ComponentType, MouseEventHandler } from 'react'\nimport React, { useEffect } from 'react'\n\nimport { ConnectedAccount } from './account/index.ts'\nimport { useConnectAccount } from './hooks/index.ts'\n\nconst DefaultConnectComponent: React.FC<ButtonExProps> = props => (\n <ButtonEx variant=\"contained\" size=\"small\" {...props} />\n)\n\nconst DefaultNoWalletInstalledComponent: React.FC = () => (\n <Alert severity=\"warning\">\n <AlertTitle>XL1 Wallet Not Found</AlertTitle>\n <Typography gutterBottom>\n Please ensure that your XL1 Wallet is installed to connect your account.\n </Typography>\n <Button\n sx={{ display: 'flex', justifySelf: 'end' }}\n size=\"small\"\n variant=\"outlined\"\n href=\"https://chromewebstore.google.com/detail/xl1-wallet/fblbagcjeigmhakkfgjpdlcapcgmcfbm\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Get XL1 Wallet\n </Button>\n </Alert>\n)\n\nexport interface ConnectClientAccountsStackProps extends StackProps {\n AccountComponent?: ComponentType<{ account?: string }>\n ConnectComponent?: ComponentType<{ onClick?: MouseEventHandler<HTMLElement> }>\n NoWalletInstalledComponent?: ComponentType\n onAccountConnected?: (account: XyoAddress) => void\n onCancel?: () => void\n timeout?: number\n}\n\n/**\n * Renders a horizontal stack that surfaces the current state of the user's\n * connection to an XL1 wallet (e.g. the XL1 Chrome extension) and lets them\n * kick off a connection.\n *\n * Connection state is derived from `useConnectAccount`, which wraps\n * `useGatewayFromWallet` (wallet/gateway discovery with a configurable\n * `timeout`) and `useAccountPermissions` (already-authorized addresses).\n * The hook returns: `address` (resolved once the wallet exposes one),\n * `connectSigner` (prompts the wallet for an address), `timedout` (the\n * gateway never appeared within `timeout`), and `error` (the first of\n * gateway, permissions, or signer-connect failures).\n *\n * The component renders exactly one of the following wallet states, plus\n * an always-present error slot:\n *\n * - **Connected** \u2014 `address` is defined: renders `AccountComponent` for\n * that address. Also fires `onAccountConnected(address)` once via effect.\n * - **Disconnected, wallet available** \u2014 no `address` and not `timedout`:\n * renders `ConnectComponent` as a \"Connect\" button that invokes\n * `connectSigner()`. This covers both \"wallet installed but no account\n * authorized yet\" and \"gateway still resolving\".\n * - **Wallet missing / unreachable** \u2014 no `address` and `timedout` is true:\n * renders `NoWalletInstalledComponent` (defaults to an Alert linking to\n * the XL1 Wallet Chrome Web Store listing).\n * - **Error** \u2014 any error from the hook is rendered via `ErrorRender`\n * alongside the state above, and `onCancel()` is fired once via effect\n * so the host UI can close/abort its connect flow.\n *\n * All three slot components (`AccountComponent`, `ConnectComponent`,\n * `NoWalletInstalledComponent`) are injectable so consumers can restyle\n * any state without forking this component.\n */\nexport const ConnectAccountsStack: React.FC<ConnectClientAccountsStackProps> = ({\n AccountComponent = ConnectedAccount,\n ConnectComponent = DefaultConnectComponent,\n NoWalletInstalledComponent = DefaultNoWalletInstalledComponent,\n onAccountConnected,\n onCancel,\n timeout,\n ...props\n}) => {\n const {\n address, connectSigner, error, timedout,\n } = useConnectAccount(undefined, timeout)\n\n useEffect(() => {\n if (isDefined(error) && isDefined(onCancel)) {\n onCancel()\n }\n }, [error, onCancel])\n\n useEffect(() => {\n if (isDefined(address) && isDefined(onAccountConnected)) {\n onAccountConnected(address)\n }\n }, [address, onAccountConnected])\n\n return (\n <Stack\n direction=\"row\"\n spacing={2}\n {...props}\n sx={{ alignItems: 'start', ...props.sx }}\n >\n {isDefined(address)\n ? <AccountComponent address={address} />\n : null}\n {isUndefined(address) && !timedout\n ? (\n <ConnectComponent onClick={() => void connectSigner()}>Connect</ConnectComponent>\n )\n : null}\n {isUndefined(address) && timedout\n ? (\n <NoWalletInstalledComponent />\n )\n : null}\n <ErrorRender error={error} scope=\"ConnectSigner:error\" />\n </Stack>\n )\n}\n", "import { asAddress, assertEx } from '@xylabs/sdk-js'\nimport type { XyoAddress } from '@xyo-network/address'\nimport type { GatewayName } from '@xyo-network/xl1-sdk'\nimport { MainNetwork } from '@xyo-network/xl1-sdk'\nimport { useCallback, useState } from 'react'\n\nimport { useAccountPermissions, useGatewayFromWallet } from '../../../hooks/index.ts'\n\nexport const useConnectAccount = (gatewayName: GatewayName = MainNetwork.id, timeout?: number) => {\n const [connectError, setConnectError] = useState<Error>()\n\n const {\n gateway, error, timedout,\n } = useGatewayFromWallet(gatewayName, timeout)\n\n const [accountPermissions, accountPermissionsError] = useAccountPermissions()\n\n const [address, setAddress] = useState<XyoAddress>()\n\n const connectSigner = useCallback(async () => {\n try {\n setConnectError(undefined)\n const assertedGateway = assertEx(gateway, () => `Gateway ${gatewayName} is not available`)\n const signer = assertedGateway.signer\n const address = await signer.address()\n setAddress(address)\n return address\n } catch (e) {\n setConnectError(e as Error)\n }\n }, [gateway, gatewayName])\n\n return {\n address: asAddress(accountPermissions?.[0] ?? address), connectSigner, error: error ?? accountPermissionsError ?? connectError, gateway, timedout,\n }\n}\n", "import { OpenInNew } from '@mui/icons-material'\nimport type { StackProps } from '@mui/material'\nimport {\n Alert, Chip, Divider, Link, Stack, TextField, Typography,\n} from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { ErrorRender } from '@xylabs/react-error'\nimport { usePromise } from '@xylabs/react-promise'\nimport type { Hash } from '@xylabs/sdk-js'\nimport { isDefined, isDefinedNotNull } from '@xylabs/sdk-js'\nimport type { Payload, Schema } from '@xyo-network/sdk-js'\nimport {\n asSchema, isAnyPayload, PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport type {\n DataLakeData, GatewayName, HashPayload,\n NetworkId, PermissionRequest, SignedHydratedTransactionWithHashMeta,\n} from '@xyo-network/xl1-sdk'\nimport {\n DataLakesGetMethod, DataLakesInsertMethod,\n ExplorerLinks, HashSchema, SequenceNetwork,\n} from '@xyo-network/xl1-sdk'\nimport React, { useMemo, useState } from 'react'\n\nimport { useClientFromWallet, useGatewayFromWallet } from '../../hooks/index.ts'\nimport { ApprovedLakeSelector } from './ApprovedLakeSelector.tsx'\nimport { RequestPermissionsButton } from './RequestPermissionsButton.tsx'\n\n/** Default base URL for the production XL1 explorer. */\nconst DEFAULT_EXPLORER_URL = 'https://explore.xyo.network'\n\n/** Default test payload schema. */\nconst DEFAULT_PAYLOAD_SCHEMA: Schema = asSchema('network.xyo.observation.v2', true)\n\n/**\n * Permissions the panel asks for in a single consent popup:\n *\n * - `xyoWallet_getAccounts` + `xyoSigner_address` \u2014 signer-side grants\n * needed by `gateway.addPayloadsToChain`, which reads the signer's\n * address to populate the transaction's `from` field. Empty\n * `restrictReturnedAccounts` lets the user pick which accounts to\n * share at consent time. (Per-transaction `xyoSigner_signTransaction`\n * and `xyoRunner_broadcastTransaction` aren't EIP-2255-permissioned\n * in the wallet's registry \u2014 the wallet shows its own confirm UI on\n * each call.)\n * - `xyoDataLakes_get` + `xyoDataLakes_insert` \u2014 data-lake grants. Read\n * is requested alongside write even though this flow only inserts,\n * so a later \"verify via Get\" follow-up doesn't need a second\n * consent round.\n */\nconst PANEL_PERMISSIONS: PermissionRequest[] = [\n { xyoWallet_getAccounts: { restrictReturnedAccounts: [] } },\n { xyoSigner_address: {} },\n { [DataLakesGetMethod]: { dataLakeAccess: {} } },\n { [DataLakesInsertMethod]: { dataLakeAccess: {} } },\n]\n\n/**\n * Build a fresh default payload each mount. The ISO timestamp gives every\n * mount its own content-address, so a tester clicking Insert twice from a\n * fresh panel mount sees two distinct hashes \u2014 easier to verify in a\n * round-trip with the Get panel or the chain explorer.\n */\nasync function buildDefaultPayload(schema: Schema): Promise<string> {\n const builder = new PayloadBuilder({ schema }).fields({ value: 1 })\n const payload = builder.build()\n return JSON.stringify(payload, null, 2)\n}\n\ninterface ParseSuccess {\n ok: true\n payload: DataLakeData\n}\n\ninterface ParseFailure {\n error: string\n ok: false\n}\n\ntype ParseResult = ParseSuccess | ParseFailure\n\n/**\n * Parse the textarea content into a single `DataLakeData`. Unlike the\n * insert panel (which accepts a JSON array), this flow only writes one\n * payload at a time because the on-chain `HashPayload` we follow it with\n * references exactly one hash.\n */\nfunction parsePayload(raw: string): ParseResult {\n const trimmed = raw.trim()\n if (trimmed.length === 0) return { ok: false, error: 'Payload is empty.' }\n try {\n const parsed = JSON.parse(trimmed) as unknown\n if (Array.isArray(parsed)) {\n if (parsed.length === 1) return { ok: true, payload: parsed[0] as DataLakeData }\n return { ok: false, error: 'Provide a single payload object (this flow chains one payload onto the chain at a time).' }\n }\n if (parsed !== null && typeof parsed === 'object') return { ok: true, payload: parsed as DataLakeData }\n return { ok: false, error: 'Payload must be a JSON object.' }\n } catch (e) {\n return { ok: false, error: `Invalid JSON: ${(e as Error).message}` }\n }\n}\n\ninterface TestPayloadSectionProps {\n onChange: (value: string) => void\n parse: ParseResult\n value: string\n}\n\n/**\n * Step 2: JSON textarea + parse-status caption / error alert. Extracted\n * so the parent panel doesn't need to carry the textarea + parse branches\n * inline (keeps the main component's cyclomatic complexity manageable).\n */\nconst TestPayloadSection: React.FC<TestPayloadSectionProps> = ({\n onChange, parse, value,\n}) => (\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">2. Test payload</Typography>\n <TextField\n label=\"Payload (single JSON object)\"\n value={value}\n onChange={e => onChange(e.target.value)}\n multiline\n minRows={6}\n maxRows={16}\n size=\"small\"\n slotProps={{ input: { sx: { fontFamily: 'monospace', fontSize: 12 } } }}\n />\n {parse.ok\n ? (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n Parsed payload \u2014 schema:\n {' '}\n <code>{(parse.payload as { schema?: string }).schema ?? '(none)'}</code>\n </Typography>\n )\n : (\n <Alert severity=\"error\" variant=\"outlined\">\n <Typography variant=\"body2\">{parse.error}</Typography>\n </Alert>\n )}\n </Stack>\n)\n\ninterface InsertSectionProps {\n canInsert: boolean\n insertError: Error | undefined\n inserting: boolean\n onInsert: () => void\n onLakeChange: (id: string) => void\n selectedLakeId: string\n storedHash: Hash | undefined\n timeout?: number\n}\n\n/**\n * Step 3: lake picker + insert button + the result chip. Owning the\n * post-insert chip block here keeps the parent component below the\n * project's max-complexity threshold.\n */\nconst InsertSection: React.FC<InsertSectionProps> = ({\n canInsert, inserting, insertError, onInsert, onLakeChange,\n selectedLakeId, storedHash, timeout,\n}) => (\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">3. Insert into runner lake</Typography>\n <ApprovedLakeSelector\n capability=\"runner\"\n selectedId={selectedLakeId}\n onChange={onLakeChange}\n timeout={timeout}\n />\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!canInsert}\n busy={inserting}\n onClick={onInsert}\n >\n Insert into lake\n </ButtonEx>\n {isDefined(storedHash)\n ? (\n <Stack\n direction=\"row\"\n sx={{\n alignItems: 'center', flexWrap: 'wrap', gap: 1,\n }}\n >\n <Chip label=\"Stored\" size=\"small\" color=\"success\" />\n <Typography variant=\"body2\" sx={{ fontFamily: 'monospace', wordBreak: 'break-all' }}>\n {storedHash}\n </Typography>\n </Stack>\n )\n : null}\n <ErrorRender error={insertError} scope=\"DataLakeAddToChainPanel.insert\" />\n </Stack>\n)\n\ninterface AddToChainSectionProps {\n addingToChain: boolean\n canAddToChain: boolean\n chainError: Error | undefined\n explorerTxUrl: string | undefined\n gatewayName: GatewayName\n onAddToChain: () => void\n signedTx: SignedHydratedTransactionWithHashMeta | undefined\n txHash: Hash | undefined\n}\n\n/**\n * Step 4: add-to-chain button + the tx-submitted card with the explorer\n * link. Same complexity-reduction motivation as the other section\n * components; also makes the success-state rendering a single tightly\n * scoped chunk to read.\n */\nconst AddToChainSection: React.FC<AddToChainSectionProps> = ({\n addingToChain, canAddToChain, chainError, explorerTxUrl, gatewayName,\n onAddToChain, signedTx, txHash,\n}) => (\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">4. Add HashPayload to chain</Typography>\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n References the lake-stored payload via\n {' '}\n <code>network.xyo.hash</code>\n ; the payload itself rides along as the `offChain` argument.\n </Typography>\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!canAddToChain}\n busy={addingToChain}\n onClick={onAddToChain}\n >\n Add to chain\n </ButtonEx>\n {isDefined(txHash) && isDefined(explorerTxUrl)\n ? (\n <Stack sx={{ gap: 0.5 }}>\n <Stack\n direction=\"row\"\n sx={{\n alignItems: 'center', flexWrap: 'wrap', gap: 1,\n }}\n >\n <Chip label=\"Submitted\" size=\"small\" color=\"success\" />\n <Typography variant=\"body2\" sx={{ fontFamily: 'monospace', wordBreak: 'break-all' }}>\n {txHash}\n </Typography>\n </Stack>\n <Link\n href={explorerTxUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n sx={{\n alignItems: 'center', display: 'inline-flex', gap: 0.5,\n }}\n >\n View on explorer\n <OpenInNew sx={{ fontSize: 14 }} />\n </Link>\n {isDefined(signedTx)\n ? (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n Signed transaction recorded \u2014 open the explorer link above to verify\n inclusion on\n {' '}\n <code>{gatewayName}</code>\n .\n </Typography>\n )\n : null}\n </Stack>\n )\n : null}\n <ErrorRender error={chainError} scope=\"DataLakeAddToChainPanel.addToChain\" />\n </Stack>\n)\n\nexport interface DataLakeAddToChainPanelProps extends StackProps {\n /**\n * Base URL of the XL1 explorer. Defaults to the production deploy at\n * {@link DEFAULT_EXPLORER_URL}. The panel builds the per-transaction\n * link via `ExplorerLinks(explorerUrl, gatewayName).transaction(txHash)`.\n */\n explorerUrl?: string\n /** Gateway to use for chain writes. Defaults to `SequenceNetwork.id`. */\n gatewayName?: GatewayName\n /** Initial textarea content. Defaults to a stamped JSON envelope keyed by `payloadSchema`. */\n initialPayloadJson?: string\n /** Schema for the test payload. Defaults to `network.xyo.observation.v2`. */\n payloadSchema?: Schema\n /** Wallet-detection timeout, forwarded to the wallet hooks. */\n timeout?: number\n}\n\n/**\n * End-to-end \"data lake \u2192 chain\" flow for manual Storybook testing. The\n * panel walks the user through:\n *\n * 1. **Request permissions** \u2014 embedded {@link RequestPermissionsButton}\n * covering signer + accounts (so `gateway.addPayloadsToChain` can\n * pull the signer address) plus data-lake read + write (so the\n * insert step can run), all collected in one consent popup.\n * 2. **Edit the test payload** \u2014 a JSON textarea seeded with a stamped\n * `{ schema, value, timestamp }` envelope; the timestamp guarantees\n * a fresh content-address on each mount.\n * 3. **Pick a runner-capable lake** \u2014 reuses {@link ApprovedLakeSelector}\n * with `capability=\"runner\"` so the dropdown is narrowed to lakes the\n * user has granted write access to.\n * 4. **Insert into the lake** \u2014 calls `client.dataLakes.insert(lakeId, [payload])`,\n * stashes the echoed-back stored payload (with `_hash`) in state.\n * 5. **Add to chain** \u2014 builds a `HashPayload` referencing the stored\n * payload's hash and calls\n * `gateway.addPayloadsToChain([hashPayload], [storedPayload])`.\n * `onChain` is the hash reference; `offChain` is the stored payload\n * itself (the gateway re-inserts it into its own data lake under the\n * hood, so the content ends up in two places \u2014 see the story docs).\n * 6. **Link to the explorer** \u2014 once `addPayloadsToChain` resolves with\n * a `txHash`, surfaces `ExplorerLinks(explorerUrl, gatewayName).transaction(txHash)`\n * as a \"View on explorer\" link. No client-side confirmation polling \u2014\n * the explorer is the source of truth for inclusion state.\n *\n * Errors at any step short-circuit the rest of the flow and render\n * inline. The user can retry by clicking the same step's button again,\n * or by editing the upstream step (e.g. re-edit the payload, re-insert).\n */\nexport const DataLakeAddToChainPanel: React.FC<DataLakeAddToChainPanelProps> = ({\n explorerUrl = DEFAULT_EXPLORER_URL,\n gatewayName = SequenceNetwork.id,\n initialPayloadJson,\n payloadSchema = DEFAULT_PAYLOAD_SCHEMA,\n timeout,\n ...props\n}) => {\n const { client, error: clientError } = useClientFromWallet(timeout)\n const {\n gateway, error: gatewayError, timedout,\n } = useGatewayFromWallet(gatewayName, timeout)\n\n // `useState(fn)` defers the initializer to first render so the default\n // payload gets a fresh timestamp on every mount. Callers can override\n // via `initialPayloadJson`.\n const [payloadText, setPayloadText] = useState<string>(initialPayloadJson ?? '')\n usePromise(async () => setPayloadText(await buildDefaultPayload(payloadSchema)), [payloadSchema])\n\n const parse = useMemo(() => parsePayload(payloadText), [payloadText])\n\n const [selectedLakeId, setSelectedLakeId] = useState<string>('')\n\n // We narrow the lake's echoed-back `DataLakeData` to `Payload` at the\n // insert call site below \u2014 `DataLakeData = Payload | ArrayBuffer`, and\n // `gateway.addPayloadsToChain`'s `offChain` param wants a `Payload[]`.\n const [storedPayload, setStoredPayload] = useState<Payload>()\n const [inserting, setInserting] = useState(false)\n const [insertError, setInsertError] = useState<Error>()\n\n const [txHash, setTxHash] = useState<Hash>()\n const [signedTx, setSignedTx] = useState<SignedHydratedTransactionWithHashMeta>()\n const [addingToChain, setAddingToChain] = useState(false)\n const [chainError, setChainError] = useState<Error>()\n\n const dataLakes = client?.dataLakes\n const [storedHash] = usePromise(async () => isDefined(storedPayload) ? await PayloadBuilder.dataHash(storedPayload) : undefined, [storedPayload])\n const canInsert = parse.ok && selectedLakeId.length > 0 && isDefinedNotNull(dataLakes) && !inserting\n const canAddToChain = isDefined(storedHash) && isDefined(storedPayload) && isDefinedNotNull(gateway) && !addingToChain\n\n const explorerTxUrl = useMemo<string | undefined>(() => {\n if (!isDefined(txHash)) return\n // `GatewayName` is broader than `NetworkId` (the union of known\n // network ids the explorer recognizes). The story-side default is\n // always one of the canonical networks, so the cast is safe for\n // documented usage. A custom network id will still produce a\n // syntactically valid URL \u2014 the explorer just won't render it.\n return new ExplorerLinks(explorerUrl, gatewayName as NetworkId).transaction(txHash)\n }, [txHash, explorerUrl, gatewayName])\n\n const handleInsert = async () => {\n if (!canInsert || !parse.ok || !isDefinedNotNull(dataLakes)) return\n setInsertError(undefined)\n // A fresh insert invalidates anything downstream \u2014 clear so the\n // \"Add to chain\" button doesn't keep showing a stale stored payload\n // / tx hash from the previous attempt.\n setStoredPayload(undefined)\n setTxHash(undefined)\n setSignedTx(undefined)\n setChainError(undefined)\n setInserting(true)\n try {\n const [stored] = await dataLakes.insert(selectedLakeId, [parse.payload])\n // The wallet returns `DataLakeData[]`; the lake only stores entries\n // it accepts under policy, so an empty result means \"lake rejected\n // this payload\" \u2014 surface as a normal error rather than a silent\n // success.\n if (!isDefined(stored)) {\n setInsertError(new Error('Lake returned no entries for this insert \u2014 the lake may disallow the payload\\'s schema.'))\n return\n }\n // `DataLakeData` is `Payload | ArrayBuffer`. This flow only writes\n // payloads, and `gateway.addPayloadsToChain`'s `offChain` param\n // wants a `Payload[]`, so narrow here. The non-payload branch is\n // only reachable if the lake echoes back a raw binary blob, which\n // would be a wallet-side bug rather than a user-flow case to\n // recover from.\n if (!isAnyPayload(stored)) {\n setInsertError(new Error('Lake returned a non-payload value (binary blob); this flow only handles payload-shaped content.'))\n return\n }\n setStoredPayload(parse.payload as Payload)\n } catch (e) {\n setInsertError(e as Error)\n } finally {\n setInserting(false)\n }\n }\n\n const handleAddToChain = async () => {\n if (!canAddToChain || !isDefinedNotNull(gateway) || !isDefined(storedPayload) || !isDefined(storedHash)) return\n setChainError(undefined)\n setTxHash(undefined)\n setSignedTx(undefined)\n setAddingToChain(true)\n try {\n const hashPayload: HashPayload = { schema: HashSchema, hash: storedHash }\n const [hash, signed] = await gateway.addPayloadsToChain([hashPayload], [storedPayload])\n setTxHash(hash)\n setSignedTx(signed)\n } catch (e) {\n setChainError(e as Error)\n } finally {\n setAddingToChain(false)\n }\n }\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 3,\n alignItems: 'stretch',\n ...props.sx,\n }}\n >\n {timedout\n ? <Alert severity=\"warning\">Wallet not detected.</Alert>\n : null}\n\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">1. Grant signer + data-lake access</Typography>\n <RequestPermissionsButton permissions={PANEL_PERMISSIONS} timeout={timeout} />\n </Stack>\n\n <Divider />\n\n <TestPayloadSection value={payloadText} onChange={setPayloadText} parse={parse} />\n\n <Divider />\n\n <InsertSection\n canInsert={canInsert}\n inserting={inserting}\n insertError={insertError}\n onInsert={() => void handleInsert()}\n onLakeChange={setSelectedLakeId}\n selectedLakeId={selectedLakeId}\n storedHash={storedHash}\n timeout={timeout}\n />\n\n <Divider />\n\n <AddToChainSection\n addingToChain={addingToChain}\n canAddToChain={canAddToChain}\n chainError={chainError}\n explorerTxUrl={explorerTxUrl}\n gatewayName={gatewayName}\n onAddToChain={() => void handleAddToChain()}\n signedTx={signedTx}\n txHash={txHash}\n />\n\n <ErrorRender error={clientError ?? gatewayError ?? undefined} scope=\"DataLakeAddToChainPanel.wallet\" />\n </Stack>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport { Alert, Stack } from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { PopoverErrorRender } from '@xylabs/react-error'\nimport { isDefined, isDefinedNotNull } from '@xylabs/sdk-js'\nimport type { InvokerPermission, PermissionRequest } from '@xyo-network/xl1-protocol-lib'\nimport React, {\n useCallback, useEffect, useState,\n} from 'react'\n\nimport { useClientFromWallet } from '../../hooks/index.ts'\nimport { PermissionsReviewDialog } from './PermissionsReviewDialog.tsx'\n\nexport interface RequestPermissionsButtonProps extends StackProps {\n permissions: PermissionRequest[]\n timeout?: number\n}\n\n/**\n * Two-mode entry point for `client.permissions`:\n *\n * - If the origin has no permissions on file (fresh load, or just revoked),\n * the button reads \"Request permissions\" and calls\n * `client.permissions.requestPermissions(permissions)` on click, opening\n * the wallet's consent popup.\n * - If permissions already exist for this origin, the button flips to\n * \"Review permissions\" and opens a read-only dialog enumerating each\n * grant. The dialog also surfaces a \"Re-request permissions\" action\n * that re-runs the same `permissions` batch verbatim \u2014 letting the\n * wallet's request handler decide what merges with the existing grants\n * (data-lake caveats append, account caveats union, etc.) instead of\n * trying to compute a client-side diff that would drift out of sync.\n *\n * Successful requests don't render any inline ack list \u2014 the review dialog\n * (reached via the button's \"Review permissions\" mode) is the single\n * source of truth for what the origin has been granted.\n *\n * The initial existing-permissions fetch happens on mount via\n * `client.permissions.getPermissions()`, then refreshes after every successful\n * `requestPermissions` round-trip so the dialog reflects the new state.\n */\nexport const RequestPermissionsButton: React.FC<RequestPermissionsButtonProps> = ({\n permissions, timeout, ...props\n}) => {\n const {\n client, error: clientError, isLoading, timedout,\n } = useClientFromWallet(timeout)\n\n const [granted, setGranted] = useState<InvokerPermission[]>()\n const [fetchError, setFetchError] = useState<Error>()\n const [requestError, setRequestError] = useState<Error>()\n const [requesting, setRequesting] = useState(false)\n const [dialogOpen, setDialogOpen] = useState(false)\n\n const permissionsApi = client?.permissions\n\n const refreshGranted = useCallback(async () => {\n if (!isDefinedNotNull(permissionsApi)) return\n setFetchError(undefined)\n try {\n const result = await permissionsApi.getPermissions()\n setGranted(result ?? [])\n } catch (e) {\n // Still mark granted as known (empty) so the button enables in request\n // mode. Otherwise a `getPermissions` failure permanently locks the\n // button and the user can't recover by retrying the request.\n setGranted([])\n setFetchError(e as Error)\n }\n }, [permissionsApi])\n\n // Fetch existing permissions as soon as the wallet client is available.\n // Mirrors the lazy-load pattern in `ApprovedLakeSelector` \u2014 only fires once\n // the client resolves, only once per mount.\n useEffect(() => {\n if (isDefinedNotNull(permissionsApi) && granted === undefined) {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n void refreshGranted()\n }\n }, [permissionsApi, granted, refreshGranted])\n\n const requestPermissions = useCallback(async () => {\n if (!isDefinedNotNull(permissionsApi)) return\n setRequestError(undefined)\n setRequesting(true)\n try {\n await permissionsApi.requestPermissions(permissions)\n // Refresh so the review dialog reflects the new grants. The acks\n // returned by `requestPermissions` are intentionally discarded \u2014 the\n // dialog renders the full `getPermissions()` result instead, which is\n // a strict superset (existing grants + new acks merged by the wallet).\n void refreshGranted()\n } catch (e) {\n setRequestError(e as Error)\n } finally {\n setRequesting(false)\n }\n }, [permissionsApi, permissions, refreshGranted])\n\n const hasGranted = isDefined(granted) && granted.length > 0\n\n const handleClick = () => {\n if (hasGranted) {\n setDialogOpen(true)\n return\n }\n void requestPermissions()\n }\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 2,\n alignItems: 'start',\n ...props.sx,\n }}\n >\n {timedout\n ? <Alert severity=\"warning\">Wallet not detected.</Alert>\n : null}\n <Stack direction=\"row\" sx={{ gap: 1, alignItems: 'center' }}>\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!isDefinedNotNull(permissionsApi) || requesting}\n busy={isLoading || requesting}\n onClick={handleClick}\n >\n {hasGranted\n ? 'Review permissions'\n : (\n <>\n Request\n {' '}\n {permissions.length}\n {' '}\n permission\n {permissions.length === 1 ? '' : 's'}\n </>\n )}\n </ButtonEx>\n <PopoverErrorRender error={clientError ?? fetchError ?? requestError} scope=\"RequestPermissionsButton\" />\n </Stack>\n <PermissionsReviewDialog\n open={dialogOpen}\n onClose={() => setDialogOpen(false)}\n granted={granted ?? []}\n onReRequest={() => void requestPermissions()}\n requesting={requesting}\n error={requestError}\n />\n </Stack>\n )\n}\n", "import {\n Alert, Box, Chip, Dialog, DialogActions, DialogContent, DialogTitle,\n Divider, Stack, Typography,\n} from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { ErrorRender } from '@xylabs/react-error'\nimport { isDefined } from '@xylabs/sdk-js'\nimport type { Caveats, InvokerPermission } from '@xyo-network/xl1-protocol-lib'\nimport React from 'react'\n\nexport interface PermissionsReviewDialogProps {\n /** The error (if any) from the most recent re-request attempt. */\n error?: Error\n /** Permissions already granted to this origin (from `client.permissions.getPermissions()`). */\n granted: InvokerPermission[]\n /** Close the dialog without taking any action. */\n onClose: () => void\n /**\n * Re-run `client.permissions.requestPermissions(...)` against the same\n * batch the parent `RequestPermissionsButton` was configured with. The\n * dialog doesn't try to compute what's \"new\" vs \"already granted\" \u2014\n * the wallet's request handler is the source of truth for that, and any\n * inferred diff here would drift out of sync with caveat-merge rules\n * upstream (e.g. data-lake's append-on-merge). Sending the original\n * batch and letting the wallet decide keeps the behavior consistent.\n */\n onReRequest: () => void\n open: boolean\n /** True while the re-request call is in flight. */\n requesting: boolean\n}\n\nconst renderCaveatValue = (caveat: Caveats): React.ReactNode => {\n // restrictReturnedAccounts is the only caveat whose value is a flat string[];\n // render addresses as chips. Empty list means \"all accounts the user picks\".\n if (caveat.type === 'restrictReturnedAccounts' && Array.isArray(caveat.value)) {\n if (caveat.value.length === 0) {\n return (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n (no address restriction \u2014 every selected account is returned)\n </Typography>\n )\n }\n return (\n <Stack direction=\"row\" sx={{ flexWrap: 'wrap', gap: 0.5 }}>\n {caveat.value.map(address => (\n <Chip\n key={String(address)}\n label={String(address)}\n size=\"small\"\n sx={{ fontFamily: 'monospace' }}\n />\n ))}\n </Stack>\n )\n }\n\n // dataLakeAccess stores `{ lakeId, perOriginId, narrowedSchemas? }` per\n // granted lake. Show the page-visible perOriginId prominently \u2014 that's the\n // handle the dApp uses when calling `get` / `insert` \u2014 and the narrowed\n // schemas (if any) as chips. Hide lakeId: it's an internal wallet handle the\n // page never sees in normal RPC traffic.\n if (caveat.type === 'dataLakeAccess' && typeof caveat.value === 'object' && caveat.value !== null) {\n const value = caveat.value as { lakeId?: string; narrowedSchemas?: string[]; perOriginId?: string }\n return (\n <Stack sx={{ gap: 0.5 }}>\n {isDefined(value.perOriginId)\n ? (\n <Stack direction=\"row\" sx={{ alignItems: 'center', gap: 1 }}>\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>id:</Typography>\n <Typography variant=\"body2\" sx={{ fontFamily: 'monospace', wordBreak: 'break-all' }}>\n {value.perOriginId}\n </Typography>\n </Stack>\n )\n : null}\n {isDefined(value.narrowedSchemas) && value.narrowedSchemas.length > 0\n ? (\n <Stack\n direction=\"row\"\n sx={{\n alignItems: 'center', flexWrap: 'wrap', gap: 0.5,\n }}\n >\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>schemas:</Typography>\n {value.narrowedSchemas.map(schema => (\n <Chip\n key={schema}\n label={schema}\n size=\"small\"\n variant=\"outlined\"\n />\n ))}\n </Stack>\n )\n : null}\n </Stack>\n )\n }\n\n // Unknown / opaque caveat shape \u2014 fall through to a compact JSON dump so the\n // user at least sees what was stored.\n return (\n <Typography\n component=\"pre\"\n variant=\"body2\"\n sx={{\n fontFamily: 'monospace', m: 0, whiteSpace: 'pre-wrap', wordBreak: 'break-all',\n }}\n >\n {JSON.stringify(caveat.value, null, 2)}\n </Typography>\n )\n}\n\nconst renderPermission = (permission: InvokerPermission): React.ReactNode => {\n const caveats = permission.caveats ?? []\n return (\n <Stack sx={{ gap: 1 }}>\n <Stack\n direction=\"row\"\n sx={{\n alignItems: 'center', flexWrap: 'wrap', gap: 1,\n }}\n >\n <Typography variant=\"subtitle2\" sx={{ fontFamily: 'monospace' }}>\n {permission.parentCapability}\n </Typography>\n {isDefined(permission.date)\n ? (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n granted\n {' '}\n {new Date(permission.date).toLocaleString()}\n </Typography>\n )\n : null}\n </Stack>\n {caveats.length === 0\n ? (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n (no caveats)\n </Typography>\n )\n : (\n <Stack sx={{ gap: 1, pl: 1 }}>\n {caveats.map(caveat => (\n <Stack key={caveat.type} sx={{ gap: 0.5 }}>\n <Chip label={caveat.type} size=\"small\" sx={{ alignSelf: 'flex-start' }} />\n <Box sx={{ pl: 1 }}>\n {renderCaveatValue(caveat)}\n </Box>\n </Stack>\n ))}\n </Stack>\n )}\n </Stack>\n )\n}\n\n/**\n * Read-only review of an origin's currently granted permissions, with a\n * single \"Re-request permissions\" action that re-runs the parent's original\n * `requestPermissions(...)` batch verbatim.\n *\n * Deliberately does **not** compute an \"additional\" diff. The wallet's\n * request handler owns the merge rules (e.g. data-lake caveats append while\n * `restrictReturnedAccounts` unions), and any client-side diff would drift\n * out of sync the moment those rules change. Sending the original batch is\n * also what the user expects: \"I want to ask for the same thing again.\"\n *\n * The dialog is intentionally permissive about caveat shape: it special-cases\n * the two caveats with structured payloads (`restrictReturnedAccounts`,\n * `dataLakeAccess`) and falls through to a pretty-printed JSON dump for\n * anything else, so newly-added caveat types render without code changes.\n */\nexport const PermissionsReviewDialog: React.FC<PermissionsReviewDialogProps> = ({\n granted, onClose, onReRequest, open, requesting, error,\n}) => {\n return (\n <Dialog open={open} onClose={onClose} fullWidth maxWidth=\"sm\">\n <DialogTitle>Granted permissions</DialogTitle>\n <DialogContent dividers>\n <Stack sx={{ gap: 2 }}>\n {granted.length === 0\n ? <Alert severity=\"info\">No permissions are currently granted to this origin.</Alert>\n : granted.map((permission, index) => (\n <React.Fragment key={permission.parentCapability}>\n {index > 0 ? <Divider /> : null}\n {renderPermission(permission)}\n </React.Fragment>\n ))}\n <ErrorRender error={error} scope=\"PermissionsReviewDialog\" />\n </Stack>\n </DialogContent>\n <DialogActions>\n <ButtonEx variant=\"text\" size=\"small\" onClick={onClose}>\n Close\n </ButtonEx>\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={requesting}\n busy={requesting}\n onClick={onReRequest}\n >\n Re-request permissions\n </ButtonEx>\n </DialogActions>\n </Dialog>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport {\n Alert, Stack, Typography,\n} from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { ErrorRender } from '@xylabs/react-error'\nimport type { Hash } from '@xylabs/sdk-js'\nimport { isDefined, isDefinedNotNull } from '@xylabs/sdk-js'\nimport type { DataLakeData } from '@xyo-network/xl1-protocol-lib'\nimport React, { useState } from 'react'\n\nimport { useClientFromWallet } from '../../hooks/index.ts'\n\nexport interface DataLakeGetButtonProps extends StackProps {\n /** Hashes to fetch from the lake bound to `id`. */\n hashes: Hash[]\n /** Per-origin opaque id from `requestAccess` or `list`. */\n id: string\n timeout?: number\n}\n\n/**\n * Calls `client.dataLakes.get(id, hashes)` against a live wallet extension\n * and renders the returned `DataLakeData[]` as JSON. Use after granting\n * read access via {@link DataLakeRequestAccessButton} \u2014 the `id` arg is the\n * per-origin handle the popup minted on Connect.\n */\nexport const DataLakeGetButton: React.FC<DataLakeGetButtonProps> = ({\n id, hashes, timeout, ...props\n}) => {\n const {\n client, error: clientError, isLoading, timedout,\n } = useClientFromWallet(timeout)\n\n const [result, setResult] = useState<DataLakeData[]>()\n const [requestError, setRequestError] = useState<Error>()\n const [requesting, setRequesting] = useState(false)\n\n const dataLakes = client?.dataLakes\n const supported = isDefinedNotNull(dataLakes)\n const argsReady = id.length > 0 && hashes.length > 0\n\n const handleClick = async () => {\n if (!isDefinedNotNull(dataLakes)) return\n setRequestError(undefined)\n setResult(undefined)\n setRequesting(true)\n try {\n const payloads = await dataLakes.get(id, hashes)\n setResult(payloads)\n } catch (e) {\n setRequestError(e as Error)\n } finally {\n setRequesting(false)\n }\n }\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 2,\n alignItems: 'start',\n ...props.sx,\n }}\n >\n {timedout ? <Alert severity=\"warning\">Wallet not detected.</Alert> : null}\n {isDefinedNotNull(client) && !supported\n ? <Alert severity=\"warning\">This wallet does not expose `xyo.client.dataLakes`.</Alert>\n : null}\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!supported || !argsReady || requesting}\n busy={isLoading || requesting}\n onClick={() => void handleClick()}\n >\n Get\n {' '}\n {hashes.length}\n {' '}\n hash\n {hashes.length === 1 ? '' : 'es'}\n </ButtonEx>\n {argsReady\n ? null\n : (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n Provide a per-origin `id` and at least one hash to enable the button.\n </Typography>\n )}\n {isDefined(result)\n ? (\n <Stack sx={{ gap: 0.5 }}>\n <Typography variant=\"subtitle2\">\n {result.length === 0 ? 'No payloads returned' : `Payloads (${result.length})`}\n </Typography>\n <Typography\n component=\"pre\"\n variant=\"body2\"\n sx={{\n fontFamily: 'monospace', whiteSpace: 'pre-wrap', wordBreak: 'break-all',\n }}\n >\n {JSON.stringify(result, null, 2)}\n </Typography>\n </Stack>\n )\n : null}\n <ErrorRender error={clientError ?? requestError} scope=\"DataLakeGetButton\" />\n </Stack>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport {\n Stack, TextField, Typography,\n} from '@mui/material'\nimport type { Hash } from '@xylabs/sdk-js'\nimport React, { useMemo, useState } from 'react'\n\nimport { ApprovedLakeSelector } from './ApprovedLakeSelector.tsx'\nimport { DataLakeGetButton } from './DataLakeGetButton.tsx'\n\nexport interface DataLakeGetPanelProps extends StackProps {\n timeout?: number\n}\n\n/**\n * Self-contained Get flow: dropdown of viewer-capable approved lakes + a\n * textarea for hashes + the underlying `DataLakeGetButton`. Built for\n * Storybook's isolation mode, where the args panel is not available and the\n * component needs to render its own controls.\n *\n * One hash per line in the textarea; whitespace-only lines are ignored.\n */\nexport const DataLakeGetPanel: React.FC<DataLakeGetPanelProps> = ({ timeout, ...props }) => {\n const [selectedId, setSelectedId] = useState<string>('')\n const [hashesText, setHashesText] = useState<string>('')\n\n const hashes = useMemo<Hash[]>(() => {\n return hashesText\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line.length > 0) as Hash[]\n }, [hashesText])\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 2,\n alignItems: 'stretch',\n ...props.sx,\n }}\n >\n <ApprovedLakeSelector\n capability=\"viewer\"\n selectedId={selectedId}\n onChange={setSelectedId}\n timeout={timeout}\n />\n <TextField\n label=\"Hashes (one per line)\"\n value={hashesText}\n onChange={e => setHashesText(e.target.value)}\n multiline\n minRows={3}\n maxRows={10}\n size=\"small\"\n slotProps={{ input: { sx: { fontFamily: 'monospace', fontSize: 12 } } }}\n />\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n {hashes.length === 0 ? 'No hashes parsed.' : `${hashes.length} hash${hashes.length === 1 ? '' : 'es'} ready.`}\n </Typography>\n <DataLakeGetButton id={selectedId} hashes={hashes} timeout={timeout} />\n </Stack>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport {\n Alert, Stack, Typography,\n} from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { ErrorRender } from '@xylabs/react-error'\nimport { isDefined, isDefinedNotNull } from '@xylabs/sdk-js'\nimport type { DataLakeData } from '@xyo-network/xl1-protocol-lib'\nimport React, { useState } from 'react'\n\nimport { useClientFromWallet } from '../../hooks/index.ts'\n\nexport interface DataLakeInsertButtonProps extends StackProps {\n /** Per-origin opaque id from `requestAccess` or `list`. */\n id: string\n /** Payloads to insert into the lake bound to `id`. */\n payloads: DataLakeData[]\n timeout?: number\n}\n\n/**\n * Calls `client.dataLakes.insert(id, payloads)` against a live wallet\n * extension and renders the wallet's response (typically the hashes of the\n * accepted payloads) as JSON. Use after granting write access via\n * {@link DataLakeRequestAccessButton} \u2014 the `id` arg is the per-origin handle\n * the popup minted on Connect.\n */\nexport const DataLakeInsertButton: React.FC<DataLakeInsertButtonProps> = ({\n id, payloads, timeout, ...props\n}) => {\n const {\n client, error: clientError, isLoading, timedout,\n } = useClientFromWallet(timeout)\n\n const [result, setResult] = useState<DataLakeData[]>()\n const [requestError, setRequestError] = useState<Error>()\n const [requesting, setRequesting] = useState(false)\n\n const dataLakes = client?.dataLakes\n const supported = isDefinedNotNull(dataLakes)\n const argsReady = id.length > 0 && payloads.length > 0\n\n const handleClick = async () => {\n if (!isDefinedNotNull(dataLakes)) return\n setRequestError(undefined)\n setResult(undefined)\n setRequesting(true)\n try {\n const acks = await dataLakes.insert(id, payloads)\n setResult(acks)\n } catch (e) {\n setRequestError(e as Error)\n } finally {\n setRequesting(false)\n }\n }\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 2,\n alignItems: 'start',\n ...props.sx,\n }}\n >\n {timedout ? <Alert severity=\"warning\">Wallet not detected.</Alert> : null}\n {isDefinedNotNull(client) && !supported\n ? <Alert severity=\"warning\">This wallet does not expose `xyo.client.dataLakes`.</Alert>\n : null}\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!supported || !argsReady || requesting}\n busy={isLoading || requesting}\n onClick={() => void handleClick()}\n >\n Insert\n {' '}\n {payloads.length}\n {' '}\n payload\n {payloads.length === 1 ? '' : 's'}\n </ButtonEx>\n {argsReady\n ? null\n : (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n Provide a per-origin `id` and at least one payload to enable the button.\n </Typography>\n )}\n {isDefined(result)\n ? (\n <Stack sx={{ gap: 0.5 }}>\n <Typography variant=\"subtitle2\">\n {result.length === 0 ? 'No payloads written (wallet filtered all)' : `Inserted (${result.length})`}\n </Typography>\n <Typography\n component=\"pre\"\n variant=\"body2\"\n sx={{\n fontFamily: 'monospace', whiteSpace: 'pre-wrap', wordBreak: 'break-all',\n }}\n >\n {JSON.stringify(result, null, 2)}\n </Typography>\n </Stack>\n )\n : null}\n <ErrorRender error={clientError ?? requestError} scope=\"DataLakeInsertButton\" />\n </Stack>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport {\n Alert, Stack, TextField, Typography,\n} from '@mui/material'\nimport type { DataLakeData } from '@xyo-network/xl1-protocol-lib'\nimport React, { useMemo, useState } from 'react'\n\nimport { ApprovedLakeSelector } from './ApprovedLakeSelector.tsx'\nimport { DataLakeInsertButton } from './DataLakeInsertButton.tsx'\n\nexport interface DataLakeInsertPanelProps extends StackProps {\n timeout?: number\n}\n\n/**\n * Build a fresh default payload every time the panel mounts. The ISO\n * timestamp gives each mount its own content-address \u2014 a tester who clicks\n * Insert twice from a freshly-mounted panel sees two distinct hashes back,\n * which makes round-tripping with the Get panel easier to verify.\n */\nfunction buildDefaultPayload(): string {\n return JSON.stringify(\n {\n schema: 'network.xyo.observation.v2', value: 1, timestamp: new Date().toISOString(),\n },\n null,\n 2,\n )\n}\n\ninterface ParseSuccess {\n ok: true\n payloads: DataLakeData[]\n}\n\ninterface ParseFailure {\n error: string\n ok: false\n}\n\ntype ParseResult = ParseSuccess | ParseFailure\n\n/**\n * Parse the textarea content into a `DataLakeData[]`.\n *\n * Accepts either a single object (wrapped into a one-element array) or an\n * already-array shape. Returns a structured success/failure so the panel can\n * render a parse error without blowing up the render path.\n */\nfunction parsePayload(raw: string): ParseResult {\n const trimmed = raw.trim()\n if (trimmed.length === 0) return { ok: false, error: 'Payload is empty.' }\n try {\n const parsed = JSON.parse(trimmed) as unknown\n if (Array.isArray(parsed)) return { ok: true, payloads: parsed as DataLakeData[] }\n if (parsed !== null && typeof parsed === 'object') return { ok: true, payloads: [parsed as DataLakeData] }\n return { ok: false, error: 'Payload must be a JSON object or array of objects.' }\n } catch (e) {\n return { ok: false, error: `Invalid JSON: ${(e as Error).message}` }\n }\n}\n\n/**\n * Self-contained Insert flow: dropdown of runner-capable approved lakes + a\n * JSON textarea + the underlying `DataLakeInsertButton`. Built for Storybook's\n * isolation mode, where the args panel is not available and the component\n * needs to render its own controls.\n *\n * The textarea accepts either one payload object or a JSON array of payload\n * objects; bad JSON shows an inline parse error and disables the button.\n */\nexport const DataLakeInsertPanel: React.FC<DataLakeInsertPanelProps> = ({ timeout, ...props }) => {\n const [selectedId, setSelectedId] = useState<string>('')\n // `useState(fn)` defers the initializer to first render \u2014 each mount gets a\n // fresh ISO timestamp baked into the default payload.\n const [payloadText, setPayloadText] = useState<string>(buildDefaultPayload)\n\n const parse = useMemo(() => parsePayload(payloadText), [payloadText])\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 2,\n alignItems: 'stretch',\n ...props.sx,\n }}\n >\n <ApprovedLakeSelector\n capability=\"runner\"\n selectedId={selectedId}\n onChange={setSelectedId}\n timeout={timeout}\n />\n <TextField\n label=\"Payload (JSON object or array)\"\n value={payloadText}\n onChange={e => setPayloadText(e.target.value)}\n multiline\n minRows={6}\n maxRows={16}\n size=\"small\"\n slotProps={{ input: { sx: { fontFamily: 'monospace', fontSize: 12 } } }}\n />\n {parse.ok\n ? (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n {parse.payloads.length}\n {' '}\n payload\n {parse.payloads.length === 1 ? '' : 's'}\n {' '}\n parsed.\n </Typography>\n )\n : (\n <Alert severity=\"error\" variant=\"outlined\">\n <Typography variant=\"body2\">{parse.error}</Typography>\n </Alert>\n )}\n <DataLakeInsertButton\n id={selectedId}\n payloads={parse.ok ? parse.payloads : []}\n timeout={timeout}\n />\n </Stack>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport {\n Alert, Stack, Typography,\n} from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { ErrorRender } from '@xylabs/react-error'\nimport { isDefined, isDefinedNotNull } from '@xylabs/sdk-js'\nimport type { ApprovedDataLake } from '@xyo-network/xl1-protocol-lib'\nimport React, { useState } from 'react'\n\nimport { useClientFromWallet } from '../../hooks/index.ts'\n\nexport interface DataLakeListButtonProps extends StackProps {\n timeout?: number\n}\n\n/**\n * Calls `client.dataLakes.list()` against a live wallet extension and renders\n * the approved-lake summary per origin. The page only ever sees the opaque\n * per-origin `id`, the granted `capabilities`, and the lake's public schema\n * policy \u2014 names and endpoints are deliberately redacted by the wallet.\n */\nexport const DataLakeListButton: React.FC<DataLakeListButtonProps> = ({ timeout, ...props }) => {\n const {\n client, error: clientError, isLoading, timedout,\n } = useClientFromWallet(timeout)\n\n const [lakes, setLakes] = useState<ApprovedDataLake[]>()\n const [requestError, setRequestError] = useState<Error>()\n const [requesting, setRequesting] = useState(false)\n\n const dataLakes = client?.dataLakes\n const supported = isDefinedNotNull(dataLakes)\n\n const handleClick = async () => {\n if (!isDefinedNotNull(dataLakes)) return\n setRequestError(undefined)\n setLakes(undefined)\n setRequesting(true)\n try {\n const result = await dataLakes.list()\n setLakes(result)\n } catch (e) {\n setRequestError(e as Error)\n } finally {\n setRequesting(false)\n }\n }\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 2,\n alignItems: 'start',\n ...props.sx,\n }}\n >\n {timedout ? <Alert severity=\"warning\">Wallet not detected.</Alert> : null}\n {isDefinedNotNull(client) && !supported\n ? <Alert severity=\"warning\">This wallet does not expose `xyo.client.dataLakes`.</Alert>\n : null}\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!supported || requesting}\n busy={isLoading || requesting}\n onClick={() => void handleClick()}\n >\n List approved data lakes\n </ButtonEx>\n {isDefined(lakes)\n ? (\n <Stack sx={{ gap: 0.5 }}>\n <Typography variant=\"subtitle2\">\n {lakes.length === 0 ? 'No approved lakes' : `Approved lakes (${lakes.length})`}\n </Typography>\n <Typography\n component=\"pre\"\n variant=\"body2\"\n sx={{\n fontFamily: 'monospace', whiteSpace: 'pre-wrap', wordBreak: 'break-all',\n }}\n >\n {JSON.stringify(lakes, null, 2)}\n </Typography>\n </Stack>\n )\n : null}\n <ErrorRender error={clientError ?? requestError} scope=\"DataLakeListButton\" />\n </Stack>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport {\n Divider, Stack, Typography,\n} from '@mui/material'\nimport React from 'react'\n\nimport { DataLakeGetPanel } from './DataLakeGetPanel.tsx'\nimport { DataLakeInsertPanel } from './DataLakeInsertPanel.tsx'\nimport { DataLakeListButton } from './DataLakeListButton.tsx'\nimport { DataLakeRequestAccessPanel } from './DataLakeRequestAccessPanel.tsx'\n\nexport interface DataLakeOperationsPanelProps extends StackProps {\n timeout?: number\n}\n\n/**\n * Combined panel for exercising every page-side data-lake operation against\n * a live wallet in a single rendered surface \u2014 `requestAccess`, `list`,\n * `insert`, and `get` stacked with their own controls so a manual tester\n * can drive the full flow without jumping between Storybook stories. The\n * sections are ordered for natural flow: request access first, then\n * enumerate the grants, then insert a payload and read it back by hash in\n * the same scroll. Designed for isolation mode where the args panel isn't\n * available.\n *\n * Single-purpose: composes the four operation components and labels each\n * section. State within each operation (capability choice, selected lake,\n * hashes, payload JSON) is owned by the underlying panel, not by this\n * wrapper.\n */\nexport const DataLakeOperationsPanel: React.FC<DataLakeOperationsPanelProps> = ({ timeout, ...props }) => {\n return (\n <Stack\n {...props}\n sx={{\n gap: 3,\n alignItems: 'stretch',\n ...props.sx,\n }}\n >\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">Request data lake access</Typography>\n <DataLakeRequestAccessPanel timeout={timeout} />\n </Stack>\n\n <Divider />\n\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">List approved lakes</Typography>\n <DataLakeListButton timeout={timeout} />\n </Stack>\n\n <Divider />\n\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">Insert payloads</Typography>\n <DataLakeInsertPanel timeout={timeout} />\n </Stack>\n\n <Divider />\n\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">Get payloads by hash</Typography>\n <DataLakeGetPanel timeout={timeout} />\n </Stack>\n </Stack>\n )\n}\n", "import type { SelectChangeEvent, StackProps } from '@mui/material'\nimport {\n Checkbox, FormControl, FormControlLabel, InputLabel, MenuItem, Select, Stack,\n} from '@mui/material'\nimport { asSchema } from '@xyo-network/sdk-js'\nimport type { DataLakeRequestAccessOptions } from '@xyo-network/xl1-protocol-lib'\nimport React, { useMemo, useState } from 'react'\n\nimport { DataLakeRequestAccessButton } from './DataLakeRequestAccessButton.tsx'\n\nconst observationSchema = asSchema('network.xyo.observation.v2', true)\nconst locationSchema = asSchema('network.xyo.location', true)\n\ntype CapabilityChoice = 'viewer' | 'runner' | 'read+write'\n\nexport interface DataLakeRequestAccessPanelProps extends StackProps {\n timeout?: number\n}\n\n/**\n * Self-contained RequestAccess flow \u2014 picks a capability shape\n * (`viewer`, `runner`, or combined `read + write`) and optionally attaches\n * a schemas filter, then drives `client.dataLakes.requestAccess(options)`\n * through {@link DataLakeRequestAccessButton}. Designed for Storybook's\n * isolation mode where the args panel isn't available, so a manual tester\n * can sweep the four canonical request shapes from one rendered surface.\n *\n * Schemas filter only applies to the write path: `get` is hash-based and\n * the wallet rejects a schemas filter on `viewer` grants. The checkbox\n * auto-disables when the capability has no write component.\n */\nexport const DataLakeRequestAccessPanel: React.FC<DataLakeRequestAccessPanelProps> = ({ timeout, ...props }) => {\n const [capability, setCapability] = useState<CapabilityChoice>('read+write')\n const [includeSchemas, setIncludeSchemas] = useState(true)\n\n const supportsSchemasFilter = capability !== 'viewer'\n\n const options = useMemo<DataLakeRequestAccessOptions>(() => {\n const cap = capability === 'read+write' ? { read: true, write: true } : capability\n if (supportsSchemasFilter && includeSchemas) {\n return { capability: cap, schemas: [observationSchema, locationSchema] }\n }\n return { capability: cap }\n }, [capability, includeSchemas, supportsSchemasFilter])\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 2,\n alignItems: 'stretch',\n ...props.sx,\n }}\n >\n <FormControl size=\"small\" fullWidth>\n <InputLabel>Capability</InputLabel>\n <Select<CapabilityChoice>\n value={capability}\n label=\"Capability\"\n onChange={(event: SelectChangeEvent<CapabilityChoice>) =>\n setCapability(event.target.value)}\n >\n <MenuItem value=\"viewer\">Read only (viewer)</MenuItem>\n <MenuItem value=\"runner\">Write only (runner)</MenuItem>\n <MenuItem value=\"read+write\">Read + Write</MenuItem>\n </Select>\n </FormControl>\n <FormControlLabel\n control={(\n <Checkbox\n checked={supportsSchemasFilter && includeSchemas}\n disabled={!supportsSchemasFilter}\n onChange={event => setIncludeSchemas(event.target.checked)}\n size=\"small\"\n />\n )}\n label=\"Include schemas filter (observation + location)\"\n />\n <DataLakeRequestAccessButton options={options} timeout={timeout} />\n </Stack>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport {\n Alert, Stack, Typography,\n} from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { ErrorRender } from '@xylabs/react-error'\nimport { isDefined, isDefinedNotNull } from '@xylabs/sdk-js'\nimport type { DataLakeRequestAccessOptions } from '@xyo-network/xl1-protocol-lib'\nimport React, { useState } from 'react'\n\nimport { useClientFromWallet } from '../../hooks/index.ts'\n\nexport interface DataLakeRequestAccessButtonProps extends StackProps {\n options: DataLakeRequestAccessOptions\n timeout?: number\n}\n\n/**\n * Calls `client.dataLakes.requestAccess(options)` against a live wallet\n * extension. Renders the resulting `{ id }` (the per-origin opaque handle\n * for the most-recently-granted lake) or any error. Pair with\n * {@link DataLakeListButton} after running to discover ALL granted lake ids\n * when the user picks multiple lakes in the popup.\n */\nexport const DataLakeRequestAccessButton: React.FC<DataLakeRequestAccessButtonProps> = ({\n options, timeout, ...props\n}) => {\n const {\n client, error: clientError, isLoading, timedout,\n } = useClientFromWallet(timeout)\n\n const [granted, setGranted] = useState<{ id: string }>()\n const [requestError, setRequestError] = useState<Error>()\n const [requesting, setRequesting] = useState(false)\n\n const dataLakes = client?.dataLakes\n const supported = isDefinedNotNull(dataLakes)\n\n const handleClick = async () => {\n if (!isDefinedNotNull(dataLakes)) return\n setRequestError(undefined)\n setGranted(undefined)\n setRequesting(true)\n try {\n const result = await dataLakes.requestAccess(options)\n setGranted(result)\n } catch (e) {\n setRequestError(e as Error)\n } finally {\n setRequesting(false)\n }\n }\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 2,\n alignItems: 'start',\n ...props.sx,\n }}\n >\n {timedout ? <Alert severity=\"warning\">Wallet not detected.</Alert> : null}\n {isDefinedNotNull(client) && !supported\n ? <Alert severity=\"warning\">This wallet does not expose `xyo.client.dataLakes`.</Alert>\n : null}\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!supported || requesting}\n busy={isLoading || requesting}\n onClick={() => void handleClick()}\n >\n Request data lake access\n </ButtonEx>\n {isDefined(granted)\n ? (\n <Stack sx={{ gap: 0.5 }}>\n <Typography variant=\"subtitle2\">Granted:</Typography>\n <Typography variant=\"body2\" sx={{ fontFamily: 'monospace', wordBreak: 'break-all' }}>\n id:\n {' '}\n {granted.id}\n </Typography>\n <Typography variant=\"body2\" sx={{ color: 'text.secondary' }}>\n If you picked multiple lakes, call `list()` to enumerate all granted ids.\n </Typography>\n </Stack>\n )\n : null}\n <ErrorRender error={clientError ?? requestError} scope=\"DataLakeRequestAccessButton\" />\n </Stack>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport {\n Alert, Chip, Divider, Stack, Typography,\n} from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { PopoverErrorRender } from '@xylabs/react-error'\nimport {\n assertEx, isDefined, isDefinedNotNull,\n} from '@xylabs/sdk-js'\nimport type { Payload } from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n GatewayName, HashPayload, PermissionRequest, UnsignedHydratedTransaction,\n} from '@xyo-network/xl1-sdk'\nimport {\n asXL1BlockNumber, buildUnsignedTransaction, HashSchema, SequenceNetwork,\n} from '@xyo-network/xl1-sdk'\nimport React, { useCallback, useState } from 'react'\n\nimport { useGatewayFromWallet } from '../../hooks/index.ts'\nimport { RequestPermissionsButton } from './RequestPermissionsButton.tsx'\n\n/** Stable empty default for optional payload arrays \u2014 a fresh `[]` literal as a default prop re-renders forever. */\nconst EMPTY_PAYLOADS: Payload[] = []\n\n/**\n * Signer-side grants `buildUnsignedTransaction` needs: `xyoWallet_getAccounts`\n * + `xyoSigner_address` populate the transaction's `from` field. The\n * per-transaction `xyoSigner_signTransaction` call isn't EIP-2255-permissioned\n * \u2014 the wallet shows its own Sign popup on each invocation, which is exactly\n * the page this story exercises.\n */\nconst SIGNER_PERMISSIONS: PermissionRequest[] = [\n { xyoWallet_getAccounts: { restrictReturnedAccounts: [] } },\n { xyoSigner_address: {} },\n]\n\nexport interface SignTransactionButtonProps extends StackProps {\n /**\n * When true (default), elevate a single `network.xyo.hash` payload on-chain\n * that anchors the first referenced payload by hash. This populates the\n * wallet's \"On-Chain Payloads\" section with a realistic anchor while the\n * referenced content itself stays off-chain. When false, no payloads are\n * elevated and the \"On-Chain Payloads\" section renders empty.\n */\n anchorOnChain?: boolean\n /** Gateway/network to build the transaction against. Defaults to `SequenceNetwork.id`. */\n gatewayName?: GatewayName\n /**\n * Payloads referenced by hash but NOT included with the transaction \u2014 only\n * their hash + schema reach the wallet. Exercises the wallet's existing\n * \"Private Referenced Payloads\" (hash + schema only) section. Defaults to none.\n */\n privateReferencedPayloads?: Payload[]\n /**\n * Payloads passed in full via the RPC request that are referenced (in the\n * bound witness `payload_hashes`) but NOT elevated on-chain. Exercises the\n * wallet's \"Referenced Payloads\" section \u2014 the full contents are shown\n * because they ride along with the transaction even though they won't be\n * stored on-chain. Defaults to none.\n */\n referencedPayloads?: Payload[]\n /** Wallet-detection timeout, forwarded to the wallet hooks. */\n timeout?: number\n}\n\n/**\n * Manual Storybook harness that drives the live XL1 Wallet's transaction-signing\n * popup with caller-supplied payloads. It assembles an\n * {@link UnsignedHydratedTransaction} from three independently-stubbed payload\n * groups and calls `signer.signTransaction(tx)`, which opens the wallet's Sign\n * page so its payload sections can be visually verified:\n *\n * - **On-Chain Payloads** \u2014 `anchorOnChain` elevates a `network.xyo.hash`\n * payload that anchors `referencedPayloads[0]`.\n * - **Referenced Payloads** \u2014 `referencedPayloads` ride along in the\n * transaction's payload array (so the wallet has their full contents) but are\n * not marked elevated, so they won't be stored on-chain.\n * - **Private Referenced Payloads** \u2014 `privateReferencedPayloads` are appended\n * to the bound witness's `payload_hashes` / `payload_schemas` only; their\n * contents are withheld, so the wallet can show no more than hash + schema.\n *\n * Chain id, `nbf`, and `exp` are resolved from the gateway's viewer and `from`\n * from the wallet signer, so the transaction is well-formed for the active\n * account. The transaction is only signed, never broadcast \u2014 clicking Sign in\n * the wallet returns the signed transaction here and renders its bound-witness\n * hash; nothing is sent to the network.\n */\nexport const SignTransactionButton: React.FC<SignTransactionButtonProps> = ({\n anchorOnChain = true,\n gatewayName = SequenceNetwork.id,\n privateReferencedPayloads = EMPTY_PAYLOADS,\n referencedPayloads = EMPTY_PAYLOADS,\n timeout,\n ...props\n}) => {\n const {\n gateway, error: gatewayError, timedout,\n } = useGatewayFromWallet(gatewayName, timeout)\n\n const [signing, setSigning] = useState(false)\n const [signError, setSignError] = useState<Error>()\n const [signedHash, setSignedHash] = useState<string>()\n\n const signer = gateway?.signer\n const viewer = gateway?.connection?.viewer\n const canSign = isDefinedNotNull(signer) && isDefinedNotNull(viewer) && !signing\n\n const handleSign = useCallback(async () => {\n if (!isDefinedNotNull(gateway)) return\n const resolvedSigner = assertEx(gateway.signer, () => 'No signer available on gateway')\n const resolvedViewer = assertEx(gateway.connection?.viewer, () => 'No viewer available on gateway connection')\n setSignError(undefined)\n setSignedHash(undefined)\n setSigning(true)\n try {\n const chain = await resolvedViewer.chainId()\n const nbf = asXL1BlockNumber(await resolvedViewer.currentBlockNumber(), true)\n const exp = asXL1BlockNumber(nbf + 10, true)\n const from = await resolvedSigner.address()\n\n // Anchor the first referenced payload with an on-chain hash payload so the\n // wallet's \"On-Chain Payloads\" section has something realistic to show.\n const referencedHashes = await PayloadBuilder.hashes(referencedPayloads)\n const onChainPayloads: HashPayload[] = anchorOnChain && isDefined(referencedHashes[0])\n ? [{ schema: HashSchema, hash: referencedHashes[0] }]\n : []\n\n let tx: UnsignedHydratedTransaction = await buildUnsignedTransaction(\n chain,\n onChainPayloads,\n referencedPayloads,\n nbf,\n exp,\n from,\n )\n\n // Reference the private payloads by hash + schema only \u2014 append to the\n // bound witness without adding the payloads themselves, so the wallet\n // never receives their contents.\n if (privateReferencedPayloads.length > 0) {\n const privateHashes = await PayloadBuilder.hashes(privateReferencedPayloads)\n const [bw, payloads] = tx\n tx = [\n {\n ...bw,\n payload_hashes: [...bw.payload_hashes, ...privateHashes],\n payload_schemas: [...bw.payload_schemas, ...privateReferencedPayloads.map(payload => payload.schema)],\n },\n payloads,\n ]\n }\n\n const [signedBoundWitness] = await resolvedSigner.signTransaction(tx)\n setSignedHash(await PayloadBuilder.hash(signedBoundWitness))\n } catch (e) {\n setSignError(e as Error)\n } finally {\n setSigning(false)\n }\n }, [anchorOnChain, gateway, privateReferencedPayloads, referencedPayloads])\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 3,\n alignItems: 'stretch',\n ...props.sx,\n }}\n >\n {timedout\n ? <Alert severity=\"warning\">Wallet not detected.</Alert>\n : null}\n\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">1. Grant signer + account access</Typography>\n <RequestPermissionsButton permissions={SIGNER_PERMISSIONS} timeout={timeout} />\n </Stack>\n\n <Divider />\n\n <Stack sx={{ gap: 1, alignItems: 'start' }}>\n <Typography variant=\"subtitle2\">2. Sign the transaction</Typography>\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n Opens the wallet&apos;s Sign page with\n {' '}\n {anchorOnChain ? '1 on-chain anchor, ' : 'no on-chain payloads, '}\n {referencedPayloads.length}\n {' '}\n referenced, and\n {' '}\n {privateReferencedPayloads.length}\n {' '}\n private referenced payload\n {privateReferencedPayloads.length === 1 ? '' : 's'}\n . The signed transaction is returned here and not broadcast.\n </Typography>\n <Stack direction=\"row\" sx={{ gap: 1, alignItems: 'center' }}>\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!canSign}\n busy={signing}\n onClick={() => void handleSign()}\n >\n Sign transaction\n </ButtonEx>\n <PopoverErrorRender error={gatewayError ?? signError} scope=\"SignTransactionButton\" />\n </Stack>\n {isDefined(signedHash)\n ? (\n <Stack\n direction=\"row\"\n sx={{\n alignItems: 'center', flexWrap: 'wrap', gap: 1,\n }}\n >\n <Chip label=\"Signed\" size=\"small\" color=\"success\" />\n <Typography variant=\"body2\" sx={{ fontFamily: 'monospace', wordBreak: 'break-all' }}>\n {signedHash}\n </Typography>\n </Stack>\n )\n : null}\n </Stack>\n </Stack>\n )\n}\n", "import { createContextEx } from '@xylabs/react-shared'\n\nimport type { GatewayStateFields } from './GatewayProviderState.ts'\n\n/**\n * Shared React context that decouples gateway *sources* from gateway\n * *consumers*. Any provider that can resolve an `XyoGateway` publishes to\n * this context; any hook or component that needs a gateway reads from it\n * via `useProvidedGateway`. Consumers never import a specific provider \u2014\n * they just require that *some* provider is mounted above them in the\n * tree.\n *\n * Current publishers:\n * - `WalletGatewayProvider` (this package) \u2014 sources gateways from the\n * injected XL1 wallet extension.\n * - `GatewayProvider` in `@xyo-network/react-chain-provider` \u2014 sources\n * gateways built in-page against RPC endpoints, falling back to the\n * wallet when available.\n *\n * To add a new source (e.g. a mock provider for tests, an iframe-bridged\n * provider, a server-rendered provider), publish a `GatewayContextState`\n * to this same context \u2014 do not create a parallel context, or consumers\n * will silently stop receiving updates.\n */\nexport const GatewayContext = createContextEx<GatewayStateFields>()\n", "import { createContextEx } from '@xylabs/react-shared'\n\nimport type { InPageGatewaysStateFields } from './InPageGatewaysState.ts'\n\n/**\n * Narrow, provider-internal context that `InPageGatewaysProvider` writes\n * to and `GatewayProvider` reads from. Do not consume this in application\n * code \u2014 use `useProvidedGateway` (which reads the shared\n * `GatewayContext`) instead. This context only exists to decouple the\n * single in-page *builder* from the many single-gateway *adapters* that\n * sit between it and the shared gateway surface.\n */\nexport const InPageGatewaysContext = createContextEx<InPageGatewaysStateFields>()\n", "import type {\n GatewayName, RpcTransport, XyoSignerRpcSchemas,\n} from '@xyo-network/xl1-sdk'\nimport { DefaultNetworks } from '@xyo-network/xl1-sdk'\nimport type { PropsWithChildren } from 'react'\nimport React, {\n startTransition,\n useCallback, useEffect, useMemo, useState,\n} from 'react'\n\nimport type { ContextGatewayType } from '../../types/index.ts'\nimport { InPageGatewaysContext } from './InPageGatewaysContext.ts'\nimport type { InPageGatewaysState } from './InPageGatewaysState.ts'\nimport { buildGateway } from './lib/index.ts'\n\nexport interface InPageGatewaysProviderProps extends PropsWithChildren {\n signerTransport?: RpcTransport<XyoSignerRpcSchemas>\n}\n\n/**\n * Publishes a keyed map of in-page gateways \u2014 one per network in\n * `DefaultNetworks` \u2014 under the narrow `InPageGatewaysContext`.\n *\n * This provider is deliberately *not* a direct publisher of the shared\n * `GatewayContext` that `useProvidedGateway` reads. Its consumer is the\n * wrapping `GatewayProvider` in this same package, which picks the\n * `gatewayName` the consumer asked for out of this map, adapts it into\n * the single-gateway `GatewayContextState` shape, and then publishes *that*\n * to the shared context. Splitting the work this way lets one\n * `InPageGatewaysProvider` near the root build every network's gateway\n * once, while many `GatewayProvider` instances deeper in the tree each\n * expose whichever gateway their subtree cares about.\n *\n * Unlike `WalletGatewayProvider`, gateways here are constructed directly\n * in the page (via `buildGateway`) against each network's RPC endpoint\n * \u2014 no browser wallet extension is required. `signerTransport` switches\n * between viewer (read-only) and runner (can sign/send) locators; supply\n * it only when the app needs to sign.\n *\n * Behavior:\n * - On mount, and whenever `signerTransport` changes, `buildGateway` is\n * called in parallel for every network in `DefaultNetworks` via\n * `Promise.allSettled`. Networks that resolve populate `gateways[id]`;\n * networks that reject populate `errors[id]`. One failed network does\n * not block the others.\n * - If `signerTransport` is provided, gateways are built with a remote\n * *runner* locator, otherwise with a remote *viewer* locator.\n * - When `signerTransport` changes identity mid-life, the provider clears\n * all cached gateways and errors synchronously during render (via\n * `previousSignerTransport` state) so consumers never see gateways\n * bound to the previous transport, then rebuilds in the effect.\n * - State updates from the rebuild are wrapped in `startTransition` so a\n * slow network doesn't stall higher-priority UI updates.\n * - A `cancelled` flag in the effect's cleanup discards results from a\n * prior `signerTransport` once a new one is in flight.\n *\n * Published `InPageGatewaysState` (narrower than `GatewayContextState` \u2014\n * this is an internal handoff shape, not the cross-publisher surface):\n * - `gateways` \u2014 `Partial<Record<GatewayName, ContextGatewayType>>`. Keys\n * are only present for networks that built successfully.\n * - `errors` \u2014 `Partial<Record<GatewayName, Error>>`. Per-network build\n * failures, keyed by `GatewayName`.\n * - `clearAll()` \u2014 manually empties both maps. Also invoked internally on\n * transport changes. Forwarded by `GatewayProvider` to consumers as\n * `resetGatewaysFromConfig`.\n * - `provided: true` \u2014 lets descendants detect a real provider.\n *\n * Note: the commented-out `SimpleXyoClient` at the top is intentionally\n * disabled pending a type unification between `XyoGateway` and\n * `XyoGatewayRunner`.\n */\nexport const InPageGatewaysProvider: React.FC<InPageGatewaysProviderProps> = ({ signerTransport, children }) => {\n const [gateways, setGateways] = useState<Partial<Record<GatewayName, ContextGatewayType>>>({})\n const [errors, setErrors] = useState<Partial<Record<GatewayName, Error>>>({})\n const [previousSignerTransport, setPreviousSignerTransport] = useState<RpcTransport<XyoSignerRpcSchemas> | undefined>(signerTransport)\n\n // This can come back once we homogenize the type for XyoGateway.\n // Right now, SimpleXyoClient takes XyoGatewayRunners but ideally it would take XyoGateway.\n // const clientInPage = useMemo(() => new SimpleXyoClient(gateways, {}), [gateways])\n\n const clearAll = useCallback(() => {\n setGateways({})\n setErrors({})\n }, [])\n\n if (previousSignerTransport !== signerTransport) {\n clearAll()\n setPreviousSignerTransport(signerTransport)\n }\n\n useEffect(() => {\n let cancelled = false\n\n const buildAll = async () => {\n const results = await Promise.allSettled(\n DefaultNetworks.map(async (network) => {\n const gateway = await buildGateway(network.id, signerTransport)\n return { id: network.id, gateway }\n }),\n )\n\n if (cancelled) return\n\n const nextGateways: Partial<Record<GatewayName, ContextGatewayType>> = {}\n const nextErrors: Partial<Record<GatewayName, Error>> = {}\n\n for (const [index, result] of results.entries()) {\n const networkId = DefaultNetworks[index].id as GatewayName\n if (result.status === 'fulfilled') {\n nextGateways[networkId] = result.value.gateway\n } else {\n nextErrors[networkId] = result.reason instanceof Error ? result.reason : new Error(String(result.reason))\n }\n }\n\n startTransition(() => {\n setGateways(nextGateways)\n setErrors(nextErrors)\n })\n }\n\n void buildAll()\n return () => {\n cancelled = true\n }\n }, [signerTransport])\n\n const value = useMemo(() => {\n const value: InPageGatewaysState = {\n clearAll,\n errors,\n gateways,\n provided: true,\n }\n return value\n }, [clearAll, errors, gateways])\n\n return <InPageGatewaysContext value={value}>{children}</InPageGatewaysContext>\n}\n", "import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type {\n GatewayName,\n RemoteConfig, RpcTransport, SimpleXyoGateway,\n XyoSignerRpcSchemas,\n} from '@xyo-network/xl1-sdk'\nimport {\n basicRemoteRunnerLocator,\n basicRemoteViewerLocator,\n DefaultNetworks, XyoGatewayMoniker,\n} from '@xyo-network/xl1-sdk'\n\nexport const buildGateway = async (gatewayName: GatewayName, signerTransport?: RpcTransport<XyoSignerRpcSchemas>) => {\n const network = DefaultNetworks.find(network => network.id === gatewayName)\n const resolvedNetwork = assertEx(network, () => `No network found for id ${gatewayName}`)\n\n const remoteConfig: RemoteConfig = {\n rpc: {\n protocol: 'http',\n url: `${resolvedNetwork.url}/rpc`,\n },\n }\n\n const locator = isDefined(signerTransport)\n ? await basicRemoteRunnerLocator(gatewayName, remoteConfig, signerTransport)\n : await basicRemoteViewerLocator(gatewayName, remoteConfig)\n\n return await locator.getInstance<SimpleXyoGateway>(XyoGatewayMoniker)\n}\n", "import { useContextEx } from '@xylabs/react-shared'\n\nimport { InPageGatewaysContext } from './InPageGatewaysContext.ts'\nimport type { InPageGatewaysStateFields } from './InPageGatewaysState.ts'\n\n/**\n * Reads the `InPageGatewaysContext` map of per-network in-page gateways.\n * Intended for internal use by `GatewayProvider` \u2014 application code\n * should prefer `useProvidedGateway`, which returns a single resolved\n * gateway regardless of source.\n *\n * @param required - When `true` (default), throws if no\n * `InPageGatewaysProvider` is mounted above.\n */\nexport const useProvidedInPageGateways = (required = true) => useContextEx<InPageGatewaysStateFields>(InPageGatewaysContext, 'InPageGateways', required)\n", "import { ErrorRender } from '@xylabs/react-error'\nimport { isDefinedNotNull, isNull } from '@xylabs/sdk-js'\nimport React, { useMemo } from 'react'\n\nimport { useGatewayFromWallet } from '../../hooks/index.ts'\nimport { GatewayContext } from '../GatewayContext.ts'\nimport type { GatewayProviderProps } from '../GatewayProviderProps.ts'\nimport type { GatewayContextState } from '../GatewayProviderState.ts'\nimport { useProvidedInPageGateways } from '../in-page/index.ts'\n\n/**\n * Publishes the shared `GatewayContext` backed by two sources: the\n * injected XL1 Wallet extension *and* the in-page gateways built by\n * `InPageGatewaysProvider`. Use this provider when the host app can\n * function without a wallet (falling back to the in-page client) but\n * should still prefer the wallet when it is present.\n *\n * Required ancestry: an `InPageGatewaysProvider` must be mounted above\n * this provider \u2014 `useProvidedInPageGateways(true)` throws if missing.\n * If you only need a wallet-backed gateway, use `WalletGatewayProvider`\n * instead.\n *\n * Source precedence for `defaultGateway`:\n * - Wallet present and resolved (`XyoGatewayRunner`) \u2192 wallet wins; the\n * in-page gateway is still exposed via `gateways.inPageGateway` for\n * the rare consumer that needs to target it specifically.\n * - Wallet definitively absent (`null`) \u2192 fall back to the in-page\n * gateway matching `gatewayName`.\n * - Wallet still resolving (`undefined`) \u2192 leave `defaultGateway`\n * `undefined` so consumers render a loading state rather than\n * committing to the in-page fallback prematurely.\n *\n * The published `GatewayContextState` shape:\n * - `defaultGateway` \u2014 resolved per the precedence above. Three-state:\n * `undefined` = loading, `null` is not produced by this provider\n * (wallet-null collapses to `gatewayFromConfig`), `XyoGateway` = ready.\n * - `gateways.walletGateway` \u2014 raw wallet result (tri-state).\n * - `gateways.inPageGateway` \u2014 raw in-page result for the requested\n * `gatewayName`, or `undefined` if no `gatewayName` was passed.\n * - `error` \u2014 first non-null of wallet error, then in-page build error\n * for this `gatewayName`. Also rendered inline via `ErrorRender` above\n * `children` so mount-time failures surface even when no consumer\n * reads `error`.\n * - `resetGatewaysFromConfig` \u2014 forwards `clearAll` from\n * `InPageGatewaysProvider`, letting consumers force a rebuild of the\n * in-page gateways (e.g. after a network or endpoint change).\n * - `provided: true` \u2014 lets descendants detect a real provider in the\n * tree.\n *\n * `defaultGateway`, `gateways`, and the context `value` are memoized so\n * consumers only re-render when wallet or in-page sources actually\n * change identity.\n */\nexport const GatewayProvider: React.FC<GatewayProviderProps> = ({ gatewayName, children }) => {\n const {\n gateway: gatewayFromWallet,\n error: gatewayFromWalletError,\n } = useGatewayFromWallet(gatewayName)\n\n const {\n gateways: allGateways,\n errors: allGatewayErrors,\n clearAll,\n } = useProvidedInPageGateways(true)\n\n const gatewayFromConfig = gatewayName ? allGateways[gatewayName] : undefined\n const gatewayFromConfigError = gatewayName ? allGatewayErrors[gatewayName] : undefined\n\n const { defaultGateway, gateways } = useMemo(() => {\n if (isNull(gatewayFromWallet)) {\n return {\n defaultGateway: gatewayFromConfig,\n gateways: {\n inPageGateway: gatewayFromConfig,\n walletGateway: null,\n },\n }\n } else if (isDefinedNotNull(gatewayFromWallet)) {\n return {\n defaultGateway: gatewayFromWallet,\n gateways: {\n inPageGateway: gatewayFromConfig,\n walletGateway: gatewayFromWallet,\n },\n }\n }\n return {\n defaultGateway: undefined,\n gateways: {\n inPageGateway: undefined,\n walletGateway: undefined,\n },\n }\n }, [gatewayFromConfig, gatewayFromWallet])\n\n const value = useMemo(() => {\n const value: GatewayContextState = {\n defaultGateway,\n error: gatewayFromWalletError ?? gatewayFromConfigError,\n gateways,\n provided: true,\n resetGatewaysFromConfig: clearAll,\n }\n return value\n }, [\n defaultGateway,\n gatewayFromWalletError,\n gatewayFromConfigError,\n gateways,\n clearAll,\n ])\n\n return (\n <GatewayContext value={value}>\n <ErrorRender error={gatewayFromConfigError} />\n {children}\n </GatewayContext>\n )\n}\n", "import { ErrorRender } from '@xylabs/react-error'\nimport React, { useMemo } from 'react'\n\nimport { useGatewayFromWallet } from '../../hooks/index.ts'\nimport { GatewayContext } from '../GatewayContext.ts'\nimport type { GatewayProviderProps } from '../GatewayProviderProps.ts'\nimport type { GatewayContextState } from '../GatewayProviderState.ts'\n\n/**\n * Publishes a `GatewayContext` backed exclusively by the injected XL1 Wallet\n * extension (i.e. `globalThis.xyo`). This is the provider to use when the\n * host app is a browser UI that expects the user to bring their own wallet,\n * rather than running an in-page gateway.\n *\n * The requested `gatewayName` is forwarded to `useGatewayFromWallet`, whose\n * returned gateway uses a three-state contract (`undefined` = still\n * resolving, `null` = wallet confirmed absent / timed out,\n * `XyoGatewayRunner` = ready). That tri-state is passed through to\n * consumers unchanged as `defaultGateway` / `gateways.walletGateway`, so\n * downstream hooks can distinguish \"loading\" from \"missing\".\n *\n * The published `GatewayContextState` shape:\n * - `defaultGateway` \u2014 the wallet gateway, used when consumers don't\n * specify which gateway they want.\n * - `gateways.walletGateway` \u2014 same instance as `defaultGateway`.\n * - `gateways.inPageGateway` \u2014 always `null` here; this provider does not\n * stand up an in-page client. Pair with a different provider if you need\n * both.\n * - `error` \u2014 surfaced from `useGatewayFromWallet` (detection / timeout /\n * wallet errors). Also rendered inline via `ErrorRender` above `children`\n * so mount-time failures are visible even if no consumer reads `error`.\n * - `provided: true` \u2014 lets descendants detect that a real provider (not\n * the default empty context) is in the tree.\n *\n * The `defaultGateway`, `gateways`, and context `value` are memoized so\n * consumers only re-render when the underlying wallet gateway reference or\n * error actually changes.\n */\nexport const WalletGatewayProvider: React.FC<GatewayProviderProps> = ({ gatewayName, children }) => {\n const {\n gateway: gatewayFromWallet,\n error: gatewayFromWalletError,\n } = useGatewayFromWallet(gatewayName)\n\n const { defaultGateway, gateways } = useMemo(() => {\n return {\n defaultGateway: gatewayFromWallet,\n gateways: {\n inPageGateway: null,\n walletGateway: gatewayFromWallet,\n },\n }\n }, [gatewayFromWallet])\n\n const value = useMemo(() => {\n const value: GatewayContextState = {\n defaultGateway,\n error: gatewayFromWalletError,\n gateways,\n provided: true,\n }\n return value\n }, [\n defaultGateway,\n gatewayFromWalletError,\n gateways,\n ])\n\n return (\n <GatewayContext value={value}>\n <ErrorRender error={gatewayFromWalletError} />\n {children}\n </GatewayContext>\n )\n}\n", "import { useContextEx } from '@xylabs/react-shared'\n\nimport { GatewayContext } from './GatewayContext.ts'\nimport type { GatewayStateFields } from './GatewayProviderState.ts'\n\n/**\n * The sole consumer entry point for gateway state. Reads the nearest\n * `GatewayContext` in the tree, regardless of which provider published\n * it \u2014 this is the decoupling that lets a component work unchanged when\n * the surrounding app swaps `WalletGatewayProvider` for\n * `GatewayProvider` (or a test double).\n *\n * @param required - When `true` (default), throws if no gateway provider\n * is mounted above \u2014 use this when the component is meaningless\n * without a gateway. When `false`, returns default state (all fields\n * undefined) so the component can render a graceful fallback.\n */\nexport const useProvidedGateway = (required = true) => useContextEx<GatewayStateFields>(GatewayContext, 'Gateway', required)\n"],
5
- "mappings": "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",
6
- "names": ["Stack", "Typography", "isDefined", "isDefinedNotNull", "useEffect", "useState", "isUndefined", "isUndefined", "isDefined", "isDefined", "jsx", "jsxs", "useState", "isDefinedNotNull", "useEffect", "Stack", "isDefined", "Typography", "Alert", "Stack", "Typography", "ButtonEx", "ErrorRender", "isDefined", "isUndefined", "useEffect", "useCallback", "useState", "useState", "useCallback", "address", "jsx", "jsxs", "ButtonEx", "Alert", "Typography", "useEffect", "isDefined", "Stack", "isUndefined", "ErrorRender", "Alert", "Chip", "Divider", "Stack", "Typography", "ButtonEx", "ErrorRender", "usePromise", "isDefined", "isDefinedNotNull", "useState", "Alert", "Stack", "ButtonEx", "isDefined", "isDefinedNotNull", "useCallback", "useEffect", "useState", "Alert", "Stack", "Typography", "ButtonEx", "ErrorRender", "isDefined", "React", "jsx", "jsxs", "jsx", "jsxs", "useState", "useCallback", "isDefinedNotNull", "useEffect", "isDefined", "Stack", "Alert", "ButtonEx", "jsx", "jsxs", "Stack", "Typography", "Alert", "ButtonEx", "isDefined", "Chip", "ErrorRender", "useState", "usePromise", "isDefinedNotNull", "Divider", "Alert", "Stack", "Typography", "ButtonEx", "ErrorRender", "isDefined", "isDefinedNotNull", "useState", "jsx", "jsxs", "useState", "isDefinedNotNull", "Stack", "Alert", "ButtonEx", "Typography", "isDefined", "ErrorRender", "Stack", "TextField", "Typography", "useMemo", "useState", "jsx", "jsxs", "useState", "useMemo", "Stack", "TextField", "Typography", "Alert", "Stack", "Typography", "ButtonEx", "ErrorRender", "isDefined", "isDefinedNotNull", "useState", "jsx", "jsxs", "useState", "isDefinedNotNull", "Stack", "Alert", "ButtonEx", "Typography", "isDefined", "ErrorRender", "Alert", "Stack", "TextField", "Typography", "useMemo", "useState", "jsx", "jsxs", "buildDefaultPayload", "parsePayload", "useState", "useMemo", "Stack", "TextField", "Typography", "Alert", "Alert", "Stack", "Typography", "ButtonEx", "ErrorRender", "isDefined", "isDefinedNotNull", "useState", "jsx", "jsxs", "useState", "isDefinedNotNull", "Stack", "Alert", "ButtonEx", "isDefined", "Typography", "ErrorRender", "Divider", "Stack", "Typography", "FormControl", "InputLabel", "MenuItem", "Select", "Stack", "asSchema", "useMemo", "useState", "Alert", "Stack", "Typography", "ButtonEx", "ErrorRender", "isDefined", "isDefinedNotNull", "useState", "jsx", "jsxs", "useState", "isDefinedNotNull", "Stack", "Alert", "ButtonEx", "isDefined", "Typography", "ErrorRender", "jsx", "jsxs", "asSchema", "useState", "useMemo", "Stack", "FormControl", "InputLabel", "Select", "MenuItem", "jsx", "jsxs", "Stack", "Typography", "Divider", "Alert", "Chip", "Divider", "Stack", "Typography", "ButtonEx", "PopoverErrorRender", "assertEx", "isDefined", "isDefinedNotNull", "PayloadBuilder", "HashSchema", "SequenceNetwork", "useCallback", "useState", "jsx", "jsxs", "SequenceNetwork", "useState", "isDefinedNotNull", "useCallback", "assertEx", "PayloadBuilder", "isDefined", "HashSchema", "Stack", "Alert", "Typography", "Divider", "ButtonEx", "PopoverErrorRender", "Chip", "createContextEx", "DefaultNetworks", "useCallback", "useEffect", "useMemo", "useState", "assertEx", "isDefined", "network", "jsx", "useState", "useCallback", "useEffect", "DefaultNetworks", "useMemo", "value", "ErrorRender", "isDefinedNotNull", "isNull", "useMemo", "jsx", "jsxs", "useMemo", "isNull", "isDefinedNotNull", "value", "ErrorRender", "ErrorRender", "useMemo", "jsx", "jsxs", "useMemo", "value", "ErrorRender", "useContextEx", "useContextEx"]
3
+ "sources": ["../../../src/client/components/connected/account/Connected.tsx", "../../../src/client/components/connected/ApprovedLakeSelector.tsx", "../../../src/client/hooks/client/helpers/findCaveat.ts", "../../../src/client/hooks/client/useClientFromWallet.ts", "../../../src/client/hooks/helpers/getXyoClient.ts", "../../../src/client/hooks/client/permissions/usePermissions.ts", "../../../src/client/hooks/client/permissions/usePermissionsAccounts.ts", "../../../src/client/hooks/client/useGatewayFromWallet.ts", "../../../src/client/components/connected/AutoSignChainPanel.tsx", "../../../src/client/components/connected/RequestPermissionsButton.tsx", "../../../src/client/components/connected/PermissionsReviewDialog.tsx", "../../../src/client/components/connected/ConnectAccountsStack.tsx", "../../../src/client/components/connected/hooks/useConnectAccount.ts", "../../../src/client/components/connected/DataLakeAddToChainPanel.tsx", "../../../src/client/components/connected/DataLakeGetButton.tsx", "../../../src/client/components/connected/DataLakeGetPanel.tsx", "../../../src/client/components/connected/DataLakeInsertButton.tsx", "../../../src/client/components/connected/DataLakeInsertPanel.tsx", "../../../src/client/components/connected/DataLakeListButton.tsx", "../../../src/client/components/connected/DataLakeOperationsPanel.tsx", "../../../src/client/components/connected/DataLakeRequestAccessPanel.tsx", "../../../src/client/components/connected/DataLakeRequestAccessButton.tsx", "../../../src/client/components/connected/SignTransactionButton.tsx", "../../../src/client/context/GatewayContext.ts", "../../../src/client/context/in-page/InPageGatewaysContext.ts", "../../../src/client/context/in-page/Provider.tsx", "../../../src/client/context/in-page/lib/buildGateway.ts", "../../../src/client/context/in-page/useProvidedInPageGateways.ts", "../../../src/client/context/providers/GatewayProvider.tsx", "../../../src/client/context/providers/WalletGatewayProvider.tsx", "../../../src/client/context/useProvidedGateway.ts"],
4
+ "sourcesContent": ["import {\n Stack, Tooltip, Typography,\n} from '@mui/material'\nimport { EthAddressWrapper } from '@xylabs/eth-address'\nimport { BlockiesAvatarAddress } from '@xyo-network/xl1-blockies'\nimport React from 'react'\n\nexport const ConnectedAccount: React.FC<{ address: string }> = ({ address }) => {\n const shortenedAddress = `${EthAddressWrapper.fromString(address)?.toShortString(4)}`\n\n return (\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ alignItems: 'center' }}\n >\n <BlockiesAvatarAddress address={address} size={21} />\n <Tooltip title={address}>\n <Typography\n variant=\"caption\"\n sx={{\n color: 'text.secondary',\n fontFamily: 'monospace',\n }}\n >\n {shortenedAddress}\n </Typography>\n </Tooltip>\n </Stack>\n )\n}\n", "import {\n Alert, FormControl, InputLabel, MenuItem, Select, Stack, Typography,\n} from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { ErrorRender } from '@xylabs/react-error'\nimport { isDefined, isDefinedNotNull } from '@xylabs/sdk-js'\nimport type { ApprovedDataLake } from '@xyo-network/xl1-protocol-lib'\nimport React, {\n useCallback, useEffect, useState,\n} from 'react'\n\nimport { useClientFromWallet } from '../../hooks/index.ts'\n\nexport interface ApprovedLakeSelectorProps {\n /** Filter to lakes with this capability \u2014 `viewer` for read flows, `runner` for write flows. */\n capability: 'viewer' | 'runner'\n /** Label shown above the dropdown. */\n label?: string\n /** Called with the new selection when the user picks a lake. */\n onChange: (id: string) => void\n /** Currently selected per-origin lake id, or empty string for no selection. */\n selectedId: string\n timeout?: number\n}\n\n/**\n * Fetches `client.dataLakes.list()` from the wallet and renders a dropdown of\n * approved lakes filtered by the requested capability. Used by the Get and\n * Insert panels to let the user pick which lake to operate against without\n * needing to paste a per-origin id by hand.\n *\n * The dropdown labels each lake by its opaque per-origin id (the only handle\n * the page ever sees) plus its capability set as a small caption \u2014 names and\n * endpoints are redacted server-side.\n */\nexport const ApprovedLakeSelector: React.FC<ApprovedLakeSelectorProps> = ({\n selectedId, onChange, capability, timeout, label = 'Approved data lake',\n}) => {\n const {\n client, error: clientError, isLoading, timedout,\n } = useClientFromWallet(timeout)\n\n const [lakes, setLakes] = useState<ApprovedDataLake[]>()\n const [fetchError, setFetchError] = useState<Error>()\n const [refreshing, setRefreshing] = useState(false)\n\n const dataLakes = client?.dataLakes\n const supported = isDefinedNotNull(dataLakes)\n\n const refresh = useCallback(async () => {\n if (!isDefinedNotNull(dataLakes)) return\n setFetchError(undefined)\n setRefreshing(true)\n try {\n const result = await dataLakes.list()\n setLakes(result)\n } catch (e) {\n setFetchError(e as Error)\n } finally {\n setRefreshing(false)\n }\n }, [dataLakes])\n\n // Auto-fetch on first mount once the wallet client is available. The\n // setState calls happen inside the async `refresh()` callback, not\n // synchronously in the effect body, so the React 19 hooks rule's concern\n // about cascading renders doesn't apply here.\n useEffect(() => {\n if (supported && lakes === undefined && !refreshing) {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n void refresh()\n }\n }, [supported, lakes, refreshing, refresh])\n\n const filtered = (lakes ?? []).filter(lake => lake.capabilities.includes(capability))\n\n return (\n <Stack sx={{ gap: 1, width: '100%' }}>\n {timedout ? <Alert severity=\"warning\">Wallet not detected.</Alert> : null}\n {isDefinedNotNull(client) && !supported\n ? <Alert severity=\"warning\">This wallet does not expose `xyo.client.dataLakes`.</Alert>\n : null}\n {isDefined(lakes) && filtered.length === 0\n ? (\n <Alert severity=\"info\">\n No approved lakes with\n {' '}\n <strong>{capability}</strong>\n {' '}\n access. Run RequestAccess first.\n </Alert>\n )\n : null}\n <FormControl size=\"small\" fullWidth disabled={!supported || filtered.length === 0}>\n <InputLabel>{label}</InputLabel>\n <Select\n value={selectedId}\n label={label}\n onChange={event => onChange(event.target.value)}\n >\n {filtered.map(lake => (\n <MenuItem key={lake.id} value={lake.id}>\n <Stack sx={{ gap: 0.25, py: 0.5 }}>\n <Typography variant=\"body2\" sx={{ fontFamily: 'monospace', wordBreak: 'break-all' }}>\n {lake.id}\n </Typography>\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n {lake.capabilities.join(' + ')}\n </Typography>\n </Stack>\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n <Stack direction=\"row\" sx={{ gap: 1 }}>\n <ButtonEx\n variant=\"outlined\"\n size=\"small\"\n disabled={!supported || refreshing}\n busy={isLoading || refreshing}\n onClick={() => void refresh()}\n >\n Refresh\n </ButtonEx>\n {isDefined(lakes)\n ? (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary', alignSelf: 'center' }}>\n {lakes.length}\n {' '}\n approved\n {' '}\n \u00B7\n {' '}\n {filtered.length}\n {' '}\n with\n {' '}\n {capability}\n {' '}\n access\n </Typography>\n )\n : null}\n </Stack>\n <ErrorRender error={clientError ?? fetchError} scope=\"ApprovedLakeSelector\" />\n </Stack>\n )\n}\n", "import { isDefined } from '@xylabs/sdk-js'\nimport type {\n CaveatTypes, ParentCapability, XyoPermissions,\n} from '@xyo-network/xl1-sdk'\n\nexport const findCaveat = async (\n permissions: XyoPermissions,\n targetCapability: ParentCapability,\n targetCaveatType: CaveatTypes,\n) => {\n const existingPermissions = await permissions.getPermissions()\n if (isDefined(existingPermissions) && existingPermissions.length > 0) {\n const foundPermissions = existingPermissions\n .find(p => p.parentCapability === targetCapability)\n if (isDefined(foundPermissions)) {\n return foundPermissions.caveats?.find(caveat => caveat.type === targetCaveatType)?.value ?? []\n }\n }\n return existingPermissions\n}\n", "import { isUndefined } from '@xylabs/sdk-js'\nimport type { XyoClient } from '@xyo-network/xl1-sdk'\nimport { useEffect, useState } from 'react'\n\nimport { getXyoClient } from '../helpers/index.ts'\n\ninterface ClientState {\n client?: XyoClient | null\n error: Error | null\n isLoading: boolean\n timedout: boolean\n}\n\nconst initialState: ClientState = {\n client: undefined,\n error: null,\n isLoading: false,\n timedout: false,\n}\n\nexport const useClientFromWallet = (timeout?: number): ClientState => {\n const [state, setState] = useState<ClientState>(initialState)\n\n useEffect(() => {\n let cancelled = false\n\n const initialize = async () => {\n setState((prev) => {\n if (prev.isLoading) return prev\n return {\n ...prev, isLoading: true, error: null,\n }\n })\n\n try {\n const client = await getXyoClient(timeout)\n if (cancelled) return\n if (client === null) {\n setState({\n client: null, timedout: true, isLoading: false, error: null,\n })\n } else {\n setState({\n client, isLoading: false, error: null, timedout: false,\n })\n }\n } catch (error) {\n if (cancelled) return\n setState({\n client: undefined, isLoading: false, error: error as Error, timedout: false,\n })\n }\n }\n\n void initialize()\n\n // Late recovery: if wallet loads after timeout, update state\n const onPluginReady = () => {\n if (cancelled) return\n const client = isUndefined(globalThis.xyo) ? null : globalThis.xyo?.client ?? null\n setState({\n client, isLoading: false, timedout: false, error: null,\n })\n }\n globalThis.addEventListener('xyo:plugin-ready', onPluginReady)\n\n return () => {\n cancelled = true\n globalThis.removeEventListener('xyo:plugin-ready', onPluginReady)\n }\n }, [timeout])\n\n return state\n}\n\n/** @deprecated - use useClientFromWallet instead */\nexport const useClient = useClientFromWallet\n", "import { isUndefined } from '@xylabs/sdk-js'\nimport type { XyoClient } from '@xyo-network/xl1-sdk'\n\nconst CLIENT_LISTENER_TIMEOUT = 2000\n\nconst hasXyoClient = () => {\n return 'client' in globalThis.xyo\n}\n\nexport const listenForClientInjection = (onClientReady: () => void, timeout: number, onTimeout: () => void) => {\n let resolved = false\n const listener: EventListener = () => {\n onClientReady()\n resolved = true\n }\n globalThis.addEventListener('xyo:plugin-ready', listener)\n setTimeout(() => {\n if (!resolved) {\n globalThis.removeEventListener('xyo:plugin-ready', listener)\n onTimeout()\n }\n }, timeout)\n}\n\ntype ReturnType = XyoClient | undefined | null\n\nexport async function getXyoClient(timeout = CLIENT_LISTENER_TIMEOUT): Promise<ReturnType> {\n // if no xyo object, we can bail early\n if (isUndefined(globalThis.xyo)) {\n return null\n }\n return hasXyoClient()\n ? globalThis.xyo.client\n // listen for the XyoWallet to be injected\n : await new Promise<ReturnType>((resolve) => {\n listenForClientInjection(\n () => {\n resolve(globalThis.xyo.client)\n },\n timeout,\n () => {\n resolve(null)\n },\n )\n })\n}\n", "import { useClientFromWallet } from '../useClientFromWallet.ts'\n\nexport const usePermissions = () => {\n const {\n client, isLoading, error, timedout,\n } = useClientFromWallet()\n const permissions = client?.permissions\n return {\n permissions,\n isLoading,\n error,\n timedout,\n }\n}\n", "import { usePromise } from '@xylabs/react-promise'\nimport type { JsonValue } from '@xylabs/sdk-js'\nimport {\n isArray, isDefined, isDefinedNotNull, isString,\n} from '@xylabs/sdk-js'\n\nimport { findCaveat } from '../helpers/index.ts'\nimport { usePermissions } from './usePermissions.ts'\n\nconst validateRestrictedAccounts = (restrictedAccounts: JsonValue): readonly string [] => {\n if (isDefined(restrictedAccounts)) {\n if (isArray(restrictedAccounts) && restrictedAccounts.every(isString)) {\n return restrictedAccounts\n }\n throw new Error(\n `Unrecognized format for restrictReturnedAccounts caveat found on permissions. \\n\n Should be an array of strings: ${JSON.stringify(restrictedAccounts)}`,\n )\n }\n return []\n}\n\nexport const useAccountPermissions = () => {\n const { permissions, error } = usePermissions()\n\n return usePromise(async () => {\n if (isDefinedNotNull(error)) throw error\n if (isDefined(permissions)) {\n const restrictedAccounts = await findCaveat(\n permissions,\n // TODO - extract to constant in protocol package\n 'xyoWallet_getAccounts',\n 'restrictReturnedAccounts',\n )\n return validateRestrictedAccounts(restrictedAccounts)\n }\n }, [permissions])\n}\n", "import { isNull } from '@xylabs/sdk-js'\nimport type { GatewayName } from '@xyo-network/xl1-sdk'\n\nimport type { GatewayFromWallet } from '../../types/index.ts'\nimport { useClientFromWallet } from './useClientFromWallet.ts'\n\n/**\n * Resolves a gateway from the injected XL1 Wallet extension.\n *\n * The returned `gateway` uses a three-state contract:\n * - `undefined` \u2014 wallet detection is still in progress (isLoading=true),\n * or no gatewayName was provided. Consumers should treat this as \"not yet known\"\n * and avoid committing to either a present or absent UI state.\n * - `null` \u2014 wallet is definitively absent. Either globalThis.xyo was never set,\n * or detection timed out. Safe to show fallback UI (e.g. \"Get XL1 Wallet\").\n * A late-recovery listener may still transition this to a real gateway if\n * the extension loads after the timeout.\n * - `XyoGatewayRunner` \u2014 wallet is present and exposes this gateway for the\n * requested network. Ready to use for transactions and queries.\n */\nexport const useGatewayFromWallet = (gatewayName?: GatewayName, timeout?: number): GatewayFromWallet => {\n const {\n client, isLoading, error, timedout,\n } = useClientFromWallet(timeout)\n\n const resolveGateway = () => {\n // null client = wallet confirmed absent (no globalThis.xyo or timed out)\n if (isNull(client)) return null\n // client is undefined (still loading) or defined (wallet present) \u2014\n // optional chain returns undefined while loading, or the gateway if available\n return client?.gateways?.[gatewayName!]\n }\n\n return {\n // no gatewayName requested = undefined (opt-out, not \"absent\")\n gateway: gatewayName ? resolveGateway() : undefined,\n isLoading,\n error,\n timedout,\n }\n}\n\n/** @deprecated - useGatewayFromWallet */\nexport const useGateway = useGatewayFromWallet\n", "import { OpenInNew } from '@mui/icons-material'\nimport type { StackProps } from '@mui/material'\nimport {\n Alert, Chip, Divider, Link, Stack, Typography,\n} from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { ErrorRender } from '@xylabs/react-error'\nimport type { Hash } from '@xylabs/sdk-js'\nimport {\n isDefined, isDefinedNotNull, toHex,\n} from '@xylabs/sdk-js'\nimport type { Payload, Schema } from '@xyo-network/sdk-js'\nimport { asSchema, PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n GatewayName, NetworkId, PermissionRequest,\n} from '@xyo-network/xl1-sdk'\nimport { ExplorerLinks, SequenceNetwork } from '@xyo-network/xl1-sdk'\nimport React, {\n useCallback, useMemo, useState,\n} from 'react'\n\nimport { useClientFromWallet, useGatewayFromWallet } from '../../hooks/index.ts'\nimport { RequestPermissionsButton } from './RequestPermissionsButton.tsx'\n\n/**\n * Auto-sign caveat + method identifiers.\n *\n * These are intentionally string literals rather than SDK constants: the\n * auto-sign permission (`xyoSigner_signTransaction` gated by chain / signer /\n * schema-allowlist / expiration / gas-cap / tx-count caveats) currently lives\n * only in the XL1 Wallet extension's caveat registry \u2014 the protocol SDK's\n * `CaveatTypesZod` enum does not yet enumerate them. Sending them by name lets\n * a dApp exercise the wallet's auto-sign request/response cycle today; once the\n * SDK adopts the caveat types, swap these for the canonical constants.\n */\nconst SIGN_TRANSACTION_METHOD = 'xyoSigner_signTransaction'\nconst CAVEAT_CHAIN_ID = 'chainId'\nconst CAVEAT_SIGNER = 'signer'\nconst CAVEAT_SCHEMA_ALLOWLIST = 'schemaAllowlist'\nconst CAVEAT_EXPIRATION = 'expiration'\nconst CAVEAT_GAS_CAP = 'gasCap'\nconst CAVEAT_TX_COUNT_LIMIT = 'txCountLimit'\n\n/**\n * Signer-side grants that must be in place before auto-sign is requested:\n * `xyoWallet_getAccounts` + `xyoSigner_address` let the dApp resolve the\n * account it wants to pin the auto-sign grant to (the `signer` caveat) and\n * populate each transaction's `from` field.\n */\nconst SIGNER_PERMISSIONS: PermissionRequest[] = [\n { xyoWallet_getAccounts: { restrictReturnedAccounts: [] } },\n { xyoSigner_address: {} },\n]\n\n/** Default auto-sign budget: 1 XL1 (1e18 atto) \u2014 generous enough for a burst. */\nconst DEFAULT_GAS_CAP_ATTO = 10n ** 18n\n\n/** Default grant lifetime: 24h from grant time. */\nconst DEFAULT_TTL_MS = 24 * 60 * 60 * 1000\n\n/**\n * Real chain id for the Sequence (test) network \u2014 matches `SequenceNetwork.chain`\n * and the `bw.chain` the Sequence gateway stamps on every transaction. Used as a\n * definite string default (the bootstrap's `chain` field is optional, so it can't\n * be the literal default directly).\n */\nconst SEQUENCE_CHAIN_ID = '4b43a753c8024c0e5000e8ac948ac0063ac624bc'\n\n/** Default explorer base URL \u2014 the Sequence (test) explorer, matching the default gateway. */\nconst DEFAULT_EXPLORER_URL = 'https://beta.explore.xyo.network'\n\n/** Stable empty default \u2014 a fresh `[]` literal as a default prop re-renders forever. */\nconst EMPTY_RESULTS: TxAttempt[] = []\n\n/**\n * Default schema allowlist: the game content schema. The transaction references\n * the game payload directly (its hash + schema land in the bound witness's\n * `payload_schemas`), so the allowlist only needs the game pattern \u2014 there is no\n * separate on-chain anchor payload to allowlist. Module-level so the default\n * prop is referentially stable across renders.\n */\nconst DEFAULT_SCHEMA_PATTERNS: string[] = ['network.xyo.game.*']\n\ninterface TxAttempt {\n error?: string\n index: number\n txHash?: Hash\n}\n\ninterface AutoSignGrantArgs {\n address: string\n chainId: string\n expiresAt: number\n gasCapAtto: bigint\n maxTxCount: number\n patterns: string[]\n}\n\n/**\n * Build the auto-sign `PermissionRequest`. The `chainId` + `signer` caveats are\n * *capability* scoping (which chain / which account); `schemaAllowlist`,\n * `expiration`, `gasCap`, and `txCountLimit` are *policy* guardrails. Caps cross\n * the wire as hex atto-XL1 (the wallet decodes them with the protocol's hex\n * helpers); `spent` / `used` start at zero and are charged by the wallet.\n */\nfunction buildAutoSignRequest({\n address, chainId, expiresAt, gasCapAtto, maxTxCount, patterns,\n}: AutoSignGrantArgs): PermissionRequest {\n return {\n [SIGN_TRANSACTION_METHOD]: {\n [CAVEAT_CHAIN_ID]: { chainId },\n [CAVEAT_SIGNER]: { address },\n [CAVEAT_SCHEMA_ALLOWLIST]: { patterns },\n [CAVEAT_EXPIRATION]: { expiresAt },\n [CAVEAT_GAS_CAP]: { limit: toHex(gasCapAtto), spent: toHex(0n) },\n [CAVEAT_TX_COUNT_LIMIT]: { max: maxTxCount, used: 0 },\n },\n }\n}\n\ninterface FireSectionProps {\n attempts: TxAttempt[]\n burstSize: number\n canFire: boolean\n firing: boolean\n offChainSchema: string\n onFire: () => void\n /** Builds the explorer URL for a broadcast tx hash. */\n txUrl: (hash: Hash) => string\n}\n\n/**\n * Step 4: the burst trigger + per-attempt result chips. Extracted so the parent\n * stays below the project's max-complexity threshold (mirrors the section\n * components in `DataLakeAddToChainPanel`).\n */\nconst FireSection: React.FC<FireSectionProps> = ({\n attempts, burstSize, canFire, firing, offChainSchema, onFire, txUrl,\n}) => (\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">\n 4. Fire\n {' '}\n {burstSize}\n {' '}\n addPayloadsToChain call\n {burstSize === 1 ? '' : 's'}\n </Typography>\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n Each call signs a transaction that references a fresh\n {' '}\n <code>{offChainSchema}</code>\n {' '}\n payload (its hash + schema are committed in the signed bound witness). With\n a matching auto-sign grant in place these should complete with\n {' '}\n <strong>no wallet popup</strong>\n ; if a guardrail (schema / count / gas / expiry) denies a call, the wallet\n falls back to its normal Sign popup for that call.\n </Typography>\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!canFire}\n busy={firing}\n onClick={onFire}\n >\n Fire transactions\n </ButtonEx>\n {attempts.map(attempt => (\n <Stack\n key={attempt.index}\n direction=\"row\"\n sx={{\n alignItems: 'center', flexWrap: 'wrap', gap: 1,\n }}\n >\n <Chip\n label={`#${attempt.index + 1}`}\n size=\"small\"\n color={isDefined(attempt.error) ? 'error' : 'success'}\n />\n {isDefined(attempt.txHash)\n ? (\n <Link\n href={txUrl(attempt.txHash)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n variant=\"body2\"\n sx={{\n alignItems: 'center', display: 'inline-flex', gap: 0.5, fontFamily: 'monospace', wordBreak: 'break-all',\n }}\n >\n {attempt.txHash}\n <OpenInNew sx={{ fontSize: 14 }} />\n </Link>\n )\n : (\n <Typography variant=\"body2\" sx={{ color: 'error.main', wordBreak: 'break-all' }}>\n {attempt.error}\n </Typography>\n )}\n </Stack>\n ))}\n </Stack>\n)\n\nexport interface AutoSignChainPanelProps extends StackProps {\n /** How many `addPayloadsToChain` calls the burst fires. Defaults to 3. */\n burstSize?: number\n /**\n * Real chain id the grant's `chainId` caveat pins to. Must equal the chain the\n * gateway stamps on the transaction's bound witness (`bw.chain`), or auto-sign\n * silently falls back to the popup. Defaults to `SequenceNetwork.chain`\n * (`4b43a753c8024c0e5000e8ac948ac0063ac624bc`) \u2014 keep it in sync with\n * `gatewayName`.\n */\n chainId?: string\n /**\n * Explorer base URL used to build per-transaction links. Combined with\n * `gatewayName` (as the explorer's network id). Defaults to the Sequence\n * (test) explorer \u2014 keep it in sync with `gatewayName`.\n */\n explorerUrl?: string\n /** Gateway/network to build transactions against. Defaults to `SequenceNetwork.id`. */\n gatewayName?: GatewayName\n /**\n * Max number of auto-signed transactions the grant permits (the `txCountLimit`\n * caveat). Set below `burstSize` to exercise the count-limit fallback. Defaults\n * to 100.\n */\n maxTxCount?: number\n /**\n * Schema of the off-chain content payload anchored by each call. Set it outside\n * `schemaPatterns` to exercise the allowlist fallback. Defaults to\n * `network.xyo.game.move`.\n */\n offChainSchema?: string\n /**\n * Schema-allowlist patterns for the grant. Must cover *every* schema the\n * transaction's bound witness references; here that is just the off-chain\n * content schema, so the default is `['network.xyo.game.*']`. (The wallet\n * requires all `payload_schemas` to match \u2014 relevant if you add more payloads.)\n */\n schemaPatterns?: string[]\n /** Wallet-detection timeout, forwarded to the wallet hooks. */\n timeout?: number\n}\n\n/**\n * Manual Storybook harness for the XL1 Wallet's **auto-sign** permission, driven\n * end-to-end against a live extension:\n *\n * 1. **Grant signer + account access** \u2014 embedded {@link RequestPermissionsButton}\n * for `xyoWallet_getAccounts` + `xyoSigner_address` so the dApp can learn the\n * account to pin the auto-sign grant to.\n * 2. **Resolve account** \u2014 reads `gateway.signer.address()`; this becomes the\n * grant's `signer` caveat so the pin matches the `from` that\n * `addPayloadsToChain` will sign. The `chainId` caveat uses the real\n * `chainId` prop (`SequenceNetwork.chain` by default), which the gateway also\n * stamps as the transaction's `bw.chain`.\n * 3. **Grant auto-sign** \u2014 sends the `xyoSigner_signTransaction` request with the\n * chain / signer / schema-allowlist / expiration / gas-cap / tx-count caveats.\n * Approving it once authorizes the wallet to sign **and broadcast** conforming\n * transactions for this origin without a per-transaction popup.\n * 4. **Fire N addPayloadsToChain calls** \u2014 each signs a transaction that\n * references a fresh game payload (off-chain), so the bound witness commits\n * the payload's hash + schema. Conforming calls auto-sign silently; a call\n * that trips a guardrail falls back to the wallet's Sign popup. The tester\n * observes whether the popup appears (this is a manual harness \u2014 there is no\n * programmatic popup signal).\n *\n * No `network.xyo.hash` anchor is used: a bound witness already commits the\n * referenced payload's hash + schema on chain, so elevating a hash payload would\n * only re-commit the same hash under a different schema. The wallet matches the\n * allowlist against the bound witness's `payload_schemas`, which here is just the\n * game content schema (see `schemaPatterns`).\n */\n/** A resolved (present) wallet gateway \u2014 the non-null branch of `useGatewayFromWallet`. */\ntype ResolvedGateway = NonNullable<ReturnType<typeof useGatewayFromWallet>['gateway']>\n\n/**\n * Fire `burstSize` `addPayloadsToChain` calls sequentially, reporting the\n * running attempt list after each so the panel updates incrementally. Each call\n * references a fresh off-chain payload (no `network.xyo.hash` anchor \u2014 the bound\n * witness already commits the payload's hash + schema). Extracted from the\n * component so the latter stays under the project's max-complexity threshold.\n */\nasync function runBurst(\n gateway: ResolvedGateway,\n offChainSchema: string,\n burstSize: number,\n onProgress: (attempts: TxAttempt[]) => void,\n): Promise<void> {\n const schema: Schema = asSchema(offChainSchema, true)\n const collected: TxAttempt[] = []\n for (let index = 0; index < burstSize; index++) {\n try {\n // Fresh content per call (timestamp) \u2192 distinct content-address, so a\n // burst produces distinct transactions rather than a deduped no-op.\n const content: Payload = new PayloadBuilder({ schema }).fields({ move: index, ts: Date.now() }).build()\n const [txHash] = await gateway.addPayloadsToChain([], [content])\n collected.push({ index, txHash })\n } catch (e) {\n collected.push({ index, error: (e as Error).message })\n }\n onProgress([...collected])\n }\n}\n\nexport const AutoSignChainPanel: React.FC<AutoSignChainPanelProps> = ({\n burstSize = 3,\n chainId = SEQUENCE_CHAIN_ID,\n explorerUrl = DEFAULT_EXPLORER_URL,\n gatewayName = SequenceNetwork.id,\n maxTxCount = 100,\n offChainSchema = 'network.xyo.game.move',\n schemaPatterns = DEFAULT_SCHEMA_PATTERNS,\n timeout,\n ...props\n}) => {\n const { client, error: clientError } = useClientFromWallet(timeout)\n const {\n gateway, error: gatewayError, timedout,\n } = useGatewayFromWallet(gatewayName, timeout)\n\n const [resolvedAddress, setResolvedAddress] = useState<string>()\n const [resolving, setResolving] = useState(false)\n const [resolveError, setResolveError] = useState<Error>()\n\n const [granting, setGranting] = useState(false)\n const [grantError, setGrantError] = useState<Error>()\n const [granted, setGranted] = useState(false)\n\n const [firing, setFiring] = useState(false)\n const [attempts, setAttempts] = useState<TxAttempt[]>(EMPTY_RESULTS)\n\n const permissionsApi = client?.permissions\n\n // `GatewayName` is broader than `NetworkId`; the story-side default is always a\n // canonical network, so the cast is safe for documented usage (mirrors\n // `DataLakeAddToChainPanel`). A custom id still yields a syntactically valid URL.\n const explorer = useMemo(() => new ExplorerLinks(explorerUrl, gatewayName as NetworkId), [explorerUrl, gatewayName])\n\n const handleResolve = useCallback(async () => {\n if (!isDefinedNotNull(gateway)) return\n const signer = gateway.signer\n if (!isDefinedNotNull(signer)) return\n setResolveError(undefined)\n setResolving(true)\n try {\n setResolvedAddress(await signer.address())\n } catch (e) {\n setResolveError(e as Error)\n } finally {\n setResolving(false)\n }\n }, [gateway])\n\n const handleGrant = useCallback(async () => {\n if (!isDefinedNotNull(permissionsApi) || !isDefined(resolvedAddress)) return\n setGrantError(undefined)\n setGranting(true)\n try {\n await permissionsApi.requestPermissions([buildAutoSignRequest({\n address: resolvedAddress,\n chainId,\n expiresAt: Date.now() + DEFAULT_TTL_MS,\n gasCapAtto: DEFAULT_GAS_CAP_ATTO,\n maxTxCount,\n patterns: schemaPatterns,\n })])\n setGranted(true)\n } catch (e) {\n setGrantError(e as Error)\n } finally {\n setGranting(false)\n }\n }, [permissionsApi, resolvedAddress, chainId, maxTxCount, schemaPatterns])\n\n const handleFire = useCallback(async () => {\n if (!isDefinedNotNull(gateway)) return\n setFiring(true)\n setAttempts(EMPTY_RESULTS)\n try {\n await runBurst(gateway, offChainSchema, burstSize, setAttempts)\n } finally {\n setFiring(false)\n }\n }, [gateway, burstSize, offChainSchema])\n\n const canResolve = isDefinedNotNull(gateway) && !resolving\n const canGrant = isDefinedNotNull(permissionsApi) && isDefined(resolvedAddress) && !granting\n const canFire = isDefinedNotNull(gateway) && isDefined(resolvedAddress) && !firing\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 3,\n alignItems: 'stretch',\n ...props.sx,\n }}\n >\n {timedout\n ? <Alert severity=\"warning\">Wallet not detected.</Alert>\n : null}\n\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">1. Grant signer + account access</Typography>\n <RequestPermissionsButton permissions={SIGNER_PERMISSIONS} timeout={timeout} />\n </Stack>\n\n <Divider />\n\n <Stack sx={{ gap: 1, alignItems: 'start' }}>\n <Typography variant=\"subtitle2\">2. Resolve account</Typography>\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!canResolve}\n busy={resolving}\n onClick={() => void handleResolve()}\n >\n Resolve account\n </ButtonEx>\n {isDefined(resolvedAddress)\n ? (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n Account:\n {' '}\n <code>{resolvedAddress}</code>\n </Typography>\n )\n : null}\n <ErrorRender error={resolveError} scope=\"AutoSignChainPanel.resolve\" />\n </Stack>\n\n <Divider />\n\n <Stack sx={{ gap: 1, alignItems: 'start' }}>\n <Typography variant=\"subtitle2\">3. Grant auto-sign</Typography>\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n Pins the grant to the resolved account on chain\n {' '}\n <code>{chainId}</code>\n , allowlists\n {' '}\n <code>{schemaPatterns.join(', ')}</code>\n , and caps it at\n {' '}\n {maxTxCount}\n {' '}\n tx, 1 XL1 gas, 24h.\n </Typography>\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!canGrant}\n busy={granting}\n onClick={() => void handleGrant()}\n >\n Grant auto-sign\n </ButtonEx>\n {granted\n ? <Chip label=\"Auto-sign granted\" size=\"small\" color=\"success\" />\n : null}\n <ErrorRender error={grantError} scope=\"AutoSignChainPanel.grant\" />\n </Stack>\n\n <Divider />\n\n <FireSection\n attempts={attempts}\n burstSize={burstSize}\n canFire={canFire}\n firing={firing}\n offChainSchema={offChainSchema}\n onFire={() => void handleFire()}\n txUrl={hash => explorer.transaction(hash)}\n />\n\n <ErrorRender error={clientError ?? gatewayError} scope=\"AutoSignChainPanel.wallet\" />\n </Stack>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport { Alert, Stack } from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { PopoverErrorRender } from '@xylabs/react-error'\nimport { isDefined, isDefinedNotNull } from '@xylabs/sdk-js'\nimport type { InvokerPermission, PermissionRequest } from '@xyo-network/xl1-protocol-lib'\nimport React, {\n useCallback, useEffect, useState,\n} from 'react'\n\nimport { useClientFromWallet } from '../../hooks/index.ts'\nimport { PermissionsReviewDialog } from './PermissionsReviewDialog.tsx'\n\nexport interface RequestPermissionsButtonProps extends StackProps {\n permissions: PermissionRequest[]\n timeout?: number\n}\n\n/**\n * Two-mode entry point for `client.permissions`:\n *\n * - If the origin has no permissions on file (fresh load, or just revoked),\n * the button reads \"Request permissions\" and calls\n * `client.permissions.requestPermissions(permissions)` on click, opening\n * the wallet's consent popup.\n * - If permissions already exist for this origin, the button flips to\n * \"Review permissions\" and opens a read-only dialog enumerating each\n * grant. The dialog also surfaces a \"Re-request permissions\" action\n * that re-runs the same `permissions` batch verbatim \u2014 letting the\n * wallet's request handler decide what merges with the existing grants\n * (data-lake caveats append, account caveats union, etc.) instead of\n * trying to compute a client-side diff that would drift out of sync.\n *\n * Successful requests don't render any inline ack list \u2014 the review dialog\n * (reached via the button's \"Review permissions\" mode) is the single\n * source of truth for what the origin has been granted.\n *\n * The initial existing-permissions fetch happens on mount via\n * `client.permissions.getPermissions()`, then refreshes after every successful\n * `requestPermissions` round-trip so the dialog reflects the new state.\n */\nexport const RequestPermissionsButton: React.FC<RequestPermissionsButtonProps> = ({\n permissions, timeout, ...props\n}) => {\n const {\n client, error: clientError, isLoading, timedout,\n } = useClientFromWallet(timeout)\n\n const [granted, setGranted] = useState<InvokerPermission[]>()\n const [fetchError, setFetchError] = useState<Error>()\n const [requestError, setRequestError] = useState<Error>()\n const [requesting, setRequesting] = useState(false)\n const [dialogOpen, setDialogOpen] = useState(false)\n\n const permissionsApi = client?.permissions\n\n const refreshGranted = useCallback(async () => {\n if (!isDefinedNotNull(permissionsApi)) return\n setFetchError(undefined)\n try {\n const result = await permissionsApi.getPermissions()\n setGranted(result ?? [])\n } catch (e) {\n // Still mark granted as known (empty) so the button enables in request\n // mode. Otherwise a `getPermissions` failure permanently locks the\n // button and the user can't recover by retrying the request.\n setGranted([])\n setFetchError(e as Error)\n }\n }, [permissionsApi])\n\n // Fetch existing permissions as soon as the wallet client is available.\n // Mirrors the lazy-load pattern in `ApprovedLakeSelector` \u2014 only fires once\n // the client resolves, only once per mount.\n useEffect(() => {\n if (isDefinedNotNull(permissionsApi) && granted === undefined) {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n void refreshGranted()\n }\n }, [permissionsApi, granted, refreshGranted])\n\n const requestPermissions = useCallback(async () => {\n if (!isDefinedNotNull(permissionsApi)) return\n setRequestError(undefined)\n setRequesting(true)\n try {\n await permissionsApi.requestPermissions(permissions)\n // Refresh so the review dialog reflects the new grants. The acks\n // returned by `requestPermissions` are intentionally discarded \u2014 the\n // dialog renders the full `getPermissions()` result instead, which is\n // a strict superset (existing grants + new acks merged by the wallet).\n void refreshGranted()\n } catch (e) {\n setRequestError(e as Error)\n } finally {\n setRequesting(false)\n }\n }, [permissionsApi, permissions, refreshGranted])\n\n const hasGranted = isDefined(granted) && granted.length > 0\n\n const handleClick = () => {\n if (hasGranted) {\n setDialogOpen(true)\n return\n }\n void requestPermissions()\n }\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 2,\n alignItems: 'start',\n ...props.sx,\n }}\n >\n {timedout\n ? <Alert severity=\"warning\">Wallet not detected.</Alert>\n : null}\n <Stack direction=\"row\" sx={{ gap: 1, alignItems: 'center' }}>\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!isDefinedNotNull(permissionsApi) || requesting}\n busy={isLoading || requesting}\n onClick={handleClick}\n >\n {hasGranted\n ? 'Review permissions'\n : (\n <>\n Request\n {' '}\n {permissions.length}\n {' '}\n permission\n {permissions.length === 1 ? '' : 's'}\n </>\n )}\n </ButtonEx>\n <PopoverErrorRender error={clientError ?? fetchError ?? requestError} scope=\"RequestPermissionsButton\" />\n </Stack>\n <PermissionsReviewDialog\n open={dialogOpen}\n onClose={() => setDialogOpen(false)}\n granted={granted ?? []}\n onReRequest={() => void requestPermissions()}\n requesting={requesting}\n error={requestError}\n />\n </Stack>\n )\n}\n", "import {\n Alert, Box, Chip, Dialog, DialogActions, DialogContent, DialogTitle,\n Divider, Stack, Typography,\n} from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { ErrorRender } from '@xylabs/react-error'\nimport { isDefined } from '@xylabs/sdk-js'\nimport type { Caveats, InvokerPermission } from '@xyo-network/xl1-protocol-lib'\nimport React from 'react'\n\nexport interface PermissionsReviewDialogProps {\n /** The error (if any) from the most recent re-request attempt. */\n error?: Error\n /** Permissions already granted to this origin (from `client.permissions.getPermissions()`). */\n granted: InvokerPermission[]\n /** Close the dialog without taking any action. */\n onClose: () => void\n /**\n * Re-run `client.permissions.requestPermissions(...)` against the same\n * batch the parent `RequestPermissionsButton` was configured with. The\n * dialog doesn't try to compute what's \"new\" vs \"already granted\" \u2014\n * the wallet's request handler is the source of truth for that, and any\n * inferred diff here would drift out of sync with caveat-merge rules\n * upstream (e.g. data-lake's append-on-merge). Sending the original\n * batch and letting the wallet decide keeps the behavior consistent.\n */\n onReRequest: () => void\n open: boolean\n /** True while the re-request call is in flight. */\n requesting: boolean\n}\n\nconst renderCaveatValue = (caveat: Caveats): React.ReactNode => {\n // restrictReturnedAccounts is the only caveat whose value is a flat string[];\n // render addresses as chips. Empty list means \"all accounts the user picks\".\n if (caveat.type === 'restrictReturnedAccounts' && Array.isArray(caveat.value)) {\n if (caveat.value.length === 0) {\n return (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n (no address restriction \u2014 every selected account is returned)\n </Typography>\n )\n }\n return (\n <Stack direction=\"row\" sx={{ flexWrap: 'wrap', gap: 0.5 }}>\n {caveat.value.map(address => (\n <Chip\n key={String(address)}\n label={String(address)}\n size=\"small\"\n sx={{ fontFamily: 'monospace' }}\n />\n ))}\n </Stack>\n )\n }\n\n // dataLakeAccess stores `{ lakeId, perOriginId, narrowedSchemas? }` per\n // granted lake. Show the page-visible perOriginId prominently \u2014 that's the\n // handle the dApp uses when calling `get` / `insert` \u2014 and the narrowed\n // schemas (if any) as chips. Hide lakeId: it's an internal wallet handle the\n // page never sees in normal RPC traffic.\n if (caveat.type === 'dataLakeAccess' && typeof caveat.value === 'object' && caveat.value !== null) {\n const value = caveat.value as { lakeId?: string; narrowedSchemas?: string[]; perOriginId?: string }\n return (\n <Stack sx={{ gap: 0.5 }}>\n {isDefined(value.perOriginId)\n ? (\n <Stack direction=\"row\" sx={{ alignItems: 'center', gap: 1 }}>\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>id:</Typography>\n <Typography variant=\"body2\" sx={{ fontFamily: 'monospace', wordBreak: 'break-all' }}>\n {value.perOriginId}\n </Typography>\n </Stack>\n )\n : null}\n {isDefined(value.narrowedSchemas) && value.narrowedSchemas.length > 0\n ? (\n <Stack\n direction=\"row\"\n sx={{\n alignItems: 'center', flexWrap: 'wrap', gap: 0.5,\n }}\n >\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>schemas:</Typography>\n {value.narrowedSchemas.map(schema => (\n <Chip\n key={schema}\n label={schema}\n size=\"small\"\n variant=\"outlined\"\n />\n ))}\n </Stack>\n )\n : null}\n </Stack>\n )\n }\n\n // Unknown / opaque caveat shape \u2014 fall through to a compact JSON dump so the\n // user at least sees what was stored.\n return (\n <Typography\n component=\"pre\"\n variant=\"body2\"\n sx={{\n fontFamily: 'monospace', m: 0, whiteSpace: 'pre-wrap', wordBreak: 'break-all',\n }}\n >\n {JSON.stringify(caveat.value, null, 2)}\n </Typography>\n )\n}\n\nconst renderPermission = (permission: InvokerPermission): React.ReactNode => {\n const caveats = permission.caveats ?? []\n return (\n <Stack sx={{ gap: 1 }}>\n <Stack\n direction=\"row\"\n sx={{\n alignItems: 'center', flexWrap: 'wrap', gap: 1,\n }}\n >\n <Typography variant=\"subtitle2\" sx={{ fontFamily: 'monospace' }}>\n {permission.parentCapability}\n </Typography>\n {isDefined(permission.date)\n ? (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n granted\n {' '}\n {new Date(permission.date).toLocaleString()}\n </Typography>\n )\n : null}\n </Stack>\n {caveats.length === 0\n ? (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n (no caveats)\n </Typography>\n )\n : (\n <Stack sx={{ gap: 1, pl: 1 }}>\n {caveats.map(caveat => (\n <Stack key={caveat.type} sx={{ gap: 0.5 }}>\n <Chip label={caveat.type} size=\"small\" sx={{ alignSelf: 'flex-start' }} />\n <Box sx={{ pl: 1 }}>\n {renderCaveatValue(caveat)}\n </Box>\n </Stack>\n ))}\n </Stack>\n )}\n </Stack>\n )\n}\n\n/**\n * Read-only review of an origin's currently granted permissions, with a\n * single \"Re-request permissions\" action that re-runs the parent's original\n * `requestPermissions(...)` batch verbatim.\n *\n * Deliberately does **not** compute an \"additional\" diff. The wallet's\n * request handler owns the merge rules (e.g. data-lake caveats append while\n * `restrictReturnedAccounts` unions), and any client-side diff would drift\n * out of sync the moment those rules change. Sending the original batch is\n * also what the user expects: \"I want to ask for the same thing again.\"\n *\n * The dialog is intentionally permissive about caveat shape: it special-cases\n * the two caveats with structured payloads (`restrictReturnedAccounts`,\n * `dataLakeAccess`) and falls through to a pretty-printed JSON dump for\n * anything else, so newly-added caveat types render without code changes.\n */\nexport const PermissionsReviewDialog: React.FC<PermissionsReviewDialogProps> = ({\n granted, onClose, onReRequest, open, requesting, error,\n}) => {\n return (\n <Dialog open={open} onClose={onClose} fullWidth maxWidth=\"sm\">\n <DialogTitle>Granted permissions</DialogTitle>\n <DialogContent dividers>\n <Stack sx={{ gap: 2 }}>\n {granted.length === 0\n ? <Alert severity=\"info\">No permissions are currently granted to this origin.</Alert>\n : granted.map((permission, index) => (\n <React.Fragment key={permission.parentCapability}>\n {index > 0 ? <Divider /> : null}\n {renderPermission(permission)}\n </React.Fragment>\n ))}\n <ErrorRender error={error} scope=\"PermissionsReviewDialog\" />\n </Stack>\n </DialogContent>\n <DialogActions>\n <ButtonEx variant=\"text\" size=\"small\" onClick={onClose}>\n Close\n </ButtonEx>\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={requesting}\n busy={requesting}\n onClick={onReRequest}\n >\n Re-request permissions\n </ButtonEx>\n </DialogActions>\n </Dialog>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport {\n Alert, AlertTitle, Button, Stack,\n Typography,\n} from '@mui/material'\nimport type { ButtonExProps } from '@xylabs/react-button'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { ErrorRender } from '@xylabs/react-error'\nimport { isDefined, isUndefined } from '@xylabs/sdk-js'\nimport type { XyoAddress } from '@xyo-network/address'\nimport type { ComponentType, MouseEventHandler } from 'react'\nimport React, { useEffect } from 'react'\n\nimport { ConnectedAccount } from './account/index.ts'\nimport { useConnectAccount } from './hooks/index.ts'\n\nconst DefaultConnectComponent: React.FC<ButtonExProps> = props => (\n <ButtonEx variant=\"contained\" size=\"small\" {...props} />\n)\n\nconst DefaultNoWalletInstalledComponent: React.FC = () => (\n <Alert severity=\"warning\">\n <AlertTitle>XL1 Wallet Not Found</AlertTitle>\n <Typography gutterBottom>\n Please ensure that your XL1 Wallet is installed to connect your account.\n </Typography>\n <Button\n sx={{ display: 'flex', justifySelf: 'end' }}\n size=\"small\"\n variant=\"outlined\"\n href=\"https://chromewebstore.google.com/detail/xl1-wallet/fblbagcjeigmhakkfgjpdlcapcgmcfbm\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Get XL1 Wallet\n </Button>\n </Alert>\n)\n\nexport interface ConnectClientAccountsStackProps extends StackProps {\n AccountComponent?: ComponentType<{ account?: string }>\n ConnectComponent?: ComponentType<{ onClick?: MouseEventHandler<HTMLElement> }>\n NoWalletInstalledComponent?: ComponentType\n onAccountConnected?: (account: XyoAddress) => void\n onCancel?: () => void\n timeout?: number\n}\n\n/**\n * Renders a horizontal stack that surfaces the current state of the user's\n * connection to an XL1 wallet (e.g. the XL1 Chrome extension) and lets them\n * kick off a connection.\n *\n * Connection state is derived from `useConnectAccount`, which wraps\n * `useGatewayFromWallet` (wallet/gateway discovery with a configurable\n * `timeout`) and `useAccountPermissions` (already-authorized addresses).\n * The hook returns: `address` (resolved once the wallet exposes one),\n * `connectSigner` (prompts the wallet for an address), `timedout` (the\n * gateway never appeared within `timeout`), and `error` (the first of\n * gateway, permissions, or signer-connect failures).\n *\n * The component renders exactly one of the following wallet states, plus\n * an always-present error slot:\n *\n * - **Connected** \u2014 `address` is defined: renders `AccountComponent` for\n * that address. Also fires `onAccountConnected(address)` once via effect.\n * - **Disconnected, wallet available** \u2014 no `address` and not `timedout`:\n * renders `ConnectComponent` as a \"Connect\" button that invokes\n * `connectSigner()`. This covers both \"wallet installed but no account\n * authorized yet\" and \"gateway still resolving\".\n * - **Wallet missing / unreachable** \u2014 no `address` and `timedout` is true:\n * renders `NoWalletInstalledComponent` (defaults to an Alert linking to\n * the XL1 Wallet Chrome Web Store listing).\n * - **Error** \u2014 any error from the hook is rendered via `ErrorRender`\n * alongside the state above, and `onCancel()` is fired once via effect\n * so the host UI can close/abort its connect flow.\n *\n * All three slot components (`AccountComponent`, `ConnectComponent`,\n * `NoWalletInstalledComponent`) are injectable so consumers can restyle\n * any state without forking this component.\n */\nexport const ConnectAccountsStack: React.FC<ConnectClientAccountsStackProps> = ({\n AccountComponent = ConnectedAccount,\n ConnectComponent = DefaultConnectComponent,\n NoWalletInstalledComponent = DefaultNoWalletInstalledComponent,\n onAccountConnected,\n onCancel,\n timeout,\n ...props\n}) => {\n const {\n address, connectSigner, error, timedout,\n } = useConnectAccount(undefined, timeout)\n\n useEffect(() => {\n if (isDefined(error) && isDefined(onCancel)) {\n onCancel()\n }\n }, [error, onCancel])\n\n useEffect(() => {\n if (isDefined(address) && isDefined(onAccountConnected)) {\n onAccountConnected(address)\n }\n }, [address, onAccountConnected])\n\n return (\n <Stack\n direction=\"row\"\n spacing={2}\n {...props}\n sx={{ alignItems: 'start', ...props.sx }}\n >\n {isDefined(address)\n ? <AccountComponent address={address} />\n : null}\n {isUndefined(address) && !timedout\n ? (\n <ConnectComponent onClick={() => void connectSigner()}>Connect</ConnectComponent>\n )\n : null}\n {isUndefined(address) && timedout\n ? (\n <NoWalletInstalledComponent />\n )\n : null}\n <ErrorRender error={error} scope=\"ConnectSigner:error\" />\n </Stack>\n )\n}\n", "import { asAddress, assertEx } from '@xylabs/sdk-js'\nimport type { XyoAddress } from '@xyo-network/address'\nimport type { GatewayName } from '@xyo-network/xl1-sdk'\nimport { MainNetwork } from '@xyo-network/xl1-sdk'\nimport { useCallback, useState } from 'react'\n\nimport { useAccountPermissions, useGatewayFromWallet } from '../../../hooks/index.ts'\n\nexport const useConnectAccount = (gatewayName: GatewayName = MainNetwork.id, timeout?: number) => {\n const [connectError, setConnectError] = useState<Error>()\n\n const {\n gateway, error, timedout,\n } = useGatewayFromWallet(gatewayName, timeout)\n\n const [accountPermissions, accountPermissionsError] = useAccountPermissions()\n\n const [address, setAddress] = useState<XyoAddress>()\n\n const connectSigner = useCallback(async () => {\n try {\n setConnectError(undefined)\n const assertedGateway = assertEx(gateway, () => `Gateway ${gatewayName} is not available`)\n const signer = assertedGateway.signer\n const address = await signer.address()\n setAddress(address)\n return address\n } catch (e) {\n setConnectError(e as Error)\n }\n }, [gateway, gatewayName])\n\n return {\n address: asAddress(accountPermissions?.[0] ?? address), connectSigner, error: error ?? accountPermissionsError ?? connectError, gateway, timedout,\n }\n}\n", "import { OpenInNew } from '@mui/icons-material'\nimport type { StackProps } from '@mui/material'\nimport {\n Alert, Chip, Divider, Link, Stack, TextField, Typography,\n} from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { ErrorRender } from '@xylabs/react-error'\nimport { usePromise } from '@xylabs/react-promise'\nimport type { Hash } from '@xylabs/sdk-js'\nimport { isDefined, isDefinedNotNull } from '@xylabs/sdk-js'\nimport type { Payload, Schema } from '@xyo-network/sdk-js'\nimport {\n asSchema, isAnyPayload, PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport type {\n DataLakeData, GatewayName, HashPayload,\n NetworkId, PermissionRequest, SignedHydratedTransactionWithHashMeta,\n} from '@xyo-network/xl1-sdk'\nimport {\n DataLakesGetMethod, DataLakesInsertMethod,\n ExplorerLinks, HashSchema, SequenceNetwork,\n} from '@xyo-network/xl1-sdk'\nimport React, { useMemo, useState } from 'react'\n\nimport { useClientFromWallet, useGatewayFromWallet } from '../../hooks/index.ts'\nimport { ApprovedLakeSelector } from './ApprovedLakeSelector.tsx'\nimport { RequestPermissionsButton } from './RequestPermissionsButton.tsx'\n\n/** Default base URL for the production XL1 explorer. */\nconst DEFAULT_EXPLORER_URL = 'https://explore.xyo.network'\n\n/** Default test payload schema. */\nconst DEFAULT_PAYLOAD_SCHEMA: Schema = asSchema('network.xyo.observation.v2', true)\n\n/**\n * Permissions the panel asks for in a single consent popup:\n *\n * - `xyoWallet_getAccounts` + `xyoSigner_address` \u2014 signer-side grants\n * needed by `gateway.addPayloadsToChain`, which reads the signer's\n * address to populate the transaction's `from` field. Empty\n * `restrictReturnedAccounts` lets the user pick which accounts to\n * share at consent time. (Per-transaction `xyoSigner_signTransaction`\n * and `xyoRunner_broadcastTransaction` aren't EIP-2255-permissioned\n * in the wallet's registry \u2014 the wallet shows its own confirm UI on\n * each call.)\n * - `xyoDataLakes_get` + `xyoDataLakes_insert` \u2014 data-lake grants. Read\n * is requested alongside write even though this flow only inserts,\n * so a later \"verify via Get\" follow-up doesn't need a second\n * consent round.\n */\nconst PANEL_PERMISSIONS: PermissionRequest[] = [\n { xyoWallet_getAccounts: { restrictReturnedAccounts: [] } },\n { xyoSigner_address: {} },\n { [DataLakesGetMethod]: { dataLakeAccess: {} } },\n { [DataLakesInsertMethod]: { dataLakeAccess: {} } },\n]\n\n/**\n * Build a fresh default payload each mount. The ISO timestamp gives every\n * mount its own content-address, so a tester clicking Insert twice from a\n * fresh panel mount sees two distinct hashes \u2014 easier to verify in a\n * round-trip with the Get panel or the chain explorer.\n */\nasync function buildDefaultPayload(schema: Schema): Promise<string> {\n const builder = new PayloadBuilder({ schema }).fields({ value: 1 })\n const payload = builder.build()\n return JSON.stringify(payload, null, 2)\n}\n\ninterface ParseSuccess {\n ok: true\n payload: DataLakeData\n}\n\ninterface ParseFailure {\n error: string\n ok: false\n}\n\ntype ParseResult = ParseSuccess | ParseFailure\n\n/**\n * Parse the textarea content into a single `DataLakeData`. Unlike the\n * insert panel (which accepts a JSON array), this flow only writes one\n * payload at a time because the on-chain `HashPayload` we follow it with\n * references exactly one hash.\n */\nfunction parsePayload(raw: string): ParseResult {\n const trimmed = raw.trim()\n if (trimmed.length === 0) return { ok: false, error: 'Payload is empty.' }\n try {\n const parsed = JSON.parse(trimmed) as unknown\n if (Array.isArray(parsed)) {\n if (parsed.length === 1) return { ok: true, payload: parsed[0] as DataLakeData }\n return { ok: false, error: 'Provide a single payload object (this flow chains one payload onto the chain at a time).' }\n }\n if (parsed !== null && typeof parsed === 'object') return { ok: true, payload: parsed as DataLakeData }\n return { ok: false, error: 'Payload must be a JSON object.' }\n } catch (e) {\n return { ok: false, error: `Invalid JSON: ${(e as Error).message}` }\n }\n}\n\ninterface TestPayloadSectionProps {\n onChange: (value: string) => void\n parse: ParseResult\n value: string\n}\n\n/**\n * Step 2: JSON textarea + parse-status caption / error alert. Extracted\n * so the parent panel doesn't need to carry the textarea + parse branches\n * inline (keeps the main component's cyclomatic complexity manageable).\n */\nconst TestPayloadSection: React.FC<TestPayloadSectionProps> = ({\n onChange, parse, value,\n}) => (\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">2. Test payload</Typography>\n <TextField\n label=\"Payload (single JSON object)\"\n value={value}\n onChange={e => onChange(e.target.value)}\n multiline\n minRows={6}\n maxRows={16}\n size=\"small\"\n slotProps={{ input: { sx: { fontFamily: 'monospace', fontSize: 12 } } }}\n />\n {parse.ok\n ? (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n Parsed payload \u2014 schema:\n {' '}\n <code>{(parse.payload as { schema?: string }).schema ?? '(none)'}</code>\n </Typography>\n )\n : (\n <Alert severity=\"error\" variant=\"outlined\">\n <Typography variant=\"body2\">{parse.error}</Typography>\n </Alert>\n )}\n </Stack>\n)\n\ninterface InsertSectionProps {\n canInsert: boolean\n insertError: Error | undefined\n inserting: boolean\n onInsert: () => void\n onLakeChange: (id: string) => void\n selectedLakeId: string\n storedHash: Hash | undefined\n timeout?: number\n}\n\n/**\n * Step 3: lake picker + insert button + the result chip. Owning the\n * post-insert chip block here keeps the parent component below the\n * project's max-complexity threshold.\n */\nconst InsertSection: React.FC<InsertSectionProps> = ({\n canInsert, inserting, insertError, onInsert, onLakeChange,\n selectedLakeId, storedHash, timeout,\n}) => (\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">3. Insert into runner lake</Typography>\n <ApprovedLakeSelector\n capability=\"runner\"\n selectedId={selectedLakeId}\n onChange={onLakeChange}\n timeout={timeout}\n />\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!canInsert}\n busy={inserting}\n onClick={onInsert}\n >\n Insert into lake\n </ButtonEx>\n {isDefined(storedHash)\n ? (\n <Stack\n direction=\"row\"\n sx={{\n alignItems: 'center', flexWrap: 'wrap', gap: 1,\n }}\n >\n <Chip label=\"Stored\" size=\"small\" color=\"success\" />\n <Typography variant=\"body2\" sx={{ fontFamily: 'monospace', wordBreak: 'break-all' }}>\n {storedHash}\n </Typography>\n </Stack>\n )\n : null}\n <ErrorRender error={insertError} scope=\"DataLakeAddToChainPanel.insert\" />\n </Stack>\n)\n\ninterface AddToChainSectionProps {\n addingToChain: boolean\n canAddToChain: boolean\n chainError: Error | undefined\n explorerTxUrl: string | undefined\n gatewayName: GatewayName\n onAddToChain: () => void\n signedTx: SignedHydratedTransactionWithHashMeta | undefined\n txHash: Hash | undefined\n}\n\n/**\n * Step 4: add-to-chain button + the tx-submitted card with the explorer\n * link. Same complexity-reduction motivation as the other section\n * components; also makes the success-state rendering a single tightly\n * scoped chunk to read.\n */\nconst AddToChainSection: React.FC<AddToChainSectionProps> = ({\n addingToChain, canAddToChain, chainError, explorerTxUrl, gatewayName,\n onAddToChain, signedTx, txHash,\n}) => (\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">4. Add HashPayload to chain</Typography>\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n References the lake-stored payload via\n {' '}\n <code>network.xyo.hash</code>\n ; the payload itself rides along as the `offChain` argument.\n </Typography>\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!canAddToChain}\n busy={addingToChain}\n onClick={onAddToChain}\n >\n Add to chain\n </ButtonEx>\n {isDefined(txHash) && isDefined(explorerTxUrl)\n ? (\n <Stack sx={{ gap: 0.5 }}>\n <Stack\n direction=\"row\"\n sx={{\n alignItems: 'center', flexWrap: 'wrap', gap: 1,\n }}\n >\n <Chip label=\"Submitted\" size=\"small\" color=\"success\" />\n <Typography variant=\"body2\" sx={{ fontFamily: 'monospace', wordBreak: 'break-all' }}>\n {txHash}\n </Typography>\n </Stack>\n <Link\n href={explorerTxUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n sx={{\n alignItems: 'center', display: 'inline-flex', gap: 0.5,\n }}\n >\n View on explorer\n <OpenInNew sx={{ fontSize: 14 }} />\n </Link>\n {isDefined(signedTx)\n ? (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n Signed transaction recorded \u2014 open the explorer link above to verify\n inclusion on\n {' '}\n <code>{gatewayName}</code>\n .\n </Typography>\n )\n : null}\n </Stack>\n )\n : null}\n <ErrorRender error={chainError} scope=\"DataLakeAddToChainPanel.addToChain\" />\n </Stack>\n)\n\nexport interface DataLakeAddToChainPanelProps extends StackProps {\n /**\n * Base URL of the XL1 explorer. Defaults to the production deploy at\n * {@link DEFAULT_EXPLORER_URL}. The panel builds the per-transaction\n * link via `ExplorerLinks(explorerUrl, gatewayName).transaction(txHash)`.\n */\n explorerUrl?: string\n /** Gateway to use for chain writes. Defaults to `SequenceNetwork.id`. */\n gatewayName?: GatewayName\n /** Initial textarea content. Defaults to a stamped JSON envelope keyed by `payloadSchema`. */\n initialPayloadJson?: string\n /** Schema for the test payload. Defaults to `network.xyo.observation.v2`. */\n payloadSchema?: Schema\n /** Wallet-detection timeout, forwarded to the wallet hooks. */\n timeout?: number\n}\n\n/**\n * End-to-end \"data lake \u2192 chain\" flow for manual Storybook testing. The\n * panel walks the user through:\n *\n * 1. **Request permissions** \u2014 embedded {@link RequestPermissionsButton}\n * covering signer + accounts (so `gateway.addPayloadsToChain` can\n * pull the signer address) plus data-lake read + write (so the\n * insert step can run), all collected in one consent popup.\n * 2. **Edit the test payload** \u2014 a JSON textarea seeded with a stamped\n * `{ schema, value, timestamp }` envelope; the timestamp guarantees\n * a fresh content-address on each mount.\n * 3. **Pick a runner-capable lake** \u2014 reuses {@link ApprovedLakeSelector}\n * with `capability=\"runner\"` so the dropdown is narrowed to lakes the\n * user has granted write access to.\n * 4. **Insert into the lake** \u2014 calls `client.dataLakes.insert(lakeId, [payload])`,\n * stashes the echoed-back stored payload (with `_hash`) in state.\n * 5. **Add to chain** \u2014 builds a `HashPayload` referencing the stored\n * payload's hash and calls\n * `gateway.addPayloadsToChain([hashPayload], [storedPayload])`.\n * `onChain` is the hash reference; `offChain` is the stored payload\n * itself (the gateway re-inserts it into its own data lake under the\n * hood, so the content ends up in two places \u2014 see the story docs).\n * 6. **Link to the explorer** \u2014 once `addPayloadsToChain` resolves with\n * a `txHash`, surfaces `ExplorerLinks(explorerUrl, gatewayName).transaction(txHash)`\n * as a \"View on explorer\" link. No client-side confirmation polling \u2014\n * the explorer is the source of truth for inclusion state.\n *\n * Errors at any step short-circuit the rest of the flow and render\n * inline. The user can retry by clicking the same step's button again,\n * or by editing the upstream step (e.g. re-edit the payload, re-insert).\n */\nexport const DataLakeAddToChainPanel: React.FC<DataLakeAddToChainPanelProps> = ({\n explorerUrl = DEFAULT_EXPLORER_URL,\n gatewayName = SequenceNetwork.id,\n initialPayloadJson,\n payloadSchema = DEFAULT_PAYLOAD_SCHEMA,\n timeout,\n ...props\n}) => {\n const { client, error: clientError } = useClientFromWallet(timeout)\n const {\n gateway, error: gatewayError, timedout,\n } = useGatewayFromWallet(gatewayName, timeout)\n\n // `useState(fn)` defers the initializer to first render so the default\n // payload gets a fresh timestamp on every mount. Callers can override\n // via `initialPayloadJson`.\n const [payloadText, setPayloadText] = useState<string>(initialPayloadJson ?? '')\n usePromise(async () => setPayloadText(await buildDefaultPayload(payloadSchema)), [payloadSchema])\n\n const parse = useMemo(() => parsePayload(payloadText), [payloadText])\n\n const [selectedLakeId, setSelectedLakeId] = useState<string>('')\n\n // We narrow the lake's echoed-back `DataLakeData` to `Payload` at the\n // insert call site below \u2014 `DataLakeData = Payload | ArrayBuffer`, and\n // `gateway.addPayloadsToChain`'s `offChain` param wants a `Payload[]`.\n const [storedPayload, setStoredPayload] = useState<Payload>()\n const [inserting, setInserting] = useState(false)\n const [insertError, setInsertError] = useState<Error>()\n\n const [txHash, setTxHash] = useState<Hash>()\n const [signedTx, setSignedTx] = useState<SignedHydratedTransactionWithHashMeta>()\n const [addingToChain, setAddingToChain] = useState(false)\n const [chainError, setChainError] = useState<Error>()\n\n const dataLakes = client?.dataLakes\n const [storedHash] = usePromise(async () => isDefined(storedPayload) ? await PayloadBuilder.dataHash(storedPayload) : undefined, [storedPayload])\n const canInsert = parse.ok && selectedLakeId.length > 0 && isDefinedNotNull(dataLakes) && !inserting\n const canAddToChain = isDefined(storedHash) && isDefined(storedPayload) && isDefinedNotNull(gateway) && !addingToChain\n\n const explorerTxUrl = useMemo<string | undefined>(() => {\n if (!isDefined(txHash)) return\n // `GatewayName` is broader than `NetworkId` (the union of known\n // network ids the explorer recognizes). The story-side default is\n // always one of the canonical networks, so the cast is safe for\n // documented usage. A custom network id will still produce a\n // syntactically valid URL \u2014 the explorer just won't render it.\n return new ExplorerLinks(explorerUrl, gatewayName as NetworkId).transaction(txHash)\n }, [txHash, explorerUrl, gatewayName])\n\n const handleInsert = async () => {\n if (!canInsert || !parse.ok || !isDefinedNotNull(dataLakes)) return\n setInsertError(undefined)\n // A fresh insert invalidates anything downstream \u2014 clear so the\n // \"Add to chain\" button doesn't keep showing a stale stored payload\n // / tx hash from the previous attempt.\n setStoredPayload(undefined)\n setTxHash(undefined)\n setSignedTx(undefined)\n setChainError(undefined)\n setInserting(true)\n try {\n const [stored] = await dataLakes.insert(selectedLakeId, [parse.payload])\n // The wallet returns `DataLakeData[]`; the lake only stores entries\n // it accepts under policy, so an empty result means \"lake rejected\n // this payload\" \u2014 surface as a normal error rather than a silent\n // success.\n if (!isDefined(stored)) {\n setInsertError(new Error('Lake returned no entries for this insert \u2014 the lake may disallow the payload\\'s schema.'))\n return\n }\n // `DataLakeData` is `Payload | ArrayBuffer`. This flow only writes\n // payloads, and `gateway.addPayloadsToChain`'s `offChain` param\n // wants a `Payload[]`, so narrow here. The non-payload branch is\n // only reachable if the lake echoes back a raw binary blob, which\n // would be a wallet-side bug rather than a user-flow case to\n // recover from.\n if (!isAnyPayload(stored)) {\n setInsertError(new Error('Lake returned a non-payload value (binary blob); this flow only handles payload-shaped content.'))\n return\n }\n setStoredPayload(parse.payload as Payload)\n } catch (e) {\n setInsertError(e as Error)\n } finally {\n setInserting(false)\n }\n }\n\n const handleAddToChain = async () => {\n if (!canAddToChain || !isDefinedNotNull(gateway) || !isDefined(storedPayload) || !isDefined(storedHash)) return\n setChainError(undefined)\n setTxHash(undefined)\n setSignedTx(undefined)\n setAddingToChain(true)\n try {\n const hashPayload: HashPayload = { schema: HashSchema, hash: storedHash }\n const [hash, signed] = await gateway.addPayloadsToChain([hashPayload], [storedPayload])\n setTxHash(hash)\n setSignedTx(signed)\n } catch (e) {\n setChainError(e as Error)\n } finally {\n setAddingToChain(false)\n }\n }\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 3,\n alignItems: 'stretch',\n ...props.sx,\n }}\n >\n {timedout\n ? <Alert severity=\"warning\">Wallet not detected.</Alert>\n : null}\n\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">1. Grant signer + data-lake access</Typography>\n <RequestPermissionsButton permissions={PANEL_PERMISSIONS} timeout={timeout} />\n </Stack>\n\n <Divider />\n\n <TestPayloadSection value={payloadText} onChange={setPayloadText} parse={parse} />\n\n <Divider />\n\n <InsertSection\n canInsert={canInsert}\n inserting={inserting}\n insertError={insertError}\n onInsert={() => void handleInsert()}\n onLakeChange={setSelectedLakeId}\n selectedLakeId={selectedLakeId}\n storedHash={storedHash}\n timeout={timeout}\n />\n\n <Divider />\n\n <AddToChainSection\n addingToChain={addingToChain}\n canAddToChain={canAddToChain}\n chainError={chainError}\n explorerTxUrl={explorerTxUrl}\n gatewayName={gatewayName}\n onAddToChain={() => void handleAddToChain()}\n signedTx={signedTx}\n txHash={txHash}\n />\n\n <ErrorRender error={clientError ?? gatewayError ?? undefined} scope=\"DataLakeAddToChainPanel.wallet\" />\n </Stack>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport {\n Alert, Stack, Typography,\n} from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { ErrorRender } from '@xylabs/react-error'\nimport type { Hash } from '@xylabs/sdk-js'\nimport { isDefined, isDefinedNotNull } from '@xylabs/sdk-js'\nimport type { DataLakeData } from '@xyo-network/xl1-protocol-lib'\nimport React, { useState } from 'react'\n\nimport { useClientFromWallet } from '../../hooks/index.ts'\n\nexport interface DataLakeGetButtonProps extends StackProps {\n /** Hashes to fetch from the lake bound to `id`. */\n hashes: Hash[]\n /** Per-origin opaque id from `requestAccess` or `list`. */\n id: string\n timeout?: number\n}\n\n/**\n * Calls `client.dataLakes.get(id, hashes)` against a live wallet extension\n * and renders the returned `DataLakeData[]` as JSON. Use after granting\n * read access via {@link DataLakeRequestAccessButton} \u2014 the `id` arg is the\n * per-origin handle the popup minted on Connect.\n */\nexport const DataLakeGetButton: React.FC<DataLakeGetButtonProps> = ({\n id, hashes, timeout, ...props\n}) => {\n const {\n client, error: clientError, isLoading, timedout,\n } = useClientFromWallet(timeout)\n\n const [result, setResult] = useState<DataLakeData[]>()\n const [requestError, setRequestError] = useState<Error>()\n const [requesting, setRequesting] = useState(false)\n\n const dataLakes = client?.dataLakes\n const supported = isDefinedNotNull(dataLakes)\n const argsReady = id.length > 0 && hashes.length > 0\n\n const handleClick = async () => {\n if (!isDefinedNotNull(dataLakes)) return\n setRequestError(undefined)\n setResult(undefined)\n setRequesting(true)\n try {\n const payloads = await dataLakes.get(id, hashes)\n setResult(payloads)\n } catch (e) {\n setRequestError(e as Error)\n } finally {\n setRequesting(false)\n }\n }\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 2,\n alignItems: 'start',\n ...props.sx,\n }}\n >\n {timedout ? <Alert severity=\"warning\">Wallet not detected.</Alert> : null}\n {isDefinedNotNull(client) && !supported\n ? <Alert severity=\"warning\">This wallet does not expose `xyo.client.dataLakes`.</Alert>\n : null}\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!supported || !argsReady || requesting}\n busy={isLoading || requesting}\n onClick={() => void handleClick()}\n >\n Get\n {' '}\n {hashes.length}\n {' '}\n hash\n {hashes.length === 1 ? '' : 'es'}\n </ButtonEx>\n {argsReady\n ? null\n : (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n Provide a per-origin `id` and at least one hash to enable the button.\n </Typography>\n )}\n {isDefined(result)\n ? (\n <Stack sx={{ gap: 0.5 }}>\n <Typography variant=\"subtitle2\">\n {result.length === 0 ? 'No payloads returned' : `Payloads (${result.length})`}\n </Typography>\n <Typography\n component=\"pre\"\n variant=\"body2\"\n sx={{\n fontFamily: 'monospace', whiteSpace: 'pre-wrap', wordBreak: 'break-all',\n }}\n >\n {JSON.stringify(result, null, 2)}\n </Typography>\n </Stack>\n )\n : null}\n <ErrorRender error={clientError ?? requestError} scope=\"DataLakeGetButton\" />\n </Stack>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport {\n Stack, TextField, Typography,\n} from '@mui/material'\nimport type { Hash } from '@xylabs/sdk-js'\nimport React, { useMemo, useState } from 'react'\n\nimport { ApprovedLakeSelector } from './ApprovedLakeSelector.tsx'\nimport { DataLakeGetButton } from './DataLakeGetButton.tsx'\n\nexport interface DataLakeGetPanelProps extends StackProps {\n timeout?: number\n}\n\n/**\n * Self-contained Get flow: dropdown of viewer-capable approved lakes + a\n * textarea for hashes + the underlying `DataLakeGetButton`. Built for\n * Storybook's isolation mode, where the args panel is not available and the\n * component needs to render its own controls.\n *\n * One hash per line in the textarea; whitespace-only lines are ignored.\n */\nexport const DataLakeGetPanel: React.FC<DataLakeGetPanelProps> = ({ timeout, ...props }) => {\n const [selectedId, setSelectedId] = useState<string>('')\n const [hashesText, setHashesText] = useState<string>('')\n\n const hashes = useMemo<Hash[]>(() => {\n return hashesText\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line.length > 0) as Hash[]\n }, [hashesText])\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 2,\n alignItems: 'stretch',\n ...props.sx,\n }}\n >\n <ApprovedLakeSelector\n capability=\"viewer\"\n selectedId={selectedId}\n onChange={setSelectedId}\n timeout={timeout}\n />\n <TextField\n label=\"Hashes (one per line)\"\n value={hashesText}\n onChange={e => setHashesText(e.target.value)}\n multiline\n minRows={3}\n maxRows={10}\n size=\"small\"\n slotProps={{ input: { sx: { fontFamily: 'monospace', fontSize: 12 } } }}\n />\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n {hashes.length === 0 ? 'No hashes parsed.' : `${hashes.length} hash${hashes.length === 1 ? '' : 'es'} ready.`}\n </Typography>\n <DataLakeGetButton id={selectedId} hashes={hashes} timeout={timeout} />\n </Stack>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport {\n Alert, Stack, Typography,\n} from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { ErrorRender } from '@xylabs/react-error'\nimport { isDefined, isDefinedNotNull } from '@xylabs/sdk-js'\nimport type { DataLakeData } from '@xyo-network/xl1-protocol-lib'\nimport React, { useState } from 'react'\n\nimport { useClientFromWallet } from '../../hooks/index.ts'\n\nexport interface DataLakeInsertButtonProps extends StackProps {\n /** Per-origin opaque id from `requestAccess` or `list`. */\n id: string\n /** Payloads to insert into the lake bound to `id`. */\n payloads: DataLakeData[]\n timeout?: number\n}\n\n/**\n * Calls `client.dataLakes.insert(id, payloads)` against a live wallet\n * extension and renders the wallet's response (typically the hashes of the\n * accepted payloads) as JSON. Use after granting write access via\n * {@link DataLakeRequestAccessButton} \u2014 the `id` arg is the per-origin handle\n * the popup minted on Connect.\n */\nexport const DataLakeInsertButton: React.FC<DataLakeInsertButtonProps> = ({\n id, payloads, timeout, ...props\n}) => {\n const {\n client, error: clientError, isLoading, timedout,\n } = useClientFromWallet(timeout)\n\n const [result, setResult] = useState<DataLakeData[]>()\n const [requestError, setRequestError] = useState<Error>()\n const [requesting, setRequesting] = useState(false)\n\n const dataLakes = client?.dataLakes\n const supported = isDefinedNotNull(dataLakes)\n const argsReady = id.length > 0 && payloads.length > 0\n\n const handleClick = async () => {\n if (!isDefinedNotNull(dataLakes)) return\n setRequestError(undefined)\n setResult(undefined)\n setRequesting(true)\n try {\n const acks = await dataLakes.insert(id, payloads)\n setResult(acks)\n } catch (e) {\n setRequestError(e as Error)\n } finally {\n setRequesting(false)\n }\n }\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 2,\n alignItems: 'start',\n ...props.sx,\n }}\n >\n {timedout ? <Alert severity=\"warning\">Wallet not detected.</Alert> : null}\n {isDefinedNotNull(client) && !supported\n ? <Alert severity=\"warning\">This wallet does not expose `xyo.client.dataLakes`.</Alert>\n : null}\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!supported || !argsReady || requesting}\n busy={isLoading || requesting}\n onClick={() => void handleClick()}\n >\n Insert\n {' '}\n {payloads.length}\n {' '}\n payload\n {payloads.length === 1 ? '' : 's'}\n </ButtonEx>\n {argsReady\n ? null\n : (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n Provide a per-origin `id` and at least one payload to enable the button.\n </Typography>\n )}\n {isDefined(result)\n ? (\n <Stack sx={{ gap: 0.5 }}>\n <Typography variant=\"subtitle2\">\n {result.length === 0 ? 'No payloads written (wallet filtered all)' : `Inserted (${result.length})`}\n </Typography>\n <Typography\n component=\"pre\"\n variant=\"body2\"\n sx={{\n fontFamily: 'monospace', whiteSpace: 'pre-wrap', wordBreak: 'break-all',\n }}\n >\n {JSON.stringify(result, null, 2)}\n </Typography>\n </Stack>\n )\n : null}\n <ErrorRender error={clientError ?? requestError} scope=\"DataLakeInsertButton\" />\n </Stack>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport {\n Alert, Stack, TextField, Typography,\n} from '@mui/material'\nimport type { DataLakeData } from '@xyo-network/xl1-protocol-lib'\nimport React, { useMemo, useState } from 'react'\n\nimport { ApprovedLakeSelector } from './ApprovedLakeSelector.tsx'\nimport { DataLakeInsertButton } from './DataLakeInsertButton.tsx'\n\nexport interface DataLakeInsertPanelProps extends StackProps {\n timeout?: number\n}\n\n/**\n * Build a fresh default payload every time the panel mounts. The ISO\n * timestamp gives each mount its own content-address \u2014 a tester who clicks\n * Insert twice from a freshly-mounted panel sees two distinct hashes back,\n * which makes round-tripping with the Get panel easier to verify.\n */\nfunction buildDefaultPayload(): string {\n return JSON.stringify(\n {\n schema: 'network.xyo.observation.v2', value: 1, timestamp: new Date().toISOString(),\n },\n null,\n 2,\n )\n}\n\ninterface ParseSuccess {\n ok: true\n payloads: DataLakeData[]\n}\n\ninterface ParseFailure {\n error: string\n ok: false\n}\n\ntype ParseResult = ParseSuccess | ParseFailure\n\n/**\n * Parse the textarea content into a `DataLakeData[]`.\n *\n * Accepts either a single object (wrapped into a one-element array) or an\n * already-array shape. Returns a structured success/failure so the panel can\n * render a parse error without blowing up the render path.\n */\nfunction parsePayload(raw: string): ParseResult {\n const trimmed = raw.trim()\n if (trimmed.length === 0) return { ok: false, error: 'Payload is empty.' }\n try {\n const parsed = JSON.parse(trimmed) as unknown\n if (Array.isArray(parsed)) return { ok: true, payloads: parsed as DataLakeData[] }\n if (parsed !== null && typeof parsed === 'object') return { ok: true, payloads: [parsed as DataLakeData] }\n return { ok: false, error: 'Payload must be a JSON object or array of objects.' }\n } catch (e) {\n return { ok: false, error: `Invalid JSON: ${(e as Error).message}` }\n }\n}\n\n/**\n * Self-contained Insert flow: dropdown of runner-capable approved lakes + a\n * JSON textarea + the underlying `DataLakeInsertButton`. Built for Storybook's\n * isolation mode, where the args panel is not available and the component\n * needs to render its own controls.\n *\n * The textarea accepts either one payload object or a JSON array of payload\n * objects; bad JSON shows an inline parse error and disables the button.\n */\nexport const DataLakeInsertPanel: React.FC<DataLakeInsertPanelProps> = ({ timeout, ...props }) => {\n const [selectedId, setSelectedId] = useState<string>('')\n // `useState(fn)` defers the initializer to first render \u2014 each mount gets a\n // fresh ISO timestamp baked into the default payload.\n const [payloadText, setPayloadText] = useState<string>(buildDefaultPayload)\n\n const parse = useMemo(() => parsePayload(payloadText), [payloadText])\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 2,\n alignItems: 'stretch',\n ...props.sx,\n }}\n >\n <ApprovedLakeSelector\n capability=\"runner\"\n selectedId={selectedId}\n onChange={setSelectedId}\n timeout={timeout}\n />\n <TextField\n label=\"Payload (JSON object or array)\"\n value={payloadText}\n onChange={e => setPayloadText(e.target.value)}\n multiline\n minRows={6}\n maxRows={16}\n size=\"small\"\n slotProps={{ input: { sx: { fontFamily: 'monospace', fontSize: 12 } } }}\n />\n {parse.ok\n ? (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n {parse.payloads.length}\n {' '}\n payload\n {parse.payloads.length === 1 ? '' : 's'}\n {' '}\n parsed.\n </Typography>\n )\n : (\n <Alert severity=\"error\" variant=\"outlined\">\n <Typography variant=\"body2\">{parse.error}</Typography>\n </Alert>\n )}\n <DataLakeInsertButton\n id={selectedId}\n payloads={parse.ok ? parse.payloads : []}\n timeout={timeout}\n />\n </Stack>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport {\n Alert, Stack, Typography,\n} from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { ErrorRender } from '@xylabs/react-error'\nimport { isDefined, isDefinedNotNull } from '@xylabs/sdk-js'\nimport type { ApprovedDataLake } from '@xyo-network/xl1-protocol-lib'\nimport React, { useState } from 'react'\n\nimport { useClientFromWallet } from '../../hooks/index.ts'\n\nexport interface DataLakeListButtonProps extends StackProps {\n timeout?: number\n}\n\n/**\n * Calls `client.dataLakes.list()` against a live wallet extension and renders\n * the approved-lake summary per origin. The page only ever sees the opaque\n * per-origin `id`, the granted `capabilities`, and the lake's public schema\n * policy \u2014 names and endpoints are deliberately redacted by the wallet.\n */\nexport const DataLakeListButton: React.FC<DataLakeListButtonProps> = ({ timeout, ...props }) => {\n const {\n client, error: clientError, isLoading, timedout,\n } = useClientFromWallet(timeout)\n\n const [lakes, setLakes] = useState<ApprovedDataLake[]>()\n const [requestError, setRequestError] = useState<Error>()\n const [requesting, setRequesting] = useState(false)\n\n const dataLakes = client?.dataLakes\n const supported = isDefinedNotNull(dataLakes)\n\n const handleClick = async () => {\n if (!isDefinedNotNull(dataLakes)) return\n setRequestError(undefined)\n setLakes(undefined)\n setRequesting(true)\n try {\n const result = await dataLakes.list()\n setLakes(result)\n } catch (e) {\n setRequestError(e as Error)\n } finally {\n setRequesting(false)\n }\n }\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 2,\n alignItems: 'start',\n ...props.sx,\n }}\n >\n {timedout ? <Alert severity=\"warning\">Wallet not detected.</Alert> : null}\n {isDefinedNotNull(client) && !supported\n ? <Alert severity=\"warning\">This wallet does not expose `xyo.client.dataLakes`.</Alert>\n : null}\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!supported || requesting}\n busy={isLoading || requesting}\n onClick={() => void handleClick()}\n >\n List approved data lakes\n </ButtonEx>\n {isDefined(lakes)\n ? (\n <Stack sx={{ gap: 0.5 }}>\n <Typography variant=\"subtitle2\">\n {lakes.length === 0 ? 'No approved lakes' : `Approved lakes (${lakes.length})`}\n </Typography>\n <Typography\n component=\"pre\"\n variant=\"body2\"\n sx={{\n fontFamily: 'monospace', whiteSpace: 'pre-wrap', wordBreak: 'break-all',\n }}\n >\n {JSON.stringify(lakes, null, 2)}\n </Typography>\n </Stack>\n )\n : null}\n <ErrorRender error={clientError ?? requestError} scope=\"DataLakeListButton\" />\n </Stack>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport {\n Divider, Stack, Typography,\n} from '@mui/material'\nimport React from 'react'\n\nimport { DataLakeGetPanel } from './DataLakeGetPanel.tsx'\nimport { DataLakeInsertPanel } from './DataLakeInsertPanel.tsx'\nimport { DataLakeListButton } from './DataLakeListButton.tsx'\nimport { DataLakeRequestAccessPanel } from './DataLakeRequestAccessPanel.tsx'\n\nexport interface DataLakeOperationsPanelProps extends StackProps {\n timeout?: number\n}\n\n/**\n * Combined panel for exercising every page-side data-lake operation against\n * a live wallet in a single rendered surface \u2014 `requestAccess`, `list`,\n * `insert`, and `get` stacked with their own controls so a manual tester\n * can drive the full flow without jumping between Storybook stories. The\n * sections are ordered for natural flow: request access first, then\n * enumerate the grants, then insert a payload and read it back by hash in\n * the same scroll. Designed for isolation mode where the args panel isn't\n * available.\n *\n * Single-purpose: composes the four operation components and labels each\n * section. State within each operation (capability choice, selected lake,\n * hashes, payload JSON) is owned by the underlying panel, not by this\n * wrapper.\n */\nexport const DataLakeOperationsPanel: React.FC<DataLakeOperationsPanelProps> = ({ timeout, ...props }) => {\n return (\n <Stack\n {...props}\n sx={{\n gap: 3,\n alignItems: 'stretch',\n ...props.sx,\n }}\n >\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">Request data lake access</Typography>\n <DataLakeRequestAccessPanel timeout={timeout} />\n </Stack>\n\n <Divider />\n\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">List approved lakes</Typography>\n <DataLakeListButton timeout={timeout} />\n </Stack>\n\n <Divider />\n\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">Insert payloads</Typography>\n <DataLakeInsertPanel timeout={timeout} />\n </Stack>\n\n <Divider />\n\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">Get payloads by hash</Typography>\n <DataLakeGetPanel timeout={timeout} />\n </Stack>\n </Stack>\n )\n}\n", "import type { SelectChangeEvent, StackProps } from '@mui/material'\nimport {\n Checkbox, FormControl, FormControlLabel, InputLabel, MenuItem, Select, Stack,\n} from '@mui/material'\nimport { asSchema } from '@xyo-network/sdk-js'\nimport type { DataLakeRequestAccessOptions } from '@xyo-network/xl1-protocol-lib'\nimport React, { useMemo, useState } from 'react'\n\nimport { DataLakeRequestAccessButton } from './DataLakeRequestAccessButton.tsx'\n\nconst observationSchema = asSchema('network.xyo.observation.v2', true)\nconst locationSchema = asSchema('network.xyo.location', true)\n\ntype CapabilityChoice = 'viewer' | 'runner' | 'read+write'\n\nexport interface DataLakeRequestAccessPanelProps extends StackProps {\n timeout?: number\n}\n\n/**\n * Self-contained RequestAccess flow \u2014 picks a capability shape\n * (`viewer`, `runner`, or combined `read + write`) and optionally attaches\n * a schemas filter, then drives `client.dataLakes.requestAccess(options)`\n * through {@link DataLakeRequestAccessButton}. Designed for Storybook's\n * isolation mode where the args panel isn't available, so a manual tester\n * can sweep the four canonical request shapes from one rendered surface.\n *\n * Schemas filter only applies to the write path: `get` is hash-based and\n * the wallet rejects a schemas filter on `viewer` grants. The checkbox\n * auto-disables when the capability has no write component.\n */\nexport const DataLakeRequestAccessPanel: React.FC<DataLakeRequestAccessPanelProps> = ({ timeout, ...props }) => {\n const [capability, setCapability] = useState<CapabilityChoice>('read+write')\n const [includeSchemas, setIncludeSchemas] = useState(true)\n\n const supportsSchemasFilter = capability !== 'viewer'\n\n const options = useMemo<DataLakeRequestAccessOptions>(() => {\n const cap = capability === 'read+write' ? { read: true, write: true } : capability\n if (supportsSchemasFilter && includeSchemas) {\n return { capability: cap, schemas: [observationSchema, locationSchema] }\n }\n return { capability: cap }\n }, [capability, includeSchemas, supportsSchemasFilter])\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 2,\n alignItems: 'stretch',\n ...props.sx,\n }}\n >\n <FormControl size=\"small\" fullWidth>\n <InputLabel>Capability</InputLabel>\n <Select<CapabilityChoice>\n value={capability}\n label=\"Capability\"\n onChange={(event: SelectChangeEvent<CapabilityChoice>) =>\n setCapability(event.target.value)}\n >\n <MenuItem value=\"viewer\">Read only (viewer)</MenuItem>\n <MenuItem value=\"runner\">Write only (runner)</MenuItem>\n <MenuItem value=\"read+write\">Read + Write</MenuItem>\n </Select>\n </FormControl>\n <FormControlLabel\n control={(\n <Checkbox\n checked={supportsSchemasFilter && includeSchemas}\n disabled={!supportsSchemasFilter}\n onChange={event => setIncludeSchemas(event.target.checked)}\n size=\"small\"\n />\n )}\n label=\"Include schemas filter (observation + location)\"\n />\n <DataLakeRequestAccessButton options={options} timeout={timeout} />\n </Stack>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport {\n Alert, Stack, Typography,\n} from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { ErrorRender } from '@xylabs/react-error'\nimport { isDefined, isDefinedNotNull } from '@xylabs/sdk-js'\nimport type { DataLakeRequestAccessOptions } from '@xyo-network/xl1-protocol-lib'\nimport React, { useState } from 'react'\n\nimport { useClientFromWallet } from '../../hooks/index.ts'\n\nexport interface DataLakeRequestAccessButtonProps extends StackProps {\n options: DataLakeRequestAccessOptions\n timeout?: number\n}\n\n/**\n * Calls `client.dataLakes.requestAccess(options)` against a live wallet\n * extension. Renders the resulting `{ id }` (the per-origin opaque handle\n * for the most-recently-granted lake) or any error. Pair with\n * {@link DataLakeListButton} after running to discover ALL granted lake ids\n * when the user picks multiple lakes in the popup.\n */\nexport const DataLakeRequestAccessButton: React.FC<DataLakeRequestAccessButtonProps> = ({\n options, timeout, ...props\n}) => {\n const {\n client, error: clientError, isLoading, timedout,\n } = useClientFromWallet(timeout)\n\n const [granted, setGranted] = useState<{ id: string }>()\n const [requestError, setRequestError] = useState<Error>()\n const [requesting, setRequesting] = useState(false)\n\n const dataLakes = client?.dataLakes\n const supported = isDefinedNotNull(dataLakes)\n\n const handleClick = async () => {\n if (!isDefinedNotNull(dataLakes)) return\n setRequestError(undefined)\n setGranted(undefined)\n setRequesting(true)\n try {\n const result = await dataLakes.requestAccess(options)\n setGranted(result)\n } catch (e) {\n setRequestError(e as Error)\n } finally {\n setRequesting(false)\n }\n }\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 2,\n alignItems: 'start',\n ...props.sx,\n }}\n >\n {timedout ? <Alert severity=\"warning\">Wallet not detected.</Alert> : null}\n {isDefinedNotNull(client) && !supported\n ? <Alert severity=\"warning\">This wallet does not expose `xyo.client.dataLakes`.</Alert>\n : null}\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!supported || requesting}\n busy={isLoading || requesting}\n onClick={() => void handleClick()}\n >\n Request data lake access\n </ButtonEx>\n {isDefined(granted)\n ? (\n <Stack sx={{ gap: 0.5 }}>\n <Typography variant=\"subtitle2\">Granted:</Typography>\n <Typography variant=\"body2\" sx={{ fontFamily: 'monospace', wordBreak: 'break-all' }}>\n id:\n {' '}\n {granted.id}\n </Typography>\n <Typography variant=\"body2\" sx={{ color: 'text.secondary' }}>\n If you picked multiple lakes, call `list()` to enumerate all granted ids.\n </Typography>\n </Stack>\n )\n : null}\n <ErrorRender error={clientError ?? requestError} scope=\"DataLakeRequestAccessButton\" />\n </Stack>\n )\n}\n", "import type { StackProps } from '@mui/material'\nimport {\n Alert, Chip, Divider, Stack, Typography,\n} from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { PopoverErrorRender } from '@xylabs/react-error'\nimport {\n assertEx, isDefined, isDefinedNotNull,\n} from '@xylabs/sdk-js'\nimport type { Payload } from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n GatewayName, HashPayload, PermissionRequest, UnsignedHydratedTransaction,\n} from '@xyo-network/xl1-sdk'\nimport {\n asXL1BlockNumber, buildUnsignedTransaction, HashSchema, SequenceNetwork,\n} from '@xyo-network/xl1-sdk'\nimport React, { useCallback, useState } from 'react'\n\nimport { useGatewayFromWallet } from '../../hooks/index.ts'\nimport { RequestPermissionsButton } from './RequestPermissionsButton.tsx'\n\n/** Stable empty default for optional payload arrays \u2014 a fresh `[]` literal as a default prop re-renders forever. */\nconst EMPTY_PAYLOADS: Payload[] = []\n\n/**\n * Signer-side grants `buildUnsignedTransaction` needs: `xyoWallet_getAccounts`\n * + `xyoSigner_address` populate the transaction's `from` field. The\n * per-transaction `xyoSigner_signTransaction` call isn't EIP-2255-permissioned\n * \u2014 the wallet shows its own Sign popup on each invocation, which is exactly\n * the page this story exercises.\n */\nconst SIGNER_PERMISSIONS: PermissionRequest[] = [\n { xyoWallet_getAccounts: { restrictReturnedAccounts: [] } },\n { xyoSigner_address: {} },\n]\n\nexport interface SignTransactionButtonProps extends StackProps {\n /**\n * When true (default), elevate a single `network.xyo.hash` payload on-chain\n * that anchors the first referenced payload by hash. This populates the\n * wallet's \"On-Chain Payloads\" section with a realistic anchor while the\n * referenced content itself stays off-chain. When false, no payloads are\n * elevated and the \"On-Chain Payloads\" section renders empty.\n */\n anchorOnChain?: boolean\n /** Gateway/network to build the transaction against. Defaults to `SequenceNetwork.id`. */\n gatewayName?: GatewayName\n /**\n * Payloads referenced by hash but NOT included with the transaction \u2014 only\n * their hash + schema reach the wallet. Exercises the wallet's existing\n * \"Private Referenced Payloads\" (hash + schema only) section. Defaults to none.\n */\n privateReferencedPayloads?: Payload[]\n /**\n * Payloads passed in full via the RPC request that are referenced (in the\n * bound witness `payload_hashes`) but NOT elevated on-chain. Exercises the\n * wallet's \"Referenced Payloads\" section \u2014 the full contents are shown\n * because they ride along with the transaction even though they won't be\n * stored on-chain. Defaults to none.\n */\n referencedPayloads?: Payload[]\n /** Wallet-detection timeout, forwarded to the wallet hooks. */\n timeout?: number\n}\n\n/**\n * Manual Storybook harness that drives the live XL1 Wallet's transaction-signing\n * popup with caller-supplied payloads. It assembles an\n * {@link UnsignedHydratedTransaction} from three independently-stubbed payload\n * groups and calls `signer.signTransaction(tx)`, which opens the wallet's Sign\n * page so its payload sections can be visually verified:\n *\n * - **On-Chain Payloads** \u2014 `anchorOnChain` elevates a `network.xyo.hash`\n * payload that anchors `referencedPayloads[0]`.\n * - **Referenced Payloads** \u2014 `referencedPayloads` ride along in the\n * transaction's payload array (so the wallet has their full contents) but are\n * not marked elevated, so they won't be stored on-chain.\n * - **Private Referenced Payloads** \u2014 `privateReferencedPayloads` are appended\n * to the bound witness's `payload_hashes` / `payload_schemas` only; their\n * contents are withheld, so the wallet can show no more than hash + schema.\n *\n * Chain id, `nbf`, and `exp` are resolved from the gateway's viewer and `from`\n * from the wallet signer, so the transaction is well-formed for the active\n * account. The transaction is only signed, never broadcast \u2014 clicking Sign in\n * the wallet returns the signed transaction here and renders its bound-witness\n * hash; nothing is sent to the network.\n */\nexport const SignTransactionButton: React.FC<SignTransactionButtonProps> = ({\n anchorOnChain = true,\n gatewayName = SequenceNetwork.id,\n privateReferencedPayloads = EMPTY_PAYLOADS,\n referencedPayloads = EMPTY_PAYLOADS,\n timeout,\n ...props\n}) => {\n const {\n gateway, error: gatewayError, timedout,\n } = useGatewayFromWallet(gatewayName, timeout)\n\n const [signing, setSigning] = useState(false)\n const [signError, setSignError] = useState<Error>()\n const [signedHash, setSignedHash] = useState<string>()\n\n const signer = gateway?.signer\n const viewer = gateway?.connection?.viewer\n const canSign = isDefinedNotNull(signer) && isDefinedNotNull(viewer) && !signing\n\n const handleSign = useCallback(async () => {\n if (!isDefinedNotNull(gateway)) return\n const resolvedSigner = assertEx(gateway.signer, () => 'No signer available on gateway')\n const resolvedViewer = assertEx(gateway.connection?.viewer, () => 'No viewer available on gateway connection')\n setSignError(undefined)\n setSignedHash(undefined)\n setSigning(true)\n try {\n const chain = await resolvedViewer.chainId()\n const nbf = asXL1BlockNumber(await resolvedViewer.currentBlockNumber(), true)\n const exp = asXL1BlockNumber(nbf + 10, true)\n const from = await resolvedSigner.address()\n\n // Anchor the first referenced payload with an on-chain hash payload so the\n // wallet's \"On-Chain Payloads\" section has something realistic to show.\n const referencedHashes = await PayloadBuilder.hashes(referencedPayloads)\n const onChainPayloads: HashPayload[] = anchorOnChain && isDefined(referencedHashes[0])\n ? [{ schema: HashSchema, hash: referencedHashes[0] }]\n : []\n\n let tx: UnsignedHydratedTransaction = await buildUnsignedTransaction(\n chain,\n onChainPayloads,\n referencedPayloads,\n nbf,\n exp,\n from,\n )\n\n // Reference the private payloads by hash + schema only \u2014 append to the\n // bound witness without adding the payloads themselves, so the wallet\n // never receives their contents.\n if (privateReferencedPayloads.length > 0) {\n const privateHashes = await PayloadBuilder.hashes(privateReferencedPayloads)\n const [bw, payloads] = tx\n tx = [\n {\n ...bw,\n payload_hashes: [...bw.payload_hashes, ...privateHashes],\n payload_schemas: [...bw.payload_schemas, ...privateReferencedPayloads.map(payload => payload.schema)],\n },\n payloads,\n ]\n }\n\n const [signedBoundWitness] = await resolvedSigner.signTransaction(tx)\n setSignedHash(await PayloadBuilder.hash(signedBoundWitness))\n } catch (e) {\n setSignError(e as Error)\n } finally {\n setSigning(false)\n }\n }, [anchorOnChain, gateway, privateReferencedPayloads, referencedPayloads])\n\n return (\n <Stack\n {...props}\n sx={{\n gap: 3,\n alignItems: 'stretch',\n ...props.sx,\n }}\n >\n {timedout\n ? <Alert severity=\"warning\">Wallet not detected.</Alert>\n : null}\n\n <Stack sx={{ gap: 1 }}>\n <Typography variant=\"subtitle2\">1. Grant signer + account access</Typography>\n <RequestPermissionsButton permissions={SIGNER_PERMISSIONS} timeout={timeout} />\n </Stack>\n\n <Divider />\n\n <Stack sx={{ gap: 1, alignItems: 'start' }}>\n <Typography variant=\"subtitle2\">2. Sign the transaction</Typography>\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n Opens the wallet&apos;s Sign page with\n {' '}\n {anchorOnChain ? '1 on-chain anchor, ' : 'no on-chain payloads, '}\n {referencedPayloads.length}\n {' '}\n referenced, and\n {' '}\n {privateReferencedPayloads.length}\n {' '}\n private referenced payload\n {privateReferencedPayloads.length === 1 ? '' : 's'}\n . The signed transaction is returned here and not broadcast.\n </Typography>\n <Stack direction=\"row\" sx={{ gap: 1, alignItems: 'center' }}>\n <ButtonEx\n variant=\"contained\"\n size=\"small\"\n disabled={!canSign}\n busy={signing}\n onClick={() => void handleSign()}\n >\n Sign transaction\n </ButtonEx>\n <PopoverErrorRender error={gatewayError ?? signError} scope=\"SignTransactionButton\" />\n </Stack>\n {isDefined(signedHash)\n ? (\n <Stack\n direction=\"row\"\n sx={{\n alignItems: 'center', flexWrap: 'wrap', gap: 1,\n }}\n >\n <Chip label=\"Signed\" size=\"small\" color=\"success\" />\n <Typography variant=\"body2\" sx={{ fontFamily: 'monospace', wordBreak: 'break-all' }}>\n {signedHash}\n </Typography>\n </Stack>\n )\n : null}\n </Stack>\n </Stack>\n )\n}\n", "import { createContextEx } from '@xylabs/react-shared'\n\nimport type { GatewayStateFields } from './GatewayProviderState.ts'\n\n/**\n * Shared React context that decouples gateway *sources* from gateway\n * *consumers*. Any provider that can resolve an `XyoGateway` publishes to\n * this context; any hook or component that needs a gateway reads from it\n * via `useProvidedGateway`. Consumers never import a specific provider \u2014\n * they just require that *some* provider is mounted above them in the\n * tree.\n *\n * Current publishers:\n * - `WalletGatewayProvider` (this package) \u2014 sources gateways from the\n * injected XL1 wallet extension.\n * - `GatewayProvider` in `@xyo-network/react-chain-provider` \u2014 sources\n * gateways built in-page against RPC endpoints, falling back to the\n * wallet when available.\n *\n * To add a new source (e.g. a mock provider for tests, an iframe-bridged\n * provider, a server-rendered provider), publish a `GatewayContextState`\n * to this same context \u2014 do not create a parallel context, or consumers\n * will silently stop receiving updates.\n */\nexport const GatewayContext = createContextEx<GatewayStateFields>()\n", "import { createContextEx } from '@xylabs/react-shared'\n\nimport type { InPageGatewaysStateFields } from './InPageGatewaysState.ts'\n\n/**\n * Narrow, provider-internal context that `InPageGatewaysProvider` writes\n * to and `GatewayProvider` reads from. Do not consume this in application\n * code \u2014 use `useProvidedGateway` (which reads the shared\n * `GatewayContext`) instead. This context only exists to decouple the\n * single in-page *builder* from the many single-gateway *adapters* that\n * sit between it and the shared gateway surface.\n */\nexport const InPageGatewaysContext = createContextEx<InPageGatewaysStateFields>()\n", "import type {\n GatewayName, RpcTransport, XyoSignerRpcSchemas,\n} from '@xyo-network/xl1-sdk'\nimport { DefaultNetworks } from '@xyo-network/xl1-sdk'\nimport type { PropsWithChildren } from 'react'\nimport React, {\n startTransition,\n useCallback, useEffect, useMemo, useState,\n} from 'react'\n\nimport type { ContextGatewayType } from '../../types/index.ts'\nimport { InPageGatewaysContext } from './InPageGatewaysContext.ts'\nimport type { InPageGatewaysState } from './InPageGatewaysState.ts'\nimport { buildGateway } from './lib/index.ts'\n\nexport interface InPageGatewaysProviderProps extends PropsWithChildren {\n signerTransport?: RpcTransport<XyoSignerRpcSchemas>\n}\n\n/**\n * Publishes a keyed map of in-page gateways \u2014 one per network in\n * `DefaultNetworks` \u2014 under the narrow `InPageGatewaysContext`.\n *\n * This provider is deliberately *not* a direct publisher of the shared\n * `GatewayContext` that `useProvidedGateway` reads. Its consumer is the\n * wrapping `GatewayProvider` in this same package, which picks the\n * `gatewayName` the consumer asked for out of this map, adapts it into\n * the single-gateway `GatewayContextState` shape, and then publishes *that*\n * to the shared context. Splitting the work this way lets one\n * `InPageGatewaysProvider` near the root build every network's gateway\n * once, while many `GatewayProvider` instances deeper in the tree each\n * expose whichever gateway their subtree cares about.\n *\n * Unlike `WalletGatewayProvider`, gateways here are constructed directly\n * in the page (via `buildGateway`) against each network's RPC endpoint\n * \u2014 no browser wallet extension is required. `signerTransport` switches\n * between viewer (read-only) and runner (can sign/send) locators; supply\n * it only when the app needs to sign.\n *\n * Behavior:\n * - On mount, and whenever `signerTransport` changes, `buildGateway` is\n * called in parallel for every network in `DefaultNetworks` via\n * `Promise.allSettled`. Networks that resolve populate `gateways[id]`;\n * networks that reject populate `errors[id]`. One failed network does\n * not block the others.\n * - If `signerTransport` is provided, gateways are built with a remote\n * *runner* locator, otherwise with a remote *viewer* locator.\n * - When `signerTransport` changes identity mid-life, the provider clears\n * all cached gateways and errors synchronously during render (via\n * `previousSignerTransport` state) so consumers never see gateways\n * bound to the previous transport, then rebuilds in the effect.\n * - State updates from the rebuild are wrapped in `startTransition` so a\n * slow network doesn't stall higher-priority UI updates.\n * - A `cancelled` flag in the effect's cleanup discards results from a\n * prior `signerTransport` once a new one is in flight.\n *\n * Published `InPageGatewaysState` (narrower than `GatewayContextState` \u2014\n * this is an internal handoff shape, not the cross-publisher surface):\n * - `gateways` \u2014 `Partial<Record<GatewayName, ContextGatewayType>>`. Keys\n * are only present for networks that built successfully.\n * - `errors` \u2014 `Partial<Record<GatewayName, Error>>`. Per-network build\n * failures, keyed by `GatewayName`.\n * - `clearAll()` \u2014 manually empties both maps. Also invoked internally on\n * transport changes. Forwarded by `GatewayProvider` to consumers as\n * `resetGatewaysFromConfig`.\n * - `provided: true` \u2014 lets descendants detect a real provider.\n *\n * Note: the commented-out `SimpleXyoClient` at the top is intentionally\n * disabled pending a type unification between `XyoGateway` and\n * `XyoGatewayRunner`.\n */\nexport const InPageGatewaysProvider: React.FC<InPageGatewaysProviderProps> = ({ signerTransport, children }) => {\n const [gateways, setGateways] = useState<Partial<Record<GatewayName, ContextGatewayType>>>({})\n const [errors, setErrors] = useState<Partial<Record<GatewayName, Error>>>({})\n const [previousSignerTransport, setPreviousSignerTransport] = useState<RpcTransport<XyoSignerRpcSchemas> | undefined>(signerTransport)\n\n // This can come back once we homogenize the type for XyoGateway.\n // Right now, SimpleXyoClient takes XyoGatewayRunners but ideally it would take XyoGateway.\n // const clientInPage = useMemo(() => new SimpleXyoClient(gateways, {}), [gateways])\n\n const clearAll = useCallback(() => {\n setGateways({})\n setErrors({})\n }, [])\n\n if (previousSignerTransport !== signerTransport) {\n clearAll()\n setPreviousSignerTransport(signerTransport)\n }\n\n useEffect(() => {\n let cancelled = false\n\n const buildAll = async () => {\n const results = await Promise.allSettled(\n DefaultNetworks.map(async (network) => {\n const gateway = await buildGateway(network.id, signerTransport)\n return { id: network.id, gateway }\n }),\n )\n\n if (cancelled) return\n\n const nextGateways: Partial<Record<GatewayName, ContextGatewayType>> = {}\n const nextErrors: Partial<Record<GatewayName, Error>> = {}\n\n for (const [index, result] of results.entries()) {\n const networkId = DefaultNetworks[index].id as GatewayName\n if (result.status === 'fulfilled') {\n nextGateways[networkId] = result.value.gateway\n } else {\n nextErrors[networkId] = result.reason instanceof Error ? result.reason : new Error(String(result.reason))\n }\n }\n\n startTransition(() => {\n setGateways(nextGateways)\n setErrors(nextErrors)\n })\n }\n\n void buildAll()\n return () => {\n cancelled = true\n }\n }, [signerTransport])\n\n const value = useMemo(() => {\n const value: InPageGatewaysState = {\n clearAll,\n errors,\n gateways,\n provided: true,\n }\n return value\n }, [clearAll, errors, gateways])\n\n return <InPageGatewaysContext value={value}>{children}</InPageGatewaysContext>\n}\n", "import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type {\n GatewayName,\n RemoteConfig, RpcTransport, SimpleXyoGateway,\n XyoSignerRpcSchemas,\n} from '@xyo-network/xl1-sdk'\nimport {\n basicRemoteRunnerLocator,\n basicRemoteViewerLocator,\n DefaultNetworks, XyoGatewayMoniker,\n} from '@xyo-network/xl1-sdk'\n\nexport const buildGateway = async (gatewayName: GatewayName, signerTransport?: RpcTransport<XyoSignerRpcSchemas>) => {\n const network = DefaultNetworks.find(network => network.id === gatewayName)\n const resolvedNetwork = assertEx(network, () => `No network found for id ${gatewayName}`)\n\n const remoteConfig: RemoteConfig = {\n rpc: {\n protocol: 'http',\n url: `${resolvedNetwork.url}/rpc`,\n },\n }\n\n const locator = isDefined(signerTransport)\n ? await basicRemoteRunnerLocator(gatewayName, remoteConfig, signerTransport)\n : await basicRemoteViewerLocator(gatewayName, remoteConfig)\n\n return await locator.getInstance<SimpleXyoGateway>(XyoGatewayMoniker)\n}\n", "import { useContextEx } from '@xylabs/react-shared'\n\nimport { InPageGatewaysContext } from './InPageGatewaysContext.ts'\nimport type { InPageGatewaysStateFields } from './InPageGatewaysState.ts'\n\n/**\n * Reads the `InPageGatewaysContext` map of per-network in-page gateways.\n * Intended for internal use by `GatewayProvider` \u2014 application code\n * should prefer `useProvidedGateway`, which returns a single resolved\n * gateway regardless of source.\n *\n * @param required - When `true` (default), throws if no\n * `InPageGatewaysProvider` is mounted above.\n */\nexport const useProvidedInPageGateways = (required = true) => useContextEx<InPageGatewaysStateFields>(InPageGatewaysContext, 'InPageGateways', required)\n", "import { ErrorRender } from '@xylabs/react-error'\nimport { isDefinedNotNull, isNull } from '@xylabs/sdk-js'\nimport React, { useMemo } from 'react'\n\nimport { useGatewayFromWallet } from '../../hooks/index.ts'\nimport { GatewayContext } from '../GatewayContext.ts'\nimport type { GatewayProviderProps } from '../GatewayProviderProps.ts'\nimport type { GatewayContextState } from '../GatewayProviderState.ts'\nimport { useProvidedInPageGateways } from '../in-page/index.ts'\n\n/**\n * Publishes the shared `GatewayContext` backed by two sources: the\n * injected XL1 Wallet extension *and* the in-page gateways built by\n * `InPageGatewaysProvider`. Use this provider when the host app can\n * function without a wallet (falling back to the in-page client) but\n * should still prefer the wallet when it is present.\n *\n * Required ancestry: an `InPageGatewaysProvider` must be mounted above\n * this provider \u2014 `useProvidedInPageGateways(true)` throws if missing.\n * If you only need a wallet-backed gateway, use `WalletGatewayProvider`\n * instead.\n *\n * Source precedence for `defaultGateway`:\n * - Wallet present and resolved (`XyoGatewayRunner`) \u2192 wallet wins; the\n * in-page gateway is still exposed via `gateways.inPageGateway` for\n * the rare consumer that needs to target it specifically.\n * - Wallet definitively absent (`null`) \u2192 fall back to the in-page\n * gateway matching `gatewayName`.\n * - Wallet still resolving (`undefined`) \u2192 leave `defaultGateway`\n * `undefined` so consumers render a loading state rather than\n * committing to the in-page fallback prematurely.\n *\n * The published `GatewayContextState` shape:\n * - `defaultGateway` \u2014 resolved per the precedence above. Three-state:\n * `undefined` = loading, `null` is not produced by this provider\n * (wallet-null collapses to `gatewayFromConfig`), `XyoGateway` = ready.\n * - `gateways.walletGateway` \u2014 raw wallet result (tri-state).\n * - `gateways.inPageGateway` \u2014 raw in-page result for the requested\n * `gatewayName`, or `undefined` if no `gatewayName` was passed.\n * - `error` \u2014 first non-null of wallet error, then in-page build error\n * for this `gatewayName`. Also rendered inline via `ErrorRender` above\n * `children` so mount-time failures surface even when no consumer\n * reads `error`.\n * - `resetGatewaysFromConfig` \u2014 forwards `clearAll` from\n * `InPageGatewaysProvider`, letting consumers force a rebuild of the\n * in-page gateways (e.g. after a network or endpoint change).\n * - `provided: true` \u2014 lets descendants detect a real provider in the\n * tree.\n *\n * `defaultGateway`, `gateways`, and the context `value` are memoized so\n * consumers only re-render when wallet or in-page sources actually\n * change identity.\n */\nexport const GatewayProvider: React.FC<GatewayProviderProps> = ({ gatewayName, children }) => {\n const {\n gateway: gatewayFromWallet,\n error: gatewayFromWalletError,\n } = useGatewayFromWallet(gatewayName)\n\n const {\n gateways: allGateways,\n errors: allGatewayErrors,\n clearAll,\n } = useProvidedInPageGateways(true)\n\n const gatewayFromConfig = gatewayName ? allGateways[gatewayName] : undefined\n const gatewayFromConfigError = gatewayName ? allGatewayErrors[gatewayName] : undefined\n\n const { defaultGateway, gateways } = useMemo(() => {\n if (isNull(gatewayFromWallet)) {\n return {\n defaultGateway: gatewayFromConfig,\n gateways: {\n inPageGateway: gatewayFromConfig,\n walletGateway: null,\n },\n }\n } else if (isDefinedNotNull(gatewayFromWallet)) {\n return {\n defaultGateway: gatewayFromWallet,\n gateways: {\n inPageGateway: gatewayFromConfig,\n walletGateway: gatewayFromWallet,\n },\n }\n }\n return {\n defaultGateway: undefined,\n gateways: {\n inPageGateway: undefined,\n walletGateway: undefined,\n },\n }\n }, [gatewayFromConfig, gatewayFromWallet])\n\n const value = useMemo(() => {\n const value: GatewayContextState = {\n defaultGateway,\n error: gatewayFromWalletError ?? gatewayFromConfigError,\n gateways,\n provided: true,\n resetGatewaysFromConfig: clearAll,\n }\n return value\n }, [\n defaultGateway,\n gatewayFromWalletError,\n gatewayFromConfigError,\n gateways,\n clearAll,\n ])\n\n return (\n <GatewayContext value={value}>\n <ErrorRender error={gatewayFromConfigError} />\n {children}\n </GatewayContext>\n )\n}\n", "import { ErrorRender } from '@xylabs/react-error'\nimport React, { useMemo } from 'react'\n\nimport { useGatewayFromWallet } from '../../hooks/index.ts'\nimport { GatewayContext } from '../GatewayContext.ts'\nimport type { GatewayProviderProps } from '../GatewayProviderProps.ts'\nimport type { GatewayContextState } from '../GatewayProviderState.ts'\n\n/**\n * Publishes a `GatewayContext` backed exclusively by the injected XL1 Wallet\n * extension (i.e. `globalThis.xyo`). This is the provider to use when the\n * host app is a browser UI that expects the user to bring their own wallet,\n * rather than running an in-page gateway.\n *\n * The requested `gatewayName` is forwarded to `useGatewayFromWallet`, whose\n * returned gateway uses a three-state contract (`undefined` = still\n * resolving, `null` = wallet confirmed absent / timed out,\n * `XyoGatewayRunner` = ready). That tri-state is passed through to\n * consumers unchanged as `defaultGateway` / `gateways.walletGateway`, so\n * downstream hooks can distinguish \"loading\" from \"missing\".\n *\n * The published `GatewayContextState` shape:\n * - `defaultGateway` \u2014 the wallet gateway, used when consumers don't\n * specify which gateway they want.\n * - `gateways.walletGateway` \u2014 same instance as `defaultGateway`.\n * - `gateways.inPageGateway` \u2014 always `null` here; this provider does not\n * stand up an in-page client. Pair with a different provider if you need\n * both.\n * - `error` \u2014 surfaced from `useGatewayFromWallet` (detection / timeout /\n * wallet errors). Also rendered inline via `ErrorRender` above `children`\n * so mount-time failures are visible even if no consumer reads `error`.\n * - `provided: true` \u2014 lets descendants detect that a real provider (not\n * the default empty context) is in the tree.\n *\n * The `defaultGateway`, `gateways`, and context `value` are memoized so\n * consumers only re-render when the underlying wallet gateway reference or\n * error actually changes.\n */\nexport const WalletGatewayProvider: React.FC<GatewayProviderProps> = ({ gatewayName, children }) => {\n const {\n gateway: gatewayFromWallet,\n error: gatewayFromWalletError,\n } = useGatewayFromWallet(gatewayName)\n\n const { defaultGateway, gateways } = useMemo(() => {\n return {\n defaultGateway: gatewayFromWallet,\n gateways: {\n inPageGateway: null,\n walletGateway: gatewayFromWallet,\n },\n }\n }, [gatewayFromWallet])\n\n const value = useMemo(() => {\n const value: GatewayContextState = {\n defaultGateway,\n error: gatewayFromWalletError,\n gateways,\n provided: true,\n }\n return value\n }, [\n defaultGateway,\n gatewayFromWalletError,\n gateways,\n ])\n\n return (\n <GatewayContext value={value}>\n <ErrorRender error={gatewayFromWalletError} />\n {children}\n </GatewayContext>\n )\n}\n", "import { useContextEx } from '@xylabs/react-shared'\n\nimport { GatewayContext } from './GatewayContext.ts'\nimport type { GatewayStateFields } from './GatewayProviderState.ts'\n\n/**\n * The sole consumer entry point for gateway state. Reads the nearest\n * `GatewayContext` in the tree, regardless of which provider published\n * it \u2014 this is the decoupling that lets a component work unchanged when\n * the surrounding app swaps `WalletGatewayProvider` for\n * `GatewayProvider` (or a test double).\n *\n * @param required - When `true` (default), throws if no gateway provider\n * is mounted above \u2014 use this when the component is meaningless\n * without a gateway. When `false`, returns default state (all fields\n * undefined) so the component can render a graceful fallback.\n */\nexport const useProvidedGateway = (required = true) => useContextEx<GatewayStateFields>(GatewayContext, 'Gateway', required)\n"],
5
+ "mappings": "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",
6
+ "names": ["Stack", "Typography", "isDefined", "isDefinedNotNull", "useEffect", "useState", "isUndefined", "isUndefined", "isDefined", "isDefined", "jsx", "jsxs", "useState", "isDefinedNotNull", "useEffect", "Stack", "isDefined", "Typography", "Alert", "Chip", "Divider", "Stack", "Typography", "ButtonEx", "ErrorRender", "isDefined", "isDefinedNotNull", "useCallback", "useState", "Alert", "Stack", "ButtonEx", "isDefined", "isDefinedNotNull", "useCallback", "useEffect", "useState", "Alert", "Stack", "Typography", "ButtonEx", "ErrorRender", "isDefined", "React", "jsx", "jsxs", "jsx", "jsxs", "useState", "useCallback", "isDefinedNotNull", "useEffect", "isDefined", "Stack", "Alert", "ButtonEx", "jsx", "jsxs", "Stack", "Typography", "ButtonEx", "Chip", "isDefined", "useState", "useCallback", "isDefinedNotNull", "Alert", "Divider", "ErrorRender", "Alert", "Stack", "Typography", "ButtonEx", "ErrorRender", "isDefined", "isUndefined", "useEffect", "useCallback", "useState", "useState", "useCallback", "address", "jsx", "jsxs", "ButtonEx", "Alert", "Typography", "useEffect", "isDefined", "Stack", "isUndefined", "ErrorRender", "OpenInNew", "Alert", "Chip", "Divider", "Link", "Stack", "Typography", "ButtonEx", "ErrorRender", "usePromise", "isDefined", "isDefinedNotNull", "asSchema", "PayloadBuilder", "ExplorerLinks", "SequenceNetwork", "useMemo", "useState", "jsx", "jsxs", "DEFAULT_EXPLORER_URL", "asSchema", "PayloadBuilder", "Stack", "Typography", "Alert", "ButtonEx", "isDefined", "Chip", "ErrorRender", "Link", "OpenInNew", "SequenceNetwork", "useState", "usePromise", "useMemo", "isDefinedNotNull", "ExplorerLinks", "Divider", "Alert", "Stack", "Typography", "ButtonEx", "ErrorRender", "isDefined", "isDefinedNotNull", "useState", "jsx", "jsxs", "useState", "isDefinedNotNull", "Stack", "Alert", "ButtonEx", "Typography", "isDefined", "ErrorRender", "Stack", "TextField", "Typography", "useMemo", "useState", "jsx", "jsxs", "useState", "useMemo", "Stack", "TextField", "Typography", "Alert", "Stack", "Typography", "ButtonEx", "ErrorRender", "isDefined", "isDefinedNotNull", "useState", "jsx", "jsxs", "useState", "isDefinedNotNull", "Stack", "Alert", "ButtonEx", "Typography", "isDefined", "ErrorRender", "Alert", "Stack", "TextField", "Typography", "useMemo", "useState", "jsx", "jsxs", "buildDefaultPayload", "parsePayload", "useState", "useMemo", "Stack", "TextField", "Typography", "Alert", "Alert", "Stack", "Typography", "ButtonEx", "ErrorRender", "isDefined", "isDefinedNotNull", "useState", "jsx", "jsxs", "useState", "isDefinedNotNull", "Stack", "Alert", "ButtonEx", "isDefined", "Typography", "ErrorRender", "Divider", "Stack", "Typography", "FormControl", "InputLabel", "MenuItem", "Select", "Stack", "asSchema", "useMemo", "useState", "Alert", "Stack", "Typography", "ButtonEx", "ErrorRender", "isDefined", "isDefinedNotNull", "useState", "jsx", "jsxs", "useState", "isDefinedNotNull", "Stack", "Alert", "ButtonEx", "isDefined", "Typography", "ErrorRender", "jsx", "jsxs", "asSchema", "useState", "useMemo", "Stack", "FormControl", "InputLabel", "Select", "MenuItem", "jsx", "jsxs", "Stack", "Typography", "Divider", "Alert", "Chip", "Divider", "Stack", "Typography", "ButtonEx", "PopoverErrorRender", "assertEx", "isDefined", "isDefinedNotNull", "PayloadBuilder", "HashSchema", "SequenceNetwork", "useCallback", "useState", "jsx", "jsxs", "SIGNER_PERMISSIONS", "SequenceNetwork", "useState", "isDefinedNotNull", "useCallback", "assertEx", "PayloadBuilder", "isDefined", "HashSchema", "Stack", "Alert", "Typography", "Divider", "ButtonEx", "PopoverErrorRender", "Chip", "createContextEx", "DefaultNetworks", "useCallback", "useEffect", "useMemo", "useState", "assertEx", "isDefined", "network", "jsx", "useState", "useCallback", "useEffect", "DefaultNetworks", "useMemo", "value", "ErrorRender", "isDefinedNotNull", "isNull", "useMemo", "jsx", "jsxs", "useMemo", "isNull", "isDefinedNotNull", "value", "ErrorRender", "ErrorRender", "useMemo", "jsx", "jsxs", "useMemo", "value", "ErrorRender", "useContextEx", "useContextEx"]
7
7
  }