@lepsto/sdk-app 91.0.1 → 92.1.0

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.
@@ -67057,13 +67057,38 @@ source_authority?: ("policy" | "official" | "team" | "informal")
67057
67057
 
67058
67058
  export interface BrainMemoryAddOutput {
67059
67059
  /**
67060
- * True when the memory was stored
67060
+ * True when the memory was stored and its facts extracted (or there was nothing to extract). False when extraction failed — the raw memory is still stored under memory_id — or when the memory was not stored at all
67061
67061
  */
67062
67062
  success: boolean
67063
67063
  /**
67064
67064
  * Engine id of the memory just stored; keep it to read, replace or delete the memory later
67065
67065
  */
67066
67066
  memory_id: string
67067
+ /**
67068
+ * Present only when success is false. Tell stored from not stored by `extraction`, not by this code: with extraction.status 'failed' the raw memory IS stored and searchable under memory_id, only its facts are missing — do not re-add the same content, that stores a duplicate. With no `extraction` nothing was stored, and the add can be retried
67069
+ */
67070
+ error_code?: string
67071
+ /**
67072
+ * What fact extraction made of this memory
67073
+ */
67074
+ extraction?: {
67075
+ /**
67076
+ * How many memories extraction stored from this write, across every derived layer (facts, identity, profile, summaries) — not a count of facts alone
67077
+ */
67078
+ items: number
67079
+ /**
67080
+ * ok = at least one memory was derived from it (a summary counts, so ok alone does not promise a fact); empty = nothing new came out of it — the content held nothing durable, or everything in it is already in memory; failed = extraction broke, the raw memory is stored without facts; skipped = the engine does not extract in this mode
67081
+ */
67082
+ status: ("ok" | "empty" | "failed" | "skipped")
67083
+ /**
67084
+ * The engine's code when extraction failed — or, with status ok, when it ran degraded but still stored its facts
67085
+ */
67086
+ error_code?: string
67087
+ /**
67088
+ * The engine's own words for that failure or degradation — quote it when reporting a problem
67089
+ */
67090
+ error_message?: string
67091
+ }
67067
67092
  /**
67068
67093
  * Engine request id for this call — quote it when reporting a problem
67069
67094
  */
@@ -67417,6 +67442,23 @@ knowledge: {
67417
67442
  */
67418
67443
  entityCount: number
67419
67444
  }
67445
+ /**
67446
+ * Raw memories left without facts, for the caller's product and scope. Counts only, and a lower bound. Null when the engine could not compute it
67447
+ */
67448
+ extraction_gaps: ({
67449
+ /**
67450
+ * Raw memories (l1_raw) the scope holds
67451
+ */
67452
+ raw_total: number
67453
+ /**
67454
+ * Raw memories no derived memory (fact, identity) points back to — their extraction produced nothing
67455
+ */
67456
+ raw_without_derived: number
67457
+ /**
67458
+ * Of those, raw memories still in shadow status
67459
+ */
67460
+ shadow_without_derived: number
67461
+ } | null)
67420
67462
  }
67421
67463
 
67422
67464
  export interface BrainMemoryUpdateInput {
@@ -115427,9 +115469,9 @@ export interface UsersApikeysCreateInput {
115427
115469
  */
115428
115470
  name: string
115429
115471
  /**
115430
- * 'server' mints a SECRET key (usk_…) for the Product's backend returned exactly once and stored hashed. 'publishable' mints a non-secret key (upk_…) that identifies this product in browser flows and stays readable.
115472
+ * 'publishable' mints a non-secret key (upk_…) that identifies this product in browser flows and stays readable. It is the only key type: the secret server key (usk_…) is retired.
115431
115473
  */
115432
- type: ("server" | "publishable")
115474
+ type: "publishable"
115433
115475
  }
115434
115476
 
115435
115477
  export interface UsersApikeysCreateOutput {
@@ -115446,15 +115488,15 @@ key: string
115446
115488
  */
115447
115489
  name: string
115448
115490
  /**
115449
- * `server` for a secret backend key (usk_…), `publishable` for a browser-safe one (upk_…).
115491
+ * `publishable` a browser-safe key (upk_…). It is the only type.
115450
115492
  */
115451
- type: ("server" | "publishable")
115493
+ type: "publishable"
115452
115494
  /**
115453
- * The full value of a publishable key, which is not a secret. Null for a server key — that value exists in exactly one response, ever.
115495
+ * The full value of the key, which is not a secret and stays readable.
115454
115496
  */
115455
115497
  value: (string | null)
115456
115498
  /**
115457
- * `usk_`/`upk_` plus six characters — enough to recognise a key, never to use one.
115499
+ * `upk_` plus six characters — enough to recognise a key, never to use one.
115458
115500
  */
115459
115501
  prefix: string
115460
115502
  /**
@@ -115484,15 +115526,15 @@ id: string
115484
115526
  */
115485
115527
  name: string
115486
115528
  /**
115487
- * `server` for a secret backend key (usk_…), `publishable` for a browser-safe one (upk_…).
115529
+ * `publishable` a browser-safe key (upk_…). It is the only type.
115488
115530
  */
115489
- type: ("server" | "publishable")
115531
+ type: "publishable"
115490
115532
  /**
115491
- * The full value of a publishable key, which is not a secret. Null for a server key — that value exists in exactly one response, ever.
115533
+ * The full value of the key, which is not a secret and stays readable.
115492
115534
  */
115493
115535
  value: (string | null)
115494
115536
  /**
115495
- * `usk_`/`upk_` plus six characters — enough to recognise a key, never to use one.
115537
+ * `upk_` plus six characters — enough to recognise a key, never to use one.
115496
115538
  */
115497
115539
  prefix: string
115498
115540
  /**
@@ -115520,15 +115562,15 @@ id: string
115520
115562
  */
115521
115563
  name: string
115522
115564
  /**
115523
- * `server` for a secret backend key (usk_…), `publishable` for a browser-safe one (upk_…).
115565
+ * `publishable` a browser-safe key (upk_…). It is the only type.
115524
115566
  */
115525
- type: ("server" | "publishable")
115567
+ type: "publishable"
115526
115568
  /**
115527
- * The full value of a publishable key, which is not a secret. Null for a server key — that value exists in exactly one response, ever.
115569
+ * The full value of the key, which is not a secret and stays readable.
115528
115570
  */
115529
115571
  value: (string | null)
115530
115572
  /**
115531
- * `usk_`/`upk_` plus six characters — enough to recognise a key, never to use one.
115573
+ * `upk_` plus six characters — enough to recognise a key, never to use one.
115532
115574
  */
115533
115575
  prefix: string
115534
115576
  /**
@@ -115694,7 +115736,7 @@ from: (string | null)
115694
115736
  */
115695
115737
  codeEnabled: boolean
115696
115738
  /**
115697
- * Base URL magic links point at, e.g. "https://public.lessly.com/{productId}/users". Null uses the deployment default.
115739
+ * Base URL magic links point at, e.g. "https://public.lepsto.com/{productId}/users". Null uses the deployment default.
115698
115740
  */
115699
115741
  linkBaseUrl: (string | null)
115700
115742
  /**
@@ -115818,7 +115860,7 @@ successMessage: string
115818
115860
  */
115819
115861
  doubleOptIn: boolean
115820
115862
  /**
115821
- * How long an UNCONVERTED waitlist entry — still pending, or invited and never registered — is kept, counted from SIGN-UP, before the sweep erases it. Default 180: Lessly Privacy Policy §6 promises deletion 6 months from sign-up. The bound stays wide because a client Product answers to its own privacy policy, not ours.
115863
+ * How long an UNCONVERTED waitlist entry — still pending, or invited and never registered — is kept, counted from SIGN-UP, before the sweep erases it. Default 180: Lepsto Privacy Policy §6 promises deletion 6 months from sign-up. The bound stays wide because a client Product answers to its own privacy policy, not ours.
115822
115864
  */
115823
115865
  retentionDays: number
115824
115866
  /**
@@ -115989,7 +116031,7 @@ from?: (string | null)
115989
116031
  */
115990
116032
  codeEnabled?: boolean
115991
116033
  /**
115992
- * Base URL magic links point at, e.g. "https://public.lessly.com/{productId}/users". Null uses the deployment default.
116034
+ * Base URL magic links point at, e.g. "https://public.lepsto.com/{productId}/users". Null uses the deployment default.
115993
116035
  */
115994
116036
  linkBaseUrl?: (string | null)
115995
116037
  /**
@@ -116159,7 +116201,7 @@ successMessage?: string
116159
116201
  */
116160
116202
  doubleOptIn?: boolean
116161
116203
  /**
116162
- * How long an UNCONVERTED waitlist entry — still pending, or invited and never registered — is kept, counted from SIGN-UP, before the sweep erases it. Default 180: Lessly Privacy Policy §6 promises deletion 6 months from sign-up. The bound stays wide because a client Product answers to its own privacy policy, not ours.
116204
+ * How long an UNCONVERTED waitlist entry — still pending, or invited and never registered — is kept, counted from SIGN-UP, before the sweep erases it. Default 180: Lepsto Privacy Policy §6 promises deletion 6 months from sign-up. The bound stays wide because a client Product answers to its own privacy policy, not ours.
116163
116205
  */
116164
116206
  retentionDays?: number
116165
116207
  /**
@@ -116372,7 +116414,7 @@ from: (string | null)
116372
116414
  */
116373
116415
  codeEnabled: boolean
116374
116416
  /**
116375
- * Base URL magic links point at, e.g. "https://public.lessly.com/{productId}/users". Null uses the deployment default.
116417
+ * Base URL magic links point at, e.g. "https://public.lepsto.com/{productId}/users". Null uses the deployment default.
116376
116418
  */
116377
116419
  linkBaseUrl: (string | null)
116378
116420
  /**
@@ -116496,7 +116538,7 @@ successMessage: string
116496
116538
  */
116497
116539
  doubleOptIn: boolean
116498
116540
  /**
116499
- * How long an UNCONVERTED waitlist entry — still pending, or invited and never registered — is kept, counted from SIGN-UP, before the sweep erases it. Default 180: Lessly Privacy Policy §6 promises deletion 6 months from sign-up. The bound stays wide because a client Product answers to its own privacy policy, not ours.
116541
+ * How long an UNCONVERTED waitlist entry — still pending, or invited and never registered — is kept, counted from SIGN-UP, before the sweep erases it. Default 180: Lepsto Privacy Policy §6 promises deletion 6 months from sign-up. The bound stays wide because a client Product answers to its own privacy policy, not ours.
116500
116542
  */
116501
116543
  retentionDays: number
116502
116544
  /**
@@ -116841,11 +116883,11 @@ finishedAt: string
116841
116883
  */
116842
116884
  waitlistRetentionDays: number
116843
116885
  /**
116844
- * What Lessly PUBLISHED, in its Privacy Policy §6: a waitlist address that never converted is deleted 6 months from sign-up. It rides along so the window above can be read against the promise it came from, rather than as a number with no provenance.
116886
+ * What Lepsto PUBLISHED, in its Privacy Policy §6: a waitlist address that never converted is deleted 6 months from sign-up. It rides along so the window above can be read against the promise it came from, rather than as a number with no provenance.
116845
116887
  */
116846
116888
  waitlistPromisedMaxDays: number
116847
116889
  /**
116848
- * True when this product configured a window WIDER than the published 180 days. Nothing refuses such a value and nothing clamps it — §6 is Lessly’s own policy and a client Product answers to its own, under which a longer window may be perfectly lawful. This flag exists INSTEAD of that ceiling: a deliberate divergence from what Lessly published must be diagnosable in one call rather than found by comparing two numbers nobody thought to compare.
116890
+ * True when this product configured a window WIDER than the published 180 days. Nothing refuses such a value and nothing clamps it — §6 is Lepsto’s own policy and a client Product answers to its own, under which a longer window may be perfectly lawful. This flag exists INSTEAD of that ceiling: a deliberate divergence from what Lepsto published must be diagnosable in one call rather than found by comparing two numbers nobody thought to compare.
116849
116891
  */
116850
116892
  waitlistWiderThanPromised: boolean
116851
116893
  }
@@ -117306,7 +117348,7 @@ refreshReuseDetected: number
117306
117348
  */
117307
117349
  since: string
117308
117350
  /**
117309
- * Point-in-time directory populations by DERIVED status — `user` has no status column, these are computed from `waitlisted` and the ban/delete/erase timestamps.
117351
+ * Point-in-time directory populations by DERIVED status — `user` has no status column, these are computed from `kind`, `waitlisted` and the ban/delete/erase timestamps.
117310
117352
  */
117311
117353
  users: {
117312
117354
  /**
@@ -117314,7 +117356,7 @@ users: {
117314
117356
  */
117315
117357
  total: number
117316
117358
  /**
117317
- * Full accounts: not waitlisted, not banned, not deleted, not erased.
117359
+ * Full accounts: kind 'account', not waitlisted, not banned, not deleted, not erased.
117318
117360
  */
117319
117361
  active: number
117320
117362
  /**
@@ -117329,6 +117371,10 @@ erased: number
117329
117371
  * SOFT-deleted and still recoverable — not erased.
117330
117372
  */
117331
117373
  deleted: number
117374
+ /**
117375
+ * People the Product knows who have no credential and have never signed in (kind 'contact'), excluding deleted and erased ones. Never part of `active`, and never billed as retained users.
117376
+ */
117377
+ contacts: number
117332
117378
  /**
117333
117379
  * Waitlist signups with no credential yet.
117334
117380
  */
@@ -117383,6 +117429,251 @@ createdInWindow: number
117383
117429
  }
117384
117430
  }
117385
117431
 
117432
+ export interface UsersTouchesCreateInput {
117433
+ /**
117434
+ * What was said or done, free text, 1-8192 characters. Personal data: it is whatever an operator typed about this person.
117435
+ */
117436
+ body: string
117437
+ /**
117438
+ * The end user this interaction was with.
117439
+ */
117440
+ userId: string
117441
+ /**
117442
+ * How the person was touched: 'message', 'call', 'meeting', 'note' (an internal observation nobody sent) or 'email' sent OUTSIDE the platform. Email this toolkit sent is not logged here — read those from the mail toolkit.
117443
+ */
117444
+ channel: ("message" | "call" | "meeting" | "note" | "email")
117445
+ /**
117446
+ * Which way it went: 'outbound' (you reached them), 'inbound' (they reached you) or 'none'. A 'note' or a 'meeting' must be 'none'.
117447
+ */
117448
+ direction: ("outbound" | "inbound" | "none")
117449
+ /**
117450
+ * When it happened (ISO 8601). Omit to mean now — pass it when logging after the fact, which may be any time in the past.
117451
+ */
117452
+ occurredAt?: string
117453
+ }
117454
+
117455
+ export interface UsersTouchesCreateOutput {
117456
+ /**
117457
+ * Id of this touch. Pass it to users_touches_update or _delete.
117458
+ */
117459
+ id: string
117460
+ /**
117461
+ * What was said or done, free text, 1-8192 characters. Personal data: it is whatever an operator typed about this person.
117462
+ */
117463
+ body: string
117464
+ /**
117465
+ * The end user this interaction was with.
117466
+ */
117467
+ userId: string
117468
+ /**
117469
+ * Id of the operator or agent that logged it, verbatim.
117470
+ */
117471
+ actorId: string
117472
+ /**
117473
+ * How the person was touched: 'message', 'call', 'meeting', 'note' (an internal observation nobody sent) or 'email' sent OUTSIDE the platform. Email this toolkit sent is not logged here — read those from the mail toolkit.
117474
+ */
117475
+ channel: ("message" | "call" | "meeting" | "note" | "email")
117476
+ /**
117477
+ * Who logged it: 'operator' (a human) or 'agent' (a workflow or agent principal).
117478
+ */
117479
+ actorType: ("operator" | "agent")
117480
+ /**
117481
+ * When the touch was logged (ISO 8601).
117482
+ */
117483
+ createdAt: string
117484
+ /**
117485
+ * Which way it went: 'outbound' (you reached them), 'inbound' (they reached you) or 'none'. A 'note' or a 'meeting' must be 'none'.
117486
+ */
117487
+ direction: ("outbound" | "inbound" | "none")
117488
+ /**
117489
+ * Product this touch belongs to. Never an input — it comes from the calling identity.
117490
+ */
117491
+ productId: string
117492
+ /**
117493
+ * When the touch was last edited (ISO 8601).
117494
+ */
117495
+ updatedAt: string
117496
+ /**
117497
+ * When the interaction happened (ISO 8601) — not when it was logged.
117498
+ */
117499
+ occurredAt: string
117500
+ }
117501
+
117502
+ export interface UsersTouchesDiscardInput {
117503
+ /**
117504
+ * Act on a touch somebody else logged. Without it a touch you did not author answers 404, exactly as a touch that does not exist does — the refusal must not tell you the row is there. Every forced call is recorded in the audit trail.
117505
+ */
117506
+ force?: boolean
117507
+ /**
117508
+ * The end user the touch belongs to.
117509
+ */
117510
+ userId: string
117511
+ /**
117512
+ * The touch to delete, from users_touches_list.
117513
+ */
117514
+ touchId: string
117515
+ }
117516
+
117517
+ export interface UsersTouchesDiscardOutput {
117518
+ /**
117519
+ * Id of the touch that was deleted.
117520
+ */
117521
+ id: string
117522
+ /**
117523
+ * The end user it belonged to.
117524
+ */
117525
+ userId: string
117526
+ /**
117527
+ * Always true — a failure answers 404 instead.
117528
+ */
117529
+ deleted: true
117530
+ }
117531
+
117532
+ export interface UsersTouchesListInput {
117533
+ /**
117534
+ * Page size, 1-100. Default 50.
117535
+ */
117536
+ limit?: number
117537
+ /**
117538
+ * Opaque cursor from a previous response's `nextCursor`. Omit for the first page.
117539
+ */
117540
+ cursor?: string
117541
+ /**
117542
+ * The end user whose touches to list.
117543
+ */
117544
+ userId: string
117545
+ /**
117546
+ * Only touches on this channel. Omit for all of them.
117547
+ */
117548
+ channel?: ("message" | "call" | "meeting" | "note" | "email")
117549
+ }
117550
+
117551
+ export interface UsersTouchesListOutput {
117552
+ /**
117553
+ * The page of touches, newest first.
117554
+ */
117555
+ items: {
117556
+ /**
117557
+ * Id of this touch. Pass it to users_touches_update or _delete.
117558
+ */
117559
+ id: string
117560
+ /**
117561
+ * What was said or done, free text, 1-8192 characters. Personal data: it is whatever an operator typed about this person.
117562
+ */
117563
+ body: string
117564
+ /**
117565
+ * The end user this interaction was with.
117566
+ */
117567
+ userId: string
117568
+ /**
117569
+ * Id of the operator or agent that logged it, verbatim.
117570
+ */
117571
+ actorId: string
117572
+ /**
117573
+ * How the person was touched: 'message', 'call', 'meeting', 'note' (an internal observation nobody sent) or 'email' sent OUTSIDE the platform. Email this toolkit sent is not logged here — read those from the mail toolkit.
117574
+ */
117575
+ channel: ("message" | "call" | "meeting" | "note" | "email")
117576
+ /**
117577
+ * Who logged it: 'operator' (a human) or 'agent' (a workflow or agent principal).
117578
+ */
117579
+ actorType: ("operator" | "agent")
117580
+ /**
117581
+ * When the touch was logged (ISO 8601).
117582
+ */
117583
+ createdAt: string
117584
+ /**
117585
+ * Which way it went: 'outbound' (you reached them), 'inbound' (they reached you) or 'none'. A 'note' or a 'meeting' must be 'none'.
117586
+ */
117587
+ direction: ("outbound" | "inbound" | "none")
117588
+ /**
117589
+ * Product this touch belongs to. Never an input — it comes from the calling identity.
117590
+ */
117591
+ productId: string
117592
+ /**
117593
+ * When the touch was last edited (ISO 8601).
117594
+ */
117595
+ updatedAt: string
117596
+ /**
117597
+ * When the interaction happened (ISO 8601) — not when it was logged.
117598
+ */
117599
+ occurredAt: string
117600
+ }[]
117601
+ /**
117602
+ * Pass as `cursor` for the next page. Null when this was the last one.
117603
+ */
117604
+ nextCursor: (string | null)
117605
+ }
117606
+
117607
+ export interface UsersTouchesUpdateInput {
117608
+ /**
117609
+ * Replacement text, 1-8192 characters. Omit to leave it unchanged.
117610
+ */
117611
+ body?: string
117612
+ /**
117613
+ * Act on a touch somebody else logged. Without it a touch you did not author answers 404, exactly as a touch that does not exist does — the refusal must not tell you the row is there. Every forced call is recorded in the audit trail.
117614
+ */
117615
+ force?: boolean
117616
+ /**
117617
+ * The end user the touch belongs to.
117618
+ */
117619
+ userId: string
117620
+ /**
117621
+ * The touch to edit, from users_touches_list.
117622
+ */
117623
+ touchId: string
117624
+ /**
117625
+ * Correct when it happened (ISO 8601). Omit to leave it unchanged.
117626
+ */
117627
+ occurredAt?: string
117628
+ }
117629
+
117630
+ export interface UsersTouchesUpdateOutput {
117631
+ /**
117632
+ * Id of this touch. Pass it to users_touches_update or _delete.
117633
+ */
117634
+ id: string
117635
+ /**
117636
+ * What was said or done, free text, 1-8192 characters. Personal data: it is whatever an operator typed about this person.
117637
+ */
117638
+ body: string
117639
+ /**
117640
+ * The end user this interaction was with.
117641
+ */
117642
+ userId: string
117643
+ /**
117644
+ * Id of the operator or agent that logged it, verbatim.
117645
+ */
117646
+ actorId: string
117647
+ /**
117648
+ * How the person was touched: 'message', 'call', 'meeting', 'note' (an internal observation nobody sent) or 'email' sent OUTSIDE the platform. Email this toolkit sent is not logged here — read those from the mail toolkit.
117649
+ */
117650
+ channel: ("message" | "call" | "meeting" | "note" | "email")
117651
+ /**
117652
+ * Who logged it: 'operator' (a human) or 'agent' (a workflow or agent principal).
117653
+ */
117654
+ actorType: ("operator" | "agent")
117655
+ /**
117656
+ * When the touch was logged (ISO 8601).
117657
+ */
117658
+ createdAt: string
117659
+ /**
117660
+ * Which way it went: 'outbound' (you reached them), 'inbound' (they reached you) or 'none'. A 'note' or a 'meeting' must be 'none'.
117661
+ */
117662
+ direction: ("outbound" | "inbound" | "none")
117663
+ /**
117664
+ * Product this touch belongs to. Never an input — it comes from the calling identity.
117665
+ */
117666
+ productId: string
117667
+ /**
117668
+ * When the touch was last edited (ISO 8601).
117669
+ */
117670
+ updatedAt: string
117671
+ /**
117672
+ * When the interaction happened (ISO 8601) — not when it was logged.
117673
+ */
117674
+ occurredAt: string
117675
+ }
117676
+
117386
117677
  export interface UsersUsersBanInput {
117387
117678
  /**
117388
117679
  * The opaque user id returned by users_users_create or _list.
@@ -117395,10 +117686,22 @@ export interface UsersUsersBanOutput {
117395
117686
  * Id of this end user. Pass it to any users_users_* tool.
117396
117687
  */
117397
117688
  id: string
117689
+ /**
117690
+ * What kind of person this row is: 'account' (can sign in) or 'contact' (known to the Product, no credential, never signed in). A contact is hidden from the default users_users_list view and is never counted as a retained user.
117691
+ */
117692
+ kind: ("account" | "contact")
117398
117693
  /**
117399
117694
  * The user's display name. Null when nobody set one.
117400
117695
  */
117401
117696
  name: (string | null)
117697
+ /**
117698
+ * Free labels on this person, stored trimmed, lowercased and de-duplicated.
117699
+ */
117700
+ tags: string[]
117701
+ /**
117702
+ * The relationship stage, in funnel order: new, contacted, replied, engaged, converted, lost. A real change publishes `users/user.stage-changed`.
117703
+ */
117704
+ stage: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost")
117402
117705
  /**
117403
117706
  * When the user was banned (ISO 8601). Null while they are not banned.
117404
117707
  */
@@ -117431,6 +117734,10 @@ productId: string
117431
117734
  * When the user was last changed (ISO 8601).
117432
117735
  */
117433
117736
  updatedAt: string
117737
+ /**
117738
+ * Set when you asked for an id that was merged into this account — it is the id you asked for, and this is the row it now lives in. Null on every ordinary read.
117739
+ */
117740
+ mergedFrom: (string | null)
117434
117741
  /**
117435
117742
  * Whether this user is still on the waitlist and cannot sign in yet.
117436
117743
  */
@@ -117444,9 +117751,9 @@ identifiers: {
117444
117751
  */
117445
117752
  id: string
117446
117753
  /**
117447
- * What kind of identifier this is. Today always `email`.
117754
+ * What kind of identifier this is: `email`, `phone`, `telegram`, `linkedin` or `x`. Only `email` can be signed in with — the other four are contact channels, reachable but never part of the auth plane.
117448
117755
  */
117449
- type: "email"
117756
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x")
117450
117757
  /**
117451
117758
  * The address as the user typed it, for display.
117452
117759
  */
@@ -117468,6 +117775,10 @@ valueCanonical: string
117468
117775
  */
117469
117776
  verificationStatus: ("unverified" | "verified" | "expired")
117470
117777
  }[]
117778
+ /**
117779
+ * When this person was last touched — the most recent logged interaction (ISO 8601). Null when nobody has logged one. This is when the interaction HAPPENED, not when it was logged.
117780
+ */
117781
+ lastTouchAt: (string | null)
117471
117782
  /**
117472
117783
  * When a failed-attempt lockout expires (ISO 8601). Null when the user is not locked out.
117473
117784
  */
@@ -117502,6 +117813,10 @@ unsafeMetadata: {
117502
117813
  privateMetadata: {
117503
117814
  [k: string]: unknown
117504
117815
  }
117816
+ /**
117817
+ * The user this person was merged INTO, when they were merged. Null for everybody else — follow it to find where their records went.
117818
+ */
117819
+ mergedIntoUserId: (string | null)
117505
117820
  /**
117506
117821
  * Id of the primary identifier row. Null when there is no primary identifier.
117507
117822
  */
@@ -117513,10 +117828,22 @@ emailChangeLockedUntil: (string | null)
117513
117828
  }
117514
117829
 
117515
117830
  export interface UsersUsersCreateInput {
117831
+ /**
117832
+ * What kind of person to create. 'account' (the default) can sign in. 'contact' is somebody the Product knows who has NO credential — a contact may not carry `password`, `waitlisted` or `requiresReset` (`contact_cannot_hold_credentials`), is hidden from the default users_users_list view, and is never counted as a retained user. A contact becomes an account only by proving an address, never by an operator setting this.
117833
+ */
117834
+ kind?: ("account" | "contact")
117516
117835
  /**
117517
117836
  * The user's display name.
117518
117837
  */
117519
117838
  name?: string
117839
+ /**
117840
+ * Free labels for this person. Trimmed, lowercased and de-duplicated on write; at most 32 of at most 64 characters each.
117841
+ */
117842
+ tags?: string[]
117843
+ /**
117844
+ * The relationship stage to start them at, in funnel order: new, contacted, replied, engaged, converted, lost. Default 'new'.
117845
+ */
117846
+ stage?: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost")
117520
117847
  /**
117521
117848
  * URL of the user's avatar image.
117522
117849
  */
@@ -117547,7 +117874,7 @@ testUser?: boolean
117547
117874
  */
117548
117875
  waitlisted?: boolean
117549
117876
  /**
117550
- * The email addresses that reach this user. At least one is required.
117877
+ * How this user is reached: their email addresses, plus any contact channels (`phone`, `telegram`, `linkedin`, `x`). At least one is required.
117551
117878
  *
117552
117879
  * @minItems 1
117553
117880
  */
@@ -117555,13 +117882,13 @@ identifiers: [{
117555
117882
  /**
117556
117883
  * Identifier kind. Only 'email' exists in this phase.
117557
117884
  */
117558
- type: "email"
117885
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x")
117559
117886
  /**
117560
117887
  * The email address. Stored canonicalised (lowercase, NFC) plus raw for display.
117561
117888
  */
117562
117889
  value: string
117563
117890
  /**
117564
- * Record the identifier as already verified (use for trusted imports). Only ONE verified copy of a value may exist per product; unverified duplicates are allowed. Default false.
117891
+ * Record the identifier as already verified (use for trusted imports). IGNORED for contact channels, which are always stored unverified — nothing here can prove a phone or a handle. Only ONE verified copy of an email may exist per product; unverified duplicates are allowed. Default false.
117565
117892
  */
117566
117893
  verified?: boolean
117567
117894
  /**
@@ -117572,13 +117899,13 @@ isPrimary?: boolean
117572
117899
  /**
117573
117900
  * Identifier kind. Only 'email' exists in this phase.
117574
117901
  */
117575
- type: "email"
117902
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x")
117576
117903
  /**
117577
117904
  * The email address. Stored canonicalised (lowercase, NFC) plus raw for display.
117578
117905
  */
117579
117906
  value: string
117580
117907
  /**
117581
- * Record the identifier as already verified (use for trusted imports). Only ONE verified copy of a value may exist per product; unverified duplicates are allowed. Default false.
117908
+ * Record the identifier as already verified (use for trusted imports). IGNORED for contact channels, which are always stored unverified — nothing here can prove a phone or a handle. Only ONE verified copy of an email may exist per product; unverified duplicates are allowed. Default false.
117582
117909
  */
117583
117910
  verified?: boolean
117584
117911
  /**
@@ -117617,10 +117944,22 @@ export interface UsersUsersCreateOutput {
117617
117944
  * Id of this end user. Pass it to any users_users_* tool.
117618
117945
  */
117619
117946
  id: string
117947
+ /**
117948
+ * What kind of person this row is: 'account' (can sign in) or 'contact' (known to the Product, no credential, never signed in). A contact is hidden from the default users_users_list view and is never counted as a retained user.
117949
+ */
117950
+ kind: ("account" | "contact")
117620
117951
  /**
117621
117952
  * The user's display name. Null when nobody set one.
117622
117953
  */
117623
117954
  name: (string | null)
117955
+ /**
117956
+ * Free labels on this person, stored trimmed, lowercased and de-duplicated.
117957
+ */
117958
+ tags: string[]
117959
+ /**
117960
+ * The relationship stage, in funnel order: new, contacted, replied, engaged, converted, lost. A real change publishes `users/user.stage-changed`.
117961
+ */
117962
+ stage: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost")
117624
117963
  /**
117625
117964
  * When the user was banned (ISO 8601). Null while they are not banned.
117626
117965
  */
@@ -117653,6 +117992,10 @@ productId: string
117653
117992
  * When the user was last changed (ISO 8601).
117654
117993
  */
117655
117994
  updatedAt: string
117995
+ /**
117996
+ * Set when you asked for an id that was merged into this account — it is the id you asked for, and this is the row it now lives in. Null on every ordinary read.
117997
+ */
117998
+ mergedFrom: (string | null)
117656
117999
  /**
117657
118000
  * Whether this user is still on the waitlist and cannot sign in yet.
117658
118001
  */
@@ -117666,9 +118009,9 @@ identifiers: {
117666
118009
  */
117667
118010
  id: string
117668
118011
  /**
117669
- * What kind of identifier this is. Today always `email`.
118012
+ * What kind of identifier this is: `email`, `phone`, `telegram`, `linkedin` or `x`. Only `email` can be signed in with — the other four are contact channels, reachable but never part of the auth plane.
117670
118013
  */
117671
- type: "email"
118014
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x")
117672
118015
  /**
117673
118016
  * The address as the user typed it, for display.
117674
118017
  */
@@ -117690,6 +118033,10 @@ valueCanonical: string
117690
118033
  */
117691
118034
  verificationStatus: ("unverified" | "verified" | "expired")
117692
118035
  }[]
118036
+ /**
118037
+ * When this person was last touched — the most recent logged interaction (ISO 8601). Null when nobody has logged one. This is when the interaction HAPPENED, not when it was logged.
118038
+ */
118039
+ lastTouchAt: (string | null)
117693
118040
  /**
117694
118041
  * When a failed-attempt lockout expires (ISO 8601). Null when the user is not locked out.
117695
118042
  */
@@ -117724,6 +118071,10 @@ unsafeMetadata: {
117724
118071
  privateMetadata: {
117725
118072
  [k: string]: unknown
117726
118073
  }
118074
+ /**
118075
+ * The user this person was merged INTO, when they were merged. Null for everybody else — follow it to find where their records went.
118076
+ */
118077
+ mergedIntoUserId: (string | null)
117727
118078
  /**
117728
118079
  * Id of the primary identifier row. Null when there is no primary identifier.
117729
118080
  */
@@ -117746,10 +118097,22 @@ export interface UsersUsersDeleteOutput {
117746
118097
  * Id of this end user. Pass it to any users_users_* tool.
117747
118098
  */
117748
118099
  id: string
118100
+ /**
118101
+ * What kind of person this row is: 'account' (can sign in) or 'contact' (known to the Product, no credential, never signed in). A contact is hidden from the default users_users_list view and is never counted as a retained user.
118102
+ */
118103
+ kind: ("account" | "contact")
117749
118104
  /**
117750
118105
  * The user's display name. Null when nobody set one.
117751
118106
  */
117752
118107
  name: (string | null)
118108
+ /**
118109
+ * Free labels on this person, stored trimmed, lowercased and de-duplicated.
118110
+ */
118111
+ tags: string[]
118112
+ /**
118113
+ * The relationship stage, in funnel order: new, contacted, replied, engaged, converted, lost. A real change publishes `users/user.stage-changed`.
118114
+ */
118115
+ stage: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost")
117753
118116
  /**
117754
118117
  * When the user was banned (ISO 8601). Null while they are not banned.
117755
118118
  */
@@ -117782,6 +118145,10 @@ productId: string
117782
118145
  * When the user was last changed (ISO 8601).
117783
118146
  */
117784
118147
  updatedAt: string
118148
+ /**
118149
+ * Set when you asked for an id that was merged into this account — it is the id you asked for, and this is the row it now lives in. Null on every ordinary read.
118150
+ */
118151
+ mergedFrom: (string | null)
117785
118152
  /**
117786
118153
  * Whether this user is still on the waitlist and cannot sign in yet.
117787
118154
  */
@@ -117795,9 +118162,9 @@ identifiers: {
117795
118162
  */
117796
118163
  id: string
117797
118164
  /**
117798
- * What kind of identifier this is. Today always `email`.
118165
+ * What kind of identifier this is: `email`, `phone`, `telegram`, `linkedin` or `x`. Only `email` can be signed in with — the other four are contact channels, reachable but never part of the auth plane.
117799
118166
  */
117800
- type: "email"
118167
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x")
117801
118168
  /**
117802
118169
  * The address as the user typed it, for display.
117803
118170
  */
@@ -117819,6 +118186,10 @@ valueCanonical: string
117819
118186
  */
117820
118187
  verificationStatus: ("unverified" | "verified" | "expired")
117821
118188
  }[]
118189
+ /**
118190
+ * When this person was last touched — the most recent logged interaction (ISO 8601). Null when nobody has logged one. This is when the interaction HAPPENED, not when it was logged.
118191
+ */
118192
+ lastTouchAt: (string | null)
117822
118193
  /**
117823
118194
  * When a failed-attempt lockout expires (ISO 8601). Null when the user is not locked out.
117824
118195
  */
@@ -117853,6 +118224,10 @@ unsafeMetadata: {
117853
118224
  privateMetadata: {
117854
118225
  [k: string]: unknown
117855
118226
  }
118227
+ /**
118228
+ * The user this person was merged INTO, when they were merged. Null for everybody else — follow it to find where their records went.
118229
+ */
118230
+ mergedIntoUserId: (string | null)
117856
118231
  /**
117857
118232
  * Id of the primary identifier row. Null when there is no primary identifier.
117858
118233
  */
@@ -117864,6 +118239,10 @@ emailChangeLockedUntil: (string | null)
117864
118239
  }
117865
118240
 
117866
118241
  export interface UsersUsersExportInput {
118242
+ /**
118243
+ * Filter by kind: 'account' or 'contact'. Omit for accounts only, unless `includeContacts` is true.
118244
+ */
118245
+ kind?: ("account" | "contact")
117867
118246
  /**
117868
118247
  * Rows per page, 1-500. Default 100.
117869
118248
  */
@@ -117884,6 +118263,10 @@ status?: ("active" | "banned" | "waitlisted")
117884
118263
  * Include soft-deleted users. Default false.
117885
118264
  */
117886
118265
  includeDeleted?: boolean
118266
+ /**
118267
+ * Include CONTACTS alongside accounts, so one pass exports both. Default false — the same rule this export already applies to waitlist signups and test users.
118268
+ */
118269
+ includeContacts?: boolean
117887
118270
  }
117888
118271
 
117889
118272
  export interface UsersUsersExportOutput {
@@ -117893,10 +118276,22 @@ users: {
117893
118276
  * Id of this end user. Pass it to any users_users_* tool.
117894
118277
  */
117895
118278
  id: string
118279
+ /**
118280
+ * What kind of person this row is: 'account' (can sign in) or 'contact' (known to the Product, no credential, never signed in). A contact is hidden from the default users_users_list view and is never counted as a retained user.
118281
+ */
118282
+ kind: ("account" | "contact")
117896
118283
  /**
117897
118284
  * The user's display name. Null when nobody set one.
117898
118285
  */
117899
118286
  name: (string | null)
118287
+ /**
118288
+ * Free labels on this person, stored trimmed, lowercased and de-duplicated.
118289
+ */
118290
+ tags: string[]
118291
+ /**
118292
+ * The relationship stage, in funnel order: new, contacted, replied, engaged, converted, lost. A real change publishes `users/user.stage-changed`.
118293
+ */
118294
+ stage: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost")
117900
118295
  /**
117901
118296
  * When the user was banned (ISO 8601). Null while they are not banned.
117902
118297
  */
@@ -117929,6 +118324,10 @@ productId: string
117929
118324
  * When the user was last changed (ISO 8601).
117930
118325
  */
117931
118326
  updatedAt: string
118327
+ /**
118328
+ * Set when you asked for an id that was merged into this account — it is the id you asked for, and this is the row it now lives in. Null on every ordinary read.
118329
+ */
118330
+ mergedFrom: (string | null)
117932
118331
  /**
117933
118332
  * Whether this user is still on the waitlist and cannot sign in yet.
117934
118333
  */
@@ -117942,9 +118341,9 @@ identifiers: {
117942
118341
  */
117943
118342
  id: string
117944
118343
  /**
117945
- * What kind of identifier this is. Today always `email`.
118344
+ * What kind of identifier this is: `email`, `phone`, `telegram`, `linkedin` or `x`. Only `email` can be signed in with — the other four are contact channels, reachable but never part of the auth plane.
117946
118345
  */
117947
- type: "email"
118346
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x")
117948
118347
  /**
117949
118348
  * The address as the user typed it, for display.
117950
118349
  */
@@ -117966,6 +118365,10 @@ valueCanonical: string
117966
118365
  */
117967
118366
  verificationStatus: ("unverified" | "verified" | "expired")
117968
118367
  }[]
118368
+ /**
118369
+ * When this person was last touched — the most recent logged interaction (ISO 8601). Null when nobody has logged one. This is when the interaction HAPPENED, not when it was logged.
118370
+ */
118371
+ lastTouchAt: (string | null)
117969
118372
  /**
117970
118373
  * When a failed-attempt lockout expires (ISO 8601). Null when the user is not locked out.
117971
118374
  */
@@ -118000,6 +118403,10 @@ unsafeMetadata: {
118000
118403
  privateMetadata: {
118001
118404
  [k: string]: unknown
118002
118405
  }
118406
+ /**
118407
+ * The user this person was merged INTO, when they were merged. Null for everybody else — follow it to find where their records went.
118408
+ */
118409
+ mergedIntoUserId: (string | null)
118003
118410
  /**
118004
118411
  * Id of the primary identifier row. Null when there is no primary identifier.
118005
118412
  */
@@ -118025,10 +118432,22 @@ export interface UsersUsersGetOutput {
118025
118432
  * Id of this end user. Pass it to any users_users_* tool.
118026
118433
  */
118027
118434
  id: string
118435
+ /**
118436
+ * What kind of person this row is: 'account' (can sign in) or 'contact' (known to the Product, no credential, never signed in). A contact is hidden from the default users_users_list view and is never counted as a retained user.
118437
+ */
118438
+ kind: ("account" | "contact")
118028
118439
  /**
118029
118440
  * The user's display name. Null when nobody set one.
118030
118441
  */
118031
118442
  name: (string | null)
118443
+ /**
118444
+ * Free labels on this person, stored trimmed, lowercased and de-duplicated.
118445
+ */
118446
+ tags: string[]
118447
+ /**
118448
+ * The relationship stage, in funnel order: new, contacted, replied, engaged, converted, lost. A real change publishes `users/user.stage-changed`.
118449
+ */
118450
+ stage: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost")
118032
118451
  /**
118033
118452
  * When the user was banned (ISO 8601). Null while they are not banned.
118034
118453
  */
@@ -118061,6 +118480,10 @@ productId: string
118061
118480
  * When the user was last changed (ISO 8601).
118062
118481
  */
118063
118482
  updatedAt: string
118483
+ /**
118484
+ * Set when you asked for an id that was merged into this account — it is the id you asked for, and this is the row it now lives in. Null on every ordinary read.
118485
+ */
118486
+ mergedFrom: (string | null)
118064
118487
  /**
118065
118488
  * Whether this user is still on the waitlist and cannot sign in yet.
118066
118489
  */
@@ -118074,9 +118497,9 @@ identifiers: {
118074
118497
  */
118075
118498
  id: string
118076
118499
  /**
118077
- * What kind of identifier this is. Today always `email`.
118500
+ * What kind of identifier this is: `email`, `phone`, `telegram`, `linkedin` or `x`. Only `email` can be signed in with — the other four are contact channels, reachable but never part of the auth plane.
118078
118501
  */
118079
- type: "email"
118502
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x")
118080
118503
  /**
118081
118504
  * The address as the user typed it, for display.
118082
118505
  */
@@ -118098,6 +118521,10 @@ valueCanonical: string
118098
118521
  */
118099
118522
  verificationStatus: ("unverified" | "verified" | "expired")
118100
118523
  }[]
118524
+ /**
118525
+ * When this person was last touched — the most recent logged interaction (ISO 8601). Null when nobody has logged one. This is when the interaction HAPPENED, not when it was logged.
118526
+ */
118527
+ lastTouchAt: (string | null)
118101
118528
  /**
118102
118529
  * When a failed-attempt lockout expires (ISO 8601). Null when the user is not locked out.
118103
118530
  */
@@ -118132,6 +118559,10 @@ unsafeMetadata: {
118132
118559
  privateMetadata: {
118133
118560
  [k: string]: unknown
118134
118561
  }
118562
+ /**
118563
+ * The user this person was merged INTO, when they were merged. Null for everybody else — follow it to find where their records went.
118564
+ */
118565
+ mergedIntoUserId: (string | null)
118135
118566
  /**
118136
118567
  * Id of the primary identifier row. Null when there is no primary identifier.
118137
118568
  */
@@ -118186,6 +118617,10 @@ userId: (string | null)
118186
118617
  * How many rows were passed over — an address already in the directory, typically.
118187
118618
  */
118188
118619
  skipped: number
118620
+ /**
118621
+ * How many of the CREATED users were contacts (`kind: 'contact'`). A row that was skipped or failed is not counted.
118622
+ */
118623
+ contacts: number
118189
118624
  /**
118190
118625
  * How many rows you submitted.
118191
118626
  */
@@ -118235,6 +118670,14 @@ expiresAt: string
118235
118670
  }
118236
118671
 
118237
118672
  export interface UsersUsersListInput {
118673
+ /**
118674
+ * Return only people carrying this tag. ONE tag, matched against the stored (lowercased) value and ANDed with the other filters.
118675
+ */
118676
+ tag?: string
118677
+ /**
118678
+ * Filter by kind: 'account' or 'contact'. Passing 'contact' is how you list contacts — they are hidden otherwise. Omit for accounts only, unless `includeContacts` is true.
118679
+ */
118680
+ kind?: ("account" | "contact")
118238
118681
  /**
118239
118682
  * Page size, 1-100. Default 25.
118240
118683
  */
@@ -118243,6 +118686,10 @@ limit?: number
118243
118686
  * Case-insensitive substring match against the user's identifiers (email) and name.
118244
118687
  */
118245
118688
  query?: string
118689
+ /**
118690
+ * Filter by relationship stage: new, contacted, replied, engaged, converted or lost. Omit for every stage.
118691
+ */
118692
+ stage?: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost")
118246
118693
  /**
118247
118694
  * Opaque cursor from a previous response's `nextCursor`. Omit for the first page.
118248
118695
  */
@@ -118255,6 +118702,18 @@ status?: ("active" | "banned" | "waitlisted")
118255
118702
  * Include soft-deleted users. Default false — deleted users are hidden.
118256
118703
  */
118257
118704
  includeDeleted?: boolean
118705
+ /**
118706
+ * Only people whose most recent logged interaction happened at or after this instant (ISO 8601). People never touched are EXCLUDED by this filter — list without it to see everyone.
118707
+ */
118708
+ lastTouchAfter?: string
118709
+ /**
118710
+ * Include CONTACTS. Default false: a contact has no credential and has never signed in, so it is not part of the directory an operator browses — the same rule waitlist signups and test users follow. Use `kind: "contact"` to see only them.
118711
+ */
118712
+ includeContacts?: boolean
118713
+ /**
118714
+ * Only people whose most recent logged interaction happened before this instant (ISO 8601) — the "gone quiet" list. People never touched are EXCLUDED rather than treated as infinitely stale; list without this filter to see everyone.
118715
+ */
118716
+ lastTouchBefore?: string
118258
118717
  /**
118259
118718
  * Include TEST USERS. Default false: a test user is a fixture, not a customer — it is excluded from metering and from this listing for the same reason. Ask for it explicitly when you are debugging the fixtures themselves.
118260
118719
  */
@@ -118274,10 +118733,22 @@ users: {
118274
118733
  * Id of this end user. Pass it to any users_users_* tool.
118275
118734
  */
118276
118735
  id: string
118736
+ /**
118737
+ * What kind of person this row is: 'account' (can sign in) or 'contact' (known to the Product, no credential, never signed in). A contact is hidden from the default users_users_list view and is never counted as a retained user.
118738
+ */
118739
+ kind: ("account" | "contact")
118277
118740
  /**
118278
118741
  * The user's display name. Null when nobody set one.
118279
118742
  */
118280
118743
  name: (string | null)
118744
+ /**
118745
+ * Free labels on this person, stored trimmed, lowercased and de-duplicated.
118746
+ */
118747
+ tags: string[]
118748
+ /**
118749
+ * The relationship stage, in funnel order: new, contacted, replied, engaged, converted, lost. A real change publishes `users/user.stage-changed`.
118750
+ */
118751
+ stage: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost")
118281
118752
  /**
118282
118753
  * When the user was banned (ISO 8601). Null while they are not banned.
118283
118754
  */
@@ -118310,6 +118781,10 @@ productId: string
118310
118781
  * When the user was last changed (ISO 8601).
118311
118782
  */
118312
118783
  updatedAt: string
118784
+ /**
118785
+ * Set when you asked for an id that was merged into this account — it is the id you asked for, and this is the row it now lives in. Null on every ordinary read.
118786
+ */
118787
+ mergedFrom: (string | null)
118313
118788
  /**
118314
118789
  * Whether this user is still on the waitlist and cannot sign in yet.
118315
118790
  */
@@ -118323,9 +118798,9 @@ identifiers: {
118323
118798
  */
118324
118799
  id: string
118325
118800
  /**
118326
- * What kind of identifier this is. Today always `email`.
118801
+ * What kind of identifier this is: `email`, `phone`, `telegram`, `linkedin` or `x`. Only `email` can be signed in with — the other four are contact channels, reachable but never part of the auth plane.
118327
118802
  */
118328
- type: "email"
118803
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x")
118329
118804
  /**
118330
118805
  * The address as the user typed it, for display.
118331
118806
  */
@@ -118347,6 +118822,10 @@ valueCanonical: string
118347
118822
  */
118348
118823
  verificationStatus: ("unverified" | "verified" | "expired")
118349
118824
  }[]
118825
+ /**
118826
+ * When this person was last touched — the most recent logged interaction (ISO 8601). Null when nobody has logged one. This is when the interaction HAPPENED, not when it was logged.
118827
+ */
118828
+ lastTouchAt: (string | null)
118350
118829
  /**
118351
118830
  * When a failed-attempt lockout expires (ISO 8601). Null when the user is not locked out.
118352
118831
  */
@@ -118381,6 +118860,10 @@ unsafeMetadata: {
118381
118860
  privateMetadata: {
118382
118861
  [k: string]: unknown
118383
118862
  }
118863
+ /**
118864
+ * The user this person was merged INTO, when they were merged. Null for everybody else — follow it to find where their records went.
118865
+ */
118866
+ mergedIntoUserId: (string | null)
118384
118867
  /**
118385
118868
  * Id of the primary identifier row. Null when there is no primary identifier.
118386
118869
  */
@@ -118434,10 +118917,22 @@ export interface UsersUsersUnbanOutput {
118434
118917
  * Id of this end user. Pass it to any users_users_* tool.
118435
118918
  */
118436
118919
  id: string
118920
+ /**
118921
+ * What kind of person this row is: 'account' (can sign in) or 'contact' (known to the Product, no credential, never signed in). A contact is hidden from the default users_users_list view and is never counted as a retained user.
118922
+ */
118923
+ kind: ("account" | "contact")
118437
118924
  /**
118438
118925
  * The user's display name. Null when nobody set one.
118439
118926
  */
118440
118927
  name: (string | null)
118928
+ /**
118929
+ * Free labels on this person, stored trimmed, lowercased and de-duplicated.
118930
+ */
118931
+ tags: string[]
118932
+ /**
118933
+ * The relationship stage, in funnel order: new, contacted, replied, engaged, converted, lost. A real change publishes `users/user.stage-changed`.
118934
+ */
118935
+ stage: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost")
118441
118936
  /**
118442
118937
  * When the user was banned (ISO 8601). Null while they are not banned.
118443
118938
  */
@@ -118470,6 +118965,10 @@ productId: string
118470
118965
  * When the user was last changed (ISO 8601).
118471
118966
  */
118472
118967
  updatedAt: string
118968
+ /**
118969
+ * Set when you asked for an id that was merged into this account — it is the id you asked for, and this is the row it now lives in. Null on every ordinary read.
118970
+ */
118971
+ mergedFrom: (string | null)
118473
118972
  /**
118474
118973
  * Whether this user is still on the waitlist and cannot sign in yet.
118475
118974
  */
@@ -118483,9 +118982,9 @@ identifiers: {
118483
118982
  */
118484
118983
  id: string
118485
118984
  /**
118486
- * What kind of identifier this is. Today always `email`.
118985
+ * What kind of identifier this is: `email`, `phone`, `telegram`, `linkedin` or `x`. Only `email` can be signed in with — the other four are contact channels, reachable but never part of the auth plane.
118487
118986
  */
118488
- type: "email"
118987
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x")
118489
118988
  /**
118490
118989
  * The address as the user typed it, for display.
118491
118990
  */
@@ -118507,6 +119006,10 @@ valueCanonical: string
118507
119006
  */
118508
119007
  verificationStatus: ("unverified" | "verified" | "expired")
118509
119008
  }[]
119009
+ /**
119010
+ * When this person was last touched — the most recent logged interaction (ISO 8601). Null when nobody has logged one. This is when the interaction HAPPENED, not when it was logged.
119011
+ */
119012
+ lastTouchAt: (string | null)
118510
119013
  /**
118511
119014
  * When a failed-attempt lockout expires (ISO 8601). Null when the user is not locked out.
118512
119015
  */
@@ -118541,6 +119044,10 @@ unsafeMetadata: {
118541
119044
  privateMetadata: {
118542
119045
  [k: string]: unknown
118543
119046
  }
119047
+ /**
119048
+ * The user this person was merged INTO, when they were merged. Null for everybody else — follow it to find where their records went.
119049
+ */
119050
+ mergedIntoUserId: (string | null)
118544
119051
  /**
118545
119052
  * Id of the primary identifier row. Null when there is no primary identifier.
118546
119053
  */
@@ -118556,6 +119063,14 @@ export interface UsersUsersUpdateInput {
118556
119063
  * The user's display name. Pass null to clear.
118557
119064
  */
118558
119065
  name?: (string | null)
119066
+ /**
119067
+ * REPLACES the whole tag list — send every tag you want stored, not just the new ones. Trimmed, lowercased and de-duplicated on write.
119068
+ */
119069
+ tags?: string[]
119070
+ /**
119071
+ * Move the person to this relationship stage. A real change publishes `users/user.stage-changed`; a patch that changes ONLY the stage deliberately does not also publish `users/user.updated`, so a workflow that writes stages does not wake itself.
119072
+ */
119073
+ stage?: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost")
118559
119074
  /**
118560
119075
  * The user to update.
118561
119076
  */
@@ -118603,10 +119118,22 @@ export interface UsersUsersUpdateOutput {
118603
119118
  * Id of this end user. Pass it to any users_users_* tool.
118604
119119
  */
118605
119120
  id: string
119121
+ /**
119122
+ * What kind of person this row is: 'account' (can sign in) or 'contact' (known to the Product, no credential, never signed in). A contact is hidden from the default users_users_list view and is never counted as a retained user.
119123
+ */
119124
+ kind: ("account" | "contact")
118606
119125
  /**
118607
119126
  * The user's display name. Null when nobody set one.
118608
119127
  */
118609
119128
  name: (string | null)
119129
+ /**
119130
+ * Free labels on this person, stored trimmed, lowercased and de-duplicated.
119131
+ */
119132
+ tags: string[]
119133
+ /**
119134
+ * The relationship stage, in funnel order: new, contacted, replied, engaged, converted, lost. A real change publishes `users/user.stage-changed`.
119135
+ */
119136
+ stage: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost")
118610
119137
  /**
118611
119138
  * When the user was banned (ISO 8601). Null while they are not banned.
118612
119139
  */
@@ -118639,6 +119166,10 @@ productId: string
118639
119166
  * When the user was last changed (ISO 8601).
118640
119167
  */
118641
119168
  updatedAt: string
119169
+ /**
119170
+ * Set when you asked for an id that was merged into this account — it is the id you asked for, and this is the row it now lives in. Null on every ordinary read.
119171
+ */
119172
+ mergedFrom: (string | null)
118642
119173
  /**
118643
119174
  * Whether this user is still on the waitlist and cannot sign in yet.
118644
119175
  */
@@ -118652,9 +119183,9 @@ identifiers: {
118652
119183
  */
118653
119184
  id: string
118654
119185
  /**
118655
- * What kind of identifier this is. Today always `email`.
119186
+ * What kind of identifier this is: `email`, `phone`, `telegram`, `linkedin` or `x`. Only `email` can be signed in with — the other four are contact channels, reachable but never part of the auth plane.
118656
119187
  */
118657
- type: "email"
119188
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x")
118658
119189
  /**
118659
119190
  * The address as the user typed it, for display.
118660
119191
  */
@@ -118676,6 +119207,10 @@ valueCanonical: string
118676
119207
  */
118677
119208
  verificationStatus: ("unverified" | "verified" | "expired")
118678
119209
  }[]
119210
+ /**
119211
+ * When this person was last touched — the most recent logged interaction (ISO 8601). Null when nobody has logged one. This is when the interaction HAPPENED, not when it was logged.
119212
+ */
119213
+ lastTouchAt: (string | null)
118679
119214
  /**
118680
119215
  * When a failed-attempt lockout expires (ISO 8601). Null when the user is not locked out.
118681
119216
  */
@@ -118710,6 +119245,10 @@ unsafeMetadata: {
118710
119245
  privateMetadata: {
118711
119246
  [k: string]: unknown
118712
119247
  }
119248
+ /**
119249
+ * The user this person was merged INTO, when they were merged. Null for everybody else — follow it to find where their records went.
119250
+ */
119251
+ mergedIntoUserId: (string | null)
118713
119252
  /**
118714
119253
  * Id of the primary identifier row. Null when there is no primary identifier.
118715
119254
  */