founder-schema 0.3.0 → 0.5.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.
Files changed (106) hide show
  1. package/README.md +44 -16
  2. package/dist/access/access.d.ts +76 -0
  3. package/dist/access/access.d.ts.map +1 -0
  4. package/dist/access/access.js +66 -0
  5. package/dist/access/access.js.map +1 -0
  6. package/dist/access/permissions.d.ts +153 -0
  7. package/dist/access/permissions.d.ts.map +1 -0
  8. package/dist/access/permissions.js +80 -0
  9. package/dist/access/permissions.js.map +1 -0
  10. package/dist/access/roles.d.ts +71 -0
  11. package/dist/access/roles.d.ts.map +1 -0
  12. package/dist/access/roles.js +72 -0
  13. package/dist/access/roles.js.map +1 -0
  14. package/dist/chat.d.ts +4 -4
  15. package/dist/chat.d.ts.map +1 -1
  16. package/dist/chat.js +7 -2
  17. package/dist/chat.js.map +1 -1
  18. package/dist/core/common.d.ts +304 -0
  19. package/dist/core/common.d.ts.map +1 -0
  20. package/dist/core/common.js +340 -0
  21. package/dist/core/common.js.map +1 -0
  22. package/dist/core/errors.d.ts +117 -0
  23. package/dist/core/errors.d.ts.map +1 -0
  24. package/dist/core/errors.js +139 -0
  25. package/dist/core/errors.js.map +1 -0
  26. package/dist/core/limits.d.ts +122 -0
  27. package/dist/core/limits.d.ts.map +1 -0
  28. package/dist/core/limits.js +132 -0
  29. package/dist/core/limits.js.map +1 -0
  30. package/dist/core/responses.d.ts +207 -0
  31. package/dist/core/responses.d.ts.map +1 -0
  32. package/dist/core/responses.js +73 -0
  33. package/dist/core/responses.js.map +1 -0
  34. package/dist/core/validation.d.ts +146 -0
  35. package/dist/core/validation.d.ts.map +1 -0
  36. package/dist/core/validation.js +152 -0
  37. package/dist/core/validation.js.map +1 -0
  38. package/dist/domains/account/account.d.ts +42 -0
  39. package/dist/domains/account/account.d.ts.map +1 -0
  40. package/dist/domains/account/account.js +41 -0
  41. package/dist/domains/account/account.js.map +1 -0
  42. package/dist/domains/audit/audit.d.ts +169 -0
  43. package/dist/domains/audit/audit.d.ts.map +1 -0
  44. package/dist/domains/audit/audit.js +84 -0
  45. package/dist/domains/audit/audit.js.map +1 -0
  46. package/dist/domains/chat/chat.d.ts +187 -0
  47. package/dist/domains/chat/chat.d.ts.map +1 -0
  48. package/dist/domains/chat/chat.js +189 -0
  49. package/dist/domains/chat/chat.js.map +1 -0
  50. package/dist/domains/dashboard/dashboard.d.ts +48 -0
  51. package/dist/domains/dashboard/dashboard.d.ts.map +1 -0
  52. package/dist/domains/dashboard/dashboard.js +58 -0
  53. package/dist/domains/dashboard/dashboard.js.map +1 -0
  54. package/dist/domains/discover/discover.d.ts +245 -0
  55. package/dist/domains/discover/discover.d.ts.map +1 -0
  56. package/dist/domains/discover/discover.js +68 -0
  57. package/dist/domains/discover/discover.js.map +1 -0
  58. package/dist/domains/feed/feed.d.ts +1695 -0
  59. package/dist/domains/feed/feed.d.ts.map +1 -0
  60. package/dist/domains/feed/feed.js +626 -0
  61. package/dist/domains/feed/feed.js.map +1 -0
  62. package/dist/domains/media/media.d.ts +134 -0
  63. package/dist/domains/media/media.d.ts.map +1 -0
  64. package/dist/domains/media/media.js +110 -0
  65. package/dist/domains/media/media.js.map +1 -0
  66. package/dist/domains/members/members.d.ts +175 -0
  67. package/dist/domains/members/members.d.ts.map +1 -0
  68. package/dist/domains/members/members.js +106 -0
  69. package/dist/domains/members/members.js.map +1 -0
  70. package/dist/domains/moderation/moderation.d.ts +184 -0
  71. package/dist/domains/moderation/moderation.d.ts.map +1 -0
  72. package/dist/domains/moderation/moderation.js +90 -0
  73. package/dist/domains/moderation/moderation.js.map +1 -0
  74. package/dist/domains/onboarding/onboarding.d.ts +1018 -0
  75. package/dist/domains/onboarding/onboarding.d.ts.map +1 -0
  76. package/dist/domains/onboarding/onboarding.js +717 -0
  77. package/dist/domains/onboarding/onboarding.js.map +1 -0
  78. package/dist/domains/profile/founder-profile.d.ts +411 -0
  79. package/dist/domains/profile/founder-profile.d.ts.map +1 -0
  80. package/dist/domains/profile/founder-profile.js +202 -0
  81. package/dist/domains/profile/founder-profile.js.map +1 -0
  82. package/dist/domains/support/support.d.ts +305 -0
  83. package/dist/domains/support/support.d.ts.map +1 -0
  84. package/dist/domains/support/support.js +129 -0
  85. package/dist/domains/support/support.js.map +1 -0
  86. package/dist/domains/team/team.d.ts +79 -0
  87. package/dist/domains/team/team.d.ts.map +1 -0
  88. package/dist/domains/team/team.js +54 -0
  89. package/dist/domains/team/team.js.map +1 -0
  90. package/dist/domains/uploads/uploads.d.ts +101 -0
  91. package/dist/domains/uploads/uploads.d.ts.map +1 -0
  92. package/dist/domains/uploads/uploads.js +89 -0
  93. package/dist/domains/uploads/uploads.js.map +1 -0
  94. package/dist/env.d.ts +85 -0
  95. package/dist/env.d.ts.map +1 -0
  96. package/dist/env.js +150 -0
  97. package/dist/env.js.map +1 -0
  98. package/dist/index.d.ts +22 -12
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +32 -19
  101. package/dist/index.js.map +1 -1
  102. package/dist/onboarding.d.ts +58 -32
  103. package/dist/onboarding.d.ts.map +1 -1
  104. package/dist/onboarding.js +155 -32
  105. package/dist/onboarding.js.map +1 -1
  106. package/package.json +14 -2
@@ -0,0 +1,1695 @@
1
+ /**
2
+ * founder-schema — Feed wire shapes: post, poll, comment, reaction
3
+ *
4
+ * ADAPTED FROM `jansathi-community-schema`, NOT DEPENDENT ON IT.
5
+ *
6
+ * The user ruled on 2026-09-21 that Founder Circle is a standalone app, so
7
+ * these shapes are copied and cut down rather than imported. The reason is
8
+ * worth keeping: `jansathi-community-schema` encodes Jansathi's reach levels,
9
+ * community designations, official-area kinds and crowdfunding audiences.
10
+ * Depending on it would put all of that permanently inside our contract for a
11
+ * feed that has none of those concepts, and would mean a Jansathi publish can
12
+ * break this product.
13
+ *
14
+ * DELIBERATELY NOT PORTED, so nobody "restores" them:
15
+ * - the five civic verticals (lost_found, suggestions_complaints,
16
+ * donate_item, crowdfunding, event). `contentKind` here is post | poll
17
+ * only; comment threads and bookmarks key off it, and reactions and
18
+ * reports off the same union plus `comment`.
19
+ * - official communities, designations, identity verification badges.
20
+ * - social score, and the whole area-proximity ranking vocabulary
21
+ * (local / district / state / national / global).
22
+ * - `areaLineage` as a REQUIRED authorship snapshot. Jansathi gates its
23
+ * composer on a declared residence resolving to Indian district level or
24
+ * deeper; the user ruled location is never mandatory here, so nothing in
25
+ * this file requires one.
26
+ * - anonymous posting, which in Jansathi is gated on identity verification
27
+ * we do not have. A founders' network is an identified network.
28
+ *
29
+ * @module founder-schema/domains/feed
30
+ */
31
+ import { z } from 'zod';
32
+ /**
33
+ * Exported because the composer must count down to the SAME number the server
34
+ * rejects at. A client-side limit that disagrees with the server is a message
35
+ * a member cannot send and cannot see why.
36
+ */
37
+ export declare const POST_MAX_BODY_CHARS = 5000;
38
+ /**
39
+ * Total attachments on one post, images and videos together.
40
+ *
41
+ * ONE cap over ONE ordered list, rather than Jansathi's separate image and
42
+ * video arrays. A member who posts a screenshot, then a clip, then another
43
+ * screenshot means that order, and two parallel arrays cannot express it: the
44
+ * card would show both images and then the video, which is not what was
45
+ * written.
46
+ */
47
+ export declare const POST_MAX_MEDIA = 10;
48
+ /**
49
+ * Topics per item.
50
+ *
51
+ * Capped low on purpose: a post tagged with everything is about nothing, and
52
+ * one tagged with ten matches every member, which is how a relevance feature
53
+ * turns back into a chronological one.
54
+ */
55
+ export declare const MAX_TOPICS = 3;
56
+ export declare const COMMENT_MAX_BODY_CHARS = 2000;
57
+ export declare const POLL_QUESTION_MAX_CHARS = 280;
58
+ export declare const POLL_OPTION_MAX_CHARS = 80;
59
+ export declare const POLL_MIN_OPTIONS = 2;
60
+ export declare const POLL_MAX_OPTIONS = 6;
61
+ /** 5 minutes. Below this a poll closes before anyone sees it. */
62
+ export declare const POLL_MIN_DURATION_MS: number;
63
+ /** 30 days. */
64
+ export declare const POLL_MAX_DURATION_MS: number;
65
+ /**
66
+ * How long after writing it the author may still edit a post or a comment.
67
+ *
68
+ * A window rather than forever: an edit after people have reacted changes what
69
+ * they reacted to. Deletion has no window, because a member must always be able
70
+ * to remove their own words. The server is the gate (`EDIT_WINDOW_CLOSED`);
71
+ * a client uses this to stop offering Edit at the moment the server would
72
+ * start refusing it, instead of on the next reload.
73
+ */
74
+ export declare const EDIT_WINDOW_MS: number;
75
+ /**
76
+ * What can appear in the feed. Two kinds, not seven.
77
+ *
78
+ * Engagement is keyed by `(contentKind, contentId)` so one engagement bar
79
+ * serves both, and comments hang off the same pair. Adding a kind later is
80
+ * additive; the union is deliberately narrow now so the client never has to
81
+ * handle a kind this product does not have.
82
+ */
83
+ export declare const CONTENT_KIND_VALUES: readonly ["post", "poll"];
84
+ export declare const contentKindSchema: z.ZodEnum<{
85
+ post: "post";
86
+ poll: "poll";
87
+ }>;
88
+ export type ContentKind = z.infer<typeof contentKindSchema>;
89
+ /**
90
+ * What a reaction or a report can point at: a feed item, or a comment on one.
91
+ *
92
+ * Wider than `ContentKind` on purpose. A comment carries reaction counts and a
93
+ * viewer reaction, and a comment can be abusive, so both reach it. A bookmark
94
+ * and a comment thread cannot: they take `ContentKind`. Until 0.2.0 the
95
+ * reaction and report RESPONSES were typed `ContentKind` while the routes
96
+ * accepted comments, so every answer about a comment broke this contract.
97
+ */
98
+ export declare const ENGAGEMENT_TARGET_KIND_VALUES: readonly ["post", "poll", "comment"];
99
+ export declare const engagementTargetKindSchema: z.ZodEnum<{
100
+ post: "post";
101
+ poll: "poll";
102
+ comment: "comment";
103
+ }>;
104
+ export type EngagementTargetKind = z.infer<typeof engagementTargetKindSchema>;
105
+ /**
106
+ * Reactions. Jansathi's `support` is dropped: it exists for reacting to a
107
+ * civic complaint or a lost-and-found notice, which this feed does not carry.
108
+ *
109
+ * ⚠️ These values are stored per reaction row, so removing one orphans data.
110
+ * Append only.
111
+ */
112
+ export declare const REACTION_TYPE_VALUES: readonly ["like", "celebrate", "insightful", "curious"];
113
+ export declare const reactionTypeSchema: z.ZodEnum<{
114
+ like: "like";
115
+ celebrate: "celebrate";
116
+ insightful: "insightful";
117
+ curious: "curious";
118
+ }>;
119
+ export type ReactionType = z.infer<typeof reactionTypeSchema>;
120
+ /**
121
+ * Feed ordering.
122
+ *
123
+ * `new` is the default here, unlike Jansathi where `hot` leads. A hot ranking
124
+ * needs volume to be meaningful, and a brand-new network ranking a handful of
125
+ * posts by a blended score mostly hides the newest thing somebody just wrote.
126
+ * Revisit when there is enough content for `hot` to mean anything.
127
+ */
128
+ export declare const FEED_SORT_VALUES: readonly ["new", "top"];
129
+ export declare const feedSortSchema: z.ZodEnum<{
130
+ new: "new";
131
+ top: "top";
132
+ }>;
133
+ export type FeedSort = z.infer<typeof feedSortSchema>;
134
+ /**
135
+ * Counts keyed by reaction type, e.g. `{ like: 4, celebrate: 1 }`. Only the
136
+ * reactions an item actually has need appear.
137
+ *
138
+ * ⚠️ `partialRecord`, NOT `record`. In Zod 4 an enum-keyed `z.record` is
139
+ * EXHAUSTIVE: it demands every key, so `{ like: 4 }` fails with three missing
140
+ * keys and `{}` fails with four. That would force the server to ship a zero for
141
+ * every reaction on every item, and the day a fifth reaction is added every
142
+ * previously stored payload and every older client stops parsing.
143
+ * `partialRecord` keeps the key validation without the exhaustiveness, so an
144
+ * unknown key like Jansathi's `support` is still refused.
145
+ */
146
+ export declare const reactionCountsSchema: z.ZodRecord<z.ZodEnum<{
147
+ like: "like";
148
+ celebrate: "celebrate";
149
+ insightful: "insightful";
150
+ curious: "curious";
151
+ }> & z.core.$partial, z.ZodNumber>;
152
+ export type ReactionCounts = z.infer<typeof reactionCountsSchema>;
153
+ /**
154
+ * The author as a card renders them.
155
+ *
156
+ * Every field here is LIVE, joined against the profile at read time rather
157
+ * than frozen onto the post at write time. So a renamed handle, a new avatar
158
+ * or an edited headline updates on old posts, and the byline link always
159
+ * targets the current username instead of 404ing on a handle that moved.
160
+ *
161
+ * Jansathi additionally snapshots `localName` ("where the author was when
162
+ * posting"). Not ported: location is optional here, so a byline that depends
163
+ * on one would be blank for anyone who never set it.
164
+ */
165
+ export declare const feedAuthorSchema: z.ZodObject<{
166
+ userId: z.ZodString;
167
+ username: z.ZodString;
168
+ displayName: z.ZodString;
169
+ avatarUrl: z.ZodOptional<z.ZodURL>;
170
+ headline: z.ZodOptional<z.ZodString>;
171
+ }, z.core.$strip>;
172
+ export type FeedAuthor = z.infer<typeof feedAuthorSchema>;
173
+ /**
174
+ * A post's image: a processed `mediaImageSchema` (every stored size, ready for
175
+ * `srcset`, plus a placeholder) with the post's own alt text.
176
+ *
177
+ * `width` and `height` are required so a card can reserve the right box before
178
+ * the image loads. Without them every image arrival shifts the feed under the
179
+ * reader's thumb.
180
+ *
181
+ * `thumbnailUrl` is the smallest stored size, for a grid or a notification.
182
+ *
183
+ * URLs here come from our own upload pipeline, so they take a plain `z.url()`
184
+ * rather than `httpUrlSchema`. ⚠️ If a "paste an image link" path is ever
185
+ * added, these become member-supplied and must move to `httpUrlSchema`.
186
+ */
187
+ export declare const feedImageSchema: z.ZodObject<{
188
+ id: z.ZodString;
189
+ url: z.ZodURL;
190
+ width: z.ZodNumber;
191
+ height: z.ZodNumber;
192
+ variants: z.ZodArray<z.ZodObject<{
193
+ width: z.ZodNumber;
194
+ height: z.ZodNumber;
195
+ url: z.ZodURL;
196
+ }, z.core.$strip>>;
197
+ placeholder: z.ZodOptional<z.ZodString>;
198
+ kind: z.ZodLiteral<"image">;
199
+ thumbnailUrl: z.ZodOptional<z.ZodURL>;
200
+ alt: z.ZodOptional<z.ZodString>;
201
+ }, z.core.$strip>;
202
+ export type FeedImage = z.infer<typeof feedImageSchema>;
203
+ export declare const feedVideoSchema: z.ZodObject<{
204
+ kind: z.ZodLiteral<"video">;
205
+ url: z.ZodURL;
206
+ thumbnailUrl: z.ZodURL;
207
+ width: z.ZodNumber;
208
+ height: z.ZodNumber;
209
+ duration: z.ZodNumber;
210
+ }, z.core.$strip>;
211
+ export type FeedVideo = z.infer<typeof feedVideoSchema>;
212
+ /**
213
+ * One ordered list, discriminated on `kind`, so the carousel renders
214
+ * attachments in the order they were attached and can switch on the kind
215
+ * without inspecting fields.
216
+ */
217
+ export declare const feedMediaSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
218
+ id: z.ZodString;
219
+ url: z.ZodURL;
220
+ width: z.ZodNumber;
221
+ height: z.ZodNumber;
222
+ variants: z.ZodArray<z.ZodObject<{
223
+ width: z.ZodNumber;
224
+ height: z.ZodNumber;
225
+ url: z.ZodURL;
226
+ }, z.core.$strip>>;
227
+ placeholder: z.ZodOptional<z.ZodString>;
228
+ kind: z.ZodLiteral<"image">;
229
+ thumbnailUrl: z.ZodOptional<z.ZodURL>;
230
+ alt: z.ZodOptional<z.ZodString>;
231
+ }, z.core.$strip>, z.ZodObject<{
232
+ kind: z.ZodLiteral<"video">;
233
+ url: z.ZodURL;
234
+ thumbnailUrl: z.ZodURL;
235
+ width: z.ZodNumber;
236
+ height: z.ZodNumber;
237
+ duration: z.ZodNumber;
238
+ }, z.core.$strip>], "kind">;
239
+ export type FeedMedia = z.infer<typeof feedMediaSchema>;
240
+ /**
241
+ * Preview for the first link in a post body. Server-derived at write time and
242
+ * stored, never re-fetched at render: a card that fetches a third-party page
243
+ * per scroll leaks every reader's address to that site and blocks the feed on
244
+ * somebody else's latency.
245
+ *
246
+ * Both URLs take `safeUrlSchema`: the scheme and host rules, WITHOUT the
247
+ * typed-URL cap. `url` came out of a post body, which is already capped as a
248
+ * whole, and `imageUrl` is whatever the remote page advertised; a long CDN URL
249
+ * is ordinary, and one over `LINK_URL_MAX` would otherwise fail the whole feed
250
+ * page it sits on. Neither is ours, so a consumer still treats both as
251
+ * untrusted at render.
252
+ */
253
+ export declare const linkPreviewSchema: z.ZodObject<{
254
+ url: z.ZodURL;
255
+ title: z.ZodOptional<z.ZodString>;
256
+ description: z.ZodOptional<z.ZodString>;
257
+ imageUrl: z.ZodOptional<z.ZodURL>;
258
+ }, z.core.$strip>;
259
+ export type LinkPreview = z.infer<typeof linkPreviewSchema>;
260
+ /**
261
+ * What THIS viewer has done to this item, computed per request.
262
+ *
263
+ * Optional as a block, because an unauthenticated or server-rendered read has
264
+ * no viewer. ⚠️ A client must treat an absent `viewer` as "no state known",
265
+ * never as "has not reacted": rendering an empty reaction button off a missing
266
+ * block is how a member sees their own reaction disappear on reload.
267
+ */
268
+ export declare const viewerStateSchema: z.ZodObject<{
269
+ reaction: z.ZodNullable<z.ZodEnum<{
270
+ like: "like";
271
+ celebrate: "celebrate";
272
+ insightful: "insightful";
273
+ curious: "curious";
274
+ }>>;
275
+ bookmarked: z.ZodBoolean;
276
+ isAuthor: z.ZodBoolean;
277
+ canEdit: z.ZodBoolean;
278
+ canDelete: z.ZodBoolean;
279
+ canReport: z.ZodBoolean;
280
+ }, z.core.$strip>;
281
+ export type ViewerState = z.infer<typeof viewerStateSchema>;
282
+ /**
283
+ * A post as the feed and the single-post page receive it.
284
+ *
285
+ * Counts are denormalised onto the row so one document serves a whole card.
286
+ *
287
+ * No `score` and no up/down vote. Jansathi's signed score exists to rank civic
288
+ * content by community judgement, and a downvote arrow on a founder's first
289
+ * post is a different product. Reactions and comments are the engagement axes
290
+ * here. Adding a score later is additive; removing a visible downvote after
291
+ * members have used it is not.
292
+ */
293
+ export declare const feedPostSchema: z.ZodObject<{
294
+ id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
295
+ contentKind: z.ZodLiteral<"post">;
296
+ author: z.ZodObject<{
297
+ userId: z.ZodString;
298
+ username: z.ZodString;
299
+ displayName: z.ZodString;
300
+ avatarUrl: z.ZodOptional<z.ZodURL>;
301
+ headline: z.ZodOptional<z.ZodString>;
302
+ }, z.core.$strip>;
303
+ text: z.ZodString;
304
+ media: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
305
+ id: z.ZodString;
306
+ url: z.ZodURL;
307
+ width: z.ZodNumber;
308
+ height: z.ZodNumber;
309
+ variants: z.ZodArray<z.ZodObject<{
310
+ width: z.ZodNumber;
311
+ height: z.ZodNumber;
312
+ url: z.ZodURL;
313
+ }, z.core.$strip>>;
314
+ placeholder: z.ZodOptional<z.ZodString>;
315
+ kind: z.ZodLiteral<"image">;
316
+ thumbnailUrl: z.ZodOptional<z.ZodURL>;
317
+ alt: z.ZodOptional<z.ZodString>;
318
+ }, z.core.$strip>, z.ZodObject<{
319
+ kind: z.ZodLiteral<"video">;
320
+ url: z.ZodURL;
321
+ thumbnailUrl: z.ZodURL;
322
+ width: z.ZodNumber;
323
+ height: z.ZodNumber;
324
+ duration: z.ZodNumber;
325
+ }, z.core.$strip>], "kind">>;
326
+ linkPreview: z.ZodOptional<z.ZodObject<{
327
+ url: z.ZodURL;
328
+ title: z.ZodOptional<z.ZodString>;
329
+ description: z.ZodOptional<z.ZodString>;
330
+ imageUrl: z.ZodOptional<z.ZodURL>;
331
+ }, z.core.$strip>>;
332
+ topics: z.ZodArray<z.ZodEnum<{
333
+ ai_ml: "ai_ml";
334
+ b2b_saas: "b2b_saas";
335
+ d2c: "d2c";
336
+ deeptech: "deeptech";
337
+ robotics: "robotics";
338
+ growth: "growth";
339
+ sales: "sales";
340
+ marketing: "marketing";
341
+ supply_chain: "supply_chain";
342
+ fundraising: "fundraising";
343
+ mentoring: "mentoring";
344
+ leadership: "leadership";
345
+ networking: "networking";
346
+ public_speaking: "public_speaking";
347
+ teaching: "teaching";
348
+ hiring_talent: "hiring_talent";
349
+ personal_branding: "personal_branding";
350
+ career_transition: "career_transition";
351
+ remote_work: "remote_work";
352
+ blockchain: "blockchain";
353
+ crypto_web3: "crypto_web3";
354
+ data_science: "data_science";
355
+ cybersecurity: "cybersecurity";
356
+ game_dev: "game_dev";
357
+ ux_design: "ux_design";
358
+ app_development: "app_development";
359
+ open_source: "open_source";
360
+ electronics: "electronics";
361
+ space_exploration: "space_exploration";
362
+ green_tech: "green_tech";
363
+ no_code: "no_code";
364
+ entrepreneurship: "entrepreneurship";
365
+ investing: "investing";
366
+ stock_trading: "stock_trading";
367
+ personal_finance: "personal_finance";
368
+ consulting: "consulting";
369
+ ecommerce: "ecommerce";
370
+ retail: "retail";
371
+ real_estate: "real_estate";
372
+ product_management: "product_management";
373
+ meditation: "meditation";
374
+ journaling: "journaling";
375
+ self_improvement: "self_improvement";
376
+ productivity: "productivity";
377
+ reading: "reading";
378
+ online_courses: "online_courses";
379
+ philosophy: "philosophy";
380
+ psychology: "psychology";
381
+ therapy: "therapy";
382
+ sleep_optimization: "sleep_optimization";
383
+ gym: "gym";
384
+ yoga: "yoga";
385
+ photography: "photography";
386
+ writing: "writing";
387
+ graphic_design: "graphic_design";
388
+ filmmaking: "filmmaking";
389
+ digital_art: "digital_art";
390
+ content_creation: "content_creation";
391
+ blogging: "blogging";
392
+ vlogging: "vlogging";
393
+ podcasts: "podcasts";
394
+ animation: "animation";
395
+ music_production: "music_production";
396
+ volunteering: "volunteering";
397
+ ngo_work: "ngo_work";
398
+ environmental: "environmental";
399
+ women_empowerment: "women_empowerment";
400
+ community_service: "community_service";
401
+ social_enterprise: "social_enterprise";
402
+ education_access: "education_access";
403
+ }>>;
404
+ commentCount: z.ZodNumber;
405
+ reactionCounts: z.ZodRecord<z.ZodEnum<{
406
+ like: "like";
407
+ celebrate: "celebrate";
408
+ insightful: "insightful";
409
+ curious: "curious";
410
+ }> & z.core.$partial, z.ZodNumber>;
411
+ createdAt: z.ZodISODateTime;
412
+ editedAt: z.ZodNullable<z.ZodISODateTime>;
413
+ viewer: z.ZodOptional<z.ZodObject<{
414
+ reaction: z.ZodNullable<z.ZodEnum<{
415
+ like: "like";
416
+ celebrate: "celebrate";
417
+ insightful: "insightful";
418
+ curious: "curious";
419
+ }>>;
420
+ bookmarked: z.ZodBoolean;
421
+ isAuthor: z.ZodBoolean;
422
+ canEdit: z.ZodBoolean;
423
+ canDelete: z.ZodBoolean;
424
+ canReport: z.ZodBoolean;
425
+ }, z.core.$strip>>;
426
+ }, z.core.$strip>;
427
+ export type FeedPost = z.infer<typeof feedPostSchema>;
428
+ /**
429
+ * One choice. `index` is the identifier a vote refers to, not the label:
430
+ * sending indices avoids ambiguity between two options whose labels differ
431
+ * only by case, spacing or an invisible character.
432
+ */
433
+ export declare const pollOptionSchema: z.ZodObject<{
434
+ index: z.ZodNumber;
435
+ label: z.ZodString;
436
+ voteCount: z.ZodNumber;
437
+ }, z.core.$strip>;
438
+ export type PollOption = z.infer<typeof pollOptionSchema>;
439
+ /**
440
+ * A poll. Its own kind, not a post with extra fields, because votes are their
441
+ * own records keyed by (poll, voter) and a post has nothing equivalent.
442
+ *
443
+ * Polls are not editable. Changing a question or an option after a vote has
444
+ * been cast silently re-purposes that vote. Closing early is allowed; editing
445
+ * is not.
446
+ */
447
+ export declare const feedPollSchema: z.ZodObject<{
448
+ id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
449
+ contentKind: z.ZodLiteral<"poll">;
450
+ author: z.ZodObject<{
451
+ userId: z.ZodString;
452
+ username: z.ZodString;
453
+ displayName: z.ZodString;
454
+ avatarUrl: z.ZodOptional<z.ZodURL>;
455
+ headline: z.ZodOptional<z.ZodString>;
456
+ }, z.core.$strip>;
457
+ question: z.ZodString;
458
+ options: z.ZodArray<z.ZodObject<{
459
+ index: z.ZodNumber;
460
+ label: z.ZodString;
461
+ voteCount: z.ZodNumber;
462
+ }, z.core.$strip>>;
463
+ totalVoters: z.ZodNumber;
464
+ allowsMultipleChoices: z.ZodBoolean;
465
+ closesAt: z.ZodISODateTime;
466
+ isClosed: z.ZodBoolean;
467
+ topics: z.ZodArray<z.ZodEnum<{
468
+ ai_ml: "ai_ml";
469
+ b2b_saas: "b2b_saas";
470
+ d2c: "d2c";
471
+ deeptech: "deeptech";
472
+ robotics: "robotics";
473
+ growth: "growth";
474
+ sales: "sales";
475
+ marketing: "marketing";
476
+ supply_chain: "supply_chain";
477
+ fundraising: "fundraising";
478
+ mentoring: "mentoring";
479
+ leadership: "leadership";
480
+ networking: "networking";
481
+ public_speaking: "public_speaking";
482
+ teaching: "teaching";
483
+ hiring_talent: "hiring_talent";
484
+ personal_branding: "personal_branding";
485
+ career_transition: "career_transition";
486
+ remote_work: "remote_work";
487
+ blockchain: "blockchain";
488
+ crypto_web3: "crypto_web3";
489
+ data_science: "data_science";
490
+ cybersecurity: "cybersecurity";
491
+ game_dev: "game_dev";
492
+ ux_design: "ux_design";
493
+ app_development: "app_development";
494
+ open_source: "open_source";
495
+ electronics: "electronics";
496
+ space_exploration: "space_exploration";
497
+ green_tech: "green_tech";
498
+ no_code: "no_code";
499
+ entrepreneurship: "entrepreneurship";
500
+ investing: "investing";
501
+ stock_trading: "stock_trading";
502
+ personal_finance: "personal_finance";
503
+ consulting: "consulting";
504
+ ecommerce: "ecommerce";
505
+ retail: "retail";
506
+ real_estate: "real_estate";
507
+ product_management: "product_management";
508
+ meditation: "meditation";
509
+ journaling: "journaling";
510
+ self_improvement: "self_improvement";
511
+ productivity: "productivity";
512
+ reading: "reading";
513
+ online_courses: "online_courses";
514
+ philosophy: "philosophy";
515
+ psychology: "psychology";
516
+ therapy: "therapy";
517
+ sleep_optimization: "sleep_optimization";
518
+ gym: "gym";
519
+ yoga: "yoga";
520
+ photography: "photography";
521
+ writing: "writing";
522
+ graphic_design: "graphic_design";
523
+ filmmaking: "filmmaking";
524
+ digital_art: "digital_art";
525
+ content_creation: "content_creation";
526
+ blogging: "blogging";
527
+ vlogging: "vlogging";
528
+ podcasts: "podcasts";
529
+ animation: "animation";
530
+ music_production: "music_production";
531
+ volunteering: "volunteering";
532
+ ngo_work: "ngo_work";
533
+ environmental: "environmental";
534
+ women_empowerment: "women_empowerment";
535
+ community_service: "community_service";
536
+ social_enterprise: "social_enterprise";
537
+ education_access: "education_access";
538
+ }>>;
539
+ commentCount: z.ZodNumber;
540
+ reactionCounts: z.ZodRecord<z.ZodEnum<{
541
+ like: "like";
542
+ celebrate: "celebrate";
543
+ insightful: "insightful";
544
+ curious: "curious";
545
+ }> & z.core.$partial, z.ZodNumber>;
546
+ createdAt: z.ZodISODateTime;
547
+ editedAt: z.ZodNullable<z.ZodISODateTime>;
548
+ viewer: z.ZodOptional<z.ZodObject<{
549
+ reaction: z.ZodNullable<z.ZodEnum<{
550
+ like: "like";
551
+ celebrate: "celebrate";
552
+ insightful: "insightful";
553
+ curious: "curious";
554
+ }>>;
555
+ bookmarked: z.ZodBoolean;
556
+ isAuthor: z.ZodBoolean;
557
+ canEdit: z.ZodBoolean;
558
+ canDelete: z.ZodBoolean;
559
+ canReport: z.ZodBoolean;
560
+ votedOptionIndices: z.ZodArray<z.ZodNumber>;
561
+ }, z.core.$strip>>;
562
+ }, z.core.$strip>;
563
+ export type FeedPoll = z.infer<typeof feedPollSchema>;
564
+ /**
565
+ * Discriminated on `contentKind`, so a client narrows with a switch and the
566
+ * compiler catches an unhandled kind the day one is added. A plain union would
567
+ * need every field checked by hand and would silently accept a hybrid.
568
+ */
569
+ export declare const feedItemSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
570
+ id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
571
+ contentKind: z.ZodLiteral<"post">;
572
+ author: z.ZodObject<{
573
+ userId: z.ZodString;
574
+ username: z.ZodString;
575
+ displayName: z.ZodString;
576
+ avatarUrl: z.ZodOptional<z.ZodURL>;
577
+ headline: z.ZodOptional<z.ZodString>;
578
+ }, z.core.$strip>;
579
+ text: z.ZodString;
580
+ media: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
581
+ id: z.ZodString;
582
+ url: z.ZodURL;
583
+ width: z.ZodNumber;
584
+ height: z.ZodNumber;
585
+ variants: z.ZodArray<z.ZodObject<{
586
+ width: z.ZodNumber;
587
+ height: z.ZodNumber;
588
+ url: z.ZodURL;
589
+ }, z.core.$strip>>;
590
+ placeholder: z.ZodOptional<z.ZodString>;
591
+ kind: z.ZodLiteral<"image">;
592
+ thumbnailUrl: z.ZodOptional<z.ZodURL>;
593
+ alt: z.ZodOptional<z.ZodString>;
594
+ }, z.core.$strip>, z.ZodObject<{
595
+ kind: z.ZodLiteral<"video">;
596
+ url: z.ZodURL;
597
+ thumbnailUrl: z.ZodURL;
598
+ width: z.ZodNumber;
599
+ height: z.ZodNumber;
600
+ duration: z.ZodNumber;
601
+ }, z.core.$strip>], "kind">>;
602
+ linkPreview: z.ZodOptional<z.ZodObject<{
603
+ url: z.ZodURL;
604
+ title: z.ZodOptional<z.ZodString>;
605
+ description: z.ZodOptional<z.ZodString>;
606
+ imageUrl: z.ZodOptional<z.ZodURL>;
607
+ }, z.core.$strip>>;
608
+ topics: z.ZodArray<z.ZodEnum<{
609
+ ai_ml: "ai_ml";
610
+ b2b_saas: "b2b_saas";
611
+ d2c: "d2c";
612
+ deeptech: "deeptech";
613
+ robotics: "robotics";
614
+ growth: "growth";
615
+ sales: "sales";
616
+ marketing: "marketing";
617
+ supply_chain: "supply_chain";
618
+ fundraising: "fundraising";
619
+ mentoring: "mentoring";
620
+ leadership: "leadership";
621
+ networking: "networking";
622
+ public_speaking: "public_speaking";
623
+ teaching: "teaching";
624
+ hiring_talent: "hiring_talent";
625
+ personal_branding: "personal_branding";
626
+ career_transition: "career_transition";
627
+ remote_work: "remote_work";
628
+ blockchain: "blockchain";
629
+ crypto_web3: "crypto_web3";
630
+ data_science: "data_science";
631
+ cybersecurity: "cybersecurity";
632
+ game_dev: "game_dev";
633
+ ux_design: "ux_design";
634
+ app_development: "app_development";
635
+ open_source: "open_source";
636
+ electronics: "electronics";
637
+ space_exploration: "space_exploration";
638
+ green_tech: "green_tech";
639
+ no_code: "no_code";
640
+ entrepreneurship: "entrepreneurship";
641
+ investing: "investing";
642
+ stock_trading: "stock_trading";
643
+ personal_finance: "personal_finance";
644
+ consulting: "consulting";
645
+ ecommerce: "ecommerce";
646
+ retail: "retail";
647
+ real_estate: "real_estate";
648
+ product_management: "product_management";
649
+ meditation: "meditation";
650
+ journaling: "journaling";
651
+ self_improvement: "self_improvement";
652
+ productivity: "productivity";
653
+ reading: "reading";
654
+ online_courses: "online_courses";
655
+ philosophy: "philosophy";
656
+ psychology: "psychology";
657
+ therapy: "therapy";
658
+ sleep_optimization: "sleep_optimization";
659
+ gym: "gym";
660
+ yoga: "yoga";
661
+ photography: "photography";
662
+ writing: "writing";
663
+ graphic_design: "graphic_design";
664
+ filmmaking: "filmmaking";
665
+ digital_art: "digital_art";
666
+ content_creation: "content_creation";
667
+ blogging: "blogging";
668
+ vlogging: "vlogging";
669
+ podcasts: "podcasts";
670
+ animation: "animation";
671
+ music_production: "music_production";
672
+ volunteering: "volunteering";
673
+ ngo_work: "ngo_work";
674
+ environmental: "environmental";
675
+ women_empowerment: "women_empowerment";
676
+ community_service: "community_service";
677
+ social_enterprise: "social_enterprise";
678
+ education_access: "education_access";
679
+ }>>;
680
+ commentCount: z.ZodNumber;
681
+ reactionCounts: z.ZodRecord<z.ZodEnum<{
682
+ like: "like";
683
+ celebrate: "celebrate";
684
+ insightful: "insightful";
685
+ curious: "curious";
686
+ }> & z.core.$partial, z.ZodNumber>;
687
+ createdAt: z.ZodISODateTime;
688
+ editedAt: z.ZodNullable<z.ZodISODateTime>;
689
+ viewer: z.ZodOptional<z.ZodObject<{
690
+ reaction: z.ZodNullable<z.ZodEnum<{
691
+ like: "like";
692
+ celebrate: "celebrate";
693
+ insightful: "insightful";
694
+ curious: "curious";
695
+ }>>;
696
+ bookmarked: z.ZodBoolean;
697
+ isAuthor: z.ZodBoolean;
698
+ canEdit: z.ZodBoolean;
699
+ canDelete: z.ZodBoolean;
700
+ canReport: z.ZodBoolean;
701
+ }, z.core.$strip>>;
702
+ }, z.core.$strip>, z.ZodObject<{
703
+ id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
704
+ contentKind: z.ZodLiteral<"poll">;
705
+ author: z.ZodObject<{
706
+ userId: z.ZodString;
707
+ username: z.ZodString;
708
+ displayName: z.ZodString;
709
+ avatarUrl: z.ZodOptional<z.ZodURL>;
710
+ headline: z.ZodOptional<z.ZodString>;
711
+ }, z.core.$strip>;
712
+ question: z.ZodString;
713
+ options: z.ZodArray<z.ZodObject<{
714
+ index: z.ZodNumber;
715
+ label: z.ZodString;
716
+ voteCount: z.ZodNumber;
717
+ }, z.core.$strip>>;
718
+ totalVoters: z.ZodNumber;
719
+ allowsMultipleChoices: z.ZodBoolean;
720
+ closesAt: z.ZodISODateTime;
721
+ isClosed: z.ZodBoolean;
722
+ topics: z.ZodArray<z.ZodEnum<{
723
+ ai_ml: "ai_ml";
724
+ b2b_saas: "b2b_saas";
725
+ d2c: "d2c";
726
+ deeptech: "deeptech";
727
+ robotics: "robotics";
728
+ growth: "growth";
729
+ sales: "sales";
730
+ marketing: "marketing";
731
+ supply_chain: "supply_chain";
732
+ fundraising: "fundraising";
733
+ mentoring: "mentoring";
734
+ leadership: "leadership";
735
+ networking: "networking";
736
+ public_speaking: "public_speaking";
737
+ teaching: "teaching";
738
+ hiring_talent: "hiring_talent";
739
+ personal_branding: "personal_branding";
740
+ career_transition: "career_transition";
741
+ remote_work: "remote_work";
742
+ blockchain: "blockchain";
743
+ crypto_web3: "crypto_web3";
744
+ data_science: "data_science";
745
+ cybersecurity: "cybersecurity";
746
+ game_dev: "game_dev";
747
+ ux_design: "ux_design";
748
+ app_development: "app_development";
749
+ open_source: "open_source";
750
+ electronics: "electronics";
751
+ space_exploration: "space_exploration";
752
+ green_tech: "green_tech";
753
+ no_code: "no_code";
754
+ entrepreneurship: "entrepreneurship";
755
+ investing: "investing";
756
+ stock_trading: "stock_trading";
757
+ personal_finance: "personal_finance";
758
+ consulting: "consulting";
759
+ ecommerce: "ecommerce";
760
+ retail: "retail";
761
+ real_estate: "real_estate";
762
+ product_management: "product_management";
763
+ meditation: "meditation";
764
+ journaling: "journaling";
765
+ self_improvement: "self_improvement";
766
+ productivity: "productivity";
767
+ reading: "reading";
768
+ online_courses: "online_courses";
769
+ philosophy: "philosophy";
770
+ psychology: "psychology";
771
+ therapy: "therapy";
772
+ sleep_optimization: "sleep_optimization";
773
+ gym: "gym";
774
+ yoga: "yoga";
775
+ photography: "photography";
776
+ writing: "writing";
777
+ graphic_design: "graphic_design";
778
+ filmmaking: "filmmaking";
779
+ digital_art: "digital_art";
780
+ content_creation: "content_creation";
781
+ blogging: "blogging";
782
+ vlogging: "vlogging";
783
+ podcasts: "podcasts";
784
+ animation: "animation";
785
+ music_production: "music_production";
786
+ volunteering: "volunteering";
787
+ ngo_work: "ngo_work";
788
+ environmental: "environmental";
789
+ women_empowerment: "women_empowerment";
790
+ community_service: "community_service";
791
+ social_enterprise: "social_enterprise";
792
+ education_access: "education_access";
793
+ }>>;
794
+ commentCount: z.ZodNumber;
795
+ reactionCounts: z.ZodRecord<z.ZodEnum<{
796
+ like: "like";
797
+ celebrate: "celebrate";
798
+ insightful: "insightful";
799
+ curious: "curious";
800
+ }> & z.core.$partial, z.ZodNumber>;
801
+ createdAt: z.ZodISODateTime;
802
+ editedAt: z.ZodNullable<z.ZodISODateTime>;
803
+ viewer: z.ZodOptional<z.ZodObject<{
804
+ reaction: z.ZodNullable<z.ZodEnum<{
805
+ like: "like";
806
+ celebrate: "celebrate";
807
+ insightful: "insightful";
808
+ curious: "curious";
809
+ }>>;
810
+ bookmarked: z.ZodBoolean;
811
+ isAuthor: z.ZodBoolean;
812
+ canEdit: z.ZodBoolean;
813
+ canDelete: z.ZodBoolean;
814
+ canReport: z.ZodBoolean;
815
+ votedOptionIndices: z.ZodArray<z.ZodNumber>;
816
+ }, z.core.$strip>>;
817
+ }, z.core.$strip>], "contentKind">;
818
+ export type FeedItem = z.infer<typeof feedItemSchema>;
819
+ /**
820
+ * A comment, one level of nesting only: a reply to a comment is allowed, a
821
+ * reply to a reply is not. Two levels stay readable on a phone; three do not,
822
+ * and the server is what enforces it.
823
+ */
824
+ export declare const feedCommentSchema: z.ZodObject<{
825
+ id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
826
+ contentKind: z.ZodEnum<{
827
+ post: "post";
828
+ poll: "poll";
829
+ }>;
830
+ contentId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
831
+ parentCommentId: z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
832
+ author: z.ZodObject<{
833
+ userId: z.ZodString;
834
+ username: z.ZodString;
835
+ displayName: z.ZodString;
836
+ avatarUrl: z.ZodOptional<z.ZodURL>;
837
+ headline: z.ZodOptional<z.ZodString>;
838
+ }, z.core.$strip>;
839
+ text: z.ZodString;
840
+ replyCount: z.ZodNumber;
841
+ reactionCounts: z.ZodRecord<z.ZodEnum<{
842
+ like: "like";
843
+ celebrate: "celebrate";
844
+ insightful: "insightful";
845
+ curious: "curious";
846
+ }> & z.core.$partial, z.ZodNumber>;
847
+ createdAt: z.ZodISODateTime;
848
+ editedAt: z.ZodNullable<z.ZodISODateTime>;
849
+ viewer: z.ZodOptional<z.ZodObject<{
850
+ reaction: z.ZodNullable<z.ZodEnum<{
851
+ like: "like";
852
+ celebrate: "celebrate";
853
+ insightful: "insightful";
854
+ curious: "curious";
855
+ }>>;
856
+ isAuthor: z.ZodBoolean;
857
+ canEdit: z.ZodBoolean;
858
+ canDelete: z.ZodBoolean;
859
+ canReport: z.ZodBoolean;
860
+ }, z.core.$strip>>;
861
+ }, z.core.$strip>;
862
+ export type FeedComment = z.infer<typeof feedCommentSchema>;
863
+ /**
864
+ * `GET /api/v1/feed`. Inherits `limit` and `cursor`, which already tolerate an
865
+ * emptied control rather than answering 400.
866
+ *
867
+ * `interests=true` narrows to the viewer's topics (falling back to the plain
868
+ * feed when they have none). `z.stringbool`, so `true`/`false`/`1`/`0` all
869
+ * read as a person means them; until 0.2.0 the backend read this parameter
870
+ * raw, outside the schema, and only the exact string `true` counted.
871
+ *
872
+ * ⚠ NO `authorId`. It was accepted here and then ignored by the server, so a
873
+ * profile page asking for one founder's posts silently got everybody's. A
874
+ * member's own posts are `GET /api/v1/feed/by-author/:userId`.
875
+ */
876
+ export declare const feedQuerySchema: z.ZodObject<{
877
+ limit: z.ZodPreprocess<z.ZodDefault<z.ZodCoercedNumber<unknown>>, unknown>;
878
+ cursor: z.ZodOptional<z.ZodString>;
879
+ sort: z.ZodPreprocess<z.ZodDefault<z.ZodEnum<{
880
+ new: "new";
881
+ top: "top";
882
+ }>>, unknown>;
883
+ interests: z.ZodPreprocess<z.ZodDefault<z.ZodCodec<z.ZodString, z.ZodBoolean>>, unknown>;
884
+ }, z.core.$strip>;
885
+ export type FeedQuery = z.infer<typeof feedQuerySchema>;
886
+ export type FeedQueryInput = z.input<typeof feedQuerySchema>;
887
+ /** `GET /api/v1/feed/:contentKind/:contentId/comments`. */
888
+ export declare const commentsQuerySchema: z.ZodObject<{
889
+ limit: z.ZodPreprocess<z.ZodDefault<z.ZodCoercedNumber<unknown>>, unknown>;
890
+ cursor: z.ZodOptional<z.ZodString>;
891
+ parentCommentId: z.ZodPreprocess<z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>, unknown>;
892
+ }, z.core.$strip>;
893
+ export type CommentsQuery = z.infer<typeof commentsQuerySchema>;
894
+ export type CommentsQueryInput = z.input<typeof commentsQuerySchema>;
895
+ /**
896
+ * Every id and kind in a feed URL, as a schema, so a bad one answers exactly
897
+ * as a bad body field does: 400 `VALIDATION_ERROR`, the issue at
898
+ * `location: 'params'`. Until 0.2.0 these were hand checks that answered
899
+ * "Invalid id." with no issues at all, and the comment routes never looked at
900
+ * `:contentKind`.
901
+ */
902
+ /** `GET /feed/:id`, the permalink. */
903
+ export declare const feedItemParamsSchema: z.ZodObject<{
904
+ id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
905
+ }, z.core.$strip>;
906
+ /** `PATCH|DELETE /feed/:contentId`. */
907
+ export declare const contentParamsSchema: z.ZodObject<{
908
+ contentId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
909
+ }, z.core.$strip>;
910
+ /** A bookmark and a comment thread: a post or a poll. */
911
+ export declare const contentTargetParamsSchema: z.ZodObject<{
912
+ contentKind: z.ZodEnum<{
913
+ post: "post";
914
+ poll: "poll";
915
+ }>;
916
+ contentId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
917
+ }, z.core.$strip>;
918
+ /** A reaction and a report: a post, a poll or a comment. */
919
+ export declare const engagementTargetParamsSchema: z.ZodObject<{
920
+ contentKind: z.ZodEnum<{
921
+ post: "post";
922
+ poll: "poll";
923
+ comment: "comment";
924
+ }>;
925
+ contentId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
926
+ }, z.core.$strip>;
927
+ /** `POST|DELETE /feed/poll/:pollId/vote`. */
928
+ export declare const pollParamsSchema: z.ZodObject<{
929
+ pollId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
930
+ }, z.core.$strip>;
931
+ /** `DELETE /feed/comments/:commentId`. */
932
+ export declare const commentParamsSchema: z.ZodObject<{
933
+ commentId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
934
+ }, z.core.$strip>;
935
+ /** `GET /feed/by-author/:userId`. */
936
+ export declare const authorParamsSchema: z.ZodObject<{
937
+ userId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
938
+ }, z.core.$strip>;
939
+ export type FeedItemParams = z.infer<typeof feedItemParamsSchema>;
940
+ export type ContentParams = z.infer<typeof contentParamsSchema>;
941
+ export type ContentTargetParams = z.infer<typeof contentTargetParamsSchema>;
942
+ export type EngagementTargetParams = z.infer<typeof engagementTargetParamsSchema>;
943
+ export type PollParams = z.infer<typeof pollParamsSchema>;
944
+ export type CommentParams = z.infer<typeof commentParamsSchema>;
945
+ export type AuthorParams = z.infer<typeof authorParamsSchema>;
946
+ /**
947
+ * A page of the feed, and of one member's posts (`by-author`), which is the
948
+ * same shape. `nextCursor` is null on the last page.
949
+ */
950
+ export declare const feedPageSchema: z.ZodObject<{
951
+ items: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
952
+ id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
953
+ contentKind: z.ZodLiteral<"post">;
954
+ author: z.ZodObject<{
955
+ userId: z.ZodString;
956
+ username: z.ZodString;
957
+ displayName: z.ZodString;
958
+ avatarUrl: z.ZodOptional<z.ZodURL>;
959
+ headline: z.ZodOptional<z.ZodString>;
960
+ }, z.core.$strip>;
961
+ text: z.ZodString;
962
+ media: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
963
+ id: z.ZodString;
964
+ url: z.ZodURL;
965
+ width: z.ZodNumber;
966
+ height: z.ZodNumber;
967
+ variants: z.ZodArray<z.ZodObject<{
968
+ width: z.ZodNumber;
969
+ height: z.ZodNumber;
970
+ url: z.ZodURL;
971
+ }, z.core.$strip>>;
972
+ placeholder: z.ZodOptional<z.ZodString>;
973
+ kind: z.ZodLiteral<"image">;
974
+ thumbnailUrl: z.ZodOptional<z.ZodURL>;
975
+ alt: z.ZodOptional<z.ZodString>;
976
+ }, z.core.$strip>, z.ZodObject<{
977
+ kind: z.ZodLiteral<"video">;
978
+ url: z.ZodURL;
979
+ thumbnailUrl: z.ZodURL;
980
+ width: z.ZodNumber;
981
+ height: z.ZodNumber;
982
+ duration: z.ZodNumber;
983
+ }, z.core.$strip>], "kind">>;
984
+ linkPreview: z.ZodOptional<z.ZodObject<{
985
+ url: z.ZodURL;
986
+ title: z.ZodOptional<z.ZodString>;
987
+ description: z.ZodOptional<z.ZodString>;
988
+ imageUrl: z.ZodOptional<z.ZodURL>;
989
+ }, z.core.$strip>>;
990
+ topics: z.ZodArray<z.ZodEnum<{
991
+ ai_ml: "ai_ml";
992
+ b2b_saas: "b2b_saas";
993
+ d2c: "d2c";
994
+ deeptech: "deeptech";
995
+ robotics: "robotics";
996
+ growth: "growth";
997
+ sales: "sales";
998
+ marketing: "marketing";
999
+ supply_chain: "supply_chain";
1000
+ fundraising: "fundraising";
1001
+ mentoring: "mentoring";
1002
+ leadership: "leadership";
1003
+ networking: "networking";
1004
+ public_speaking: "public_speaking";
1005
+ teaching: "teaching";
1006
+ hiring_talent: "hiring_talent";
1007
+ personal_branding: "personal_branding";
1008
+ career_transition: "career_transition";
1009
+ remote_work: "remote_work";
1010
+ blockchain: "blockchain";
1011
+ crypto_web3: "crypto_web3";
1012
+ data_science: "data_science";
1013
+ cybersecurity: "cybersecurity";
1014
+ game_dev: "game_dev";
1015
+ ux_design: "ux_design";
1016
+ app_development: "app_development";
1017
+ open_source: "open_source";
1018
+ electronics: "electronics";
1019
+ space_exploration: "space_exploration";
1020
+ green_tech: "green_tech";
1021
+ no_code: "no_code";
1022
+ entrepreneurship: "entrepreneurship";
1023
+ investing: "investing";
1024
+ stock_trading: "stock_trading";
1025
+ personal_finance: "personal_finance";
1026
+ consulting: "consulting";
1027
+ ecommerce: "ecommerce";
1028
+ retail: "retail";
1029
+ real_estate: "real_estate";
1030
+ product_management: "product_management";
1031
+ meditation: "meditation";
1032
+ journaling: "journaling";
1033
+ self_improvement: "self_improvement";
1034
+ productivity: "productivity";
1035
+ reading: "reading";
1036
+ online_courses: "online_courses";
1037
+ philosophy: "philosophy";
1038
+ psychology: "psychology";
1039
+ therapy: "therapy";
1040
+ sleep_optimization: "sleep_optimization";
1041
+ gym: "gym";
1042
+ yoga: "yoga";
1043
+ photography: "photography";
1044
+ writing: "writing";
1045
+ graphic_design: "graphic_design";
1046
+ filmmaking: "filmmaking";
1047
+ digital_art: "digital_art";
1048
+ content_creation: "content_creation";
1049
+ blogging: "blogging";
1050
+ vlogging: "vlogging";
1051
+ podcasts: "podcasts";
1052
+ animation: "animation";
1053
+ music_production: "music_production";
1054
+ volunteering: "volunteering";
1055
+ ngo_work: "ngo_work";
1056
+ environmental: "environmental";
1057
+ women_empowerment: "women_empowerment";
1058
+ community_service: "community_service";
1059
+ social_enterprise: "social_enterprise";
1060
+ education_access: "education_access";
1061
+ }>>;
1062
+ commentCount: z.ZodNumber;
1063
+ reactionCounts: z.ZodRecord<z.ZodEnum<{
1064
+ like: "like";
1065
+ celebrate: "celebrate";
1066
+ insightful: "insightful";
1067
+ curious: "curious";
1068
+ }> & z.core.$partial, z.ZodNumber>;
1069
+ createdAt: z.ZodISODateTime;
1070
+ editedAt: z.ZodNullable<z.ZodISODateTime>;
1071
+ viewer: z.ZodOptional<z.ZodObject<{
1072
+ reaction: z.ZodNullable<z.ZodEnum<{
1073
+ like: "like";
1074
+ celebrate: "celebrate";
1075
+ insightful: "insightful";
1076
+ curious: "curious";
1077
+ }>>;
1078
+ bookmarked: z.ZodBoolean;
1079
+ isAuthor: z.ZodBoolean;
1080
+ canEdit: z.ZodBoolean;
1081
+ canDelete: z.ZodBoolean;
1082
+ canReport: z.ZodBoolean;
1083
+ }, z.core.$strip>>;
1084
+ }, z.core.$strip>, z.ZodObject<{
1085
+ id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1086
+ contentKind: z.ZodLiteral<"poll">;
1087
+ author: z.ZodObject<{
1088
+ userId: z.ZodString;
1089
+ username: z.ZodString;
1090
+ displayName: z.ZodString;
1091
+ avatarUrl: z.ZodOptional<z.ZodURL>;
1092
+ headline: z.ZodOptional<z.ZodString>;
1093
+ }, z.core.$strip>;
1094
+ question: z.ZodString;
1095
+ options: z.ZodArray<z.ZodObject<{
1096
+ index: z.ZodNumber;
1097
+ label: z.ZodString;
1098
+ voteCount: z.ZodNumber;
1099
+ }, z.core.$strip>>;
1100
+ totalVoters: z.ZodNumber;
1101
+ allowsMultipleChoices: z.ZodBoolean;
1102
+ closesAt: z.ZodISODateTime;
1103
+ isClosed: z.ZodBoolean;
1104
+ topics: z.ZodArray<z.ZodEnum<{
1105
+ ai_ml: "ai_ml";
1106
+ b2b_saas: "b2b_saas";
1107
+ d2c: "d2c";
1108
+ deeptech: "deeptech";
1109
+ robotics: "robotics";
1110
+ growth: "growth";
1111
+ sales: "sales";
1112
+ marketing: "marketing";
1113
+ supply_chain: "supply_chain";
1114
+ fundraising: "fundraising";
1115
+ mentoring: "mentoring";
1116
+ leadership: "leadership";
1117
+ networking: "networking";
1118
+ public_speaking: "public_speaking";
1119
+ teaching: "teaching";
1120
+ hiring_talent: "hiring_talent";
1121
+ personal_branding: "personal_branding";
1122
+ career_transition: "career_transition";
1123
+ remote_work: "remote_work";
1124
+ blockchain: "blockchain";
1125
+ crypto_web3: "crypto_web3";
1126
+ data_science: "data_science";
1127
+ cybersecurity: "cybersecurity";
1128
+ game_dev: "game_dev";
1129
+ ux_design: "ux_design";
1130
+ app_development: "app_development";
1131
+ open_source: "open_source";
1132
+ electronics: "electronics";
1133
+ space_exploration: "space_exploration";
1134
+ green_tech: "green_tech";
1135
+ no_code: "no_code";
1136
+ entrepreneurship: "entrepreneurship";
1137
+ investing: "investing";
1138
+ stock_trading: "stock_trading";
1139
+ personal_finance: "personal_finance";
1140
+ consulting: "consulting";
1141
+ ecommerce: "ecommerce";
1142
+ retail: "retail";
1143
+ real_estate: "real_estate";
1144
+ product_management: "product_management";
1145
+ meditation: "meditation";
1146
+ journaling: "journaling";
1147
+ self_improvement: "self_improvement";
1148
+ productivity: "productivity";
1149
+ reading: "reading";
1150
+ online_courses: "online_courses";
1151
+ philosophy: "philosophy";
1152
+ psychology: "psychology";
1153
+ therapy: "therapy";
1154
+ sleep_optimization: "sleep_optimization";
1155
+ gym: "gym";
1156
+ yoga: "yoga";
1157
+ photography: "photography";
1158
+ writing: "writing";
1159
+ graphic_design: "graphic_design";
1160
+ filmmaking: "filmmaking";
1161
+ digital_art: "digital_art";
1162
+ content_creation: "content_creation";
1163
+ blogging: "blogging";
1164
+ vlogging: "vlogging";
1165
+ podcasts: "podcasts";
1166
+ animation: "animation";
1167
+ music_production: "music_production";
1168
+ volunteering: "volunteering";
1169
+ ngo_work: "ngo_work";
1170
+ environmental: "environmental";
1171
+ women_empowerment: "women_empowerment";
1172
+ community_service: "community_service";
1173
+ social_enterprise: "social_enterprise";
1174
+ education_access: "education_access";
1175
+ }>>;
1176
+ commentCount: z.ZodNumber;
1177
+ reactionCounts: z.ZodRecord<z.ZodEnum<{
1178
+ like: "like";
1179
+ celebrate: "celebrate";
1180
+ insightful: "insightful";
1181
+ curious: "curious";
1182
+ }> & z.core.$partial, z.ZodNumber>;
1183
+ createdAt: z.ZodISODateTime;
1184
+ editedAt: z.ZodNullable<z.ZodISODateTime>;
1185
+ viewer: z.ZodOptional<z.ZodObject<{
1186
+ reaction: z.ZodNullable<z.ZodEnum<{
1187
+ like: "like";
1188
+ celebrate: "celebrate";
1189
+ insightful: "insightful";
1190
+ curious: "curious";
1191
+ }>>;
1192
+ bookmarked: z.ZodBoolean;
1193
+ isAuthor: z.ZodBoolean;
1194
+ canEdit: z.ZodBoolean;
1195
+ canDelete: z.ZodBoolean;
1196
+ canReport: z.ZodBoolean;
1197
+ votedOptionIndices: z.ZodArray<z.ZodNumber>;
1198
+ }, z.core.$strip>>;
1199
+ }, z.core.$strip>], "contentKind">>;
1200
+ nextCursor: z.ZodNullable<z.ZodString>;
1201
+ }, z.core.$strip>;
1202
+ export type FeedPage = z.infer<typeof feedPageSchema>;
1203
+ /** A page of a thread: top-level comments, or one comment's replies. */
1204
+ export declare const commentPageSchema: z.ZodObject<{
1205
+ items: z.ZodArray<z.ZodObject<{
1206
+ id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1207
+ contentKind: z.ZodEnum<{
1208
+ post: "post";
1209
+ poll: "poll";
1210
+ }>;
1211
+ contentId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1212
+ parentCommentId: z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
1213
+ author: z.ZodObject<{
1214
+ userId: z.ZodString;
1215
+ username: z.ZodString;
1216
+ displayName: z.ZodString;
1217
+ avatarUrl: z.ZodOptional<z.ZodURL>;
1218
+ headline: z.ZodOptional<z.ZodString>;
1219
+ }, z.core.$strip>;
1220
+ text: z.ZodString;
1221
+ replyCount: z.ZodNumber;
1222
+ reactionCounts: z.ZodRecord<z.ZodEnum<{
1223
+ like: "like";
1224
+ celebrate: "celebrate";
1225
+ insightful: "insightful";
1226
+ curious: "curious";
1227
+ }> & z.core.$partial, z.ZodNumber>;
1228
+ createdAt: z.ZodISODateTime;
1229
+ editedAt: z.ZodNullable<z.ZodISODateTime>;
1230
+ viewer: z.ZodOptional<z.ZodObject<{
1231
+ reaction: z.ZodNullable<z.ZodEnum<{
1232
+ like: "like";
1233
+ celebrate: "celebrate";
1234
+ insightful: "insightful";
1235
+ curious: "curious";
1236
+ }>>;
1237
+ isAuthor: z.ZodBoolean;
1238
+ canEdit: z.ZodBoolean;
1239
+ canDelete: z.ZodBoolean;
1240
+ canReport: z.ZodBoolean;
1241
+ }, z.core.$strip>>;
1242
+ }, z.core.$strip>>;
1243
+ nextCursor: z.ZodNullable<z.ZodString>;
1244
+ }, z.core.$strip>;
1245
+ export type CommentPage = z.infer<typeof commentPageSchema>;
1246
+ /**
1247
+ * ⚠️ Every write body below is its own object with NO defaults, and none of
1248
+ * them is built with `.pick().partial()`. `.partial()` does not switch off
1249
+ * `.default()`, so a patch body built that way rewrites defaulted fields on
1250
+ * every request. See `updateFounderProfileBodySchema` for the incident.
1251
+ */
1252
+ /**
1253
+ * An attachment on the way IN: the id of an image already uploaded and
1254
+ * completed (`media`), and deliberately not a URL.
1255
+ *
1256
+ * ⚠ The first draft of this took the full read shape, URL included. That is
1257
+ * the same hole that was closed on the profile: a URL in a write body is a
1258
+ * member-supplied URL, so a post could have carried `javascript:` in an image
1259
+ * source, and nothing downstream re-checks a value the server itself stored.
1260
+ * Taking an id instead removes the question rather than validating it.
1261
+ *
1262
+ * `width`, `height` and the URLs are NOT accepted either: the server measured
1263
+ * them when it processed the upload, and taking them from the client would let
1264
+ * a caller claim a 1x1 image and collapse the card.
1265
+ *
1266
+ * The server attaches each id only if it is the caller's, processed, uploaded
1267
+ * for a post, and not attached anywhere yet (`UPLOAD_NOT_ATTACHABLE`
1268
+ * otherwise), so one upload can never appear on two posts.
1269
+ */
1270
+ export declare const attachedMediaSchema: z.ZodObject<{
1271
+ mediaId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1272
+ alt: z.ZodOptional<z.ZodString>;
1273
+ }, z.core.$strip>;
1274
+ export type AttachedMedia = z.infer<typeof attachedMediaSchema>;
1275
+ /**
1276
+ * A post must carry something. Text alone, media alone, or both; empty is
1277
+ * refused here rather than reaching the feed as a blank card.
1278
+ */
1279
+ export declare const createPostBodySchema: z.ZodObject<{
1280
+ text: z.ZodOptional<z.ZodString>;
1281
+ media: z.ZodOptional<z.ZodArray<z.ZodObject<{
1282
+ mediaId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1283
+ alt: z.ZodOptional<z.ZodString>;
1284
+ }, z.core.$strip>>>;
1285
+ topics: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1286
+ ai_ml: "ai_ml";
1287
+ b2b_saas: "b2b_saas";
1288
+ d2c: "d2c";
1289
+ deeptech: "deeptech";
1290
+ robotics: "robotics";
1291
+ growth: "growth";
1292
+ sales: "sales";
1293
+ marketing: "marketing";
1294
+ supply_chain: "supply_chain";
1295
+ fundraising: "fundraising";
1296
+ mentoring: "mentoring";
1297
+ leadership: "leadership";
1298
+ networking: "networking";
1299
+ public_speaking: "public_speaking";
1300
+ teaching: "teaching";
1301
+ hiring_talent: "hiring_talent";
1302
+ personal_branding: "personal_branding";
1303
+ career_transition: "career_transition";
1304
+ remote_work: "remote_work";
1305
+ blockchain: "blockchain";
1306
+ crypto_web3: "crypto_web3";
1307
+ data_science: "data_science";
1308
+ cybersecurity: "cybersecurity";
1309
+ game_dev: "game_dev";
1310
+ ux_design: "ux_design";
1311
+ app_development: "app_development";
1312
+ open_source: "open_source";
1313
+ electronics: "electronics";
1314
+ space_exploration: "space_exploration";
1315
+ green_tech: "green_tech";
1316
+ no_code: "no_code";
1317
+ entrepreneurship: "entrepreneurship";
1318
+ investing: "investing";
1319
+ stock_trading: "stock_trading";
1320
+ personal_finance: "personal_finance";
1321
+ consulting: "consulting";
1322
+ ecommerce: "ecommerce";
1323
+ retail: "retail";
1324
+ real_estate: "real_estate";
1325
+ product_management: "product_management";
1326
+ meditation: "meditation";
1327
+ journaling: "journaling";
1328
+ self_improvement: "self_improvement";
1329
+ productivity: "productivity";
1330
+ reading: "reading";
1331
+ online_courses: "online_courses";
1332
+ philosophy: "philosophy";
1333
+ psychology: "psychology";
1334
+ therapy: "therapy";
1335
+ sleep_optimization: "sleep_optimization";
1336
+ gym: "gym";
1337
+ yoga: "yoga";
1338
+ photography: "photography";
1339
+ writing: "writing";
1340
+ graphic_design: "graphic_design";
1341
+ filmmaking: "filmmaking";
1342
+ digital_art: "digital_art";
1343
+ content_creation: "content_creation";
1344
+ blogging: "blogging";
1345
+ vlogging: "vlogging";
1346
+ podcasts: "podcasts";
1347
+ animation: "animation";
1348
+ music_production: "music_production";
1349
+ volunteering: "volunteering";
1350
+ ngo_work: "ngo_work";
1351
+ environmental: "environmental";
1352
+ women_empowerment: "women_empowerment";
1353
+ community_service: "community_service";
1354
+ social_enterprise: "social_enterprise";
1355
+ education_access: "education_access";
1356
+ }>>>;
1357
+ }, z.core.$strip>;
1358
+ export type CreatePostBody = z.infer<typeof createPostBodySchema>;
1359
+ /** Only the text is editable. Changing media after the fact makes every
1360
+ * earlier reply look like a reply to something else. */
1361
+ export declare const updatePostBodySchema: z.ZodObject<{
1362
+ text: z.ZodString;
1363
+ }, z.core.$strip>;
1364
+ export type UpdatePostBody = z.infer<typeof updatePostBodySchema>;
1365
+ export declare const createPollBodySchema: z.ZodObject<{
1366
+ question: z.ZodString;
1367
+ options: z.ZodArray<z.ZodObject<{
1368
+ label: z.ZodString;
1369
+ }, z.core.$strip>>;
1370
+ durationMs: z.ZodNumber;
1371
+ allowsMultipleChoices: z.ZodBoolean;
1372
+ topics: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1373
+ ai_ml: "ai_ml";
1374
+ b2b_saas: "b2b_saas";
1375
+ d2c: "d2c";
1376
+ deeptech: "deeptech";
1377
+ robotics: "robotics";
1378
+ growth: "growth";
1379
+ sales: "sales";
1380
+ marketing: "marketing";
1381
+ supply_chain: "supply_chain";
1382
+ fundraising: "fundraising";
1383
+ mentoring: "mentoring";
1384
+ leadership: "leadership";
1385
+ networking: "networking";
1386
+ public_speaking: "public_speaking";
1387
+ teaching: "teaching";
1388
+ hiring_talent: "hiring_talent";
1389
+ personal_branding: "personal_branding";
1390
+ career_transition: "career_transition";
1391
+ remote_work: "remote_work";
1392
+ blockchain: "blockchain";
1393
+ crypto_web3: "crypto_web3";
1394
+ data_science: "data_science";
1395
+ cybersecurity: "cybersecurity";
1396
+ game_dev: "game_dev";
1397
+ ux_design: "ux_design";
1398
+ app_development: "app_development";
1399
+ open_source: "open_source";
1400
+ electronics: "electronics";
1401
+ space_exploration: "space_exploration";
1402
+ green_tech: "green_tech";
1403
+ no_code: "no_code";
1404
+ entrepreneurship: "entrepreneurship";
1405
+ investing: "investing";
1406
+ stock_trading: "stock_trading";
1407
+ personal_finance: "personal_finance";
1408
+ consulting: "consulting";
1409
+ ecommerce: "ecommerce";
1410
+ retail: "retail";
1411
+ real_estate: "real_estate";
1412
+ product_management: "product_management";
1413
+ meditation: "meditation";
1414
+ journaling: "journaling";
1415
+ self_improvement: "self_improvement";
1416
+ productivity: "productivity";
1417
+ reading: "reading";
1418
+ online_courses: "online_courses";
1419
+ philosophy: "philosophy";
1420
+ psychology: "psychology";
1421
+ therapy: "therapy";
1422
+ sleep_optimization: "sleep_optimization";
1423
+ gym: "gym";
1424
+ yoga: "yoga";
1425
+ photography: "photography";
1426
+ writing: "writing";
1427
+ graphic_design: "graphic_design";
1428
+ filmmaking: "filmmaking";
1429
+ digital_art: "digital_art";
1430
+ content_creation: "content_creation";
1431
+ blogging: "blogging";
1432
+ vlogging: "vlogging";
1433
+ podcasts: "podcasts";
1434
+ animation: "animation";
1435
+ music_production: "music_production";
1436
+ volunteering: "volunteering";
1437
+ ngo_work: "ngo_work";
1438
+ environmental: "environmental";
1439
+ women_empowerment: "women_empowerment";
1440
+ community_service: "community_service";
1441
+ social_enterprise: "social_enterprise";
1442
+ education_access: "education_access";
1443
+ }>>>;
1444
+ }, z.core.$strip>;
1445
+ export type CreatePollBody = z.infer<typeof createPollBodySchema>;
1446
+ /** Cast or change a vote. The server upserts on (poll, voter), so voting
1447
+ * twice replaces rather than doubles. */
1448
+ export declare const castVoteBodySchema: z.ZodObject<{
1449
+ optionIndices: z.ZodArray<z.ZodNumber>;
1450
+ }, z.core.$strip>;
1451
+ export type CastVoteBody = z.infer<typeof castVoteBodySchema>;
1452
+ export declare const createCommentBodySchema: z.ZodObject<{
1453
+ text: z.ZodString;
1454
+ parentCommentId: z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
1455
+ }, z.core.$strip>;
1456
+ export type CreateCommentBody = z.infer<typeof createCommentBodySchema>;
1457
+ export declare const updateCommentBodySchema: z.ZodObject<{
1458
+ text: z.ZodString;
1459
+ }, z.core.$strip>;
1460
+ export type UpdateCommentBody = z.infer<typeof updateCommentBodySchema>;
1461
+ /** Set or clear a reaction. `null` clears it; at most one per viewer per item. */
1462
+ export declare const setReactionBodySchema: z.ZodObject<{
1463
+ reaction: z.ZodNullable<z.ZodEnum<{
1464
+ like: "like";
1465
+ celebrate: "celebrate";
1466
+ insightful: "insightful";
1467
+ curious: "curious";
1468
+ }>>;
1469
+ }, z.core.$strip>;
1470
+ export type SetReactionBody = z.infer<typeof setReactionBodySchema>;
1471
+ /**
1472
+ * Returned by the reaction endpoint so the card can render the authoritative
1473
+ * result without a follow-up read. Without the fresh counts a client has to
1474
+ * guess the new total, and two quick taps leave it showing a number the server
1475
+ * never had.
1476
+ */
1477
+ export declare const setReactionResponseSchema: z.ZodObject<{
1478
+ contentKind: z.ZodEnum<{
1479
+ post: "post";
1480
+ poll: "poll";
1481
+ comment: "comment";
1482
+ }>;
1483
+ contentId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1484
+ reaction: z.ZodNullable<z.ZodEnum<{
1485
+ like: "like";
1486
+ celebrate: "celebrate";
1487
+ insightful: "insightful";
1488
+ curious: "curious";
1489
+ }>>;
1490
+ reactionCounts: z.ZodRecord<z.ZodEnum<{
1491
+ like: "like";
1492
+ celebrate: "celebrate";
1493
+ insightful: "insightful";
1494
+ curious: "curious";
1495
+ }> & z.core.$partial, z.ZodNumber>;
1496
+ }, z.core.$strip>;
1497
+ export type SetReactionResponse = z.infer<typeof setReactionResponseSchema>;
1498
+ /**
1499
+ * Why a member reported something.
1500
+ *
1501
+ * ⚠️ Stored on every report row, so this is data, not a label: removing a value
1502
+ * orphans reports already filed under it, and the counts nobody can recover are
1503
+ * exactly the ones a moderation review needs. Append only.
1504
+ *
1505
+ * ⚠️ A REASON THAT IS MISSING DOES NOT DISAPPEAR, it lands in `other`. Whatever
1506
+ * is not named here becomes an undifferentiated pile that no aggregate can see
1507
+ * a pattern in, which is the one thing report categories exist for. Worth being
1508
+ * deliberate about the absences rather than discovering them later.
1509
+ */
1510
+ export declare const REPORT_REASON_VALUES: readonly ["spam", "harassment", "misinformation", "off_topic", "impersonation", "other"];
1511
+ export declare const reportReasonSchema: z.ZodEnum<{
1512
+ other: "other";
1513
+ spam: "spam";
1514
+ harassment: "harassment";
1515
+ misinformation: "misinformation";
1516
+ off_topic: "off_topic";
1517
+ impersonation: "impersonation";
1518
+ }>;
1519
+ export type ReportReason = z.infer<typeof reportReasonSchema>;
1520
+ /**
1521
+ * What a member sends to report a post, poll or comment.
1522
+ *
1523
+ * The target is the URL's, not the body's: a report is filed against a specific
1524
+ * thing at a specific address, and taking the target from the body would let a
1525
+ * caller report one item while the route thinks it is another.
1526
+ *
1527
+ * `note` is free text and optional, which is the pressure valve for everything
1528
+ * the enum does not name. ⚠️ It is written by a member, so it is untrusted at
1529
+ * render: a moderation queue displays it, and a moderation queue is a screen
1530
+ * staff read quickly.
1531
+ */
1532
+ export declare const createReportBodySchema: z.ZodObject<{
1533
+ reason: z.ZodEnum<{
1534
+ other: "other";
1535
+ spam: "spam";
1536
+ harassment: "harassment";
1537
+ misinformation: "misinformation";
1538
+ off_topic: "off_topic";
1539
+ impersonation: "impersonation";
1540
+ }>;
1541
+ note: z.ZodOptional<z.ZodString>;
1542
+ }, z.core.$strip>;
1543
+ export type CreateReportBody = z.infer<typeof createReportBodySchema>;
1544
+ /**
1545
+ * The answer to filing one.
1546
+ *
1547
+ * `alreadyReported` distinguishes "we have taken this" from "you already told
1548
+ * us", because one report per member per target means a second press is a
1549
+ * no-op, and a silent no-op reads as a failure to somebody who pressed twice
1550
+ * deliberately. It is NOT a count: how many OTHER people reported an item is
1551
+ * moderation's business and telling a reporter would turn the count into a
1552
+ * score anyone could farm.
1553
+ */
1554
+ export declare const createReportResponseSchema: z.ZodObject<{
1555
+ contentKind: z.ZodEnum<{
1556
+ post: "post";
1557
+ poll: "poll";
1558
+ comment: "comment";
1559
+ }>;
1560
+ contentId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1561
+ alreadyReported: z.ZodBoolean;
1562
+ }, z.core.$strip>;
1563
+ export type CreateReportResponse = z.infer<typeof createReportResponseSchema>;
1564
+ /** The bookmark endpoint is a toggle and returns the state it settled on. */
1565
+ export declare const toggleBookmarkResponseSchema: z.ZodObject<{
1566
+ contentKind: z.ZodEnum<{
1567
+ post: "post";
1568
+ poll: "poll";
1569
+ }>;
1570
+ contentId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1571
+ bookmarked: z.ZodBoolean;
1572
+ }, z.core.$strip>;
1573
+ export type ToggleBookmarkResponse = z.infer<typeof toggleBookmarkResponseSchema>;
1574
+ /** A vote returns the whole poll: counts, totals and the viewer's own choices
1575
+ * all move together, and reassembling them client-side drifts. */
1576
+ export declare const castVoteResponseSchema: z.ZodObject<{
1577
+ poll: z.ZodObject<{
1578
+ id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1579
+ contentKind: z.ZodLiteral<"poll">;
1580
+ author: z.ZodObject<{
1581
+ userId: z.ZodString;
1582
+ username: z.ZodString;
1583
+ displayName: z.ZodString;
1584
+ avatarUrl: z.ZodOptional<z.ZodURL>;
1585
+ headline: z.ZodOptional<z.ZodString>;
1586
+ }, z.core.$strip>;
1587
+ question: z.ZodString;
1588
+ options: z.ZodArray<z.ZodObject<{
1589
+ index: z.ZodNumber;
1590
+ label: z.ZodString;
1591
+ voteCount: z.ZodNumber;
1592
+ }, z.core.$strip>>;
1593
+ totalVoters: z.ZodNumber;
1594
+ allowsMultipleChoices: z.ZodBoolean;
1595
+ closesAt: z.ZodISODateTime;
1596
+ isClosed: z.ZodBoolean;
1597
+ topics: z.ZodArray<z.ZodEnum<{
1598
+ ai_ml: "ai_ml";
1599
+ b2b_saas: "b2b_saas";
1600
+ d2c: "d2c";
1601
+ deeptech: "deeptech";
1602
+ robotics: "robotics";
1603
+ growth: "growth";
1604
+ sales: "sales";
1605
+ marketing: "marketing";
1606
+ supply_chain: "supply_chain";
1607
+ fundraising: "fundraising";
1608
+ mentoring: "mentoring";
1609
+ leadership: "leadership";
1610
+ networking: "networking";
1611
+ public_speaking: "public_speaking";
1612
+ teaching: "teaching";
1613
+ hiring_talent: "hiring_talent";
1614
+ personal_branding: "personal_branding";
1615
+ career_transition: "career_transition";
1616
+ remote_work: "remote_work";
1617
+ blockchain: "blockchain";
1618
+ crypto_web3: "crypto_web3";
1619
+ data_science: "data_science";
1620
+ cybersecurity: "cybersecurity";
1621
+ game_dev: "game_dev";
1622
+ ux_design: "ux_design";
1623
+ app_development: "app_development";
1624
+ open_source: "open_source";
1625
+ electronics: "electronics";
1626
+ space_exploration: "space_exploration";
1627
+ green_tech: "green_tech";
1628
+ no_code: "no_code";
1629
+ entrepreneurship: "entrepreneurship";
1630
+ investing: "investing";
1631
+ stock_trading: "stock_trading";
1632
+ personal_finance: "personal_finance";
1633
+ consulting: "consulting";
1634
+ ecommerce: "ecommerce";
1635
+ retail: "retail";
1636
+ real_estate: "real_estate";
1637
+ product_management: "product_management";
1638
+ meditation: "meditation";
1639
+ journaling: "journaling";
1640
+ self_improvement: "self_improvement";
1641
+ productivity: "productivity";
1642
+ reading: "reading";
1643
+ online_courses: "online_courses";
1644
+ philosophy: "philosophy";
1645
+ psychology: "psychology";
1646
+ therapy: "therapy";
1647
+ sleep_optimization: "sleep_optimization";
1648
+ gym: "gym";
1649
+ yoga: "yoga";
1650
+ photography: "photography";
1651
+ writing: "writing";
1652
+ graphic_design: "graphic_design";
1653
+ filmmaking: "filmmaking";
1654
+ digital_art: "digital_art";
1655
+ content_creation: "content_creation";
1656
+ blogging: "blogging";
1657
+ vlogging: "vlogging";
1658
+ podcasts: "podcasts";
1659
+ animation: "animation";
1660
+ music_production: "music_production";
1661
+ volunteering: "volunteering";
1662
+ ngo_work: "ngo_work";
1663
+ environmental: "environmental";
1664
+ women_empowerment: "women_empowerment";
1665
+ community_service: "community_service";
1666
+ social_enterprise: "social_enterprise";
1667
+ education_access: "education_access";
1668
+ }>>;
1669
+ commentCount: z.ZodNumber;
1670
+ reactionCounts: z.ZodRecord<z.ZodEnum<{
1671
+ like: "like";
1672
+ celebrate: "celebrate";
1673
+ insightful: "insightful";
1674
+ curious: "curious";
1675
+ }> & z.core.$partial, z.ZodNumber>;
1676
+ createdAt: z.ZodISODateTime;
1677
+ editedAt: z.ZodNullable<z.ZodISODateTime>;
1678
+ viewer: z.ZodOptional<z.ZodObject<{
1679
+ reaction: z.ZodNullable<z.ZodEnum<{
1680
+ like: "like";
1681
+ celebrate: "celebrate";
1682
+ insightful: "insightful";
1683
+ curious: "curious";
1684
+ }>>;
1685
+ bookmarked: z.ZodBoolean;
1686
+ isAuthor: z.ZodBoolean;
1687
+ canEdit: z.ZodBoolean;
1688
+ canDelete: z.ZodBoolean;
1689
+ canReport: z.ZodBoolean;
1690
+ votedOptionIndices: z.ZodArray<z.ZodNumber>;
1691
+ }, z.core.$strip>>;
1692
+ }, z.core.$strip>;
1693
+ }, z.core.$strip>;
1694
+ export type CastVoteResponse = z.infer<typeof castVoteResponseSchema>;
1695
+ //# sourceMappingURL=feed.d.ts.map