founder-schema 0.4.0 → 0.6.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 (83) hide show
  1. package/README.md +64 -1
  2. package/dist/access/permissions.d.ts +24 -2
  3. package/dist/access/permissions.d.ts.map +1 -1
  4. package/dist/access/permissions.js +9 -0
  5. package/dist/access/permissions.js.map +1 -1
  6. package/dist/core/common.d.ts +37 -0
  7. package/dist/core/common.d.ts.map +1 -1
  8. package/dist/core/common.js +49 -0
  9. package/dist/core/common.js.map +1 -1
  10. package/dist/core/errors.d.ts +41 -1
  11. package/dist/core/errors.d.ts.map +1 -1
  12. package/dist/core/errors.js +75 -4
  13. package/dist/core/errors.js.map +1 -1
  14. package/dist/core/limits.d.ts +76 -4
  15. package/dist/core/limits.d.ts.map +1 -1
  16. package/dist/core/limits.js +80 -4
  17. package/dist/core/limits.js.map +1 -1
  18. package/dist/core/responses.d.ts +55 -0
  19. package/dist/core/responses.d.ts.map +1 -1
  20. package/dist/core/responses.js +3 -1
  21. package/dist/core/responses.js.map +1 -1
  22. package/dist/core/validation.d.ts +16 -0
  23. package/dist/core/validation.d.ts.map +1 -1
  24. package/dist/core/validation.js +16 -0
  25. package/dist/core/validation.js.map +1 -1
  26. package/dist/domains/account/account.d.ts +2 -0
  27. package/dist/domains/account/account.d.ts.map +1 -1
  28. package/dist/domains/account/account.js +2 -0
  29. package/dist/domains/account/account.js.map +1 -1
  30. package/dist/domains/audit/audit.d.ts +4 -0
  31. package/dist/domains/audit/audit.d.ts.map +1 -1
  32. package/dist/domains/audit/audit.js +6 -3
  33. package/dist/domains/audit/audit.js.map +1 -1
  34. package/dist/domains/contributions/contributions.d.ts +158 -0
  35. package/dist/domains/contributions/contributions.d.ts.map +1 -0
  36. package/dist/domains/contributions/contributions.js +93 -0
  37. package/dist/domains/contributions/contributions.js.map +1 -0
  38. package/dist/domains/discover/discover.d.ts +5 -0
  39. package/dist/domains/discover/discover.d.ts.map +1 -1
  40. package/dist/domains/discover/discover.js +3 -13
  41. package/dist/domains/discover/discover.js.map +1 -1
  42. package/dist/domains/feed/feed.d.ts +293 -32
  43. package/dist/domains/feed/feed.d.ts.map +1 -1
  44. package/dist/domains/feed/feed.js +109 -38
  45. package/dist/domains/feed/feed.js.map +1 -1
  46. package/dist/domains/media/media.d.ts +159 -0
  47. package/dist/domains/media/media.d.ts.map +1 -0
  48. package/dist/domains/media/media.js +136 -0
  49. package/dist/domains/media/media.js.map +1 -0
  50. package/dist/domains/members/members.d.ts +5 -5
  51. package/dist/domains/moderation/moderation.d.ts +53 -3
  52. package/dist/domains/moderation/moderation.d.ts.map +1 -1
  53. package/dist/domains/moderation/moderation.js +47 -8
  54. package/dist/domains/moderation/moderation.js.map +1 -1
  55. package/dist/domains/notifications/notifications.d.ts +212 -0
  56. package/dist/domains/notifications/notifications.d.ts.map +1 -0
  57. package/dist/domains/notifications/notifications.js +144 -0
  58. package/dist/domains/notifications/notifications.js.map +1 -0
  59. package/dist/domains/onboarding/onboarding.d.ts +21 -24
  60. package/dist/domains/onboarding/onboarding.d.ts.map +1 -1
  61. package/dist/domains/onboarding/onboarding.js +21 -20
  62. package/dist/domains/onboarding/onboarding.js.map +1 -1
  63. package/dist/domains/products/products.d.ts +1449 -0
  64. package/dist/domains/products/products.d.ts.map +1 -0
  65. package/dist/domains/products/products.js +453 -0
  66. package/dist/domains/products/products.js.map +1 -0
  67. package/dist/domains/profile/founder-profile.d.ts +66 -0
  68. package/dist/domains/profile/founder-profile.d.ts.map +1 -1
  69. package/dist/domains/profile/founder-profile.js +70 -1
  70. package/dist/domains/profile/founder-profile.js.map +1 -1
  71. package/dist/domains/reviews/reviews.d.ts +184 -0
  72. package/dist/domains/reviews/reviews.d.ts.map +1 -0
  73. package/dist/domains/reviews/reviews.js +99 -0
  74. package/dist/domains/reviews/reviews.js.map +1 -0
  75. package/dist/domains/uploads/uploads.d.ts +54 -64
  76. package/dist/domains/uploads/uploads.d.ts.map +1 -1
  77. package/dist/domains/uploads/uploads.js +43 -60
  78. package/dist/domains/uploads/uploads.js.map +1 -1
  79. package/dist/index.d.ts +11 -6
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +17 -7
  82. package/dist/index.js.map +1 -1
  83. package/package.json +1 -1
@@ -0,0 +1,1449 @@
1
+ /**
2
+ * founder-schema — Products: what founders build, and the help around it
3
+ *
4
+ * THE IDEA (the user, 2026-10-06): founders help each other with their
5
+ * products. A founder adds what they build; a post or poll can say which of
6
+ * their products it is about and what they want ("testers wanted"); every
7
+ * comment on it becomes that product's feedback; the community reviews and
8
+ * upvotes it; and the help a member gives is recognised in their contribution
9
+ * score.
10
+ *
11
+ * THE COMPANY STAYS THE PROFILE'S `venture` (one per founder). There are no
12
+ * company pages: co-founders join a PRODUCT's team, as Product Hunt lists a
13
+ * product's makers. Revisit only if one team running many products finds
14
+ * re-inviting each time tedious.
15
+ *
16
+ * VISIBILITY, two states (the user's ruling): `unlisted` by default, a page
17
+ * anyone signed in can open by its link and that shows on its team's profiles;
18
+ * `listed`, also in Discover. Listing needs a logo, a tagline and at least one
19
+ * screenshot (`PRODUCT_NOT_LISTABLE` names what is missing), so Discover never
20
+ * shows an empty card.
21
+ *
22
+ * THE TEAM: an owner, co-founders and team members, joined by invitation and
23
+ * acceptance (nobody is put on a team without saying yes), with no limit on
24
+ * its size (the user's ruling). Who may do what:
25
+ *
26
+ * owner co-founder team
27
+ * edit, images, list, invite ✓ ✓
28
+ * tag posts, reply to reviews, ✓ ✓ ✓
29
+ * mark feedback, confirm testers
30
+ * change roles, remove, hand over ✓
31
+ * archive, delete ✓
32
+ *
33
+ * A product's images belong to the product, not to whoever uploaded them.
34
+ * When the owner deletes their account the product passes to the longest-
35
+ * standing co-founder (else team member); with nobody left it is deleted.
36
+ *
37
+ * Routes (all signed in):
38
+ * GET /api/v1/products Discover: productDiscoverQuerySchema
39
+ * GET /api/v1/products/facets productFacetsSchema
40
+ * POST /api/v1/products createProductBodySchema -> IdResponse
41
+ * GET /api/v1/products/mine myProductsSchema
42
+ * GET /api/v1/products/invites productInvitesSchema
43
+ * PUT /api/v1/products/invites/:productId accept -> productSchema
44
+ * DELETE /api/v1/products/invites/:productId decline -> IdResponse
45
+ * GET /api/v1/products/by-member/:userId productCardPageSchema (their teams)
46
+ * GET /api/v1/products/:productId productSchema
47
+ * PATCH /api/v1/products/:productId updateProductBodySchema -> productSchema
48
+ * DELETE /api/v1/products/:productId -> IdResponse (owner)
49
+ * PUT /api/v1/products/:productId/logo setProductLogoBodySchema -> productSchema
50
+ * DELETE /api/v1/products/:productId/logo -> productSchema
51
+ * PUT /api/v1/products/:productId/screenshots setProductScreenshotsBodySchema -> productSchema
52
+ * PUT /api/v1/products/:productId/visibility setProductVisibilityBodySchema -> productSchema
53
+ * PUT /api/v1/products/:productId/status setProductStatusBodySchema -> productSchema
54
+ * GET /api/v1/products/:productId/team productTeamPageSchema
55
+ * GET /api/v1/products/:productId/invites productPendingInvitePageSchema (managers)
56
+ * POST /api/v1/products/:productId/invites inviteProductMemberBodySchema -> productPendingInviteSchema
57
+ * PUT /api/v1/products/:productId/team/:userId setProductMemberRoleBodySchema -> IdResponse
58
+ * (works on someone still invited too; refetch the team and the invites)
59
+ * DELETE /api/v1/products/:productId/team/:userId remove, cancel an invite, or leave -> IdResponse
60
+ * POST /api/v1/products/:productId/transfer transferProductBodySchema -> productSchema
61
+ * PUT /api/v1/products/:productId/upvote -> productUpvoteResponseSchema
62
+ * DELETE /api/v1/products/:productId/upvote -> productUpvoteResponseSchema
63
+ * GET /api/v1/products/:productId/posts FeedPage (posts and polls tagged with it)
64
+ * GET /api/v1/products/:productId/feedback productFeedbackQuerySchema -> productFeedbackPageSchema (feed)
65
+ * GET /api/v1/products/:productId/testers productTesterPageSchema
66
+ * PUT /api/v1/products/:productId/testers/:userId confirm -> productTesterSchema
67
+ * DELETE /api/v1/products/:productId/testers/:userId withdraw -> IdResponse
68
+ * POST /api/v1/products/:productId/report createReportBodySchema -> CreateReportResponse
69
+ * (reviews: `domains/reviews`)
70
+ *
71
+ * @module founder-schema/domains/products
72
+ */
73
+ import { z } from 'zod';
74
+ /** Topics a product carries, as a post does: what interest matching reads. */
75
+ export declare const PRODUCT_TOPICS_MAX = 3;
76
+ /**
77
+ * Where the product is in its life. Its own list, deliberately not the
78
+ * venture's funding stage (`startupStageSchema`): "seed" says how a company is
79
+ * funded, "beta" says whether you can use the thing. Ordered earliest first.
80
+ */
81
+ export declare const PRODUCT_STAGE_VALUES: readonly ["idea", "building", "beta", "live"];
82
+ export declare const productStageSchema: z.ZodEnum<{
83
+ idea: "idea";
84
+ building: "building";
85
+ beta: "beta";
86
+ live: "live";
87
+ }>;
88
+ export type ProductStage = z.infer<typeof productStageSchema>;
89
+ export declare const PRODUCT_PLATFORM_VALUES: readonly ["web", "ios", "android", "desktop", "browser_extension", "api", "hardware", "other"];
90
+ export declare const productPlatformSchema: z.ZodEnum<{
91
+ api: "api";
92
+ other: "other";
93
+ web: "web";
94
+ ios: "ios";
95
+ android: "android";
96
+ desktop: "desktop";
97
+ browser_extension: "browser_extension";
98
+ hardware: "hardware";
99
+ }>;
100
+ export type ProductPlatform = z.infer<typeof productPlatformSchema>;
101
+ /** `unlisted` (the default) or `listed` in Discover. See the module note. */
102
+ export declare const PRODUCT_VISIBILITY_VALUES: readonly ["unlisted", "listed"];
103
+ export declare const productVisibilitySchema: z.ZodEnum<{
104
+ unlisted: "unlisted";
105
+ listed: "listed";
106
+ }>;
107
+ export type ProductVisibility = z.infer<typeof productVisibilitySchema>;
108
+ /**
109
+ * `archived`: kept, readable and still on its team's profiles, but out of
110
+ * Discover and closed to new posts, reviews and upvotes. Restorable.
111
+ */
112
+ export declare const PRODUCT_STATUS_VALUES: readonly ["active", "archived"];
113
+ export declare const productStatusSchema: z.ZodEnum<{
114
+ active: "active";
115
+ archived: "archived";
116
+ }>;
117
+ export type ProductStatus = z.infer<typeof productStatusSchema>;
118
+ /** One owner per product; see the module note for what each role may do. */
119
+ export declare const PRODUCT_TEAM_ROLE_VALUES: readonly ["owner", "cofounder", "team"];
120
+ export declare const productTeamRoleSchema: z.ZodEnum<{
121
+ team: "team";
122
+ owner: "owner";
123
+ cofounder: "cofounder";
124
+ }>;
125
+ export type ProductTeamRole = z.infer<typeof productTeamRoleSchema>;
126
+ /** The roles an invitation (or a role change) may give. Ownership is handed over, never invited. */
127
+ export declare const PRODUCT_INVITABLE_ROLE_VALUES: readonly ["cofounder", "team"];
128
+ export declare const productInvitableRoleSchema: z.ZodEnum<{
129
+ team: "team";
130
+ cofounder: "cofounder";
131
+ }>;
132
+ export type ProductInvitableRole = z.infer<typeof productInvitableRoleSchema>;
133
+ /**
134
+ * What a post or poll about a product ASKS of the community. Optional, and
135
+ * only with a product. Each ask keeps the product on that shelf of Discover
136
+ * for `PRODUCT_ASK_OPEN_DAYS`.
137
+ *
138
+ * feedback "tell me what you think"
139
+ * testers "try it": confirmed testers are recognised (`/testers`)
140
+ * launch "it is out"
141
+ * ideas "what should it do next"
142
+ */
143
+ export declare const PRODUCT_ASK_VALUES: readonly ["feedback", "testers", "launch", "ideas"];
144
+ export declare const productAskSchema: z.ZodEnum<{
145
+ feedback: "feedback";
146
+ testers: "testers";
147
+ launch: "launch";
148
+ ideas: "ideas";
149
+ }>;
150
+ export type ProductAsk = z.infer<typeof productAskSchema>;
151
+ /**
152
+ * Discover's orders.
153
+ *
154
+ * trending recent upvotes, reviews and feedback, newer counting more
155
+ * (recomputed every 15 minutes). The default.
156
+ * new most recently listed first
157
+ * top_rated best rated, weighted so a few reviews cannot beat many; only
158
+ * products with `REVIEW_AVERAGE_MIN_COUNT` reviews
159
+ */
160
+ export declare const PRODUCT_SORT_VALUES: readonly ["trending", "new", "top_rated"];
161
+ export declare const productSortSchema: z.ZodEnum<{
162
+ trending: "trending";
163
+ new: "new";
164
+ top_rated: "top_rated";
165
+ }>;
166
+ export type ProductSort = z.infer<typeof productSortSchema>;
167
+ /**
168
+ * What listing needs (defined in core, beside the error details that carry it:
169
+ * `PRODUCT_NOT_LISTABLE` returns the missing ones in `details.missing`).
170
+ */
171
+ export { PRODUCT_LISTING_REQUIREMENT_VALUES, type ProductListingRequirement, productListingRequirementSchema, } from '../../core/common.js';
172
+ /**
173
+ * Where to get it. Every link is member-typed, so every one is
174
+ * `httpUrlSchema`, and the store links must also be ON the store: the
175
+ * hostname is parsed and compared exactly (`httpUrlOnHosts`).
176
+ */
177
+ export declare const productLinksSchema: z.ZodObject<{
178
+ website: z.ZodOptional<z.ZodURL>;
179
+ appStore: z.ZodOptional<z.ZodURL>;
180
+ playStore: z.ZodOptional<z.ZodURL>;
181
+ github: z.ZodOptional<z.ZodURL>;
182
+ }, z.core.$strip>;
183
+ export type ProductLinks = z.infer<typeof productLinksSchema>;
184
+ /** A demo video: a YouTube link, played in the page. Video is never uploaded. */
185
+ export declare const productVideoUrlSchema: z.ZodURL;
186
+ /**
187
+ * A product named on something else: the chip on a post or poll, a
188
+ * notification, a points entry. `logoUrl` is the logo's smallest size.
189
+ */
190
+ export declare const productChipSchema: z.ZodObject<{
191
+ id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
192
+ slug: z.ZodString;
193
+ name: z.ZodString;
194
+ logoUrl: z.ZodOptional<z.ZodURL>;
195
+ }, z.core.$strip>;
196
+ export type ProductChip = z.infer<typeof productChipSchema>;
197
+ /**
198
+ * How it is rated. `average` (one decimal) is null until the product has
199
+ * `REVIEW_AVERAGE_MIN_COUNT` reviews: a client shows "Not enough reviews yet",
200
+ * never a lone 5.0 from one friend.
201
+ */
202
+ export declare const productRatingSchema: z.ZodObject<{
203
+ count: z.ZodNumber;
204
+ average: z.ZodNullable<z.ZodNumber>;
205
+ }, z.core.$strip>;
206
+ export type ProductRating = z.infer<typeof productRatingSchema>;
207
+ /** One screenshot: a processed image (every size, ready for `srcset`) and its caption. */
208
+ export declare const productScreenshotSchema: z.ZodObject<{
209
+ id: z.ZodString;
210
+ url: z.ZodURL;
211
+ width: z.ZodNumber;
212
+ height: z.ZodNumber;
213
+ variants: z.ZodArray<z.ZodObject<{
214
+ width: z.ZodNumber;
215
+ height: z.ZodNumber;
216
+ url: z.ZodURL;
217
+ }, z.core.$strip>>;
218
+ placeholder: z.ZodOptional<z.ZodString>;
219
+ caption: z.ZodOptional<z.ZodString>;
220
+ }, z.core.$strip>;
221
+ export type ProductScreenshot = z.infer<typeof productScreenshotSchema>;
222
+ /** What this viewer may do on a Discover card. */
223
+ export declare const productCardViewerSchema: z.ZodObject<{
224
+ upvoted: z.ZodBoolean;
225
+ canUpvote: z.ZodBoolean;
226
+ role: z.ZodNullable<z.ZodEnum<{
227
+ team: "team";
228
+ owner: "owner";
229
+ cofounder: "cofounder";
230
+ }>>;
231
+ }, z.core.$strip>;
232
+ /**
233
+ * A product on Discover, on a profile, in "my products". `cover` is the first
234
+ * screenshot. `openAsks` are the asks whose window is open now, by the
235
+ * server's clock ("Testers wanted").
236
+ */
237
+ export declare const productCardSchema: z.ZodObject<{
238
+ id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
239
+ slug: z.ZodString;
240
+ name: z.ZodString;
241
+ tagline: z.ZodOptional<z.ZodString>;
242
+ logo: z.ZodOptional<z.ZodObject<{
243
+ id: z.ZodString;
244
+ url: z.ZodURL;
245
+ width: z.ZodNumber;
246
+ height: z.ZodNumber;
247
+ variants: z.ZodArray<z.ZodObject<{
248
+ width: z.ZodNumber;
249
+ height: z.ZodNumber;
250
+ url: z.ZodURL;
251
+ }, z.core.$strip>>;
252
+ placeholder: z.ZodOptional<z.ZodString>;
253
+ }, z.core.$strip>>;
254
+ cover: z.ZodOptional<z.ZodObject<{
255
+ id: z.ZodString;
256
+ url: z.ZodURL;
257
+ width: z.ZodNumber;
258
+ height: z.ZodNumber;
259
+ variants: z.ZodArray<z.ZodObject<{
260
+ width: z.ZodNumber;
261
+ height: z.ZodNumber;
262
+ url: z.ZodURL;
263
+ }, z.core.$strip>>;
264
+ placeholder: z.ZodOptional<z.ZodString>;
265
+ }, z.core.$strip>>;
266
+ industry: z.ZodEnum<{
267
+ agritech: "agritech";
268
+ ai_ml: "ai_ml";
269
+ b2b_saas: "b2b_saas";
270
+ consumer: "consumer";
271
+ climate: "climate";
272
+ d2c: "d2c";
273
+ deeptech: "deeptech";
274
+ edtech: "edtech";
275
+ fintech: "fintech";
276
+ gaming: "gaming";
277
+ healthtech: "healthtech";
278
+ logistics: "logistics";
279
+ manufacturing: "manufacturing";
280
+ marketplace: "marketplace";
281
+ media: "media";
282
+ mobility: "mobility";
283
+ proptech: "proptech";
284
+ robotics: "robotics";
285
+ services: "services";
286
+ space: "space";
287
+ other: "other";
288
+ }>;
289
+ stage: z.ZodEnum<{
290
+ idea: "idea";
291
+ building: "building";
292
+ beta: "beta";
293
+ live: "live";
294
+ }>;
295
+ platforms: z.ZodArray<z.ZodEnum<{
296
+ api: "api";
297
+ other: "other";
298
+ web: "web";
299
+ ios: "ios";
300
+ android: "android";
301
+ desktop: "desktop";
302
+ browser_extension: "browser_extension";
303
+ hardware: "hardware";
304
+ }>>;
305
+ visibility: z.ZodEnum<{
306
+ unlisted: "unlisted";
307
+ listed: "listed";
308
+ }>;
309
+ status: z.ZodEnum<{
310
+ active: "active";
311
+ archived: "archived";
312
+ }>;
313
+ rating: z.ZodObject<{
314
+ count: z.ZodNumber;
315
+ average: z.ZodNullable<z.ZodNumber>;
316
+ }, z.core.$strip>;
317
+ upvoteCount: z.ZodNumber;
318
+ openAsks: z.ZodArray<z.ZodEnum<{
319
+ feedback: "feedback";
320
+ testers: "testers";
321
+ launch: "launch";
322
+ ideas: "ideas";
323
+ }>>;
324
+ viewer: z.ZodOptional<z.ZodObject<{
325
+ upvoted: z.ZodBoolean;
326
+ canUpvote: z.ZodBoolean;
327
+ role: z.ZodNullable<z.ZodEnum<{
328
+ team: "team";
329
+ owner: "owner";
330
+ cofounder: "cofounder";
331
+ }>>;
332
+ }, z.core.$strip>>;
333
+ }, z.core.$strip>;
334
+ export type ProductCard = z.infer<typeof productCardSchema>;
335
+ /** One person on a product's team, live-joined like every byline. */
336
+ export declare const productTeamMemberSchema: z.ZodObject<{
337
+ userId: z.ZodString;
338
+ username: z.ZodString;
339
+ displayName: z.ZodString;
340
+ avatarUrl: z.ZodOptional<z.ZodURL>;
341
+ headline: z.ZodOptional<z.ZodString>;
342
+ role: z.ZodEnum<{
343
+ team: "team";
344
+ owner: "owner";
345
+ cofounder: "cofounder";
346
+ }>;
347
+ joinedAt: z.ZodISODateTime;
348
+ }, z.core.$strip>;
349
+ export type ProductTeamMember = z.infer<typeof productTeamMemberSchema>;
350
+ /**
351
+ * What THIS viewer may do on the product page, decided by the server and sent
352
+ * as plain answers (the same rule as `viewerStateSchema` on a post).
353
+ */
354
+ export declare const productViewerSchema: z.ZodObject<{
355
+ upvoted: z.ZodBoolean;
356
+ canUpvote: z.ZodBoolean;
357
+ role: z.ZodNullable<z.ZodEnum<{
358
+ team: "team";
359
+ owner: "owner";
360
+ cofounder: "cofounder";
361
+ }>>;
362
+ invited: z.ZodBoolean;
363
+ reviewId: z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
364
+ tester: z.ZodBoolean;
365
+ canEdit: z.ZodBoolean;
366
+ canManageTeam: z.ZodBoolean;
367
+ canDelete: z.ZodBoolean;
368
+ canRepresent: z.ZodBoolean;
369
+ canReview: z.ZodBoolean;
370
+ canReport: z.ZodBoolean;
371
+ missingForListing: z.ZodArray<z.ZodEnum<{
372
+ logo: "logo";
373
+ tagline: "tagline";
374
+ screenshot: "screenshot";
375
+ }>>;
376
+ }, z.core.$strip>;
377
+ export type ProductViewer = z.infer<typeof productViewerSchema>;
378
+ /** The product page. */
379
+ export declare const productSchema: z.ZodObject<{
380
+ id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
381
+ slug: z.ZodString;
382
+ name: z.ZodString;
383
+ tagline: z.ZodOptional<z.ZodString>;
384
+ logo: z.ZodOptional<z.ZodObject<{
385
+ id: z.ZodString;
386
+ url: z.ZodURL;
387
+ width: z.ZodNumber;
388
+ height: z.ZodNumber;
389
+ variants: z.ZodArray<z.ZodObject<{
390
+ width: z.ZodNumber;
391
+ height: z.ZodNumber;
392
+ url: z.ZodURL;
393
+ }, z.core.$strip>>;
394
+ placeholder: z.ZodOptional<z.ZodString>;
395
+ }, z.core.$strip>>;
396
+ cover: z.ZodOptional<z.ZodObject<{
397
+ id: z.ZodString;
398
+ url: z.ZodURL;
399
+ width: z.ZodNumber;
400
+ height: z.ZodNumber;
401
+ variants: z.ZodArray<z.ZodObject<{
402
+ width: z.ZodNumber;
403
+ height: z.ZodNumber;
404
+ url: z.ZodURL;
405
+ }, z.core.$strip>>;
406
+ placeholder: z.ZodOptional<z.ZodString>;
407
+ }, z.core.$strip>>;
408
+ industry: z.ZodEnum<{
409
+ agritech: "agritech";
410
+ ai_ml: "ai_ml";
411
+ b2b_saas: "b2b_saas";
412
+ consumer: "consumer";
413
+ climate: "climate";
414
+ d2c: "d2c";
415
+ deeptech: "deeptech";
416
+ edtech: "edtech";
417
+ fintech: "fintech";
418
+ gaming: "gaming";
419
+ healthtech: "healthtech";
420
+ logistics: "logistics";
421
+ manufacturing: "manufacturing";
422
+ marketplace: "marketplace";
423
+ media: "media";
424
+ mobility: "mobility";
425
+ proptech: "proptech";
426
+ robotics: "robotics";
427
+ services: "services";
428
+ space: "space";
429
+ other: "other";
430
+ }>;
431
+ stage: z.ZodEnum<{
432
+ idea: "idea";
433
+ building: "building";
434
+ beta: "beta";
435
+ live: "live";
436
+ }>;
437
+ platforms: z.ZodArray<z.ZodEnum<{
438
+ api: "api";
439
+ other: "other";
440
+ web: "web";
441
+ ios: "ios";
442
+ android: "android";
443
+ desktop: "desktop";
444
+ browser_extension: "browser_extension";
445
+ hardware: "hardware";
446
+ }>>;
447
+ visibility: z.ZodEnum<{
448
+ unlisted: "unlisted";
449
+ listed: "listed";
450
+ }>;
451
+ status: z.ZodEnum<{
452
+ active: "active";
453
+ archived: "archived";
454
+ }>;
455
+ rating: z.ZodObject<{
456
+ count: z.ZodNumber;
457
+ average: z.ZodNullable<z.ZodNumber>;
458
+ }, z.core.$strip>;
459
+ upvoteCount: z.ZodNumber;
460
+ openAsks: z.ZodArray<z.ZodEnum<{
461
+ feedback: "feedback";
462
+ testers: "testers";
463
+ launch: "launch";
464
+ ideas: "ideas";
465
+ }>>;
466
+ description: z.ZodOptional<z.ZodString>;
467
+ links: z.ZodObject<{
468
+ website: z.ZodOptional<z.ZodURL>;
469
+ appStore: z.ZodOptional<z.ZodURL>;
470
+ playStore: z.ZodOptional<z.ZodURL>;
471
+ github: z.ZodOptional<z.ZodURL>;
472
+ }, z.core.$strip>;
473
+ videoUrl: z.ZodOptional<z.ZodString>;
474
+ topics: z.ZodArray<z.ZodEnum<{
475
+ ai_ml: "ai_ml";
476
+ b2b_saas: "b2b_saas";
477
+ d2c: "d2c";
478
+ deeptech: "deeptech";
479
+ robotics: "robotics";
480
+ growth: "growth";
481
+ sales: "sales";
482
+ marketing: "marketing";
483
+ supply_chain: "supply_chain";
484
+ fundraising: "fundraising";
485
+ mentoring: "mentoring";
486
+ leadership: "leadership";
487
+ networking: "networking";
488
+ public_speaking: "public_speaking";
489
+ teaching: "teaching";
490
+ hiring_talent: "hiring_talent";
491
+ personal_branding: "personal_branding";
492
+ career_transition: "career_transition";
493
+ remote_work: "remote_work";
494
+ blockchain: "blockchain";
495
+ crypto_web3: "crypto_web3";
496
+ data_science: "data_science";
497
+ cybersecurity: "cybersecurity";
498
+ game_dev: "game_dev";
499
+ ux_design: "ux_design";
500
+ app_development: "app_development";
501
+ open_source: "open_source";
502
+ electronics: "electronics";
503
+ space_exploration: "space_exploration";
504
+ green_tech: "green_tech";
505
+ no_code: "no_code";
506
+ entrepreneurship: "entrepreneurship";
507
+ investing: "investing";
508
+ stock_trading: "stock_trading";
509
+ personal_finance: "personal_finance";
510
+ consulting: "consulting";
511
+ ecommerce: "ecommerce";
512
+ retail: "retail";
513
+ real_estate: "real_estate";
514
+ product_management: "product_management";
515
+ meditation: "meditation";
516
+ journaling: "journaling";
517
+ self_improvement: "self_improvement";
518
+ productivity: "productivity";
519
+ reading: "reading";
520
+ online_courses: "online_courses";
521
+ philosophy: "philosophy";
522
+ psychology: "psychology";
523
+ therapy: "therapy";
524
+ sleep_optimization: "sleep_optimization";
525
+ gym: "gym";
526
+ yoga: "yoga";
527
+ photography: "photography";
528
+ writing: "writing";
529
+ graphic_design: "graphic_design";
530
+ filmmaking: "filmmaking";
531
+ digital_art: "digital_art";
532
+ content_creation: "content_creation";
533
+ blogging: "blogging";
534
+ vlogging: "vlogging";
535
+ podcasts: "podcasts";
536
+ animation: "animation";
537
+ music_production: "music_production";
538
+ volunteering: "volunteering";
539
+ ngo_work: "ngo_work";
540
+ environmental: "environmental";
541
+ women_empowerment: "women_empowerment";
542
+ community_service: "community_service";
543
+ social_enterprise: "social_enterprise";
544
+ education_access: "education_access";
545
+ }>>;
546
+ screenshots: z.ZodArray<z.ZodObject<{
547
+ id: z.ZodString;
548
+ url: z.ZodURL;
549
+ width: z.ZodNumber;
550
+ height: z.ZodNumber;
551
+ variants: z.ZodArray<z.ZodObject<{
552
+ width: z.ZodNumber;
553
+ height: z.ZodNumber;
554
+ url: z.ZodURL;
555
+ }, z.core.$strip>>;
556
+ placeholder: z.ZodOptional<z.ZodString>;
557
+ caption: z.ZodOptional<z.ZodString>;
558
+ }, z.core.$strip>>;
559
+ team: z.ZodArray<z.ZodObject<{
560
+ userId: z.ZodString;
561
+ username: z.ZodString;
562
+ displayName: z.ZodString;
563
+ avatarUrl: z.ZodOptional<z.ZodURL>;
564
+ headline: z.ZodOptional<z.ZodString>;
565
+ role: z.ZodEnum<{
566
+ team: "team";
567
+ owner: "owner";
568
+ cofounder: "cofounder";
569
+ }>;
570
+ joinedAt: z.ZodISODateTime;
571
+ }, z.core.$strip>>;
572
+ teamCount: z.ZodNumber;
573
+ counts: z.ZodObject<{
574
+ posts: z.ZodNumber;
575
+ feedback: z.ZodNumber;
576
+ testers: z.ZodNumber;
577
+ }, z.core.$strip>;
578
+ listedAt: z.ZodNullable<z.ZodISODateTime>;
579
+ createdAt: z.ZodISODateTime;
580
+ updatedAt: z.ZodISODateTime;
581
+ hiddenByStaff: z.ZodOptional<z.ZodBoolean>;
582
+ viewer: z.ZodOptional<z.ZodObject<{
583
+ upvoted: z.ZodBoolean;
584
+ canUpvote: z.ZodBoolean;
585
+ role: z.ZodNullable<z.ZodEnum<{
586
+ team: "team";
587
+ owner: "owner";
588
+ cofounder: "cofounder";
589
+ }>>;
590
+ invited: z.ZodBoolean;
591
+ reviewId: z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
592
+ tester: z.ZodBoolean;
593
+ canEdit: z.ZodBoolean;
594
+ canManageTeam: z.ZodBoolean;
595
+ canDelete: z.ZodBoolean;
596
+ canRepresent: z.ZodBoolean;
597
+ canReview: z.ZodBoolean;
598
+ canReport: z.ZodBoolean;
599
+ missingForListing: z.ZodArray<z.ZodEnum<{
600
+ logo: "logo";
601
+ tagline: "tagline";
602
+ screenshot: "screenshot";
603
+ }>>;
604
+ }, z.core.$strip>>;
605
+ }, z.core.$strip>;
606
+ export type Product = z.infer<typeof productSchema>;
607
+ /**
608
+ * An invitation the team sent and nobody has answered yet, as its managers see
609
+ * it (`GET /products/:id/invites`): who, for what role, sent by whom. The owner
610
+ * may change its role (`PUT /team/:userId`) or cancel it (`DELETE /team/:userId`).
611
+ */
612
+ export declare const productPendingInviteSchema: z.ZodObject<{
613
+ member: z.ZodObject<{
614
+ userId: z.ZodString;
615
+ username: z.ZodString;
616
+ displayName: z.ZodString;
617
+ avatarUrl: z.ZodOptional<z.ZodURL>;
618
+ headline: z.ZodOptional<z.ZodString>;
619
+ }, z.core.$strip>;
620
+ role: z.ZodEnum<{
621
+ team: "team";
622
+ cofounder: "cofounder";
623
+ }>;
624
+ invitedBy: z.ZodNullable<z.ZodObject<{
625
+ userId: z.ZodString;
626
+ username: z.ZodString;
627
+ displayName: z.ZodString;
628
+ avatarUrl: z.ZodOptional<z.ZodURL>;
629
+ headline: z.ZodOptional<z.ZodString>;
630
+ }, z.core.$strip>>;
631
+ invitedAt: z.ZodISODateTime;
632
+ }, z.core.$strip>;
633
+ export type ProductPendingInvite = z.infer<typeof productPendingInviteSchema>;
634
+ /** A team invitation waiting for the viewer's answer. */
635
+ export declare const productInviteSchema: z.ZodObject<{
636
+ product: z.ZodObject<{
637
+ id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
638
+ slug: z.ZodString;
639
+ name: z.ZodString;
640
+ logoUrl: z.ZodOptional<z.ZodURL>;
641
+ tagline: z.ZodOptional<z.ZodString>;
642
+ }, z.core.$strip>;
643
+ role: z.ZodEnum<{
644
+ team: "team";
645
+ cofounder: "cofounder";
646
+ }>;
647
+ invitedBy: z.ZodNullable<z.ZodObject<{
648
+ userId: z.ZodString;
649
+ username: z.ZodString;
650
+ displayName: z.ZodString;
651
+ avatarUrl: z.ZodOptional<z.ZodURL>;
652
+ headline: z.ZodOptional<z.ZodString>;
653
+ }, z.core.$strip>>;
654
+ invitedAt: z.ZodISODateTime;
655
+ }, z.core.$strip>;
656
+ export type ProductInvite = z.infer<typeof productInviteSchema>;
657
+ /** `GET /products/invites`. Never paged: invitations are few, and each needs an answer. */
658
+ export declare const productInvitesSchema: z.ZodObject<{
659
+ items: z.ZodArray<z.ZodObject<{
660
+ product: z.ZodObject<{
661
+ id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
662
+ slug: z.ZodString;
663
+ name: z.ZodString;
664
+ logoUrl: z.ZodOptional<z.ZodURL>;
665
+ tagline: z.ZodOptional<z.ZodString>;
666
+ }, z.core.$strip>;
667
+ role: z.ZodEnum<{
668
+ team: "team";
669
+ cofounder: "cofounder";
670
+ }>;
671
+ invitedBy: z.ZodNullable<z.ZodObject<{
672
+ userId: z.ZodString;
673
+ username: z.ZodString;
674
+ displayName: z.ZodString;
675
+ avatarUrl: z.ZodOptional<z.ZodURL>;
676
+ headline: z.ZodOptional<z.ZodString>;
677
+ }, z.core.$strip>>;
678
+ invitedAt: z.ZodISODateTime;
679
+ }, z.core.$strip>>;
680
+ }, z.core.$strip>;
681
+ export type ProductInvites = z.infer<typeof productInvitesSchema>;
682
+ /**
683
+ * `GET /products/mine`: every product the viewer is on the team of, archived
684
+ * included, owned first. Not paged: a founder owns at most `PRODUCTS_OWNED_MAX`.
685
+ */
686
+ export declare const myProductsSchema: z.ZodObject<{
687
+ items: z.ZodArray<z.ZodObject<{
688
+ id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
689
+ slug: z.ZodString;
690
+ name: z.ZodString;
691
+ tagline: z.ZodOptional<z.ZodString>;
692
+ logo: z.ZodOptional<z.ZodObject<{
693
+ id: z.ZodString;
694
+ url: z.ZodURL;
695
+ width: z.ZodNumber;
696
+ height: z.ZodNumber;
697
+ variants: z.ZodArray<z.ZodObject<{
698
+ width: z.ZodNumber;
699
+ height: z.ZodNumber;
700
+ url: z.ZodURL;
701
+ }, z.core.$strip>>;
702
+ placeholder: z.ZodOptional<z.ZodString>;
703
+ }, z.core.$strip>>;
704
+ cover: z.ZodOptional<z.ZodObject<{
705
+ id: z.ZodString;
706
+ url: z.ZodURL;
707
+ width: z.ZodNumber;
708
+ height: z.ZodNumber;
709
+ variants: z.ZodArray<z.ZodObject<{
710
+ width: z.ZodNumber;
711
+ height: z.ZodNumber;
712
+ url: z.ZodURL;
713
+ }, z.core.$strip>>;
714
+ placeholder: z.ZodOptional<z.ZodString>;
715
+ }, z.core.$strip>>;
716
+ industry: z.ZodEnum<{
717
+ agritech: "agritech";
718
+ ai_ml: "ai_ml";
719
+ b2b_saas: "b2b_saas";
720
+ consumer: "consumer";
721
+ climate: "climate";
722
+ d2c: "d2c";
723
+ deeptech: "deeptech";
724
+ edtech: "edtech";
725
+ fintech: "fintech";
726
+ gaming: "gaming";
727
+ healthtech: "healthtech";
728
+ logistics: "logistics";
729
+ manufacturing: "manufacturing";
730
+ marketplace: "marketplace";
731
+ media: "media";
732
+ mobility: "mobility";
733
+ proptech: "proptech";
734
+ robotics: "robotics";
735
+ services: "services";
736
+ space: "space";
737
+ other: "other";
738
+ }>;
739
+ stage: z.ZodEnum<{
740
+ idea: "idea";
741
+ building: "building";
742
+ beta: "beta";
743
+ live: "live";
744
+ }>;
745
+ platforms: z.ZodArray<z.ZodEnum<{
746
+ api: "api";
747
+ other: "other";
748
+ web: "web";
749
+ ios: "ios";
750
+ android: "android";
751
+ desktop: "desktop";
752
+ browser_extension: "browser_extension";
753
+ hardware: "hardware";
754
+ }>>;
755
+ visibility: z.ZodEnum<{
756
+ unlisted: "unlisted";
757
+ listed: "listed";
758
+ }>;
759
+ status: z.ZodEnum<{
760
+ active: "active";
761
+ archived: "archived";
762
+ }>;
763
+ rating: z.ZodObject<{
764
+ count: z.ZodNumber;
765
+ average: z.ZodNullable<z.ZodNumber>;
766
+ }, z.core.$strip>;
767
+ upvoteCount: z.ZodNumber;
768
+ openAsks: z.ZodArray<z.ZodEnum<{
769
+ feedback: "feedback";
770
+ testers: "testers";
771
+ launch: "launch";
772
+ ideas: "ideas";
773
+ }>>;
774
+ viewer: z.ZodOptional<z.ZodObject<{
775
+ upvoted: z.ZodBoolean;
776
+ canUpvote: z.ZodBoolean;
777
+ role: z.ZodNullable<z.ZodEnum<{
778
+ team: "team";
779
+ owner: "owner";
780
+ cofounder: "cofounder";
781
+ }>>;
782
+ }, z.core.$strip>>;
783
+ }, z.core.$strip>>;
784
+ }, z.core.$strip>;
785
+ export type MyProducts = z.infer<typeof myProductsSchema>;
786
+ /** A member the team confirmed tested the product. */
787
+ export declare const productTesterSchema: z.ZodObject<{
788
+ member: z.ZodObject<{
789
+ userId: z.ZodString;
790
+ username: z.ZodString;
791
+ displayName: z.ZodString;
792
+ avatarUrl: z.ZodOptional<z.ZodURL>;
793
+ headline: z.ZodOptional<z.ZodString>;
794
+ }, z.core.$strip>;
795
+ confirmedAt: z.ZodISODateTime;
796
+ }, z.core.$strip>;
797
+ export type ProductTester = z.infer<typeof productTesterSchema>;
798
+ export declare const productCardPageSchema: z.ZodObject<{
799
+ items: z.ZodArray<z.ZodObject<{
800
+ id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
801
+ slug: z.ZodString;
802
+ name: z.ZodString;
803
+ tagline: z.ZodOptional<z.ZodString>;
804
+ logo: z.ZodOptional<z.ZodObject<{
805
+ id: z.ZodString;
806
+ url: z.ZodURL;
807
+ width: z.ZodNumber;
808
+ height: z.ZodNumber;
809
+ variants: z.ZodArray<z.ZodObject<{
810
+ width: z.ZodNumber;
811
+ height: z.ZodNumber;
812
+ url: z.ZodURL;
813
+ }, z.core.$strip>>;
814
+ placeholder: z.ZodOptional<z.ZodString>;
815
+ }, z.core.$strip>>;
816
+ cover: z.ZodOptional<z.ZodObject<{
817
+ id: z.ZodString;
818
+ url: z.ZodURL;
819
+ width: z.ZodNumber;
820
+ height: z.ZodNumber;
821
+ variants: z.ZodArray<z.ZodObject<{
822
+ width: z.ZodNumber;
823
+ height: z.ZodNumber;
824
+ url: z.ZodURL;
825
+ }, z.core.$strip>>;
826
+ placeholder: z.ZodOptional<z.ZodString>;
827
+ }, z.core.$strip>>;
828
+ industry: z.ZodEnum<{
829
+ agritech: "agritech";
830
+ ai_ml: "ai_ml";
831
+ b2b_saas: "b2b_saas";
832
+ consumer: "consumer";
833
+ climate: "climate";
834
+ d2c: "d2c";
835
+ deeptech: "deeptech";
836
+ edtech: "edtech";
837
+ fintech: "fintech";
838
+ gaming: "gaming";
839
+ healthtech: "healthtech";
840
+ logistics: "logistics";
841
+ manufacturing: "manufacturing";
842
+ marketplace: "marketplace";
843
+ media: "media";
844
+ mobility: "mobility";
845
+ proptech: "proptech";
846
+ robotics: "robotics";
847
+ services: "services";
848
+ space: "space";
849
+ other: "other";
850
+ }>;
851
+ stage: z.ZodEnum<{
852
+ idea: "idea";
853
+ building: "building";
854
+ beta: "beta";
855
+ live: "live";
856
+ }>;
857
+ platforms: z.ZodArray<z.ZodEnum<{
858
+ api: "api";
859
+ other: "other";
860
+ web: "web";
861
+ ios: "ios";
862
+ android: "android";
863
+ desktop: "desktop";
864
+ browser_extension: "browser_extension";
865
+ hardware: "hardware";
866
+ }>>;
867
+ visibility: z.ZodEnum<{
868
+ unlisted: "unlisted";
869
+ listed: "listed";
870
+ }>;
871
+ status: z.ZodEnum<{
872
+ active: "active";
873
+ archived: "archived";
874
+ }>;
875
+ rating: z.ZodObject<{
876
+ count: z.ZodNumber;
877
+ average: z.ZodNullable<z.ZodNumber>;
878
+ }, z.core.$strip>;
879
+ upvoteCount: z.ZodNumber;
880
+ openAsks: z.ZodArray<z.ZodEnum<{
881
+ feedback: "feedback";
882
+ testers: "testers";
883
+ launch: "launch";
884
+ ideas: "ideas";
885
+ }>>;
886
+ viewer: z.ZodOptional<z.ZodObject<{
887
+ upvoted: z.ZodBoolean;
888
+ canUpvote: z.ZodBoolean;
889
+ role: z.ZodNullable<z.ZodEnum<{
890
+ team: "team";
891
+ owner: "owner";
892
+ cofounder: "cofounder";
893
+ }>>;
894
+ }, z.core.$strip>>;
895
+ }, z.core.$strip>>;
896
+ nextCursor: z.ZodNullable<z.ZodString>;
897
+ }, z.core.$strip>;
898
+ export type ProductCardPage = z.infer<typeof productCardPageSchema>;
899
+ export declare const productTeamPageSchema: z.ZodObject<{
900
+ items: z.ZodArray<z.ZodObject<{
901
+ userId: z.ZodString;
902
+ username: z.ZodString;
903
+ displayName: z.ZodString;
904
+ avatarUrl: z.ZodOptional<z.ZodURL>;
905
+ headline: z.ZodOptional<z.ZodString>;
906
+ role: z.ZodEnum<{
907
+ team: "team";
908
+ owner: "owner";
909
+ cofounder: "cofounder";
910
+ }>;
911
+ joinedAt: z.ZodISODateTime;
912
+ }, z.core.$strip>>;
913
+ nextCursor: z.ZodNullable<z.ZodString>;
914
+ }, z.core.$strip>;
915
+ export type ProductTeamPage = z.infer<typeof productTeamPageSchema>;
916
+ export declare const productTesterPageSchema: z.ZodObject<{
917
+ items: z.ZodArray<z.ZodObject<{
918
+ member: z.ZodObject<{
919
+ userId: z.ZodString;
920
+ username: z.ZodString;
921
+ displayName: z.ZodString;
922
+ avatarUrl: z.ZodOptional<z.ZodURL>;
923
+ headline: z.ZodOptional<z.ZodString>;
924
+ }, z.core.$strip>;
925
+ confirmedAt: z.ZodISODateTime;
926
+ }, z.core.$strip>>;
927
+ nextCursor: z.ZodNullable<z.ZodString>;
928
+ }, z.core.$strip>;
929
+ export type ProductTesterPage = z.infer<typeof productTesterPageSchema>;
930
+ /** Newest first. */
931
+ export declare const productPendingInvitePageSchema: z.ZodObject<{
932
+ items: z.ZodArray<z.ZodObject<{
933
+ member: z.ZodObject<{
934
+ userId: z.ZodString;
935
+ username: z.ZodString;
936
+ displayName: z.ZodString;
937
+ avatarUrl: z.ZodOptional<z.ZodURL>;
938
+ headline: z.ZodOptional<z.ZodString>;
939
+ }, z.core.$strip>;
940
+ role: z.ZodEnum<{
941
+ team: "team";
942
+ cofounder: "cofounder";
943
+ }>;
944
+ invitedBy: z.ZodNullable<z.ZodObject<{
945
+ userId: z.ZodString;
946
+ username: z.ZodString;
947
+ displayName: z.ZodString;
948
+ avatarUrl: z.ZodOptional<z.ZodURL>;
949
+ headline: z.ZodOptional<z.ZodString>;
950
+ }, z.core.$strip>>;
951
+ invitedAt: z.ZodISODateTime;
952
+ }, z.core.$strip>>;
953
+ nextCursor: z.ZodNullable<z.ZodString>;
954
+ }, z.core.$strip>;
955
+ export type ProductPendingInvitePage = z.infer<typeof productPendingInvitePageSchema>;
956
+ /** `PUT|DELETE /products/:id/upvote`: the state it settled on and the fresh count. */
957
+ export declare const productUpvoteResponseSchema: z.ZodObject<{
958
+ productId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
959
+ upvoted: z.ZodBoolean;
960
+ upvoteCount: z.ZodNumber;
961
+ }, z.core.$strip>;
962
+ export type ProductUpvoteResponse = z.infer<typeof productUpvoteResponseSchema>;
963
+ export declare const productFacetsSchema: z.ZodObject<{
964
+ industries: z.ZodArray<z.ZodObject<{
965
+ value: z.ZodEnum<{
966
+ agritech: "agritech";
967
+ ai_ml: "ai_ml";
968
+ b2b_saas: "b2b_saas";
969
+ consumer: "consumer";
970
+ climate: "climate";
971
+ d2c: "d2c";
972
+ deeptech: "deeptech";
973
+ edtech: "edtech";
974
+ fintech: "fintech";
975
+ gaming: "gaming";
976
+ healthtech: "healthtech";
977
+ logistics: "logistics";
978
+ manufacturing: "manufacturing";
979
+ marketplace: "marketplace";
980
+ media: "media";
981
+ mobility: "mobility";
982
+ proptech: "proptech";
983
+ robotics: "robotics";
984
+ services: "services";
985
+ space: "space";
986
+ other: "other";
987
+ }>;
988
+ count: z.ZodNumber;
989
+ }, z.core.$strip>>;
990
+ stages: z.ZodArray<z.ZodObject<{
991
+ value: z.ZodEnum<{
992
+ idea: "idea";
993
+ building: "building";
994
+ beta: "beta";
995
+ live: "live";
996
+ }>;
997
+ count: z.ZodNumber;
998
+ }, z.core.$strip>>;
999
+ platforms: z.ZodArray<z.ZodObject<{
1000
+ value: z.ZodEnum<{
1001
+ api: "api";
1002
+ other: "other";
1003
+ web: "web";
1004
+ ios: "ios";
1005
+ android: "android";
1006
+ desktop: "desktop";
1007
+ browser_extension: "browser_extension";
1008
+ hardware: "hardware";
1009
+ }>;
1010
+ count: z.ZodNumber;
1011
+ }, z.core.$strip>>;
1012
+ asks: z.ZodArray<z.ZodObject<{
1013
+ value: z.ZodEnum<{
1014
+ feedback: "feedback";
1015
+ testers: "testers";
1016
+ launch: "launch";
1017
+ ideas: "ideas";
1018
+ }>;
1019
+ count: z.ZodNumber;
1020
+ }, z.core.$strip>>;
1021
+ }, z.core.$strip>;
1022
+ export type ProductFacets = z.infer<typeof productFacetsSchema>;
1023
+ /**
1024
+ * `GET /api/v1/products`: LISTED products only. Filters of one kind mean "any
1025
+ * of", different kinds combine ("fintech AND beta"). `ask` keeps products
1026
+ * whose ask is open now. `q` matches the start of the name; an emptied box
1027
+ * (`?q=`) is no search, never a 400.
1028
+ */
1029
+ export declare const productDiscoverQuerySchema: z.ZodObject<{
1030
+ limit: z.ZodPreprocess<z.ZodDefault<z.ZodCoercedNumber<unknown>>, unknown>;
1031
+ cursor: z.ZodOptional<z.ZodString>;
1032
+ sort: z.ZodPreprocess<z.ZodDefault<z.ZodEnum<{
1033
+ trending: "trending";
1034
+ new: "new";
1035
+ top_rated: "top_rated";
1036
+ }>>, unknown>;
1037
+ q: z.ZodPreprocess<z.ZodOptional<z.ZodString>, unknown>;
1038
+ industry: z.ZodPreprocess<z.ZodOptional<z.ZodArray<z.ZodEnum<{
1039
+ agritech: "agritech";
1040
+ ai_ml: "ai_ml";
1041
+ b2b_saas: "b2b_saas";
1042
+ consumer: "consumer";
1043
+ climate: "climate";
1044
+ d2c: "d2c";
1045
+ deeptech: "deeptech";
1046
+ edtech: "edtech";
1047
+ fintech: "fintech";
1048
+ gaming: "gaming";
1049
+ healthtech: "healthtech";
1050
+ logistics: "logistics";
1051
+ manufacturing: "manufacturing";
1052
+ marketplace: "marketplace";
1053
+ media: "media";
1054
+ mobility: "mobility";
1055
+ proptech: "proptech";
1056
+ robotics: "robotics";
1057
+ services: "services";
1058
+ space: "space";
1059
+ other: "other";
1060
+ }>>>, unknown>;
1061
+ stage: z.ZodPreprocess<z.ZodOptional<z.ZodArray<z.ZodEnum<{
1062
+ idea: "idea";
1063
+ building: "building";
1064
+ beta: "beta";
1065
+ live: "live";
1066
+ }>>>, unknown>;
1067
+ platform: z.ZodPreprocess<z.ZodOptional<z.ZodArray<z.ZodEnum<{
1068
+ api: "api";
1069
+ other: "other";
1070
+ web: "web";
1071
+ ios: "ios";
1072
+ android: "android";
1073
+ desktop: "desktop";
1074
+ browser_extension: "browser_extension";
1075
+ hardware: "hardware";
1076
+ }>>>, unknown>;
1077
+ ask: z.ZodPreprocess<z.ZodOptional<z.ZodEnum<{
1078
+ feedback: "feedback";
1079
+ testers: "testers";
1080
+ launch: "launch";
1081
+ ideas: "ideas";
1082
+ }>>, unknown>;
1083
+ }, z.core.$strip>;
1084
+ export type ProductDiscoverQuery = z.infer<typeof productDiscoverQuerySchema>;
1085
+ export type ProductDiscoverQueryInput = z.input<typeof productDiscoverQuerySchema>;
1086
+ /**
1087
+ * `GET /products/:id/feedback`: comments from outside its team on the posts
1088
+ * and polls tagged with it, newest first. `helpful=true` narrows to the ones
1089
+ * the team marked as having helped.
1090
+ */
1091
+ export declare const productFeedbackQuerySchema: z.ZodObject<{
1092
+ limit: z.ZodPreprocess<z.ZodDefault<z.ZodCoercedNumber<unknown>>, unknown>;
1093
+ cursor: z.ZodOptional<z.ZodString>;
1094
+ helpful: z.ZodPreprocess<z.ZodDefault<z.ZodCodec<z.ZodString, z.ZodBoolean>>, unknown>;
1095
+ }, z.core.$strip>;
1096
+ export type ProductFeedbackQuery = z.infer<typeof productFeedbackQuerySchema>;
1097
+ export type ProductFeedbackQueryInput = z.input<typeof productFeedbackQuerySchema>;
1098
+ export declare const productParamsSchema: z.ZodObject<{
1099
+ productId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1100
+ }, z.core.$strip>;
1101
+ export type ProductParams = z.infer<typeof productParamsSchema>;
1102
+ /** `/products/:productId/team/:userId`, `/products/:productId/testers/:userId`. */
1103
+ export declare const productMemberParamsSchema: z.ZodObject<{
1104
+ productId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1105
+ userId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1106
+ }, z.core.$strip>;
1107
+ export type ProductMemberParams = z.infer<typeof productMemberParamsSchema>;
1108
+ /** `/products/by-member/:userId`. */
1109
+ export declare const productsByMemberParamsSchema: z.ZodObject<{
1110
+ userId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1111
+ }, z.core.$strip>;
1112
+ export type ProductsByMemberParams = z.infer<typeof productsByMemberParamsSchema>;
1113
+ /** A screenshot on the way in: an uploaded, processed image id, and its caption. */
1114
+ export declare const productScreenshotInputSchema: z.ZodObject<{
1115
+ mediaId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1116
+ caption: z.ZodOptional<z.ZodString>;
1117
+ }, z.core.$strip>;
1118
+ export type ProductScreenshotInput = z.infer<typeof productScreenshotInputSchema>;
1119
+ /**
1120
+ * `POST /api/v1/products`. Starts `unlisted`, owned by the caller. The logo
1121
+ * and screenshots may come now or later (uploaded first, purpose
1122
+ * `product_logo` / `product_screenshot`, like a post's images).
1123
+ */
1124
+ export declare const createProductBodySchema: z.ZodObject<{
1125
+ name: z.ZodString;
1126
+ tagline: z.ZodOptional<z.ZodString>;
1127
+ description: z.ZodOptional<z.ZodString>;
1128
+ industry: z.ZodEnum<{
1129
+ agritech: "agritech";
1130
+ ai_ml: "ai_ml";
1131
+ b2b_saas: "b2b_saas";
1132
+ consumer: "consumer";
1133
+ climate: "climate";
1134
+ d2c: "d2c";
1135
+ deeptech: "deeptech";
1136
+ edtech: "edtech";
1137
+ fintech: "fintech";
1138
+ gaming: "gaming";
1139
+ healthtech: "healthtech";
1140
+ logistics: "logistics";
1141
+ manufacturing: "manufacturing";
1142
+ marketplace: "marketplace";
1143
+ media: "media";
1144
+ mobility: "mobility";
1145
+ proptech: "proptech";
1146
+ robotics: "robotics";
1147
+ services: "services";
1148
+ space: "space";
1149
+ other: "other";
1150
+ }>;
1151
+ stage: z.ZodEnum<{
1152
+ idea: "idea";
1153
+ building: "building";
1154
+ beta: "beta";
1155
+ live: "live";
1156
+ }>;
1157
+ platforms: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1158
+ api: "api";
1159
+ other: "other";
1160
+ web: "web";
1161
+ ios: "ios";
1162
+ android: "android";
1163
+ desktop: "desktop";
1164
+ browser_extension: "browser_extension";
1165
+ hardware: "hardware";
1166
+ }>>>;
1167
+ topics: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1168
+ ai_ml: "ai_ml";
1169
+ b2b_saas: "b2b_saas";
1170
+ d2c: "d2c";
1171
+ deeptech: "deeptech";
1172
+ robotics: "robotics";
1173
+ growth: "growth";
1174
+ sales: "sales";
1175
+ marketing: "marketing";
1176
+ supply_chain: "supply_chain";
1177
+ fundraising: "fundraising";
1178
+ mentoring: "mentoring";
1179
+ leadership: "leadership";
1180
+ networking: "networking";
1181
+ public_speaking: "public_speaking";
1182
+ teaching: "teaching";
1183
+ hiring_talent: "hiring_talent";
1184
+ personal_branding: "personal_branding";
1185
+ career_transition: "career_transition";
1186
+ remote_work: "remote_work";
1187
+ blockchain: "blockchain";
1188
+ crypto_web3: "crypto_web3";
1189
+ data_science: "data_science";
1190
+ cybersecurity: "cybersecurity";
1191
+ game_dev: "game_dev";
1192
+ ux_design: "ux_design";
1193
+ app_development: "app_development";
1194
+ open_source: "open_source";
1195
+ electronics: "electronics";
1196
+ space_exploration: "space_exploration";
1197
+ green_tech: "green_tech";
1198
+ no_code: "no_code";
1199
+ entrepreneurship: "entrepreneurship";
1200
+ investing: "investing";
1201
+ stock_trading: "stock_trading";
1202
+ personal_finance: "personal_finance";
1203
+ consulting: "consulting";
1204
+ ecommerce: "ecommerce";
1205
+ retail: "retail";
1206
+ real_estate: "real_estate";
1207
+ product_management: "product_management";
1208
+ meditation: "meditation";
1209
+ journaling: "journaling";
1210
+ self_improvement: "self_improvement";
1211
+ productivity: "productivity";
1212
+ reading: "reading";
1213
+ online_courses: "online_courses";
1214
+ philosophy: "philosophy";
1215
+ psychology: "psychology";
1216
+ therapy: "therapy";
1217
+ sleep_optimization: "sleep_optimization";
1218
+ gym: "gym";
1219
+ yoga: "yoga";
1220
+ photography: "photography";
1221
+ writing: "writing";
1222
+ graphic_design: "graphic_design";
1223
+ filmmaking: "filmmaking";
1224
+ digital_art: "digital_art";
1225
+ content_creation: "content_creation";
1226
+ blogging: "blogging";
1227
+ vlogging: "vlogging";
1228
+ podcasts: "podcasts";
1229
+ animation: "animation";
1230
+ music_production: "music_production";
1231
+ volunteering: "volunteering";
1232
+ ngo_work: "ngo_work";
1233
+ environmental: "environmental";
1234
+ women_empowerment: "women_empowerment";
1235
+ community_service: "community_service";
1236
+ social_enterprise: "social_enterprise";
1237
+ education_access: "education_access";
1238
+ }>>>;
1239
+ links: z.ZodOptional<z.ZodObject<{
1240
+ website: z.ZodOptional<z.ZodURL>;
1241
+ appStore: z.ZodOptional<z.ZodURL>;
1242
+ playStore: z.ZodOptional<z.ZodURL>;
1243
+ github: z.ZodOptional<z.ZodURL>;
1244
+ }, z.core.$strip>>;
1245
+ videoUrl: z.ZodOptional<z.ZodURL>;
1246
+ logoMediaId: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
1247
+ screenshots: z.ZodOptional<z.ZodArray<z.ZodObject<{
1248
+ mediaId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1249
+ caption: z.ZodOptional<z.ZodString>;
1250
+ }, z.core.$strip>>>;
1251
+ }, z.core.$strip>;
1252
+ export type CreateProductBody = z.infer<typeof createProductBodySchema>;
1253
+ /**
1254
+ * `PATCH /api/v1/products/:id`: only the keys that changed. Images, listing
1255
+ * and status have their own routes. `links` is sent whole.
1256
+ */
1257
+ export declare const updateProductBodySchema: z.ZodObject<{
1258
+ name: z.ZodOptional<z.ZodString>;
1259
+ tagline: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1260
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1261
+ industry: z.ZodOptional<z.ZodEnum<{
1262
+ agritech: "agritech";
1263
+ ai_ml: "ai_ml";
1264
+ b2b_saas: "b2b_saas";
1265
+ consumer: "consumer";
1266
+ climate: "climate";
1267
+ d2c: "d2c";
1268
+ deeptech: "deeptech";
1269
+ edtech: "edtech";
1270
+ fintech: "fintech";
1271
+ gaming: "gaming";
1272
+ healthtech: "healthtech";
1273
+ logistics: "logistics";
1274
+ manufacturing: "manufacturing";
1275
+ marketplace: "marketplace";
1276
+ media: "media";
1277
+ mobility: "mobility";
1278
+ proptech: "proptech";
1279
+ robotics: "robotics";
1280
+ services: "services";
1281
+ space: "space";
1282
+ other: "other";
1283
+ }>>;
1284
+ stage: z.ZodOptional<z.ZodEnum<{
1285
+ idea: "idea";
1286
+ building: "building";
1287
+ beta: "beta";
1288
+ live: "live";
1289
+ }>>;
1290
+ platforms: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1291
+ api: "api";
1292
+ other: "other";
1293
+ web: "web";
1294
+ ios: "ios";
1295
+ android: "android";
1296
+ desktop: "desktop";
1297
+ browser_extension: "browser_extension";
1298
+ hardware: "hardware";
1299
+ }>>>;
1300
+ topics: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1301
+ ai_ml: "ai_ml";
1302
+ b2b_saas: "b2b_saas";
1303
+ d2c: "d2c";
1304
+ deeptech: "deeptech";
1305
+ robotics: "robotics";
1306
+ growth: "growth";
1307
+ sales: "sales";
1308
+ marketing: "marketing";
1309
+ supply_chain: "supply_chain";
1310
+ fundraising: "fundraising";
1311
+ mentoring: "mentoring";
1312
+ leadership: "leadership";
1313
+ networking: "networking";
1314
+ public_speaking: "public_speaking";
1315
+ teaching: "teaching";
1316
+ hiring_talent: "hiring_talent";
1317
+ personal_branding: "personal_branding";
1318
+ career_transition: "career_transition";
1319
+ remote_work: "remote_work";
1320
+ blockchain: "blockchain";
1321
+ crypto_web3: "crypto_web3";
1322
+ data_science: "data_science";
1323
+ cybersecurity: "cybersecurity";
1324
+ game_dev: "game_dev";
1325
+ ux_design: "ux_design";
1326
+ app_development: "app_development";
1327
+ open_source: "open_source";
1328
+ electronics: "electronics";
1329
+ space_exploration: "space_exploration";
1330
+ green_tech: "green_tech";
1331
+ no_code: "no_code";
1332
+ entrepreneurship: "entrepreneurship";
1333
+ investing: "investing";
1334
+ stock_trading: "stock_trading";
1335
+ personal_finance: "personal_finance";
1336
+ consulting: "consulting";
1337
+ ecommerce: "ecommerce";
1338
+ retail: "retail";
1339
+ real_estate: "real_estate";
1340
+ product_management: "product_management";
1341
+ meditation: "meditation";
1342
+ journaling: "journaling";
1343
+ self_improvement: "self_improvement";
1344
+ productivity: "productivity";
1345
+ reading: "reading";
1346
+ online_courses: "online_courses";
1347
+ philosophy: "philosophy";
1348
+ psychology: "psychology";
1349
+ therapy: "therapy";
1350
+ sleep_optimization: "sleep_optimization";
1351
+ gym: "gym";
1352
+ yoga: "yoga";
1353
+ photography: "photography";
1354
+ writing: "writing";
1355
+ graphic_design: "graphic_design";
1356
+ filmmaking: "filmmaking";
1357
+ digital_art: "digital_art";
1358
+ content_creation: "content_creation";
1359
+ blogging: "blogging";
1360
+ vlogging: "vlogging";
1361
+ podcasts: "podcasts";
1362
+ animation: "animation";
1363
+ music_production: "music_production";
1364
+ volunteering: "volunteering";
1365
+ ngo_work: "ngo_work";
1366
+ environmental: "environmental";
1367
+ women_empowerment: "women_empowerment";
1368
+ community_service: "community_service";
1369
+ social_enterprise: "social_enterprise";
1370
+ education_access: "education_access";
1371
+ }>>>;
1372
+ links: z.ZodOptional<z.ZodObject<{
1373
+ website: z.ZodOptional<z.ZodURL>;
1374
+ appStore: z.ZodOptional<z.ZodURL>;
1375
+ playStore: z.ZodOptional<z.ZodURL>;
1376
+ github: z.ZodOptional<z.ZodURL>;
1377
+ }, z.core.$strip>>;
1378
+ videoUrl: z.ZodOptional<z.ZodNullable<z.ZodURL>>;
1379
+ }, z.core.$strip>;
1380
+ export type UpdateProductBody = z.infer<typeof updateProductBodySchema>;
1381
+ /** `PUT /products/:id/logo`: a processed `product_logo` upload. The old logo's files are deleted. */
1382
+ export declare const setProductLogoBodySchema: z.ZodObject<{
1383
+ mediaId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1384
+ }, z.core.$strip>;
1385
+ export type SetProductLogoBody = z.infer<typeof setProductLogoBodySchema>;
1386
+ /**
1387
+ * `PUT /products/:id/screenshots`: the WHOLE gallery as it should now be, in
1388
+ * order. One call adds, removes, reorders and re-captions: screenshots already
1389
+ * on the product stay; new ids must be the caller's processed
1390
+ * `product_screenshot` uploads; any left out are deleted from storage.
1391
+ */
1392
+ export declare const setProductScreenshotsBodySchema: z.ZodObject<{
1393
+ screenshots: z.ZodArray<z.ZodObject<{
1394
+ mediaId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1395
+ caption: z.ZodOptional<z.ZodString>;
1396
+ }, z.core.$strip>>;
1397
+ }, z.core.$strip>;
1398
+ export type SetProductScreenshotsBody = z.infer<typeof setProductScreenshotsBodySchema>;
1399
+ export declare const setProductVisibilityBodySchema: z.ZodObject<{
1400
+ visibility: z.ZodEnum<{
1401
+ unlisted: "unlisted";
1402
+ listed: "listed";
1403
+ }>;
1404
+ }, z.core.$strip>;
1405
+ export type SetProductVisibilityBody = z.infer<typeof setProductVisibilityBodySchema>;
1406
+ export declare const setProductStatusBodySchema: z.ZodObject<{
1407
+ status: z.ZodEnum<{
1408
+ active: "active";
1409
+ archived: "archived";
1410
+ }>;
1411
+ }, z.core.$strip>;
1412
+ export type SetProductStatusBody = z.infer<typeof setProductStatusBodySchema>;
1413
+ /**
1414
+ * Invite a member to the team; they must accept. `userId` is the member's id
1415
+ * as every card carries it (`founderCardSchema.userId`). Someone who cannot
1416
+ * join (has not finished onboarding, paused, suspended, deleted) is
1417
+ * `PRODUCT_MEMBER_NOT_INVITABLE`; someone already on it or invited,
1418
+ * `PRODUCT_ALREADY_MEMBER`.
1419
+ */
1420
+ export declare const inviteProductMemberBodySchema: z.ZodObject<{
1421
+ userId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1422
+ role: z.ZodEnum<{
1423
+ team: "team";
1424
+ cofounder: "cofounder";
1425
+ }>;
1426
+ }, z.core.$strip>;
1427
+ export type InviteProductMemberBody = z.infer<typeof inviteProductMemberBodySchema>;
1428
+ /**
1429
+ * The owner changes someone's role (on the team or still invited). The
1430
+ * owner's own role changes only by handing over (`PRODUCT_OWNER_MUST_TRANSFER`);
1431
+ * someone not on the team or invited is `PRODUCT_NOT_ON_TEAM`.
1432
+ */
1433
+ export declare const setProductMemberRoleBodySchema: z.ZodObject<{
1434
+ role: z.ZodEnum<{
1435
+ team: "team";
1436
+ cofounder: "cofounder";
1437
+ }>;
1438
+ }, z.core.$strip>;
1439
+ export type SetProductMemberRoleBody = z.infer<typeof setProductMemberRoleBodySchema>;
1440
+ /**
1441
+ * The owner hands the product to someone already on its team (not merely
1442
+ * invited: `PRODUCT_NOT_ON_TEAM`), who must have room under
1443
+ * `PRODUCTS_OWNED_MAX` (`PRODUCT_LIMIT_REACHED`). The old owner becomes a co-founder.
1444
+ */
1445
+ export declare const transferProductBodySchema: z.ZodObject<{
1446
+ userId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
1447
+ }, z.core.$strip>;
1448
+ export type TransferProductBody = z.infer<typeof transferProductBodySchema>;
1449
+ //# sourceMappingURL=products.d.ts.map