lancer-shared 1.2.1 → 1.2.3

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 (113) hide show
  1. package/dist/constants/collections.js +14 -0
  2. package/dist/constants/common-questions.js +57 -0
  3. package/dist/constants/index.js +18 -0
  4. package/dist/constants/job-filter-options.js +265 -0
  5. package/dist/constants/job-status.js +21 -0
  6. package/dist/constants/mappings/countryMapping.js +120 -0
  7. package/dist/constants/mappings/regionMapping.js +240 -0
  8. package/dist/constants/routes.js +116 -0
  9. package/dist/constants/upwork-accounts.js +18 -0
  10. package/dist/index.js +4 -0
  11. package/dist/schemas/account/account-status.js +8 -0
  12. package/dist/schemas/account/bidder-account.js +35 -0
  13. package/dist/schemas/account/index.js +3 -0
  14. package/dist/schemas/account/scraper-account.js +34 -0
  15. package/dist/schemas/ai/ai-config.d.ts +36 -0
  16. package/dist/schemas/ai/ai-config.js +9 -0
  17. package/dist/schemas/ai/index.d.ts +3 -0
  18. package/dist/schemas/ai/index.js +3 -0
  19. package/dist/schemas/ai/proposal.d.ts +82 -0
  20. package/dist/schemas/ai/proposal.js +13 -0
  21. package/dist/schemas/ai/suitability.d.ts +37 -0
  22. package/dist/schemas/ai/suitability.js +14 -0
  23. package/dist/schemas/bid/bid-result.js +11 -0
  24. package/dist/schemas/bid/bid.js +35 -0
  25. package/dist/schemas/bid/index.js +2 -0
  26. package/dist/schemas/campaign/campaign-ai-metrics.js +6 -0
  27. package/dist/schemas/campaign/campaign-analytics.js +42 -0
  28. package/dist/schemas/campaign/campaign-expenses.js +6 -0
  29. package/dist/schemas/campaign/campaign-insights.js +31 -0
  30. package/dist/schemas/campaign/campaign-integrations.js +13 -0
  31. package/dist/schemas/campaign/campaign-job-count.js +3 -0
  32. package/dist/schemas/campaign/campaign.js +41 -0
  33. package/dist/schemas/campaign/index.js +7 -0
  34. package/dist/schemas/chat-message/chat-message.js +10 -0
  35. package/dist/schemas/chat-message/index.js +1 -0
  36. package/dist/schemas/config/agency-config.js +7 -0
  37. package/dist/schemas/config/index.js +1 -0
  38. package/dist/schemas/event/index.d.ts +58 -0
  39. package/dist/schemas/index.js +17 -0
  40. package/dist/schemas/job/index.d.ts +95 -0
  41. package/dist/schemas/job-filters/index.js +1 -0
  42. package/dist/schemas/job-filters/job-filters.js +84 -0
  43. package/dist/schemas/lead/index.js +173 -0
  44. package/dist/schemas/lead/lead-note.js +27 -0
  45. package/dist/schemas/lead/lead-status.js +23 -0
  46. package/dist/schemas/lead/nuxt.js +287 -0
  47. package/dist/schemas/logger/index.js +1 -0
  48. package/dist/schemas/logger/log-event.js +117 -0
  49. package/dist/schemas/organization/index.js +70 -0
  50. package/dist/schemas/organization/member.js +7 -0
  51. package/dist/schemas/organization/organization.d.ts +118 -22
  52. package/dist/schemas/organization/organization.js +16 -0
  53. package/dist/schemas/organization/subscription.js +17 -0
  54. package/dist/schemas/proxy/index.js +3 -0
  55. package/dist/schemas/proxy/proxy-available-replacements.js +3 -0
  56. package/dist/schemas/proxy/proxy-country.js +249 -0
  57. package/dist/schemas/proxy/proxy.js +29 -0
  58. package/dist/schemas/saved-search/index.js +9 -0
  59. package/dist/schemas/scraper/index.js +2 -0
  60. package/dist/schemas/scraper/scrape-payload.js +21 -0
  61. package/dist/schemas/scraper/scrape-result.js +23 -0
  62. package/dist/schemas/shared.js +19 -0
  63. package/dist/schemas/time-filter/index.js +6 -0
  64. package/dist/schemas/transaction/index.js +17 -0
  65. package/dist/schemas/usage/index.js +18 -0
  66. package/dist/schemas/user/index.js +52 -0
  67. package/dist/types/account/account-status.js +1 -0
  68. package/dist/types/account/bidder-account.js +1 -0
  69. package/dist/types/account/index.js +3 -0
  70. package/dist/types/account/scraper-account.js +1 -0
  71. package/dist/types/ai/ai-config.d.ts +6 -0
  72. package/dist/types/ai/ai-config.js +1 -0
  73. package/dist/types/ai/index.d.ts +3 -0
  74. package/dist/types/ai/index.js +3 -0
  75. package/dist/types/ai/proposal.d.ts +10 -0
  76. package/dist/types/ai/proposal.js +1 -0
  77. package/dist/types/ai/suitability.d.ts +6 -0
  78. package/dist/types/ai/suitability.js +1 -0
  79. package/dist/types/bid/bid-result.js +1 -0
  80. package/dist/types/bid/bid.js +1 -0
  81. package/dist/types/bid/index.js +2 -0
  82. package/dist/types/campaign/campaign-analytics.js +1 -0
  83. package/dist/types/campaign/campaign-expenses.js +1 -0
  84. package/dist/types/campaign/campaign-insights.js +1 -0
  85. package/dist/types/campaign/campaign-integrations.js +1 -0
  86. package/dist/types/campaign/campaign-job-count.js +1 -0
  87. package/dist/types/campaign/campaign.js +1 -0
  88. package/dist/types/campaign/index.js +6 -0
  89. package/dist/types/chat-message/chat-message.js +1 -0
  90. package/dist/types/chat-message/index.js +1 -0
  91. package/dist/types/config/agency-config.js +1 -0
  92. package/dist/types/config/index.js +1 -0
  93. package/dist/types/index.js +15 -0
  94. package/dist/types/job/index.js +3 -0
  95. package/dist/types/job/job-note.js +1 -0
  96. package/dist/types/job/job-status.js +9 -0
  97. package/dist/types/job/nuxt.js +1 -0
  98. package/dist/types/job-filters/index.js +1 -0
  99. package/dist/types/job-filters/job-filters.js +1 -0
  100. package/dist/types/logger/index.js +1 -0
  101. package/dist/types/logger/log-event.js +1 -0
  102. package/dist/types/saved-search/index.js +1 -0
  103. package/dist/types/scraper/index.js +2 -0
  104. package/dist/types/scraper/scrape-payload.js +1 -0
  105. package/dist/types/scraper/scrape-result.js +1 -0
  106. package/dist/types/shared.js +1 -0
  107. package/dist/types/time-filter/index.js +1 -0
  108. package/dist/types/transaction/index.js +1 -0
  109. package/dist/types/usage/index.js +1 -0
  110. package/dist/types/user/index.js +1 -0
  111. package/dist/utils/index.js +1 -0
  112. package/dist/utils/try-catch.js +10 -0
  113. package/package.json +3 -3
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ export const leadNoteSchema = z.object({
3
+ id: z.string(),
4
+ jobId: z.string(),
5
+ content: z.string(),
6
+ order: z.number(),
7
+ bgColor: z.string(),
8
+ createdAt: z.number(),
9
+ updatedAt: z.number(),
10
+ });
11
+ export const createLeadNoteSchema = leadNoteSchema.pick({
12
+ id: true,
13
+ content: true,
14
+ order: true,
15
+ bgColor: true,
16
+ });
17
+ export const updateLeadNoteSchema = leadNoteSchema
18
+ .pick({
19
+ id: true,
20
+ content: true,
21
+ order: true,
22
+ bgColor: true,
23
+ })
24
+ .partial({ content: true, order: true, bgColor: true });
25
+ export const updateLeadNotesOrderSchema = z.object({
26
+ order: z.array(z.object({ id: z.string(), order: z.number() })),
27
+ });
@@ -0,0 +1,23 @@
1
+ import { z } from "zod";
2
+ export const agentStatusSchema = z.enum([
3
+ "suitabilityPending",
4
+ "suitabilityProcessing",
5
+ "suitabilityComplete",
6
+ "suitabilityFailed",
7
+ "proposalProcessing",
8
+ "proposalComplete",
9
+ "proposalFailed",
10
+ "biddingProcessing",
11
+ "biddingComplete",
12
+ "biddingFailed",
13
+ "jobArchived",
14
+ ]);
15
+ export const leadStatusSchema = z.enum([
16
+ "leads",
17
+ "contacted",
18
+ "viewed",
19
+ "replied",
20
+ "negotiations",
21
+ "won",
22
+ "lost",
23
+ ]);
@@ -0,0 +1,287 @@
1
+ import { any, array, boolean, number, object, record, string } from "zod";
2
+ const segmentationDataSchema = object({
3
+ customValue: string().nullable(),
4
+ label: string(),
5
+ name: string(),
6
+ sortOrder: number(),
7
+ type: string(),
8
+ value: string(),
9
+ skill: any().nullable(),
10
+ });
11
+ const clientActivitySchema = object({
12
+ lastBuyerActivity: string(),
13
+ totalApplicants: number(),
14
+ totalHired: number(),
15
+ totalInvitedToInterview: number(),
16
+ unansweredInvites: number(),
17
+ invitationsSent: number(),
18
+ numberOfPositionsToHire: number(),
19
+ });
20
+ const annotationsSchema = object({
21
+ tags: array(string()),
22
+ });
23
+ const budgetSchema = object({
24
+ amount: number(),
25
+ currencyCode: string(),
26
+ });
27
+ const engagementDurationSchema = object({
28
+ label: string(),
29
+ weeks: number(),
30
+ });
31
+ const extendedBudgetInfoSchema = object({
32
+ hourlyBudgetMin: number().nullable(),
33
+ hourlyBudgetMax: number().nullable(),
34
+ hourlyBudgetType: string().nullable(),
35
+ });
36
+ const qualificationsSchema = object({
37
+ countries: any().nullable(),
38
+ earnings: any().nullable(),
39
+ groupRecno: any().nullable(),
40
+ languages: any().nullable(),
41
+ localDescription: any().nullable(),
42
+ localFlexibilityDescription: any().nullable(),
43
+ localMarket: boolean(),
44
+ minJobSuccessScore: number(),
45
+ minOdeskHours: number(),
46
+ onSiteType: any().nullable(),
47
+ prefEnglishSkill: number(),
48
+ regions: any().nullable(),
49
+ risingTalent: boolean(),
50
+ shouldHavePortfolio: boolean(),
51
+ states: any().nullable(),
52
+ tests: any().nullable(),
53
+ timezones: any().nullable(),
54
+ type: number(),
55
+ locationCheckRequired: boolean(),
56
+ group: any().nullable(),
57
+ location: any().nullable(),
58
+ locations: any().nullable(),
59
+ });
60
+ const jobSchema = object({
61
+ status: number(),
62
+ category: object({
63
+ name: string(),
64
+ urlSlug: string(),
65
+ }),
66
+ categoryGroup: object({
67
+ name: string(),
68
+ urlSlug: string(),
69
+ }),
70
+ budget: budgetSchema,
71
+ postedOn: string(),
72
+ publishTime: string(),
73
+ wasRenewed: boolean(),
74
+ startDate: string().nullable(),
75
+ deliveryDate: string().nullable(),
76
+ workload: string().nullable(),
77
+ engagementDuration: engagementDurationSchema,
78
+ extendedBudgetInfo: extendedBudgetInfoSchema,
79
+ contractorTier: number(),
80
+ description: string(),
81
+ segmentationData: array(segmentationDataSchema),
82
+ clientActivity: clientActivitySchema,
83
+ annotations: annotationsSchema,
84
+ uid: string(),
85
+ title: string(),
86
+ type: number(),
87
+ ciphertext: string(),
88
+ access: number(),
89
+ createdOn: string(),
90
+ hideBudget: boolean(),
91
+ notSureProjectDuration: boolean(),
92
+ notSureFreelancersToHire: boolean(),
93
+ notSureExperienceLevel: boolean(),
94
+ numberOfPositionsToHire: number(),
95
+ isContractToHire: boolean(),
96
+ attachments: array(any()),
97
+ isPremium: boolean(),
98
+ qualifications: qualificationsSchema,
99
+ questions: array(object({ question: string(), position: number() })),
100
+ durationIdV3: number(),
101
+ durationLabel: string(),
102
+ });
103
+ const buyerSchema = object({
104
+ isEnterprise: boolean(),
105
+ isPaymentMethodVerified: boolean(),
106
+ stats: object({
107
+ totalAssignments: number(),
108
+ activeAssignmentsCount: number(),
109
+ hoursCount: number(),
110
+ feedbackCount: number(),
111
+ score: number(),
112
+ totalJobsWithHires: number(),
113
+ totalCharges: object({
114
+ amount: number(),
115
+ }),
116
+ }),
117
+ location: object({
118
+ offsetFromUtcMillis: number(),
119
+ countryTimezone: string(),
120
+ city: string(),
121
+ country: string(),
122
+ }),
123
+ company: object({
124
+ isEDCReplicated: any().nullable(),
125
+ contractDate: string(),
126
+ profile: object({
127
+ industry: string(),
128
+ size: number(),
129
+ }),
130
+ name: string().nullable(),
131
+ }),
132
+ jobs: object({
133
+ postedCount: number(),
134
+ openCount: number(),
135
+ }),
136
+ avgHourlyJobsRate: object({
137
+ amount: number(),
138
+ }).nullable(),
139
+ });
140
+ const currentUserInfoSchema = object({
141
+ owner: boolean(),
142
+ freelancerInfo: object({
143
+ profileState: string(),
144
+ applied: any().nullable(),
145
+ devProfileCiphertext: string(),
146
+ hired: any().nullable(),
147
+ application: record(any()),
148
+ pendingInvite: record(any()),
149
+ contract: any().nullable(),
150
+ hourlyRate: object({
151
+ amount: number(),
152
+ }),
153
+ qualificationsMatches: object({
154
+ matches: array(object({
155
+ clientPreferred: string(),
156
+ clientPreferredLabel: string().nullable(),
157
+ freelancerValue: string(),
158
+ freelancerValueLabel: string(),
159
+ qualification: number(),
160
+ qualified: boolean(),
161
+ })),
162
+ }),
163
+ }),
164
+ });
165
+ const workHistorySchema = array(object({
166
+ isPtcJob: any().nullable(),
167
+ status: any().nullable(),
168
+ isEDCReplicated: any().nullable(),
169
+ startDate: string(),
170
+ endDate: string(),
171
+ totalCharge: number(),
172
+ totalHours: number(),
173
+ jobInfo: object({
174
+ title: string(),
175
+ id: any().nullable(),
176
+ uid: any().nullable(),
177
+ access: number(),
178
+ type: number(),
179
+ ciphertext: any().nullable(),
180
+ }),
181
+ contractorInfo: object({
182
+ contractorName: string(),
183
+ accessType: string(),
184
+ ciphertext: string(),
185
+ }),
186
+ rate: object({
187
+ amount: number(),
188
+ }).nullable(),
189
+ feedback: object({
190
+ feedbackSuppressed: boolean(),
191
+ score: number(),
192
+ comment: string(),
193
+ feedback_suppressed: boolean(),
194
+ }),
195
+ feedbackToClient: object({
196
+ feedbackSuppressed: boolean(),
197
+ score: number(),
198
+ comment: string(),
199
+ feedback_suppressed: boolean(),
200
+ }),
201
+ isEDCPublic: boolean(),
202
+ }));
203
+ const sandsSchema = object({
204
+ occupation: object({
205
+ freeText: string().nullable(),
206
+ ontologyId: string(),
207
+ prefLabel: string(),
208
+ id: string(),
209
+ uid: string(),
210
+ }),
211
+ ontologySkills: array(any()),
212
+ additionalSkills: array(object({
213
+ uid: string(),
214
+ name: string(),
215
+ isFreeText: boolean(),
216
+ })),
217
+ });
218
+ const connectsSchema = object({
219
+ pricing: object({
220
+ price: number(),
221
+ context: string(),
222
+ auctionPrice: number(),
223
+ }),
224
+ requiredConnects: number(),
225
+ availableConnects: number(),
226
+ chooseConnectsStatus: object({
227
+ isExplainerModalShown: boolean().nullable(),
228
+ }),
229
+ canSeeApplicantsRates: boolean(),
230
+ });
231
+ const authSchema = object({
232
+ canFlagOpening: boolean(),
233
+ canPostJob: boolean(),
234
+ domestic: object({
235
+ country: string().nullable(),
236
+ isInfographicTooltipAvailable: boolean(),
237
+ }),
238
+ });
239
+ const applicationContextSchema = object({
240
+ freelancerAllowed: boolean(),
241
+ clientAllowed: boolean(),
242
+ userIntentEvaluation: object({
243
+ isDeclined: boolean(),
244
+ reason: string().nullable(),
245
+ }),
246
+ canApplyOnBehalfOfAgencyFreelancers: boolean(),
247
+ canSubmitMoreProposals: boolean(),
248
+ submittedProposals: any().nullable(),
249
+ });
250
+ export const nuxtStateJobSchema = object({
251
+ cache: boolean(),
252
+ job: jobSchema,
253
+ buyer: buyerSchema,
254
+ currentUserInfo: currentUserInfoSchema,
255
+ isVisitor: boolean(),
256
+ openJobs: array(any()),
257
+ workHistory: workHistorySchema,
258
+ similarJobs: array(any()),
259
+ sands: sandsSchema,
260
+ auth: authSchema,
261
+ applicants: object({
262
+ applicantsBidsStats: any().nullable(),
263
+ }),
264
+ connects: connectsSchema.nullish(),
265
+ enterpriseJobAdditionalInfo: record(any()),
266
+ applicationContext: applicationContextSchema,
267
+ profileMatchServiceUid: string(),
268
+ seo: object({
269
+ title: string(),
270
+ description: string(),
271
+ url: string(),
272
+ }),
273
+ teamUid: any().nullable(),
274
+ proposalPermissions: object({
275
+ freelancerAllowed: boolean(),
276
+ clientAllowed: boolean(),
277
+ }),
278
+ jobSlug: any().nullable(),
279
+ prefillWith: any().nullable(),
280
+ isGroupOpportunity: boolean(),
281
+ workLocation: any().nullable(),
282
+ isPhoneVerified: boolean(),
283
+ errorResponse: any().nullable(),
284
+ isApplyBlocked: boolean(),
285
+ hasAiInterview: boolean(),
286
+ talentFeePromotion: boolean().nullish(),
287
+ });
@@ -0,0 +1 @@
1
+ export * from "./log-event";
@@ -0,0 +1,117 @@
1
+ import { boolean, number, object, string, z } from 'zod';
2
+ import { jobActivityOffsetHourSchema, jobActivitySchema, jobListingSchema, } from '../lead';
3
+ import { regionSchema } from '../shared';
4
+ export const LogEventTypeEnum = z.enum([
5
+ // Scraper Events
6
+ 'scraperStarted',
7
+ 'scraperCompleted',
8
+ 'jobScraped',
9
+ 'jobScrapeFailed',
10
+ 'jobsIndexed',
11
+ 'jobDuplicateSkipped',
12
+ 'scraperFailed',
13
+ 'jobActivityScraped',
14
+ 'jobActivityScrapeFailed',
15
+ // Feed Scraper Events
16
+ 'feedScrapeStarted',
17
+ 'feedScrapeCompleted',
18
+ 'feedScrapeFailed',
19
+ 'jobListingScraped',
20
+ // Job Sync & Campaign Matching
21
+ 'jobSyncPublished',
22
+ 'jobSyncReceived',
23
+ 'leadsCreatedAndSynced',
24
+ // Suitability Events
25
+ 'suitabilityPending',
26
+ 'suitabilityProcessing',
27
+ 'suitabilityComplete',
28
+ 'suitabilityFailed',
29
+ 'manualSuitabilityAnalyzed',
30
+ // Proposal Events
31
+ 'proposalProcessing',
32
+ 'proposalComplete',
33
+ 'proposalFailed',
34
+ 'manualProposalGenerated',
35
+ // Bidding Events
36
+ 'biddingProcessing',
37
+ 'biddingComplete',
38
+ 'biddingFailed',
39
+ 'biddingSkipped',
40
+ 'biddingPending',
41
+ 'biddingRetry',
42
+ 'biddingInsufficientConnects',
43
+ 'biddingWarningAlert',
44
+ // System/Generic Events
45
+ 'errorLogged',
46
+ 'cloudTaskRetry',
47
+ 'manualLeadEdited',
48
+ 'leadArchived',
49
+ 'auditTrailLogged',
50
+ // Knowledge Base Events
51
+ 'knowledgeBaseGenerationComplete',
52
+ 'knowledgeBaseGenerationFailed',
53
+ // Model Chain Events
54
+ 'modelFailed',
55
+ ]);
56
+ export const logEventSchema = z.object({
57
+ // The type of event (use a z.enum if possible)
58
+ type: LogEventTypeEnum, // e.g. "suitability-failed", "proposal-generated"
59
+ // The service that triggered the event
60
+ source: z.string(), // e.g. "lancer-agents", "lancer-bidding"
61
+ // Optional: Allow logging non-lead events in the future
62
+ resourceType: z.string().default('lead'), // e.g. "lead", "campaign", "user"
63
+ // ID of the resource (primary entity affected)
64
+ resourceId: z.string().nullable(), // fallback if leadId is not applicable
65
+ // Lead-level metadata
66
+ leadId: z.string().nullable(),
67
+ campaignId: z.string().nullable(),
68
+ userId: z.string().nullable(),
69
+ // Reason or message for the event
70
+ reason: z.string().nullable(),
71
+ // Generic metadata (stacktrace, score, raw request, etc.)
72
+ metadata: z.record(z.unknown()).nullable(),
73
+ // Optional timestamp override
74
+ timestamp: z.number(),
75
+ });
76
+ export const listingScrapedEventMetadata = object({
77
+ listing: jobListingSchema,
78
+ region: regionSchema,
79
+ });
80
+ export const jobActivityScrapedEventMetadata = object({
81
+ activity: jobActivitySchema,
82
+ region: regionSchema,
83
+ offsetHour: jobActivityOffsetHourSchema,
84
+ scrapedAt: number(),
85
+ });
86
+ export const jobActivityScrapeFailedEventMetadata = object({
87
+ listing: jobListingSchema,
88
+ region: regionSchema,
89
+ offsetHour: jobActivityOffsetHourSchema,
90
+ });
91
+ export const feedScrapeStartedEventMetadata = object({
92
+ id: string(),
93
+ startTime: number(),
94
+ region: regionSchema,
95
+ });
96
+ export const feedScrapeCompletedEventMetadata = object({
97
+ id: string(),
98
+ endTime: number(),
99
+ region: regionSchema,
100
+ accountUsername: string(),
101
+ });
102
+ export const biddingCompletedEventMetadata = object({
103
+ biddingAmount: number(),
104
+ boosted: boolean(),
105
+ boostingAmount: number(),
106
+ });
107
+ export const biddingFailedEventMetadata = object({
108
+ errorType: string(),
109
+ errorMessage: string(),
110
+ context: z.string().optional(),
111
+ });
112
+ export const biddingWarningAlertEventMetadata = object({
113
+ warningMessage: string(),
114
+ });
115
+ export const biddingRetryEventMetadata = object({
116
+ errorMessage: string(),
117
+ });
@@ -0,0 +1,70 @@
1
+ import { boolean, number, object, string, z } from "zod";
2
+ import { LogEventTypeEnum } from "../logger";
3
+ import { organizationSubscriptionSchema } from "./subscription";
4
+ export const bidConfigSchema = object({
5
+ agencyName: string().nullable(),
6
+ bidderId: string().nullable(),
7
+ contractorName: string().nullable(),
8
+ specialisedProfile: string().nullable(),
9
+ });
10
+ export const organizationTypeSchema = z.enum(["agency", "freelancer"]);
11
+ export const organizationTierEnum = z.enum(["free", "premium"]);
12
+ export const organizationLimitsSchema = object({
13
+ monthlyCredits: number(),
14
+ usedCredits: number(),
15
+ extraCredits: number(),
16
+ });
17
+ export const organizationBillingSchema = object({
18
+ stripeCustomerId: string(),
19
+ savedCard: boolean(),
20
+ creditsRemaining: number(),
21
+ });
22
+ export const organizationSchema = object({
23
+ id: string(),
24
+ name: string(),
25
+ type: organizationTypeSchema,
26
+ tierId: organizationTierEnum,
27
+ subscription: organizationSubscriptionSchema.nullable(),
28
+ bidConfig: bidConfigSchema,
29
+ active: boolean(),
30
+ limits: organizationLimitsSchema,
31
+ billing: organizationBillingSchema.nullable(),
32
+ createdAt: number(),
33
+ updatedAt: number(),
34
+ });
35
+ export const creditDeductionEventTypeEnum = LogEventTypeEnum.extract([
36
+ "suitabilityComplete",
37
+ "proposalComplete",
38
+ ]);
39
+ export const creditDeductionPayloadSchema = object({
40
+ event: creditDeductionEventTypeEnum,
41
+ campaignId: string().nullish(),
42
+ });
43
+ export const aiConfigOldSchema = object({
44
+ id: string(),
45
+ suitabilityPrompt: string().nullable(),
46
+ proposalPrompt: string().nullable(),
47
+ questionProposalPrompt: string().nullable(),
48
+ knowledgeBase: string().nullable(),
49
+ });
50
+ export const aiConfigSchema = object({
51
+ suitabilityRules: string().nullable(),
52
+ coverLetterRules: string().nullable(),
53
+ questionRules: string().nullable(),
54
+ });
55
+ export const knowledgeBaseSchema = object({
56
+ about: string(),
57
+ caseStudies: string(),
58
+ });
59
+ export const notificationConfigSchema = object({
60
+ emailEnabled: boolean(),
61
+ discordWebhookUrl: string().nullable(),
62
+ slackWebhookUrl: string().nullable(),
63
+ });
64
+ export const organizationSettingsSchema = object({
65
+ aiConfig: aiConfigSchema,
66
+ knowledgeBase: knowledgeBaseSchema,
67
+ notifications: notificationConfigSchema,
68
+ });
69
+ export * from "./member";
70
+ export * from "./subscription";
@@ -0,0 +1,7 @@
1
+ import { number, object, string, z } from "zod";
2
+ export const organizationMemberRoleEnum = z.enum(["admin", "member"]);
3
+ export const organizationMemberSchema = object({
4
+ role: organizationMemberRoleEnum,
5
+ joinedAt: number(),
6
+ invitedBy: string(),
7
+ });