@xkova/sdk 0.1.0-alpha.5 → 0.1.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/abi.d.ts CHANGED
@@ -336,6 +336,14 @@ export declare const erc20XGaslessAbi: readonly [{
336
336
  readonly name: "";
337
337
  readonly type: "string";
338
338
  readonly internalType: "string";
339
+ }, {
340
+ readonly name: "";
341
+ readonly type: "uint8";
342
+ readonly internalType: "uint8";
343
+ }, {
344
+ readonly name: "";
345
+ readonly type: "address";
346
+ readonly internalType: "address";
339
347
  }, {
340
348
  readonly name: "";
341
349
  readonly type: "address";
@@ -362,6 +370,10 @@ export declare const erc20XGaslessAbi: readonly [{
362
370
  readonly name: "_symbol";
363
371
  readonly type: "string";
364
372
  readonly internalType: "string";
373
+ }, {
374
+ readonly name: "decimals_";
375
+ readonly type: "uint8";
376
+ readonly internalType: "uint8";
365
377
  }, {
366
378
  readonly name: "defaultAdmin";
367
379
  readonly type: "address";
@@ -370,6 +382,10 @@ export declare const erc20XGaslessAbi: readonly [{
370
382
  readonly name: "minter";
371
383
  readonly type: "address";
372
384
  readonly internalType: "address";
385
+ }, {
386
+ readonly name: "burner";
387
+ readonly type: "address";
388
+ readonly internalType: "address";
373
389
  }, {
374
390
  readonly name: "pauser";
375
391
  readonly type: "address";
@@ -1062,6 +1078,10 @@ export declare const erc20XGaslessAbi: readonly [{
1062
1078
  readonly type: "error";
1063
1079
  readonly name: "InvalidAddress";
1064
1080
  readonly inputs: readonly [];
1081
+ }, {
1082
+ readonly type: "error";
1083
+ readonly name: "InvalidDecimals";
1084
+ readonly inputs: readonly [];
1065
1085
  }, {
1066
1086
  readonly type: "error";
1067
1087
  readonly name: "InvalidImplementation";
@@ -5482,6 +5502,14 @@ export declare const tokenizationAbis: {
5482
5502
  readonly name: "";
5483
5503
  readonly type: "string";
5484
5504
  readonly internalType: "string";
5505
+ }, {
5506
+ readonly name: "";
5507
+ readonly type: "uint8";
5508
+ readonly internalType: "uint8";
5509
+ }, {
5510
+ readonly name: "";
5511
+ readonly type: "address";
5512
+ readonly internalType: "address";
5485
5513
  }, {
5486
5514
  readonly name: "";
5487
5515
  readonly type: "address";
@@ -5508,6 +5536,10 @@ export declare const tokenizationAbis: {
5508
5536
  readonly name: "_symbol";
5509
5537
  readonly type: "string";
5510
5538
  readonly internalType: "string";
5539
+ }, {
5540
+ readonly name: "decimals_";
5541
+ readonly type: "uint8";
5542
+ readonly internalType: "uint8";
5511
5543
  }, {
5512
5544
  readonly name: "defaultAdmin";
5513
5545
  readonly type: "address";
@@ -5516,6 +5548,10 @@ export declare const tokenizationAbis: {
5516
5548
  readonly name: "minter";
5517
5549
  readonly type: "address";
5518
5550
  readonly internalType: "address";
5551
+ }, {
5552
+ readonly name: "burner";
5553
+ readonly type: "address";
5554
+ readonly internalType: "address";
5519
5555
  }, {
5520
5556
  readonly name: "pauser";
5521
5557
  readonly type: "address";
@@ -6208,6 +6244,10 @@ export declare const tokenizationAbis: {
6208
6244
  readonly type: "error";
6209
6245
  readonly name: "InvalidAddress";
6210
6246
  readonly inputs: readonly [];
6247
+ }, {
6248
+ readonly type: "error";
6249
+ readonly name: "InvalidDecimals";
6250
+ readonly inputs: readonly [];
6211
6251
  }, {
6212
6252
  readonly type: "error";
6213
6253
  readonly name: "InvalidImplementation";
package/dist/abi.js CHANGED
@@ -443,6 +443,16 @@ export const erc20XGaslessAbi = [
443
443
  "type": "string",
444
444
  "internalType": "string"
445
445
  },
446
+ {
447
+ "name": "",
448
+ "type": "uint8",
449
+ "internalType": "uint8"
450
+ },
451
+ {
452
+ "name": "",
453
+ "type": "address",
454
+ "internalType": "address"
455
+ },
446
456
  {
447
457
  "name": "",
448
458
  "type": "address",
@@ -476,6 +486,11 @@ export const erc20XGaslessAbi = [
476
486
  "type": "string",
477
487
  "internalType": "string"
478
488
  },
489
+ {
490
+ "name": "decimals_",
491
+ "type": "uint8",
492
+ "internalType": "uint8"
493
+ },
479
494
  {
480
495
  "name": "defaultAdmin",
481
496
  "type": "address",
@@ -486,6 +501,11 @@ export const erc20XGaslessAbi = [
486
501
  "type": "address",
487
502
  "internalType": "address"
488
503
  },
504
+ {
505
+ "name": "burner",
506
+ "type": "address",
507
+ "internalType": "address"
508
+ },
489
509
  {
490
510
  "name": "pauser",
491
511
  "type": "address",
@@ -1376,6 +1396,11 @@ export const erc20XGaslessAbi = [
1376
1396
  "name": "InvalidAddress",
1377
1397
  "inputs": []
1378
1398
  },
1399
+ {
1400
+ "type": "error",
1401
+ "name": "InvalidDecimals",
1402
+ "inputs": []
1403
+ },
1379
1404
  {
1380
1405
  "type": "error",
1381
1406
  "name": "InvalidImplementation",
@@ -1150,6 +1150,23 @@ export interface paths {
1150
1150
  patch?: never;
1151
1151
  trace?: never;
1152
1152
  };
1153
+ "/account-holders/self/wallet-auth": {
1154
+ parameters: {
1155
+ query?: never;
1156
+ header?: never;
1157
+ path?: never;
1158
+ cookie?: never;
1159
+ };
1160
+ get?: never;
1161
+ put?: never;
1162
+ /** Connect the current member's registered wallet */
1163
+ post: operations["issueAccountHolderSelfWalletAuth"];
1164
+ delete?: never;
1165
+ options?: never;
1166
+ head?: never;
1167
+ patch?: never;
1168
+ trace?: never;
1169
+ };
1153
1170
  "/account-holders/self/wallet-provision": {
1154
1171
  parameters: {
1155
1172
  query?: never;
@@ -1235,6 +1252,23 @@ export interface paths {
1235
1252
  patch?: never;
1236
1253
  trace?: never;
1237
1254
  };
1255
+ "/account-holders/self": {
1256
+ parameters: {
1257
+ query?: never;
1258
+ header?: never;
1259
+ path?: never;
1260
+ cookie?: never;
1261
+ };
1262
+ /** Get the current account holder's profile */
1263
+ get: operations["getAccountHolderSelf"];
1264
+ put?: never;
1265
+ post?: never;
1266
+ delete?: never;
1267
+ options?: never;
1268
+ head?: never;
1269
+ patch?: never;
1270
+ trace?: never;
1271
+ };
1238
1272
  "/account-holders/self/balance": {
1239
1273
  parameters: {
1240
1274
  query?: never;
@@ -1440,6 +1474,58 @@ export interface paths {
1440
1474
  patch?: never;
1441
1475
  trace?: never;
1442
1476
  };
1477
+ "/account-holders/self/avatar/upload-url": {
1478
+ parameters: {
1479
+ query?: never;
1480
+ header?: never;
1481
+ path?: never;
1482
+ cookie?: never;
1483
+ };
1484
+ get?: never;
1485
+ put?: never;
1486
+ /** Create a short-lived avatar upload URL */
1487
+ post: operations["presignAccountHolderSelfAvatarUpload"];
1488
+ delete?: never;
1489
+ options?: never;
1490
+ head?: never;
1491
+ patch?: never;
1492
+ trace?: never;
1493
+ };
1494
+ "/account-holders/self/avatar/confirm": {
1495
+ parameters: {
1496
+ query?: never;
1497
+ header?: never;
1498
+ path?: never;
1499
+ cookie?: never;
1500
+ };
1501
+ get?: never;
1502
+ put?: never;
1503
+ /** Confirm an avatar upload for the account holder */
1504
+ post: operations["confirmAccountHolderSelfAvatar"];
1505
+ delete?: never;
1506
+ options?: never;
1507
+ head?: never;
1508
+ patch?: never;
1509
+ trace?: never;
1510
+ };
1511
+ "/account-holders/self/avatar": {
1512
+ parameters: {
1513
+ query?: never;
1514
+ header?: never;
1515
+ path?: never;
1516
+ cookie?: never;
1517
+ };
1518
+ /** Get a short-TTL presigned GET URL for the holder's avatar */
1519
+ get: operations["getAccountHolderSelfAvatarUrl"];
1520
+ put?: never;
1521
+ post?: never;
1522
+ /** Delete the account holder avatar */
1523
+ delete: operations["deleteAccountHolderSelfAvatar"];
1524
+ options?: never;
1525
+ head?: never;
1526
+ patch?: never;
1527
+ trace?: never;
1528
+ };
1443
1529
  "/account-holders/{id}/avatar/upload-url": {
1444
1530
  parameters: {
1445
1531
  query?: never;
@@ -4385,6 +4471,18 @@ export interface components {
4385
4471
  transaction_hash: string | null;
4386
4472
  } | null;
4387
4473
  };
4474
+ WalletAdmissionBootstrap: {
4475
+ /** @enum {string} */
4476
+ strategy: "auth_endpoint";
4477
+ payload: string;
4478
+ client_id: string;
4479
+ /** Format: uuid */
4480
+ project_id: string;
4481
+ external_user_id: string;
4482
+ /** Format: date-time */
4483
+ expires_at: string;
4484
+ expected_address?: string;
4485
+ };
4388
4486
  CuPayoutAccountRef: {
4389
4487
  routing_number: string;
4390
4488
  account_number: string;
@@ -5023,6 +5121,8 @@ export interface components {
5023
5121
  code_challenge_method: "S256";
5024
5122
  };
5025
5123
  MemberAuthHostedAuthorizationStart: {
5124
+ /** Format: uri */
5125
+ hosted_origin: string;
5026
5126
  /** Format: uri */
5027
5127
  authorization_url: string;
5028
5128
  expires_at: components["schemas"]["TimestampUtc"];
@@ -5078,6 +5178,8 @@ export interface components {
5078
5178
  AccountCenterHandoffStart: {
5079
5179
  /** Format: uri */
5080
5180
  handoff_url: string;
5181
+ /** Format: uri */
5182
+ hosted_origin: string;
5081
5183
  expires_at: components["schemas"]["TimestampUtc"];
5082
5184
  };
5083
5185
  AccountCenterHandoffExchange: {
@@ -5847,7 +5949,7 @@ export interface components {
5847
5949
  AccountCenterIntent: "security" | "sessions" | "wallet_readiness";
5848
5950
  MemberActionReadiness: {
5849
5951
  /** @enum {string} */
5850
- authorization_method: "hosted_passkey" | "external_oidc";
5952
+ authorization_method: "hosted_passkey" | "external_oidc" | "xkova_webauthn";
5851
5953
  /** @enum {string} */
5852
5954
  setup_status: "passkey_required" | "recovery_acknowledgement_required" | "recovery_required" | "ready" | "externally_managed";
5853
5955
  action_authorization_enabled: boolean;
@@ -8262,6 +8364,30 @@ export interface operations {
8262
8364
  403: components["responses"]["Forbidden"];
8263
8365
  };
8264
8366
  };
8367
+ issueAccountHolderSelfWalletAuth: {
8368
+ parameters: {
8369
+ query?: never;
8370
+ header: {
8371
+ "X-Member-Session-Id": components["parameters"]["xMemberSessionId"];
8372
+ "X-XKOVA-Publishable-Key": components["parameters"]["xXkovaPublishableKey"];
8373
+ };
8374
+ path?: never;
8375
+ cookie?: never;
8376
+ };
8377
+ requestBody?: never;
8378
+ responses: {
8379
+ 200: {
8380
+ headers: {
8381
+ [name: string]: unknown;
8382
+ };
8383
+ content: {
8384
+ "application/json": components["schemas"]["WalletAdmissionBootstrap"] & Record<string, never>;
8385
+ };
8386
+ };
8387
+ 401: components["responses"]["Unauthorized"];
8388
+ 403: components["responses"]["Forbidden"];
8389
+ };
8390
+ };
8265
8391
  ensureAccountHolderSelfWalletProvisioning: {
8266
8392
  parameters: {
8267
8393
  query?: never;
@@ -8412,6 +8538,30 @@ export interface operations {
8412
8538
  403: components["responses"]["Forbidden"];
8413
8539
  };
8414
8540
  };
8541
+ getAccountHolderSelf: {
8542
+ parameters: {
8543
+ query?: never;
8544
+ header: {
8545
+ "X-Member-Session-Id": components["parameters"]["xMemberSessionId"];
8546
+ "X-XKOVA-Publishable-Key": components["parameters"]["xXkovaPublishableKey"];
8547
+ };
8548
+ path?: never;
8549
+ cookie?: never;
8550
+ };
8551
+ requestBody?: never;
8552
+ responses: {
8553
+ 200: {
8554
+ headers: {
8555
+ [name: string]: unknown;
8556
+ };
8557
+ content: {
8558
+ "application/json": components["schemas"]["AccountHolder"];
8559
+ };
8560
+ };
8561
+ 401: components["responses"]["Unauthorized"];
8562
+ 404: components["responses"]["NotFound"];
8563
+ };
8564
+ };
8415
8565
  getAccountHolderSelfBalance: {
8416
8566
  parameters: {
8417
8567
  query?: never;
@@ -8821,6 +8971,118 @@ export interface operations {
8821
8971
  404: components["responses"]["NotFound"];
8822
8972
  };
8823
8973
  };
8974
+ presignAccountHolderSelfAvatarUpload: {
8975
+ parameters: {
8976
+ query?: never;
8977
+ header: {
8978
+ "X-Member-Session-Id": components["parameters"]["xMemberSessionId"];
8979
+ "X-XKOVA-Publishable-Key": components["parameters"]["xXkovaPublishableKey"];
8980
+ };
8981
+ path?: never;
8982
+ cookie?: never;
8983
+ };
8984
+ requestBody: {
8985
+ content: {
8986
+ "application/json": components["schemas"]["AccountHolderAvatarUploadUrl"];
8987
+ };
8988
+ };
8989
+ responses: {
8990
+ 200: {
8991
+ headers: {
8992
+ [name: string]: unknown;
8993
+ };
8994
+ content: {
8995
+ "application/json": components["schemas"]["AccountHolderAvatarUploadUrlResponse"];
8996
+ };
8997
+ };
8998
+ 400: components["responses"]["BadRequest"];
8999
+ 401: components["responses"]["Unauthorized"];
9000
+ 403: components["responses"]["Forbidden"];
9001
+ 404: components["responses"]["NotFound"];
9002
+ 422: components["responses"]["UnprocessableEntity"];
9003
+ };
9004
+ };
9005
+ confirmAccountHolderSelfAvatar: {
9006
+ parameters: {
9007
+ query?: never;
9008
+ header: {
9009
+ "X-Member-Session-Id": components["parameters"]["xMemberSessionId"];
9010
+ "X-XKOVA-Publishable-Key": components["parameters"]["xXkovaPublishableKey"];
9011
+ };
9012
+ path?: never;
9013
+ cookie?: never;
9014
+ };
9015
+ requestBody: {
9016
+ content: {
9017
+ "application/json": components["schemas"]["AccountHolderAvatarConfirm"];
9018
+ };
9019
+ };
9020
+ responses: {
9021
+ 200: {
9022
+ headers: {
9023
+ [name: string]: unknown;
9024
+ };
9025
+ content: {
9026
+ "application/json": components["schemas"]["AccountHolder"];
9027
+ };
9028
+ };
9029
+ 400: components["responses"]["BadRequest"];
9030
+ 401: components["responses"]["Unauthorized"];
9031
+ 403: components["responses"]["Forbidden"];
9032
+ 404: components["responses"]["NotFound"];
9033
+ 422: components["responses"]["UnprocessableEntity"];
9034
+ };
9035
+ };
9036
+ getAccountHolderSelfAvatarUrl: {
9037
+ parameters: {
9038
+ query?: never;
9039
+ header: {
9040
+ "X-Member-Session-Id": components["parameters"]["xMemberSessionId"];
9041
+ "X-XKOVA-Publishable-Key": components["parameters"]["xXkovaPublishableKey"];
9042
+ };
9043
+ path?: never;
9044
+ cookie?: never;
9045
+ };
9046
+ requestBody?: never;
9047
+ responses: {
9048
+ 200: {
9049
+ headers: {
9050
+ [name: string]: unknown;
9051
+ };
9052
+ content: {
9053
+ "application/json": components["schemas"]["AccountHolderAvatarUrl"];
9054
+ };
9055
+ };
9056
+ 401: components["responses"]["Unauthorized"];
9057
+ 403: components["responses"]["Forbidden"];
9058
+ 404: components["responses"]["NotFound"];
9059
+ };
9060
+ };
9061
+ deleteAccountHolderSelfAvatar: {
9062
+ parameters: {
9063
+ query?: never;
9064
+ header: {
9065
+ "X-Member-Session-Id": components["parameters"]["xMemberSessionId"];
9066
+ "X-XKOVA-Publishable-Key": components["parameters"]["xXkovaPublishableKey"];
9067
+ };
9068
+ path?: never;
9069
+ cookie?: never;
9070
+ };
9071
+ requestBody?: never;
9072
+ responses: {
9073
+ 200: {
9074
+ headers: {
9075
+ [name: string]: unknown;
9076
+ };
9077
+ content: {
9078
+ "application/json": components["schemas"]["AccountHolder"];
9079
+ };
9080
+ };
9081
+ 401: components["responses"]["Unauthorized"];
9082
+ 403: components["responses"]["Forbidden"];
9083
+ 404: components["responses"]["NotFound"];
9084
+ };
9085
+ };
8824
9086
  presignAccountHolderAvatarUpload: {
8825
9087
  parameters: {
8826
9088
  query?: never;
@@ -116,7 +116,7 @@ export type XKOVAMemberAuthorizationTransaction<TApplicationData = unknown> = {
116
116
  readonly sessionReference: string;
117
117
  readonly intent: XKOVAAccountCenterIntent;
118
118
  readonly actionAuthorization?: {
119
- readonly method: 'hosted_passkey';
119
+ readonly method: 'hosted_passkey' | 'xkova_webauthn';
120
120
  } | {
121
121
  readonly method: 'external_oidc';
122
122
  readonly actionToken: string;
@@ -239,7 +239,7 @@ export interface XKOVAAccountCenterHandoffCompletion {
239
239
  readonly applicationReturnUri?: string;
240
240
  }
241
241
  export type XKOVAMemberActionAuthorizationStart = {
242
- readonly authorizationMethod: 'hosted_passkey';
242
+ readonly authorizationMethod: 'hosted_passkey' | 'xkova_webauthn';
243
243
  readonly authorizationUrl: string;
244
244
  readonly state: string;
245
245
  readonly expiresAt: string;
@@ -455,6 +455,11 @@ export declare class XKOVAMemberBffClient {
455
455
  resolveResources<TApplicationData>(input: {
456
456
  readonly reference: string;
457
457
  readonly sessionStore: XKOVAMemberSessionStore<TApplicationData>;
458
+ /**
459
+ * Defaults true. Set false only when the bound resource request executes
460
+ * immediately and therefore performs the same exact-session validation.
461
+ */
462
+ readonly validateWithXkova?: boolean;
458
463
  }): Promise<{
459
464
  readonly session: StoredXKOVAMemberSession<TApplicationData>;
460
465
  readonly resources: XKOVAMemberResources;
@@ -536,15 +536,15 @@ export class XKOVAMemberBffClient {
536
536
  const object = requireObject(value, 'member action authorization start');
537
537
  const method = requireString(object, 'authorization_method', 'member action authorization start');
538
538
  const { expiresAt, expiresAtMillis } = boundedAuthorizationExpiry(object, provisionalExpiresAt, 'member action authorization start');
539
- if (method === 'hosted_passkey') {
539
+ if (method === 'hosted_passkey' || method === 'xkova_webauthn') {
540
540
  const authorizationUrl = normalizeHostedAuthorizationUrl(requireString(object, 'authorization_url', 'member action authorization start'));
541
541
  await input.transactionStore.replace(stateHash, {
542
542
  ...transaction,
543
- actionAuthorization: { method: 'hosted_passkey' },
543
+ actionAuthorization: { method },
544
544
  expiresAt: expiresAtMillis,
545
545
  });
546
546
  return {
547
- authorizationMethod: 'hosted_passkey',
547
+ authorizationMethod: method,
548
548
  authorizationUrl,
549
549
  state,
550
550
  expiresAt,
@@ -606,7 +606,7 @@ export class XKOVAMemberBffClient {
606
606
  if (initial?.completionMode === 'account_center_result_code' &&
607
607
  initial.status === 'pending' &&
608
608
  initial.intent === 'action' &&
609
- initial.actionAuthorization?.method === 'hosted_passkey') {
609
+ ['hosted_passkey', 'xkova_webauthn'].includes(initial.actionAuthorization?.method ?? '')) {
610
610
  const completion = await this.completeAccountCenterHandoff(input);
611
611
  if (!completion.signingExchangeCode || !completion.signingUrl) {
612
612
  throw new Error('XKOVA Hosted action completion omitted its signing projection');
@@ -69,7 +69,7 @@ export declare class XKOVAMemberResources {
69
69
  } | null;
70
70
  }>;
71
71
  actionReadiness: (control?: XKOVARequestControl) => Promise<{
72
- authorization_method: "hosted_passkey" | "external_oidc";
72
+ authorization_method: "hosted_passkey" | "external_oidc" | "xkova_webauthn";
73
73
  setup_status: "passkey_required" | "recovery_acknowledgement_required" | "recovery_required" | "ready" | "externally_managed";
74
74
  action_authorization_enabled: boolean;
75
75
  requires_fresh_proof: true;
@@ -107,6 +107,15 @@ export declare class XKOVAMemberResources {
107
107
  wallets: (control?: XKOVARequestControl) => Promise<{
108
108
  data: import("./generated/types.js").components["schemas"]["Wallet"][];
109
109
  }>;
110
+ walletAuth: (control?: XKOVARequestControl) => Promise<{
111
+ strategy: "auth_endpoint";
112
+ payload: string;
113
+ client_id: string;
114
+ project_id: string;
115
+ external_user_id: string;
116
+ expires_at: string;
117
+ expected_address?: string;
118
+ } & Record<string, never>>;
110
119
  walletReadiness: (control?: XKOVARequestControl) => Promise<{
111
120
  status: "not_registered" | "provisioning" | "ready";
112
121
  wallets: import("./generated/types.js").components["schemas"]["Wallet"][];
@@ -31,7 +31,7 @@ export class XKOVAMemberResources {
31
31
  return this.client.wallets;
32
32
  }
33
33
  self = {
34
- profile: () => this.client.accountHolders.retrieve(this.accountHolderId),
34
+ profile: () => this.client.accountHolders.selfProfile(this.context),
35
35
  productEnrollment: (product, control) => this.client.accountHolders.selfProductEnrollment(this.context, product, control),
36
36
  acceptProductEnrollment: (product, body, opts) => this.client.accountHolders.acceptSelfProductEnrollment(this.context, product, body, opts),
37
37
  actionReadiness: (control) => this.client.accountHolders.selfActionReadiness({ ...this.context, accountHolderId: this.accountHolderId }, control),
@@ -39,6 +39,7 @@ export class XKOVAMemberResources {
39
39
  verification: (control) => this.client.accountHolders.selfVerification(this.context, control),
40
40
  balance: (control) => this.client.accountHolders.selfBalance(this.context, control),
41
41
  wallets: (control) => this.client.accountHolders.listSelfWallets(this.context, control),
42
+ walletAuth: (control) => this.client.accountHolders.selfWalletAuth(this.context, control),
42
43
  walletReadiness: (control) => this.client.accountHolders.selfWalletReadiness(this.context, control),
43
44
  ensureWalletProvisioning: (opts) => this.client.accountHolders.ensureSelfWalletProvisioning(this.context, opts),
44
45
  bankBalance: (control) => this.client.accountHolders.selfBankBalance(this.context, control),
@@ -50,10 +51,10 @@ export class XKOVAMemberResources {
50
51
  requestDataExport: (opts) => this.client.accountHolders.requestSelfDataExport(this.context, opts),
51
52
  dataExport: (id, control) => this.client.accountHolders.selfDataExport(this.context, id, control),
52
53
  transactions: (query, control) => this.client.accountHolders.listSelfTransactions(this.context, query, control),
53
- avatar: () => this.client.accountHolders.avatarUrl(this.accountHolderId),
54
- uploadAvatar: (image, control) => this.client.accountHolders.uploadAvatar(this.accountHolderId, image, control),
55
- deleteAvatar: (opts) => this.client.accountHolders.deleteAvatar(this.accountHolderId, opts),
56
- confirmAvatar: (body, opts) => this.client.accountHolders.confirmAvatar(this.accountHolderId, body, opts),
57
- presignAvatarUpload: (body, opts) => this.client.accountHolders.presignAvatarUpload(this.accountHolderId, body, opts),
54
+ avatar: () => this.client.accountHolders.selfAvatarUrl(this.context),
55
+ uploadAvatar: (image, control) => this.client.accountHolders.uploadSelfAvatar(this.context, image, control),
56
+ deleteAvatar: (opts) => this.client.accountHolders.deleteSelfAvatar(this.context, opts),
57
+ confirmAvatar: (body, opts) => this.client.accountHolders.confirmSelfAvatar(this.context, body, opts),
58
+ presignAvatarUpload: (body, opts) => this.client.accountHolders.presignSelfAvatarUpload(this.context, body, opts),
58
59
  };
59
60
  }
@@ -100,6 +100,32 @@ export declare class AccountHoldersResource extends Resource {
100
100
  next_cursor?: string | null;
101
101
  has_more: boolean;
102
102
  }>;
103
+ selfProfile(context: XKOVAMemberSessionContext, control?: XKOVARequestControl): Promise<{
104
+ id: import("../generated/types.js").components["schemas"]["AccountHolderId"];
105
+ tenant_id?: string;
106
+ state: "active" | "held" | "closed" | "closed_uncooperative" | "provisioning_failed";
107
+ state_reason?: string | null;
108
+ state_changed_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"] | null;
109
+ tier: "tier_1" | "tier_2";
110
+ tier_2_uplift_status?: "not_requested" | "pending" | "passed" | "failed";
111
+ first_use_completed: boolean;
112
+ cip_payload?: {
113
+ name_hash?: string;
114
+ dob_hash?: string;
115
+ id_hash?: string;
116
+ address_hash?: string;
117
+ } | null;
118
+ cip_accepted_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"] | null;
119
+ merchant_role_state?: "none" | "pending_review" | "approved" | "rejected" | "revoked";
120
+ auto_save_contacts?: boolean;
121
+ created_at: import("../generated/types.js").components["schemas"]["TimestampUtc"];
122
+ updated_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"];
123
+ email?: string | null;
124
+ first_name?: string | null;
125
+ last_name?: string | null;
126
+ phone?: string | null;
127
+ avatar_url?: string | null;
128
+ }>;
103
129
  selfVerification(context: XKOVAMemberSessionContext, control?: XKOVARequestControl): Promise<{
104
130
  required: boolean;
105
131
  status: string;
@@ -148,6 +174,15 @@ export declare class AccountHoldersResource extends Resource {
148
174
  listSelfWallets(context: XKOVAMemberSessionContext, control?: XKOVARequestControl): Promise<{
149
175
  data: import("../generated/types.js").components["schemas"]["Wallet"][];
150
176
  }>;
177
+ selfWalletAuth(context: XKOVAMemberSessionContext, control?: XKOVARequestControl): Promise<{
178
+ strategy: "auth_endpoint";
179
+ payload: string;
180
+ client_id: string;
181
+ project_id: string;
182
+ external_user_id: string;
183
+ expires_at: string;
184
+ expected_address?: string;
185
+ } & Record<string, never>>;
151
186
  selfWalletReadiness(context: XKOVAMemberSessionContext, control?: XKOVARequestControl): Promise<{
152
187
  status: "not_registered" | "provisioning" | "ready";
153
188
  wallets: import("../generated/types.js").components["schemas"]["Wallet"][];
@@ -173,7 +208,7 @@ export declare class AccountHoldersResource extends Resource {
173
208
  selfActionReadiness(context: XKOVAMemberSessionContext & {
174
209
  accountHolderId: string;
175
210
  }, control?: XKOVARequestControl): Promise<{
176
- authorization_method: "hosted_passkey" | "external_oidc";
211
+ authorization_method: "hosted_passkey" | "external_oidc" | "xkova_webauthn";
177
212
  setup_status: "passkey_required" | "recovery_acknowledgement_required" | "recovery_required" | "ready" | "externally_managed";
178
213
  action_authorization_enabled: boolean;
179
214
  requires_fresh_proof: true;
@@ -253,6 +288,70 @@ export declare class AccountHoldersResource extends Resource {
253
288
  uploadAvatar(id: string, image: Blob, control?: XKOVARequestControl): Promise<{
254
289
  url: string | null;
255
290
  }>;
291
+ uploadSelfAvatar(context: XKOVAMemberSessionContext, image: Blob, control?: XKOVARequestControl): Promise<{
292
+ url: string | null;
293
+ }>;
294
+ private uploadAvatarImage;
295
+ selfAvatarUrl(context: XKOVAMemberSessionContext): Promise<{
296
+ url: string | null;
297
+ }>;
298
+ deleteSelfAvatar(context: XKOVAMemberSessionContext, opts?: XKOVAMutationOptions): Promise<{
299
+ id: import("../generated/types.js").components["schemas"]["AccountHolderId"];
300
+ tenant_id?: string;
301
+ state: "active" | "held" | "closed" | "closed_uncooperative" | "provisioning_failed";
302
+ state_reason?: string | null;
303
+ state_changed_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"] | null;
304
+ tier: "tier_1" | "tier_2";
305
+ tier_2_uplift_status?: "not_requested" | "pending" | "passed" | "failed";
306
+ first_use_completed: boolean;
307
+ cip_payload?: {
308
+ name_hash?: string;
309
+ dob_hash?: string;
310
+ id_hash?: string;
311
+ address_hash?: string;
312
+ } | null;
313
+ cip_accepted_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"] | null;
314
+ merchant_role_state?: "none" | "pending_review" | "approved" | "rejected" | "revoked";
315
+ auto_save_contacts?: boolean;
316
+ created_at: import("../generated/types.js").components["schemas"]["TimestampUtc"];
317
+ updated_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"];
318
+ email?: string | null;
319
+ first_name?: string | null;
320
+ last_name?: string | null;
321
+ phone?: string | null;
322
+ avatar_url?: string | null;
323
+ }>;
324
+ confirmSelfAvatar(context: XKOVAMemberSessionContext, body: ReqBody<'confirmAccountHolderSelfAvatar'>, opts?: XKOVAMutationOptions): Promise<{
325
+ id: import("../generated/types.js").components["schemas"]["AccountHolderId"];
326
+ tenant_id?: string;
327
+ state: "active" | "held" | "closed" | "closed_uncooperative" | "provisioning_failed";
328
+ state_reason?: string | null;
329
+ state_changed_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"] | null;
330
+ tier: "tier_1" | "tier_2";
331
+ tier_2_uplift_status?: "not_requested" | "pending" | "passed" | "failed";
332
+ first_use_completed: boolean;
333
+ cip_payload?: {
334
+ name_hash?: string;
335
+ dob_hash?: string;
336
+ id_hash?: string;
337
+ address_hash?: string;
338
+ } | null;
339
+ cip_accepted_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"] | null;
340
+ merchant_role_state?: "none" | "pending_review" | "approved" | "rejected" | "revoked";
341
+ auto_save_contacts?: boolean;
342
+ created_at: import("../generated/types.js").components["schemas"]["TimestampUtc"];
343
+ updated_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"];
344
+ email?: string | null;
345
+ first_name?: string | null;
346
+ last_name?: string | null;
347
+ phone?: string | null;
348
+ avatar_url?: string | null;
349
+ }>;
350
+ presignSelfAvatarUpload(context: XKOVAMemberSessionContext, body: ReqBody<'presignAccountHolderSelfAvatarUpload'>, opts?: XKOVAMutationOptions): Promise<{
351
+ upload_url: string;
352
+ object_key: string;
353
+ expires_at: import("../generated/types.js").components["schemas"]["TimestampUtc"];
354
+ }>;
256
355
  avatarUrl(id: string): Promise<{
257
356
  url: string | null;
258
357
  }>;
@@ -28,6 +28,9 @@ export class AccountHoldersResource extends Resource {
28
28
  history(id, query = {}) {
29
29
  return this.getJson(`/account-holders/${this.enc(id)}/history`, query);
30
30
  }
31
+ selfProfile(context, control) {
32
+ return this.getJson('/account-holders/self', undefined, control, memberSessionHeaders(context));
33
+ }
31
34
  selfVerification(context, control) {
32
35
  return this.getJson('/account-holders/self/verification', undefined, control, memberSessionHeaders(context));
33
36
  }
@@ -43,6 +46,9 @@ export class AccountHoldersResource extends Resource {
43
46
  listSelfWallets(context, control) {
44
47
  return this.getJson('/account-holders/self/wallets', undefined, control, memberSessionHeaders(context));
45
48
  }
49
+ selfWalletAuth(context, control) {
50
+ return this.postJson('/account-holders/self/wallet-auth', undefined, control, undefined, memberSessionHeaders(context));
51
+ }
46
52
  selfWalletReadiness(context, control) {
47
53
  return this.getJson('/account-holders/self/wallet-readiness', undefined, control, memberSessionHeaders(context));
48
54
  }
@@ -64,7 +70,7 @@ export class AccountHoldersResource extends Resource {
64
70
  }
65
71
  const readiness = status.action_readiness;
66
72
  if (!readiness ||
67
- !['hosted_passkey', 'external_oidc'].includes(readiness.authorization_method) ||
73
+ !['hosted_passkey', 'external_oidc', 'xkova_webauthn'].includes(readiness.authorization_method) ||
68
74
  ![
69
75
  'passkey_required',
70
76
  'recovery_acknowledgement_required',
@@ -109,15 +115,26 @@ export class AccountHoldersResource extends Resource {
109
115
  * member context and cookies never follow the presigned URL or a redirect.
110
116
  */
111
117
  async uploadAvatar(id, image, control = {}) {
118
+ return this.uploadAvatarImage(image, control, {
119
+ presign: (body) => this.presignAvatarUpload(id, body, control),
120
+ confirm: (object_key) => this.confirmAvatar(id, { object_key }, control),
121
+ read: () => this.avatarUrl(id),
122
+ });
123
+ }
124
+ async uploadSelfAvatar(context, image, control = {}) {
125
+ return this.uploadAvatarImage(image, control, {
126
+ presign: (body) => this.presignSelfAvatarUpload(context, body, control),
127
+ confirm: (object_key) => this.confirmSelfAvatar(context, { object_key }, control),
128
+ read: () => this.selfAvatarUrl(context),
129
+ });
130
+ }
131
+ async uploadAvatarImage(image, control, operations) {
112
132
  if (!['image/png', 'image/jpeg', 'image/webp', 'image/gif'].includes(image.type) ||
113
133
  image.size === 0 ||
114
134
  image.size > 5 * 1024 * 1024) {
115
135
  throw new TypeError('Avatar must be a PNG, JPEG, WebP, or GIF image of at most 5 MiB');
116
136
  }
117
- const upload = await this.presignAvatarUpload(id, {
118
- content_type: image.type,
119
- content_length: image.size,
120
- }, control);
137
+ const upload = await operations.presign({ content_type: image.type, content_length: image.size });
121
138
  const target = new URL(upload.upload_url);
122
139
  if (target.username ||
123
140
  target.password ||
@@ -151,8 +168,20 @@ export class AccountHoldersResource extends Resource {
151
168
  }
152
169
  if (!response.ok)
153
170
  throw new XKOVAUploadError('Object storage rejected the avatar upload', response.status);
154
- await this.confirmAvatar(id, { object_key: upload.object_key }, control);
155
- return this.avatarUrl(id);
171
+ await operations.confirm(upload.object_key);
172
+ return operations.read();
173
+ }
174
+ selfAvatarUrl(context) {
175
+ return this.getJson('/account-holders/self/avatar', undefined, {}, memberSessionHeaders(context));
176
+ }
177
+ deleteSelfAvatar(context, opts) {
178
+ return this.deleteJson('/account-holders/self/avatar', opts, undefined, memberSessionHeaders(context));
179
+ }
180
+ confirmSelfAvatar(context, body, opts) {
181
+ return this.postJson('/account-holders/self/avatar/confirm', body, opts, undefined, memberSessionHeaders(context));
182
+ }
183
+ presignSelfAvatarUpload(context, body, opts) {
184
+ return this.postJson('/account-holders/self/avatar/upload-url', body, opts, undefined, memberSessionHeaders(context));
156
185
  }
157
186
  avatarUrl(id) {
158
187
  return this.getJson(`/account-holders/${this.enc(id)}/avatar`);
package/llms.txt CHANGED
@@ -10,7 +10,7 @@ Use this package on a Node.js 22+ server. Read the installed declarations before
10
10
  - `dist/member-bff.d.ts`: authorization, session persistence, refresh, logout, action reviews, and human authorization.
11
11
  - `dist/member-resources.d.ts`: typed resources bound to the exact authenticated member.
12
12
  - [Quickstart](https://docs.xkova.com/getting-started.html): sandbox access and first authenticated call.
13
- - [Customer OpenAPI](https://github.com/XKOVA/typescript-sdk/blob/main/schema/customer-api.json): customer contract in this source repository. Installed declarations determine your release’s exact request and response types.
13
+ - [Customer OpenAPI](https://github.com/XKOVA/typescript-sdk/blob/main/schema/customer-api.json): machine-readable contract for the public SDK source. For an installed release, use its generated declarations.
14
14
  - [SDK guide](https://docs.xkova.com/sdk-overview.html): client and resource examples.
15
15
  - [Workflow guide](https://docs.xkova.com/sdk-workflows.html): supported workflow helpers.
16
16
  - [Member integration](https://docs.xkova.com/embedded-member.html): browser, BFF, identity, and signing boundaries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xkova/sdk",
3
- "version": "0.1.0-alpha.5",
3
+ "version": "0.1.0-alpha.6",
4
4
  "description": "TypeScript SDK for the XKOVA API.",
5
5
  "homepage": "https://docs.xkova.com",
6
6
  "repository": {