@read-frog/api-contract 0.21.1 → 0.22.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.
package/dist/index.js CHANGED
@@ -1,22 +1,6 @@
1
1
  import { eventIterator, oc } from "@orpc/contract";
2
- import { BETA_FEATURE_KEYS, EBOOK_ALLOWED_COVER_CONTENT_TYPES, NOTEBASE_COLUMN_MAX_WIDTH, NOTEBASE_COLUMN_MIN_WIDTH, SRS_REVIEW_DURATION_MS_MAX, activeScheduleStatusSchema, cardIdentityShape, cardMemoryStateShape, cardStateSchema, cardStateSchema as cardStateSchema$1, cardTemplateConfigSchema, cardTemplateCreatedBySchema, fsrsMemoryStateSchema, fsrsReviewLogSnapshotSchema, getVideoIdFromUrl, langCodeISO6393Schema, notebaseColumnConfigSchema, reviewRatingSchema, scheduleStatusSchema, scheduleStatusSchema as scheduleStatusSchema$1, schedulingParamsSchema, schedulingParamsShape, srsModelVersionSchema, srsStepSchema, srsWeightsSchema, transcriptSegmentSchema } from "@read-frog/definitions";
3
2
  import { z } from "zod";
4
- //#region src/schemas/beta-access.ts
5
- const BetaFeatureKeySchema = z.enum(BETA_FEATURE_KEYS);
6
- const BetaAccessStatusInputSchema = z.object({ featureKey: BetaFeatureKeySchema }).strict();
7
- const BetaAccessStatusOutputSchema = z.object({
8
- featureKey: BetaFeatureKeySchema,
9
- allowed: z.boolean()
10
- });
11
- //#endregion
12
- //#region src/contracts/beta-access.ts
13
- const betaAccessContract = { status: oc.route({
14
- method: "GET",
15
- path: "/beta-access/status",
16
- summary: "Get beta access status for a feature",
17
- tags: ["Beta Access"]
18
- }).input(BetaAccessStatusInputSchema).output(BetaAccessStatusOutputSchema) };
19
- //#endregion
3
+ import { EBOOK_ALLOWED_COVER_CONTENT_TYPES, GATED_FEATURE_KEYS, NOTEBASE_COLUMN_MAX_WIDTH, NOTEBASE_COLUMN_MIN_WIDTH, SRS_REVIEW_DURATION_MS_MAX, activeScheduleStatusSchema, canonicalTimeZone, cardIdentityShape, cardMemoryStateShape, cardStateSchema, cardStateSchema as cardStateSchema$1, cardTemplateConfigSchema, cardTemplateCreatedBySchema, fsrsMemoryStateSchema, fsrsReviewLogSnapshotSchema, getVideoIdFromUrl, langCodeISO6393Schema, notebaseColumnConfigSchema, reviewRatingSchema, scheduleStatusSchema, scheduleStatusSchema as scheduleStatusSchema$1, schedulingParamsSchema, schedulingParamsShape, srsModelVersionSchema, srsStepSchema, srsWeightsSchema, transcriptSegmentSchema } from "@read-frog/definitions";
20
4
  //#region src/schemas/hosted-ai.ts
21
5
  const HostedAiOutputFieldTypeSchema = z.enum(["string", "number"]);
22
6
  const HostedAiOutputFieldSchema = z.strictObject({
@@ -184,13 +168,16 @@ const HostedAiRateLimitErrorDataSchema = z.object({
184
168
  quotaScope: HostedAiQuotaScopeSchema
185
169
  });
186
170
  /**
171
+ * A recurring pool: the plan's credit for a day or a week, which refills at
172
+ * `resetAt`.
173
+ *
187
174
  * Deliberately free of dollar amounts and of the versioned policy id. Clients
188
175
  * render a consumption bar and a reset time, so a percentage and a period kind
189
176
  * are all they need, and neither leaks what a call costs us. `usedPercent`
190
177
  * counts settled spend only: including in-flight reservations would make the
191
178
  * bar jump forward and then back as each stream settles.
192
179
  */
193
- const HostedAiCreditStatusSchema = z.strictObject({
180
+ const HostedAiRecurringCreditStatusSchema = z.strictObject({
194
181
  periodKind: HostedAiCreditPeriodKindSchema,
195
182
  usedPercent: z.number().min(0).max(100),
196
183
  resetAt: z.iso.datetime().nullable(),
@@ -201,6 +188,25 @@ const HostedAiCreditStatusSchema = z.strictObject({
201
188
  */
202
189
  features: z.array(HostedAiFeatureSchema).min(1)
203
190
  });
191
+ /**
192
+ * A one-time pool, such as credit from a campaign or from support. It never
193
+ * refills: once spent or past `expiresAt` it is gone, so a client shows the
194
+ * expiry, not a reset. It is drawn on only after the plan's own pool for a
195
+ * feature is spent, or for a feature the plan does not fund. Listed until it
196
+ * expires, even when spent. Same fields as a recurring pool otherwise.
197
+ */
198
+ const HostedAiOneTimeCreditStatusSchema = z.strictObject({
199
+ periodKind: z.literal("once"),
200
+ usedPercent: z.number().min(0).max(100),
201
+ expiresAt: z.iso.datetime(),
202
+ features: z.array(HostedAiFeatureSchema).min(1)
203
+ });
204
+ /**
205
+ * One pool that can pay for Built-in AI, told apart by `periodKind`: a
206
+ * recurring `daily` or `weekly` pool refills at `resetAt`, a one-time (`once`)
207
+ * pool ends at `expiresAt`. Narrow on `periodKind` before reading either.
208
+ */
209
+ const HostedAiCreditPoolStatusSchema = z.discriminatedUnion("periodKind", [HostedAiRecurringCreditStatusSchema, HostedAiOneTimeCreditStatusSchema]);
204
210
  const HostedAiTierStatusSchema = z.strictObject({
205
211
  accessAllowed: z.boolean(),
206
212
  available: z.boolean(),
@@ -219,7 +225,21 @@ const HostedAiFeatureStatusSchema = z.strictObject({
219
225
  advance: HostedAiTierStatusSchema
220
226
  });
221
227
  const HostedAiStatusOutputSchema = z.strictObject({
222
- credits: z.array(HostedAiCreditStatusSchema),
228
+ /**
229
+ * @deprecated Read `pools`. This lists the recurring pools only, never a
230
+ * one-time one: extensions released before mengxi-ream/read-frog#2395 look
231
+ * up a label for every entry's `periodKind`, and one they do not know
232
+ * crashes their usage page. They also throw if the field is missing.
233
+ *
234
+ * TODO(2026-11-07): remove once those extensions have drained (#710).
235
+ */
236
+ credits: z.array(HostedAiRecurringCreditStatusSchema),
237
+ /**
238
+ * Everything that can pay for a feature, in the order the server draws on it:
239
+ * the plan's recurring pools first, then one-time pools by soonest expiry. A
240
+ * feature can appear in several entries.
241
+ */
242
+ pools: z.array(HostedAiCreditPoolStatusSchema),
223
243
  features: z.strictObject({
224
244
  pageTranslation: HostedAiFeatureStatusSchema,
225
245
  customAction: HostedAiFeatureStatusSchema,
@@ -297,18 +317,10 @@ const PUBLIC_APP_ERROR_DEFS = {
297
317
  message: "Built-in AI credit exhausted",
298
318
  status: 429
299
319
  },
300
- NOTEBASE_BETA_RESTRICTED: {
301
- message: "Notebase is currently in beta for selected accounts",
302
- status: 403
303
- },
304
320
  NOTEBASE_NOT_FOUND: {
305
321
  message: "Notebase not found",
306
322
  status: 404
307
323
  },
308
- VIDEO_TRANSCRIPTION_BETA_RESTRICTED: {
309
- message: "Video transcription is currently in beta for selected accounts",
310
- status: 403
311
- },
312
324
  VIDEO_TRANSCRIPTION_SUBSCRIPTION_REQUIRED: {
313
325
  message: "AI subtitles require a Pro or Ultra subscription",
314
326
  status: 403
@@ -461,6 +473,10 @@ const PUBLIC_APP_ERROR_DEFS = {
461
473
  EBOOK_UPLOAD_NOT_COMPLETED: {
462
474
  message: "Ebook upload has not been completed",
463
475
  status: 409
476
+ },
477
+ EMAIL_LINK_INVALID: {
478
+ message: "This email link is not valid",
479
+ status: 400
464
480
  }
465
481
  };
466
482
  function isPublicAppErrorCode(code) {
@@ -484,6 +500,24 @@ function pickPublicErrorMap(...codes) {
484
500
  }));
485
501
  }
486
502
  //#endregion
503
+ //#region src/schemas/app-locale.ts
504
+ /**
505
+ * The languages the website is in (`project.inlang/settings.json`; a test in
506
+ * apps/www keeps the two in step). Used wherever the server writes for a
507
+ * person: Stripe pages, emails, and the account's `locale`.
508
+ */
509
+ const appLocaleSchema = z.enum([
510
+ "en",
511
+ "es",
512
+ "ja",
513
+ "ko",
514
+ "ru",
515
+ "tr",
516
+ "vi",
517
+ "zh",
518
+ "zh-TW"
519
+ ]);
520
+ //#endregion
487
521
  //#region src/schemas/billing.ts
488
522
  const billingIntervalSchema = z.enum(["month", "year"]);
489
523
  const billingSubscriptionStatusSchema = z.enum([
@@ -502,52 +536,55 @@ const billingPlanSchema = z.enum([
502
536
  "ultra"
503
537
  ]);
504
538
  /**
505
- * Whether a plan may use a feature, given the plans that feature allows.
506
- *
507
- * An explicit set rather than a minimum tier: there is no rank table to keep in
508
- * step with the plan enum, and any combination is expressible by writing it
509
- * down. The cost is that nothing derives from it automatically -- a feature's
510
- * pricing-card placement is a companion edit, noted at each `*_ALLOWED_PLANS`.
511
- */
512
- function isPlanAllowed(plan, allowed) {
513
- return allowed.includes(plan);
514
- }
515
- /**
516
- * Plans that may use the remote MCP server.
539
+ * How many MCP tool calls each plan may make in a day (24 hours from the first
540
+ * one); `null` is no limit. Each `tools/call` counts once, whatever the tool.
517
541
  *
518
- * Read by the server-side gate AND by the website's copy, so the page cannot
519
- * promise access the API refuses. `satisfies` keeps the literal tuple type so
520
- * the UI can render the plan names from this constant instead of hardcoding
521
- * them.
542
+ * Read by the MCP server's gate AND by the website's copy, so the pages cannot
543
+ * promise calls the server refuses.
522
544
  *
523
- * Companion edit when this changes: the feature bullet in
524
- * `apps/www/src/routes/pricing.tsx` lives on the lowest allowed plan's card
525
- * (higher cards inherit it through their "everything in <lower plan>" line).
545
+ * Companion edit when this changes: the MCP docs under
546
+ * `apps/www/content/docs/mcp/` and `account-and-plans`, which state the numbers.
526
547
  */
527
- const MCP_ALLOWED_PLANS = ["ultra"];
548
+ const MCP_DAILY_CALL_LIMITS = {
549
+ free: 10,
550
+ pro: 50,
551
+ ultra: null
552
+ };
528
553
  const billingCheckoutPlanSchema = z.enum(["pro", "ultra"]);
529
554
  const billingCurrencySchema = z.enum([
530
555
  "usd",
531
556
  "cad",
532
557
  "cny"
533
558
  ]);
534
- const billingLocaleSchema = z.enum([
535
- "en",
536
- "es",
537
- "ja",
538
- "ko",
539
- "ru",
540
- "tr",
541
- "vi",
542
- "zh",
543
- "zh-TW"
544
- ]);
559
+ const billingLocaleSchema = appLocaleSchema;
545
560
  const billingAccessSourceSchema = z.enum(["subscription", "pass"]);
546
561
  const billingScheduledChangeSchema = z.object({
547
562
  plan: billingCheckoutPlanSchema,
548
563
  interval: billingIntervalSchema,
549
564
  effectiveAt: z.coerce.date()
550
565
  }).strict();
566
+ /**
567
+ * The zone a payment deadline is shown in, as a date with no time. UTC−12 is
568
+ * the last zone to finish a day, and `dueBy` is the end of a day there, so the
569
+ * date it shows stays open in every customer's zone until their own midnight.
570
+ */
571
+ const BILLING_PAYMENT_DUE_TIME_ZONE = "Etc/GMT+12";
572
+ /**
573
+ * A renewal whose payment failed. The plan stays until `dueBy`; paying the
574
+ * invoice before then (or later, until the subscription is canceled) restores
575
+ * the subscription as if the payment had gone through.
576
+ */
577
+ const billingPaymentDueSchema = z.object({
578
+ /** The last instant of the plan; show it in BILLING_PAYMENT_DUE_TIME_ZONE. */
579
+ dueBy: z.coerce.date(),
580
+ /**
581
+ * The plan the payment keeps. Not `BillingStatus.plan`: past `dueBy` that
582
+ * already reads "free" while the invoice is still payable.
583
+ */
584
+ plan: billingCheckoutPlanSchema,
585
+ /** The Stripe-hosted page that pays the invoice; null if Stripe gave none. */
586
+ url: z.url().nullable()
587
+ }).strict();
551
588
  const billingStatusSchema = z.object({
552
589
  plan: billingPlanSchema,
553
590
  status: billingSubscriptionStatusSchema.nullable(),
@@ -562,6 +599,7 @@ const billingStatusSchema = z.object({
562
599
  cancelAt: z.coerce.date().nullable(),
563
600
  accessSource: billingAccessSourceSchema.nullable(),
564
601
  scheduledChange: billingScheduledChangeSchema.nullable(),
602
+ paymentDue: billingPaymentDueSchema.nullable(),
565
603
  unlimitedNotebaseNotes: z.boolean(),
566
604
  notebaseNoteLimit: z.number().int().positive(),
567
605
  notebaseNoteCount: z.number().int().min(0)
@@ -569,10 +607,10 @@ const billingStatusSchema = z.object({
569
607
  const billingCreateCheckoutSessionInputSchema = z.object({
570
608
  currency: billingCurrencySchema,
571
609
  interval: billingIntervalSchema,
572
- locale: billingLocaleSchema,
610
+ locale: appLocaleSchema,
573
611
  plan: billingCheckoutPlanSchema.default("pro")
574
612
  }).strict();
575
- const billingCreateCustomerPortalSessionInputSchema = z.object({ locale: billingLocaleSchema }).strict();
613
+ const billingCreateCustomerPortalSessionInputSchema = z.object({ locale: appLocaleSchema }).strict();
576
614
  const billingSessionUrlOutputSchema = z.object({ url: z.url() }).strict();
577
615
  const billingCancelScheduledChangeOutputSchema = z.object({ success: z.literal(true) }).strict();
578
616
  //#endregion
@@ -797,20 +835,24 @@ const ebookRequestUploadInputSchema = z.object({
797
835
  title: z.string().min(1).max(500),
798
836
  author: z.string().max(500).optional(),
799
837
  language: z.string().max(35).optional(),
800
- coverContentType: ebookCoverContentTypeSchema.optional()
838
+ fileByteSize: z.number().int().min(1),
839
+ cover: z.object({
840
+ contentType: ebookCoverContentTypeSchema,
841
+ byteSize: z.number().int().min(1)
842
+ }).strict().optional()
801
843
  }).strict();
802
844
  /**
803
- * S3 POST form policy. `fields` must be appended to the form in iteration order
804
- * with the file last; S3 ignores anything sent after the `file` part.
845
+ * A signed PUT: send the file to `url` with exactly `headers`. The signature
846
+ * covers the file's type and exact size, so storage refuses any other file.
805
847
  */
806
- const ebookPresignedPostSchema = z.object({
848
+ const ebookPresignedUploadSchema = z.object({
807
849
  url: z.url(),
808
- fields: z.record(z.string(), z.string())
850
+ headers: z.record(z.string(), z.string())
809
851
  }).strict();
810
852
  const ebookRequestUploadOutputSchema = z.object({
811
853
  ebookId: z.uuid(),
812
- upload: ebookPresignedPostSchema,
813
- coverUpload: ebookPresignedPostSchema.nullable(),
854
+ upload: ebookPresignedUploadSchema,
855
+ coverUpload: ebookPresignedUploadSchema.nullable(),
814
856
  expiresAt: z.coerce.date()
815
857
  }).strict();
816
858
  const ebookFinalizeUploadInputSchema = z.object({ ebookId: z.uuid() }).strict();
@@ -850,7 +892,7 @@ const ebookContract = {
850
892
  summary: "Get an ebook with reading progress",
851
893
  tags: ["Ebooks"]
852
894
  }).input(ebookGetInputSchema).output(ebookGetOutputSchema),
853
- requestUpload: ebookProcedure.errors(pickPublicErrorMap("EBOOK_BETA_RESTRICTED", "EBOOK_LIMIT_EXCEEDED")).route({
895
+ requestUpload: ebookProcedure.errors(pickPublicErrorMap("EBOOK_BETA_RESTRICTED", "EBOOK_LIMIT_EXCEEDED", "EBOOK_FILE_TOO_LARGE")).route({
854
896
  method: "POST",
855
897
  path: "/ebooks/uploads",
856
898
  summary: "Request presigned upload URLs for a new ebook",
@@ -888,6 +930,95 @@ const ebookContract = {
888
930
  }).input(ebookDeleteInputSchema).output(ebookDeleteOutputSchema)
889
931
  };
890
932
  //#endregion
933
+ //#region src/schemas/email-preferences.ts
934
+ /** A category's key, such as `promotions`. */
935
+ const emailCategoryKeySchema = z.string().max(64).regex(/^[a-z][a-z0-9_]*$/);
936
+ /** The token in an email's unsubscribe link. */
937
+ const emailLinkTokenSchema = z.string().min(1).max(1024);
938
+ const emailCategoryStateSchema = z.object({
939
+ key: z.string(),
940
+ name: z.string(),
941
+ description: z.string().nullable(),
942
+ commercial: z.boolean(),
943
+ required: z.boolean(),
944
+ subscribed: z.boolean()
945
+ }).strict();
946
+ const emailPreferencesStateSchema = z.object({
947
+ categories: z.array(emailCategoryStateSchema),
948
+ unsubscribedAll: z.boolean()
949
+ }).strict();
950
+ /**
951
+ * What the page a link opens shows on top of the state: whose preferences they
952
+ * are, without the full address, and the category the link was for, if any.
953
+ */
954
+ const emailPreferencesByTokenStateSchema = z.object({
955
+ ...emailPreferencesStateSchema.shape,
956
+ maskedEmail: z.string(),
957
+ highlightCategory: z.string().nullable()
958
+ }).strict();
959
+ const emailPreferencesChangesShape = {
960
+ categories: z.record(emailCategoryKeySchema, z.boolean()).optional(),
961
+ unsubscribedAll: z.boolean().optional()
962
+ };
963
+ const emailPreferencesGetInputSchema = z.object({ locale: appLocaleSchema }).strict();
964
+ const emailPreferencesUpdateInputSchema = z.object({
965
+ locale: appLocaleSchema,
966
+ ...emailPreferencesChangesShape
967
+ }).strict();
968
+ const emailPreferencesGetByTokenInputSchema = z.object({
969
+ token: emailLinkTokenSchema,
970
+ locale: appLocaleSchema
971
+ }).strict();
972
+ const emailPreferencesUpdateByTokenInputSchema = z.object({
973
+ token: emailLinkTokenSchema,
974
+ locale: appLocaleSchema,
975
+ ...emailPreferencesChangesShape
976
+ }).strict();
977
+ //#endregion
978
+ //#region src/contracts/email-preferences.ts
979
+ const emailPreferencesContract = {
980
+ get: oc.route({
981
+ method: "GET",
982
+ path: "/users/me/email-preferences",
983
+ summary: "Get which emails the authenticated user receives",
984
+ tags: ["Email preferences"]
985
+ }).input(emailPreferencesGetInputSchema).output(emailPreferencesStateSchema),
986
+ update: oc.route({
987
+ method: "PATCH",
988
+ path: "/users/me/email-preferences",
989
+ summary: "Change which emails the authenticated user receives",
990
+ tags: ["Email preferences"]
991
+ }).input(emailPreferencesUpdateInputSchema).output(emailPreferencesStateSchema),
992
+ getByToken: oc.route({
993
+ method: "POST",
994
+ path: "/email-preferences/by-token",
995
+ summary: "Get the email preferences an email link is for",
996
+ tags: ["Email preferences"]
997
+ }).errors(pickPublicErrorMap("EMAIL_LINK_INVALID")).input(emailPreferencesGetByTokenInputSchema).output(emailPreferencesByTokenStateSchema),
998
+ updateByToken: oc.route({
999
+ method: "POST",
1000
+ path: "/email-preferences/by-token/update",
1001
+ summary: "Change the email preferences an email link is for",
1002
+ tags: ["Email preferences"]
1003
+ }).errors(pickPublicErrorMap("EMAIL_LINK_INVALID")).input(emailPreferencesUpdateByTokenInputSchema).output(emailPreferencesByTokenStateSchema)
1004
+ };
1005
+ //#endregion
1006
+ //#region src/schemas/feature-access.ts
1007
+ const GatedFeatureKeySchema = z.enum(GATED_FEATURE_KEYS);
1008
+ const FeatureAccessStatusInputSchema = z.object({ featureKey: GatedFeatureKeySchema }).strict();
1009
+ const FeatureAccessStatusOutputSchema = z.object({
1010
+ featureKey: GatedFeatureKeySchema,
1011
+ allowed: z.boolean()
1012
+ });
1013
+ //#endregion
1014
+ //#region src/contracts/feature-access.ts
1015
+ const featureAccessContract = { status: oc.route({
1016
+ method: "GET",
1017
+ path: "/feature-access/status",
1018
+ summary: "Get whether the caller can use a gated feature",
1019
+ tags: ["Feature Access"]
1020
+ }).input(FeatureAccessStatusInputSchema).output(FeatureAccessStatusOutputSchema) };
1021
+ //#endregion
891
1022
  //#region src/contracts/hosted-ai.ts
892
1023
  const hostedAiStreamErrors = pickPublicErrorMap("HOSTED_AI_TIER_RESTRICTED", "HOSTED_AI_QUOTA_EXHAUSTED");
893
1024
  const hostedAiContract = {
@@ -1265,6 +1396,7 @@ const notebaseSchema = z.object({
1265
1396
  srsEnableFuzz: schedulingParamsShape.enableFuzz,
1266
1397
  srsWeights: srsWeightsSchema.nullable(),
1267
1398
  srsModelVersion: srsModelVersionSchema,
1399
+ srsSleepingAt: z.date().nullable(),
1268
1400
  createdAt: z.date(),
1269
1401
  updatedAt: z.date()
1270
1402
  });
@@ -1325,6 +1457,11 @@ const NotebaseUpdateOutputSchema = z.object({
1325
1457
  notebase: notebaseSchema,
1326
1458
  txid: z.number()
1327
1459
  });
1460
+ const NotebaseSetSleepInputSchema = z.object({
1461
+ id: z.uuid(),
1462
+ enabled: z.boolean()
1463
+ }).strict();
1464
+ const NotebaseSetSleepOutputSchema = z.object({ txid: z.number().nullable() });
1328
1465
  const NotebaseDeleteInputSchema = z.object({ id: z.uuid() });
1329
1466
  const NotebaseDeleteOutputSchema = deletionResultSchema;
1330
1467
  const NotebaseGetInputSchema = z.object({ id: z.uuid() });
@@ -1393,6 +1530,13 @@ const notebaseContract = {
1393
1530
  description: "Update the supplied name or public study settings of an owned notebase, preserving omitted properties.",
1394
1531
  tags: ["Notebases"]
1395
1532
  }).errors(pickPublicErrorMap("NOTEBASE_NOT_FOUND")).input(NotebaseUpdateInputSchema).output(NotebaseUpdateOutputSchema),
1533
+ setSleep: defineAgentProcedure({
1534
+ method: "POST",
1535
+ path: "/notebases/{id}/sleep",
1536
+ summary: "Set notebase sleep",
1537
+ description: "Put an owned notebase to sleep (enabled=true) or wake it (enabled=false). A sleeping notebase is left out of the combined review; its cards, memory states and review history are unchanged and it can still be reviewed directly. A request matching the current state succeeds without a change.",
1538
+ tags: ["Notebases"]
1539
+ }).errors(pickPublicErrorMap("NOTEBASE_NOT_FOUND")).input(NotebaseSetSleepInputSchema).output(NotebaseSetSleepOutputSchema),
1396
1540
  delete: defineAgentProcedure({
1397
1541
  method: "DELETE",
1398
1542
  path: "/notebases/{id}",
@@ -1565,8 +1709,14 @@ const speechSynthesizeInputSchema = z.object({
1565
1709
  language: langCodeISO6393Schema.optional(),
1566
1710
  voice: speechVoiceNameSchema.optional()
1567
1711
  }).strict();
1568
- /** The audio, as an MP3 file. */
1569
- const speechSynthesizeOutputSchema = z.file();
1712
+ /**
1713
+ * Where to download the audio, an MP3: a link to fetch at once, which stops
1714
+ * working at `expiresAt`.
1715
+ */
1716
+ const speechSynthesizeOutputSchema = z.object({
1717
+ url: z.url(),
1718
+ expiresAt: z.coerce.date()
1719
+ }).strict();
1570
1720
  //#endregion
1571
1721
  //#region src/contracts/speech.ts
1572
1722
  const speechContract = {
@@ -1591,7 +1741,7 @@ const speechContract = {
1591
1741
  synthesize: oc.route({
1592
1742
  method: "POST",
1593
1743
  path: "/speech/synthesize",
1594
- summary: "Read a text aloud, as MP3 audio",
1744
+ summary: "Read a text aloud, and link to its MP3 audio",
1595
1745
  tags: ["Speech"]
1596
1746
  }).input(speechSynthesizeInputSchema).output(speechSynthesizeOutputSchema)
1597
1747
  };
@@ -1621,6 +1771,24 @@ const timezoneSchema = z.string().trim().min(1).refine((timezone) => {
1621
1771
  return false;
1622
1772
  }
1623
1773
  }, "Invalid timezone");
1774
+ /**
1775
+ * The zone a call reckons days in, under the name an account's zone is stored
1776
+ * under (`canonicalTimeZone`): "Asia/Calcutta" arrives as "Asia/Kolkata" and
1777
+ * "CST" as "America/Chicago", names that Temporal and a Debian Postgres both
1778
+ * read. A fixed offset ("+08:00") is refused, as Postgres reads it with the
1779
+ * opposite sign and would put the call's days on the wrong side of UTC.
1780
+ */
1781
+ const canonicalTimezoneSchema = timezoneSchema.transform((timezone, ctx) => {
1782
+ const name = canonicalTimeZone(timezone);
1783
+ if (!name) {
1784
+ ctx.addIssue({
1785
+ code: "custom",
1786
+ message: "Use an IANA time zone identifier instead of a fixed UTC offset. See https://www.iana.org/time-zones"
1787
+ });
1788
+ return z.NEVER;
1789
+ }
1790
+ return name;
1791
+ });
1624
1792
  //#endregion
1625
1793
  //#region src/schemas/srs.ts
1626
1794
  const stepSchema = srsStepSchema;
@@ -1635,7 +1803,7 @@ const srsReviewInputSchema = z.object({
1635
1803
  id: z.uuid().optional(),
1636
1804
  rating: reviewRatingSchema,
1637
1805
  durationMs: z.number().int().min(0).max(SRS_REVIEW_DURATION_MS_MAX),
1638
- timezone: timezoneSchema
1806
+ timezone: canonicalTimezoneSchema
1639
1807
  }).strict();
1640
1808
  const srsRollbackReviewInputSchema = z.object({
1641
1809
  expectedReviewId: z.uuid().optional(),
@@ -1644,10 +1812,10 @@ const srsRollbackReviewInputSchema = z.object({
1644
1812
  const srsScheduleStatusStatsSchema = z.record(activeScheduleStatusSchema, z.number().int().min(0));
1645
1813
  const srsScheduleStatusStatsInputSchema = z.object({
1646
1814
  notebaseIds: z.array(z.uuid()).optional(),
1647
- timezone: timezoneSchema
1815
+ timezone: canonicalTimezoneSchema
1648
1816
  }).strict();
1649
1817
  const srsScheduleStatusStatsOutputSchema = z.record(z.uuid(), srsScheduleStatusStatsSchema);
1650
- const srsRecentNotebaseScheduleStatusStatsInputSchema = z.object({ timezone: timezoneSchema }).strict();
1818
+ const srsRecentNotebaseScheduleStatusStatsInputSchema = z.object({ timezone: canonicalTimezoneSchema }).strict();
1651
1819
  /** Null when the user has no notebase yet. */
1652
1820
  const srsRecentNotebaseScheduleStatusStatsOutputSchema = z.object({
1653
1821
  notebase: notebaseSummarySchema,
@@ -1848,7 +2016,7 @@ const statsInputSchema = z.object({
1848
2016
  notebaseIds: statsNotebaseIdsSchema.optional(),
1849
2017
  from: z.iso.date().optional(),
1850
2018
  to: z.iso.date(),
1851
- timezone: timezoneSchema
2019
+ timezone: canonicalTimezoneSchema
1852
2020
  }).strict().refine((input) => !input.from || input.from <= input.to, {
1853
2021
  message: "from must be before or equal to to",
1854
2022
  path: ["from"]
@@ -1888,6 +2056,13 @@ const userEnsureTimezoneOutputSchema = z.object({
1888
2056
  }).strict();
1889
2057
  const userUpdateTimezoneInputSchema = z.object({ timezone: timezoneSchema }).strict();
1890
2058
  const userUpdateTimezoneOutputSchema = z.object({ timezone: timezoneSchema }).strict();
2059
+ const userEnsureLocaleInputSchema = z.object({ locale: appLocaleSchema }).strict();
2060
+ const userEnsureLocaleOutputSchema = z.object({
2061
+ locale: appLocaleSchema,
2062
+ updated: z.boolean()
2063
+ }).strict();
2064
+ const userUpdateLocaleInputSchema = z.object({ locale: appLocaleSchema }).strict();
2065
+ const userUpdateLocaleOutputSchema = z.object({ locale: appLocaleSchema }).strict();
1891
2066
  //#endregion
1892
2067
  //#region src/contracts/user.ts
1893
2068
  const userContract = {
@@ -1902,7 +2077,19 @@ const userContract = {
1902
2077
  path: "/users/me/timezone",
1903
2078
  summary: "Update the authenticated user's timezone",
1904
2079
  tags: ["Users"]
1905
- }).input(userUpdateTimezoneInputSchema).output(userUpdateTimezoneOutputSchema)
2080
+ }).input(userUpdateTimezoneInputSchema).output(userUpdateTimezoneOutputSchema),
2081
+ ensureLocale: oc.route({
2082
+ method: "POST",
2083
+ path: "/users/me/locale/ensure",
2084
+ summary: "Ensure the authenticated user has a locale",
2085
+ tags: ["Users"]
2086
+ }).input(userEnsureLocaleInputSchema).output(userEnsureLocaleOutputSchema),
2087
+ updateLocale: oc.route({
2088
+ method: "PATCH",
2089
+ path: "/users/me/locale",
2090
+ summary: "Update the authenticated user's locale",
2091
+ tags: ["Users"]
2092
+ }).input(userUpdateLocaleInputSchema).output(userUpdateLocaleOutputSchema)
1906
2093
  };
1907
2094
  //#endregion
1908
2095
  //#region src/schemas/video-transcript.ts
@@ -1953,11 +2140,12 @@ const videoTranscriptUsageSchema = z.object({
1953
2140
  //#endregion
1954
2141
  //#region src/index.ts
1955
2142
  const contract = {
1956
- betaAccess: betaAccessContract,
1957
2143
  billing: billingContract,
1958
2144
  card: cardContract,
1959
2145
  cardTemplate: cardTemplateContract,
1960
2146
  ebook: ebookContract,
2147
+ emailPreferences: emailPreferencesContract,
2148
+ featureAccess: featureAccessContract,
1961
2149
  hostedAi: hostedAiContract,
1962
2150
  masteryGoal: masteryGoalContract,
1963
2151
  mcpConnection: mcpConnectionContract,
@@ -1996,6 +2184,6 @@ const contract = {
1996
2184
  }
1997
2185
  };
1998
2186
  //#endregion
1999
- export { BetaAccessStatusInputSchema, BetaAccessStatusOutputSchema, BetaFeatureKeySchema, CardGenerateInputSchema, CardGenerateOutputSchema, CardGetInputSchema, CardGetOutputSchema, CardListInputSchema, CardListOutputSchema, CardTemplateCreateInputSchema, CardTemplateCreateOutputSchema, CardTemplateDeleteInputSchema, CardTemplateDeleteOutputSchema, CardTemplateGetInputSchema, CardTemplateGetOutputSchema, CardTemplateInvalidColumnsDataSchema, CardTemplateInvalidLayoutDataSchema, CardTemplateListInputSchema, CardTemplateListOutputSchema, CardTemplateNotebaseColumnInUseDataSchema, CardTemplateUpdateInputSchema, CardTemplateUpdateOutputSchema, CellValidationFailedDataSchema, CellValidationFailureDetailsSchema, CellValidationFailureReasonSchema, DEFAULT_SPEECH_PREFERENCES, HOSTED_AI_CLIENT_STREAM_PART_TYPES, HOSTED_AI_NOTE_SUGGESTION_MAX_NOTES, HOSTED_AI_NOTE_SUGGESTION_MAX_NOTE_FIELDS, HostedAiCreditPeriodKindSchema, HostedAiCreditPolicyIdSchema, HostedAiCreditStatusSchema, HostedAiFeatureSchema, HostedAiFeatureStatusSchema, HostedAiModelTierSchema, HostedAiNoteSuggestionObjectSchema, HostedAiNoteSuggestionStreamInputSchema, HostedAiOutputFieldSchema, HostedAiOutputFieldTypeSchema, HostedAiQuotaExhaustedDataSchema, HostedAiQuotaScopeSchema, HostedAiRateLimitErrorDataSchema, HostedAiRequestIdSchema, HostedAiStatusInputSchema, HostedAiStatusOutputSchema, HostedAiStreamPartSchema, HostedAiStreamStructuredObjectInputSchema, HostedAiStreamTextInputSchema, HostedAiTierRestrictedDataSchema, HostedAiTierStatusSchema, HostedAiUnavailableReasonSchema, MASTERY_GOAL_TARGET_MAX, MCP_ALLOWED_PLANS, NOTEBASE_ROW_CREATE_MANY_MAX_ROWS, NOTEBASE_ROW_DELETE_MANY_MAX_ROWS, NOTEBASE_ROW_UPDATE_MANY_MAX_ROWS, NotebaseColumnCreateInputSchema, NotebaseColumnCreateOutputSchema, NotebaseColumnDeleteInputSchema, NotebaseColumnDeleteOutputSchema, NotebaseColumnReorderInputSchema, NotebaseColumnReorderOutputSchema, NotebaseColumnUpdateInputSchema, NotebaseColumnUpdateOutputSchema, NotebaseCreateInputSchema, NotebaseCreateOutputSchema, NotebaseDeleteInputSchema, NotebaseDeleteOutputSchema, NotebaseGetInputSchema, NotebaseGetOutputSchema, NotebaseGetSchemaInputSchema, NotebaseGetSchemaOutputSchema, NotebaseGetSummaryInputSchema, NotebaseGetSummaryOutputSchema, NotebaseListInputSchema, NotebaseListItemSchema, NotebaseListOutputSchema, NotebaseRowCreateInputSchema, NotebaseRowCreateManyInputSchema, NotebaseRowCreateManyOutputSchema, NotebaseRowCreateOutputSchema, NotebaseRowDeleteInputSchema, NotebaseRowDeleteManyInputSchema, NotebaseRowDeleteManyOutputSchema, NotebaseRowDeleteOutputSchema, NotebaseRowGetInputSchema, NotebaseRowGetOutputSchema, NotebaseRowListInputSchema, NotebaseRowListOutputSchema, NotebaseRowReorderInputSchema, NotebaseRowReorderOutputSchema, NotebaseRowUpdateInputSchema, NotebaseRowUpdateManyInputSchema, NotebaseRowUpdateManyOutputSchema, NotebaseRowUpdateOutputSchema, NotebaseUpdateInputSchema, NotebaseUpdateOutputSchema, PUBLIC_APP_ERROR_DEFS, SPEECH_DAILY_REQUEST_LIMITS, SPEECH_RATE_MAX, SPEECH_RATE_MIN, SPEECH_TEXT_MAX_LENGTH, SRS_REVIEW_CLIENT_ID_NAMESPACE, SRS_REVIEW_DURATION_MS_MAX, SpeechDailyLimitReachedDataSchema, activityStatsOutputSchema, billingAccessSourceSchema, billingCancelScheduledChangeOutputSchema, billingCheckoutPlanSchema, billingCreateCheckoutSessionInputSchema, billingCreateCustomerPortalSessionInputSchema, billingCurrencySchema, billingIntervalSchema, billingLocaleSchema, billingPlanSchema, billingScheduledChangeSchema, billingSessionUrlOutputSchema, billingStatusSchema, billingSubscriptionStatusSchema, cardSchema, cardStateSchema, cardTemplateSchema, contract, createSrsReviewClientId, defineAgentProcedure, deletionResultSchema, ebookCoverContentTypeSchema, ebookDeleteInputSchema, ebookDeleteOutputSchema, ebookDetailSchema, ebookFinalizeUploadInputSchema, ebookFinalizeUploadOutputSchema, ebookGetDownloadUrlInputSchema, ebookGetDownloadUrlOutputSchema, ebookGetInputSchema, ebookGetOutputSchema, ebookListInputSchema, ebookListItemSchema, ebookListOutputSchema, ebookPresignedPostSchema, ebookQuotaSchema, ebookRenameDataSchema, ebookRenameInputSchema, ebookRenameOutputSchema, ebookRequestUploadInputSchema, ebookRequestUploadOutputSchema, ebookStatusSchema, ebookUpdateProgressDataSchema, ebookUpdateProgressInputSchema, ebookUpdateProgressOutputSchema, expectedUpdatedAtSchema, getPublicErrorDefinition, isPlanAllowed, isPublicAppErrorCode, masteryGoalOutputSchema, masteryGoalTargetSchema, masteryGoalUpdateInputSchema, mcpConnectionListOutputSchema, mcpConnectionRevokeInputSchema, mcpConnectionRevokeOutputSchema, mcpConnectionSchema, notebaseActivityStatsItemSchema, notebaseActivityStatsOutputSchema, notebaseColumnCreateDataSchema, notebaseColumnSchema, notebaseColumnUpdateDataSchema, notebaseColumnWidthSchema, notebaseCreateDataSchema, notebaseRowCellsSchema, notebaseRowCreateDataSchema, notebaseRowGrowthStatsItemSchema, notebaseRowGrowthStatsOutputSchema, notebaseRowSchema, notebaseRowUpdateDataSchema, notebaseSchema, notebaseSummarySchema, notebaseUpdateDataSchema, notebaseViewConfigSchema, notebaseViewCreateDataSchema, notebaseViewFilterSchema, notebaseViewFiltersSchema, notebaseViewSchema, notebaseViewSortSchema, notebaseViewSortsSchema, notebaseViewTypeSchema, notebaseViewUpdateDataSchema, pageSchema, paginationShape, pickPublicErrorMap, renderedCardSchema, reviewRatingSchema, scheduleStatusSchema, schedulingParamsSchema, speechPreferencesSchema, speechPreferencesUpdateInputSchema, speechRateSchema, speechSynthesizeInputSchema, speechSynthesizeOutputSchema, speechVoiceGenderSchema, speechVoiceNameSchema, speechVoiceSchema, speechVoicesOutputSchema, srsAcknowledgeOptimizerResultsInputSchema, srsAcknowledgeOptimizerResultsOutputSchema, srsActivityStatsItemSchema, srsActivityStatsOutputSchema, srsListCardRevlogsInputSchema, srsListCardRevlogsOutputSchema, srsListUnreadOptimizerResultsInputSchema, srsListUnreadOptimizerResultsOutputSchema, srsManualCardStatusInputSchema, srsMemoryGrowthStatsItemSchema, srsMemoryGrowthStatsOutputSchema, srsOptimizerUnreadResultSchema, srsRecentNotebaseScheduleStatusStatsInputSchema, srsRecentNotebaseScheduleStatusStatsOutputSchema, srsReviewInputSchema, srsReviewOutputSchema, srsRevlogSchema, srsRevlogWithoutSnapshotSchema, srsRollbackReviewInputSchema, srsRollbackReviewOutputSchema, srsScheduleStatusStatsInputSchema, srsScheduleStatusStatsOutputSchema, srsScheduleStatusStatsSchema, srsSetCardBuriedInputSchema, srsSetCardBuriedOutputSchema, srsSetCardSuspendedInputSchema, srsSetCardSuspendedOutputSchema, srsTxidOutputSchema, statsInputSchema, stepSchema, timezoneSchema, userEnsureTimezoneInputSchema, userEnsureTimezoneOutputSchema, userUpdateTimezoneInputSchema, userUpdateTimezoneOutputSchema, videoTranscriptCreateInputSchema, videoTranscriptGetInputSchema, videoTranscriptResourceSchema, videoTranscriptStatusSchema, videoTranscriptSubtitlesSchema, videoTranscriptUsagePoolSchema, videoTranscriptUsageSchema };
2187
+ export { BILLING_PAYMENT_DUE_TIME_ZONE, CardGenerateInputSchema, CardGenerateOutputSchema, CardGetInputSchema, CardGetOutputSchema, CardListInputSchema, CardListOutputSchema, CardTemplateCreateInputSchema, CardTemplateCreateOutputSchema, CardTemplateDeleteInputSchema, CardTemplateDeleteOutputSchema, CardTemplateGetInputSchema, CardTemplateGetOutputSchema, CardTemplateInvalidColumnsDataSchema, CardTemplateInvalidLayoutDataSchema, CardTemplateListInputSchema, CardTemplateListOutputSchema, CardTemplateNotebaseColumnInUseDataSchema, CardTemplateUpdateInputSchema, CardTemplateUpdateOutputSchema, CellValidationFailedDataSchema, CellValidationFailureDetailsSchema, CellValidationFailureReasonSchema, DEFAULT_SPEECH_PREFERENCES, FeatureAccessStatusInputSchema, FeatureAccessStatusOutputSchema, GatedFeatureKeySchema, HOSTED_AI_CLIENT_STREAM_PART_TYPES, HOSTED_AI_NOTE_SUGGESTION_MAX_NOTES, HOSTED_AI_NOTE_SUGGESTION_MAX_NOTE_FIELDS, HostedAiCreditPeriodKindSchema, HostedAiCreditPolicyIdSchema, HostedAiCreditPoolStatusSchema, HostedAiFeatureSchema, HostedAiFeatureStatusSchema, HostedAiModelTierSchema, HostedAiNoteSuggestionObjectSchema, HostedAiNoteSuggestionStreamInputSchema, HostedAiOneTimeCreditStatusSchema, HostedAiOutputFieldSchema, HostedAiOutputFieldTypeSchema, HostedAiQuotaExhaustedDataSchema, HostedAiQuotaScopeSchema, HostedAiRateLimitErrorDataSchema, HostedAiRecurringCreditStatusSchema, HostedAiRequestIdSchema, HostedAiStatusInputSchema, HostedAiStatusOutputSchema, HostedAiStreamPartSchema, HostedAiStreamStructuredObjectInputSchema, HostedAiStreamTextInputSchema, HostedAiTierRestrictedDataSchema, HostedAiTierStatusSchema, HostedAiUnavailableReasonSchema, MASTERY_GOAL_TARGET_MAX, MCP_DAILY_CALL_LIMITS, NOTEBASE_ROW_CREATE_MANY_MAX_ROWS, NOTEBASE_ROW_DELETE_MANY_MAX_ROWS, NOTEBASE_ROW_UPDATE_MANY_MAX_ROWS, NotebaseColumnCreateInputSchema, NotebaseColumnCreateOutputSchema, NotebaseColumnDeleteInputSchema, NotebaseColumnDeleteOutputSchema, NotebaseColumnReorderInputSchema, NotebaseColumnReorderOutputSchema, NotebaseColumnUpdateInputSchema, NotebaseColumnUpdateOutputSchema, NotebaseCreateInputSchema, NotebaseCreateOutputSchema, NotebaseDeleteInputSchema, NotebaseDeleteOutputSchema, NotebaseGetInputSchema, NotebaseGetOutputSchema, NotebaseGetSchemaInputSchema, NotebaseGetSchemaOutputSchema, NotebaseGetSummaryInputSchema, NotebaseGetSummaryOutputSchema, NotebaseListInputSchema, NotebaseListItemSchema, NotebaseListOutputSchema, NotebaseRowCreateInputSchema, NotebaseRowCreateManyInputSchema, NotebaseRowCreateManyOutputSchema, NotebaseRowCreateOutputSchema, NotebaseRowDeleteInputSchema, NotebaseRowDeleteManyInputSchema, NotebaseRowDeleteManyOutputSchema, NotebaseRowDeleteOutputSchema, NotebaseRowGetInputSchema, NotebaseRowGetOutputSchema, NotebaseRowListInputSchema, NotebaseRowListOutputSchema, NotebaseRowReorderInputSchema, NotebaseRowReorderOutputSchema, NotebaseRowUpdateInputSchema, NotebaseRowUpdateManyInputSchema, NotebaseRowUpdateManyOutputSchema, NotebaseRowUpdateOutputSchema, NotebaseSetSleepInputSchema, NotebaseSetSleepOutputSchema, NotebaseUpdateInputSchema, NotebaseUpdateOutputSchema, PUBLIC_APP_ERROR_DEFS, SPEECH_DAILY_REQUEST_LIMITS, SPEECH_RATE_MAX, SPEECH_RATE_MIN, SPEECH_TEXT_MAX_LENGTH, SRS_REVIEW_CLIENT_ID_NAMESPACE, SRS_REVIEW_DURATION_MS_MAX, SpeechDailyLimitReachedDataSchema, activityStatsOutputSchema, appLocaleSchema, billingAccessSourceSchema, billingCancelScheduledChangeOutputSchema, billingCheckoutPlanSchema, billingCreateCheckoutSessionInputSchema, billingCreateCustomerPortalSessionInputSchema, billingCurrencySchema, billingIntervalSchema, billingLocaleSchema, billingPaymentDueSchema, billingPlanSchema, billingScheduledChangeSchema, billingSessionUrlOutputSchema, billingStatusSchema, billingSubscriptionStatusSchema, canonicalTimezoneSchema, cardSchema, cardStateSchema, cardTemplateSchema, contract, createSrsReviewClientId, defineAgentProcedure, deletionResultSchema, ebookCoverContentTypeSchema, ebookDeleteInputSchema, ebookDeleteOutputSchema, ebookDetailSchema, ebookFinalizeUploadInputSchema, ebookFinalizeUploadOutputSchema, ebookGetDownloadUrlInputSchema, ebookGetDownloadUrlOutputSchema, ebookGetInputSchema, ebookGetOutputSchema, ebookListInputSchema, ebookListItemSchema, ebookListOutputSchema, ebookPresignedUploadSchema, ebookQuotaSchema, ebookRenameDataSchema, ebookRenameInputSchema, ebookRenameOutputSchema, ebookRequestUploadInputSchema, ebookRequestUploadOutputSchema, ebookStatusSchema, ebookUpdateProgressDataSchema, ebookUpdateProgressInputSchema, ebookUpdateProgressOutputSchema, emailCategoryKeySchema, emailCategoryStateSchema, emailLinkTokenSchema, emailPreferencesByTokenStateSchema, emailPreferencesGetByTokenInputSchema, emailPreferencesGetInputSchema, emailPreferencesStateSchema, emailPreferencesUpdateByTokenInputSchema, emailPreferencesUpdateInputSchema, expectedUpdatedAtSchema, getPublicErrorDefinition, isPublicAppErrorCode, masteryGoalOutputSchema, masteryGoalTargetSchema, masteryGoalUpdateInputSchema, mcpConnectionListOutputSchema, mcpConnectionRevokeInputSchema, mcpConnectionRevokeOutputSchema, mcpConnectionSchema, notebaseActivityStatsItemSchema, notebaseActivityStatsOutputSchema, notebaseColumnCreateDataSchema, notebaseColumnSchema, notebaseColumnUpdateDataSchema, notebaseColumnWidthSchema, notebaseCreateDataSchema, notebaseRowCellsSchema, notebaseRowCreateDataSchema, notebaseRowGrowthStatsItemSchema, notebaseRowGrowthStatsOutputSchema, notebaseRowSchema, notebaseRowUpdateDataSchema, notebaseSchema, notebaseSummarySchema, notebaseUpdateDataSchema, notebaseViewConfigSchema, notebaseViewCreateDataSchema, notebaseViewFilterSchema, notebaseViewFiltersSchema, notebaseViewSchema, notebaseViewSortSchema, notebaseViewSortsSchema, notebaseViewTypeSchema, notebaseViewUpdateDataSchema, pageSchema, paginationShape, pickPublicErrorMap, renderedCardSchema, reviewRatingSchema, scheduleStatusSchema, schedulingParamsSchema, speechPreferencesSchema, speechPreferencesUpdateInputSchema, speechRateSchema, speechSynthesizeInputSchema, speechSynthesizeOutputSchema, speechVoiceGenderSchema, speechVoiceNameSchema, speechVoiceSchema, speechVoicesOutputSchema, srsAcknowledgeOptimizerResultsInputSchema, srsAcknowledgeOptimizerResultsOutputSchema, srsActivityStatsItemSchema, srsActivityStatsOutputSchema, srsListCardRevlogsInputSchema, srsListCardRevlogsOutputSchema, srsListUnreadOptimizerResultsInputSchema, srsListUnreadOptimizerResultsOutputSchema, srsManualCardStatusInputSchema, srsMemoryGrowthStatsItemSchema, srsMemoryGrowthStatsOutputSchema, srsOptimizerUnreadResultSchema, srsRecentNotebaseScheduleStatusStatsInputSchema, srsRecentNotebaseScheduleStatusStatsOutputSchema, srsReviewInputSchema, srsReviewOutputSchema, srsRevlogSchema, srsRevlogWithoutSnapshotSchema, srsRollbackReviewInputSchema, srsRollbackReviewOutputSchema, srsScheduleStatusStatsInputSchema, srsScheduleStatusStatsOutputSchema, srsScheduleStatusStatsSchema, srsSetCardBuriedInputSchema, srsSetCardBuriedOutputSchema, srsSetCardSuspendedInputSchema, srsSetCardSuspendedOutputSchema, srsTxidOutputSchema, statsInputSchema, stepSchema, timezoneSchema, userEnsureLocaleInputSchema, userEnsureLocaleOutputSchema, userEnsureTimezoneInputSchema, userEnsureTimezoneOutputSchema, userUpdateLocaleInputSchema, userUpdateLocaleOutputSchema, userUpdateTimezoneInputSchema, userUpdateTimezoneOutputSchema, videoTranscriptCreateInputSchema, videoTranscriptGetInputSchema, videoTranscriptResourceSchema, videoTranscriptStatusSchema, videoTranscriptSubtitlesSchema, videoTranscriptUsagePoolSchema, videoTranscriptUsageSchema };
2000
2188
 
2001
2189
  //# sourceMappingURL=index.js.map