sinfactura-types 1.10.552 → 1.10.554

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/auth.d.ts CHANGED
@@ -491,12 +491,23 @@ declare global {
491
491
  * somebody holds the password and stalled at the second factor.
492
492
  * - `wrong_totp` — the step-up code was wrong.
493
493
  * - `totp_replay` — an already-used code was presented again and rejected.
494
- * - `wrong_passkey` — a passkey (WebAuthn) assertion was presented and failed
495
- * verification: a bad signature, an unknown or revoked credential, an
496
- * expired challenge, or a signature counter that went backwards. Kept apart
497
- * from `wrong_totp` so the trail can tell a mistyped code from a failing
498
- * authenticator; the CLIENT still sees the same `INVALID_2FA_CODE` for both.
499
- * A replayed assertion challenge is `totp_replay`, like a replayed code.
494
+ * - `wrong_passkey` — a passkey (WebAuthn) assertion was presented and failed.
495
+ * ⚠️ It means a DIFFERENT step on each kind of row:
496
+ * - **Operator rows (`kind: 'USER'`)** — the passkey is a SECOND factor, so
497
+ * this is a failed 2FA leg: a bad signature, an unknown or revoked
498
+ * credential, an expired challenge, or a signature counter that went
499
+ * backwards. Kept apart from `wrong_totp` so the trail can tell a
500
+ * mistyped code from a failing authenticator; the CLIENT still sees the
501
+ * same `INVALID_2FA_CODE` for both. A replayed assertion challenge is
502
+ * `totp_replay`, like a replayed code.
503
+ * - **Customer rows (`kind: 'CUSTOMER'`)** — the passkey is the FIRST
504
+ * factor (storefront `passkey-sign-in-verify`, provider `'passkey'`), so
505
+ * there is no second factor involved: the assertion against a credential
506
+ * that RESOLVED to this customer did not verify (a bad signature, a
507
+ * counter regression, a lost counter race). The client sees `401
508
+ * PASSKEY_NOT_RECOGNISED`, never `INVALID_2FA_CODE`. An unknown, revoked
509
+ * or other-host credential, a forged handle and an expired or replayed
510
+ * challenge are refused BEFORE a customer is known and write no row.
500
511
  * - `totp_locked` — brute-force lockout active on the TOTP leg.
501
512
  * - `enrollment_required` — the credentials were correct and the store's
502
513
  * mandatory-2FA grace window has closed on a user who never enrolled. Like
@@ -662,8 +673,17 @@ declare global {
662
673
  * assignable to the other's slot. Both spellings ship; this is documented
663
674
  * rather than reconciled, because `method` is an established analytics
664
675
  * contract.
676
+ *
677
+ * ⚠️ `'passkey'` is NOT a Firebase provider and is NEVER STORED as a
678
+ * `CustomerSignInMethod` entry. Like `hasPassword`, it is DERIVED: the api
679
+ * reports it from the customer's live passkeys (see
680
+ * {@link CustomerPasskeySummary}), and only while the platform's customer
681
+ * passkey switch is on. It cannot be unlinked through
682
+ * `unlink-sign-in-method` — a passkey is removed one credential at a time
683
+ * through `passkey-remove`. It is also the provider recorded on a
684
+ * {@link CustomerLoginAttempt} for a passkey sign-in.
665
685
  */
666
- type CustomerSignInProvider = 'google' | 'facebook' | 'apple' | 'password';
686
+ type CustomerSignInProvider = 'google' | 'facebook' | 'apple' | 'password' | 'passkey';
667
687
  /**
668
688
  * Whether a stored sign-in method may be used, or has been explicitly turned
669
689
  * off by the customer.
@@ -775,6 +795,13 @@ declare global {
775
795
  * explicitly-refused. Do not render "never connected" off absence, and do not
776
796
  * infer that a link attempt will succeed from it.
777
797
  *
798
+ * ⚠️ One entry is DERIVED, not stored: `{ provider: 'passkey', status:
799
+ * 'linked' }` is appended while the customer-passkeys switch is on and the
800
+ * customer holds at least one live passkey. It stands for the whole set of
801
+ * passkeys (each is removed on its own through `passkey-remove`, never
802
+ * through unlink) and carries no `firebaseUid` or dates. Whether the switch
803
+ * is on is `passkeysAvailable`, not this entry.
804
+ *
778
805
  * ⚠️ Note the nesting: `methods` sits under `data`, not at the root beside
779
806
  * it, unlike `CustomerSessionsResponse.data` / `CustomerLoginHistoryResponse.data`
780
807
  * which put their array directly at `data`. The reason is that `hasPassword`
@@ -792,7 +819,10 @@ declare global {
792
819
  */
793
820
  interface CustomerSignInMethodsResponse {
794
821
  data: {
795
- /** LINKED entries only. A refused provider is invisible here. */
822
+ /**
823
+ * LINKED entries only, plus the derived `passkey` entry described above.
824
+ * A refused provider is invisible here.
825
+ */
796
826
  methods: CustomerSignInMethod[];
797
827
  /**
798
828
  * DERIVED, never stored: "does a usable password credential exist for
@@ -810,6 +840,22 @@ declare global {
810
840
  * api sees both halves.
811
841
  */
812
842
  hasPassword: boolean;
843
+ /**
844
+ * `true` iff the platform's customer-passkeys switch
845
+ * (`customerPasskeysEnabled`) is on — the storefront offers "Add a
846
+ * passkey" on it.
847
+ *
848
+ * ⚠️ Read the switch HERE, never off `methods`. The derived `passkey`
849
+ * entry in `methods` appears only when the switch is on AND the customer
850
+ * already holds a live passkey, so "no passkey entry" is the same body for
851
+ * "switch off" and for "switch on, nothing registered yet" — every
852
+ * customer at launch. Hiding registration off that absence means nobody
853
+ * can ever register a first passkey.
854
+ *
855
+ * Additive: an older api omits it, which a consumer should read as
856
+ * `false`.
857
+ */
858
+ passkeysAvailable: boolean;
813
859
  };
814
860
  }
815
861
  /**
@@ -838,6 +884,69 @@ declare global {
838
884
  unlinked: true;
839
885
  provider: CustomerSignInProvider;
840
886
  }
887
+ /**
888
+ * One live customer passkey, as every customer-passkey read returns it.
889
+ *
890
+ * ⚠️ An ALLOW-LIST projection of the stored row: these five keys and nothing
891
+ * else. The row carries the public key and signature counter, which
892
+ * `response()` does not strip.
893
+ */
894
+ interface CustomerPasskeySummary {
895
+ /** base64url credential id — what `passkey-remove` takes. */
896
+ credentialId: string;
897
+ /** The customer's own name for the device. Personal data. */
898
+ label: string;
899
+ /** unix ms */
900
+ createdAt: number;
901
+ /** unix ms — the last successful sign-in with it. Absent until first use. */
902
+ lastUsedAt?: number;
903
+ /**
904
+ * The host the passkey was registered on (`cesta.ar` or a verified custom
905
+ * domain). It signs in on that host only — render it so the customer can
906
+ * tell two same-named devices apart and knows where each one works.
907
+ */
908
+ rpHost: string;
909
+ }
910
+ /**
911
+ * `passkey-register-options` (cookie-authenticated) and
912
+ * `passkey-sign-in-options` (public) `data` — a single-use, five-minute
913
+ * challenge. Same shape as the operator {@link PasskeyChallenge}.
914
+ */
915
+ type CustomerPasskeyOptionsResponse = PasskeyChallenge;
916
+ /** `POST /auth` body for `passkey-register-verify`. Cookie-authenticated. */
917
+ interface CustomerPasskeyRegisterVerifyRequest {
918
+ mode: 'passkey-register-verify';
919
+ challengeId: string;
920
+ response: WebAuthnCredentialResponse;
921
+ /** The customer's own name for the device. */
922
+ label?: string;
923
+ }
924
+ /** `passkey-register-verify` `data` — the new credential. */
925
+ type CustomerPasskeyRegisterVerifyResponse = CustomerPasskeySummary;
926
+ /**
927
+ * `POST /auth` body for `passkey-sign-in-verify`. Public. The 200 is the
928
+ * SAME body, cookie and session a password sign-in answers with.
929
+ */
930
+ interface CustomerPasskeySignInVerifyRequest {
931
+ mode: 'passkey-sign-in-verify';
932
+ challengeId: string;
933
+ response: WebAuthnCredentialResponse;
934
+ }
935
+ /** `GET /auth?mode=passkeys` `data` — the caller's own live passkeys. */
936
+ interface CustomerPasskeyListResponse {
937
+ credentials: CustomerPasskeySummary[];
938
+ }
939
+ /** `POST /auth` body for `passkey-remove`. Cookie-authenticated. */
940
+ interface CustomerPasskeyRemoveRequest {
941
+ mode: 'passkey-remove';
942
+ credentialId: string;
943
+ }
944
+ /** `passkey-remove` `data`. */
945
+ interface CustomerPasskeyRemoveResponse {
946
+ credentialId: string;
947
+ /** unix ms */
948
+ revokedAt: number;
949
+ }
841
950
  /**
842
951
  * One operator refresh-token row: active by default, retained history in the forensic view —
843
952
  * `stacks/lambdas/auth/_sessions.ts`, rows from `listSessions`.
@@ -1102,11 +1211,14 @@ declare global {
1102
1211
  * `SIGN_IN_METHODS_CONFLICT` since the sign-in-methods race fix shipped. A
1103
1212
  * contract that lags its own emitter is the failure this tuple closes.
1104
1213
  *
1105
- * - `SIGN_IN_METHOD_LAST_CREDENTIAL` (unlink) — the guardrail. Removing this
1106
- * provider would leave the account with no way in at all: no other linked
1107
- * provider and no password. Correct ONLY because the api sees both the social
1108
- * providers and the password credential. Offer "set a password first", not a
1109
- * retry.
1214
+ * - `SIGN_IN_METHOD_LAST_CREDENTIAL` (unlink, `passkey-remove`) — the
1215
+ * guardrail. Removing this provider, or this passkey, would leave the account
1216
+ * with no way in at all: no other linked provider, no password and — while
1217
+ * the customer-passkeys switch is on — no other live passkey (with the switch
1218
+ * off a passkey cannot sign in, so it does not count). Correct ONLY because
1219
+ * the api sees the social providers, the password credential and the
1220
+ * passkeys together. Offer "set a password first", not a retry — the
1221
+ * remedy is the same whichever mode answered it.
1110
1222
  * - `SIGN_IN_METHOD_NOT_LINKED` (unlink) — nothing to unlink. ⚠️ Reachable for a
1111
1223
  * provider the customer signs in with RIGHT NOW: a working Google sign-in is
1112
1224
  * still not a linked one.
@@ -1133,6 +1245,9 @@ declare global {
1133
1245
  * - `SIGN_IN_METHODS_CONFLICT` — a concurrent writer won the row. The retry
1134
1246
  * budget is already spent by the time this reaches the wire, so it is
1135
1247
  * terminal for this request: surface "please retry", never auto-retry again.
1248
+ * Also answered by `passkey-register-verify` and `passkey-remove` when
1249
+ * another change to the customer's ways in (a passkey added or removed, a
1250
+ * provider unlinked) kept landing between their count and their write.
1136
1251
  * ⚠️ It collapses TWO distinct DynamoDB failures — a transaction cancellation
1137
1252
  * from the shared write helper and a bare conditional-check failure from the
1138
1253
  * social path. That split never reaches the wire, and must not: a caller
package/dist/auth.js CHANGED
@@ -19,11 +19,14 @@
19
19
  * `SIGN_IN_METHODS_CONFLICT` since the sign-in-methods race fix shipped. A
20
20
  * contract that lags its own emitter is the failure this tuple closes.
21
21
  *
22
- * - `SIGN_IN_METHOD_LAST_CREDENTIAL` (unlink) — the guardrail. Removing this
23
- * provider would leave the account with no way in at all: no other linked
24
- * provider and no password. Correct ONLY because the api sees both the social
25
- * providers and the password credential. Offer "set a password first", not a
26
- * retry.
22
+ * - `SIGN_IN_METHOD_LAST_CREDENTIAL` (unlink, `passkey-remove`) — the
23
+ * guardrail. Removing this provider, or this passkey, would leave the account
24
+ * with no way in at all: no other linked provider, no password and — while
25
+ * the customer-passkeys switch is on — no other live passkey (with the switch
26
+ * off a passkey cannot sign in, so it does not count). Correct ONLY because
27
+ * the api sees the social providers, the password credential and the
28
+ * passkeys together. Offer "set a password first", not a retry — the
29
+ * remedy is the same whichever mode answered it.
27
30
  * - `SIGN_IN_METHOD_NOT_LINKED` (unlink) — nothing to unlink. ⚠️ Reachable for a
28
31
  * provider the customer signs in with RIGHT NOW: a working Google sign-in is
29
32
  * still not a linked one.
@@ -50,6 +53,9 @@
50
53
  * - `SIGN_IN_METHODS_CONFLICT` — a concurrent writer won the row. The retry
51
54
  * budget is already spent by the time this reaches the wire, so it is
52
55
  * terminal for this request: surface "please retry", never auto-retry again.
56
+ * Also answered by `passkey-register-verify` and `passkey-remove` when
57
+ * another change to the customer's ways in (a passkey added or removed, a
58
+ * provider unlinked) kept landing between their count and their write.
53
59
  * ⚠️ It collapses TWO distinct DynamoDB failures — a transaction cancellation
54
60
  * from the shared write helper and a bare conditional-check failure from the
55
61
  * social path. That split never reaches the wire, and must not: a caller
package/dist/cjs/auth.js CHANGED
@@ -22,11 +22,14 @@ exports.SESSION_ACTION_ERROR_CODES = exports.PASSKEY_ERROR_CODES = exports.TWO_F
22
22
  * `SIGN_IN_METHODS_CONFLICT` since the sign-in-methods race fix shipped. A
23
23
  * contract that lags its own emitter is the failure this tuple closes.
24
24
  *
25
- * - `SIGN_IN_METHOD_LAST_CREDENTIAL` (unlink) — the guardrail. Removing this
26
- * provider would leave the account with no way in at all: no other linked
27
- * provider and no password. Correct ONLY because the api sees both the social
28
- * providers and the password credential. Offer "set a password first", not a
29
- * retry.
25
+ * - `SIGN_IN_METHOD_LAST_CREDENTIAL` (unlink, `passkey-remove`) — the
26
+ * guardrail. Removing this provider, or this passkey, would leave the account
27
+ * with no way in at all: no other linked provider, no password and — while
28
+ * the customer-passkeys switch is on — no other live passkey (with the switch
29
+ * off a passkey cannot sign in, so it does not count). Correct ONLY because
30
+ * the api sees the social providers, the password credential and the
31
+ * passkeys together. Offer "set a password first", not a retry — the
32
+ * remedy is the same whichever mode answered it.
30
33
  * - `SIGN_IN_METHOD_NOT_LINKED` (unlink) — nothing to unlink. ⚠️ Reachable for a
31
34
  * provider the customer signs in with RIGHT NOW: a working Google sign-in is
32
35
  * still not a linked one.
@@ -53,6 +56,9 @@ exports.SESSION_ACTION_ERROR_CODES = exports.PASSKEY_ERROR_CODES = exports.TWO_F
53
56
  * - `SIGN_IN_METHODS_CONFLICT` — a concurrent writer won the row. The retry
54
57
  * budget is already spent by the time this reaches the wire, so it is
55
58
  * terminal for this request: surface "please retry", never auto-retry again.
59
+ * Also answered by `passkey-register-verify` and `passkey-remove` when
60
+ * another change to the customer's ways in (a passkey added or removed, a
61
+ * provider unlinked) kept landing between their count and their write.
56
62
  * ⚠️ It collapses TWO distinct DynamoDB failures — a transaction cancellation
57
63
  * from the shared write helper and a bare conditional-check failure from the
58
64
  * social path. That split never reaches the wire, and must not: a caller
@@ -2,11 +2,40 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MP_REFUND_RECOVERY_ERROR_CODES = exports.MP_POINT_TIP_ERROR_CODES = exports.MP_DYNAMIC_QR_ERROR_CODES = void 0;
4
4
  /**
5
- * Dynamic QR initiation refusals. Connection/configuration failures use 412;
6
- * malformed requests use 400; permission/plan/support-session failures use 403.
7
- * Attempt/allocation conflicts use 409, and an unknown creation outcome uses
8
- * 504 MP_DYN_QR_UNCONFIRMED. An uncertain attempt remains blocked indefinitely.
9
- * Legacy order-only requests cannot carry tips.
5
+ * Dynamic QR initiation refusals, by status:
6
+ * - 400 malformed request (`VALIDATION_FAILED`, `TIP_EXCEEDS_ORDER`, `TIP_ORDER_REQUIRED`), or an
7
+ * order whose paid sum cannot be converted for want of a usable rate (`FX_CONVERSION_UNAVAILABLE`);
8
+ * - 403 permission, plan or support session (`CAPABILITY_REQUIRED`, `ROLE_FORBIDDEN`,
9
+ * `PLAN_UPGRADE_REQUIRED`, `IMPERSONATION_READONLY`);
10
+ * - 404 missing order or worker (`TIP_ORDER_NOT_FOUND`, `TIP_RECIPIENT_NOT_FOUND`; the POST never
11
+ * answers `ORDER_NOT_FOUND`, only the re-sync read below does);
12
+ * - 409 order state, account, attempt or allocation conflicts (every other order/tip/attempt code);
13
+ * - 412 connection or configuration (`MP_NOT_CONNECTED`, `MP_TOKEN_EXPIRED`, `MP_USER_ID_MISSING`,
14
+ * `MP_NO_STORE_ON_ACCOUNT`);
15
+ * - 502 a definite POS or QR rejection (`MP_DYN_POS_CREATE_FAILED`, `MP_POS_INVALID`,
16
+ * `MP_DYN_QR_CREATE_FAILED`, `MP_DYN_QR_INVALID`);
17
+ * - 503 `PLATFORM_INTEGRATION_DISABLED`; 504 `MP_DYN_QR_UNCONFIRMED`, an unknown creation outcome.
18
+ * A thrown error answers `400 UNHANDLED_ERROR`, never a 500. The re-sync read
19
+ * (`GET /mercadopago/qr/dynamic?orderId=`) uses `VALIDATION_FAILED`, `PLAN_UPGRADE_REQUIRED`,
20
+ * `CAPABILITY_REQUIRED`, `ORDER_NOT_FOUND` and `ORDER_CANCELLED` from this list.
21
+ *
22
+ * Per Idempotency-Key on the tipped path: `MP_DYN_QR_IN_PROGRESS` = in flight
23
+ * (keep the key, poll); `MP_DYN_QR_REJECTED` = ended with no live charge (a
24
+ * fresh key is safe); `MP_DYN_QR_EXPIRED` = its QR expired (permanent for that
25
+ * key). A `contacting` attempt (MercadoPago may have been called) stays blocked
26
+ * indefinitely; a `reserved` one (provably never contacted) is released once it
27
+ * outlives the Lambda timeout. A fresh tipped reservation on an order already
28
+ * fully paid (till tenders plus linked payments cover its total, as its
29
+ * `financialStatus` derives) answers `PAYMENT_ALREADY_RECEIVED`; a part-paid
30
+ * order (a split) still mints the remainder. When a till tender or linked payment
31
+ * is in a currency the store holds no usable rate for, the paid sum is unknown, not
32
+ * paid: it answers `400 FX_CONVERSION_UNAVAILABLE` (configure the rate in Monedas,
33
+ * then retry with the same key).
34
+ * `MP_DYN_QR_INVALID` is untipped-only: on the tipped path a malformed 2xx is
35
+ * `MP_DYN_QR_UNCONFIRMED`. The retired `{ orderId }`-only body answers
36
+ * `VALIDATION_FAILED`. `INVALID_ORDER_STATE`, `ORDER_FX_RATE_UNAVAILABLE` and
37
+ * `ORDER_FX_AMOUNT_TOO_SMALL` were that body's alone and are no longer emitted;
38
+ * they stay listed so an existing client switch still compiles.
10
39
  */
11
40
  exports.MP_DYNAMIC_QR_ERROR_CODES = [
12
41
  'VALIDATION_FAILED',
@@ -40,6 +69,8 @@ exports.MP_DYNAMIC_QR_ERROR_CODES = [
40
69
  'MP_DYN_QR_IN_PROGRESS',
41
70
  'MP_DYN_QR_EXPIRED',
42
71
  'MP_DYN_QR_UNCONFIRMED',
72
+ 'MP_DYN_QR_REJECTED',
73
+ 'FX_CONVERSION_UNAVAILABLE',
43
74
  ];
44
75
  exports.MP_POINT_TIP_ERROR_CODES = [
45
76
  'TIP_EXCEEDS_ORDER',
@@ -554,6 +554,13 @@ declare global {
554
554
  province: string;
555
555
  postalCode: string;
556
556
  };
557
+ /**
558
+ * Live storefront passkeys this customer holds. NEVER stored on the row:
559
+ * computed by the operator `GET /customers?customerId=` point read only, and
560
+ * absent when that count could not be read — absent means unknown, never
561
+ * zero. A count only; no credential id, key or label is served with it.
562
+ */
563
+ passkeyCount?: number;
557
564
  }
558
565
  /**
559
566
  * Every refusal `POST /customers { mode: 'data-export' | 'anonymize' }` and
@@ -1207,6 +1214,19 @@ declare global {
1207
1214
  * operator handler additionally writes an un-deduped `ERROR` row.
1208
1215
  */
1209
1216
  sessionRevocationComplete: boolean;
1217
+ /**
1218
+ * Storefront passkeys (`CUSTOMER_WEBAUTHN_CREDENTIAL#`) this erasure
1219
+ * revoked; every passkey `label` is removed with them. Optional only so the
1220
+ * field is additive — every erasure from this version on sets it.
1221
+ */
1222
+ passkeysRevoked?: number;
1223
+ /**
1224
+ * `false` when the passkey partition could not be read or written to the
1225
+ * end, so a passkey may still sign in. BOTH erasure handlers write an
1226
+ * un-deduped `ERROR` row (`CUSTOMER_ANONYMIZE_PASSKEYS_INCOMPLETE`);
1227
+ * re-issuing the erasure re-runs the revocation. On BOTH wires.
1228
+ */
1229
+ passkeyRevocationComplete?: boolean;
1210
1230
  /**
1211
1231
  * `ACCOUNT#` ledger rows whose denormalised `fullName` was removed by this
1212
1232
  * erasure.
@@ -136,7 +136,58 @@ declare global {
136
136
  expiresAt: number;
137
137
  createdAt: number;
138
138
  isNew: boolean;
139
+ /**
140
+ * Server clock (Unix ms) when this response was built. Present on the tipped
141
+ * create and replay; never persisted, so a replay carries the replay's instant.
142
+ * Estimate the client clock offset from this, not from `createdAt` (the
143
+ * reservation instant, taken before the POS lookup and the provider call).
144
+ */
145
+ serverNow?: number;
139
146
  }
147
+ /**
148
+ * `data` of `409 MP_DYN_QR_IN_PROGRESS`. `scope: 'attempt'` = this
149
+ * Idempotency-Key's own attempt is in flight; `'order'` = another identity
150
+ * holds the order's QR fence. `since` = the blocking attempt's reservation
151
+ * instant (absent only on a fence written before it was stamped). `expiresAt`
152
+ * only on `state: 'ready'` (an unexpired tipped QR), the instant the fence
153
+ * frees; `reserved`/`contacting` carry none.
154
+ */
155
+ interface MpDynamicQrInProgressDetails {
156
+ serverNow: number;
157
+ scope: 'attempt' | 'order';
158
+ state: 'reserved' | 'contacting' | 'ready';
159
+ since?: number;
160
+ expiresAt?: number;
161
+ }
162
+ /** `data` of `409 MP_DYN_QR_EXPIRED`: the same key's saved QR expired at `expiresAt`. */
163
+ interface MpDynamicQrExpiredDetails {
164
+ serverNow: number;
165
+ expiresAt: number;
166
+ }
167
+ /** `data` of `409 MP_DYN_QR_REJECTED`: the same key's attempt ended with no live charge. */
168
+ interface MpDynamicQrRejectedDetails {
169
+ serverNow: number;
170
+ }
171
+ /**
172
+ * `data` of `GET /mercadopago/qr/dynamic?orderId=` — the re-sync read of the order's
173
+ * dynamic QR. Never carries the Idempotency-Key, owner, fingerprint or tip recipient.
174
+ * `ready` = an unexpired tipped QR (`qr.isNew` is always false); `pending` = an attempt
175
+ * holds the order's fence (`since` = its reservation instant; no `qrData`); `none` =
176
+ * nothing blocks the order.
177
+ */
178
+ type MpDynamicQrStateResponse = {
179
+ state: 'ready';
180
+ qr: MpDynamicQrResponse;
181
+ serverNow: number;
182
+ } | {
183
+ state: 'pending';
184
+ phase: 'reserved' | 'contacting';
185
+ since?: number;
186
+ serverNow: number;
187
+ } | {
188
+ state: 'none';
189
+ serverNow: number;
190
+ };
140
191
  type MpHookResult = 'config-missing' | 'test-event' | 'orphan' | 'duplicate' | 'not-approved' | 'item-saved' | 'error';
141
192
  interface MpHookLogEntry {
142
193
  hookId: string;
@@ -202,13 +253,42 @@ declare global {
202
253
  }
203
254
  }
204
255
  /**
205
- * Dynamic QR initiation refusals. Connection/configuration failures use 412;
206
- * malformed requests use 400; permission/plan/support-session failures use 403.
207
- * Attempt/allocation conflicts use 409, and an unknown creation outcome uses
208
- * 504 MP_DYN_QR_UNCONFIRMED. An uncertain attempt remains blocked indefinitely.
209
- * Legacy order-only requests cannot carry tips.
256
+ * Dynamic QR initiation refusals, by status:
257
+ * - 400 malformed request (`VALIDATION_FAILED`, `TIP_EXCEEDS_ORDER`, `TIP_ORDER_REQUIRED`), or an
258
+ * order whose paid sum cannot be converted for want of a usable rate (`FX_CONVERSION_UNAVAILABLE`);
259
+ * - 403 permission, plan or support session (`CAPABILITY_REQUIRED`, `ROLE_FORBIDDEN`,
260
+ * `PLAN_UPGRADE_REQUIRED`, `IMPERSONATION_READONLY`);
261
+ * - 404 missing order or worker (`TIP_ORDER_NOT_FOUND`, `TIP_RECIPIENT_NOT_FOUND`; the POST never
262
+ * answers `ORDER_NOT_FOUND`, only the re-sync read below does);
263
+ * - 409 order state, account, attempt or allocation conflicts (every other order/tip/attempt code);
264
+ * - 412 connection or configuration (`MP_NOT_CONNECTED`, `MP_TOKEN_EXPIRED`, `MP_USER_ID_MISSING`,
265
+ * `MP_NO_STORE_ON_ACCOUNT`);
266
+ * - 502 a definite POS or QR rejection (`MP_DYN_POS_CREATE_FAILED`, `MP_POS_INVALID`,
267
+ * `MP_DYN_QR_CREATE_FAILED`, `MP_DYN_QR_INVALID`);
268
+ * - 503 `PLATFORM_INTEGRATION_DISABLED`; 504 `MP_DYN_QR_UNCONFIRMED`, an unknown creation outcome.
269
+ * A thrown error answers `400 UNHANDLED_ERROR`, never a 500. The re-sync read
270
+ * (`GET /mercadopago/qr/dynamic?orderId=`) uses `VALIDATION_FAILED`, `PLAN_UPGRADE_REQUIRED`,
271
+ * `CAPABILITY_REQUIRED`, `ORDER_NOT_FOUND` and `ORDER_CANCELLED` from this list.
272
+ *
273
+ * Per Idempotency-Key on the tipped path: `MP_DYN_QR_IN_PROGRESS` = in flight
274
+ * (keep the key, poll); `MP_DYN_QR_REJECTED` = ended with no live charge (a
275
+ * fresh key is safe); `MP_DYN_QR_EXPIRED` = its QR expired (permanent for that
276
+ * key). A `contacting` attempt (MercadoPago may have been called) stays blocked
277
+ * indefinitely; a `reserved` one (provably never contacted) is released once it
278
+ * outlives the Lambda timeout. A fresh tipped reservation on an order already
279
+ * fully paid (till tenders plus linked payments cover its total, as its
280
+ * `financialStatus` derives) answers `PAYMENT_ALREADY_RECEIVED`; a part-paid
281
+ * order (a split) still mints the remainder. When a till tender or linked payment
282
+ * is in a currency the store holds no usable rate for, the paid sum is unknown, not
283
+ * paid: it answers `400 FX_CONVERSION_UNAVAILABLE` (configure the rate in Monedas,
284
+ * then retry with the same key).
285
+ * `MP_DYN_QR_INVALID` is untipped-only: on the tipped path a malformed 2xx is
286
+ * `MP_DYN_QR_UNCONFIRMED`. The retired `{ orderId }`-only body answers
287
+ * `VALIDATION_FAILED`. `INVALID_ORDER_STATE`, `ORDER_FX_RATE_UNAVAILABLE` and
288
+ * `ORDER_FX_AMOUNT_TOO_SMALL` were that body's alone and are no longer emitted;
289
+ * they stay listed so an existing client switch still compiles.
210
290
  */
211
- export declare const MP_DYNAMIC_QR_ERROR_CODES: readonly ["VALIDATION_FAILED", "MP_NOT_CONNECTED", "MP_TOKEN_EXPIRED", "MP_USER_ID_MISSING", "MP_NO_STORE_ON_ACCOUNT", "MP_DYN_POS_CREATE_FAILED", "MP_POS_INVALID", "MP_DYN_QR_CREATE_FAILED", "MP_DYN_QR_INVALID", "PLATFORM_INTEGRATION_DISABLED", "PLAN_UPGRADE_REQUIRED", "ORDER_CANCELLED", "INVALID_ORDER_STATE", "PAYMENT_ALREADY_RECEIVED", "ORDER_NOT_FOUND", "ORDER_FX_RATE_UNAVAILABLE", "ORDER_FX_AMOUNT_TOO_SMALL", "CAPABILITY_REQUIRED", "ROLE_FORBIDDEN", "IMPERSONATION_READONLY", "TIP_EXCEEDS_ORDER", "TIP_RECIPIENT_NOT_FOUND", "TIP_ACCOUNT_UNVERIFIED", "TIP_SHARED_ACCOUNT_FORBIDDEN", "TIP_ORDER_REQUIRED", "TIP_ORDER_NOT_FOUND", "TIP_OPERATION_CONFLICT", "TIP_PAYMENT_NOT_FOUND", "MP_DYN_QR_IN_PROGRESS", "MP_DYN_QR_EXPIRED", "MP_DYN_QR_UNCONFIRMED"];
291
+ export declare const MP_DYNAMIC_QR_ERROR_CODES: readonly ["VALIDATION_FAILED", "MP_NOT_CONNECTED", "MP_TOKEN_EXPIRED", "MP_USER_ID_MISSING", "MP_NO_STORE_ON_ACCOUNT", "MP_DYN_POS_CREATE_FAILED", "MP_POS_INVALID", "MP_DYN_QR_CREATE_FAILED", "MP_DYN_QR_INVALID", "PLATFORM_INTEGRATION_DISABLED", "PLAN_UPGRADE_REQUIRED", "ORDER_CANCELLED", "INVALID_ORDER_STATE", "PAYMENT_ALREADY_RECEIVED", "ORDER_NOT_FOUND", "ORDER_FX_RATE_UNAVAILABLE", "ORDER_FX_AMOUNT_TOO_SMALL", "CAPABILITY_REQUIRED", "ROLE_FORBIDDEN", "IMPERSONATION_READONLY", "TIP_EXCEEDS_ORDER", "TIP_RECIPIENT_NOT_FOUND", "TIP_ACCOUNT_UNVERIFIED", "TIP_SHARED_ACCOUNT_FORBIDDEN", "TIP_ORDER_REQUIRED", "TIP_ORDER_NOT_FOUND", "TIP_OPERATION_CONFLICT", "TIP_PAYMENT_NOT_FOUND", "MP_DYN_QR_IN_PROGRESS", "MP_DYN_QR_EXPIRED", "MP_DYN_QR_UNCONFIRMED", "MP_DYN_QR_REJECTED", "FX_CONVERSION_UNAVAILABLE"];
212
292
  export type MpDynamicQrErrorCode = (typeof MP_DYNAMIC_QR_ERROR_CODES)[number];
213
293
  export declare const MP_POINT_TIP_ERROR_CODES: readonly ["TIP_EXCEEDS_ORDER", "VALIDATION_FAILED", "CAPABILITY_REQUIRED", "ROLE_FORBIDDEN", "PLAN_UPGRADE_REQUIRED", "TIP_RECIPIENT_NOT_FOUND", "TIP_ACCOUNT_UNVERIFIED", "TIP_SHARED_ACCOUNT_FORBIDDEN", "TIP_ORDER_REQUIRED", "TIP_ORDER_NOT_FOUND", "TIP_OPERATION_CONFLICT", "TIP_PAYMENT_MISMATCH", "TIP_PAYMENT_NOT_FOUND", "TIP_REFUND_EXCEEDS_ORDER"];
214
294
  export type MpPointTipErrorCode = (typeof MP_POINT_TIP_ERROR_CODES)[number];
@@ -1,9 +1,38 @@
1
1
  /**
2
- * Dynamic QR initiation refusals. Connection/configuration failures use 412;
3
- * malformed requests use 400; permission/plan/support-session failures use 403.
4
- * Attempt/allocation conflicts use 409, and an unknown creation outcome uses
5
- * 504 MP_DYN_QR_UNCONFIRMED. An uncertain attempt remains blocked indefinitely.
6
- * Legacy order-only requests cannot carry tips.
2
+ * Dynamic QR initiation refusals, by status:
3
+ * - 400 malformed request (`VALIDATION_FAILED`, `TIP_EXCEEDS_ORDER`, `TIP_ORDER_REQUIRED`), or an
4
+ * order whose paid sum cannot be converted for want of a usable rate (`FX_CONVERSION_UNAVAILABLE`);
5
+ * - 403 permission, plan or support session (`CAPABILITY_REQUIRED`, `ROLE_FORBIDDEN`,
6
+ * `PLAN_UPGRADE_REQUIRED`, `IMPERSONATION_READONLY`);
7
+ * - 404 missing order or worker (`TIP_ORDER_NOT_FOUND`, `TIP_RECIPIENT_NOT_FOUND`; the POST never
8
+ * answers `ORDER_NOT_FOUND`, only the re-sync read below does);
9
+ * - 409 order state, account, attempt or allocation conflicts (every other order/tip/attempt code);
10
+ * - 412 connection or configuration (`MP_NOT_CONNECTED`, `MP_TOKEN_EXPIRED`, `MP_USER_ID_MISSING`,
11
+ * `MP_NO_STORE_ON_ACCOUNT`);
12
+ * - 502 a definite POS or QR rejection (`MP_DYN_POS_CREATE_FAILED`, `MP_POS_INVALID`,
13
+ * `MP_DYN_QR_CREATE_FAILED`, `MP_DYN_QR_INVALID`);
14
+ * - 503 `PLATFORM_INTEGRATION_DISABLED`; 504 `MP_DYN_QR_UNCONFIRMED`, an unknown creation outcome.
15
+ * A thrown error answers `400 UNHANDLED_ERROR`, never a 500. The re-sync read
16
+ * (`GET /mercadopago/qr/dynamic?orderId=`) uses `VALIDATION_FAILED`, `PLAN_UPGRADE_REQUIRED`,
17
+ * `CAPABILITY_REQUIRED`, `ORDER_NOT_FOUND` and `ORDER_CANCELLED` from this list.
18
+ *
19
+ * Per Idempotency-Key on the tipped path: `MP_DYN_QR_IN_PROGRESS` = in flight
20
+ * (keep the key, poll); `MP_DYN_QR_REJECTED` = ended with no live charge (a
21
+ * fresh key is safe); `MP_DYN_QR_EXPIRED` = its QR expired (permanent for that
22
+ * key). A `contacting` attempt (MercadoPago may have been called) stays blocked
23
+ * indefinitely; a `reserved` one (provably never contacted) is released once it
24
+ * outlives the Lambda timeout. A fresh tipped reservation on an order already
25
+ * fully paid (till tenders plus linked payments cover its total, as its
26
+ * `financialStatus` derives) answers `PAYMENT_ALREADY_RECEIVED`; a part-paid
27
+ * order (a split) still mints the remainder. When a till tender or linked payment
28
+ * is in a currency the store holds no usable rate for, the paid sum is unknown, not
29
+ * paid: it answers `400 FX_CONVERSION_UNAVAILABLE` (configure the rate in Monedas,
30
+ * then retry with the same key).
31
+ * `MP_DYN_QR_INVALID` is untipped-only: on the tipped path a malformed 2xx is
32
+ * `MP_DYN_QR_UNCONFIRMED`. The retired `{ orderId }`-only body answers
33
+ * `VALIDATION_FAILED`. `INVALID_ORDER_STATE`, `ORDER_FX_RATE_UNAVAILABLE` and
34
+ * `ORDER_FX_AMOUNT_TOO_SMALL` were that body's alone and are no longer emitted;
35
+ * they stay listed so an existing client switch still compiles.
7
36
  */
8
37
  export const MP_DYNAMIC_QR_ERROR_CODES = [
9
38
  'VALIDATION_FAILED',
@@ -37,6 +66,8 @@ export const MP_DYNAMIC_QR_ERROR_CODES = [
37
66
  'MP_DYN_QR_IN_PROGRESS',
38
67
  'MP_DYN_QR_EXPIRED',
39
68
  'MP_DYN_QR_UNCONFIRMED',
69
+ 'MP_DYN_QR_REJECTED',
70
+ 'FX_CONVERSION_UNAVAILABLE',
40
71
  ];
41
72
  export const MP_POINT_TIP_ERROR_CODES = [
42
73
  'TIP_EXCEEDS_ORDER',
package/dist/order.d.ts CHANGED
@@ -1133,6 +1133,7 @@ declare global {
1133
1133
  postalCode: string;
1134
1134
  };
1135
1135
  mercadopago?: {
1136
+ /** @deprecated Historical, no longer written; see the comment above. */
1136
1137
  dynamicQr?: {
1137
1138
  qrData: string;
1138
1139
  inStoreOrderId: string;
@@ -98,15 +98,18 @@ declare global {
98
98
  * ⚠️ `'email'` here is what `CustomerSignInProvider` spells
99
99
  * `'password'`; the other members share their spelling. Neither value is
100
100
  * assignable to the other's slot — map across explicitly.
101
+ *
102
+ * `'passkey'` is a storefront passkey sign-in. It is a sign-IN member
103
+ * only: a passkey is registered from an existing session, so
104
+ * `Customer Signed Up` never carries it.
101
105
  */
102
- method: 'email' | 'google' | 'facebook' | 'apple';
106
+ method: 'email' | 'google' | 'facebook' | 'apple' | 'passkey';
103
107
  }
104
108
  interface CustomerSignedUpEvent extends StorefrontEventBase {
105
109
  event: 'Customer Signed Up';
106
110
  /**
107
- * Same union as the sign-in twin, and deliberately so: one shared
108
- * validator covers both events server-side, so they cannot diverge
109
- * without splitting it.
111
+ * The sign-in twin's union minus `'passkey'` — a passkey is registered
112
+ * from an existing session, never at sign-up.
110
113
  *
111
114
  * ⚠️ Only `'email'` is emitted today — registration is api-side and has
112
115
  * no social leg. The social members are reachable shape, not observed
@@ -160,6 +160,17 @@ declare global {
160
160
  trigger: 'self' | 'two-factor-disabled' | 'two-factor-reset';
161
161
  target_user_id?: string;
162
162
  }
163
+ /**
164
+ * A staff member removed a storefront customer's passkeys — `POST /customers`
165
+ * mode `revoke-passkeys`. Operator-on-customer: `user_id`/`actor_*` are the
166
+ * operator, `customer_id` the customer. `revoked_count` is how many live
167
+ * passkeys this action retracted. Carries no credential id, label or host.
168
+ */
169
+ interface CustomerPasskeysRevokedEvent extends UserActivityEventBase {
170
+ event: 'Customer Passkeys Revoked';
171
+ customer_id: string;
172
+ revoked_count: number;
173
+ }
163
174
  interface StoreSettingsUpdatedEvent extends UserActivityEventBase {
164
175
  event: 'Store Settings Updated';
165
176
  section: string;
@@ -1317,7 +1328,7 @@ declare global {
1317
1328
  carrier?: string;
1318
1329
  tracking_set: boolean;
1319
1330
  }
1320
- type UserActivityEvent = CustomerConsentImportedEvent | CustomerConsentImportCompletedEvent | UserLoggedInEvent | UserLoggedOutEvent | UserPasswordChangedEvent | UserSuspendedEvent | TwoFactorEnrolledEvent | TwoFactorDisabledEvent | TwoFactorResetEvent | TwoFactorRecoveryCodesGeneratedEvent | PasskeyRegisteredEvent | PasskeyRevokedEvent | StoreSettingsUpdatedEvent | PlanChangedEvent | InvoiceCreatedEvent | OrderCreatedEvent | OrderCancelledEvent | OrderEditedEvent | OrderReturnedEvent | ReturnLineRegradedEvent | ProductPriceChangedEvent | CustomerCreatedEvent | CustomerEditedEvent | CustomerRecordServedEvent | CustomerCreditCheckPerformedEvent | CustomersMergedEvent | CustomerMergeCancelledEvent | CashDrawerOpenedEvent | CashDrawerClosedEvent | TenantImpersonatedEvent | SecretRotatedEvent | UserCreatedEvent | UserUpdatedEvent | ProductCreatedEvent | ProductUpdatedEvent | StockIncomeCreatedEvent | StockAdjustedEvent | CategoryCreatedEvent | CategoryUpdatedEvent | BrandCreatedEvent | BrandUpdatedEvent | SupplierCreatedEvent | SupplierUpdatedEvent | SupplierInvoiceCreatedEvent | SupplierInvoiceMatchOverriddenEvent | SupplierClaimRaisedEvent | SupplierClaimStatusChangedEvent | SupplierAccountCreatedEvent | SupplierAccountUpdatedEvent | AccountCreatedEvent | AccountDeletedEvent | CustomerBalanceReprojectedEvent | BasketUpdatedEvent | BasketDiscountGrantedEvent | BasketDeletedEvent | CashDrawerMovementEvent | CashDrawerReconciledEvent | PaymentCreatedEvent | PaymentLinkedEvent | PaymentUnlinkedEvent | PaymentLinkageUpdatedEvent | CreditLimitOverriddenEvent | AppointmentSelfBookingBlockOverriddenEvent | AppointmentSelfBookingBlockLiftedEvent | NotificationReadEvent | LogDeletedEvent | PlanCreatedEvent | StoreMaintenanceToggledEvent | PlatformMaintenanceToggledEvent | MaintenanceBroadcastSentEvent | TenantCreatedEvent | LiteralUpdatedEvent | SupportTicketCreatedEvent | SupportTicketUpdatedEvent | AuditTrailViewedEvent | ReportViewedEvent | CustomerPiiViewedEvent | CashDrawerUiOpenedEvent | CashDrawerUiClosedEvent | ExportInitiatedEvent | ImpersonationUiStartedEvent | ImpersonationUiEndedEvent | PaymentViewedEvent | InvoiceViewedEvent | CustomerDetailViewedEvent | SupplierAccountViewedEvent | SearchPerformedEvent | ActionDeniedEvent | TwoFactorChallengeShownEvent | TwoFactorCodeValidationFailedEvent | TwoFactorEnrollmentStartedEvent | TwoFactorRecoveryCodesRevealedEvent | TwoFactorResetInitiatedEvent | IntegrationTokenRefreshedEvent | WaitlistConvertedEvent | PlatformConfigUpdatedEvent | MlChannelStatusChangedEvent | IntegrationConnectionChangedEvent | PrintRuleCreatedEvent | PrintRuleEditedEvent | PrintRuleDeletedEvent | WebhookCreatedEvent | WebhookUpdatedEvent | WebhookDeletedEvent | PrinterActiveToggledEvent | PrinterRawFormatsUpdatedEvent | PrinterProfileUpdatedEvent | PlanTemplateUpdatedEvent | SupplierAccountDeletedEvent | CustomerPasswordResetInitiatedEvent | UserSessionsRevokedEvent | UserAnonymizedEvent | UserPasswordResetInitiatedByOperatorEvent | AgentCommandDispatchedEvent | PrintJobCancelledEvent | PrintAgentPairingCodeMintedEvent | PrintAgentPairedEvent | PrintAgentRevokedEvent | RmaRequestedEvent | RmaTransitionedEvent | RmaTrackingUpdatedEvent | ClockedInEvent | ClockedOutEvent | AttendanceCorrectedEvent;
1331
+ type UserActivityEvent = CustomerConsentImportedEvent | CustomerConsentImportCompletedEvent | UserLoggedInEvent | UserLoggedOutEvent | UserPasswordChangedEvent | UserSuspendedEvent | TwoFactorEnrolledEvent | TwoFactorDisabledEvent | TwoFactorResetEvent | TwoFactorRecoveryCodesGeneratedEvent | PasskeyRegisteredEvent | PasskeyRevokedEvent | CustomerPasskeysRevokedEvent | StoreSettingsUpdatedEvent | PlanChangedEvent | InvoiceCreatedEvent | OrderCreatedEvent | OrderCancelledEvent | OrderEditedEvent | OrderReturnedEvent | ReturnLineRegradedEvent | ProductPriceChangedEvent | CustomerCreatedEvent | CustomerEditedEvent | CustomerRecordServedEvent | CustomerCreditCheckPerformedEvent | CustomersMergedEvent | CustomerMergeCancelledEvent | CashDrawerOpenedEvent | CashDrawerClosedEvent | TenantImpersonatedEvent | SecretRotatedEvent | UserCreatedEvent | UserUpdatedEvent | ProductCreatedEvent | ProductUpdatedEvent | StockIncomeCreatedEvent | StockAdjustedEvent | CategoryCreatedEvent | CategoryUpdatedEvent | BrandCreatedEvent | BrandUpdatedEvent | SupplierCreatedEvent | SupplierUpdatedEvent | SupplierInvoiceCreatedEvent | SupplierInvoiceMatchOverriddenEvent | SupplierClaimRaisedEvent | SupplierClaimStatusChangedEvent | SupplierAccountCreatedEvent | SupplierAccountUpdatedEvent | AccountCreatedEvent | AccountDeletedEvent | CustomerBalanceReprojectedEvent | BasketUpdatedEvent | BasketDiscountGrantedEvent | BasketDeletedEvent | CashDrawerMovementEvent | CashDrawerReconciledEvent | PaymentCreatedEvent | PaymentLinkedEvent | PaymentUnlinkedEvent | PaymentLinkageUpdatedEvent | CreditLimitOverriddenEvent | AppointmentSelfBookingBlockOverriddenEvent | AppointmentSelfBookingBlockLiftedEvent | NotificationReadEvent | LogDeletedEvent | PlanCreatedEvent | StoreMaintenanceToggledEvent | PlatformMaintenanceToggledEvent | MaintenanceBroadcastSentEvent | TenantCreatedEvent | LiteralUpdatedEvent | SupportTicketCreatedEvent | SupportTicketUpdatedEvent | AuditTrailViewedEvent | ReportViewedEvent | CustomerPiiViewedEvent | CashDrawerUiOpenedEvent | CashDrawerUiClosedEvent | ExportInitiatedEvent | ImpersonationUiStartedEvent | ImpersonationUiEndedEvent | PaymentViewedEvent | InvoiceViewedEvent | CustomerDetailViewedEvent | SupplierAccountViewedEvent | SearchPerformedEvent | ActionDeniedEvent | TwoFactorChallengeShownEvent | TwoFactorCodeValidationFailedEvent | TwoFactorEnrollmentStartedEvent | TwoFactorRecoveryCodesRevealedEvent | TwoFactorResetInitiatedEvent | IntegrationTokenRefreshedEvent | WaitlistConvertedEvent | PlatformConfigUpdatedEvent | MlChannelStatusChangedEvent | IntegrationConnectionChangedEvent | PrintRuleCreatedEvent | PrintRuleEditedEvent | PrintRuleDeletedEvent | WebhookCreatedEvent | WebhookUpdatedEvent | WebhookDeletedEvent | PrinterActiveToggledEvent | PrinterRawFormatsUpdatedEvent | PrinterProfileUpdatedEvent | PlanTemplateUpdatedEvent | SupplierAccountDeletedEvent | CustomerPasswordResetInitiatedEvent | UserSessionsRevokedEvent | UserAnonymizedEvent | UserPasswordResetInitiatedByOperatorEvent | AgentCommandDispatchedEvent | PrintJobCancelledEvent | PrintAgentPairingCodeMintedEvent | PrintAgentPairedEvent | PrintAgentRevokedEvent | RmaRequestedEvent | RmaTransitionedEvent | RmaTrackingUpdatedEvent | ClockedInEvent | ClockedOutEvent | AttendanceCorrectedEvent;
1321
1332
  }
1322
1333
  /**
1323
1334
  * Canonical whitelist of UI-only `UserActivityEvent` variant names. Imported by
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sinfactura-types",
3
- "version": "1.10.552",
3
+ "version": "1.10.554",
4
4
  "description": "Shared wire and entity contracts for the SINFACTURA platform.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",