@faable/auth-sdk 2.6.15 → 2.6.17

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.
@@ -524,6 +524,46 @@ export interface paths {
524
524
  patch?: never;
525
525
  trace?: never;
526
526
  };
527
+ "/user/{user_id}/verify-phone/start": {
528
+ parameters: {
529
+ query?: never;
530
+ header?: never;
531
+ path?: never;
532
+ cookie?: never;
533
+ };
534
+ get?: never;
535
+ put?: never;
536
+ /**
537
+ * Send a verification code to the user's phone
538
+ * @description Sends a 6-digit code by SMS to the user's phone (optionally setting a new phone first) and returns an opaque `state` to confirm it with. Same authorization as `verify-email/start`: the user themself (session or bearer), an admin of another tenant, or a machine token. Counts against the tenant's monthly SMS allowance. Fails with 409 `sms_unavailable` when no SMS can go out (no provider, plan does not allow it, allowance exhausted).
539
+ */
540
+ post: operations["user/verifyPhoneStart"];
541
+ delete?: never;
542
+ options?: never;
543
+ head?: never;
544
+ patch?: never;
545
+ trace?: never;
546
+ };
547
+ "/verify-phone/confirm": {
548
+ parameters: {
549
+ query?: never;
550
+ header?: never;
551
+ path?: never;
552
+ cookie?: never;
553
+ };
554
+ get?: never;
555
+ put?: never;
556
+ /**
557
+ * Confirm a phone verification code
558
+ * @description Marks the phone verified (`phone_verified_method: sms_otp`) when the code matches the pending verification identified by `state`. Five wrong codes burn the `state`; start again. No session needed: the `state` plus the code are the proof.
559
+ */
560
+ post: operations["user/verifyPhoneConfirm"];
561
+ delete?: never;
562
+ options?: never;
563
+ head?: never;
564
+ patch?: never;
565
+ trace?: never;
566
+ };
527
567
  "/user/{user_id}/factors": {
528
568
  parameters: {
529
569
  query?: never;
@@ -2753,6 +2793,46 @@ export interface paths {
2753
2793
  patch?: never;
2754
2794
  trace?: never;
2755
2795
  };
2796
+ "/reset-code/verify": {
2797
+ parameters: {
2798
+ query?: never;
2799
+ header?: never;
2800
+ path?: never;
2801
+ cookie?: never;
2802
+ };
2803
+ get?: never;
2804
+ put?: never;
2805
+ /**
2806
+ * Redeem a password-reset code sent by SMS/WhatsApp
2807
+ * @description Second entry point to the new-password screen, for a reset delivered as a 6-digit code instead of a link. Answers the same `redirect_url` that the emailed link would land on. Five wrong codes consume the ticket; the error is always `invalid_code` and reveals nothing about the account.
2808
+ */
2809
+ post: operations["reset_code_verify"];
2810
+ delete?: never;
2811
+ options?: never;
2812
+ head?: never;
2813
+ patch?: never;
2814
+ trace?: never;
2815
+ };
2816
+ "/dbconnections/recovery_options": {
2817
+ parameters: {
2818
+ query?: never;
2819
+ header?: never;
2820
+ path?: never;
2821
+ cookie?: never;
2822
+ };
2823
+ get?: never;
2824
+ put?: never;
2825
+ /**
2826
+ * Recovery channels to offer for an identifier
2827
+ * @description For the forgot-password screen. With the tenant's `visible` list empty (the default) it answers from configuration alone and never looks the account up. Otherwise it returns the channels the user can pick, with masked destinations.
2828
+ */
2829
+ post: operations["recovery_options"];
2830
+ delete?: never;
2831
+ options?: never;
2832
+ head?: never;
2833
+ patch?: never;
2834
+ trace?: never;
2835
+ };
2756
2836
  "/dbconnections/signup": {
2757
2837
  parameters: {
2758
2838
  query?: never;
@@ -2880,6 +2960,8 @@ export interface components {
2880
2960
  /** @description Channels the recovery screen offers the user to pick from, after they enter their identifier. Empty (the default) keeps today's behaviour: the default channel is used silently and the response never reveals whether the account exists. A non-empty list shows a picker with masked destinations — which does reveal that the account exists and which channels it has, the same trade-off Google and Microsoft make. A tenant decision. */
2881
2961
  visible?: ("email" | "sms" | "whatsapp" | "factor")[];
2882
2962
  };
2963
+ /** @description ISO 3166-1 alpha-2 country assumed for phone numbers written without an international prefix (`636647460` → `+34…` with `ES`). Needed before SMS can reach anyone: most people type their number without a prefix. */
2964
+ default_country_iso?: string | null;
2883
2965
  /** @description WebAuthn Relying Party ID for this tenant's passkeys. Defaults to the account domain. Set it to a registrable suffix you own (e.g. `acme.com`) when the login screen is served from more than one host — the RP ID is frozen into every credential at registration, so changing it afterwards invalidates every passkey already enrolled. */
2884
2966
  webauthn_rp_id?: string | null;
2885
2967
  /** @description AuthAccount creation date */
@@ -3331,7 +3413,7 @@ export interface components {
3331
3413
  */
3332
3414
  email_verified: boolean;
3333
3415
  /** @description How `email_verified` was last set. `manual` — admin flipped the flag via `POST /user/:id`. `verification_flow` — user clicked the verification link. `passwordless_otp` — user completed passwordless OTP login. `team_invite` — user clicked a team invitation link. `email_change` — user confirmed a self-service email change. `federated` — verified by the external IdP on OAuth callback. `null` — the field was cleared (admin un-verified the email). */
3334
- email_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | null;
3416
+ email_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | "sms_otp" | null;
3335
3417
  /** @description ISO 8601 timestamp of when `email_verified` was last flipped to true. */
3336
3418
  email_verified_at?: string | null;
3337
3419
  /** @description ISO 8601 timestamp of the user's last verified email change. When set, OAuth callbacks will not overwrite `email`/`email_verified` from the federated provider — the manually-chosen email wins. */
@@ -3350,8 +3432,8 @@ export interface components {
3350
3432
  phone?: string | null;
3351
3433
  /** @description phone is verified */
3352
3434
  phone_verified: boolean;
3353
- /** @description How `phone_verified` was last set. Same enum as `email_verified_method`. */
3354
- phone_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | null;
3435
+ /** @description How `phone_verified` was last set. Same enum as `email_verified_method`, plus `sms_otp` — the user typed a code sent by SMS (`POST /user/:id/verify-phone/start`). */
3436
+ phone_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | "sms_otp" | null;
3355
3437
  /** @description ISO 8601 timestamp of when `phone_verified` was last flipped to true. */
3356
3438
  phone_verified_at?: string | null;
3357
3439
  /** @description country iso code */
@@ -4748,6 +4830,7 @@ export interface components {
4748
4830
  /** @description Channels the recovery screen offers the user to pick from, after they enter their identifier. Empty (the default) keeps today's behaviour: the default channel is used silently and the response never reveals whether the account exists. A non-empty list shows a picker with masked destinations — which does reveal that the account exists and which channels it has, the same trade-off Google and Microsoft make. A tenant decision. */
4749
4831
  visible?: ("email" | "sms" | "whatsapp" | "factor")[];
4750
4832
  } | null;
4833
+ default_country_iso?: string | null;
4751
4834
  webauthn_rp_id?: string | null;
4752
4835
  login_flow?: string | null;
4753
4836
  };
@@ -4953,6 +5036,8 @@ export interface operations {
4953
5036
  /** @description Channels the recovery screen offers the user to pick from, after they enter their identifier. Empty (the default) keeps today's behaviour: the default channel is used silently and the response never reveals whether the account exists. A non-empty list shows a picker with masked destinations — which does reveal that the account exists and which channels it has, the same trade-off Google and Microsoft make. A tenant decision. */
4954
5037
  visible?: ("email" | "sms" | "whatsapp" | "factor")[];
4955
5038
  };
5039
+ /** @description ISO 3166-1 alpha-2 country assumed for phone numbers written without an international prefix (`636647460` → `+34…` with `ES`). Needed before SMS can reach anyone: most people type their number without a prefix. */
5040
+ default_country_iso?: string | null;
4956
5041
  /** @description WebAuthn Relying Party ID for this tenant's passkeys. Defaults to the account domain. Set it to a registrable suffix you own (e.g. `acme.com`) when the login screen is served from more than one host — the RP ID is frozen into every credential at registration, so changing it afterwards invalidates every passkey already enrolled. */
4957
5042
  webauthn_rp_id?: string | null;
4958
5043
  /** @description AuthAccount creation date */
@@ -5132,6 +5217,8 @@ export interface operations {
5132
5217
  /** @description Channels the recovery screen offers the user to pick from, after they enter their identifier. Empty (the default) keeps today's behaviour: the default channel is used silently and the response never reveals whether the account exists. A non-empty list shows a picker with masked destinations — which does reveal that the account exists and which channels it has, the same trade-off Google and Microsoft make. A tenant decision. */
5133
5218
  visible?: ("email" | "sms" | "whatsapp" | "factor")[];
5134
5219
  };
5220
+ /** @description ISO 3166-1 alpha-2 country assumed for phone numbers written without an international prefix (`636647460` → `+34…` with `ES`). Needed before SMS can reach anyone: most people type their number without a prefix. */
5221
+ default_country_iso?: string | null;
5135
5222
  /** @description WebAuthn Relying Party ID for this tenant's passkeys. Defaults to the account domain. Set it to a registrable suffix you own (e.g. `acme.com`) when the login screen is served from more than one host — the RP ID is frozen into every credential at registration, so changing it afterwards invalidates every passkey already enrolled. */
5136
5223
  webauthn_rp_id?: string | null;
5137
5224
  /** @description AuthAccount creation date */
@@ -5265,6 +5352,8 @@ export interface operations {
5265
5352
  /** @description Channels the recovery screen offers the user to pick from, after they enter their identifier. Empty (the default) keeps today's behaviour: the default channel is used silently and the response never reveals whether the account exists. A non-empty list shows a picker with masked destinations — which does reveal that the account exists and which channels it has, the same trade-off Google and Microsoft make. A tenant decision. */
5266
5353
  visible?: ("email" | "sms" | "whatsapp" | "factor")[];
5267
5354
  };
5355
+ /** @description ISO 3166-1 alpha-2 country assumed for phone numbers written without an international prefix (`636647460` → `+34…` with `ES`). Needed before SMS can reach anyone: most people type their number without a prefix. */
5356
+ default_country_iso?: string | null;
5268
5357
  /** @description WebAuthn Relying Party ID for this tenant's passkeys. Defaults to the account domain. Set it to a registrable suffix you own (e.g. `acme.com`) when the login screen is served from more than one host — the RP ID is frozen into every credential at registration, so changing it afterwards invalidates every passkey already enrolled. */
5269
5358
  webauthn_rp_id?: string | null;
5270
5359
  /** @description AuthAccount creation date */
@@ -5363,6 +5452,7 @@ export interface operations {
5363
5452
  /** @description Channels the recovery screen offers the user to pick from, after they enter their identifier. Empty (the default) keeps today's behaviour: the default channel is used silently and the response never reveals whether the account exists. A non-empty list shows a picker with masked destinations — which does reveal that the account exists and which channels it has, the same trade-off Google and Microsoft make. A tenant decision. */
5364
5453
  visible?: ("email" | "sms" | "whatsapp" | "factor")[];
5365
5454
  } | null;
5455
+ default_country_iso?: string | null;
5366
5456
  webauthn_rp_id?: string | null;
5367
5457
  login_flow?: string | null;
5368
5458
  };
@@ -5477,6 +5567,8 @@ export interface operations {
5477
5567
  /** @description Channels the recovery screen offers the user to pick from, after they enter their identifier. Empty (the default) keeps today's behaviour: the default channel is used silently and the response never reveals whether the account exists. A non-empty list shows a picker with masked destinations — which does reveal that the account exists and which channels it has, the same trade-off Google and Microsoft make. A tenant decision. */
5478
5568
  visible?: ("email" | "sms" | "whatsapp" | "factor")[];
5479
5569
  };
5570
+ /** @description ISO 3166-1 alpha-2 country assumed for phone numbers written without an international prefix (`636647460` → `+34…` with `ES`). Needed before SMS can reach anyone: most people type their number without a prefix. */
5571
+ default_country_iso?: string | null;
5480
5572
  /** @description WebAuthn Relying Party ID for this tenant's passkeys. Defaults to the account domain. Set it to a registrable suffix you own (e.g. `acme.com`) when the login screen is served from more than one host — the RP ID is frozen into every credential at registration, so changing it afterwards invalidates every passkey already enrolled. */
5481
5573
  webauthn_rp_id?: string | null;
5482
5574
  /** @description AuthAccount creation date */
@@ -5619,6 +5711,8 @@ export interface operations {
5619
5711
  /** @description Channels the recovery screen offers the user to pick from, after they enter their identifier. Empty (the default) keeps today's behaviour: the default channel is used silently and the response never reveals whether the account exists. A non-empty list shows a picker with masked destinations — which does reveal that the account exists and which channels it has, the same trade-off Google and Microsoft make. A tenant decision. */
5620
5712
  visible?: ("email" | "sms" | "whatsapp" | "factor")[];
5621
5713
  };
5714
+ /** @description ISO 3166-1 alpha-2 country assumed for phone numbers written without an international prefix (`636647460` → `+34…` with `ES`). Needed before SMS can reach anyone: most people type their number without a prefix. */
5715
+ default_country_iso?: string | null;
5622
5716
  /** @description WebAuthn Relying Party ID for this tenant's passkeys. Defaults to the account domain. Set it to a registrable suffix you own (e.g. `acme.com`) when the login screen is served from more than one host — the RP ID is frozen into every credential at registration, so changing it afterwards invalidates every passkey already enrolled. */
5623
5717
  webauthn_rp_id?: string | null;
5624
5718
  /** @description AuthAccount creation date */
@@ -7060,7 +7154,7 @@ export interface operations {
7060
7154
  */
7061
7155
  email_verified: boolean;
7062
7156
  /** @description How `email_verified` was last set. `manual` — admin flipped the flag via `POST /user/:id`. `verification_flow` — user clicked the verification link. `passwordless_otp` — user completed passwordless OTP login. `team_invite` — user clicked a team invitation link. `email_change` — user confirmed a self-service email change. `federated` — verified by the external IdP on OAuth callback. `null` — the field was cleared (admin un-verified the email). */
7063
- email_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | null;
7157
+ email_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | "sms_otp" | null;
7064
7158
  /** @description ISO 8601 timestamp of when `email_verified` was last flipped to true. */
7065
7159
  email_verified_at?: string | null;
7066
7160
  /** @description ISO 8601 timestamp of the user's last verified email change. When set, OAuth callbacks will not overwrite `email`/`email_verified` from the federated provider — the manually-chosen email wins. */
@@ -7079,8 +7173,8 @@ export interface operations {
7079
7173
  phone?: string | null;
7080
7174
  /** @description phone is verified */
7081
7175
  phone_verified: boolean;
7082
- /** @description How `phone_verified` was last set. Same enum as `email_verified_method`. */
7083
- phone_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | null;
7176
+ /** @description How `phone_verified` was last set. Same enum as `email_verified_method`, plus `sms_otp` — the user typed a code sent by SMS (`POST /user/:id/verify-phone/start`). */
7177
+ phone_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | "sms_otp" | null;
7084
7178
  /** @description ISO 8601 timestamp of when `phone_verified` was last flipped to true. */
7085
7179
  phone_verified_at?: string | null;
7086
7180
  /** @description country iso code */
@@ -7200,7 +7294,7 @@ export interface operations {
7200
7294
  */
7201
7295
  email_verified: boolean;
7202
7296
  /** @description How `email_verified` was last set. `manual` — admin flipped the flag via `POST /user/:id`. `verification_flow` — user clicked the verification link. `passwordless_otp` — user completed passwordless OTP login. `team_invite` — user clicked a team invitation link. `email_change` — user confirmed a self-service email change. `federated` — verified by the external IdP on OAuth callback. `null` — the field was cleared (admin un-verified the email). */
7203
- email_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | null;
7297
+ email_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | "sms_otp" | null;
7204
7298
  /** @description ISO 8601 timestamp of when `email_verified` was last flipped to true. */
7205
7299
  email_verified_at?: string | null;
7206
7300
  /** @description ISO 8601 timestamp of the user's last verified email change. When set, OAuth callbacks will not overwrite `email`/`email_verified` from the federated provider — the manually-chosen email wins. */
@@ -7219,8 +7313,8 @@ export interface operations {
7219
7313
  phone?: string | null;
7220
7314
  /** @description phone is verified */
7221
7315
  phone_verified: boolean;
7222
- /** @description How `phone_verified` was last set. Same enum as `email_verified_method`. */
7223
- phone_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | null;
7316
+ /** @description How `phone_verified` was last set. Same enum as `email_verified_method`, plus `sms_otp` — the user typed a code sent by SMS (`POST /user/:id/verify-phone/start`). */
7317
+ phone_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | "sms_otp" | null;
7224
7318
  /** @description ISO 8601 timestamp of when `phone_verified` was last flipped to true. */
7225
7319
  phone_verified_at?: string | null;
7226
7320
  /** @description country iso code */
@@ -7380,7 +7474,7 @@ export interface operations {
7380
7474
  */
7381
7475
  email_verified: boolean;
7382
7476
  /** @description How `email_verified` was last set. `manual` — admin flipped the flag via `POST /user/:id`. `verification_flow` — user clicked the verification link. `passwordless_otp` — user completed passwordless OTP login. `team_invite` — user clicked a team invitation link. `email_change` — user confirmed a self-service email change. `federated` — verified by the external IdP on OAuth callback. `null` — the field was cleared (admin un-verified the email). */
7383
- email_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | null;
7477
+ email_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | "sms_otp" | null;
7384
7478
  /** @description ISO 8601 timestamp of when `email_verified` was last flipped to true. */
7385
7479
  email_verified_at?: string | null;
7386
7480
  /** @description ISO 8601 timestamp of the user's last verified email change. When set, OAuth callbacks will not overwrite `email`/`email_verified` from the federated provider — the manually-chosen email wins. */
@@ -7399,8 +7493,8 @@ export interface operations {
7399
7493
  phone?: string | null;
7400
7494
  /** @description phone is verified */
7401
7495
  phone_verified: boolean;
7402
- /** @description How `phone_verified` was last set. Same enum as `email_verified_method`. */
7403
- phone_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | null;
7496
+ /** @description How `phone_verified` was last set. Same enum as `email_verified_method`, plus `sms_otp` — the user typed a code sent by SMS (`POST /user/:id/verify-phone/start`). */
7497
+ phone_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | "sms_otp" | null;
7404
7498
  /** @description ISO 8601 timestamp of when `phone_verified` was last flipped to true. */
7405
7499
  phone_verified_at?: string | null;
7406
7500
  /** @description country iso code */
@@ -7520,7 +7614,7 @@ export interface operations {
7520
7614
  */
7521
7615
  email_verified: boolean;
7522
7616
  /** @description How `email_verified` was last set. `manual` — admin flipped the flag via `POST /user/:id`. `verification_flow` — user clicked the verification link. `passwordless_otp` — user completed passwordless OTP login. `team_invite` — user clicked a team invitation link. `email_change` — user confirmed a self-service email change. `federated` — verified by the external IdP on OAuth callback. `null` — the field was cleared (admin un-verified the email). */
7523
- email_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | null;
7617
+ email_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | "sms_otp" | null;
7524
7618
  /** @description ISO 8601 timestamp of when `email_verified` was last flipped to true. */
7525
7619
  email_verified_at?: string | null;
7526
7620
  /** @description ISO 8601 timestamp of the user's last verified email change. When set, OAuth callbacks will not overwrite `email`/`email_verified` from the federated provider — the manually-chosen email wins. */
@@ -7539,8 +7633,8 @@ export interface operations {
7539
7633
  phone?: string | null;
7540
7634
  /** @description phone is verified */
7541
7635
  phone_verified: boolean;
7542
- /** @description How `phone_verified` was last set. Same enum as `email_verified_method`. */
7543
- phone_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | null;
7636
+ /** @description How `phone_verified` was last set. Same enum as `email_verified_method`, plus `sms_otp` — the user typed a code sent by SMS (`POST /user/:id/verify-phone/start`). */
7637
+ phone_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | "sms_otp" | null;
7544
7638
  /** @description ISO 8601 timestamp of when `phone_verified` was last flipped to true. */
7545
7639
  phone_verified_at?: string | null;
7546
7640
  /** @description country iso code */
@@ -7746,6 +7840,8 @@ export interface operations {
7746
7840
  "application/json": {
7747
7841
  /** @description Optional connection_name to disambiguate when the tenant has more than one database connection. Defaults to the tenant database connection. */
7748
7842
  connection?: string;
7843
+ /** @description How to deliver it: `email` (the link) or `sms` / `whatsapp` (a 6-digit code to the verified phone on file). Falls back to the tenant default when not available for this user; the response says which channel was used. */
7844
+ channel?: "email" | "sms" | "whatsapp" | "factor";
7749
7845
  };
7750
7846
  };
7751
7847
  };
@@ -7761,6 +7857,7 @@ export interface operations {
7761
7857
  status: "sent";
7762
7858
  credential_id: string;
7763
7859
  ticket_id: string;
7860
+ channel: "email" | "sms" | "whatsapp" | "factor";
7764
7861
  };
7765
7862
  };
7766
7863
  };
@@ -7792,6 +7889,8 @@ export interface operations {
7792
7889
  createdAt: string;
7793
7890
  expires_at: string;
7794
7891
  ttl: number;
7892
+ /** @description How this ticket reaches the person: `email` (the link), `sms` / `whatsapp` (a code), `factor`. Older tickets are `email`. */
7893
+ channel: string;
7795
7894
  /** @description The link from the ticket email. Present only while the ticket is usable — a dead link is noise, not a recovery path. */
7796
7895
  link?: string;
7797
7896
  }[];
@@ -7826,6 +7925,73 @@ export interface operations {
7826
7925
  };
7827
7926
  };
7828
7927
  };
7928
+ "user/verifyPhoneStart": {
7929
+ parameters: {
7930
+ query?: never;
7931
+ header?: never;
7932
+ path: {
7933
+ user_id: string;
7934
+ };
7935
+ cookie?: never;
7936
+ };
7937
+ requestBody: {
7938
+ content: {
7939
+ "application/json": {
7940
+ /** @description Phone to verify. When given, it replaces the user's phone (normalised to E.164 with the account's `default_country_iso` as fallback) before the code is sent. When omitted, the code goes to the phone already on the user. */
7941
+ phone?: string;
7942
+ };
7943
+ };
7944
+ };
7945
+ responses: {
7946
+ /** @description Default Response */
7947
+ 200: {
7948
+ headers: {
7949
+ [name: string]: unknown;
7950
+ };
7951
+ content: {
7952
+ "application/json": {
7953
+ /** @enum {string} */
7954
+ status: "sent";
7955
+ destination_masked: string;
7956
+ /** @description Opaque handle to confirm with. It is what lets a tenant backend start the verification (M2M) and send the person to `/flow/verify-phone?state=…` without a session. */
7957
+ state: string;
7958
+ expires_in: number;
7959
+ };
7960
+ };
7961
+ };
7962
+ };
7963
+ };
7964
+ "user/verifyPhoneConfirm": {
7965
+ parameters: {
7966
+ query?: never;
7967
+ header?: never;
7968
+ path?: never;
7969
+ cookie?: never;
7970
+ };
7971
+ requestBody: {
7972
+ content: {
7973
+ "application/json": {
7974
+ state: string;
7975
+ code: string;
7976
+ };
7977
+ };
7978
+ };
7979
+ responses: {
7980
+ /** @description Default Response */
7981
+ 200: {
7982
+ headers: {
7983
+ [name: string]: unknown;
7984
+ };
7985
+ content: {
7986
+ "application/json": {
7987
+ /** @enum {string} */
7988
+ status: "verified";
7989
+ user_id: string;
7990
+ };
7991
+ };
7992
+ };
7993
+ };
7994
+ };
7829
7995
  "user/factors": {
7830
7996
  parameters: {
7831
7997
  query?: never;
@@ -12393,7 +12559,7 @@ export interface operations {
12393
12559
  */
12394
12560
  email_verified: boolean;
12395
12561
  /** @description How `email_verified` was last set. `manual` — admin flipped the flag via `POST /user/:id`. `verification_flow` — user clicked the verification link. `passwordless_otp` — user completed passwordless OTP login. `team_invite` — user clicked a team invitation link. `email_change` — user confirmed a self-service email change. `federated` — verified by the external IdP on OAuth callback. `null` — the field was cleared (admin un-verified the email). */
12396
- email_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | null;
12562
+ email_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | "sms_otp" | null;
12397
12563
  /** @description ISO 8601 timestamp of when `email_verified` was last flipped to true. */
12398
12564
  email_verified_at?: string | null;
12399
12565
  /** @description ISO 8601 timestamp of the user's last verified email change. When set, OAuth callbacks will not overwrite `email`/`email_verified` from the federated provider — the manually-chosen email wins. */
@@ -12412,8 +12578,8 @@ export interface operations {
12412
12578
  phone?: string | null;
12413
12579
  /** @description phone is verified */
12414
12580
  phone_verified: boolean;
12415
- /** @description How `phone_verified` was last set. Same enum as `email_verified_method`. */
12416
- phone_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | null;
12581
+ /** @description How `phone_verified` was last set. Same enum as `email_verified_method`, plus `sms_otp` — the user typed a code sent by SMS (`POST /user/:id/verify-phone/start`). */
12582
+ phone_verified_method?: "manual" | "verification_flow" | "passwordless_otp" | "team_invite" | "email_change" | "federated" | "sms_otp" | null;
12417
12583
  /** @description ISO 8601 timestamp of when `phone_verified` was last flipped to true. */
12418
12584
  phone_verified_at?: string | null;
12419
12585
  /** @description country iso code */
@@ -13207,6 +13373,8 @@ export interface operations {
13207
13373
  content: {
13208
13374
  "application/json": {
13209
13375
  email: string;
13376
+ /** @description How to deliver the reset: `email` (link), `sms` / `whatsapp` (a 6-digit code to the verified phone on file). Silently falls back to the tenant default when the channel is not available for this user — the response never says which channels an account has. */
13377
+ channel?: "email" | "sms" | "whatsapp" | "factor";
13210
13378
  };
13211
13379
  };
13212
13380
  };
@@ -13270,6 +13438,69 @@ export interface operations {
13270
13438
  };
13271
13439
  };
13272
13440
  };
13441
+ reset_code_verify: {
13442
+ parameters: {
13443
+ query?: never;
13444
+ header?: never;
13445
+ path?: never;
13446
+ cookie?: never;
13447
+ };
13448
+ requestBody: {
13449
+ content: {
13450
+ "application/json": {
13451
+ email: string;
13452
+ code: string;
13453
+ };
13454
+ };
13455
+ };
13456
+ responses: {
13457
+ /** @description Default Response */
13458
+ 200: {
13459
+ headers: {
13460
+ [name: string]: unknown;
13461
+ };
13462
+ content: {
13463
+ "application/json": {
13464
+ redirect_url: string;
13465
+ };
13466
+ };
13467
+ };
13468
+ };
13469
+ };
13470
+ recovery_options: {
13471
+ parameters: {
13472
+ query?: never;
13473
+ header?: never;
13474
+ path?: never;
13475
+ cookie?: never;
13476
+ };
13477
+ requestBody: {
13478
+ content: {
13479
+ "application/json": {
13480
+ email: string;
13481
+ };
13482
+ };
13483
+ };
13484
+ responses: {
13485
+ /** @description Default Response */
13486
+ 200: {
13487
+ headers: {
13488
+ [name: string]: unknown;
13489
+ };
13490
+ content: {
13491
+ "application/json": {
13492
+ /** @description Whether the screen should offer a choice. False when the tenant keeps `visible` empty — then nothing here depends on the account existing. */
13493
+ picker: boolean;
13494
+ default: "email" | "sms" | "whatsapp" | "factor";
13495
+ channels: {
13496
+ channel: "email" | "sms" | "whatsapp" | "factor";
13497
+ destination_masked?: string;
13498
+ }[];
13499
+ };
13500
+ };
13501
+ };
13502
+ };
13503
+ };
13273
13504
  signup: {
13274
13505
  parameters: {
13275
13506
  query?: never;
package/dist/version.js CHANGED
@@ -9,13 +9,13 @@
9
9
  // login pages could not import the SDK at all. Same pattern as auth-js.
10
10
  //
11
11
  // The sentinels MUST stay byte-identical to the `from` values in `.releaserc`.
12
- export const version = "2.6.15";
12
+ export const version = "2.6.17";
13
13
  // Short git SHA of the released commit. The version dates a build; this names
14
14
  // the exact tree, so a canonical log line or an audit entry leads straight to
15
15
  // `git show <sha>`. Deliberately NOT hex: an unreleased build (dev, a local
16
16
  // link) cannot be mistaken for a real commit — auth only records values that
17
17
  // look like a SHA, and this one never will.
18
- export const commit = "1f0c0e0";
18
+ export const commit = "bcc574e";
19
19
  // What this SDK writes in `x-faable-client`. Exported for a consumer that
20
20
  // builds a strategy on its own (outside `FaableAuthApi`) and still wants the
21
21
  // token request attributed — a bare `authClientCredentials` stamps only what
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faable/auth-sdk",
3
- "version": "2.6.15",
3
+ "version": "2.6.17",
4
4
  "author": "Marc Pomar <marc@faable.com>",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",