@dexterai/connect 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -322,6 +322,20 @@ function createPasskeySigner(vault, apiBase, opts = {}) {
|
|
|
322
322
|
});
|
|
323
323
|
}
|
|
324
324
|
|
|
325
|
+
// src/identity.ts
|
|
326
|
+
function presentOrNull(value) {
|
|
327
|
+
return value && value.length > 0 ? value : null;
|
|
328
|
+
}
|
|
329
|
+
function resolveIdentity(input) {
|
|
330
|
+
const userHandle = presentOrNull(input.userHandle);
|
|
331
|
+
const accountToken = presentOrNull(input.accountToken);
|
|
332
|
+
const hasPasskeyVault = userHandle !== null;
|
|
333
|
+
const hasAccount = accountToken !== null;
|
|
334
|
+
const hasWallet = hasPasskeyVault || hasAccount;
|
|
335
|
+
const kind = hasPasskeyVault ? "passkey-vault" : hasAccount ? "account" : "none";
|
|
336
|
+
return { kind, userHandle, accountToken, hasPasskeyVault, hasAccount, hasWallet };
|
|
337
|
+
}
|
|
338
|
+
|
|
325
339
|
// src/walletStore.ts
|
|
326
340
|
var ACTIVE_HANDLE_KEY = "dexter:passkey:userHandle";
|
|
327
341
|
var ROSTER_KEY = "dexter:passkey:wallets";
|
|
@@ -518,6 +532,7 @@ export {
|
|
|
518
532
|
passkeyLogin,
|
|
519
533
|
createAnonServerPolicy,
|
|
520
534
|
createPasskeySigner,
|
|
535
|
+
resolveIdentity,
|
|
521
536
|
getActiveHandle,
|
|
522
537
|
setActiveHandle,
|
|
523
538
|
getCredentialId,
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { D as DexterConnectConfig, C as CeremonyPhase, S as SignInResult, a as ConnectVault } from './signals-
|
|
2
|
-
export { A as ACTIVE_WALLET_STORAGE_KEY, b as ConnectError, P as PasskeyLoginTokens,
|
|
1
|
+
import { D as DexterConnectConfig, C as CeremonyPhase, S as SignInResult, a as ConnectVault } from './signals-DM7IQdq6.js';
|
|
2
|
+
export { A as ACTIVE_WALLET_STORAGE_KEY, b as ConnectError, I as IdentityInput, c as IdentityKind, P as PasskeyLoginTokens, d as PasskeySignalSupport, R as ResolvedIdentity, e as StoredWallet, f as ejectActiveWallet, g as forgetWallet, h as getActiveHandle, i as getCredentialId, l as listWallets, p as passkeySignalSupport, j as prunePasskey, r as renamePasskey, k as resolveIdentity, s as setActiveHandle, m as subscribeWallet, n as switchWallet, o as syncAcceptedPasskeys } from './signals-DM7IQdq6.js';
|
|
3
3
|
import { DexterApiBrowserPasskeySigner } from '@dexterai/vault/signers/browser';
|
|
4
4
|
|
|
5
5
|
/**
|
package/dist/index.js
CHANGED
|
@@ -16,12 +16,13 @@ import {
|
|
|
16
16
|
passkeySignalSupport,
|
|
17
17
|
prunePasskey,
|
|
18
18
|
renamePasskey,
|
|
19
|
+
resolveIdentity,
|
|
19
20
|
setActiveHandle,
|
|
20
21
|
shouldUsePopup,
|
|
21
22
|
subscribe,
|
|
22
23
|
switchWallet,
|
|
23
24
|
syncAcceptedPasskeys
|
|
24
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-6NIGGPVI.js";
|
|
25
26
|
|
|
26
27
|
// src/enroll.ts
|
|
27
28
|
var DEFAULT_API_BASE = "https://api.dexter.cash";
|
|
@@ -175,6 +176,7 @@ export {
|
|
|
175
176
|
passkeySignalSupport,
|
|
176
177
|
prunePasskey,
|
|
177
178
|
renamePasskey,
|
|
179
|
+
resolveIdentity,
|
|
178
180
|
setActiveHandle,
|
|
179
181
|
subscribe as subscribeWallet,
|
|
180
182
|
switchWallet,
|
package/dist/react.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DexterApiBrowserPasskeySigner } from '@dexterai/vault/signers/browser';
|
|
2
|
-
import { C as CeremonyPhase, S as SignInResult, P as PasskeyLoginTokens, a as ConnectVault, b as ConnectError,
|
|
2
|
+
import { C as CeremonyPhase, S as SignInResult, P as PasskeyLoginTokens, a as ConnectVault, b as ConnectError, e as StoredWallet, d as PasskeySignalSupport, R as ResolvedIdentity } from './signals-DM7IQdq6.js';
|
|
3
3
|
import { ReactElement, ReactNode } from 'react';
|
|
4
4
|
|
|
5
5
|
type ConnectStatus = 'idle' | 'pending' | 'done' | 'error';
|
|
@@ -124,4 +124,48 @@ interface UseDexterWallet {
|
|
|
124
124
|
}
|
|
125
125
|
declare function useDexterWallet(): UseDexterWallet;
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
interface DexterWalletChipProps {
|
|
128
|
+
/** Connected (a wallet/account is present) → avatar + label; else signed-out label only. */
|
|
129
|
+
connected: boolean;
|
|
130
|
+
/** What to show: account name, wallet label, or the signed-out prompt (e.g. "Log in"). */
|
|
131
|
+
label: string;
|
|
132
|
+
/** Avatar image (e.g. a linked X avatar); falls back to the initial. */
|
|
133
|
+
avatarUrl?: string | null;
|
|
134
|
+
/** Single-character avatar fallback (defaults to the first letter of `label`). */
|
|
135
|
+
avatarInitial?: string;
|
|
136
|
+
onClick?: () => void;
|
|
137
|
+
/** Extra className composed after the brand classes. */
|
|
138
|
+
className?: string;
|
|
139
|
+
/** Reflected to aria-expanded (when the chip toggles a menu). */
|
|
140
|
+
ariaExpanded?: boolean;
|
|
141
|
+
}
|
|
142
|
+
/** The branded wallet/account chip. Wire it to open your menu via `onClick`. */
|
|
143
|
+
declare function DexterWalletChip(props: DexterWalletChipProps): ReactElement;
|
|
144
|
+
|
|
145
|
+
interface DexterWalletMenuProps {
|
|
146
|
+
/** The wallet's display name (nickname, else "Dexter Wallet"). */
|
|
147
|
+
walletLabel: string;
|
|
148
|
+
/** Avatar initial (defaults to the first letter of walletLabel). */
|
|
149
|
+
avatarInitial?: string;
|
|
150
|
+
/** "Manage wallet" → the consumer's wallet page. Row hidden if omitted. */
|
|
151
|
+
onManageWallet?: () => void;
|
|
152
|
+
/** "Start fresh" → the consumer ejects/resets (guard + perform on its side). Row hidden if omitted. */
|
|
153
|
+
onStartFresh?: () => void;
|
|
154
|
+
/** Sign-in/save UI revealed when "Save your wallet" is tapped (e.g. <SignInWithDexter/>). Row hidden if omitted. */
|
|
155
|
+
saveSlot?: ReactNode;
|
|
156
|
+
/** Short hint shown above the save UI. */
|
|
157
|
+
saveHint?: string;
|
|
158
|
+
/** Extra className composed after the brand classes. */
|
|
159
|
+
className?: string;
|
|
160
|
+
}
|
|
161
|
+
/** The branded wallet dropdown. */
|
|
162
|
+
declare function DexterWalletMenu(props: DexterWalletMenuProps): ReactElement;
|
|
163
|
+
|
|
164
|
+
interface UseIdentityConfig {
|
|
165
|
+
/** The account session token (e.g. a Supabase access_token), or null when the
|
|
166
|
+
* user has no account session. The SDK is auth-agnostic — pass your own. */
|
|
167
|
+
accountToken: string | null;
|
|
168
|
+
}
|
|
169
|
+
declare function useIdentity({ accountToken }: UseIdentityConfig): ResolvedIdentity;
|
|
170
|
+
|
|
171
|
+
export { type ConnectStatus, DexterButton, type DexterButtonProps, DexterMark, DexterWalletChip, type DexterWalletChipProps, DexterWalletMenu, type DexterWalletMenuProps, SignInWithDexter, type SignInWithDexterProps, type UseDexterWallet, type UseIdentityConfig, type UseSignInWithDexter, type UseSignInWithDexterConfig, useDexterWallet, useIdentity, useSignInWithDexter };
|
package/dist/react.js
CHANGED
|
@@ -10,10 +10,11 @@ import {
|
|
|
10
10
|
passkeySignalSupport,
|
|
11
11
|
prunePasskey,
|
|
12
12
|
renamePasskey,
|
|
13
|
+
resolveIdentity,
|
|
13
14
|
setActiveHandle,
|
|
14
15
|
subscribe,
|
|
15
16
|
switchWallet
|
|
16
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-6NIGGPVI.js";
|
|
17
18
|
|
|
18
19
|
// src/useSignInWithDexter.ts
|
|
19
20
|
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
@@ -321,10 +322,156 @@ function useDexterWallet() {
|
|
|
321
322
|
rename
|
|
322
323
|
};
|
|
323
324
|
}
|
|
325
|
+
|
|
326
|
+
// src/DexterWalletChip.tsx
|
|
327
|
+
import { useEffect as useEffect5 } from "react";
|
|
328
|
+
|
|
329
|
+
// src/walletKitStyles.ts
|
|
330
|
+
var STYLE_ID2 = "dexter-connect-wallet-kit-styles";
|
|
331
|
+
var WALLET_KIT_CSS = `
|
|
332
|
+
.dx-wchip{
|
|
333
|
+
--dx-ember:#f26c18; --dx-ember-2:#ba3a00; --dx-fg:#fff4ea; --dx-radius:0px;
|
|
334
|
+
display:inline-flex; align-items:center; gap:9px; max-width:240px;
|
|
335
|
+
padding:6px 12px 6px 7px; font:inherit; font-weight:600; font-size:.74rem;
|
|
336
|
+
letter-spacing:.1em; text-transform:uppercase; cursor:pointer; background:transparent;
|
|
337
|
+
color:inherit; border:1px solid color-mix(in srgb,var(--dx-ember) 42%,transparent);
|
|
338
|
+
border-radius:var(--dx-radius); -webkit-tap-highlight-color:transparent;
|
|
339
|
+
transition:filter .16s ease, box-shadow .16s ease, border-color .16s ease;
|
|
340
|
+
}
|
|
341
|
+
.dx-wchip:hover{ filter:brightness(1.08); box-shadow:0 8px 18px color-mix(in srgb,var(--dx-ember) 18%,transparent); }
|
|
342
|
+
.dx-wchip:focus-visible{ outline:none; box-shadow:0 0 0 3px color-mix(in srgb,var(--dx-ember) 34%,transparent); }
|
|
343
|
+
.dx-wchip--signedout{ border-color:color-mix(in srgb,currentColor 22%,transparent); padding-left:12px; }
|
|
344
|
+
.dx-wchip__avatar{
|
|
345
|
+
width:22px; height:22px; flex-shrink:0; display:inline-flex; align-items:center; justify-content:center;
|
|
346
|
+
border-radius:50%; overflow:hidden; font-size:.72rem; font-weight:700; letter-spacing:0; line-height:1;
|
|
347
|
+
background:linear-gradient(135deg,var(--dx-ember),var(--dx-ember-2)); color:var(--dx-fg);
|
|
348
|
+
}
|
|
349
|
+
.dx-wchip__avatar img{ width:100%; height:100%; object-fit:cover; }
|
|
350
|
+
.dx-wchip__label{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
351
|
+
|
|
352
|
+
.dx-wmenu{ --dx-ember:#f26c18; --dx-ember-2:#ba3a00; --dx-fg:#fff4ea; display:flex; flex-direction:column; min-width:248px; }
|
|
353
|
+
.dx-wmenu__id{ display:flex; align-items:center; gap:10px; padding:13px 15px; border-bottom:1px solid color-mix(in srgb,currentColor 12%,transparent); }
|
|
354
|
+
.dx-wmenu__avatar{ width:32px; height:32px; flex-shrink:0; display:inline-flex; align-items:center; justify-content:center; border-radius:50%; font-weight:700; font-size:.85rem; line-height:1; background:linear-gradient(135deg,var(--dx-ember),var(--dx-ember-2)); color:var(--dx-fg); }
|
|
355
|
+
.dx-wmenu__meta{ display:flex; flex-direction:column; gap:2px; min-width:0; }
|
|
356
|
+
.dx-wmenu__name{ font-weight:700; font-size:.9rem; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
357
|
+
.dx-wmenu__sub{ font-size:.66rem; letter-spacing:.12em; text-transform:uppercase; opacity:.55; }
|
|
358
|
+
.dx-wmenu__list{ display:flex; flex-direction:column; padding:6px; }
|
|
359
|
+
.dx-wmenu__item{ display:flex; align-items:center; justify-content:space-between; gap:10px; width:100%; padding:10px 12px; font:inherit; font-size:.82rem; font-weight:600; text-align:left; background:transparent; border:none; color:inherit; cursor:pointer; transition:background .12s ease; }
|
|
360
|
+
.dx-wmenu__item:hover{ background:color-mix(in srgb,var(--dx-ember) 10%,transparent); }
|
|
361
|
+
.dx-wmenu__item--danger{ color:#e5552e; }
|
|
362
|
+
.dx-wmenu__icon{ opacity:.45; font-size:.9rem; }
|
|
363
|
+
.dx-wmenu__back{ border-bottom:1px solid color-mix(in srgb,currentColor 10%,transparent); opacity:.85; }
|
|
364
|
+
.dx-wmenu__save{ display:flex; flex-direction:column; gap:9px; padding:13px 15px; }
|
|
365
|
+
.dx-wmenu__savehint{ font-size:.78rem; line-height:1.4; opacity:.7; }
|
|
366
|
+
`;
|
|
367
|
+
function ensureWalletKitStyles() {
|
|
368
|
+
if (typeof document === "undefined") return;
|
|
369
|
+
if (document.getElementById(STYLE_ID2)) return;
|
|
370
|
+
const el = document.createElement("style");
|
|
371
|
+
el.id = STYLE_ID2;
|
|
372
|
+
el.textContent = WALLET_KIT_CSS;
|
|
373
|
+
document.head.appendChild(el);
|
|
374
|
+
}
|
|
375
|
+
ensureWalletKitStyles();
|
|
376
|
+
|
|
377
|
+
// src/DexterWalletChip.tsx
|
|
378
|
+
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
379
|
+
function DexterWalletChip(props) {
|
|
380
|
+
const { connected, label, avatarUrl, avatarInitial, onClick, className, ariaExpanded } = props;
|
|
381
|
+
useEffect5(ensureWalletKitStyles, []);
|
|
382
|
+
const initial = (avatarInitial ?? label.trim().charAt(0) ?? "D").toUpperCase();
|
|
383
|
+
return /* @__PURE__ */ jsxs3(
|
|
384
|
+
"button",
|
|
385
|
+
{
|
|
386
|
+
type: "button",
|
|
387
|
+
className: cx("dx-wchip", !connected && "dx-wchip--signedout", className),
|
|
388
|
+
onClick,
|
|
389
|
+
"aria-expanded": ariaExpanded,
|
|
390
|
+
children: [
|
|
391
|
+
connected ? /* @__PURE__ */ jsx3("span", { className: "dx-wchip__avatar", "aria-hidden": "true", children: avatarUrl ? /* @__PURE__ */ jsx3("img", { src: avatarUrl, alt: "" }) : initial }) : null,
|
|
392
|
+
/* @__PURE__ */ jsx3("span", { className: "dx-wchip__label", children: label })
|
|
393
|
+
]
|
|
394
|
+
}
|
|
395
|
+
);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// src/DexterWalletMenu.tsx
|
|
399
|
+
import { useEffect as useEffect6, useState as useState3 } from "react";
|
|
400
|
+
import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
401
|
+
function DexterWalletMenu(props) {
|
|
402
|
+
const { walletLabel, avatarInitial, onManageWallet, onStartFresh, saveSlot, saveHint, className } = props;
|
|
403
|
+
useEffect6(ensureWalletKitStyles, []);
|
|
404
|
+
const [showSave, setShowSave] = useState3(false);
|
|
405
|
+
const initial = (avatarInitial ?? walletLabel.trim().charAt(0) ?? "D").toUpperCase();
|
|
406
|
+
if (showSave && saveSlot) {
|
|
407
|
+
return /* @__PURE__ */ jsxs4("div", { className: cx("dx-wmenu", className), children: [
|
|
408
|
+
/* @__PURE__ */ jsx4(
|
|
409
|
+
"button",
|
|
410
|
+
{
|
|
411
|
+
type: "button",
|
|
412
|
+
className: "dx-wmenu__item dx-wmenu__back",
|
|
413
|
+
onClick: () => setShowSave(false),
|
|
414
|
+
children: /* @__PURE__ */ jsx4("span", { children: "\u2190 Back to wallet" })
|
|
415
|
+
}
|
|
416
|
+
),
|
|
417
|
+
/* @__PURE__ */ jsxs4("div", { className: "dx-wmenu__save", children: [
|
|
418
|
+
saveHint ? /* @__PURE__ */ jsx4("span", { className: "dx-wmenu__savehint", children: saveHint }) : null,
|
|
419
|
+
saveSlot
|
|
420
|
+
] })
|
|
421
|
+
] });
|
|
422
|
+
}
|
|
423
|
+
return /* @__PURE__ */ jsxs4("div", { className: cx("dx-wmenu", className), children: [
|
|
424
|
+
/* @__PURE__ */ jsxs4("div", { className: "dx-wmenu__id", children: [
|
|
425
|
+
/* @__PURE__ */ jsx4("span", { className: "dx-wmenu__avatar", "aria-hidden": "true", children: initial }),
|
|
426
|
+
/* @__PURE__ */ jsxs4("span", { className: "dx-wmenu__meta", children: [
|
|
427
|
+
/* @__PURE__ */ jsx4("span", { className: "dx-wmenu__name", children: walletLabel }),
|
|
428
|
+
/* @__PURE__ */ jsx4("span", { className: "dx-wmenu__sub", children: "Your Dexter Wallet" })
|
|
429
|
+
] })
|
|
430
|
+
] }),
|
|
431
|
+
/* @__PURE__ */ jsxs4("div", { className: "dx-wmenu__list", children: [
|
|
432
|
+
onManageWallet ? /* @__PURE__ */ jsxs4("button", { type: "button", className: "dx-wmenu__item", onClick: onManageWallet, children: [
|
|
433
|
+
/* @__PURE__ */ jsx4("span", { children: "Manage wallet" }),
|
|
434
|
+
/* @__PURE__ */ jsx4("span", { className: "dx-wmenu__icon", "aria-hidden": "true", children: "\u2197" })
|
|
435
|
+
] }) : null,
|
|
436
|
+
saveSlot ? /* @__PURE__ */ jsxs4("button", { type: "button", className: "dx-wmenu__item", onClick: () => setShowSave(true), children: [
|
|
437
|
+
/* @__PURE__ */ jsx4("span", { children: "Save your wallet" }),
|
|
438
|
+
/* @__PURE__ */ jsx4("span", { className: "dx-wmenu__icon", "aria-hidden": "true", children: "\u2197" })
|
|
439
|
+
] }) : null,
|
|
440
|
+
onStartFresh ? /* @__PURE__ */ jsxs4(
|
|
441
|
+
"button",
|
|
442
|
+
{
|
|
443
|
+
type: "button",
|
|
444
|
+
className: "dx-wmenu__item dx-wmenu__item--danger",
|
|
445
|
+
onClick: onStartFresh,
|
|
446
|
+
children: [
|
|
447
|
+
/* @__PURE__ */ jsx4("span", { children: "Start fresh" }),
|
|
448
|
+
/* @__PURE__ */ jsx4("span", { className: "dx-wmenu__icon", "aria-hidden": "true", children: "\u27F5" })
|
|
449
|
+
]
|
|
450
|
+
}
|
|
451
|
+
) : null
|
|
452
|
+
] })
|
|
453
|
+
] });
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
// src/useIdentity.ts
|
|
457
|
+
import { useMemo as useMemo2 } from "react";
|
|
458
|
+
function useIdentity({ accountToken }) {
|
|
459
|
+
const { activeHandle } = useDexterWallet();
|
|
460
|
+
return useMemo2(
|
|
461
|
+
() => resolveIdentity({
|
|
462
|
+
accountToken: accountToken ?? null,
|
|
463
|
+
userHandle: activeHandle ?? null
|
|
464
|
+
}),
|
|
465
|
+
[accountToken, activeHandle]
|
|
466
|
+
);
|
|
467
|
+
}
|
|
324
468
|
export {
|
|
325
469
|
DexterButton,
|
|
326
470
|
DexterMark,
|
|
471
|
+
DexterWalletChip,
|
|
472
|
+
DexterWalletMenu,
|
|
327
473
|
SignInWithDexter,
|
|
328
474
|
useDexterWallet,
|
|
475
|
+
useIdentity,
|
|
329
476
|
useSignInWithDexter
|
|
330
477
|
};
|
|
@@ -60,6 +60,29 @@ declare class ConnectError extends Error {
|
|
|
60
60
|
constructor(code: string, message?: string);
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
+
type IdentityKind = 'passkey-vault' | 'account' | 'none';
|
|
64
|
+
interface IdentityInput {
|
|
65
|
+
/** An account session token (e.g. Supabase access_token) when present, else null. */
|
|
66
|
+
accountToken: string | null;
|
|
67
|
+
/** The passkey-vault user handle (the connect wallet store), else null. */
|
|
68
|
+
userHandle: string | null;
|
|
69
|
+
}
|
|
70
|
+
interface ResolvedIdentity {
|
|
71
|
+
/** The primary identity axis, passkey-vault-first. */
|
|
72
|
+
kind: IdentityKind;
|
|
73
|
+
/** Passkey-vault identity (FIRST-CLASS): the wallet handle, or null. */
|
|
74
|
+
userHandle: string | null;
|
|
75
|
+
/** Account identity (secondary/legacy axis): bearer for account-scoped fetches, or null. */
|
|
76
|
+
accountToken: string | null;
|
|
77
|
+
/** A passkey vault is present on this device. */
|
|
78
|
+
hasPasskeyVault: boolean;
|
|
79
|
+
/** An account session is present. */
|
|
80
|
+
hasAccount: boolean;
|
|
81
|
+
/** Any identity at all — drives "show the wallet" vs "Sign in with Dexter". */
|
|
82
|
+
hasWallet: boolean;
|
|
83
|
+
}
|
|
84
|
+
declare function resolveIdentity(input: IdentityInput): ResolvedIdentity;
|
|
85
|
+
|
|
63
86
|
/** A wallet this browser knows about. `handle` is the identity; the rest is UX. */
|
|
64
87
|
interface StoredWallet {
|
|
65
88
|
/** base64url 16-byte user handle — the vault identity. */
|
|
@@ -157,4 +180,4 @@ declare function syncAcceptedPasskeys(args: {
|
|
|
157
180
|
rpId?: string;
|
|
158
181
|
}): Promise<boolean>;
|
|
159
182
|
|
|
160
|
-
export { ACTIVE_WALLET_STORAGE_KEY as A, type CeremonyPhase as C, type DexterConnectConfig as D, type PasskeyLoginTokens as P, type SignInResult as S, type ConnectVault as a, ConnectError as b, type
|
|
183
|
+
export { ACTIVE_WALLET_STORAGE_KEY as A, type CeremonyPhase as C, type DexterConnectConfig as D, type IdentityInput as I, type PasskeyLoginTokens as P, type ResolvedIdentity as R, type SignInResult as S, type ConnectVault as a, ConnectError as b, type IdentityKind as c, type PasskeySignalSupport as d, type StoredWallet as e, ejectActiveWallet as f, forgetWallet as g, getActiveHandle as h, getCredentialId as i, prunePasskey as j, resolveIdentity as k, listWallets as l, subscribe as m, switchWallet as n, syncAcceptedPasskeys as o, passkeySignalSupport as p, renamePasskey as r, setActiveHandle as s };
|