@xkova/sdk 0.1.0-alpha.4 → 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/README.md CHANGED
@@ -491,39 +491,11 @@ idempotency, and settlement. It links the public customer OpenAPI and expanded
491
491
  documentation. Installed declarations determine the methods available in your
492
492
  version; live documentation may describe a newer release.
493
493
 
494
- ## Writing checks for contributors
494
+ ## Contributing
495
495
 
496
- Use plain verbs, concrete examples, and comments that explain non-obvious
497
- decisions. Vary section length, remove repeated conclusions, and write each
498
- guide for its reader. Test failure and recovery cases alongside successful
499
- calls. Keep commits small and omit attribution or co-author trailers.
500
-
501
- The local pre-push hook checks both public SDKs before the existing test gates.
502
- It reads each pushed branch or tag's committed files, plus new commit messages
503
- that touch either package. Uncommitted edits cannot change that result. No
504
- build or network access is needed. Use the repository's pinned Node version,
505
- then install workspace dependencies with `pnpm install` to set up the hook.
506
-
507
- To check edits before committing:
508
-
509
- ```sh
510
- pnpm --filter @xkova/sdk writing:check
511
- ```
512
-
513
- The check covers package guides, examples, public source and generated types,
514
- and descriptive package metadata. It rejects stock wording, emoji, em dashes,
515
- attribution, internal decision narratives, and implementation-provider details.
516
- Describe installation, supported methods, inputs, results, and the steps an
517
- application developer needs. Do not turn release planning or maintainer
518
- conversations into package documentation. Standard license text, rule
519
- definitions, and negative test fixtures are checked separately.
520
-
521
- A pass is a mechanical check, not a judgment of authorship. Before pushing,
522
- reread the result for sentence rhythm, repeated structures, useful comments,
523
- accurate examples, and test quality. This gate does not scan historical file
524
- contents or replace secret scanning. It checks commit messages locally;
525
- review PR descriptions separately. Run `pnpm --filter @xkova/sdk writing:test`
526
- when changing the rules or hook.
496
+ Run `pnpm check` from the source repository root before committing. The
497
+ [contributor guide](https://github.com/XKOVA/typescript-sdk/blob/main/CONTRIBUTING.md)
498
+ covers generated files, local pre-push checks, writing rules, and packaging.
527
499
 
528
500
  ## License
529
501
 
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;
@@ -4478,6 +4576,7 @@ export interface components {
4478
4576
  /** @enum {string} */
4479
4577
  purpose: "operator" | "service_account";
4480
4578
  safe_purpose: ("fund_vault" | "token_control" | "multi_purpose") | null;
4579
+ managed_safe_state: ("deploying" | "active" | "decommissioned") | null;
4481
4580
  address: string;
4482
4581
  label: string | null;
4483
4582
  managed_safe_id: components["schemas"]["ManagedSafeId"] | null;
@@ -5022,6 +5121,8 @@ export interface components {
5022
5121
  code_challenge_method: "S256";
5023
5122
  };
5024
5123
  MemberAuthHostedAuthorizationStart: {
5124
+ /** Format: uri */
5125
+ hosted_origin: string;
5025
5126
  /** Format: uri */
5026
5127
  authorization_url: string;
5027
5128
  expires_at: components["schemas"]["TimestampUtc"];
@@ -5077,6 +5178,8 @@ export interface components {
5077
5178
  AccountCenterHandoffStart: {
5078
5179
  /** Format: uri */
5079
5180
  handoff_url: string;
5181
+ /** Format: uri */
5182
+ hosted_origin: string;
5080
5183
  expires_at: components["schemas"]["TimestampUtc"];
5081
5184
  };
5082
5185
  AccountCenterHandoffExchange: {
@@ -5846,7 +5949,7 @@ export interface components {
5846
5949
  AccountCenterIntent: "security" | "sessions" | "wallet_readiness";
5847
5950
  MemberActionReadiness: {
5848
5951
  /** @enum {string} */
5849
- authorization_method: "hosted_passkey" | "external_oidc";
5952
+ authorization_method: "hosted_passkey" | "external_oidc" | "xkova_webauthn";
5850
5953
  /** @enum {string} */
5851
5954
  setup_status: "passkey_required" | "recovery_acknowledgement_required" | "recovery_required" | "ready" | "externally_managed";
5852
5955
  action_authorization_enabled: boolean;
@@ -8261,6 +8364,30 @@ export interface operations {
8261
8364
  403: components["responses"]["Forbidden"];
8262
8365
  };
8263
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
+ };
8264
8391
  ensureAccountHolderSelfWalletProvisioning: {
8265
8392
  parameters: {
8266
8393
  query?: never;
@@ -8411,6 +8538,30 @@ export interface operations {
8411
8538
  403: components["responses"]["Forbidden"];
8412
8539
  };
8413
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
+ };
8414
8565
  getAccountHolderSelfBalance: {
8415
8566
  parameters: {
8416
8567
  query?: never;
@@ -8820,6 +8971,118 @@ export interface operations {
8820
8971
  404: components["responses"]["NotFound"];
8821
8972
  };
8822
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
+ };
8823
9086
  presignAccountHolderAvatarUpload: {
8824
9087
  parameters: {
8825
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`);
@@ -56,6 +56,7 @@ export declare class TokenizationResource extends Resource {
56
56
  kind: "server_key" | "safe";
57
57
  purpose: "operator" | "service_account";
58
58
  safe_purpose: ("fund_vault" | "token_control" | "multi_purpose") | null;
59
+ managed_safe_state: ("deploying" | "active" | "decommissioned") | null;
59
60
  address: string;
60
61
  label: string | null;
61
62
  managed_safe_id: import("../generated/types.js").components["schemas"]["ManagedSafeId"] | null;
@@ -68,6 +69,7 @@ export declare class TokenizationResource extends Resource {
68
69
  kind: "server_key" | "safe";
69
70
  purpose: "operator" | "service_account";
70
71
  safe_purpose: ("fund_vault" | "token_control" | "multi_purpose") | null;
72
+ managed_safe_state: ("deploying" | "active" | "decommissioned") | null;
71
73
  address: string;
72
74
  label: string | null;
73
75
  managed_safe_id: import("../generated/types.js").components["schemas"]["ManagedSafeId"] | null;
@@ -82,6 +84,7 @@ export declare class TokenizationResource extends Resource {
82
84
  kind: "server_key" | "safe";
83
85
  purpose: "operator" | "service_account";
84
86
  safe_purpose: ("fund_vault" | "token_control" | "multi_purpose") | null;
87
+ managed_safe_state: ("deploying" | "active" | "decommissioned") | null;
85
88
  address: string;
86
89
  label: string | null;
87
90
  managed_safe_id: import("../generated/types.js").components["schemas"]["ManagedSafeId"] | null;
@@ -100,6 +103,7 @@ export declare class TokenizationResource extends Resource {
100
103
  kind: "server_key" | "safe";
101
104
  purpose: "operator" | "service_account";
102
105
  safe_purpose: ("fund_vault" | "token_control" | "multi_purpose") | null;
106
+ managed_safe_state: ("deploying" | "active" | "decommissioned") | null;
103
107
  address: string;
104
108
  label: string | null;
105
109
  managed_safe_id: import("../generated/types.js").components["schemas"]["ManagedSafeId"] | null;
package/llms.txt CHANGED
@@ -5,12 +5,12 @@ Use this package on a Node.js 22+ server. Read the installed declarations before
5
5
  ## Read first
6
6
 
7
7
  - [Package guide](README.md): installation, production signing, Hosted Auth, member sessions, durable stores, cancellation, errors, webhooks, and proof verification.
8
- - [Client declarations](dist/client.d.ts): exact resource properties and client options for this installed release.
9
- - [Customer API types](dist/generated/types.d.ts): exact request bodies, responses, parameters, and operation IDs. Import types through @xkova/sdk/types.
10
- - [Member BFF declarations](dist/member-bff.d.ts): authorization, session persistence, refresh, logout, action reviews, and human authorization.
11
- - [Member resources](dist/member-resources.d.ts): typed resources bound to the exact authenticated member.
8
+ - `dist/client.d.ts`: exact resource properties and client options for this installed release.
9
+ - `dist/generated/types.d.ts`: exact request bodies, responses, parameters, and operation IDs. Import types through @xkova/sdk/types.
10
+ - `dist/member-bff.d.ts`: authorization, session persistence, refresh, logout, action reviews, and human authorization.
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://docs.xkova.com/data/openapi-customer.json): machine-readable customer contract for the current published documentation.
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.4",
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": {