@bounded-sh/client 0.0.44 → 0.0.50

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.
Files changed (71) hide show
  1. package/README.md +21 -0
  2. package/dist/auth/crossmint-signer-bridge.d.ts +1 -1
  3. package/dist/auth/index.d.ts +1 -1
  4. package/dist/auth/providers/email-auth-provider.d.ts +1 -2
  5. package/dist/auth/providers/guest-auth-provider.d.ts +8 -1
  6. package/dist/auth/providers/guest-keystore.d.ts +2 -0
  7. package/dist/auth/providers/injected-wallet-provider.d.ts +1 -1
  8. package/dist/auth/providers/offchain-auth-provider.d.ts +3 -3
  9. package/dist/auth/providers/phantom-wallet-provider.d.ts +1 -1
  10. package/dist/auth/providers/privy-expo-provider.d.ts +1 -1
  11. package/dist/auth/providers/privy-wallet-provider.d.ts +1 -1
  12. package/dist/auth/providers/sol/sol-utils.d.ts +1 -1
  13. package/dist/auth/providers/transaction-utils.d.ts +1 -1
  14. package/dist/builds/apps.d.ts +32 -0
  15. package/dist/builds/client.d.ts +74 -0
  16. package/dist/builds/index.d.ts +20 -0
  17. package/dist/builds/types.d.ts +121 -0
  18. package/dist/builds/watch.d.ts +20 -0
  19. package/dist/email-auth-provider-B7czfBEU.mjs +99 -0
  20. package/dist/email-auth-provider-B7czfBEU.mjs.map +1 -0
  21. package/dist/email-auth-provider-CmYs6Dcm.js +102 -0
  22. package/dist/email-auth-provider-CmYs6Dcm.js.map +1 -0
  23. package/dist/email-auth-provider-DIZAETBC.mjs +99 -0
  24. package/dist/email-auth-provider-DIZAETBC.mjs.map +1 -0
  25. package/dist/email-auth-provider-Dj66AuH0.js +102 -0
  26. package/dist/email-auth-provider-Dj66AuH0.js.map +1 -0
  27. package/dist/global.d.ts +3 -1
  28. package/dist/guest-auth-provider-B5sgg-q5.js +277 -0
  29. package/dist/guest-auth-provider-B5sgg-q5.js.map +1 -0
  30. package/dist/guest-auth-provider-BR0_YL8z.mjs +275 -0
  31. package/dist/guest-auth-provider-BR0_YL8z.mjs.map +1 -0
  32. package/dist/guest-auth-provider-CCpNvX3j.mjs +275 -0
  33. package/dist/guest-auth-provider-CCpNvX3j.mjs.map +1 -0
  34. package/dist/guest-auth-provider-CxsLCznO.js +277 -0
  35. package/dist/guest-auth-provider-CxsLCznO.js.map +1 -0
  36. package/dist/hooks/useBuildRun.d.ts +13 -0
  37. package/dist/index-BYy1tSkr.mjs +6123 -0
  38. package/dist/index-BYy1tSkr.mjs.map +1 -0
  39. package/dist/index-m42Be5Oj.js +6190 -0
  40. package/dist/index-m42Be5Oj.js.map +1 -0
  41. package/dist/index.d.ts +5 -0
  42. package/dist/index.js +91 -6378
  43. package/dist/index.js.map +1 -1
  44. package/dist/index.mjs +2 -6283
  45. package/dist/index.mjs.map +1 -1
  46. package/dist/index.native-B-ldAbu2.mjs +5972 -0
  47. package/dist/index.native-B-ldAbu2.mjs.map +1 -0
  48. package/dist/index.native-BfoLJCZg.js +6035 -0
  49. package/dist/index.native-BfoLJCZg.js.map +1 -0
  50. package/dist/index.native.d.ts +5 -0
  51. package/dist/index.native.js +87 -6308
  52. package/dist/index.native.js.map +1 -1
  53. package/dist/index.native.mjs +2 -6217
  54. package/dist/index.native.mjs.map +1 -1
  55. package/dist/injected-evm-wallet-provider-BLQzWiBP.js +343 -0
  56. package/dist/injected-evm-wallet-provider-BLQzWiBP.js.map +1 -0
  57. package/dist/injected-evm-wallet-provider-BXj1YFaZ.js +409 -0
  58. package/dist/injected-evm-wallet-provider-BXj1YFaZ.js.map +1 -0
  59. package/dist/injected-evm-wallet-provider-sBCSkksr.mjs +340 -0
  60. package/dist/injected-evm-wallet-provider-sBCSkksr.mjs.map +1 -0
  61. package/dist/injected-evm-wallet-provider-ubsHX217.mjs +406 -0
  62. package/dist/injected-evm-wallet-provider-ubsHX217.mjs.map +1 -0
  63. package/dist/injected-wallet-provider-BfzoheDy.mjs +260 -0
  64. package/dist/injected-wallet-provider-BfzoheDy.mjs.map +1 -0
  65. package/dist/injected-wallet-provider-Cml9TkyV.js +263 -0
  66. package/dist/injected-wallet-provider-Cml9TkyV.js.map +1 -0
  67. package/dist/injected-wallet-provider-DG87X6AQ.mjs +279 -0
  68. package/dist/injected-wallet-provider-DG87X6AQ.mjs.map +1 -0
  69. package/dist/injected-wallet-provider-PYcvLO2Z.js +282 -0
  70. package/dist/injected-wallet-provider-PYcvLO2Z.js.map +1 -0
  71. package/package.json +10 -5
@@ -0,0 +1,277 @@
1
+ 'use strict';
2
+
3
+ var core = require('@bounded-sh/core');
4
+ var index_native = require('./index.native-BfoLJCZg.js');
5
+ require('react');
6
+
7
+ // guest-keystore.ts — durable per-device keypair for anonymous ("guest") auth.
8
+ //
9
+ // A guest is an ed25519 keypair generated on the device. Its public key is the
10
+ // Bounded account address; it signs the auth challenge exactly like a wallet.
11
+ //
12
+ // Guest auth has one backend: WebCrypto Ed25519 + IndexedDB. The key is
13
+ // NON-EXTRACTABLE: an XSS can ask it to sign but can never read the private
14
+ // bytes. If WebCrypto or IndexedDB is unavailable, guest auth fails closed
15
+ // instead of silently creating an extractable/stored-secret credential.
16
+ //
17
+ // The public output is a base58 address + a base64
18
+ // detached signature, which is the format the session endpoint already accepts.
19
+ const LEGACY_STORED_SECRET_KEY = 'bounded_guest_key_v1';
20
+ const IDB_NAME = 'bounded-guest';
21
+ const IDB_STORE = 'keys';
22
+ const IDB_KEY = 'ed25519';
23
+ const GUEST_KEY_REQUIREMENT = 'Guest auth requires non-extractable WebCrypto Ed25519 keys persisted in IndexedDB; ' +
24
+ 'stored-secret guest credentials are disabled.';
25
+ function toBase64(bytes) {
26
+ let bin = '';
27
+ for (let i = 0; i < bytes.length; i++)
28
+ bin += String.fromCharCode(bytes[i]);
29
+ // btoa exists in browsers + RN (Hermes) ; Buffer is the Node/SSR fallback.
30
+ return typeof btoa !== 'undefined' ? btoa(bin) : Buffer.from(bytes).toString('base64');
31
+ }
32
+ // ----- WebCrypto (non-extractable) backend -----------------------------------
33
+ function subtle() {
34
+ const c = globalThis === null || globalThis === void 0 ? void 0 : globalThis.crypto;
35
+ return c && c.subtle ? c.subtle : null;
36
+ }
37
+ function idb() {
38
+ return new Promise((resolve, reject) => {
39
+ const req = globalThis.indexedDB.open(IDB_NAME, 1);
40
+ req.onupgradeneeded = () => req.result.createObjectStore(IDB_STORE);
41
+ req.onsuccess = () => resolve(req.result);
42
+ req.onerror = () => reject(req.error);
43
+ });
44
+ }
45
+ function idbGet(db, key) {
46
+ return new Promise((resolve, reject) => {
47
+ const r = db.transaction(IDB_STORE, 'readonly').objectStore(IDB_STORE).get(key);
48
+ r.onsuccess = () => resolve(r.result);
49
+ r.onerror = () => reject(r.error);
50
+ });
51
+ }
52
+ function idbPut(db, key, val) {
53
+ return new Promise((resolve, reject) => {
54
+ const r = db.transaction(IDB_STORE, 'readwrite').objectStore(IDB_STORE).put(val, key);
55
+ r.onsuccess = () => resolve();
56
+ r.onerror = () => reject(r.error);
57
+ });
58
+ }
59
+ function guestKeyUnavailable(cause) {
60
+ const detail = cause instanceof Error && cause.message ? ` Cause: ${cause.message}` : '';
61
+ return new Error(`${GUEST_KEY_REQUIREMENT}${detail}`);
62
+ }
63
+ async function webCryptoKey(createIfMissing) {
64
+ const s = subtle();
65
+ if (!s)
66
+ throw guestKeyUnavailable(new Error('WebCrypto subtle crypto is unavailable.'));
67
+ if (typeof globalThis.indexedDB === 'undefined') {
68
+ throw guestKeyUnavailable(new Error('IndexedDB is unavailable.'));
69
+ }
70
+ try {
71
+ const db = await idb();
72
+ let pair = (await idbGet(db, IDB_KEY));
73
+ if (!pair) {
74
+ if (!createIfMissing)
75
+ return null;
76
+ // Probe Ed25519 support by generating (throws on unsupported engines).
77
+ pair = (await s.generateKey({ name: 'Ed25519' }, /* extractable */ false, [
78
+ 'sign',
79
+ 'verify',
80
+ ]));
81
+ await idbPut(db, IDB_KEY, pair); // CryptoKey is structured-cloneable; bytes never exposed
82
+ }
83
+ const raw = new Uint8Array(await s.exportKey('raw', pair.publicKey)); // public is exportable
84
+ const address = index_native.bs58.encode(raw);
85
+ return {
86
+ address,
87
+ nonExtractable: true,
88
+ async sign(message) {
89
+ const data = new TextEncoder().encode(message);
90
+ const sig = new Uint8Array(await s.sign({ name: 'Ed25519' }, pair.privateKey, data));
91
+ return toBase64(sig);
92
+ },
93
+ };
94
+ }
95
+ catch (error) {
96
+ throw guestKeyUnavailable(error);
97
+ }
98
+ }
99
+ let cached = null;
100
+ /** Get (or create) this device's durable guest key. */
101
+ async function getGuestKey() {
102
+ if (cached)
103
+ return cached;
104
+ cached = await webCryptoKey(true);
105
+ if (!cached)
106
+ throw guestKeyUnavailable(new Error('Guest key creation returned no key.'));
107
+ return cached;
108
+ }
109
+ /** Read the existing durable guest key without ever minting a replacement. */
110
+ async function getExistingGuestKey() {
111
+ if (cached)
112
+ return cached;
113
+ cached = await webCryptoKey(false);
114
+ return cached;
115
+ }
116
+ /** Forget the guest key on this device (a fresh signInAnonymously mints a new one). */
117
+ async function clearGuestKey() {
118
+ cached = null;
119
+ try {
120
+ index_native.getPlatform().storage.removeItem(LEGACY_STORED_SECRET_KEY);
121
+ }
122
+ catch (_a) { }
123
+ try {
124
+ if (typeof globalThis.indexedDB !== 'undefined') {
125
+ const db = await idb();
126
+ await new Promise((res) => {
127
+ const r = db.transaction(IDB_STORE, 'readwrite').objectStore(IDB_STORE).delete(IDB_KEY);
128
+ r.onsuccess = () => res();
129
+ r.onerror = () => res();
130
+ });
131
+ }
132
+ }
133
+ catch (_b) { }
134
+ }
135
+
136
+ const GUEST_TX_UNSUPPORTED = 'Guest (anonymous) auth is offchain-only — it cannot sign or submit Solana transactions. ' +
137
+ 'Use a wallet provider for onchain actions.';
138
+ class GuestAuthProvider {
139
+ async loginInternal(commitGlobalState, manageLoading) {
140
+ if (manageLoading)
141
+ index_native.setAuthLoading(true);
142
+ try {
143
+ const key = await getGuestKey();
144
+ // Reuse a still-valid session for this exact guest.
145
+ const existing = await core.getActiveSessionManager().getSession();
146
+ if (existing && existing.address === key.address) {
147
+ if (!this.tokenIsGuest(core.getActiveSessionManager().getIdToken(), key.address)) {
148
+ throw new Error('The active session for this device key is not anonymous. Sign out explicitly before starting a guest session.');
149
+ }
150
+ const user = { address: key.address, isAnonymous: true, provider: this };
151
+ if (commitGlobalState)
152
+ index_native.setCurrentUser(user);
153
+ return user;
154
+ }
155
+ // Mint a fresh session: nonce -> canonical message -> local signature.
156
+ const nonce = await core.genAuthNonce();
157
+ const message = await core.genSolanaMessage(key.address, nonce);
158
+ const signature = await key.sign(message); // base64 detached ed25519
159
+ // Pass the discriminator explicitly. During a transactional switch the
160
+ // shared core config intentionally remains on the previous provider until
161
+ // this session is safely minted and persisted.
162
+ const result = await core.createSessionWithSignature(key.address, message, signature, 'guest');
163
+ if (!this.tokenIsGuest(result.idToken, key.address)) {
164
+ throw new Error('Guest session issuer returned a non-anonymous or identity-mismatched token.');
165
+ }
166
+ await core.getActiveSessionManager().storeSession(key.address, result.accessToken, result.idToken, result.refreshToken);
167
+ const user = { address: key.address, isAnonymous: true, provider: this };
168
+ if (commitGlobalState)
169
+ index_native.setCurrentUser(user);
170
+ return user;
171
+ }
172
+ finally {
173
+ if (manageLoading)
174
+ index_native.setAuthLoading(false);
175
+ }
176
+ }
177
+ async login() {
178
+ return this.loginInternal(true, true);
179
+ }
180
+ /** @internal Stage a guest session without exposing mixed provider/user state. */
181
+ async loginForProviderSwitch() {
182
+ return this.loginInternal(false, false);
183
+ }
184
+ tokenIsGuest(idToken, expectedAddress) {
185
+ var _a;
186
+ try {
187
+ if (!idToken)
188
+ return false;
189
+ let b64 = (_a = idToken.split('.')[1]) === null || _a === void 0 ? void 0 : _a.replace(/-/g, '+').replace(/_/g, '/');
190
+ if (!b64)
191
+ return false;
192
+ const pad = b64.length % 4;
193
+ if (pad === 2)
194
+ b64 += '==';
195
+ else if (pad === 3)
196
+ b64 += '=';
197
+ const claims = JSON.parse(index_native.getPlatform().atob(b64));
198
+ if ((claims === null || claims === void 0 ? void 0 : claims.is_anonymous) !== true)
199
+ return false;
200
+ if (expectedAddress && (claims === null || claims === void 0 ? void 0 : claims['custom:walletAddress']) !== expectedAddress)
201
+ return false;
202
+ return true;
203
+ }
204
+ catch (_b) {
205
+ return false;
206
+ }
207
+ }
208
+ async restoreSessionInternal(commitGlobalState) {
209
+ const manager = core.getActiveSessionManager();
210
+ const session = await manager.getSession();
211
+ if (!session)
212
+ return null;
213
+ // The marker/provider choice is not authority. A guest provider may only
214
+ // continue with an issuer-stamped guest bearer whose persisted device key
215
+ // still controls the exact same address. Anything else is an identity split
216
+ // and must lose bearer authority immediately.
217
+ if (!this.tokenIsGuest(manager.getIdToken(), session.address)) {
218
+ manager.clearSession();
219
+ return null;
220
+ }
221
+ let key;
222
+ try {
223
+ key = await getExistingGuestKey();
224
+ }
225
+ catch (_a) {
226
+ manager.clearSession();
227
+ return null;
228
+ }
229
+ if (!key || session.address !== key.address) {
230
+ manager.clearSession();
231
+ return null;
232
+ }
233
+ const user = { address: key.address, isAnonymous: true, provider: this };
234
+ if (commitGlobalState)
235
+ index_native.setCurrentUser(user);
236
+ return user;
237
+ }
238
+ async restoreSession() {
239
+ return this.restoreSessionInternal(true);
240
+ }
241
+ /** @internal Reconcile an applied-yet-error guest mint before committing a switch. */
242
+ async restoreSessionForProviderSwitch() {
243
+ return this.restoreSessionInternal(false);
244
+ }
245
+ async logout() {
246
+ // Clears the SESSION but keeps the device key, so logging back in returns the
247
+ // SAME guest identity (and its data). Use forgetGuest() to wipe the key too.
248
+ core.getActiveSessionManager().clearSession();
249
+ index_native.setCurrentUser(null);
250
+ }
251
+ /** Wipe the device key — the next login() is a brand-new guest identity. */
252
+ async forgetGuest() {
253
+ core.getActiveSessionManager().clearSession();
254
+ await clearGuestKey();
255
+ index_native.setCurrentUser(null);
256
+ }
257
+ async signMessage(message) {
258
+ const key = await getGuestKey();
259
+ return key.sign(message);
260
+ }
261
+ // --- offchain guest: no Solana transaction surface -------------------------
262
+ async runTransaction(_evm, _sol, _options) {
263
+ throw new Error(GUEST_TX_UNSUPPORTED);
264
+ }
265
+ async signTransaction(_t) {
266
+ throw new Error(GUEST_TX_UNSUPPORTED);
267
+ }
268
+ async signAndSubmitTransaction() {
269
+ throw new Error(GUEST_TX_UNSUPPORTED);
270
+ }
271
+ async getNativeMethods() {
272
+ return {};
273
+ }
274
+ }
275
+
276
+ exports.GuestAuthProvider = GuestAuthProvider;
277
+ //# sourceMappingURL=guest-auth-provider-CxsLCznO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guest-auth-provider-CxsLCznO.js","sources":["../.rollup-tmp/auth/providers/guest-keystore.js","../.rollup-tmp/auth/providers/guest-auth-provider.js"],"sourcesContent":["// guest-keystore.ts — durable per-device keypair for anonymous (\"guest\") auth.\n//\n// A guest is an ed25519 keypair generated on the device. Its public key is the\n// Bounded account address; it signs the auth challenge exactly like a wallet.\n//\n// Guest auth has one backend: WebCrypto Ed25519 + IndexedDB. The key is\n// NON-EXTRACTABLE: an XSS can ask it to sign but can never read the private\n// bytes. If WebCrypto or IndexedDB is unavailable, guest auth fails closed\n// instead of silently creating an extractable/stored-secret credential.\n//\n// The public output is a base58 address + a base64\n// detached signature, which is the format the session endpoint already accepts.\nimport bs58 from 'bs58';\nimport { getPlatform } from '../../platform';\nconst LEGACY_STORED_SECRET_KEY = 'bounded_guest_key_v1';\nconst IDB_NAME = 'bounded-guest';\nconst IDB_STORE = 'keys';\nconst IDB_KEY = 'ed25519';\nconst GUEST_KEY_REQUIREMENT = 'Guest auth requires non-extractable WebCrypto Ed25519 keys persisted in IndexedDB; ' +\n 'stored-secret guest credentials are disabled.';\nfunction toBase64(bytes) {\n let bin = '';\n for (let i = 0; i < bytes.length; i++)\n bin += String.fromCharCode(bytes[i]);\n // btoa exists in browsers + RN (Hermes) ; Buffer is the Node/SSR fallback.\n return typeof btoa !== 'undefined' ? btoa(bin) : Buffer.from(bytes).toString('base64');\n}\n// ----- WebCrypto (non-extractable) backend -----------------------------------\nfunction subtle() {\n const c = globalThis === null || globalThis === void 0 ? void 0 : globalThis.crypto;\n return c && c.subtle ? c.subtle : null;\n}\nfunction idb() {\n return new Promise((resolve, reject) => {\n const req = globalThis.indexedDB.open(IDB_NAME, 1);\n req.onupgradeneeded = () => req.result.createObjectStore(IDB_STORE);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\nfunction idbGet(db, key) {\n return new Promise((resolve, reject) => {\n const r = db.transaction(IDB_STORE, 'readonly').objectStore(IDB_STORE).get(key);\n r.onsuccess = () => resolve(r.result);\n r.onerror = () => reject(r.error);\n });\n}\nfunction idbPut(db, key, val) {\n return new Promise((resolve, reject) => {\n const r = db.transaction(IDB_STORE, 'readwrite').objectStore(IDB_STORE).put(val, key);\n r.onsuccess = () => resolve();\n r.onerror = () => reject(r.error);\n });\n}\nfunction guestKeyUnavailable(cause) {\n const detail = cause instanceof Error && cause.message ? ` Cause: ${cause.message}` : '';\n return new Error(`${GUEST_KEY_REQUIREMENT}${detail}`);\n}\nasync function webCryptoKey(createIfMissing) {\n const s = subtle();\n if (!s)\n throw guestKeyUnavailable(new Error('WebCrypto subtle crypto is unavailable.'));\n if (typeof globalThis.indexedDB === 'undefined') {\n throw guestKeyUnavailable(new Error('IndexedDB is unavailable.'));\n }\n try {\n const db = await idb();\n let pair = (await idbGet(db, IDB_KEY));\n if (!pair) {\n if (!createIfMissing)\n return null;\n // Probe Ed25519 support by generating (throws on unsupported engines).\n pair = (await s.generateKey({ name: 'Ed25519' }, /* extractable */ false, [\n 'sign',\n 'verify',\n ]));\n await idbPut(db, IDB_KEY, pair); // CryptoKey is structured-cloneable; bytes never exposed\n }\n const raw = new Uint8Array(await s.exportKey('raw', pair.publicKey)); // public is exportable\n const address = bs58.encode(raw);\n return {\n address,\n nonExtractable: true,\n async sign(message) {\n const data = new TextEncoder().encode(message);\n const sig = new Uint8Array(await s.sign({ name: 'Ed25519' }, pair.privateKey, data));\n return toBase64(sig);\n },\n };\n }\n catch (error) {\n throw guestKeyUnavailable(error);\n }\n}\nlet cached = null;\n/** Get (or create) this device's durable guest key. */\nexport async function getGuestKey() {\n if (cached)\n return cached;\n cached = await webCryptoKey(true);\n if (!cached)\n throw guestKeyUnavailable(new Error('Guest key creation returned no key.'));\n return cached;\n}\n/** Read the existing durable guest key without ever minting a replacement. */\nexport async function getExistingGuestKey() {\n if (cached)\n return cached;\n cached = await webCryptoKey(false);\n return cached;\n}\n/** Forget the guest key on this device (a fresh signInAnonymously mints a new one). */\nexport async function clearGuestKey() {\n cached = null;\n try {\n getPlatform().storage.removeItem(LEGACY_STORED_SECRET_KEY);\n }\n catch (_a) { }\n try {\n if (typeof globalThis.indexedDB !== 'undefined') {\n const db = await idb();\n await new Promise((res) => {\n const r = db.transaction(IDB_STORE, 'readwrite').objectStore(IDB_STORE).delete(IDB_KEY);\n r.onsuccess = () => res();\n r.onerror = () => res();\n });\n }\n }\n catch (_b) { }\n}\n","import { getActiveSessionManager as SessionManager, createSessionWithSignature, genAuthNonce, genSolanaMessage, } from '@bounded-sh/core';\nimport { getPlatform } from '../../platform';\nimport { setCurrentUser, setAuthLoading } from '../../global';\nimport { getGuestKey, getExistingGuestKey, clearGuestKey } from './guest-keystore';\nconst GUEST_TX_UNSUPPORTED = 'Guest (anonymous) auth is offchain-only — it cannot sign or submit Solana transactions. ' +\n 'Use a wallet provider for onchain actions.';\nexport class GuestAuthProvider {\n async loginInternal(commitGlobalState, manageLoading) {\n if (manageLoading)\n setAuthLoading(true);\n try {\n const key = await getGuestKey();\n // Reuse a still-valid session for this exact guest.\n const existing = await SessionManager().getSession();\n if (existing && existing.address === key.address) {\n if (!this.tokenIsGuest(SessionManager().getIdToken(), key.address)) {\n throw new Error('The active session for this device key is not anonymous. Sign out explicitly before starting a guest session.');\n }\n const user = { address: key.address, isAnonymous: true, provider: this };\n if (commitGlobalState)\n setCurrentUser(user);\n return user;\n }\n // Mint a fresh session: nonce -> canonical message -> local signature.\n const nonce = await genAuthNonce();\n const message = await genSolanaMessage(key.address, nonce);\n const signature = await key.sign(message); // base64 detached ed25519\n // Pass the discriminator explicitly. During a transactional switch the\n // shared core config intentionally remains on the previous provider until\n // this session is safely minted and persisted.\n const result = await createSessionWithSignature(key.address, message, signature, 'guest');\n if (!this.tokenIsGuest(result.idToken, key.address)) {\n throw new Error('Guest session issuer returned a non-anonymous or identity-mismatched token.');\n }\n await SessionManager().storeSession(key.address, result.accessToken, result.idToken, result.refreshToken);\n const user = { address: key.address, isAnonymous: true, provider: this };\n if (commitGlobalState)\n setCurrentUser(user);\n return user;\n }\n finally {\n if (manageLoading)\n setAuthLoading(false);\n }\n }\n async login() {\n return this.loginInternal(true, true);\n }\n /** @internal Stage a guest session without exposing mixed provider/user state. */\n async loginForProviderSwitch() {\n return this.loginInternal(false, false);\n }\n tokenIsGuest(idToken, expectedAddress) {\n var _a;\n try {\n if (!idToken)\n return false;\n let b64 = (_a = idToken.split('.')[1]) === null || _a === void 0 ? void 0 : _a.replace(/-/g, '+').replace(/_/g, '/');\n if (!b64)\n return false;\n const pad = b64.length % 4;\n if (pad === 2)\n b64 += '==';\n else if (pad === 3)\n b64 += '=';\n const claims = JSON.parse(getPlatform().atob(b64));\n if ((claims === null || claims === void 0 ? void 0 : claims.is_anonymous) !== true)\n return false;\n if (expectedAddress && (claims === null || claims === void 0 ? void 0 : claims['custom:walletAddress']) !== expectedAddress)\n return false;\n return true;\n }\n catch (_b) {\n return false;\n }\n }\n async restoreSessionInternal(commitGlobalState) {\n const manager = SessionManager();\n const session = await manager.getSession();\n if (!session)\n return null;\n // The marker/provider choice is not authority. A guest provider may only\n // continue with an issuer-stamped guest bearer whose persisted device key\n // still controls the exact same address. Anything else is an identity split\n // and must lose bearer authority immediately.\n if (!this.tokenIsGuest(manager.getIdToken(), session.address)) {\n manager.clearSession();\n return null;\n }\n let key;\n try {\n key = await getExistingGuestKey();\n }\n catch (_a) {\n manager.clearSession();\n return null;\n }\n if (!key || session.address !== key.address) {\n manager.clearSession();\n return null;\n }\n const user = { address: key.address, isAnonymous: true, provider: this };\n if (commitGlobalState)\n setCurrentUser(user);\n return user;\n }\n async restoreSession() {\n return this.restoreSessionInternal(true);\n }\n /** @internal Reconcile an applied-yet-error guest mint before committing a switch. */\n async restoreSessionForProviderSwitch() {\n return this.restoreSessionInternal(false);\n }\n async logout() {\n // Clears the SESSION but keeps the device key, so logging back in returns the\n // SAME guest identity (and its data). Use forgetGuest() to wipe the key too.\n SessionManager().clearSession();\n setCurrentUser(null);\n }\n /** Wipe the device key — the next login() is a brand-new guest identity. */\n async forgetGuest() {\n SessionManager().clearSession();\n await clearGuestKey();\n setCurrentUser(null);\n }\n async signMessage(message) {\n const key = await getGuestKey();\n return key.sign(message);\n }\n // --- offchain guest: no Solana transaction surface -------------------------\n async runTransaction(_evm, _sol, _options) {\n throw new Error(GUEST_TX_UNSUPPORTED);\n }\n async signTransaction(_t) {\n throw new Error(GUEST_TX_UNSUPPORTED);\n }\n async signAndSubmitTransaction() {\n throw new Error(GUEST_TX_UNSUPPORTED);\n }\n async getNativeMethods() {\n return {};\n }\n}\n"],"names":["bs58","getPlatform","setAuthLoading","SessionManager","setCurrentUser","genAuthNonce","genSolanaMessage","createSessionWithSignature"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { BuildRunClientView, RunEventView } from '../builds/types';
2
+ export interface UseBuildRunOptions {
3
+ /** Initial exclusive event cursor. Defaults to zero. */
4
+ after?: number;
5
+ }
6
+ export interface UseBuildRunResult {
7
+ run: BuildRunClientView | null;
8
+ /** All events observed since this hook instance began watching. */
9
+ events: RunEventView[];
10
+ loading: boolean;
11
+ error: Error | null;
12
+ }
13
+ export declare function useBuildRun(appId: string | null | undefined, runId: string | null | undefined, options?: UseBuildRunOptions): UseBuildRunResult;